mirror of
https://github.com/MariaDB/server.git
synced 2025-01-17 12:32:27 +01:00
Fixed bug #27937: crash for the the second execution of a prepared
statement from a UNION query with ORDER BY an expression containing RAND(). The crash happened because the global order by list in the union query was not re-initialized for execution. (Local order by lists were re-initialized though).
This commit is contained in:
parent
681ef616ed
commit
d71043b889
3 changed files with 45 additions and 0 deletions
|
@ -1087,4 +1087,26 @@ t2 CREATE TABLE `t2` (
|
|||
drop database mysqltest;
|
||||
deallocate prepare stmt1;
|
||||
deallocate prepare stmt2;
|
||||
CREATE TABLE t1(a int);
|
||||
INSERT INTO t1 VALUES (2), (3), (1);
|
||||
PREPARE st1 FROM
|
||||
'(SELECT a FROM t1) UNION (SELECT a+10 FROM t1) ORDER BY RAND()*0+a';
|
||||
EXECUTE st1;
|
||||
a
|
||||
1
|
||||
2
|
||||
3
|
||||
11
|
||||
12
|
||||
13
|
||||
EXECUTE st1;
|
||||
a
|
||||
1
|
||||
2
|
||||
3
|
||||
11
|
||||
12
|
||||
13
|
||||
DEALLOCATE PREPARE st1;
|
||||
DROP TABLE t1;
|
||||
End of 4.1 tests.
|
||||
|
|
|
@ -1128,4 +1128,22 @@ drop database mysqltest;
|
|||
deallocate prepare stmt1;
|
||||
deallocate prepare stmt2;
|
||||
#
|
||||
|
||||
#
|
||||
# Bug #27937: crash on the second execution for prepared statement
|
||||
# from UNION with ORDER BY an expression containing RAND()
|
||||
#
|
||||
|
||||
CREATE TABLE t1(a int);
|
||||
INSERT INTO t1 VALUES (2), (3), (1);
|
||||
|
||||
PREPARE st1 FROM
|
||||
'(SELECT a FROM t1) UNION (SELECT a+10 FROM t1) ORDER BY RAND()*0+a';
|
||||
|
||||
EXECUTE st1;
|
||||
EXECUTE st1;
|
||||
|
||||
DEALLOCATE PREPARE st1;
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo End of 4.1 tests.
|
||||
|
|
|
@ -135,6 +135,11 @@ st_select_lex_unit::init_prepare_fake_select_lex(THD *thd)
|
|||
fake_select_lex->table_list.link_in_list((byte *)&result_table_list,
|
||||
(byte **)
|
||||
&result_table_list.next);
|
||||
for (ORDER *order= (ORDER *) global_parameters->order_list.first;
|
||||
order;
|
||||
order= order->next)
|
||||
order->item= &order->item_ptr;
|
||||
|
||||
return options_tmp;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue