mirror of
https://github.com/Lastorder-DC/rhymix.git
synced 2026-01-05 17:51:40 +09:00
Fix inappropriate quoting of "distinct" in XML query
https://rhymix.org/qna/1914711
This commit is contained in:
parent
6917a76726
commit
e7d14be6bb
3 changed files with 23 additions and 3 deletions
|
|
@ -738,10 +738,11 @@ class Query extends VariableBase
|
||||||
*/
|
*/
|
||||||
public static function quoteName(string $column_name): string
|
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 = explode('.', $m[0]);
|
||||||
$columns = array_map(function($str) {
|
$columns = array_map(function($str) use($exceptions) {
|
||||||
return $str === '*' ? $str : ('`' . $str . '`');
|
return isset($exceptions[$str]) ? $str : ('`' . $str . '`');
|
||||||
}, $columns);
|
}, $columns);
|
||||||
return implode('.', $columns);
|
return implode('.', $columns);
|
||||||
}, $column_name);
|
}, $column_name);
|
||||||
|
|
|
||||||
|
|
@ -7,5 +7,7 @@
|
||||||
</columns>
|
</columns>
|
||||||
<conditions>
|
<conditions>
|
||||||
<condition operation="search" column="content" var="s_content" />
|
<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>
|
</conditions>
|
||||||
</query>
|
</query>
|
||||||
|
|
|
||||||
|
|
@ -132,6 +132,23 @@ class DBQueryParserTest extends \Codeception\Test\Unit
|
||||||
$this->assertEquals(['%검색%', '%키워드%', '%라이믹스 유닛테스트%'], $params);
|
$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()
|
public function testJoin1()
|
||||||
{
|
{
|
||||||
$query = Rhymix\Framework\Parsers\DBQueryParser::loadXML(\RX_BASEDIR . 'tests/_data/dbquery/selectJoinTest1.xml');
|
$query = Rhymix\Framework\Parsers\DBQueryParser::loadXML(\RX_BASEDIR . 'tests/_data/dbquery/selectJoinTest1.xml');
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue