diff options
-rw-r--r-- | mysql-test/r/subselect.result | 26 | ||||
-rw-r--r-- | mysql-test/t/subselect.test | 14 | ||||
-rw-r--r-- | sql/sql_parse.cc | 14 | ||||
-rw-r--r-- | sql/sql_prepare.cc | 13 |
4 files changed, 64 insertions, 3 deletions
diff --git a/mysql-test/r/subselect.result b/mysql-test/r/subselect.result index b8b899f4850..e72f05d22d4 100644 --- a/mysql-test/r/subselect.result +++ b/mysql-test/r/subselect.result @@ -1831,3 +1831,29 @@ Warnings: 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)) 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; diff --git a/mysql-test/t/subselect.test b/mysql-test/t/subselect.test index 4b2fd33abfd..050d07717bb 100644 --- a/mysql-test/t/subselect.test +++ b/mysql-test/t/subselect.test @@ -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); explain extended select * from t1 up where exists (select * from t1 where t1.a=up.a); 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; diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 28e833b8421..215d90f3881 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -2334,7 +2334,15 @@ mysql_execute_command(THD *thd) lex->create_list, lex->key_list, 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); + select_lex->resolve_mode= SELECT_LEX::NOMATTER_MODE; + } //reset for PS lex->create_list.empty(); lex->key_list.empty(); @@ -2685,7 +2693,11 @@ unsent_create_error: lex->duplicates))) /* 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.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); /* revert changes for SP */ lex->select_lex.table_list.first= (byte*) first_local_table; diff --git a/sql/sql_prepare.cc b/sql/sql_prepare.cc index 40107ebc637..7a3ff4c7613 100644 --- a/sql/sql_prepare.cc +++ b/sql/sql_prepare.cc @@ -1308,6 +1308,7 @@ static int mysql_test_create_table(Prepared_statement *stmt, DBUG_ENTER("mysql_test_create_table"); THD *thd= stmt->thd; LEX *lex= stmt->lex; + SELECT_LEX *select_lex= &lex->select_lex; int res= 0; /* 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); 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); + select_lex->resolve_mode= SELECT_LEX::NOMATTER_MODE; + } /* put tables back for PS rexecuting */ 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; /* 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.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); /* revert changes*/ lex->select_lex.table_list.first= (byte*) first_local_table; |