Commit 96bddcaf authored by kroki@mysql.com's avatar kroki@mysql.com
Browse files

Bug#17226: Variable set in cursor on first iteration is assigned

           second iterations value

During assignment to the BLOB variable in routine body the value
wasn't copied.
parent 21e1655f
Loading
Loading
Loading
Loading
+15 −0
Original line number Diff line number Diff line
@@ -1075,3 +1075,18 @@ SELECT f1();
f1()
abc
DROP FUNCTION f1;
DROP PROCEDURE IF EXISTS p1;
CREATE PROCEDURE p1()
BEGIN
DECLARE v_char VARCHAR(255);
DECLARE v_text TEXT DEFAULT '';
SET v_char = 'abc';
SET v_text = v_char;
SET v_char = 'def';
SET v_text = concat(v_text, '|', v_char);
SELECT v_text;
END|
CALL p1();
v_text
abc|def
DROP PROCEDURE p1;
+36 −0
Original line number Diff line number Diff line
@@ -1271,3 +1271,39 @@ SELECT f1();
#

DROP FUNCTION f1;


#
# Bug#17226: Variable set in cursor on first iteration is assigned
# second iterations value
#
# The problem was in incorrect handling of local variables of type
# TEXT (BLOB).
#
--disable_warnings
DROP PROCEDURE IF EXISTS p1;
--enable_warnings

delimiter |;
CREATE PROCEDURE p1()
BEGIN
  DECLARE v_char VARCHAR(255);
  DECLARE v_text TEXT DEFAULT '';

  SET v_char = 'abc';

  SET v_text = v_char;

  SET v_char = 'def';

  SET v_text = concat(v_text, '|', v_char);

  SELECT v_text;
END|
delimiter ;|

CALL p1();

DROP PROCEDURE p1;

# End of 5.0 tests.
+8 −3
Original line number Diff line number Diff line
@@ -675,9 +675,14 @@ void field_conv(Field *to,Field *from)
  {						// Be sure the value is stored
    Field_blob *blob=(Field_blob*) to;
    from->val_str(&blob->value);
    if (!blob->value.is_alloced() &&
    /*
      Copy value if copy_blobs is set, or source is not a string and
      we have a pointer to its internal string conversion buffer.
    */
    if (to->table->copy_blobs ||
        (!blob->value.is_alloced() &&
         from->real_type() != MYSQL_TYPE_STRING &&
        from->real_type() != MYSQL_TYPE_VARCHAR)
         from->real_type() != MYSQL_TYPE_VARCHAR))
      blob->value.copy();
    blob->store(blob->value.ptr(),blob->value.length(),from->charset());
    return;