From 64ca8e775a3a8fc599ed457523d29daed4afe958 Mon Sep 17 00:00:00 2001 From: Kijin Sung Date: Wed, 23 Jul 2025 01:07:25 +0900 Subject: [PATCH] Fix incorrect prefixing when CTE has an alias #2587 --- common/framework/DB.php | 15 +++++++-------- tests/unit/framework/DBTest.php | 8 ++++---- 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/common/framework/DB.php b/common/framework/DB.php index 1388d2696..b436ce9e8 100644 --- a/common/framework/DB.php +++ b/common/framework/DB.php @@ -1133,13 +1133,12 @@ class DB return preg_replace_callback('/\b((?:DELETE\s+)?FROM|JOIN|INTO|(?_prefix, $m[1], $m[2]) : sprintf('`%s%s` AS `%s`', $this->_prefix, $m[1], $m[1]); } @@ -1147,7 +1146,7 @@ class DB { return isset($m[2]) ? sprintf('`%s%s` AS `%s`', $this->_prefix, $m[1], $m[2]) : sprintf('`%s%s`', $this->_prefix, $m[1]); } - }, $str); + }, trim($str)); }, explode(',', $m[2])); return $m[1] . ' ' . implode(', ', $tables); }, $query_string); diff --git a/tests/unit/framework/DBTest.php b/tests/unit/framework/DBTest.php index cf1495224..6fe855180 100644 --- a/tests/unit/framework/DBTest.php +++ b/tests/unit/framework/DBTest.php @@ -160,15 +160,15 @@ class DBTest extends \Codeception\Test\Unit $this->assertEquals($target, $oDB->addPrefixes($source)); $source = 'WITH cte AS (SELECT * FROM documents) SELECT * FROM cte WHERE document_srl = ?'; - $target = 'WITH cte AS (SELECT * FROM `' . $prefix . 'documents` AS `documents`) SELECT * FROM cte WHERE document_srl = ?'; + $target = 'WITH cte AS (SELECT * FROM `' . $prefix . 'documents` AS `documents`) SELECT * FROM `cte` WHERE document_srl = ?'; $this->assertEquals($target, $oDB->addPrefixes($source)); $source = 'WITH RECURSIVE cte AS (SELECT * FROM documents INNER JOIN `cte`) SELECT * FROM cte JOIN member on cte.member_srl = member.member_srl'; - $target = 'WITH RECURSIVE cte AS (SELECT * FROM `' . $prefix . 'documents` AS `documents` INNER JOIN `cte`) SELECT * FROM cte JOIN `rx_member` AS `member` on cte.member_srl = member.member_srl'; + $target = 'WITH RECURSIVE cte AS (SELECT * FROM `' . $prefix . 'documents` AS `documents` INNER JOIN `cte`) SELECT * FROM `cte` JOIN `rx_member` AS `member` on cte.member_srl = member.member_srl'; $this->assertEquals($target, $oDB->addPrefixes($source)); - $source = 'WITH RECURSIVE `cte` AS (SELECT * FROM cte) SELECT * FROM cte WHERE a = ?'; - $target = 'WITH RECURSIVE `cte` AS (SELECT * FROM cte) SELECT * FROM cte WHERE a = ?'; + $source = 'WITH RECURSIVE `cte` AS (SELECT * FROM tbl INNER JOIN cte AS h) SELECT * FROM cte WHERE a = ?'; + $target = 'WITH RECURSIVE `cte` AS (SELECT * FROM `' . $prefix . 'tbl` AS `tbl` INNER JOIN `cte` AS `h`) SELECT * FROM `cte` WHERE a = ?'; $this->assertEquals($target, $oDB->addPrefixes($source)); $source = 'INSERT INTO documents (a, b, c) VALUES (?, ?, ?) ON DUPLICATE KEY UPDATE b = ?, c = ?';