diff options
author | Alexander Barkov <bar@mariadb.com> | 2023-05-12 11:51:58 +0400 |
---|---|---|
committer | Alexander Barkov <bar@mariadb.com> | 2023-05-12 12:19:44 +0400 |
commit | b3cdb612491de6070c376bd98d30c5ec9aaffa87 (patch) | |
tree | f641a94dab0ff218e11cc5de5189afcfd91317e3 | |
parent | 0474466bc2c3e05a160677f1dbabea374e942736 (diff) | |
download | mariadb-git-bb-10.4-bar-MDEV-31250.tar.gz |
MDEV-31250 ROW variables do not get assigned from subselectsbb-10.4-bar-MDEV-31250
ROW variables did not get assigned from subselects in these contexts:
BEGIN
DECLARE r ROW TYPE OF t1;
SET r=(SELECT * FROM t1 WHERE a=1);
END;
BEGIN
DECLARE r ROW TYPE OF t1 DEFAULT (SELECT * FROM t1 WHERE a=1);
END;
All fields of the ROW variable remained NULL.
-rw-r--r-- | mysql-test/main/sp-anchor-row-type-table.result | 44 | ||||
-rw-r--r-- | mysql-test/main/sp-anchor-row-type-table.test | 55 | ||||
-rw-r--r-- | sql/field.cc | 3 |
3 files changed, 102 insertions, 0 deletions
diff --git a/mysql-test/main/sp-anchor-row-type-table.result b/mysql-test/main/sp-anchor-row-type-table.result index c28d26304db..5e3b655a75b 100644 --- a/mysql-test/main/sp-anchor-row-type-table.result +++ b/mysql-test/main/sp-anchor-row-type-table.result @@ -814,3 +814,47 @@ t2 CREATE TABLE `t2` ( `text0` text DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; +# +# End of 10.3 tests +# +# +# Start of 10.4 tests +# +# +# MDEV-31250 ROW variables do not get assigned from subselects +# +CREATE TABLE t1 (a INT, b TEXT); +INSERT INTO t1 VALUES (1,'b1'); +BEGIN NOT ATOMIC +DECLARE r ROW TYPE OF t1; +SELECT * INTO r FROM t1 WHERE a=1; +SELECT r.a, r.b; +END; +$$ +r.a r.b +1 b1 +DROP TABLE t1; +CREATE TABLE t1 (a INT, b TEXT); +INSERT INTO t1 VALUES (1,'b1'); +BEGIN NOT ATOMIC +DECLARE r ROW TYPE OF t1; +SET r=(SELECT * FROM t1 WHERE a=1); +SELECT r.a, r.b; +END; +$$ +r.a r.b +1 b1 +DROP TABLE t1; +CREATE TABLE t1 (a INT, b TEXT); +INSERT INTO t1 VALUES (1,'b1'); +BEGIN NOT ATOMIC +DECLARE r ROW TYPE OF t1 DEFAULT (SELECT * FROM t1 WHERE a=1); +SELECT r.a, r.b; +END; +$$ +r.a r.b +1 b1 +DROP TABLE t1; +# +# End of 10.4 tests +# diff --git a/mysql-test/main/sp-anchor-row-type-table.test b/mysql-test/main/sp-anchor-row-type-table.test index 3f04dc68586..213460ed38f 100644 --- a/mysql-test/main/sp-anchor-row-type-table.test +++ b/mysql-test/main/sp-anchor-row-type-table.test @@ -881,3 +881,58 @@ END; $$ DELIMITER ;$$ DROP TABLE t1; + +--echo # +--echo # End of 10.3 tests +--echo # + + +--echo # +--echo # Start of 10.4 tests +--echo # + +--echo # +--echo # MDEV-31250 ROW variables do not get assigned from subselects +--echo # + +CREATE TABLE t1 (a INT, b TEXT); +INSERT INTO t1 VALUES (1,'b1'); +DELIMITER $$; +BEGIN NOT ATOMIC + DECLARE r ROW TYPE OF t1; + SELECT * INTO r FROM t1 WHERE a=1; + SELECT r.a, r.b; +END; +$$ +DELIMITER ;$$ +DROP TABLE t1; + + +CREATE TABLE t1 (a INT, b TEXT); +INSERT INTO t1 VALUES (1,'b1'); +DELIMITER $$; +BEGIN NOT ATOMIC + DECLARE r ROW TYPE OF t1; + SET r=(SELECT * FROM t1 WHERE a=1); + SELECT r.a, r.b; +END; +$$ +DELIMITER ;$$ +DROP TABLE t1; + + +CREATE TABLE t1 (a INT, b TEXT); +INSERT INTO t1 VALUES (1,'b1'); +DELIMITER $$; +BEGIN NOT ATOMIC + DECLARE r ROW TYPE OF t1 DEFAULT (SELECT * FROM t1 WHERE a=1); + SELECT r.a, r.b; +END; +$$ +DELIMITER ;$$ +DROP TABLE t1; + + +--echo # +--echo # End of 10.4 tests +--echo # diff --git a/sql/field.cc b/sql/field.cc index 14252033a01..ff45b6c5de9 100644 --- a/sql/field.cc +++ b/sql/field.cc @@ -2543,6 +2543,8 @@ bool Field_row::sp_prepare_and_store_item(THD *thd, Item **value) fixed underlying Item_field pointing to Field_row. - In case if we're assigning from a ROW() value, src and value[0] will point to the same Item_row. + - In case if we're assigning from a subselect, src and value[0] also + point to the same Item_singlerow_subselect. */ Item *src; if (!(src= thd->sp_fix_func_item(value)) || @@ -2554,6 +2556,7 @@ bool Field_row::sp_prepare_and_store_item(THD *thd, Item **value) DBUG_RETURN(true); } + src->bring_value(); DBUG_RETURN(m_table->sp_set_all_fields_from_item(thd, src)); } |