mirror of
https://github.com/Lastorder-DC/rhymix.git
synced 2026-01-03 08:41:39 +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
|
||||
{
|
||||
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);
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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');
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue