mirror of
https://github.com/MariaDB/server.git
synced 2025-01-22 06:44:16 +01:00
d17ad7b3a4
Several problems fixed: 1. There was a "catch-all" context initialization in setup_tables() that was causing the table that we insert into to be visible in the SELECT part of an INSERT .. SELECT .. statement with no tables in its FROM clause. This was making sure all the under-initialized contexts in various parts of the code are not left uninitialized. Fixed by removing the "catch-all" statement and initializing the context in the parser. 2. Incomplete name resolution context when resolving the right-hand values in the ON DUPLICATE KEY UPDATE ... part of an INSERT ... SELECT ... caused columns from NATURAL JOIN/JOIN USING table references in the FROM clause of the select to be unavailable. Fixed by establishing a proper name resolution context. 3. When setting up the special name resolution context for problem 2 there was no check for cases where an aggregate function without a GROUP BY effectively takes the column from the SELECT part of an INSERT ... SELECT unavailable for ON DUPLICATE KEY UPDATE. Fixed by checking for that condition when setting up the name resolution context.
238 lines
5.6 KiB
Text
238 lines
5.6 KiB
Text
DROP TABLE IF EXISTS t1, t2;
|
|
CREATE TABLE t1 (a INT, b INT, c INT, UNIQUE (A), UNIQUE(B));
|
|
INSERT t1 VALUES (1,2,10), (3,4,20);
|
|
INSERT t1 VALUES (5,6,30) ON DUPLICATE KEY UPDATE c=c+100;
|
|
SELECT * FROM t1;
|
|
a b c
|
|
1 2 10
|
|
3 4 20
|
|
5 6 30
|
|
INSERT t1 VALUES (5,7,40) ON DUPLICATE KEY UPDATE c=c+100;
|
|
SELECT * FROM t1;
|
|
a b c
|
|
1 2 10
|
|
3 4 20
|
|
5 6 130
|
|
INSERT t1 VALUES (8,4,50) ON DUPLICATE KEY UPDATE c=c+1000;
|
|
SELECT * FROM t1;
|
|
a b c
|
|
1 2 10
|
|
3 4 1020
|
|
5 6 130
|
|
INSERT t1 VALUES (1,4,60) ON DUPLICATE KEY UPDATE c=c+10000;
|
|
SELECT * FROM t1;
|
|
a b c
|
|
1 2 10010
|
|
3 4 1020
|
|
5 6 130
|
|
INSERT t1 VALUES (1,9,70) ON DUPLICATE KEY UPDATE c=c+100000, b=4;
|
|
ERROR 23000: Duplicate entry '4' for key 2
|
|
SELECT * FROM t1;
|
|
a b c
|
|
1 2 10010
|
|
3 4 1020
|
|
5 6 130
|
|
TRUNCATE TABLE t1;
|
|
INSERT t1 VALUES (1,2,10), (3,4,20);
|
|
INSERT t1 VALUES (5,6,30), (7,4,40), (8,9,60) ON DUPLICATE KEY UPDATE c=c+100;
|
|
SELECT * FROM t1;
|
|
a b c
|
|
1 2 10
|
|
3 4 120
|
|
5 6 30
|
|
8 9 60
|
|
INSERT t1 SET a=5 ON DUPLICATE KEY UPDATE b=0;
|
|
SELECT * FROM t1;
|
|
a b c
|
|
1 2 10
|
|
3 4 120
|
|
5 0 30
|
|
8 9 60
|
|
INSERT t1 VALUES (2,1,11), (7,4,40) ON DUPLICATE KEY UPDATE c=c+VALUES(a);
|
|
SELECT *, VALUES(a) FROM t1;
|
|
a b c VALUES(a)
|
|
1 2 10 NULL
|
|
3 4 127 NULL
|
|
5 0 30 NULL
|
|
8 9 60 NULL
|
|
2 1 11 NULL
|
|
explain extended SELECT *, VALUES(a) FROM t1;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t1 ALL NULL NULL NULL NULL 5
|
|
Warnings:
|
|
Note 1003 select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,values(`test`.`t1`.`a`) AS `VALUES(a)` from `test`.`t1`
|
|
explain extended select * from t1 where values(a);
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t1 ALL NULL NULL NULL NULL 5 Using where
|
|
Warnings:
|
|
Note 1003 select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c` from `test`.`t1` where values(`test`.`t1`.`a`)
|
|
DROP TABLE t1;
|
|
create table t1(a int primary key, b int);
|
|
insert into t1 values(1,1),(2,2),(3,3),(4,4),(5,5);
|
|
select * from t1;
|
|
a b
|
|
1 1
|
|
2 2
|
|
3 3
|
|
4 4
|
|
5 5
|
|
insert into t1 values(4,14),(5,15),(6,16),(7,17),(8,18)
|
|
on duplicate key update b=b+10;
|
|
affected rows: 7
|
|
info: Records: 5 Duplicates: 2 Warnings: 0
|
|
select * from t1;
|
|
a b
|
|
1 1
|
|
2 2
|
|
3 3
|
|
4 14
|
|
5 15
|
|
6 16
|
|
7 17
|
|
8 18
|
|
replace into t1 values(5,25),(6,26),(7,27),(8,28),(9,29);
|
|
affected rows: 9
|
|
info: Records: 5 Duplicates: 4 Warnings: 0
|
|
select * from t1;
|
|
a b
|
|
1 1
|
|
2 2
|
|
3 3
|
|
4 14
|
|
5 25
|
|
6 26
|
|
7 27
|
|
8 28
|
|
9 29
|
|
drop table t1;
|
|
CREATE TABLE t1 (a INT, b INT, c INT, UNIQUE (A), UNIQUE(B));
|
|
INSERT t1 VALUES (1,2,10), (3,4,20);
|
|
INSERT t1 SELECT 5,6,30 FROM DUAL ON DUPLICATE KEY UPDATE c=c+100;
|
|
SELECT * FROM t1;
|
|
a b c
|
|
1 2 10
|
|
3 4 20
|
|
5 6 30
|
|
INSERT t1 SELECT 5,7,40 FROM DUAL ON DUPLICATE KEY UPDATE c=c+100;
|
|
SELECT * FROM t1;
|
|
a b c
|
|
1 2 10
|
|
3 4 20
|
|
5 6 130
|
|
INSERT t1 SELECT 8,4,50 FROM DUAL ON DUPLICATE KEY UPDATE c=c+1000;
|
|
SELECT * FROM t1;
|
|
a b c
|
|
1 2 10
|
|
3 4 1020
|
|
5 6 130
|
|
INSERT t1 SELECT 1,4,60 FROM DUAL ON DUPLICATE KEY UPDATE c=c+10000;
|
|
SELECT * FROM t1;
|
|
a b c
|
|
1 2 10010
|
|
3 4 1020
|
|
5 6 130
|
|
INSERT t1 SELECT 1,9,70 FROM DUAL ON DUPLICATE KEY UPDATE c=c+100000, b=4;
|
|
ERROR 23000: Duplicate entry '4' for key 2
|
|
SELECT * FROM t1;
|
|
a b c
|
|
1 2 10010
|
|
3 4 1020
|
|
5 6 130
|
|
TRUNCATE TABLE t1;
|
|
INSERT t1 VALUES (1,2,10), (3,4,20);
|
|
CREATE TABLE t2 (a INT, b INT, c INT, d INT);
|
|
INSERT t2 VALUES (5,6,30,1), (7,4,40,1), (8,9,60,1);
|
|
INSERT t2 VALUES (2,1,11,2), (7,4,40,2);
|
|
INSERT t1 SELECT a,b,c FROM t2 WHERE d=1 ON DUPLICATE KEY UPDATE c=t1.c+100;
|
|
SELECT * FROM t1;
|
|
a b c
|
|
1 2 10
|
|
3 4 120
|
|
5 6 30
|
|
8 9 60
|
|
INSERT t1 SET a=5 ON DUPLICATE KEY UPDATE b=0;
|
|
SELECT * FROM t1;
|
|
a b c
|
|
1 2 10
|
|
3 4 120
|
|
5 0 30
|
|
8 9 60
|
|
INSERT t1 SELECT a,b,c FROM t2 WHERE d=2 ON DUPLICATE KEY UPDATE c=c+VALUES(a);
|
|
ERROR 23000: Column 'c' in field list is ambiguous
|
|
INSERT t1 SELECT a,b,c FROM t2 WHERE d=2 ON DUPLICATE KEY UPDATE c=t1.c+VALUES(t1.a);
|
|
SELECT *, VALUES(a) FROM t1;
|
|
a b c VALUES(a)
|
|
1 2 10 NULL
|
|
3 4 127 NULL
|
|
5 0 30 NULL
|
|
8 9 60 NULL
|
|
2 1 11 NULL
|
|
DROP TABLE t1;
|
|
DROP TABLE t2;
|
|
create table t1 (a int not null unique) engine=myisam;
|
|
insert into t1 values (1),(2);
|
|
insert ignore into t1 select 1 on duplicate key update a=2;
|
|
select * from t1;
|
|
a
|
|
1
|
|
2
|
|
insert ignore into t1 select a from t1 as t2 on duplicate key update a=t1.a+1 ;
|
|
select * from t1;
|
|
a
|
|
1
|
|
3
|
|
insert into t1 select 1 on duplicate key update a=2;
|
|
select * from t1;
|
|
a
|
|
2
|
|
3
|
|
insert into t1 select a from t1 on duplicate key update a=a+1 ;
|
|
ERROR 23000: Column 'a' in field list is ambiguous
|
|
insert ignore into t1 select a from t1 on duplicate key update a=t1.a+1 ;
|
|
ERROR 23000: Column 't1.a' in field list is ambiguous
|
|
drop table t1;
|
|
CREATE TABLE t1 (
|
|
a BIGINT(20) NOT NULL DEFAULT 0,
|
|
PRIMARY KEY (a)
|
|
) ENGINE=MyISAM;
|
|
INSERT INTO t1 ( a ) SELECT 0 ON DUPLICATE KEY UPDATE a = a + VALUES (a) ;
|
|
DROP TABLE t1;
|
|
CREATE TABLE t1
|
|
(
|
|
a BIGINT UNSIGNED,
|
|
b BIGINT UNSIGNED,
|
|
PRIMARY KEY (a)
|
|
);
|
|
INSERT INTO t1 VALUES (45, 1) ON DUPLICATE KEY UPDATE b =
|
|
IF(VALUES(b) > t1.b, VALUES(b), t1.b);
|
|
SELECT * FROM t1;
|
|
a b
|
|
45 1
|
|
INSERT INTO t1 VALUES (45, 2) ON DUPLICATE KEY UPDATE b =
|
|
IF(VALUES(b) > t1.b, VALUES(b), t1.b);
|
|
SELECT * FROM t1;
|
|
a b
|
|
45 2
|
|
INSERT INTO t1 VALUES (45, 1) ON DUPLICATE KEY UPDATE b =
|
|
IF(VALUES(b) > t1.b, VALUES(b), t1.b);
|
|
SELECT * FROM t1;
|
|
a b
|
|
45 2
|
|
DROP TABLE t1;
|
|
CREATE TABLE t1 (i INT PRIMARY KEY, j INT);
|
|
INSERT INTO t1 SELECT 1, j;
|
|
ERROR 42S22: Unknown column 'j' in 'field list'
|
|
DROP TABLE t1;
|
|
CREATE TABLE t1 (i INT PRIMARY KEY, j INT);
|
|
CREATE TABLE t2 (a INT, b INT);
|
|
CREATE TABLE t3 (a INT, c INT);
|
|
INSERT INTO t1 SELECT 1, a FROM t2 NATURAL JOIN t3
|
|
ON DUPLICATE KEY UPDATE j= a;
|
|
DROP TABLE t1,t2,t3;
|
|
CREATE TABLE t1 (i INT PRIMARY KEY, j INT);
|
|
CREATE TABLE t2 (a INT);
|
|
INSERT INTO t1 VALUES (1, 1);
|
|
INSERT INTO t2 VALUES (1), (3);
|
|
INSERT INTO t1 SELECT 1, COUNT(*) FROM t2 ON DUPLICATE KEY UPDATE j= a;
|
|
ERROR 42S22: Unknown column 'a' in 'field list'
|
|
DROP TABLE t1,t2;
|