diff options
-rw-r--r-- | sql/sql_base.cc | 3 | ||||
-rw-r--r-- | sql/sql_lex.cc | 34 | ||||
-rw-r--r-- | sql/sql_lex.h | 7 | ||||
-rw-r--r-- | sql/sql_parse.cc | 13 | ||||
-rw-r--r-- | sql/sql_yacc.yy | 8 | ||||
-rw-r--r-- | sql/tztime.cc | 6 | ||||
-rw-r--r-- | sql/tztime.h | 1 |
7 files changed, 41 insertions, 31 deletions
diff --git a/sql/sql_base.cc b/sql/sql_base.cc index b4a2f368bc2..6d2aa3a6fba 100644 --- a/sql/sql_base.cc +++ b/sql/sql_base.cc @@ -1864,8 +1864,7 @@ bool open_and_lock_tables(THD *thd, TABLE_LIST *tables) static void relink_tables_for_multidelete(THD *thd) { - if (thd->lex->all_selects_list->next_select_in_list() || - thd->lex->time_zone_tables_used) + if (thd->lex->all_selects_list->next_select_in_list()) { for (SELECT_LEX *sl= thd->lex->all_selects_list; sl; diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc index 12e4d912f15..8f5114b290a 100644 --- a/sql/sql_lex.cc +++ b/sql/sql_lex.cc @@ -30,15 +30,6 @@ */ sys_var_long_ptr trg_new_row_fake_var(0, 0); -/* - Fake table list object, pointer to which is used as special value for - st_lex::time_zone_tables_used indicating that we implicitly use time - zone tables in this statement but real table list was not yet created. - Pointer to it is also returned by my_tz_get_tables_list() as indication - of transient error; -*/ -TABLE_LIST fake_time_zone_tables_list; - /* Macros to look like lex */ #define yyGet() *(lex->ptr++) @@ -1881,6 +1872,31 @@ void st_lex::first_lists_tables_same() /* + Add implicitly used time zone description tables to global table list + (if needed). + + SYNOPSYS + st_lex::add_time_zone_tables_to_query_tables() + thd - pointer to current thread context + + RETURN VALUE + TRUE - error + FALSE - success +*/ + +bool st_lex::add_time_zone_tables_to_query_tables(THD *thd) +{ + /* We should not add these tables twice */ + if (!time_zone_tables_used) + { + time_zone_tables_used= my_tz_get_table_list(thd, &query_tables_last); + if (time_zone_tables_used == &fake_time_zone_tables_list) + return TRUE; + } + return FALSE; +} + +/* Link table back that was unlinked with unlink_first_table() SYNOPSIS diff --git a/sql/sql_lex.h b/sql/sql_lex.h index 1c0e3e2e02e..e0e9d2503fe 100644 --- a/sql/sql_lex.h +++ b/sql/sql_lex.h @@ -735,9 +735,8 @@ typedef struct st_lex /* Names of user variables holding parameters (in EXECUTE) */ List<LEX_STRING> prepared_stmt_params; /* - If points to fake_time_zone_tables_list indicates that time zone - tables are implicitly used by statement, also is used for holding - list of those tables after they are opened. + Points to part of global table list which contains time zone tables + implicitly used by the statement. */ TABLE_LIST *time_zone_tables_used; sp_head *sphead; @@ -802,6 +801,7 @@ typedef struct st_lex *(table->prev_global= query_tables_last)= table; query_tables_last= &table->next_global; } + bool add_time_zone_tables_to_query_tables(THD *thd); bool can_be_merged(); bool can_use_merged(); @@ -810,7 +810,6 @@ typedef struct st_lex bool need_correct_ident(); } LEX; -extern TABLE_LIST fake_time_zone_tables_list; struct st_lex_local: public st_lex { static void *operator new(size_t size) diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 3d4252a2b17..3094bd76b4e 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -2114,19 +2114,6 @@ mysql_execute_command(THD *thd) } #endif /* !HAVE_REPLICATION */ - if (lex->time_zone_tables_used) - { - TABLE_LIST *tmp; - if ((tmp= my_tz_get_table_list(thd, &lex->query_tables_last)) == - &fake_time_zone_tables_list) - { - DBUG_RETURN(-1); - } - lex->time_zone_tables_used= tmp; - if (!all_tables) - all_tables= tmp; - } - /* When option readonly is set deny operations which change tables. Except for the replication thread and the 'super' users. diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 3511777dd27..673f340722b 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -4266,7 +4266,8 @@ simple_expr: { $$= create_func_contains($3, $5); } | CONVERT_TZ_SYM '(' expr ',' expr ',' expr ')' { - Lex->time_zone_tables_used= &fake_time_zone_tables_list; + if (Lex->add_time_zone_tables_to_query_tables(YYTHD)) + YYABORT; $$= new Item_func_convert_tz($3, $5, $7); } | CURDATE optional_braces @@ -7276,8 +7277,9 @@ internal_variable_name: If this is time_zone variable we should open time zone describing tables */ - if (tmp == &sys_time_zone) - Lex->time_zone_tables_used= &fake_time_zone_tables_list; + if (tmp == &sys_time_zone && + lex->add_time_zone_tables_to_query_tables(YYTHD)) + YYABORT; } else { diff --git a/sql/tztime.cc b/sql/tztime.cc index 50c496577e0..2c25c647a19 100644 --- a/sql/tztime.cc +++ b/sql/tztime.cc @@ -1440,6 +1440,12 @@ tz_init_table_list(TABLE_LIST *tz_tabs, TABLE_LIST ***global_next_ptr) /* + Fake table list object, pointer to which is returned by + my_tz_get_tables_list() as indication of error. +*/ +TABLE_LIST fake_time_zone_tables_list; + +/* Create table list with time zone related tables and add it to the end of global table list. diff --git a/sql/tztime.h b/sql/tztime.h index 6d2388bb160..07e9146c6e9 100644 --- a/sql/tztime.h +++ b/sql/tztime.h @@ -64,6 +64,7 @@ extern Time_zone * my_tz_find(const String *name, TABLE_LIST *tz_tables); extern my_bool my_tz_init(THD *org_thd, const char *default_tzname, my_bool bootstrap); extern void my_tz_free(); +extern TABLE_LIST fake_time_zone_tables_list; /* Check if we have pointer to the beggining of list of implictly used |