Fix inappropriate quoting of "distinct" in XML query

https://rhymix.org/qna/1914711
This commit is contained in:
Kijin Sung 2025-08-19 00:22:02 +09:00
parent 6917a76726
commit e7d14be6bb
3 changed files with 23 additions and 3 deletions

View file

@ -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);

View file

@ -7,5 +7,7 @@
</columns>
<conditions>
<condition operation="search" column="content" var="s_content" />
<condition operation="equal" column="COUNT(DISTINCT voted_count)" var="s_voted_count" />
<condition operation="equal" column="other_table.blamed_count" var="s_blamed_count" />
</conditions>
</query>

View file

@ -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');