diff options
-rw-r--r-- | mysql-test/r/cast.result | 3 | ||||
-rw-r--r-- | mysql-test/t/cast.test | 1 | ||||
-rw-r--r-- | sql/item_timefunc.h | 3 | ||||
-rw-r--r-- | sql/sql_union.cc | 8 |
4 files changed, 12 insertions, 3 deletions
diff --git a/mysql-test/r/cast.result b/mysql-test/r/cast.result index db28038526b..87615b4537e 100644 --- a/mysql-test/r/cast.result +++ b/mysql-test/r/cast.result @@ -37,3 +37,6 @@ cast("2001-1-1" as datetime) = "2001-01-01 00:00:00" select cast("1:2:3" as TIME) = "1:02:03"; cast("1:2:3" as TIME) = "1:02:03" 0 +select cast(NULL as DATE); +cast(NULL as DATE) +NULL diff --git a/mysql-test/t/cast.test b/mysql-test/t/cast.test index 7a120ef5005..402adf276c5 100644 --- a/mysql-test/t/cast.test +++ b/mysql-test/t/cast.test @@ -20,3 +20,4 @@ select cast("1:2:3" as TIME); select cast("2001-1-1" as date) = "2001-01-01"; select cast("2001-1-1" as datetime) = "2001-01-01 00:00:00"; select cast("1:2:3" as TIME) = "1:02:03"; +select cast(NULL as DATE); diff --git a/sql/item_timefunc.h b/sql/item_timefunc.h index 2ed126b58e5..87563cf9f47 100644 --- a/sql/item_timefunc.h +++ b/sql/item_timefunc.h @@ -527,7 +527,8 @@ public: { String *tmp=args[0]->val_str(a); null_value=args[0]->null_value; - tmp->set_charset(charset()); + if (tmp) + tmp->set_charset(charset()); return tmp; } void fix_length_and_dec() diff --git a/sql/sql_union.cc b/sql/sql_union.cc index 5f7a1e44bde..2be8268e432 100644 --- a/sql/sql_union.cc +++ b/sql/sql_union.cc @@ -248,6 +248,7 @@ int st_select_lex_unit::exec() SELECT_LEX_NODE *lex_select_save= thd->lex.current_select; SELECT_LEX *select_cursor=first_select_in_union(), *last_select; LINT_INIT(last_select); + bool do_print_slow=0; if (executed && !(dependent || uncacheable)) DBUG_RETURN(0); @@ -313,6 +314,7 @@ int st_select_lex_unit::exec() thd->lex.current_select= lex_select_save; DBUG_RETURN(res); } + do_print_slow = do_print_slow || (select_cursor->options & (QUERY_NO_INDEX_USED | QUERY_NO_GOOD_INDEX_USED)); } } optimized= 1; @@ -325,7 +327,6 @@ int st_select_lex_unit::exec() { List<Item_func_match> empty_list; empty_list.empty(); - thd->lex.select_lex.ftfunc_list= &empty_list; if (!thd->is_fatal_error) // Check if EOM { @@ -338,6 +339,8 @@ int st_select_lex_unit::exec() select_limit_cnt= HA_POS_ERROR; // no limit if (select_limit_cnt == HA_POS_ERROR) thd->options&= ~OPTION_FOUND_ROWS; + fake_select->ftfunc_list= &empty_list; + res= mysql_select(thd, &ref_pointer_array, &result_table_list, 0, item_list, NULL, global_parameters->order_list.elements, @@ -348,9 +351,10 @@ int st_select_lex_unit::exec() thd->limit_found_rows = (ulonglong)table->file->records; fake_select->exclude(); delete fake_select; + if (select_cursor == &thd->lex.select_lex && !do_print_slow) + select_cursor->options &= ~(QUERY_NO_INDEX_USED | QUERY_NO_GOOD_INDEX_USED); } } - thd->lex.select_lex.ftfunc_list= &thd->lex.select_lex.ftfunc_list_alloc; thd->lex.current_select= lex_select_save; DBUG_RETURN(res); } |