mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
MDEV-23178: Qualified asterisk not supported in INSERT .. RETURNING
Analysis: When we have INSERT/REPLACE returning with qualified asterisk in the RETURNING clause, '*' is not resolved properly because of wrong context. context->table_list is NULL or has incorrect table because context->table_list has tables from the FROM clause. For INSERT/REPLACE...SELECT...RETURNING, context->table_list has table we are inserting from. While in other INSERT/REPLACE syntax, context->table_list is NULL because there is no FROM clause. Fix: If filling fields instead of '*' for qualified asterisk in RETURNING, use first_name_resolution_table for correct resolution of item.
This commit is contained in:
@ -41,6 +41,7 @@ SELECT * FROM t1;
|
||||
INSERT INTO v1(id1, val1) VALUES (12, 'a') RETURNING id1+id1 as total,val1,
|
||||
id1 && id1, id1 id1, UPPER(val1),f(id1);
|
||||
ANALYZE INSERT INTO t1(id1,val1) VALUES(13,'l') RETURNING *;
|
||||
INSERT INTO t1(id1,val1) VALUES(14,'m') RETURNING t1.*;
|
||||
TRUNCATE TABLE t1;
|
||||
|
||||
--echo #
|
||||
@ -68,6 +69,7 @@ SELECT * FROM t1;
|
||||
INSERT INTO v1 VALUES(23,'y'),(24,'z') RETURNING id1 as id,val1,
|
||||
id1 && id1, id1|id1, UPPER(val1),f(id1);
|
||||
ANALYZE INSERT INTO t1 VALUES(25,'a'),(26,'b') RETURNING *;
|
||||
ANALYZE INSERT INTO t1 VALUES(27,'c'),(28,'d') RETURNING t1.*;
|
||||
|
||||
--echo #
|
||||
--echo # INSERT...ON DUPLICATE KEY UPDATE...RETURNING
|
||||
@ -101,6 +103,8 @@ val1='d' RETURNING id1+id1 AS total, val1, id1 && id1, id1|id1, UPPER(val1),
|
||||
f(id1);
|
||||
ANALYZE INSERT INTO ins_duplicate(id,val) VALUES(2,'b') ON DUPLICATE KEY UPDATE
|
||||
val='k' RETURNING *;
|
||||
INSERT INTO ins_duplicate(id,val) VALUES(2,'b') ON DUPLICATE KEY UPDATE
|
||||
val='l' RETURNING ins_duplicate.*;
|
||||
SELECT * FROM ins_duplicate;
|
||||
|
||||
--echo #
|
||||
@ -130,6 +134,7 @@ EXPLAIN FORMAT="json" INSERT INTO t1 SET id1=11, val1='k' RETURNING val1;
|
||||
INSERT INTO v1 SET id1=26, val1='Z' RETURNING id1+id1 AS total,val1,
|
||||
id1 && id1, id1|id1, UPPER(val1),f(id1);
|
||||
ANALYZE INSERT INTO t1 SET id1=12, val1='l' RETURNING *;
|
||||
INSERT INTO t1 SET id1= 13, val1= 'm' RETURNING t1.*;
|
||||
SELECT * FROM t1;
|
||||
|
||||
--echo #
|
||||
@ -158,6 +163,10 @@ INSERT IGNORE INTO t2 SELECT * FROM t1 WHERE id1=8 RETURNING *;
|
||||
INSERT IGNORE INTO v2 SELECT * FROM v1 RETURNING *;
|
||||
ANALYZE INSERT INTO t2 SELECT * FROM t1 WHERE id1=11 RETURNING *;
|
||||
SELECT * FROM t2;
|
||||
TRUNCATE TABLE t2;
|
||||
INSERT INTO t2 SELECT * FROM t1 WHERE id1=1 RETURNING t2.*;
|
||||
INSERT INTO t2 SELECT t1.* FROM t1 WHERE id1=2 RETURNING t2.*;
|
||||
SELECT * FROM t2;
|
||||
|
||||
DROP TABLE t1;
|
||||
DROP TABLE t2;
|
||||
@ -190,6 +199,8 @@ INSERT INTO t2(id2,val2) VALUES(5,'e') RETURNING id2, (SELECT id1+id2 FROM
|
||||
t1 WHERE id1=1);
|
||||
--error ER_UPDATE_TABLE_USED
|
||||
INSERT INTO t2(id2,val2) VALUES(5,'f') RETURNING (SELECT id2 FROM t2);
|
||||
--error ER_BAD_TABLE_ERROR
|
||||
INSERT INTO t2 (id2, val2) VALUES (6,'f') RETURNING t1.*;
|
||||
|
||||
--echo #
|
||||
--echo # Multiple rows in single insert statement
|
||||
@ -208,6 +219,8 @@ INSERT INTO t2 VALUES(11,'e'),(12,'f') RETURNING id2, (SELECT id1+id2 FROM
|
||||
t1 WHERE id1=1);
|
||||
--error ER_UPDATE_TABLE_USED
|
||||
INSERT INTO t2 VALUES(13,'f'),(14,'g') RETURNING (SELECT id2 FROM t2);
|
||||
--error ER_BAD_TABLE_ERROR
|
||||
INSERT INTO t2 VALUES(13,'f'),(14,'g') RETURNING t1.*;
|
||||
|
||||
--echo #
|
||||
--echo # INSERT ... SET
|
||||
@ -226,6 +239,8 @@ INSERT INTO t2 SET id2=5, val2='e' RETURNING id2, (SELECT id1+id2 FROM t1
|
||||
WHERE id1=1);
|
||||
--error ER_UPDATE_TABLE_USED
|
||||
INSERT INTO t2 SET id2=5, val2='f' RETURNING (SELECT id2 FROM t2);
|
||||
--error ER_BAD_TABLE_ERROR
|
||||
INSERT INTO t2 SET id2=5, val2='f' RETURNING t1.*;
|
||||
|
||||
--echo #
|
||||
--echo # INSERT...ON DUPLICATE KEY UPDATE
|
||||
@ -251,6 +266,9 @@ RETURNING id2, (SELECT id1+id FROM t1 WHERE id1=1);
|
||||
--error ER_UPDATE_TABLE_USED
|
||||
INSERT INTO ins_duplicate VALUES(2,'b') ON DUPLICATE KEY UPDATE val='b'
|
||||
RETURNING (SELECT id FROM ins_duplicate);
|
||||
--error ER_BAD_TABLE_ERROR
|
||||
INSERT INTO ins_duplicate VALUES(2,'b') ON DUPLICATE KEY UPDATE val='b'
|
||||
RETURNING t1.*;
|
||||
|
||||
--echo #
|
||||
--echo # INSERT...SELECT
|
||||
@ -271,6 +289,8 @@ INSERT INTO t2(id2, val2) SELECT * FROM t1 WHERE id1=2 RETURNING(SELECT
|
||||
--error ER_SUBQUERY_NO_1_ROW
|
||||
INSERT INTO t2(id2,val2) SELECT * FROM t1 WHERE id1=2 RETURNING (SELECT
|
||||
id2 FROM t2);
|
||||
--error ER_BAD_TABLE_ERROR
|
||||
INSERT INTO t2(id2,val2) SELECT t1.* FROM t1 WHERE id1=2 RETURNING t1.*;
|
||||
|
||||
--echo #
|
||||
--echo # TRIGGER
|
||||
|
Reference in New Issue
Block a user