Commit a28152aa authored by Igor Babaev's avatar Igor Babaev

Fixed the bug mdev-13346.

The bug was caused by a defect of the patch for the bug 11081.
The patch was actually a port of the fix this bug from the mysql
code line. Later a correction of this fix was added to the
mysql code. Here's the comment this correction was provided with:

  Bug#16499751: Opening cursor on SELECT in stored procedure causes segfault
  This is a regression from the fix of bug#14740889.
  The fix started using another set of expressions as the source for
  the temporary table used for the materialized cursor. However,
  JOIN::make_tmp_tables_info() calls setup_copy_fields() which creates
  an Item_copy wrapper object on top of the function being selected.
  The Item_copy objects were not properly handled by create_tmp_table -
  they were simply ignored. This patch creates temporary table fields
  based on the underlying item of the Item_copy objects.

The test case for the bug 13346 was taken from mdev-13380.
parent c354cb66
...@@ -8127,3 +8127,20 @@ v_name v_total ...@@ -8127,3 +8127,20 @@ v_name v_total
c 1 c 1
DROP PROCEDURE p1; DROP PROCEDURE p1;
DROP TABLE t1; DROP TABLE t1;
#
# MDEV-13346: CURSOR a query with GROUP BY using derived table
#
CREATE PROCEDURE p1()
BEGIN
DECLARE c CURSOR FOR
SELECT
IFNULL(NULL,1) AS col
FROM
( select 1 as id ) AS t
GROUP BY t.id
;
OPEN c;
END
|
CALL p1();
DROP PROCEDURE p1;
...@@ -9588,3 +9588,25 @@ DELIMITER ;| ...@@ -9588,3 +9588,25 @@ DELIMITER ;|
CALL p1(); CALL p1();
DROP PROCEDURE p1; DROP PROCEDURE p1;
DROP TABLE t1; DROP TABLE t1;
--echo #
--echo # MDEV-13346: CURSOR a query with GROUP BY using derived table
--echo #
DELIMITER |;
CREATE PROCEDURE p1()
BEGIN
DECLARE c CURSOR FOR
SELECT
IFNULL(NULL,1) AS col
FROM
( select 1 as id ) AS t
GROUP BY t.id
;
OPEN c;
END
|
DELIMITER ;|
CALL p1();
DROP PROCEDURE p1;
...@@ -16572,7 +16572,12 @@ create_tmp_table(THD *thd, TMP_TABLE_PARAM *param, List<Item> &fields, ...@@ -16572,7 +16572,12 @@ create_tmp_table(THD *thd, TMP_TABLE_PARAM *param, List<Item> &fields,
Field **tmp_from_field=from_field; Field **tmp_from_field=from_field;
while ((item=li++)) while ((item=li++))
{ {
Item::Type type=item->type(); Item::Type type= item->type();
if (type == Item::COPY_STR_ITEM)
{
item= ((Item_copy *)item)->get_item();
type= item->type();
}
if (not_all_columns) if (not_all_columns)
{ {
if (item->with_sum_func && type != Item::SUM_FUNC_ITEM) if (item->with_sum_func && type != Item::SUM_FUNC_ITEM)
......
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