summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mysql-test/r/order_by_zerolength-4285.result26
-rw-r--r--mysql-test/t/order_by_zerolength-4285.test8
-rw-r--r--sql/filesort_utils.cc4
3 files changed, 36 insertions, 2 deletions
diff --git a/mysql-test/r/order_by_zerolength-4285.result b/mysql-test/r/order_by_zerolength-4285.result
new file mode 100644
index 00000000000..f60ce7d90c7
--- /dev/null
+++ b/mysql-test/r/order_by_zerolength-4285.result
@@ -0,0 +1,26 @@
+create table t1 (pk int primary key);
+insert into t1 values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10);
+select * from t1 order by now(), cast(pk as char(0));
+pk
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+Warnings:
+Warning 1292 Truncated incorrect CHAR(0) value: '1'
+Warning 1292 Truncated incorrect CHAR(0) value: '2'
+Warning 1292 Truncated incorrect CHAR(0) value: '3'
+Warning 1292 Truncated incorrect CHAR(0) value: '4'
+Warning 1292 Truncated incorrect CHAR(0) value: '5'
+Warning 1292 Truncated incorrect CHAR(0) value: '6'
+Warning 1292 Truncated incorrect CHAR(0) value: '7'
+Warning 1292 Truncated incorrect CHAR(0) value: '8'
+Warning 1292 Truncated incorrect CHAR(0) value: '9'
+Warning 1292 Truncated incorrect CHAR(0) value: '10'
+drop table t1;
diff --git a/mysql-test/t/order_by_zerolength-4285.test b/mysql-test/t/order_by_zerolength-4285.test
new file mode 100644
index 00000000000..2fb58edd36d
--- /dev/null
+++ b/mysql-test/t/order_by_zerolength-4285.test
@@ -0,0 +1,8 @@
+#
+# MDEV-4285 Server crashes in ptr_compare on NOW and CAST in ORDER BY
+#
+create table t1 (pk int primary key);
+insert into t1 values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10);
+select * from t1 order by now(), cast(pk as char(0));
+drop table t1;
+
diff --git a/sql/filesort_utils.cc b/sql/filesort_utils.cc
index f8f6d5c9420..1cef30b6a56 100644
--- a/sql/filesort_utils.cc
+++ b/sql/filesort_utils.cc
@@ -125,7 +125,8 @@ void Filesort_buffer::free_sort_buffer()
void Filesort_buffer::sort_buffer(const Sort_param *param, uint count)
{
- if (count <= 1)
+ size_t size= param->sort_length;
+ if (count <= 1 || size == 0)
return;
uchar **keys= get_sort_keys();
uchar **buffer= NULL;
@@ -138,6 +139,5 @@ void Filesort_buffer::sort_buffer(const Sort_param *param, uint count)
return;
}
- size_t size= param->sort_length;
my_qsort2(keys, count, sizeof(uchar*), get_ptr_compare(size), &size);
}