Loading mysql-test/r/insert_update.result +3 −3 Original line number Diff line number Diff line Loading @@ -140,10 +140,10 @@ a b c 5 6 130 TRUNCATE TABLE t1; INSERT t1 VALUES (1,2,10), (3,4,20); CREATE TABLE t2 (x INT, y INT, z INT, d INT); 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 x,y,z FROM t2 WHERE d=1 ON DUPLICATE KEY UPDATE c=c+100; INSERT t1 SELECT a,b,c FROM t2 WHERE d=1 ON DUPLICATE KEY UPDATE c=c+100; SELECT * FROM t1; a b c 1 2 10 Loading @@ -157,7 +157,7 @@ a b c 3 4 120 5 0 30 8 9 60 INSERT t1 SELECT x,y,z FROM t2 WHERE d=2 ON DUPLICATE KEY UPDATE c=c+VALUES(a); INSERT t1 SELECT a,b,c FROM t2 WHERE d=2 ON DUPLICATE KEY UPDATE c=c+VALUES(a); SELECT *, VALUES(a) FROM t1; a b c VALUES(a) 1 2 10 NULL Loading mysql-test/t/insert_update.test +4 −3 Original line number Diff line number Diff line Loading @@ -68,14 +68,15 @@ INSERT t1 SELECT 1,9,70 FROM DUAL ON DUPLICATE KEY UPDATE c=c+100000, b=4; SELECT * FROM t1; TRUNCATE TABLE t1; INSERT t1 VALUES (1,2,10), (3,4,20); CREATE TABLE t2 (x INT, y INT, z INT, d INT); CREATE TABLE t2 (a INT, b INT, c INT, d INT); # column names deliberately clash with columns in t1 (Bug#8147) 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 x,y,z FROM t2 WHERE d=1 ON DUPLICATE KEY UPDATE c=c+100; INSERT t1 SELECT a,b,c FROM t2 WHERE d=1 ON DUPLICATE KEY UPDATE c=c+100; SELECT * FROM t1; INSERT t1 SET a=5 ON DUPLICATE KEY UPDATE b=0; SELECT * FROM t1; INSERT t1 SELECT x,y,z FROM t2 WHERE d=2 ON DUPLICATE KEY UPDATE c=c+VALUES(a); INSERT t1 SELECT a,b,c FROM t2 WHERE d=2 ON DUPLICATE KEY UPDATE c=c+VALUES(a); SELECT *, VALUES(a) FROM t1; DROP TABLE t1; DROP TABLE t2; sql/sql_parse.cc +14 −8 Original line number Diff line number Diff line Loading @@ -2775,18 +2775,23 @@ mysql_execute_command(THD *thd) select_lex->options |= OPTION_BUFFER_RESULT; } if (!(res= open_and_lock_tables(thd, tables)) && !(res= mysql_prepare_insert(thd, tables, first_local_table, tables->table, lex->field_list, 0, if ((res= open_and_lock_tables(thd, tables))) break; TABLE *table= tables->table; /* Skip first table, which is the table we are inserting in */ tables= (TABLE_LIST *) lex->select_lex.table_list.first= (byte*) first_local_table->next; first_local_table->next= 0; if (!(res= mysql_prepare_insert(thd, tables, first_local_table, table, lex->field_list, 0, lex->update_list, lex->value_list, lex->duplicates)) && (result= new select_insert(tables->table, &lex->field_list, (result= new select_insert(table, &lex->field_list, &lex->update_list, &lex->value_list, lex->duplicates, lex->ignore))) { TABLE *table= tables->table; /* Skip first table, which is the table we are inserting in */ lex->select_lex.table_list.first= (byte*) first_local_table->next; /* insert/replace from SELECT give its SELECT_LEX for SELECT, and item_list belong to SELECT Loading @@ -2794,7 +2799,6 @@ mysql_execute_command(THD *thd) lex->select_lex.resolve_mode= SELECT_LEX::SELECT_MODE; res= handle_select(thd, lex, result); /* revert changes for SP */ lex->select_lex.table_list.first= (byte*) first_local_table; lex->select_lex.resolve_mode= SELECT_LEX::INSERT_MODE; delete result; table->insert_values= 0; Loading @@ -2803,6 +2807,8 @@ mysql_execute_command(THD *thd) } else res= -1; first_local_table->next= tables; lex->select_lex.table_list.first= (byte*) first_local_table; break; } case SQLCOM_TRUNCATE: Loading Loading
mysql-test/r/insert_update.result +3 −3 Original line number Diff line number Diff line Loading @@ -140,10 +140,10 @@ a b c 5 6 130 TRUNCATE TABLE t1; INSERT t1 VALUES (1,2,10), (3,4,20); CREATE TABLE t2 (x INT, y INT, z INT, d INT); 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 x,y,z FROM t2 WHERE d=1 ON DUPLICATE KEY UPDATE c=c+100; INSERT t1 SELECT a,b,c FROM t2 WHERE d=1 ON DUPLICATE KEY UPDATE c=c+100; SELECT * FROM t1; a b c 1 2 10 Loading @@ -157,7 +157,7 @@ a b c 3 4 120 5 0 30 8 9 60 INSERT t1 SELECT x,y,z FROM t2 WHERE d=2 ON DUPLICATE KEY UPDATE c=c+VALUES(a); INSERT t1 SELECT a,b,c FROM t2 WHERE d=2 ON DUPLICATE KEY UPDATE c=c+VALUES(a); SELECT *, VALUES(a) FROM t1; a b c VALUES(a) 1 2 10 NULL Loading
mysql-test/t/insert_update.test +4 −3 Original line number Diff line number Diff line Loading @@ -68,14 +68,15 @@ INSERT t1 SELECT 1,9,70 FROM DUAL ON DUPLICATE KEY UPDATE c=c+100000, b=4; SELECT * FROM t1; TRUNCATE TABLE t1; INSERT t1 VALUES (1,2,10), (3,4,20); CREATE TABLE t2 (x INT, y INT, z INT, d INT); CREATE TABLE t2 (a INT, b INT, c INT, d INT); # column names deliberately clash with columns in t1 (Bug#8147) 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 x,y,z FROM t2 WHERE d=1 ON DUPLICATE KEY UPDATE c=c+100; INSERT t1 SELECT a,b,c FROM t2 WHERE d=1 ON DUPLICATE KEY UPDATE c=c+100; SELECT * FROM t1; INSERT t1 SET a=5 ON DUPLICATE KEY UPDATE b=0; SELECT * FROM t1; INSERT t1 SELECT x,y,z FROM t2 WHERE d=2 ON DUPLICATE KEY UPDATE c=c+VALUES(a); INSERT t1 SELECT a,b,c FROM t2 WHERE d=2 ON DUPLICATE KEY UPDATE c=c+VALUES(a); SELECT *, VALUES(a) FROM t1; DROP TABLE t1; DROP TABLE t2;
sql/sql_parse.cc +14 −8 Original line number Diff line number Diff line Loading @@ -2775,18 +2775,23 @@ mysql_execute_command(THD *thd) select_lex->options |= OPTION_BUFFER_RESULT; } if (!(res= open_and_lock_tables(thd, tables)) && !(res= mysql_prepare_insert(thd, tables, first_local_table, tables->table, lex->field_list, 0, if ((res= open_and_lock_tables(thd, tables))) break; TABLE *table= tables->table; /* Skip first table, which is the table we are inserting in */ tables= (TABLE_LIST *) lex->select_lex.table_list.first= (byte*) first_local_table->next; first_local_table->next= 0; if (!(res= mysql_prepare_insert(thd, tables, first_local_table, table, lex->field_list, 0, lex->update_list, lex->value_list, lex->duplicates)) && (result= new select_insert(tables->table, &lex->field_list, (result= new select_insert(table, &lex->field_list, &lex->update_list, &lex->value_list, lex->duplicates, lex->ignore))) { TABLE *table= tables->table; /* Skip first table, which is the table we are inserting in */ lex->select_lex.table_list.first= (byte*) first_local_table->next; /* insert/replace from SELECT give its SELECT_LEX for SELECT, and item_list belong to SELECT Loading @@ -2794,7 +2799,6 @@ mysql_execute_command(THD *thd) lex->select_lex.resolve_mode= SELECT_LEX::SELECT_MODE; res= handle_select(thd, lex, result); /* revert changes for SP */ lex->select_lex.table_list.first= (byte*) first_local_table; lex->select_lex.resolve_mode= SELECT_LEX::INSERT_MODE; delete result; table->insert_values= 0; Loading @@ -2803,6 +2807,8 @@ mysql_execute_command(THD *thd) } else res= -1; first_local_table->next= tables; lex->select_lex.table_list.first= (byte*) first_local_table; break; } case SQLCOM_TRUNCATE: Loading