Skip to content

Commit 074bef4

Browse files
committed
MDEV-30248 Infinite sequence of recursive calls when processing embedded CTE
This patch fixes the patch for bug MDEV-30248 that unsatisfactorily resolved the problem of resolution of references to CTE. In some cases when such a reference has the same table name as the name of one of CTEs containing this reference the reference could be resolved incorrectly that led to an invalid select tree where units could be mutually dependent. This in its turn could lead to an infinite sequence of recursive calls or to falls into infinite loops. The patch also removes LEX::resolve_references_to_cte_in_hanging_cte() as with the new code for resolution of CTE references the call of this function is not needed anymore. Approved by Oleksandr Byelkin <sanja@mariadb.com>
1 parent f18c2b6 commit 074bef4

File tree

5 files changed

+311
-81
lines changed

5 files changed

+311
-81
lines changed

mysql-test/main/cte_recursive.result

Lines changed: 172 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5604,5 +5604,177 @@ r
56045604
3
56055605
drop table t1,t2,t3,x;
56065606
#
5607+
# MDEV-30248: Embedded non-recursive CTE referring to base table 'x'
5608+
# within a CTE with name 'x' used in a subquery from
5609+
# select list of another CTE
5610+
#
5611+
CREATE TABLE x (a int) ENGINE=MyISAM;
5612+
INSERT INTO x VALUES (3),(7),(1);
5613+
CREATE TABLE t1 (b int) ENGINE=MYISAM;
5614+
INSERT INTO t1 VALUES (1);
5615+
WITH cte AS
5616+
(
5617+
SELECT
5618+
(
5619+
WITH x AS
5620+
(WITH x AS (SELECT a FROM x AS t) SELECT 1 AS b)
5621+
SELECT b FROM x AS r
5622+
) AS c
5623+
)
5624+
SELECT cte.c FROM cte;
5625+
c
5626+
1
5627+
WITH cte AS
5628+
(
5629+
SELECT
5630+
(
5631+
WITH x AS
5632+
(WITH x AS (SELECT a FROM x AS t) SELECT b FROM t1)
5633+
SELECT b FROM x AS r
5634+
) AS c
5635+
)
5636+
SELECT cte.c FROM cte;
5637+
c
5638+
1
5639+
WITH cte AS
5640+
(
5641+
SELECT
5642+
(
5643+
WITH x AS
5644+
(WITH y AS (SELECT a FROM x AS t) SELECT b FROM t1)
5645+
SELECT b FROM x AS r
5646+
) AS c
5647+
)
5648+
SELECT cte.c FROM cte;
5649+
c
5650+
1
5651+
WITH cte AS
5652+
(
5653+
SELECT
5654+
(
5655+
WITH x AS
5656+
(WITH y(b) AS (SELECT a FROM x AS t LIMIT 1) SELECT b FROM y)
5657+
SELECT b FROM x AS r
5658+
) AS c
5659+
)
5660+
SELECT cte.c FROM cte;
5661+
c
5662+
3
5663+
WITH cte AS
5664+
(
5665+
SELECT
5666+
(
5667+
WITH x AS
5668+
(WITH x(b) AS (SELECT a FROM x AS t LIMIT 1) SELECT b FROM x)
5669+
SELECT b FROM x AS r
5670+
) AS c
5671+
)
5672+
SELECT cte.c FROM cte;
5673+
c
5674+
3
5675+
WITH x AS
5676+
(
5677+
SELECT
5678+
(
5679+
WITH x AS
5680+
(WITH x AS (SELECT a FROM x AS t) SELECT 1 AS b)
5681+
SELECT b FROM x AS r
5682+
) AS c
5683+
)
5684+
SELECT x.c from x;
5685+
c
5686+
1
5687+
WITH cte AS
5688+
(
5689+
SELECT
5690+
(
5691+
WITH x AS
5692+
(WITH x AS (SELECT a FROM x AS t) SELECT 2 AS b)
5693+
SELECT r1.b FROM x AS r1, x AS r2 WHERE r1.b=r2.b
5694+
) AS c
5695+
)
5696+
SELECT cte.c from cte;
5697+
c
5698+
2
5699+
DROP TABLE x;
5700+
WITH cte AS
5701+
(
5702+
SELECT
5703+
(
5704+
WITH x AS
5705+
(WITH x AS (SELECT a FROM x AS t) SELECT 1 AS b)
5706+
SELECT b FROM x AS r
5707+
) AS c
5708+
)
5709+
SELECT cte.c FROM cte;
5710+
ERROR 42S02: Table 'test.x' doesn't exist
5711+
WITH cte AS
5712+
(
5713+
SELECT
5714+
(
5715+
WITH x AS
5716+
(WITH x AS (SELECT a FROM x AS t) SELECT b FROM t1)
5717+
SELECT b FROM x AS r
5718+
) AS c
5719+
)
5720+
SELECT cte.c FROM cte;
5721+
ERROR 42S02: Table 'test.x' doesn't exist
5722+
WITH cte AS
5723+
(
5724+
SELECT
5725+
(
5726+
WITH x AS
5727+
(WITH y AS (SELECT a FROM x AS t) SELECT b FROM t1)
5728+
SELECT b FROM x AS r
5729+
) AS c
5730+
)
5731+
SELECT cte.c FROM cte;
5732+
ERROR 42S02: Table 'test.x' doesn't exist
5733+
WITH cte AS
5734+
(
5735+
SELECT
5736+
(
5737+
WITH x AS
5738+
(WITH y(b) AS (SELECT a FROM x AS t LIMIT 1) SELECT b FROM y)
5739+
SELECT b FROM x AS r
5740+
) AS c
5741+
)
5742+
SELECT cte.c FROM cte;
5743+
ERROR 42S02: Table 'test.x' doesn't exist
5744+
WITH cte AS
5745+
(
5746+
SELECT
5747+
(
5748+
WITH x AS
5749+
(WITH x(b) AS (SELECT a FROM x AS t LIMIT 1) SELECT b FROM x)
5750+
SELECT b FROM x AS r
5751+
) AS c
5752+
)
5753+
SELECT cte.c FROM cte;
5754+
ERROR 42S02: Table 'test.x' doesn't exist
5755+
WITH x AS
5756+
(
5757+
SELECT
5758+
(
5759+
WITH x AS
5760+
(WITH x AS (SELECT a FROM x AS t) SELECT 1 AS b)
5761+
SELECT b FROM x AS r
5762+
) AS c
5763+
)
5764+
SELECT x.c from x;
5765+
ERROR 42S02: Table 'test.x' doesn't exist
5766+
WITH cte AS
5767+
(
5768+
SELECT
5769+
(
5770+
WITH x AS
5771+
(WITH x AS (SELECT a FROM x AS t) SELECT 2 AS b)
5772+
SELECT r1.b FROM x AS r1, x AS r2 WHERE r1.b=r2.b
5773+
) AS c
5774+
)
5775+
SELECT cte.c from cte;
5776+
ERROR 42S02: Table 'test.x' doesn't exist
5777+
DROP TABLE t1;
5778+
#
56075779
# End of 10.3 tests
56085780
#

mysql-test/main/cte_recursive.test

Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3871,6 +3871,129 @@ select * from cte;
38713871

38723872
drop table t1,t2,t3,x;
38733873

3874+
--echo #
3875+
--echo # MDEV-30248: Embedded non-recursive CTE referring to base table 'x'
3876+
--echo # within a CTE with name 'x' used in a subquery from
3877+
--echo # select list of another CTE
3878+
--echo #
3879+
3880+
CREATE TABLE x (a int) ENGINE=MyISAM;
3881+
INSERT INTO x VALUES (3),(7),(1);
3882+
CREATE TABLE t1 (b int) ENGINE=MYISAM;
3883+
INSERT INTO t1 VALUES (1);
3884+
3885+
let $q1=
3886+
WITH cte AS
3887+
(
3888+
SELECT
3889+
(
3890+
WITH x AS
3891+
(WITH x AS (SELECT a FROM x AS t) SELECT 1 AS b)
3892+
SELECT b FROM x AS r
3893+
) AS c
3894+
)
3895+
SELECT cte.c FROM cte;
3896+
eval $q1;
3897+
3898+
let $q2=
3899+
WITH cte AS
3900+
(
3901+
SELECT
3902+
(
3903+
WITH x AS
3904+
(WITH x AS (SELECT a FROM x AS t) SELECT b FROM t1)
3905+
SELECT b FROM x AS r
3906+
) AS c
3907+
)
3908+
SELECT cte.c FROM cte;
3909+
eval $q2;
3910+
3911+
let $q3=
3912+
WITH cte AS
3913+
(
3914+
SELECT
3915+
(
3916+
WITH x AS
3917+
(WITH y AS (SELECT a FROM x AS t) SELECT b FROM t1)
3918+
SELECT b FROM x AS r
3919+
) AS c
3920+
)
3921+
SELECT cte.c FROM cte;
3922+
eval $q3;
3923+
3924+
3925+
let $q4=
3926+
WITH cte AS
3927+
(
3928+
SELECT
3929+
(
3930+
WITH x AS
3931+
(WITH y(b) AS (SELECT a FROM x AS t LIMIT 1) SELECT b FROM y)
3932+
SELECT b FROM x AS r
3933+
) AS c
3934+
)
3935+
SELECT cte.c FROM cte;
3936+
eval $q4;
3937+
3938+
let $q5=
3939+
WITH cte AS
3940+
(
3941+
SELECT
3942+
(
3943+
WITH x AS
3944+
(WITH x(b) AS (SELECT a FROM x AS t LIMIT 1) SELECT b FROM x)
3945+
SELECT b FROM x AS r
3946+
) AS c
3947+
)
3948+
SELECT cte.c FROM cte;
3949+
eval $q5;
3950+
3951+
let $q6=
3952+
WITH x AS
3953+
(
3954+
SELECT
3955+
(
3956+
WITH x AS
3957+
(WITH x AS (SELECT a FROM x AS t) SELECT 1 AS b)
3958+
SELECT b FROM x AS r
3959+
) AS c
3960+
)
3961+
SELECT x.c from x;
3962+
eval $q6;
3963+
3964+
let $q7=
3965+
WITH cte AS
3966+
(
3967+
SELECT
3968+
(
3969+
WITH x AS
3970+
(WITH x AS (SELECT a FROM x AS t) SELECT 2 AS b)
3971+
SELECT r1.b FROM x AS r1, x AS r2 WHERE r1.b=r2.b
3972+
) AS c
3973+
)
3974+
SELECT cte.c from cte;
3975+
eval $q7;
3976+
3977+
3978+
DROP TABLE x;
3979+
3980+
--ERROR ER_NO_SUCH_TABLE
3981+
eval $q1;
3982+
--ERROR ER_NO_SUCH_TABLE
3983+
eval $q2;
3984+
--ERROR ER_NO_SUCH_TABLE
3985+
eval $q3;
3986+
--ERROR ER_NO_SUCH_TABLE
3987+
eval $q4;
3988+
--ERROR ER_NO_SUCH_TABLE
3989+
eval $q5;
3990+
--ERROR ER_NO_SUCH_TABLE
3991+
eval $q6;
3992+
--ERROR ER_NO_SUCH_TABLE
3993+
eval $q7;
3994+
3995+
DROP TABLE t1;
3996+
38743997
--echo #
38753998
--echo # End of 10.3 tests
38763999
--echo #

0 commit comments

Comments
 (0)