Commit 875a26d5 authored by unknown's avatar unknown

merge


sql/item.cc:
  Auto merged
sql/sql_lex.cc:
  Auto merged
sql/sql_lex.h:
  Auto merged
sql/sql_parse.cc:
  Auto merged
sql/sql_yacc.yy:
  Auto merged
parents c44af18b 668cd972
...@@ -1225,20 +1225,6 @@ a (select count(distinct t1.b) as sum from t1,t2 where t1.a=t2.a and t2.b > 0 an ...@@ -1225,20 +1225,6 @@ a (select count(distinct t1.b) as sum from t1,t2 where t1.a=t2.a and t2.b > 0 an
2 2 2 2
1 2 1 2
drop table t1,t2,t3; drop table t1,t2,t3;
create table t1 (a char(10) character set koi8r collate koi8r_bin);
create table t2 select (select a from t1);
show create table t2;
Table Create Table
t2 CREATE TABLE `t2` (
`(select a from t1)` char(10) character set koi8r collate koi8r_bin default NULL
) TYPE=MyISAM CHARSET=latin1
drop table t1,t2;
CREATE TABLE t1
(s1 CHAR(5) COLLATE latin1_german1_ci,
s2 CHAR(5) COLLATE latin1_swedish_ci);
SELECT * FROM t1 WHERE s1 = (SELECT s2 FROM t1);
ERROR HY000: Illegal mix of collations (latin1_german1_ci,IMPLICIT) and (latin1_swedish_ci,IMPLICIT) for operation '='
drop table t1;
create table t1 (s1 int); create table t1 (s1 int);
create table t2 (s1 int); create table t2 (s1 int);
insert into t1 values (1); insert into t1 values (1);
...@@ -1246,3 +1232,10 @@ insert into t2 values (1); ...@@ -1246,3 +1232,10 @@ insert into t2 values (1);
select * from t1 where exists (select s1 from t2 having max(t2.s1)=t1.s1); select * from t1 where exists (select s1 from t2 having max(t2.s1)=t1.s1);
s1 s1
drop table t1,t2; drop table t1,t2;
create table t1 (s1 int);
create table t2 (s1 int);
insert into t1 values (1);
insert into t2 values (1);
update t1 set s1 = s1 + 1 where 1 = (select x.s1 as A from t2 WHERE t2.s1 > t1.s1 order by A);
ERROR 42S02: Unknown table 'x' in field list
DROP TABLE t1, t2;
...@@ -820,16 +820,6 @@ insert into t3 values (3,3), (2,2), (1,1); ...@@ -820,16 +820,6 @@ insert into t3 values (3,3), (2,2), (1,1);
select a,(select count(distinct t1.b) as sum from t1,t2 where t1.a=t2.a and t2.b > 0 and t1.a <= t3.b group by t1.a order by sum limit 1) from t3; select a,(select count(distinct t1.b) as sum from t1,t2 where t1.a=t2.a and t2.b > 0 and t1.a <= t3.b group by t1.a order by sum limit 1) from t3;
drop table t1,t2,t3; drop table t1,t2,t3;
create table t1 (a char(10) character set koi8r collate koi8r_bin);
create table t2 select (select a from t1);
show create table t2;
drop table t1,t2;
CREATE TABLE t1
(s1 CHAR(5) COLLATE latin1_german1_ci,
s2 CHAR(5) COLLATE latin1_swedish_ci);
--error 1265
SELECT * FROM t1 WHERE s1 = (SELECT s2 FROM t1);
drop table t1; drop table t1;
# #
...@@ -841,3 +831,15 @@ insert into t1 values (1); ...@@ -841,3 +831,15 @@ insert into t1 values (1);
insert into t2 values (1); insert into t2 values (1);
select * from t1 where exists (select s1 from t2 having max(t2.s1)=t1.s1); select * from t1 where exists (select s1 from t2 having max(t2.s1)=t1.s1);
drop table t1,t2; drop table t1,t2;
#
# update subquery with wrong field (to force name resolving
# in UPDATE name space)
#
create table t1 (s1 int);
create table t2 (s1 int);
insert into t1 values (1);
insert into t2 values (1);
-- error 1109
update t1 set s1 = s1 + 1 where 1 = (select x.s1 as A from t2 WHERE t2.s1 > t1.s1 order by A);
DROP TABLE t1, t2;
...@@ -870,7 +870,7 @@ bool Item_field::fix_fields(THD *thd, TABLE_LIST *tables, Item **ref) ...@@ -870,7 +870,7 @@ bool Item_field::fix_fields(THD *thd, TABLE_LIST *tables, Item **ref)
sl= sl->outer_select()) sl= sl->outer_select())
{ {
table_list= (last= sl)->get_table_list(); table_list= (last= sl)->get_table_list();
if (sl->insert_select && table_list) if (sl->resolve_mode == SELECT_LEX::INSERT_MODE && table_list)
{ {
// it is primary INSERT st_select_lex => skip first table resolving // it is primary INSERT st_select_lex => skip first table resolving
table_list= table_list->next; table_list= table_list->next;
...@@ -879,7 +879,8 @@ bool Item_field::fix_fields(THD *thd, TABLE_LIST *tables, Item **ref) ...@@ -879,7 +879,8 @@ bool Item_field::fix_fields(THD *thd, TABLE_LIST *tables, Item **ref)
table_list, &where, table_list, &where,
0)) != not_found_field) 0)) != not_found_field)
break; break;
if ((refer= find_item_in_list(this, sl->item_list, &counter, if (sl->resolve_mode == SELECT_LEX::SELECT_MODE &&
(refer= find_item_in_list(this, sl->item_list, &counter,
REPORT_EXCEPT_NOT_FOUND)) != REPORT_EXCEPT_NOT_FOUND)) !=
(Item **) not_found_item) (Item **) not_found_item)
break; break;
...@@ -1356,13 +1357,15 @@ bool Item_ref::fix_fields(THD *thd,TABLE_LIST *tables, Item **reference) ...@@ -1356,13 +1357,15 @@ bool Item_ref::fix_fields(THD *thd,TABLE_LIST *tables, Item **reference)
SELECT_LEX *last=0; SELECT_LEX *last=0;
for ( ; sl ; sl= sl->outer_select()) for ( ; sl ; sl= sl->outer_select())
{ {
if ((ref= find_item_in_list(this, (last= sl)->item_list, last= sl;
if (sl->resolve_mode == SELECT_LEX::SELECT_MODE &&
(ref= find_item_in_list(this, sl->item_list,
&counter, &counter,
REPORT_EXCEPT_NOT_FOUND)) != REPORT_EXCEPT_NOT_FOUND)) !=
(Item **)not_found_item) (Item **)not_found_item)
break; break;
table_list= sl->get_table_list(); table_list= sl->get_table_list();
if (sl->insert_select && table_list) if (sl->resolve_mode == SELECT_LEX::INSERT_MODE && table_list)
{ {
// it is primary INSERT st_select_lex => skip first table resolving // it is primary INSERT st_select_lex => skip first table resolving
table_list= table_list->next; table_list= table_list->next;
......
...@@ -986,7 +986,8 @@ void st_select_lex::init_query() ...@@ -986,7 +986,8 @@ void st_select_lex::init_query()
join= 0; join= 0;
where= 0; where= 0;
olap= UNSPECIFIED_OLAP_TYPE; olap= UNSPECIFIED_OLAP_TYPE;
insert_select= having_fix_field= 0; having_fix_field= 0;
resolve_mode= NOMATTER_MODE;
with_wild= 0; with_wild= 0;
} }
......
...@@ -364,14 +364,27 @@ class st_select_lex: public st_select_lex_node ...@@ -364,14 +364,27 @@ class st_select_lex: public st_select_lex_node
bool braces; /* SELECT ... UNION (SELECT ... ) <- this braces */ bool braces; /* SELECT ... UNION (SELECT ... ) <- this braces */
/* TRUE when having fix field called in processing of this SELECT */ /* TRUE when having fix field called in processing of this SELECT */
bool having_fix_field; bool having_fix_field;
/* /*
TRUE for primary st_select_lex structure of simple INSERT/REPLACE SELECT for SELECT command st_select_lex. Used to privent scaning
item_list of non-SELECT st_select_lex (no sense find to finding
reference in it (all should be in tables, it is dangerouse due
to order of fix_fields calling for non-SELECTs commands (item list
can be not fix_fieldsd)). This value will be assigned for
primary select (sql_yac.yy) and for any subquery and
UNION SELECT (sql_parse.cc mysql_new_select())
INSERT for primary st_select_lex structure of simple INSERT/REPLACE
(used for name resolution, see Item_fiels & Item_ref fix_fields, (used for name resolution, see Item_fiels & Item_ref fix_fields,
FALSE for INSERT/REPLACE ... SELECT, because it's FALSE for INSERT/REPLACE ... SELECT, because it's
st_select_lex->table_list will be preprocessed (first table removed) st_select_lex->table_list will be preprocessed (first table removed)
before passing to handle_select) before passing to handle_select)
NOMATTER for other
*/ */
bool insert_select; enum {NOMATTER_MODE, SELECT_MODE, INSERT_MODE} resolve_mode;
void init_query(); void init_query();
void init_select(); void init_select();
......
...@@ -3561,6 +3561,7 @@ mysql_new_select(LEX *lex, bool move_down) ...@@ -3561,6 +3561,7 @@ mysql_new_select(LEX *lex, bool move_down)
unit->link_prev= 0; unit->link_prev= 0;
unit->return_to= lex->current_select; unit->return_to= lex->current_select;
select_lex->include_down(unit); select_lex->include_down(unit);
// TODO: assign resolve_mode for fake subquery after merging with new tree
} }
else else
select_lex->include_neighbour(lex->current_select); select_lex->include_neighbour(lex->current_select);
...@@ -3568,6 +3569,7 @@ mysql_new_select(LEX *lex, bool move_down) ...@@ -3568,6 +3569,7 @@ mysql_new_select(LEX *lex, bool move_down)
select_lex->master_unit()->global_parameters= select_lex; select_lex->master_unit()->global_parameters= select_lex;
select_lex->include_global((st_select_lex_node**)&lex->all_selects_list); select_lex->include_global((st_select_lex_node**)&lex->all_selects_list);
lex->current_select= select_lex; lex->current_select= select_lex;
select_lex->resolve_mode= SELECT_LEX::SELECT_MODE;
return 0; return 0;
} }
......
...@@ -1910,7 +1910,12 @@ opt_ignore_leaves: ...@@ -1910,7 +1910,12 @@ opt_ignore_leaves:
select: select:
select_init { Lex->sql_command=SQLCOM_SELECT; }; select_init
{
LEX *lex= Lex;
lex->sql_command= SQLCOM_SELECT;
lex->select_lex.resolve_mode= SELECT_LEX::SELECT_MODE;
};
/* Need select_init2 for subselects. */ /* Need select_init2 for subselects. */
select_init: select_init:
...@@ -3401,7 +3406,7 @@ insert: ...@@ -3401,7 +3406,7 @@ insert:
lex->sql_command = SQLCOM_INSERT; lex->sql_command = SQLCOM_INSERT;
/* for subselects */ /* for subselects */
lex->lock_option= (using_update_log) ? TL_READ_NO_INSERT : TL_READ; lex->lock_option= (using_update_log) ? TL_READ_NO_INSERT : TL_READ;
lex->select_lex.insert_select= 1; lex->select_lex.resolve_mode= SELECT_LEX::INSERT_MODE;
} insert_lock_option } insert_lock_option
opt_ignore insert2 opt_ignore insert2
{ {
...@@ -3417,7 +3422,7 @@ replace: ...@@ -3417,7 +3422,7 @@ replace:
LEX *lex=Lex; LEX *lex=Lex;
lex->sql_command = SQLCOM_REPLACE; lex->sql_command = SQLCOM_REPLACE;
lex->duplicates= DUP_REPLACE; lex->duplicates= DUP_REPLACE;
lex->select_lex.insert_select= 1; lex->select_lex.resolve_mode= SELECT_LEX::INSERT_MODE;
} }
replace_lock_option insert2 replace_lock_option insert2
{ {
...@@ -3486,7 +3491,7 @@ insert_values: ...@@ -3486,7 +3491,7 @@ insert_values:
it is not simple select => table list will be it is not simple select => table list will be
preprocessed before passing to handle_select preprocessed before passing to handle_select
*/ */
lex->select_lex.insert_select= 0; lex->select_lex.resolve_mode= SELECT_LEX::NOMATTER_MODE;
lex->current_select->parsing_place= SELECT_LEX_NODE::SELECT_LIST; lex->current_select->parsing_place= SELECT_LEX_NODE::SELECT_LIST;
} }
select_options select_item_list select_options select_item_list
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment