1
0
mirror of https://github.com/MariaDB/server.git synced 2025-08-01 03:47:19 +03:00

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
This commit is contained in:
Michael Widenius
2014-04-24 18:20:57 +03:00
parent 64d33032a6
commit b17a053cc9
5 changed files with 36 additions and 9 deletions

View File

@ -1433,3 +1433,4 @@ storage/tokudb/ft-index/utils/tokudb_dump
storage/tokudb/ft-index/utils/tokudb_gen storage/tokudb/ft-index/utils/tokudb_gen
storage/tokudb/ft-index/utils/tokudb_load storage/tokudb/ft-index/utils/tokudb_load
libmysql/libmysql_versions.ld libmysql/libmysql_versions.ld
scripts/mysql_config.pl

View File

@ -2473,3 +2473,12 @@ c 1c
v 2v,2v v 2v,2v
NULL 1c,2v,2v NULL 1c,2v,2v
DROP TABLE t1,t2; 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='';

View File

@ -1643,3 +1643,14 @@ FROM t1 JOIN t2 ON c = b GROUP BY b WITH ROLLUP;
DROP TABLE t1,t2; 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
#

View File

@ -1,2 +0,0 @@
default-character-set=latin1
default-collation=latin1_swedish_ci

View File

@ -5273,15 +5273,23 @@ mark_non_agg_field:
/* /*
Mark selects according to presence of non aggregated fields. Mark selects according to presence of non aggregated fields.
Fields from outer selects added to the aggregate function 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. aggregated or not.
We're using either the select lex of the cached table (if present) We're using 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.
*/ */
SELECT_LEX *select_lex= cached_table ? SELECT_LEX *select_lex;
cached_table->select_lex : field->table->pos_in_table_list->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) if (!thd->lex->in_sum_func)
select_lex->set_non_agg_field_used(true); select_lex->set_non_agg_field_used(true);
else else