diff options
author | unknown <bell@sanja.is.com.ua> | 2002-10-03 16:37:41 +0300 |
---|---|---|
committer | unknown <bell@sanja.is.com.ua> | 2002-10-03 16:37:41 +0300 |
commit | 0db66a4e33357d40a63974f009bf77a9af6ed45d (patch) | |
tree | 2edafd13df0075993417dd49328f1f489d8a3f31 /sql | |
parent | 52366a9a0e5b3a951f4a3a4b8a9541c4a6ec8ad9 (diff) | |
parent | 02ab6420432c5fdaeba3a4a6234678cd6ac1dfa3 (diff) | |
download | mariadb-git-0db66a4e33357d40a63974f009bf77a9af6ed45d.tar.gz |
Merge sanja.is.com.ua:/home/bell/mysql/mysql-4.1
into sanja.is.com.ua:/home/bell/mysql/work-merge_lex-4.1
Diffstat (limited to 'sql')
-rw-r--r-- | sql/item.cc | 21 | ||||
-rw-r--r-- | sql/mysql_priv.h | 5 | ||||
-rw-r--r-- | sql/sql_base.cc | 23 | ||||
-rw-r--r-- | sql/sql_lex.cc | 10 | ||||
-rw-r--r-- | sql/sql_parse.cc | 2 | ||||
-rw-r--r-- | sql/sql_select.cc | 11 | ||||
-rw-r--r-- | sql/sql_yacc.yy | 9 |
7 files changed, 47 insertions, 34 deletions
diff --git a/sql/item.cc b/sql/item.cc index 946c0f24fe1..47c2926bef4 100644 --- a/sql/item.cc +++ b/sql/item.cc @@ -432,7 +432,7 @@ bool Item_field::fix_fields(THD *thd, TABLE_LIST *tables, Item **ref) if (!field) // If field is not checked { Field *tmp; - if (!(tmp=find_field_in_tables(thd,this,tables))) + if (!(tmp=find_field_in_tables(thd, this, tables, 0))) { /* We can't find table field in table list of current select, @@ -448,9 +448,14 @@ bool Item_field::fix_fields(THD *thd, TABLE_LIST *tables, Item **ref) sl && !tmp; sl= sl->outer_select()) tmp=find_field_in_tables(thd, this, - (TABLE_LIST*)(last= sl)->table_list.first); + (TABLE_LIST*)(last= sl)->table_list.first, + 0); if (!tmp) - return 1; + { + // Call to produce appropriate error message + find_field_in_tables(thd, this, tables, 1); + return -1; + } else { depended_from= last; @@ -463,7 +468,7 @@ bool Item_field::fix_fields(THD *thd, TABLE_LIST *tables, Item **ref) s= s->outer_select()) if( !s->depended ) { - s->depended= 1; //Select is depended of outer select + s->depended= 1; //Tables will be reopened many times for (TABLE_LIST *tbl= (TABLE_LIST*)s->table_list.first; @@ -780,7 +785,7 @@ bool Item_ref::fix_fields(THD *thd,TABLE_LIST *tables, Item **reference) { if (!ref) { - if (!(ref= find_item_in_list(this,thd->lex.select->item_list))) + if (!(ref= find_item_in_list(this, thd->lex.select->item_list, 0))) { /* We can't find table field in table list of current select, @@ -795,9 +800,13 @@ bool Item_ref::fix_fields(THD *thd,TABLE_LIST *tables, Item **reference) for (SELECT_LEX *sl= thd->lex.select->outer_select(); sl && !ref; sl= sl->outer_select()) - ref= find_item_in_list(this, (last= sl)->item_list); + ref= find_item_in_list(this, (last= sl)->item_list, 0); if (!ref) + { + // Call to report error + find_item_in_list(this, thd->lex.select->item_list, 1); return 1; + } else { depended_from= last; diff --git a/sql/mysql_priv.h b/sql/mysql_priv.h index 4532646b1c2..60505ec0712 100644 --- a/sql/mysql_priv.h +++ b/sql/mysql_priv.h @@ -450,7 +450,8 @@ bool wait_for_tables(THD *thd); bool table_is_used(TABLE *table, bool wait_for_name_lock); bool drop_locked_tables(THD *thd,const char *db, const char *table_name); void abort_locked_tables(THD *thd,const char *db, const char *table_name); -Field *find_field_in_tables(THD *thd,Item_field *item,TABLE_LIST *tables); +Field *find_field_in_tables(THD *thd, Item_field *item, TABLE_LIST *tables, + bool report_error); Field *find_field_in_table(THD *thd,TABLE *table,const char *name,uint length, bool check_grant,bool allow_rowid); #ifdef HAVE_OPENSSL @@ -538,7 +539,7 @@ TABLE *unlink_open_table(THD *thd,TABLE *list,TABLE *find); SQL_SELECT *make_select(TABLE *head, table_map const_tables, table_map read_tables, COND *conds, int *error); -Item ** find_item_in_list(Item *item,List<Item> &items); +Item ** find_item_in_list(Item *item, List<Item> &items, bool report_error); bool insert_fields(THD *thd,TABLE_LIST *tables, const char *db_name, const char *table_name, List_iterator<Item> *it); diff --git a/sql/sql_base.cc b/sql/sql_base.cc index 5d3421f5538..59c57006947 100644 --- a/sql/sql_base.cc +++ b/sql/sql_base.cc @@ -1783,7 +1783,8 @@ Field *find_field_in_table(THD *thd,TABLE *table,const char *name,uint length, Field * -find_field_in_tables(THD *thd,Item_field *item,TABLE_LIST *tables) +find_field_in_tables(THD *thd,Item_field *item,TABLE_LIST *tables, + bool report_error) { Field *found=0; const char *db=item->db_name; @@ -1820,7 +1821,7 @@ find_field_in_tables(THD *thd,Item_field *item,TABLE_LIST *tables) } if (found) return found; - if (!found_table) + if (!found_table && report_error) { char buff[NAME_LEN*2+1]; if (db) @@ -1832,8 +1833,9 @@ find_field_in_tables(THD *thd,Item_field *item,TABLE_LIST *tables) thd->where); } else - my_printf_error(ER_BAD_FIELD_ERROR,ER(ER_BAD_FIELD_ERROR),MYF(0), - item->full_name(),thd->where); + if (report_error) + my_printf_error(ER_BAD_FIELD_ERROR,ER(ER_BAD_FIELD_ERROR),MYF(0), + item->full_name(),thd->where); return (Field*) 0; } bool allow_rowid= tables && !tables->next; // Only one table @@ -1848,7 +1850,7 @@ find_field_in_tables(THD *thd,Item_field *item,TABLE_LIST *tables) return (Field*) 0; if (found) { - if (!thd->where) // Returns first found + if (!report_error) // Returns first found break; my_printf_error(ER_NON_UNIQ_ERROR,ER(ER_NON_UNIQ_ERROR),MYF(0), name,thd->where); @@ -1859,13 +1861,14 @@ find_field_in_tables(THD *thd,Item_field *item,TABLE_LIST *tables) } if (found) return found; - my_printf_error(ER_BAD_FIELD_ERROR,ER(ER_BAD_FIELD_ERROR), - MYF(0),item->full_name(),thd->where); + if (report_error) + my_printf_error(ER_BAD_FIELD_ERROR, ER(ER_BAD_FIELD_ERROR), + MYF(0), item->full_name(), thd->where); return (Field*) 0; } Item ** -find_item_in_list(Item *find,List<Item> &items) +find_item_in_list(Item *find, List<Item> &items, bool report_error) { List_iterator<Item> li(items); Item **found=0,*item; @@ -1890,7 +1893,7 @@ find_item_in_list(Item *find,List<Item> &items) { if ((*found)->eq(item,0)) continue; // Same field twice (Access?) - if (current_thd->where) + if (report_error) my_printf_error(ER_NON_UNIQ_ERROR,ER(ER_NON_UNIQ_ERROR),MYF(0), find->full_name(), current_thd->where); return (Item**) 0; @@ -1913,7 +1916,7 @@ find_item_in_list(Item *find,List<Item> &items) break; } } - if (!found && current_thd->where) + if (!found && report_error) my_printf_error(ER_BAD_FIELD_ERROR,ER(ER_BAD_FIELD_ERROR),MYF(0), find->full_name(),current_thd->where); return found; diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc index 1af8d363fda..60ab3344b3f 100644 --- a/sql/sql_lex.cc +++ b/sql/sql_lex.cc @@ -142,11 +142,11 @@ LEX *lex_start(THD *thd, uchar *buf,uint length) lex->next_state=STATE_START; lex->end_of_query=(lex->ptr=buf)+length; lex->yylineno = 1; - lex->select->create_refs=lex->in_comment=0; + lex->select_lex.create_refs=lex->in_comment=0; lex->length=0; - lex->select->in_sum_expr=0; - lex->select->expr_list.empty(); - lex->select->ftfunc_list.empty(); + lex->select_lex.in_sum_expr=0; + lex->select_lex.expr_list.empty(); + lex->select_lex.ftfunc_list.empty(); lex->convert_set=(lex->thd=thd)->variables.convert_set; lex->yacc_yyss=lex->yacc_yyvs=0; lex->ignore_space=test(thd->sql_mode & MODE_IGNORE_SPACE); @@ -158,7 +158,7 @@ LEX *lex_start(THD *thd, uchar *buf,uint length) void lex_end(LEX *lex) { - lex->select->expr_list.delete_elements(); // If error when parsing sql-varargs + lex->select_lex.expr_list.delete_elements(); // If error when parsing sql-varargs x_free(lex->yacc_yyss); x_free(lex->yacc_yyvs); } diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 461276900a5..580a6796911 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -1265,7 +1265,7 @@ mysql_execute_command(THD *thd) int res= 0; LEX *lex= &thd->lex; TABLE_LIST *tables= (TABLE_LIST*) lex->select_lex.table_list.first; - SELECT_LEX *select_lex= lex->select; + SELECT_LEX *select_lex= &lex->select_lex; SELECT_LEX_UNIT *unit= &lex->unit; DBUG_ENTER("mysql_execute_command"); diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 2b737ab65d7..68871d7ace1 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -6498,9 +6498,7 @@ find_order_in_list(THD *thd,TABLE_LIST *tables,ORDER *order,List<Item> &fields, return 0; } const char *save_where=thd->where; - thd->where=0; // No error if not found - Item **item=find_item_in_list(*order->item,fields); - thd->where=save_where; + Item **item=find_item_in_list(*order->item, fields, 0); if (item) { order->item=item; // use it @@ -6598,17 +6596,15 @@ setup_new_fields(THD *thd,TABLE_LIST *tables,List<Item> &fields, DBUG_ENTER("setup_new_fields"); thd->set_query_id=1; // Not really needed, but... - thd->where=0; // Don't give error for (; new_field ; new_field=new_field->next) { - if ((item=find_item_in_list(*new_field->item,fields))) + if ((item= find_item_in_list(*new_field->item, fields, 0))) new_field->item=item; /* Change to shared Item */ else { thd->where="procedure list"; if ((*new_field->item)->fix_fields(thd, tables, new_field->item)) DBUG_RETURN(1); /* purecov: inspected */ - thd->where=0; all_fields.push_front(*new_field->item); new_field->item=all_fields.head_ref(); } @@ -7400,7 +7396,8 @@ static void describe_info(JOIN *join, const char *info) { THD *thd= join->thd; - if (thd->lex.select->next_select()) /* If in UNION */ + /* If lex.select belong to UNION */ + if (thd->lex.select->master_unit()->first_select()->next_select()) { select_describe(join,FALSE,FALSE,FALSE,info); return; diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index cc06344304f..f61f970f479 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -2436,7 +2436,8 @@ order_clause: net_printf(lex->thd, ER_WRONG_USAGE, "UPDATE", "ORDER BY"); YYABORT; } - if (lex->select->olap != UNSPECIFIED_OLAP_TYPE) + if (lex->select->linkage != GLOBAL_OPTIONS_TYPE && + lex->select->olap != UNSPECIFIED_OLAP_TYPE) { net_printf(lex->thd, ER_WRONG_USAGE, "CUBE/ROLLUP", @@ -2462,7 +2463,8 @@ limit_clause: | LIMIT ULONG_NUM { LEX *lex=Lex; - if (lex->select->olap != UNSPECIFIED_OLAP_TYPE) + if (lex->select->linkage != GLOBAL_OPTIONS_TYPE && + lex->select->olap != UNSPECIFIED_OLAP_TYPE) { net_printf(lex->thd, ER_WRONG_USAGE, "CUBE/ROLLUP", "LIMIT"); @@ -2475,7 +2477,8 @@ limit_clause: | LIMIT ULONG_NUM ',' ULONG_NUM { LEX *lex=Lex; - if (lex->select->olap != UNSPECIFIED_OLAP_TYPE) + if (lex->select->linkage != GLOBAL_OPTIONS_TYPE && + lex->select->olap != UNSPECIFIED_OLAP_TYPE) { net_printf(lex->thd, ER_WRONG_USAGE, "CUBE/ROLLUP", "LIMIT"); |