diff options
Diffstat (limited to 'sql')
-rw-r--r-- | sql/item.cc | 47 | ||||
-rw-r--r-- | sql/item_sum.cc | 2 | ||||
-rw-r--r-- | sql/sql_delete.cc | 6 | ||||
-rw-r--r-- | sql/sql_derived.cc | 4 | ||||
-rw-r--r-- | sql/sql_lex.cc | 56 | ||||
-rw-r--r-- | sql/sql_lex.h | 6 | ||||
-rw-r--r-- | sql/sql_parse.cc | 4 | ||||
-rw-r--r-- | sql/sql_update.cc | 9 | ||||
-rw-r--r-- | sql/sql_yacc.yy | 81 |
9 files changed, 95 insertions, 120 deletions
diff --git a/sql/item.cc b/sql/item.cc index 6851a47d9db..037e57b2b8a 100644 --- a/sql/item.cc +++ b/sql/item.cc @@ -463,27 +463,7 @@ bool Item_field::fix_fields(THD *thd, TABLE_LIST *tables, Item **ref) Mark all selects from resolved to 1 before select where was found table as depended (of select where was found table) */ - for (SELECT_LEX_NODE *s= thd->lex.current_select; - s && s != last; - s= s->outer_select()) - { - if( !s->dependent) - { - // Select is depended of outer select - s->dependent= 1; - if (s->linkage != GLOBAL_OPTIONS_TYPE) - { - //s is st_select_lex* - - s->master_unit()->dependent= 1; - //Tables will be reopened many times - for (TABLE_LIST *tbl= s->get_table_list(); - tbl; - tbl= tbl->next) - tbl->shared= 1; - } - } - } + thd->lex.current_select->mark_as_dependent(last); } } else if (!tmp) @@ -867,30 +847,7 @@ bool Item_ref::fix_fields(THD *thd,TABLE_LIST *tables, Item **reference) else { depended_from= last; - /* - Mark all selects from resolved to 1 before select where was - found table as depended (of select where was found table) - */ - for (SELECT_LEX_NODE *s= thd->lex.current_select; - s &&s != last; - s= s->outer_select()) - if( !s->dependent ) - { - // Select is depended of outer select - s->dependent= 1; - if (s->linkage != GLOBAL_OPTIONS_TYPE) - { - //s is st_select_lex* - - s->master_unit()->dependent= 1; - //Tables will be reopened many times - for (TABLE_LIST *tbl= - s->get_table_list(); - tbl; - tbl= tbl->next) - tbl->shared= 1; - } - } + thd->lex.current_select->mark_as_dependent(last); } } else if (!ref) diff --git a/sql/item_sum.cc b/sql/item_sum.cc index 686365316e5..22b5e47fab5 100644 --- a/sql/item_sum.cc +++ b/sql/item_sum.cc @@ -943,7 +943,7 @@ bool Item_sum_count_distinct::fix_fields(THD *thd, TABLE_LIST *tables, bool Item_sum_count_distinct::setup(THD *thd) { List<Item> list; - SELECT_LEX *select_lex= (SELECT_LEX *)current_lex->current_select; + SELECT_LEX *select_lex= current_lex->current_select->select_lex(); if (select_lex->linkage == GLOBAL_OPTIONS_TYPE) return 1; diff --git a/sql/sql_delete.cc b/sql/sql_delete.cc index 0175fe44484..64945fa2d4d 100644 --- a/sql/sql_delete.cc +++ b/sql/sql_delete.cc @@ -285,11 +285,7 @@ multi_delete::initialize_tables(JOIN *join) table->file->ref_length, MEM_STRIP_BUF_SIZE); } - /* - There are (SELECT_LEX*) pointer conversion here global union parameters - can't be used in multidelete - */ - init_ftfuncs(thd, (SELECT_LEX*)thd->lex.current_select, 1); + init_ftfuncs(thd, thd->lex.current_select->select_lex(), 1); } diff --git a/sql/sql_derived.cc b/sql/sql_derived.cc index 9cc83a3835a..1335618b90d 100644 --- a/sql/sql_derived.cc +++ b/sql/sql_derived.cc @@ -57,8 +57,8 @@ int mysql_derived(THD *thd, LEX *lex, SELECT_LEX_UNIT *unit, TABLE_LIST *t, { if (cursor->derived) { - res=mysql_derived(thd, lex, (SELECT_LEX_UNIT *)cursor->derived, - cursor, 0); + res= mysql_derived(thd, lex, (SELECT_LEX_UNIT *)cursor->derived, + cursor, 0); if (res) DBUG_RETURN(res); } } diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc index 97cf936240f..b5dd5218e7d 100644 --- a/sql/sql_lex.cc +++ b/sql/sql_lex.cc @@ -21,6 +21,7 @@ #include "item_create.h" #include <m_ctype.h> #include <hash.h> +#include <assert.h> LEX_STRING tmp_table_alias= {(char*) "tmp-table",8}; @@ -1043,17 +1044,23 @@ void st_select_lex_node::exclude() */ } +st_select_lex* st_select_lex_node::select_lex() +{ + DBUG_ENTER("st_select_lex_node::select_lex (never should be called)"); + DBUG_ASSERT(1); + DBUG_RETURN(0); +} + bool st_select_lex_node::add_item_to_list(Item *item) { return 1; } -bool st_select_lex_node::add_group_to_list(Item *item, bool asc) +bool st_select_lex_node::add_group_to_list(Item *item, bool asc) { return 1; } -//why compiler/linker do not allow make it inline? bool st_select_lex_node::add_order_to_list(Item *item, bool asc) { return add_to_list(order_list,item,asc); @@ -1064,6 +1071,47 @@ bool st_select_lex_node::add_ftfunc_to_list(Item_func_match *func) return 1; } +/* + st_select_lex_node::mark_as_dependent mark all st_select_lex struct from + this to 'last' as dependent + + SYNOPSIS + last - pointer to last st_select_lex struct, before wich all + st_select_lex have to be marked as dependent + + NOTE + 'last' should be reachable from this st_select_lex_node + +*/ + +void st_select_lex_node::mark_as_dependent(SELECT_LEX *last) +{ + /* + Mark all selects from resolved to 1 before select where was + found table as depended (of select where was found table) + */ + for (SELECT_LEX_NODE *s= this; + s &&s != last; + s= s->outer_select()) + if( !s->dependent ) + { + // Select is dependent of outer select + s->dependent= 1; + if (s->linkage != GLOBAL_OPTIONS_TYPE) + { + //s is st_select_lex* + + s->master_unit()->dependent= 1; + //Tables will be reopened many times + for (TABLE_LIST *tbl= + s->get_table_list(); + tbl; + tbl= tbl->next) + tbl->shared= 1; + } + } +} + bool st_select_lex_node::set_braces(bool value) { return 1; } bool st_select_lex_node::inc_in_sum_expr() { return 1; } uint st_select_lex_node::get_in_sum_expr() { return 0; } @@ -1168,6 +1216,10 @@ st_select_lex* st_select_lex_unit::outer_select() return (st_select_lex*) master; } +st_select_lex* st_select_lex::select_lex() +{ + return this; +} bool st_select_lex::add_item_to_list(Item *item) { diff --git a/sql/sql_lex.h b/sql/sql_lex.h index e005211e4a9..b40cbf08877 100644 --- a/sql/sql_lex.h +++ b/sql/sql_lex.h @@ -217,6 +217,7 @@ public: void include_global(st_select_lex_node **plink); void exclude(); + virtual st_select_lex* select_lex(); virtual bool add_item_to_list(Item *item); bool add_order_to_list(Item *item, bool asc); virtual bool add_group_to_list(Item *item, bool asc); @@ -238,7 +239,8 @@ public: thr_lock_type flags= TL_UNLOCK, List<String> *use_index= 0, List<String> *ignore_index= 0); - + + void mark_as_dependent(st_select_lex *last); private: void fast_exclude(); }; @@ -346,6 +348,8 @@ public: bool set_braces(bool value); bool inc_in_sum_expr(); uint get_in_sum_expr(); + + st_select_lex* select_lex(); bool add_item_to_list(Item *item); bool add_group_to_list(Item *item, bool asc); bool add_ftfunc_to_list(Item_func_match *func); diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 08ef197591e..10b05a0550d 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -2927,7 +2927,7 @@ mysql_init_query(THD *thd) void mysql_init_select(LEX *lex) { - SELECT_LEX *select_lex= (SELECT_LEX *)lex->current_select; + SELECT_LEX *select_lex= lex->current_select->select_lex(); DBUG_ASSERT(select_lex->linkage != GLOBAL_OPTIONS_TYPE); select_lex->init_select(); select_lex->master_unit()->select_limit= select_lex->select_limit= @@ -2964,7 +2964,7 @@ mysql_new_select(LEX *lex, bool move_down) select_lex->master_unit()->global_parameters= select_lex; DBUG_ASSERT(lex->current_select->linkage != GLOBAL_OPTIONS_TYPE); - select_lex->include_global(((SELECT_LEX*)lex->current_select)-> + select_lex->include_global(lex->current_select->select_lex()-> next_select_in_list_addr()); lex->current_select= select_lex; return 0; diff --git a/sql/sql_update.cc b/sql/sql_update.cc index b00a8ba851c..be69935a49c 100644 --- a/sql/sql_update.cc +++ b/sql/sql_update.cc @@ -508,14 +508,7 @@ multi_update::prepare(List<Item> &values, SELECT_LEX_UNIT *u) counter++; } } - /* - - There are (SELECT_LEX*) pointer conversion here global union parameters - can't be used in multiupdate - - TODO: check is thd->lex.current_select == &thd->lex.select_lex? - */ - init_ftfuncs(thd, (SELECT_LEX*)thd->lex.current_select, 1); + init_ftfuncs(thd, thd->lex.current_select->select_lex(), 1); error = 0; // Timestamps do not need to be restored, so far ... DBUG_RETURN(0); } diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 7d45afd5f94..3de8eaa33fe 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -2215,11 +2215,7 @@ in_sum_expr: } expr { - /* - There are (SELECT_LEX *) pointer conversionis here, because - global union parameters checked in 'increment' above - */ - ((SELECT_LEX *)Select)->in_sum_expr--; + Select->select_lex()->in_sum_expr--; $$=$2; }; @@ -2296,12 +2292,7 @@ join_table_list: { add_join_on($4,$6); $$=$4; } | join_table_list INNER_SYM JOIN_SYM join_table_list { - /* - There are (SELECT_LEX *) pointer conversionis here and - following joins, because it is impossible FROM clause in - global union parameters - */ - SELECT_LEX *sel= (SELECT_LEX *)Select; + SELECT_LEX *sel= Select->select_lex(); sel->db1=$1->db; sel->table1=$1->alias; sel->db2=$4->db; sel->table2=$4->alias; } @@ -2311,7 +2302,7 @@ join_table_list: { add_join_on($5,$7); $5->outer_join|=JOIN_TYPE_LEFT; $$=$5; } | join_table_list LEFT opt_outer JOIN_SYM join_table_list { - SELECT_LEX *sel= (SELECT_LEX *)Select; + SELECT_LEX *sel= Select->select_lex(); sel->db1=$1->db; sel->table1=$1->alias; sel->db2=$5->db; sel->table2=$5->alias; } @@ -2323,7 +2314,7 @@ join_table_list: { add_join_on($1,$7); $1->outer_join|=JOIN_TYPE_RIGHT; $$=$1; } | join_table_list RIGHT opt_outer JOIN_SYM join_table_list { - SELECT_LEX *sel= (SELECT_LEX *)Select; + SELECT_LEX *sel= Select->select_lex(); sel->db1=$1->db; sel->table1=$1->alias; sel->db2=$5->db; sel->table2=$5->alias; } @@ -2341,7 +2332,7 @@ normal_join: join_table: { - SELECT_LEX *sel= (SELECT_LEX *)Select; + SELECT_LEX *sel= Select->select_lex(); sel->use_index_ptr=sel->ignore_index_ptr=0; } table_ident opt_table_alias opt_key_definition @@ -2388,45 +2379,40 @@ opt_key_definition: /* empty */ {} | USE_SYM key_usage_list { - /* - There are (SELECT_LEX *) pointer conversionis here and - following key definitions, because - key definitions is impossible in union global parameters - */ - SELECT_LEX *sel= (SELECT_LEX*)Select; + SELECT_LEX *sel= Select->select_lex(); sel->use_index= *$2; sel->use_index_ptr= &sel->use_index; } | IGNORE_SYM key_usage_list { - SELECT_LEX *sel= (SELECT_LEX*)Select; + SELECT_LEX *sel= Select->select_lex(); sel->ignore_index= *$2; sel->ignore_index_ptr= &sel->ignore_index; }; key_usage_list: - key_or_index { ((SELECT_LEX *)Select)->interval_list.empty(); } + key_or_index { Select->select_lex()->interval_list.empty(); } '(' key_usage_list2 ')' - { $$= &((SELECT_LEX *)Select)->interval_list; }; + { $$= &Select->select_lex()->interval_list; }; key_usage_list2: key_usage_list2 ',' ident - { ((SELECT_LEX *)Select)-> + { Select->select_lex()-> interval_list.push_back(new String((const char*) $3.str, $3.length, default_charset_info)); } | ident - { ((SELECT_LEX *)Select)-> + { Select->select_lex()-> interval_list.push_back(new String((const char*) $1.str, $1.length, default_charset_info)); } | PRIMARY_SYM - { ((SELECT_LEX *)Select)-> + { Select->select_lex()-> interval_list.push_back(new String("PRIMARY", 7, default_charset_info)); }; using_list: ident { - SELECT_LEX *sel= (SELECT_LEX *)Select; + SELECT_LEX *sel= Select->select_lex(); if (!($$= new Item_func_eq(new Item_field(sel->db1, sel->table1, $1.str), new Item_field(sel->db2, sel->table2, @@ -2435,7 +2421,7 @@ using_list: } | using_list ',' ident { - SELECT_LEX *sel= (SELECT_LEX *)Select; + SELECT_LEX *sel= Select->select_lex(); if (!($$= new Item_cond_and(new Item_func_eq(new Item_field(sel->db1,sel->table1,$3.str), new Item_field(sel->db2,sel->table2,$3.str)), $1))) YYABORT; }; @@ -2467,22 +2453,14 @@ opt_table_alias: where_clause: - /* - There are (SELECT_LEX *) pointer conversionis here, because - it is impossible where_clause in global union parameters - */ - /* empty */ { ((SELECT_LEX *)Select)->where= 0; } - | WHERE expr { ((SELECT_LEX *)Select)->where= $2; }; + /* empty */ { Select->select_lex()->where= 0; } + | WHERE expr { Select->select_lex()->where= $2; }; having_clause: - /* - There are (SELECT_LEX *) pointer conversionis here, because - it is impossible having_clause in global union parameters - */ /* empty */ - | HAVING { ((SELECT_LEX *)Select)->create_refs= 1; } expr + | HAVING { Select->select_lex()->create_refs= 1; } expr { - SELECT_LEX *sel= (SELECT_LEX*)Select; + SELECT_LEX *sel= Select->select_lex(); sel->having= $3; sel->create_refs=0; }; @@ -2517,7 +2495,7 @@ olap_opt: "global union parameters"); YYABORT; } - ((SELECT_LEX *)lex->current_select)->olap= CUBE_TYPE; + lex->current_select->select_lex()->olap= CUBE_TYPE; net_printf(lex->thd, ER_NOT_SUPPORTED_YET, "CUBE"); YYABORT; /* To be deleted in 4.1 */ } @@ -2531,7 +2509,7 @@ olap_opt: "global union parameters"); YYABORT; } - ((SELECT_LEX *)lex->current_select)->olap= ROLLUP_TYPE; + lex->current_select->select_lex()->olap= ROLLUP_TYPE; net_printf(lex->thd, ER_NOT_SUPPORTED_YET, "ROLLUP"); YYABORT; /* To be deleted in 4.1 */ } @@ -2555,7 +2533,7 @@ order_clause: YYABORT; } if (lex->current_select->linkage != GLOBAL_OPTIONS_TYPE && - ((SELECT_LEX*)lex->current_select)->olap != + lex->current_select->select_lex()->olap != UNSPECIFIED_OLAP_TYPE) { net_printf(lex->thd, ER_WRONG_USAGE, @@ -2583,7 +2561,7 @@ limit_clause: { LEX *lex= Lex; if (lex->current_select->linkage != GLOBAL_OPTIONS_TYPE && - ((SELECT_LEX*)lex->current_select)->olap != + lex->current_select->select_lex()->olap != UNSPECIFIED_OLAP_TYPE) { net_printf(lex->thd, ER_WRONG_USAGE, "CUBE/ROLLUP", @@ -2598,7 +2576,7 @@ limit_clause: { LEX *lex=Lex; if (lex->current_select->linkage != GLOBAL_OPTIONS_TYPE && - ((SELECT_LEX*)lex->current_select)->olap != + lex->current_select->select_lex()->olap != UNSPECIFIED_OLAP_TYPE) { net_printf(lex->thd, ER_WRONG_USAGE, "CUBE/ROLLUP", @@ -4005,12 +3983,7 @@ opt_table: '*' { LEX *lex= Lex; - /* - There are (SELECT_LEX *) pointer conversionis here and following - opt_table, because it is impossible GRANT clause in global - union parameters - */ - ((SELECT_LEX *)lex->current_select)->db= lex->thd->db; + lex->current_select->select_lex()->db= lex->thd->db; if (lex->grant == GLOBAL_ACLS) lex->grant = DB_ACLS & ~GRANT_ACL; else if (lex->columns.elements) @@ -4022,7 +3995,7 @@ opt_table: | ident '.' '*' { LEX *lex= Lex; - ((SELECT_LEX *)lex->current_select)->db = $1.str; + lex->current_select->select_lex()->db = $1.str; if (lex->grant == GLOBAL_ACLS) lex->grant = DB_ACLS & ~GRANT_ACL; else if (lex->columns.elements) @@ -4034,7 +4007,7 @@ opt_table: | '*' '.' '*' { LEX *lex= Lex; - ((SELECT_LEX *)lex->current_select)->db = NULL; + lex->current_select->select_lex()->db = NULL; if (lex->grant == GLOBAL_ACLS) lex->grant= GLOBAL_ACLS & ~GRANT_ACL; else if (lex->columns.elements) @@ -4227,7 +4200,7 @@ optional_order_or_limit: send_error(lex->thd, ER_SYNTAX_ERROR); YYABORT; } - SELECT_LEX *sel= (SELECT_LEX *)lex->current_select; + SELECT_LEX *sel= lex->current_select->select_lex(); sel->master_unit()->global_parameters= sel->master_unit(); lex->current_select= sel->master_unit(); |