summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergei Golubchik <sergii@pisem.net>2012-05-02 15:22:47 +0200
committerSergei Golubchik <sergii@pisem.net>2012-05-02 15:22:47 +0200
commitbeec2a2b1d79eb7f689ee083fe68d08682b14300 (patch)
tree27b220f4a99673f17901d874f138f9bcde91f061
parent6920491587b9ef4c1e46b0401038244c3bb64c7a (diff)
downloadmariadb-git-beec2a2b1d79eb7f689ee083fe68d08682b14300.tar.gz
MDEV-241 lp:992722 - Server crashes in get_datetime_value
Create an Item_cache based on item's cmp_type, not result_type in subselect_engine. Use result_field in Item_cache_temporal::cache_value(), just like all other Item_cache*::cache_value() do.
-rw-r--r--mysql-test/r/in_datetime_241.result5
-rw-r--r--mysql-test/t/in_datetime_241.test9
-rw-r--r--sql/item.cc2
-rw-r--r--sql/item_subselect.cc2
4 files changed, 16 insertions, 2 deletions
diff --git a/mysql-test/r/in_datetime_241.result b/mysql-test/r/in_datetime_241.result
new file mode 100644
index 00000000000..2c5b4bd8db1
--- /dev/null
+++ b/mysql-test/r/in_datetime_241.result
@@ -0,0 +1,5 @@
+DROP TABLE IF EXISTS t1;
+CREATE TABLE t1 ( a DATE );
+SELECT * FROM t1 WHERE ( SELECT a FROM t1 ) IN ('2012-04-25','2012-04-26');
+a
+DROP TABLE t1;
diff --git a/mysql-test/t/in_datetime_241.test b/mysql-test/t/in_datetime_241.test
new file mode 100644
index 00000000000..f95a456f5e2
--- /dev/null
+++ b/mysql-test/t/in_datetime_241.test
@@ -0,0 +1,9 @@
+#
+# MDEV-241 lp:992722 - Server crashes in get_datetime_value
+#
+--disable_warnings
+DROP TABLE IF EXISTS t1;
+--enable_warnings
+CREATE TABLE t1 ( a DATE );
+SELECT * FROM t1 WHERE ( SELECT a FROM t1 ) IN ('2012-04-25','2012-04-26');
+DROP TABLE t1;
diff --git a/sql/item.cc b/sql/item.cc
index 70c5798eb6c..4e57221c0a6 100644
--- a/sql/item.cc
+++ b/sql/item.cc
@@ -8329,7 +8329,7 @@ bool Item_cache_temporal::cache_value()
value_cached= true;
MYSQL_TIME ltime;
- if (example->get_date(&ltime, TIME_FUZZY_DATE))
+ if (example->get_date_result(&ltime, TIME_FUZZY_DATE))
value=0;
else
value= pack_time(&ltime);
diff --git a/sql/item_subselect.cc b/sql/item_subselect.cc
index 1ca3e5ceda7..d6a77d6ff41 100644
--- a/sql/item_subselect.cc
+++ b/sql/item_subselect.cc
@@ -2893,7 +2893,7 @@ void subselect_engine::set_row(List<Item> &item_list, Item_cache **row)
item->decimals= sel_item->decimals;
item->unsigned_flag= sel_item->unsigned_flag;
maybe_null= sel_item->maybe_null;
- if (!(row[i]= Item_cache::get_cache(sel_item)))
+ if (!(row[i]= Item_cache::get_cache(sel_item, sel_item->cmp_type())))
return;
row[i]->setup(sel_item);
//psergey-backport-timours: row[i]->store(sel_item);