summaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
authorRamil Kalimullin <ramil@mysql.com>2010-01-29 13:17:57 +0400
committerRamil Kalimullin <ramil@mysql.com>2010-01-29 13:17:57 +0400
commit221cdc4084956fe86541454137eccc6ca4c21873 (patch)
tree84dfec8ca6db5f95bf5e4bc26159146943c1c829 /sql
parent6e351da89bc3d4c1624ab28e23748656e8a12192 (diff)
downloadmariadb-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.cc2
-rw-r--r--sql/sql_select.cc13
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*) &param,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)