Commit 1ad294e0 authored by Sergey Vojtovich's avatar Sergey Vojtovich

MDEV-7821 - Server crashes in Item_func_group_concat::fix_fields on 2nd

            execution of PS

GROUP_CONCAT() with ORDER BY column position may crash server on PS reexecution.

The problem was that arguments array of GROUP_CONCAT() was adjusted to point to
temporary elements (resolved ORDER BY fields) during first execution.

This patch expands rev. 08763096 to restore original arguments array as well.
parent fa765a45
...@@ -1103,3 +1103,19 @@ ORDER BY field; ...@@ -1103,3 +1103,19 @@ ORDER BY field;
field field
c,c c,c
drop table t3, t2, t1; drop table t3, t2, t1;
#
# MDEV-7821 - Server crashes in Item_func_group_concat::fix_fields on 2nd
# execution of PS
#
CREATE TABLE t1(a INT);
INSERT INTO t1 VALUES(1),(2);
PREPARE stmt FROM "SELECT GROUP_CONCAT(t1a.a ORDER BY 1, t1a.a=0) FROM t1 AS t1a, t1 AS t1b GROUP BY t1a.a";
EXECUTE stmt;
GROUP_CONCAT(t1a.a ORDER BY 1, t1a.a=0)
1,1
2,2
EXECUTE stmt;
GROUP_CONCAT(t1a.a ORDER BY 1, t1a.a=0)
1,1
2,2
DROP TABLE t1;
...@@ -821,3 +821,14 @@ FROM ( SELECT * FROM t2 ) AS sq2, t3 ...@@ -821,3 +821,14 @@ FROM ( SELECT * FROM t2 ) AS sq2, t3
ORDER BY field; ORDER BY field;
drop table t3, t2, t1; drop table t3, t2, t1;
--echo #
--echo # MDEV-7821 - Server crashes in Item_func_group_concat::fix_fields on 2nd
--echo # execution of PS
--echo #
CREATE TABLE t1(a INT);
INSERT INTO t1 VALUES(1),(2);
PREPARE stmt FROM "SELECT GROUP_CONCAT(t1a.a ORDER BY 1, t1a.a=0) FROM t1 AS t1a, t1 AS t1b GROUP BY t1a.a";
EXECUTE stmt;
EXECUTE stmt;
DROP TABLE t1;
...@@ -3300,6 +3300,8 @@ void Item_func_group_concat::cleanup() ...@@ -3300,6 +3300,8 @@ void Item_func_group_concat::cleanup()
from Item_func_group_concat::setup() to point to runtime from Item_func_group_concat::setup() to point to runtime
created objects, we need to reset them back to the original created objects, we need to reset them back to the original
arguments of the function. arguments of the function.
The very same applies to args array.
*/ */
ORDER **order_ptr= order; ORDER **order_ptr= order;
for (uint i= 0; i < arg_count_order; i++) for (uint i= 0; i < arg_count_order; i++)
...@@ -3307,6 +3309,7 @@ void Item_func_group_concat::cleanup() ...@@ -3307,6 +3309,7 @@ void Item_func_group_concat::cleanup()
(*order_ptr)->item= &args[arg_count_field + i]; (*order_ptr)->item= &args[arg_count_field + i];
order_ptr++; order_ptr++;
} }
memcpy(args, orig_args, sizeof(Item *) * arg_count);
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
} }
......
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