diff options
-rw-r--r-- | mysql-test/r/order_by_zerolength-4285.result | 26 | ||||
-rw-r--r-- | mysql-test/t/order_by_zerolength-4285.test | 8 | ||||
-rw-r--r-- | sql/filesort_utils.cc | 4 |
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); } |