diff options
author | Ramil Kalimullin <ramil@mysql.com> | 2010-01-29 13:17:57 +0400 |
---|---|---|
committer | Ramil Kalimullin <ramil@mysql.com> | 2010-01-29 13:17:57 +0400 |
commit | 221cdc4084956fe86541454137eccc6ca4c21873 (patch) | |
tree | 84dfec8ca6db5f95bf5e4bc26159146943c1c829 /sql | |
parent | 6e351da89bc3d4c1624ab28e23748656e8a12192 (diff) | |
download | mariadb-git-221cdc4084956fe86541454137eccc6ca4c21873.tar.gz |
Fix for bug#49897: crash in ptr_compare when char(0) NOT NULL
column is used for ORDER BY
Problem: filesort isn't meant for null length sort data
(e.g. char(0)), that leads to a server crash.
Fix: disregard sort order if sort data record length is 0 (nothing
to sort).
Diffstat (limited to 'sql')
-rw-r--r-- | sql/filesort.cc | 2 | ||||
-rw-r--r-- | sql/sql_select.cc | 13 |
2 files changed, 15 insertions, 0 deletions
diff --git a/sql/filesort.cc b/sql/filesort.cc index f56e5b3a771..11be5d7f672 100644 --- a/sql/filesort.cc +++ b/sql/filesort.cc @@ -134,6 +134,8 @@ ha_rows filesort(THD *thd, TABLE *table, SORT_FIELD *sortorder, uint s_length, error= 1; bzero((char*) ¶m,sizeof(param)); param.sort_length= sortlength(thd, sortorder, s_length, &multi_byte_charset); + /* filesort cannot handle zero-length records. */ + DBUG_ASSERT(param.sort_length); param.ref_length= table->file->ref_length; param.addon_field= 0; param.addon_length= 0; diff --git a/sql/sql_select.cc b/sql/sql_select.cc index d8ec5eff5c1..239809f1d4c 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -521,13 +521,26 @@ JOIN::prepare(Item ***rref_pointer_array, if (order) { + bool real_order= FALSE; ORDER *ord; for (ord= order; ord; ord= ord->next) { Item *item= *ord->item; + /* + Disregard sort order if there's only "{VAR}CHAR(0) NOT NULL" fields + there. Such fields don't contain any data to sort. + */ + if (!real_order && + (item->type() != Item::Item::FIELD_ITEM || + ((Item_field *) item)->field->maybe_null() || + ((Item_field *) item)->field->sort_length())) + real_order= TRUE; + if (item->with_sum_func && item->type() != Item::SUM_FUNC_ITEM) item->split_sum_func(thd, ref_pointer_array, all_fields); } + if (!real_order) + order= NULL; } if (having && having->with_sum_func) |