Commit b17a053c authored by Michael Widenius's avatar Michael Widenius

MDEV-6129: Server crashes during UNION with ORDER BY field IS NULL

Fixed crashing bug for union queries where there was no real tables.


mysql-test/r/group_by.result:
  Added test case
mysql-test/t/group_by.test:
  Added test case
sql/db.opt:
  Removed genrated file
sql/item.cc:
  Handled case when table_list->pos_in_tables is not set. Can only happens when there is no real tables in query
parent 64d33032
......@@ -1433,3 +1433,4 @@ storage/tokudb/ft-index/utils/tokudb_dump
storage/tokudb/ft-index/utils/tokudb_gen
storage/tokudb/ft-index/utils/tokudb_load
libmysql/libmysql_versions.ld
scripts/mysql_config.pl
......@@ -2473,3 +2473,12 @@ c 1c
v 2v,2v
NULL 1c,2v,2v
DROP TABLE t1,t2;
#
# MDEV-6129: Server crashes during UNION with ORDER BY field IS NULL
#
SET sql_mode='ONLY_FULL_GROUP_BY';
SELECT 1 AS test UNION SELECT 2 AS test ORDER BY test IS NULL ASC;
test
1
2
SET sql_mode='';
......@@ -1643,3 +1643,14 @@ FROM t1 JOIN t2 ON c = b GROUP BY b WITH ROLLUP;
DROP TABLE t1,t2;
--echo #
--echo # MDEV-6129: Server crashes during UNION with ORDER BY field IS NULL
--echo #
SET sql_mode='ONLY_FULL_GROUP_BY';
SELECT 1 AS test UNION SELECT 2 AS test ORDER BY test IS NULL ASC;
SET sql_mode='';
#
# End of MariaDB 5.5 tests
#
default-character-set=latin1
default-collation=latin1_swedish_ci
......@@ -5273,15 +5273,23 @@ mark_non_agg_field:
/*
Mark selects according to presence of non aggregated fields.
Fields from outer selects added to the aggregate function
outer_fields list as its unknown at the moment whether it's
outer_fields list as it's unknown at the moment whether it's
aggregated or not.
We're using either the select lex of the cached table (if present)
or the field's resolution context. context->select_lex is
safe for use because it's either the SELECT we want to use
(the current level) or a stub added by non-SELECT queries.
We're using the select lex of the cached table (if present).
*/
SELECT_LEX *select_lex= cached_table ?
cached_table->select_lex : field->table->pos_in_table_list->select_lex;
SELECT_LEX *select_lex;
if (cached_table)
select_lex= cached_table->select_lex;
else if (!(select_lex= field->table->pos_in_table_list->select_lex))
{
/*
This can only happen when there is no real table in the query.
We are using the field's resolution context. context->select_lex is eee
safe for use because it's either the SELECT we want to use
(the current level) or a stub added by non-SELECT queries.
*/
select_lex= context->select_lex;
}
if (!thd->lex->in_sum_func)
select_lex->set_non_agg_field_used(true);
else
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment