summaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
authorunknown <serg@serg.mysql.com>2002-10-27 16:22:58 +0000
committerunknown <serg@serg.mysql.com>2002-10-27 16:22:58 +0000
commit60131d02af66929aa16209ae68959b01f39485c5 (patch)
tree0ac3c9bd924d25616218fecbb29169a1046edda1 /sql
parentc37bbf06bb452899e5946a75282000de0699b335 (diff)
downloadmariadb-git-60131d02af66929aa16209ae68959b01f39485c5.tar.gz
fixed bug in HAVING error handling
small Item_ref optimization
Diffstat (limited to 'sql')
-rw-r--r--sql/item.cc22
1 files changed, 11 insertions, 11 deletions
diff --git a/sql/item.cc b/sql/item.cc
index 1beb6b257bd..f8404f40421 100644
--- a/sql/item.cc
+++ b/sql/item.cc
@@ -822,23 +822,22 @@ bool Item_ref::fix_fields(THD *thd,TABLE_LIST *tables, Item **reference)
{
if (!ref)
{
+ SELECT_LEX *sl=thd->lex.select->outer_select();
if ((ref= find_item_in_list(this, thd->lex.select->item_list,
- REPORT_EXCEPT_NOT_FOUND)) ==
+ (sl ? REPORT_EXCEPT_NOT_FOUND : REPORT_ALL_ERRORS))) ==
(Item **)not_found_item)
{
/*
- We can't find table field in table list of current select,
+ We can't find table field in table list of current select,
consequently we have to find it in outer subselect(s).
- We can't join lists of outer & current select, because of scope
- of view rules. For example if both tables (outer & current) have
- field 'field' it is not mistake to refer to this field without
+ We can't join lists of outer & current select, because of scope
+ of view rules. For example if both tables (outer & current) have
+ field 'field' it is not mistake to refer to this field without
mention of table name, but if we join tables in one list it will
cause error ER_NON_UNIQ_ERROR in find_item_in_list.
*/
SELECT_LEX *last=0;
- for (SELECT_LEX *sl= thd->lex.select->outer_select();
- sl;
- sl= sl->outer_select())
+ for ( ; sl ; sl= sl->outer_select())
if((ref= find_item_in_list(this, (last= sl)->item_list,
REPORT_EXCEPT_NOT_FOUND)) !=
(Item **)not_found_item)
@@ -852,13 +851,14 @@ bool Item_ref::fix_fields(THD *thd,TABLE_LIST *tables, Item **reference)
{
// Call to report error
find_item_in_list(this, thd->lex.select->item_list, REPORT_ALL_ERRORS);
+ ref=0;
return 1;
}
else
{
depended_from= last;
/*
- Mark all selects from resolved to 1 before select where was
+ Mark all selects from resolved to 1 before select where was
found table as depended (of select where was found table)
*/
for (SELECT_LEX *s= thd->lex.select;
@@ -867,9 +867,9 @@ bool Item_ref::fix_fields(THD *thd,TABLE_LIST *tables, Item **reference)
if( !s->depended )
{
// Select is depended of outer select
- s->depended= s->master_unit()->depended= 1;
+ s->depended= s->master_unit()->depended= 1;
//Tables will be reopened many times
- for (TABLE_LIST *tbl=
+ for (TABLE_LIST *tbl=
(TABLE_LIST*)s->table_list.first;
tbl;
tbl= tbl->next)