diff options
-rw-r--r-- | mysql-test/r/delete.result | 9 | ||||
-rw-r--r-- | mysql-test/t/delete.test | 10 | ||||
-rw-r--r-- | sql/sql_lex.cc | 4 | ||||
-rw-r--r-- | sql/sql_lex.h | 2 | ||||
-rw-r--r-- | sql/sql_parse.cc | 6 |
5 files changed, 28 insertions, 3 deletions
diff --git a/mysql-test/r/delete.result b/mysql-test/r/delete.result index c2230722aa6..351798b0509 100644 --- a/mysql-test/r/delete.result +++ b/mysql-test/r/delete.result @@ -24,3 +24,12 @@ create table t1 (a bigint not null, primary key (a,a,a,a,a,a,a,a,a,a)); insert into t1 values (2),(4),(6),(8),(10),(12),(14),(16),(18),(20),(22),(24),(26),(23),(27); delete from t1 where a=27; drop table t1; +drop table if exists t; +CREATE TABLE `t` ( +`i` int(10) NOT NULL default '0', +`i2` int(10) NOT NULL default '0', +PRIMARY KEY (`i`) +) TYPE=MyISAM CHARSET=latin1; +DELETE FROM t USING t WHERE post='1'; +Unknown column 'post' in 'where clause' +drop table if exists t; diff --git a/mysql-test/t/delete.test b/mysql-test/t/delete.test index 953e22cdd55..704fb7ada1c 100644 --- a/mysql-test/t/delete.test +++ b/mysql-test/t/delete.test @@ -35,3 +35,13 @@ create table t1 (a bigint not null, primary key (a,a,a,a,a,a,a,a,a,a)); insert into t1 values (2),(4),(6),(8),(10),(12),(14),(16),(18),(20),(22),(24),(26),(23),(27); delete from t1 where a=27; drop table t1; + +drop table if exists t; +CREATE TABLE `t` ( + `i` int(10) NOT NULL default '0', + `i2` int(10) NOT NULL default '0', + PRIMARY KEY (`i`) +) TYPE=MyISAM CHARSET=latin1; +-- error 1054 +DELETE FROM t USING t WHERE post='1'; +drop table if exists t;
\ No newline at end of file diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc index 4df3178c1f8..99e465f79c0 100644 --- a/sql/sql_lex.cc +++ b/sql/sql_lex.cc @@ -941,8 +941,6 @@ int yylex(void *arg, void *yythd) void st_select_lex_node::init_query() { - next= master= slave= link_next= 0; - prev= link_prev= 0; dependent= 0; } @@ -1011,6 +1009,7 @@ void st_select_lex_node::include_down(st_select_lex_node *upper) prev= &upper->slave; upper->slave= this; master= upper; + slave= 0; } /* include neighbour (on same level) */ @@ -1021,6 +1020,7 @@ void st_select_lex_node::include_neighbour(st_select_lex_node *before) prev= &before->next; before->next= this; master= before->master; + slave= 0; } /* including in global SELECT_LEX list */ diff --git a/sql/sql_lex.h b/sql/sql_lex.h index 0c761baffa3..927b806a082 100644 --- a/sql/sql_lex.h +++ b/sql/sql_lex.h @@ -194,6 +194,7 @@ enum olap_type Base class for st_select_lex (SELECT_LEX) & st_select_lex_unit (SELECT_LEX_UNIT) */ +struct st_lex; class st_select_lex; class st_select_lex_unit; class st_select_lex_node { @@ -252,6 +253,7 @@ public: void mark_as_dependent(st_select_lex *last); friend class st_select_lex_unit; + friend bool mysql_new_select(struct st_lex *lex, bool move_down); private: void fast_exclude(); }; diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index f8c46c7cd41..f3636f0b1bb 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -2991,11 +2991,13 @@ mysql_init_query(THD *thd) lex->select_lex.init_query(); lex->value_list.empty(); lex->param_list.empty(); + lex->unit.next= lex->unit.master= lex->unit.link_next= 0; + lex->unit.prev= lex->unit.link_prev= 0; lex->unit.global_parameters= lex->unit.slave= lex->current_select= lex->all_selects_list= &lex->select_lex; lex->select_lex.master= &lex->unit; lex->select_lex.prev= &lex->unit.slave; - lex->select_lex.link_next= 0; + lex->select_lex.link_next= lex->select_lex.slave= lex->select_lex.next= 0; lex->select_lex.link_prev= (st_select_lex_node**)&(lex->all_selects_list); lex->olap=lex->describe=0; lex->derived_tables= false; @@ -3045,6 +3047,8 @@ mysql_new_select(LEX *lex, bool move_down) unit->init_query(); unit->init_select(); unit->include_down(lex->current_select); + unit->link_next= 0; + unit->link_prev= 0; select_lex->include_down(unit); } else |