From e7d14be6bb923bcc9b21c5df544b5f95ac99ef88 Mon Sep 17 00:00:00 2001 From: Kijin Sung Date: Tue, 19 Aug 2025 00:22:02 +0900 Subject: [PATCH] Fix inappropriate quoting of "distinct" in XML query https://rhymix.org/qna/1914711 --- common/framework/parsers/dbquery/Query.php | 7 ++++--- tests/_data/dbquery/selectTest3.xml | 2 ++ .../framework/parsers/DBQueryParserTest.php | 17 +++++++++++++++++ 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/common/framework/parsers/dbquery/Query.php b/common/framework/parsers/dbquery/Query.php index a1b18d20b..6a0a71170 100644 --- a/common/framework/parsers/dbquery/Query.php +++ b/common/framework/parsers/dbquery/Query.php @@ -738,10 +738,11 @@ class Query extends VariableBase */ public static function quoteName(string $column_name): string { - return preg_replace_callback('/[a-z][a-z0-9_.*]*(?!\\()\b/i', function($m) { + $exceptions = ['*' => true, 'DISTINCT' => true, 'distinct' => true]; + return preg_replace_callback('/[a-z][a-z0-9_.*]*(?!\\()\b/i', function($m) use($exceptions) { $columns = explode('.', $m[0]); - $columns = array_map(function($str) { - return $str === '*' ? $str : ('`' . $str . '`'); + $columns = array_map(function($str) use($exceptions) { + return isset($exceptions[$str]) ? $str : ('`' . $str . '`'); }, $columns); return implode('.', $columns); }, $column_name); diff --git a/tests/_data/dbquery/selectTest3.xml b/tests/_data/dbquery/selectTest3.xml index 89b133460..5cefa94e2 100644 --- a/tests/_data/dbquery/selectTest3.xml +++ b/tests/_data/dbquery/selectTest3.xml @@ -7,5 +7,7 @@ + + diff --git a/tests/unit/framework/parsers/DBQueryParserTest.php b/tests/unit/framework/parsers/DBQueryParserTest.php index a711ea788..d08f8ab25 100644 --- a/tests/unit/framework/parsers/DBQueryParserTest.php +++ b/tests/unit/framework/parsers/DBQueryParserTest.php @@ -132,6 +132,23 @@ class DBQueryParserTest extends \Codeception\Test\Unit $this->assertEquals(['%검색%', '%키워드%', '%라이믹스 유닛테스트%'], $params); } + public function testQuoteName() + { + $query = Rhymix\Framework\Parsers\DBQueryParser::loadXML(\RX_BASEDIR . 'tests/_data/dbquery/selectTest3.xml'); + + $args = array('s_voted_count' => 24); + $sql = $query->getQueryString('rx_', $args); + $params = $query->getQueryParams(); + $this->assertEquals('SELECT * FROM `rx_documents` AS `documents` WHERE COUNT(DISTINCT `voted_count`) = ?', $sql); + $this->assertEquals([24], $params); + + $args = array('s_blamed_count' => 42); + $sql = $query->getQueryString('rx_', $args); + $params = $query->getQueryParams(); + $this->assertEquals('SELECT * FROM `rx_documents` AS `documents` WHERE `other_table`.`blamed_count` = ?', $sql); + $this->assertEquals([42], $params); + } + public function testJoin1() { $query = Rhymix\Framework\Parsers\DBQueryParser::loadXML(\RX_BASEDIR . 'tests/_data/dbquery/selectJoinTest1.xml');