Details
-
Bug
-
Status: Closed (View Workflow)
-
Critical
-
Resolution: Fixed
-
10.4(EOL), 10.5, 10.6, 10.7(EOL), 10.8(EOL), 10.9(EOL), 10.10(EOL), 10.11, 11.0(EOL), 11.1(EOL), 11.2(EOL)
-
None
Description
This script using the SELECT..INTO syntax correctly initializes a ROW variable:
CREATE OR REPLACE 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 ;
|
+------+------+
|
| r.a | r.b |
|
+------+------+
|
| 1 | b1 |
|
+------+------+
|
so far so good.
However if I modify the script slightly and replace SELECT..INTO to an equivalent SET, it does not work:
CREATE OR REPLACE 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 ;
|
+------+------+
|
| r.a | r.b |
|
+------+------+
|
| NULL | NULL |
|
+------+------+
|
Another equivalent script with a subselect in the DEFAULT clause of a variable declaration also does not work:
CREATE OR REPLACE 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 ;
|
+------+------+
|
| r.a | r.b |
|
+------+------+
|
| NULL | NULL |
|
+------+------+
|
It should be fixed to have the secord and the third script produce equal results to the first script.
Attachments
Issue Links
- relates to
-
MDEV-10914 ROW data type for stored routine variables
-
- Closed
-
-
MDEV-12252 ROW data type for stored function return values
-
- Closed
-
-
MDEV-14139 Anchored data types for variables
-
- Closed
-
-
MDEV-14212 Add Field_row for SP ROW variables
-
- Closed
-
Activity
Field | Original Value | New Value |
---|---|---|
Link |
This issue relates to |
Link |
This issue relates to |
Link |
This issue relates to |
Description |
This script using the SELECT..INTO syntax correctly initializes a ROW variable:
{code:sql} CREATE OR REPLACE 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 ; {code} {noformat} +------+------+ | r.a | r.b | +------+------+ | 1 | b1 | +------+------+ {noformat} so far so good. However if I modify the script slightly and replace SELECT..INTO to an equivalent SET, it does not work: {code:sql} CREATE OR REPLACE 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 ; {code} {noformat} +------+------+ | r.a | r.b | +------+------+ | NULL | NULL | +------+------+ {noformat} This equivalent script with a subselect in the DEFAULT clause of a variable declaration also does not work: {code:sql} CREATE OR REPLACE 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 ; {code} {noformat} +------+------+ | r.a | r.b | +------+------+ | NULL | NULL | +------+------+ {noformat} It should be fixed to have the secord and the third script produce equal results to the first script. |
This script using the SELECT..INTO syntax correctly initializes a ROW variable:
{code:sql} CREATE OR REPLACE 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 ; {code} {noformat} +------+------+ | r.a | r.b | +------+------+ | 1 | b1 | +------+------+ {noformat} so far so good. However if I modify the script slightly and replace SELECT..INTO to an equivalent SET, it does not work: {code:sql} CREATE OR REPLACE 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 ; {code} {noformat} +------+------+ | r.a | r.b | +------+------+ | NULL | NULL | +------+------+ {noformat} Another equivalent script with a subselect in the DEFAULT clause of a variable declaration also does not work: {code:sql} CREATE OR REPLACE 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 ; {code} {noformat} +------+------+ | r.a | r.b | +------+------+ | NULL | NULL | +------+------+ {noformat} It should be fixed to have the secord and the third script produce equal results to the first script. |
Priority | Major [ 3 ] | Critical [ 2 ] |
issue.field.resolutiondate | 2023-05-12 08:52:37.0 | 2023-05-12 08:52:37.471 |
Fix Version/s | 11.0.2 [ 28706 ] | |
Fix Version/s | 11.1.1 [ 28704 ] | |
Fix Version/s | 10.4.30 [ 28912 ] | |
Fix Version/s | 10.5.21 [ 28913 ] | |
Fix Version/s | 10.6.14 [ 28914 ] | |
Fix Version/s | 10.8.9 [ 28915 ] | |
Fix Version/s | 10.9.7 [ 28916 ] | |
Fix Version/s | 10.10.5 [ 28917 ] | |
Fix Version/s | 10.11.4 [ 28918 ] | |
Fix Version/s | 10.4 [ 22408 ] | |
Resolution | Fixed [ 1 ] | |
Status | Open [ 1 ] | Closed [ 6 ] |
Fix Version/s | 10.8.9 [ 28915 ] |
Assignee | Alexander Barkov [ bar ] |
Fix Version/s | 10.4.31 [ 29010 ] | |
Fix Version/s | 10.5.22 [ 29011 ] | |
Fix Version/s | 10.6.15 [ 29013 ] | |
Fix Version/s | 10.9.8 [ 29015 ] | |
Fix Version/s | 10.10.6 [ 29017 ] | |
Fix Version/s | 10.11.5 [ 29019 ] | |
Fix Version/s | 11.0.3 [ 28920 ] | |
Fix Version/s | 11.1.2 [ 28921 ] | |
Fix Version/s | 11.1.1 [ 28704 ] | |
Fix Version/s | 11.0.2 [ 28706 ] | |
Fix Version/s | 10.4.30 [ 28912 ] | |
Fix Version/s | 10.5.21 [ 28913 ] | |
Fix Version/s | 10.6.14 [ 28914 ] | |
Fix Version/s | 10.9.7 [ 28916 ] | |
Fix Version/s | 10.10.5 [ 28917 ] | |
Fix Version/s | 10.11.4 [ 28918 ] |
Link |
This issue relates to |