|
| 1 | +# |
| 2 | +# MDEV-29919: Support MySQL 8.0.20+ INSERT ... AS alias ON DUPLICATE KEY UPDATE syntax |
| 3 | +# |
| 4 | +# This test validates the new row alias syntax for INSERT ON DUPLICATE KEY UPDATE |
| 5 | +# which allows referencing inserted values using alias.column instead of VALUES(column) |
| 6 | +# |
| 7 | +# Skip PS protocol for now - alias resolution during fix_fields needs work for PS mode |
| 8 | +--source include/no_protocol.inc |
| 9 | + |
| 10 | +--echo # |
| 11 | +--echo # Test setup |
| 12 | +--echo # |
| 13 | +CREATE TABLE t1 ( |
| 14 | + a INT PRIMARY KEY, |
| 15 | + b INT, |
| 16 | + c INT |
| 17 | +); |
| 18 | + |
| 19 | +--echo # |
| 20 | +--echo # Test 1: Basic INSERT AS alias ON DUPLICATE KEY UPDATE |
| 21 | +--echo # |
| 22 | +INSERT INTO t1 VALUES (1, 10, 100); |
| 23 | +INSERT INTO t1 VALUES (1, 20, 200) AS new |
| 24 | + ON DUPLICATE KEY UPDATE b = new.b, c = new.c; |
| 25 | +SELECT * FROM t1; |
| 26 | + |
| 27 | +--echo # |
| 28 | +--echo # Test 2: Multiple rows with AS alias |
| 29 | +--echo # |
| 30 | +TRUNCATE TABLE t1; |
| 31 | +INSERT INTO t1 VALUES (1, 10, 100); |
| 32 | +INSERT INTO t1 VALUES (1, 20, 200), (2, 30, 300) AS new |
| 33 | + ON DUPLICATE KEY UPDATE b = new.b; |
| 34 | +SELECT * FROM t1 ORDER BY a; |
| 35 | + |
| 36 | +--echo # |
| 37 | +--echo # Test 3: Expression using alias columns |
| 38 | +--echo # |
| 39 | +TRUNCATE TABLE t1; |
| 40 | +INSERT INTO t1 VALUES (1, 10, 100); |
| 41 | +INSERT INTO t1 VALUES (1, 5, 50) AS new |
| 42 | + ON DUPLICATE KEY UPDATE b = new.b + new.c, c = new.a * 10; |
| 43 | +SELECT * FROM t1; |
| 44 | + |
| 45 | +--echo # |
| 46 | +--echo # Test 4: Backward compatibility - VALUES() function still works |
| 47 | +--echo # |
| 48 | +TRUNCATE TABLE t1; |
| 49 | +INSERT INTO t1 VALUES (1, 10, 100); |
| 50 | +INSERT INTO t1 VALUES (1, 20, 200) |
| 51 | + ON DUPLICATE KEY UPDATE b = VALUES(b), c = VALUES(c); |
| 52 | +SELECT * FROM t1; |
| 53 | + |
| 54 | +--echo # |
| 55 | +--echo # Test 5: Mix of alias and table column references |
| 56 | +--echo # |
| 57 | +TRUNCATE TABLE t1; |
| 58 | +INSERT INTO t1 VALUES (1, 10, 100); |
| 59 | +INSERT INTO t1 VALUES (1, 20, 200) AS new |
| 60 | + ON DUPLICATE KEY UPDATE b = new.b, c = t1.c + new.c; |
| 61 | +SELECT * FROM t1; |
| 62 | + |
| 63 | +--echo # |
| 64 | +--echo # Test 6: INSERT without ON DUPLICATE KEY (alias should be ignored) |
| 65 | +--echo # |
| 66 | +TRUNCATE TABLE t1; |
| 67 | +INSERT INTO t1 VALUES (1, 10, 100) AS new; |
| 68 | +SELECT * FROM t1; |
| 69 | + |
| 70 | +--echo # |
| 71 | +--echo # Test 7: Different alias names |
| 72 | +--echo # |
| 73 | +TRUNCATE TABLE t1; |
| 74 | +INSERT INTO t1 VALUES (1, 10, 100); |
| 75 | +INSERT INTO t1 VALUES (1, 99, 999) AS inserted_row |
| 76 | + ON DUPLICATE KEY UPDATE b = inserted_row.b, c = inserted_row.c; |
| 77 | +SELECT * FROM t1; |
| 78 | + |
| 79 | +--echo # |
| 80 | +--echo # Cleanup |
| 81 | +--echo # |
| 82 | +DROP TABLE t1; |
| 83 | + |
| 84 | +--echo # |
| 85 | +--echo # End of MDEV-29919 tests |
| 86 | +--echo # |
0 commit comments