diff options
-rw-r--r-- | sql/item_subselect.cc | 2 | ||||
-rw-r--r-- | sql/item_sum.cc | 2 | ||||
-rw-r--r-- | sql/sql_derived.cc | 2 | ||||
-rw-r--r-- | sql/sql_lex.cc | 13 | ||||
-rw-r--r-- | sql/sql_lex.h | 44 | ||||
-rw-r--r-- | sql/sql_parse.cc | 10 | ||||
-rw-r--r-- | sql/sql_select.cc | 8 | ||||
-rw-r--r-- | sql/sql_union.cc | 2 | ||||
-rw-r--r-- | sql/sql_yacc.yy | 18 |
9 files changed, 64 insertions, 37 deletions
diff --git a/sql/item_subselect.cc b/sql/item_subselect.cc index d71271b98fd..777e46ce6b0 100644 --- a/sql/item_subselect.cc +++ b/sql/item_subselect.cc @@ -108,7 +108,7 @@ bool Item_subselect::fix_fields(THD *thd,TABLE_LIST *tables) (ORDER*) select_lex->group_list.first, select_lex->having, (ORDER*) 0, select_lex, - (SELECT_LEX_UNIT*) select_lex->master)) + select_lex->master_unit())) return 1; thd->lex.select= save_select; return 0; diff --git a/sql/item_sum.cc b/sql/item_sum.cc index 698f80928bb..a1ffae2ed82 100644 --- a/sql/item_sum.cc +++ b/sql/item_sum.cc @@ -965,7 +965,7 @@ bool Item_sum_count_distinct::setup(THD *thd) if (!(table= create_tmp_table(thd, tmp_table_param, list, (ORDER*) 0, 1, 0, 0, select_lex->options | thd->options, - (SELECT_LEX_UNIT*) select_lex->master))) + select_lex->master_unit()))) return 1; table->file->extra(HA_EXTRA_NO_ROWS); // Don't update rows table->no_rows=1; diff --git a/sql/sql_derived.cc b/sql/sql_derived.cc index 41f166c6ad0..4a64c30e7e5 100644 --- a/sql/sql_derived.cc +++ b/sql/sql_derived.cc @@ -34,7 +34,7 @@ int mysql_derived(THD *thd, LEX *lex, SELECT_LEX_UNIT *unit, TABLE_LIST *t) TODO: make derived tables with union inside (now only 1 SELECT may be procesed) */ - SELECT_LEX *sl= (SELECT_LEX*)unit->slave; + SELECT_LEX *sl= unit->first_select(); List<Item> item_list; TABLE *table; int res; diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc index 496d21b333c..008ef44d83a 100644 --- a/sql/sql_lex.cc +++ b/sql/sql_lex.cc @@ -1021,18 +1021,19 @@ bool st_select_lex_unit::create_total_list_n_last_return(THD *thd, st_lex *lex, TABLE_LIST *slave_list_first=0, **slave_list_last= &slave_list_first; TABLE_LIST **new_table_list= *result, *aux; SELECT_LEX *sl= (SELECT_LEX*)slave; - for (; sl; sl= (SELECT_LEX*)sl->next) + for (; sl; sl= sl->next_select()) { // check usage of ORDER BY in union - if (sl->order_list.first && sl->next && !sl->braces) + if (sl->order_list.first && sl->next_select() && !sl->braces) { net_printf(&thd->net,ER_WRONG_USAGE,"UNION","ORDER BY"); return 1; } - if (sl->slave) - if (((SELECT_LEX_UNIT *) - sl->slave)->create_total_list_n_last_return(thd, lex, - &slave_list_last)) + for (SELECT_LEX_UNIT *inner= sl->first_inner_unit(); + inner; + inner= inner->next_unit()) + if (inner->create_total_list_n_last_return(thd, lex, + &slave_list_last)) return 1; if ((aux= (TABLE_LIST*) sl->table_list.first)) { diff --git a/sql/sql_lex.h b/sql/sql_lex.h index 22e682fef38..5c113e46a2b 100644 --- a/sql/sql_lex.h +++ b/sql/sql_lex.h @@ -186,11 +186,15 @@ enum sub_select_type {UNSPECIFIED_TYPE,UNION_TYPE, INTERSECT_TYPE, Base class for st_select_lex (SELECT_LEX) & st_select_lex_unit (SELECT_LEX_UNIT) */ -struct st_select_lex_node { - enum sub_select_type linkage; +class st_select_lex_node { +protected: st_select_lex_node *next, **prev, /* neighbor list */ *master, *slave, /* vertical links */ *link_next, **link_prev; /* list of whole SELECT_LEX */ +public: + ulong options; + enum sub_select_type linkage; + //uint sort_default; SQL_LIST order_list; /* ORDER clause */ ha_rows select_limit, offset_limit; /* LIMIT clause parameters */ void init_query(); @@ -207,9 +211,10 @@ private: SELECT_LEX_UNIT - unit of selects (UNION, INTERSECT, ...) group SELECT_LEXs */ -struct st_lex; -struct st_select_lex; -struct st_select_lex_unit: public st_select_lex_node { +class st_lex; +class st_select_lex; +class st_select_lex_unit: public st_select_lex_node { +public: /* Pointer to 'last' select or pointer to unit where stored global parameters for union @@ -219,8 +224,11 @@ struct st_select_lex_unit: public st_select_lex_node { ha_rows select_limit_cnt, offset_limit_cnt; void init_query(); bool create_total_list(THD *thd, st_lex *lex, TABLE_LIST **result); + st_select_lex* outer_select() { return (st_select_lex*) master; } st_select_lex* first_select() { return (st_select_lex*) slave; } st_select_lex_unit* next_unit() { return (st_select_lex_unit*) next; } + + friend void mysql_init_query(THD *thd); private: bool create_total_list_n_last_return(THD *thd, st_lex *lex, TABLE_LIST ***result); @@ -230,10 +238,10 @@ typedef struct st_select_lex_unit SELECT_LEX_UNIT; /* SELECT_LEX - store information of parsed SELECT_LEX statment */ -struct st_select_lex: public st_select_lex_node { +class st_select_lex: public st_select_lex_node { +public: char *db, *db1, *table1, *db2, *table2; /* For outer join using .. */ Item *where, *having; /* WHERE & HAVING clauses */ - ulong options; List<List_item> expr_list; List<List_item> when_list; /* WHEN clause */ SQL_LIST table_list, group_list; /* FROM & GROUP BY clauses */ @@ -241,14 +249,32 @@ struct st_select_lex: public st_select_lex_node { List<String> interval_list, use_index, *use_index_ptr, ignore_index, *ignore_index_ptr; List<Item_func_match> ftfunc_list; - uint in_sum_expr, sort_default; + uint in_sum_expr; bool create_refs, braces, /* SELECT ... UNION (SELECT ... ) <- this braces */ depended; /* depended from outer select subselect */ void init_query(); void init_select(); - st_select_lex* outer_select() { return (st_select_lex*) master->master; } + st_select_lex_unit* master_unit() { return (st_select_lex_unit*) master; } + st_select_lex_unit* first_inner_unit() + { + return (st_select_lex_unit*) slave; + } + st_select_lex* outer_select() + { + return (st_select_lex*) master_unit()->outer_select(); + } st_select_lex* next_select() { return (st_select_lex*) next; } + st_select_lex* next_select_in_list() + { + return (st_select_lex*) link_next; + } + st_select_lex_node** next_select_in_list_addr() + { + return &link_next; + } + + friend void mysql_init_query(THD *thd); }; typedef struct st_select_lex SELECT_LEX; diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 8abd7a15bd4..6affc0199a5 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -65,7 +65,7 @@ static void decrease_user_connections(UC *uc); static bool check_db_used(THD *thd,TABLE_LIST *tables); static bool check_merge_table_access(THD *thd, char *db, TABLE_LIST *tables); static bool check_dup(const char *db, const char *name, TABLE_LIST *tables); -static void mysql_init_query(THD *thd); +void mysql_init_query(THD *thd); static void remove_escape(char *name); static void refresh_status(void); static bool append_file_to_dir(THD *thd, char **filename_ptr, @@ -1246,7 +1246,7 @@ mysql_execute_command(void) cursor)) DBUG_VOID_RETURN; } - if ((lex->select_lex.link_next && + if ((lex->select_lex.next_select_in_list() && lex->unit.create_total_list(thd, lex, &tables)) || (table_rules_on && tables && thd->slave_thread && !tables_ok(thd,tables))) @@ -2664,7 +2664,7 @@ bool my_yyoverflow(short **yyss, YYSTYPE **yyvs, int *yystacksize) Initialize global thd variables needed for query ****************************************************************************/ -static void +void mysql_init_query(THD *thd) { DBUG_ENTER("mysql_init_query"); @@ -2720,8 +2720,8 @@ mysql_new_select(LEX *lex, bool move_down) else select_lex->include_neighbour(lex->select); - ((SELECT_LEX_UNIT*)select_lex->master)->global_parameters= select_lex; - select_lex->include_global(&lex->select->link_next); + select_lex->master_unit()->global_parameters= select_lex; + select_lex->include_global(lex->select->next_select_in_list_addr()); lex->select= select_lex; return 0; } diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 60b092652aa..4748e857276 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -156,12 +156,12 @@ int handle_select(THD *thd, LEX *lex, select_result *result) { int res; register SELECT_LEX *select_lex = &lex->select_lex; - if (select_lex->link_next) + if (select_lex->next_select_in_list()) { /* Fix tables 'to-be-unioned-from' list to point at opened tables */ for (SELECT_LEX *sl= select_lex; sl; - sl= (SELECT_LEX*)sl->link_next) + sl= sl->next_select_in_list()) { for (TABLE_LIST *cursor= (TABLE_LIST *)sl->table_list.first; cursor; @@ -169,7 +169,7 @@ int handle_select(THD *thd, LEX *lex, select_result *result) cursor->table= cursor->table_list->table; } } - if (select_lex->next) + if (select_lex->next_select()) res=mysql_union(thd,lex,result); else res=mysql_select(thd,(TABLE_LIST*) select_lex->table_list.first, @@ -7275,7 +7275,7 @@ static void select_describe(JOIN *join, bool need_tmp_table, bool need_order, result->send_error(0,NullS); } } - if (!join->thd->lex.select->next) + if (!join->thd->lex.select->next_select()) { save_lock=thd->lock; thd->lock=(MYSQL_LOCK *)0; diff --git a/sql/sql_union.cc b/sql/sql_union.cc index b5db593a234..585b5de11ab 100644 --- a/sql/sql_union.cc +++ b/sql/sql_union.cc @@ -104,7 +104,7 @@ int mysql_union(THD *thd, LEX *lex,select_result *result) } union_result->save_time_stamp=!describe; - for (sl= &lex->select_lex; sl; sl= (SELECT_LEX*) sl->next) + for (sl= &lex->select_lex; sl; sl= sl->next_select()) { lex->select=sl; unit->offset_limit_cnt= sl->offset_limit; diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index c5addfee15e..ebd26939ad5 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -1477,8 +1477,8 @@ select_init: SELECT_LEX * sel=Select; sel->braces=true; /* select in braces, can't contain global parameters */ - ((SELECT_LEX_UNIT*)sel->master)->global_parameters= - sel->master; + sel->master_unit()->global_parameters= + sel->master_unit(); } union_opt @@ -2186,8 +2186,8 @@ join_table: | '(' SELECT_SYM select_part3 ')' opt_table_alias { LEX *lex=Lex; - SELECT_LEX_UNIT *unit= (SELECT_LEX_UNIT*) lex->select->master; - lex->select= (SELECT_LEX*) unit->master; + SELECT_LEX_UNIT *unit= lex->select->master_unit(); + lex->select= unit->outer_select(); if (!($$= add_table_to_list(new Table_ident(unit), $5,0,TL_UNLOCK))) YYABORT; @@ -2325,7 +2325,7 @@ order_clause: LEX *lex=Lex; if (lex->sql_command == SQLCOM_MULTI_UPDATE) YYABORT; - lex->select->sort_default=1; + /*lex->select->sort_default=1;*/ } order_list order_list: @@ -3859,13 +3859,13 @@ optional_order_or_limit: LEX *lex=Lex; if (!lex->select->braces) YYABORT; - ((SELECT_LEX_UNIT*)lex->select->master)->global_parameters= - lex->select->master; + lex->select->master_unit()->global_parameters= + lex->select->master_unit(); /* Following type conversion looks like hack, but all that need SELECT_LEX fields always check linkage type. */ - lex->select= (SELECT_LEX*)lex->select->master; + lex->select= (SELECT_LEX*)lex->select->master_unit(); lex->select->select_limit=lex->thd->default_select_limit; } opt_order_clause limit_clause @@ -3898,5 +3898,5 @@ subselect_end: ')' { LEX *lex=Lex; - lex->select = (SELECT_LEX*)lex->select->master->master; + lex->select = lex->select->outer_select(); } |