Loading sql/sql_base.cc +1 −2 Original line number Diff line number Diff line Loading @@ -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; Loading sql/sql_lex.cc +25 −9 Original line number Diff line number Diff line Loading @@ -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++) Loading Loading @@ -1911,6 +1902,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() Loading sql/sql_lex.h +3 −4 Original line number Diff line number Diff line Loading @@ -736,9 +736,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; Loading Loading @@ -803,6 +802,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(); Loading @@ -811,7 +811,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) Loading sql/sql_parse.cc +0 −13 Original line number Diff line number Diff line Loading @@ -2123,19 +2123,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. Loading sql/sql_yacc.yy +5 −3 Original line number Diff line number Diff line Loading @@ -4269,7 +4269,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 Loading Loading @@ -7307,8 +7308,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 { Loading Loading
sql/sql_base.cc +1 −2 Original line number Diff line number Diff line Loading @@ -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; Loading
sql/sql_lex.cc +25 −9 Original line number Diff line number Diff line Loading @@ -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++) Loading Loading @@ -1911,6 +1902,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() Loading
sql/sql_lex.h +3 −4 Original line number Diff line number Diff line Loading @@ -736,9 +736,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; Loading Loading @@ -803,6 +802,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(); Loading @@ -811,7 +811,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) Loading
sql/sql_parse.cc +0 −13 Original line number Diff line number Diff line Loading @@ -2123,19 +2123,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. Loading
sql/sql_yacc.yy +5 −3 Original line number Diff line number Diff line Loading @@ -4269,7 +4269,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 Loading Loading @@ -7307,8 +7308,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 { Loading