mirror of
https://github.com/MariaDB/server.git
synced 2025-08-01 03:47:19 +03:00
fixed field resolving mode fo INSERT/REPLACE and CRETE with SELECT (BUG#4090)
mysql-test/r/subselect.result: outer fields resolving in INSERT/REPLACE and CRETE with SELECT mysql-test/t/subselect.test: outer fields resolving in INSERT/REPLACE and CRETE with SELECT sql/sql_parse.cc: fixed field resolving mode fo INSERT/REPLACE and CRETE with SELECT sql/sql_prepare.cc: fixed field resolving mode fo INSERT/REPLACE and CRETE with SELECT
This commit is contained in:
@ -1831,3 +1831,29 @@ Warnings:
|
|||||||
Note 1276 Field or reference 'up.a' of SELECT #2 was resolved in SELECT #1
|
Note 1276 Field or reference 'up.a' of SELECT #2 was resolved in SELECT #1
|
||||||
Note 1003 select test.up.a AS `a`,test.up.b AS `b` from test.t1 up where exists(select 1 AS `Not_used` from test.t1 where (test.t1.a = test.up.a))
|
Note 1003 select test.up.a AS `a`,test.up.b AS `b` from test.t1 up where exists(select 1 AS `Not_used` from test.t1 where (test.t1.a = test.up.a))
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
DROP TABLE IF EXISTS t1, t2, t3;
|
||||||
|
Warnings:
|
||||||
|
Note 1051 Unknown table 't1'
|
||||||
|
Note 1051 Unknown table 't2'
|
||||||
|
Note 1051 Unknown table 't3'
|
||||||
|
CREATE TABLE t1 ( a int, b int );
|
||||||
|
CREATE TABLE t2 ( c int, d int );
|
||||||
|
INSERT INTO t1 VALUES (1,2), (2,3), (3,4);
|
||||||
|
SELECT a AS abc, b FROM t1 WHERE b = (SELECT MIN(b) FROM t1 WHERE a=abc);
|
||||||
|
abc b
|
||||||
|
1 2
|
||||||
|
2 3
|
||||||
|
3 4
|
||||||
|
INSERT INTO t2 SELECT a AS abc, b FROM t1 WHERE b = (SELECT MIN(b) FROM t1 WHERE a=abc);
|
||||||
|
select * from t2;
|
||||||
|
c d
|
||||||
|
1 2
|
||||||
|
2 3
|
||||||
|
3 4
|
||||||
|
CREATE TABLE t3 SELECT a AS abc, b FROM t1 WHERE b = (SELECT MIN(b) FROM t1 WHERE a=abc);
|
||||||
|
select * from t3;
|
||||||
|
abc b
|
||||||
|
1 2
|
||||||
|
2 3
|
||||||
|
3 4
|
||||||
|
DROP TABLE t1, t2, t3;
|
||||||
|
@ -1167,3 +1167,17 @@ insert into t1 values (1,2),(3,4);
|
|||||||
select * from t1 up where exists (select * from t1 where t1.a=up.a);
|
select * from t1 up where exists (select * from t1 where t1.a=up.a);
|
||||||
explain extended select * from t1 up where exists (select * from t1 where t1.a=up.a);
|
explain extended select * from t1 up where exists (select * from t1 where t1.a=up.a);
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
|
||||||
|
#
|
||||||
|
# outer fields resolving in INSERT/REPLACE and CRETE with SELECT
|
||||||
|
#
|
||||||
|
DROP TABLE IF EXISTS t1, t2, t3;
|
||||||
|
CREATE TABLE t1 ( a int, b int );
|
||||||
|
CREATE TABLE t2 ( c int, d int );
|
||||||
|
INSERT INTO t1 VALUES (1,2), (2,3), (3,4);
|
||||||
|
SELECT a AS abc, b FROM t1 WHERE b = (SELECT MIN(b) FROM t1 WHERE a=abc);
|
||||||
|
INSERT INTO t2 SELECT a AS abc, b FROM t1 WHERE b = (SELECT MIN(b) FROM t1 WHERE a=abc);
|
||||||
|
select * from t2;
|
||||||
|
CREATE TABLE t3 SELECT a AS abc, b FROM t1 WHERE b = (SELECT MIN(b) FROM t1 WHERE a=abc);
|
||||||
|
select * from t3;
|
||||||
|
DROP TABLE t1, t2, t3;
|
||||||
|
@ -2334,7 +2334,15 @@ mysql_execute_command(THD *thd)
|
|||||||
lex->create_list,
|
lex->create_list,
|
||||||
lex->key_list,
|
lex->key_list,
|
||||||
select_lex->item_list,lex->duplicates)))
|
select_lex->item_list,lex->duplicates)))
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
CREATE from SELECT give its SELECT_LEX for SELECT,
|
||||||
|
and item_list belong to SELECT
|
||||||
|
*/
|
||||||
|
select_lex->resolve_mode= SELECT_LEX::SELECT_MODE;
|
||||||
res=handle_select(thd, lex, result);
|
res=handle_select(thd, lex, result);
|
||||||
|
select_lex->resolve_mode= SELECT_LEX::NOMATTER_MODE;
|
||||||
|
}
|
||||||
//reset for PS
|
//reset for PS
|
||||||
lex->create_list.empty();
|
lex->create_list.empty();
|
||||||
lex->key_list.empty();
|
lex->key_list.empty();
|
||||||
@ -2685,7 +2693,11 @@ unsent_create_error:
|
|||||||
lex->duplicates)))
|
lex->duplicates)))
|
||||||
/* Skip first table, which is the table we are inserting in */
|
/* Skip first table, which is the table we are inserting in */
|
||||||
lex->select_lex.table_list.first= (byte*) first_local_table->next;
|
lex->select_lex.table_list.first= (byte*) first_local_table->next;
|
||||||
lex->select_lex.resolve_mode= SELECT_LEX::NOMATTER_MODE;
|
/*
|
||||||
|
insert/replace from SELECT give its SELECT_LEX for SELECT,
|
||||||
|
and item_list belong to SELECT
|
||||||
|
*/
|
||||||
|
lex->select_lex.resolve_mode= SELECT_LEX::SELECT_MODE;
|
||||||
res=handle_select(thd,lex,result);
|
res=handle_select(thd,lex,result);
|
||||||
/* revert changes for SP */
|
/* revert changes for SP */
|
||||||
lex->select_lex.table_list.first= (byte*) first_local_table;
|
lex->select_lex.table_list.first= (byte*) first_local_table;
|
||||||
|
@ -1308,6 +1308,7 @@ static int mysql_test_create_table(Prepared_statement *stmt,
|
|||||||
DBUG_ENTER("mysql_test_create_table");
|
DBUG_ENTER("mysql_test_create_table");
|
||||||
THD *thd= stmt->thd;
|
THD *thd= stmt->thd;
|
||||||
LEX *lex= stmt->lex;
|
LEX *lex= stmt->lex;
|
||||||
|
SELECT_LEX *select_lex= &lex->select_lex;
|
||||||
int res= 0;
|
int res= 0;
|
||||||
|
|
||||||
/* Skip first table, which is the table we are creating */
|
/* Skip first table, which is the table we are creating */
|
||||||
@ -1316,8 +1317,12 @@ static int mysql_test_create_table(Prepared_statement *stmt,
|
|||||||
&create_table_local);
|
&create_table_local);
|
||||||
|
|
||||||
if (!(res= create_table_precheck(thd, tables, create_table)) &&
|
if (!(res= create_table_precheck(thd, tables, create_table)) &&
|
||||||
lex->select_lex.item_list.elements)
|
select_lex->item_list.elements)
|
||||||
|
{
|
||||||
|
select_lex->resolve_mode= SELECT_LEX::SELECT_MODE;
|
||||||
res= select_like_statement_test(stmt, tables);
|
res= select_like_statement_test(stmt, tables);
|
||||||
|
select_lex->resolve_mode= SELECT_LEX::NOMATTER_MODE;
|
||||||
|
}
|
||||||
|
|
||||||
/* put tables back for PS rexecuting */
|
/* put tables back for PS rexecuting */
|
||||||
tables= lex->link_first_table_back(tables, create_table,
|
tables= lex->link_first_table_back(tables, create_table,
|
||||||
@ -1401,7 +1406,11 @@ static int mysql_test_insert_select(Prepared_statement *stmt,
|
|||||||
(TABLE_LIST *)lex->select_lex.table_list.first;
|
(TABLE_LIST *)lex->select_lex.table_list.first;
|
||||||
/* Skip first table, which is the table we are inserting in */
|
/* Skip first table, which is the table we are inserting in */
|
||||||
lex->select_lex.table_list.first= (byte*) first_local_table->next;
|
lex->select_lex.table_list.first= (byte*) first_local_table->next;
|
||||||
lex->select_lex.resolve_mode= SELECT_LEX::NOMATTER_MODE;
|
/*
|
||||||
|
insert/replace from SELECT give its SELECT_LEX for SELECT,
|
||||||
|
and item_list belong to SELECT
|
||||||
|
*/
|
||||||
|
lex->select_lex.resolve_mode= SELECT_LEX::SELECT_MODE;
|
||||||
res= select_like_statement_test(stmt, tables);
|
res= select_like_statement_test(stmt, tables);
|
||||||
/* revert changes*/
|
/* revert changes*/
|
||||||
lex->select_lex.table_list.first= (byte*) first_local_table;
|
lex->select_lex.table_list.first= (byte*) first_local_table;
|
||||||
|
Reference in New Issue
Block a user