summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mysql-test/r/cast.result3
-rw-r--r--mysql-test/t/cast.test1
-rw-r--r--sql/item_timefunc.h3
-rw-r--r--sql/sql_union.cc8
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);
}