summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTor Didriksen <tor.didriksen@oracle.com>2012-02-22 11:17:50 +0100
committerTor Didriksen <tor.didriksen@oracle.com>2012-02-22 11:17:50 +0100
commitf3eb021d5e0c09215b28bf82c10b2e3085ad7a38 (patch)
treec1fb49aaccafd68acbc5bfb869e760e18b68ac7f
parentb79d492ee5ed6f557df7e3e535126ca80cc28ca2 (diff)
downloadmariadb-git-f3eb021d5e0c09215b28bf82c10b2e3085ad7a38.tar.gz
Bug#13519724 63793: CRASH IN DTCOLLATION::SET(DTCOLLATION &SET)
Backport of fix for: Bug#53236 Segfault in DTCollation::set(DTCollation&)
-rw-r--r--mysql-test/r/cast.result9
-rw-r--r--mysql-test/t/cast.test12
-rw-r--r--sql/sql_select.cc4
3 files changed, 23 insertions, 2 deletions
diff --git a/mysql-test/r/cast.result b/mysql-test/r/cast.result
index 44d57055e7f..d7a7503707b 100644
--- a/mysql-test/r/cast.result
+++ b/mysql-test/r/cast.result
@@ -468,4 +468,13 @@ NULL
Warnings:
Warning 1301 Result of cast_as_char() was larger than max_allowed_packet (2048) - truncated
SET @@GLOBAL.max_allowed_packet=default;
+#
+# Bug#13519724 63793: CRASH IN DTCOLLATION::SET(DTCOLLATION &SET)
+#
+CREATE TABLE t1 (a VARCHAR(50));
+SELECT a FROM t1
+WHERE CAST(a as BINARY)=x'62736D697468'
+AND CAST(a AS BINARY)=x'65736D697468';
+a
+DROP TABLE t1;
End of 5.1 tests
diff --git a/mysql-test/t/cast.test b/mysql-test/t/cast.test
index 426d7c7fdf2..4474736200c 100644
--- a/mysql-test/t/cast.test
+++ b/mysql-test/t/cast.test
@@ -297,4 +297,16 @@ connection default;
disconnect newconn;
SET @@GLOBAL.max_allowed_packet=default;
+--echo #
+--echo # Bug#13519724 63793: CRASH IN DTCOLLATION::SET(DTCOLLATION &SET)
+--echo #
+
+CREATE TABLE t1 (a VARCHAR(50));
+
+SELECT a FROM t1
+WHERE CAST(a as BINARY)=x'62736D697468'
+ AND CAST(a AS BINARY)=x'65736D697468';
+
+DROP TABLE t1;
+
--echo End of 5.1 tests
diff --git a/sql/sql_select.cc b/sql/sql_select.cc
index 5f1efabfc97..0d8dc740431 100644
--- a/sql/sql_select.cc
+++ b/sql/sql_select.cc
@@ -8546,10 +8546,10 @@ change_cond_ref_to_const(THD *thd, I_List<COND_CMP> *save_list,
left_item->collation.collation == value->collation.collation))
{
Item *tmp=value->clone_item();
- tmp->collation.set(right_item->collation);
if (tmp)
{
+ tmp->collation.set(right_item->collation);
thd->change_item_tree(args + 1, tmp);
func->update_used_tables();
if ((functype == Item_func::EQ_FUNC || functype == Item_func::EQUAL_FUNC)
@@ -8570,10 +8570,10 @@ change_cond_ref_to_const(THD *thd, I_List<COND_CMP> *save_list,
right_item->collation.collation == value->collation.collation))
{
Item *tmp= value->clone_item();
- tmp->collation.set(left_item->collation);
if (tmp)
{
+ tmp->collation.set(left_item->collation);
thd->change_item_tree(args, tmp);
value= tmp;
func->update_used_tables();