Commit d71043b8 authored by igor@olga.mysql.com's avatar igor@olga.mysql.com
Browse files

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).
parent 681ef616
Loading
Loading
Loading
Loading
+22 −0
Original line number Diff line number Diff line
@@ -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.
+18 −0
Original line number Diff line number Diff line
@@ -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.
+5 −0
Original line number Diff line number Diff line
@@ -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;
}