# Test for REPLACE...RETURNING CREATE TABLE t1(id1 INT PRIMARY KEY, val1 VARCHAR(1)); CREATE TABLE t2(id2 INT PRIMARY KEY, val2 VARCHAR(1)); INSERT INTO t2 VALUES (1,'a'),(2,'b'),(3,'c'); CREATE FUNCTION f(arg INT) RETURNS INT BEGIN RETURN (SELECT arg+arg); END| # # Simple replace statement...RETURNING # REPLACE INTO t1 (id1, val1) VALUES (1, 'a'); REPLACE INTO t1 (id1, val1) VALUES (1, 'b') RETURNING *; id1 val1 1 b REPLACE INTO t1 (id1, val1) VALUES (1, 'c') RETURNING id1+id1 AS total, id1&&id1, id1|id1,UPPER(val1),f(id1); total id1&&id1 id1|id1 UPPER(val1) f(id1) 2 1 1 C 2 REPLACE INTO t1(id1,val1) VALUES (1,'d') RETURNING (SELECT GROUP_CONCAT(val2) FROM t2 WHERE id2=1); (SELECT GROUP_CONCAT(val2) FROM t2 WHERE id2=1) a REPLACE INTO t1(id1,val1) VALUES(1,'e') RETURNING (SELECT GROUP_CONCAT(val2) FROM t2 GROUP BY id2 HAVING id2=id2+1); (SELECT GROUP_CONCAT(val2) FROM t2 GROUP BY id2 HAVING id2=id2+1) NULL PREPARE stmt FROM "REPLACE INTO t1 (id1,val1) VALUES (1,'f') RETURNING id1,(SELECT id2 FROM t2 WHERE val2='b')"; EXECUTE stmt; id1 (SELECT id2 FROM t2 WHERE val2='b') 1 2 DEALLOCATE PREPARE stmt; REPLACE INTO t1 (id1, val1) VALUES (1, 'g') RETURNING t1.*; id1 val1 1 g SELECT * FROM t1; id1 val1 1 g TRUNCATE TABLE t1; # # Multiple values in one replace statement...RETURNING # REPLACE INTO t1 VALUES (1,'a'),(2,'b'); REPLACE INTO t1 VALUES (1,'c'),(2,'d') RETURNING *; id1 val1 1 c 2 d REPLACE INTO t1 VALUES (1,'e'),(2,'f') RETURNING id1+id1 AS total, id1&&id1, id1|id1,UPPER(val1),f(id1); total id1&&id1 id1|id1 UPPER(val1) f(id1) 2 1 1 E 2 4 1 2 F 4 REPLACE INTO t1 VALUES (1,'o'),(2,'p') RETURNING (SELECT GROUP_CONCAT(val2) FROM t2 WHERE id2=1); (SELECT GROUP_CONCAT(val2) FROM t2 WHERE id2=1) a a REPLACE INTO t1 VALUES (1,'q'),(2,'r') RETURNING (SELECT GROUP_CONCAT(val2) FROM t2 GROUP BY id2 HAVING id2=id2+1); (SELECT GROUP_CONCAT(val2) FROM t2 GROUP BY id2 HAVING id2=id2+1) NULL NULL PREPARE stmt FROM "REPLACE INTO t1 VALUES (1,'s'),(2,'t') RETURNING id1, (SELECT id2 FROM t2 WHERE val2='b')"; EXECUTE stmt; id1 (SELECT id2 FROM t2 WHERE val2='b') 1 2 2 2 DEALLOCATE PREPARE stmt; REPLACE INTO t1 VALUES (1,'u'),(2,'v') RETURNING t1.*; id1 val1 1 u 2 v SELECT * FROM t1; id1 val1 1 u 2 v TRUNCATE TABLE t1; # # REPLACE...SET...RETURNING # REPLACE INTO t1 SET id1=1, val1 = 'a'; REPLACE INTO t1 SET id1=2, val1 = 'b' RETURNING *; id1 val1 2 b REPLACE INTO t1 SET id1=3, val1 = 'c' RETURNING id1+id1 AS total, id1&&id1, id1|id1,UPPER(val1),f(id1); total id1&&id1 id1|id1 UPPER(val1) f(id1) 6 1 3 C 6 REPLACE INTO t1 SET id1=1, val1 = 'i' RETURNING (SELECT GROUP_CONCAT(val2) FROM t2 WHERE id2=1); (SELECT GROUP_CONCAT(val2) FROM t2 WHERE id2=1) a REPLACE INTO t1 SET id1=2, val1='j' RETURNING (SELECT GROUP_CONCAT(val2) FROM t2 GROUP BY id2 HAVING id2=id2+1); (SELECT GROUP_CONCAT(val2) FROM t2 GROUP BY id2 HAVING id2=id2+1) NULL PREPARE stmt FROM "REPLACE INTO t1 SET id1=3, val1='k' RETURNING id1, (SELECT id2 FROM t2 WHERE val2='b')"; EXECUTE stmt; id1 (SELECT id2 FROM t2 WHERE val2='b') 3 2 DEALLOCATE PREPARE stmt; REPLACE INTO t1 SET id1=1, val1 = 'o' RETURNING t1.*; id1 val1 1 o SELECT * FROM t1; id1 val1 1 o 2 j 3 k # # REPLACE...SELECT...RETURNING # TRUNCATE TABLE t2; REPLACE INTO t2(id2,val2) SELECT * FROM t1; REPLACE INTO t2 SELECT * FROM t1 WHERE id1=1 RETURNING *; id2 val2 1 o REPLACE INTO t2 SELECT * FROM t1 WHERE id1=2 RETURNING id2+id2 AS total, id2&&id2, id2|id2,UPPER(val2),f(id2); total id2&&id2 id2|id2 UPPER(val2) f(id2) 4 1 2 J 4 REPLACE INTO t2 SELECT * FROM t1 WHERE id1=3 RETURNING (SELECT GROUP_CONCAT(val1) FROM t1 WHERE id1=1); (SELECT GROUP_CONCAT(val1) FROM t1 WHERE id1=1) o REPLACE INTO t2 SELECT * FROM t1 WHERE id1=1 RETURNING (SELECT GROUP_CONCAT(val1) FROM t1 GROUP BY id1 HAVING id1=id1+1); (SELECT GROUP_CONCAT(val1) FROM t1 GROUP BY id1 HAVING id1=id1+1) NULL PREPARE stmt FROM "REPLACE INTO t2 SELECT * FROM t1 WHERE id1=2 RETURNING id2,(SELECT id1 FROM t1 WHERE val1='b')"; EXECUTE stmt; id2 (SELECT id1 FROM t1 WHERE val1='b') 2 NULL DEALLOCATE PREPARE stmt; REPLACE INTO t2 SELECT * FROM t1 WHERE id1=3 RETURNING (SELECT id1+id2 FROM t1 WHERE id1=1); (SELECT id1+id2 FROM t1 WHERE id1=1) 4 REPLACE INTO t2 SELECT * FROM t1 WHERE id1=1 RETURNING (SELECT id1+id2 FROM t2 WHERE id2=0); (SELECT id1+id2 FROM t2 WHERE id2=0) NULL REPLACE INTO t2 SELECT * FROM t1 WHERE id1=2 RETURNING t2.*; id2 val2 2 j SELECT * FROM t2; id2 val2 1 o 2 j 3 k DROP TABLE t1; DROP TABLE t2; DROP FUNCTION f; # # checking errors # CREATE TABLE t1(id1 INT,val1 VARCHAR(1)); CREATE TABLE t2(id2 INT,val2 VARCHAR(1)); REPLACE INTO t1 VALUES(1,'a'),(2,'b'),(3,'c'); # # SIMLPE REPLACE STATEMENT # REPLACE INTO t2(id2,val2) VALUES(1,'a') RETURNING id1; ERROR 42S22: Unknown column 'id1' in 'field list' REPLACE INTO t2(id2,val2) values(2,'b') RETURNING SUM(id2); ERROR HY000: Invalid use of group function REPLACE INTO t2(id2,val2) VALUES(3,'c') RETURNING (SELECT id1 FROM t1); ERROR 21000: Subquery returns more than 1 row REPLACE INTO t2(id2,val2) VALUES(4,'d') RETURNING (SELECT * FROM t1); ERROR 21000: Operand should contain 1 column(s) REPLACE INTO t2(id2,val2) VALUES(4,'d') RETURNING (SELECT * FROM t2); ERROR 21000: Operand should contain 1 column(s) REPLACE INTO t2(id2,val2) VALUES(5,'e') RETURNING id2, (SELECT id1+id2 FROM t1 WHERE id1=1); id2 (SELECT id1+id2 FROM t1 WHERE id1=1) 5 6 REPLACE INTO t2(id2,val2) VALUES(5,'f') RETURNING (SELECT id2 FROM t2); ERROR HY000: Table 't2' is specified twice, both as a target for 'INSERT' and as a separate source for data REPLACE INTO t2 (id2, val2) VALUES (6,'f') RETURNING t1.*; ERROR 42S02: Unknown table 'test.t1' # # Multiple rows in single insert statement # REPLACE INTO t2 VALUES(1,'a'),(2,'b') RETURNING id1; ERROR 42S22: Unknown column 'id1' in 'field list' REPLACE INTO t2 VALUES(3,'c'),(4,'d') RETURNING MAX(id2); ERROR HY000: Invalid use of group function REPLACE INTO t2 VALUES(5,'c'),(6,'f') RETURNING (SELECT id1 FROM t1); ERROR 21000: Subquery returns more than 1 row REPLACE INTO t2 VALUES(7,'g'),(8,'h') RETURNING (SELECT * FROM t1); ERROR 21000: Operand should contain 1 column(s) REPLACE INTO t2 VALUES(9,'g'),(10,'h') RETURNING (SELECT * FROM t2); ERROR 21000: Operand should contain 1 column(s) REPLACE INTO t2 VALUES(11,'e'),(12,'f') RETURNING id2, (SELECT id1+id2 FROM t1 WHERE id1=1); id2 (SELECT id1+id2 FROM t1 WHERE id1=1) 11 12 12 13 REPLACE INTO t2 VALUES(13,'f'),(14,'g') RETURNING (SELECT id2 FROM t2); ERROR HY000: Table 't2' is specified twice, both as a target for 'INSERT' and as a separate source for data REPLACE INTO t2 VALUES(13,'f'),(14,'g') RETURNING t1.*; ERROR 42S02: Unknown table 'test.t1' # # REPLACE ... SET # REPLACE INTO t2 SET id2=1, val2='a' RETURNING id1; ERROR 42S22: Unknown column 'id1' in 'field list' REPLACE INTO t2 SET id2=2, val2='b' RETURNING COUNT(id2); ERROR HY000: Invalid use of group function REPLACE INTO t2 SET id2=3, val2='c' RETURNING (SELECT id1 FROM t1); ERROR 21000: Subquery returns more than 1 row REPLACE INTO t2 SET id2=4, val2='d' RETURNING (SELECT * FROM t1); ERROR 21000: Operand should contain 1 column(s) REPLACE INTO t2 SET id2=4, val2='d' RETURNING (SELECT * FROM t2); ERROR 21000: Operand should contain 1 column(s) REPLACE INTO t2 SET id2=5, val2='e' RETURNING id2, (SELECT id1+id2 FROM t1 WHERE id1=1); id2 (SELECT id1+id2 FROM t1 WHERE id1=1) 5 6 REPLACE INTO t2 SET id2=5, val2='f' RETURNING (SELECT id2 FROM t2); ERROR HY000: Table 't2' is specified twice, both as a target for 'INSERT' and as a separate source for data REPLACE INTO t2 SET id2=5, val2='f' RETURNING t1.*; ERROR 42S02: Unknown table 'test.t1' # # REPLACE...SELECT # REPLACE INTO t2(id2, val2) SELECT * FROM t1 WHERE id1=1 RETURNING id1; ERROR 42S22: Unknown column 'id1' in 'field list' REPLACE INTO t2(id2, val2) SELECT * FROM t1 WHERE id1=2 RETURNING MAX(id2); ERROR HY000: Invalid use of group function REPLACE INTO t2(id2, val2) SELECT * FROM t1 WHERE id1=2 RETURNING (SELECT id1 FROM t1); ERROR 21000: Subquery returns more than 1 row REPLACE INTO t2(id2, val2) SELECT * FROM t1 WHERE id1=2 RETURNING (SELECT * FROM t1); ERROR 21000: Operand should contain 1 column(s) REPLACE INTO t2(id2, val2) SELECT * FROM t1 WHERE id1=2 RETURNING(SELECT * FROM t2); ERROR 21000: Operand should contain 1 column(s) REPLACE INTO t2(id2,val2) SELECT * FROM t1 WHERE id1=2 RETURNING (SELECT id2 FROM t2); ERROR 21000: Subquery returns more than 1 row REPLACE INTO t2(id2,val2) SELECT t1.* FROM t1 WHERE id1=2 RETURNING t1.*; ERROR 42S02: Unknown table 'test.t1' DROP TABLE t1,t2;