PROPERLY fix null value handling in both read and write queries

This commit is contained in:
Kijin Sung 2022-01-25 14:54:17 +09:00
parent 7f5f67992d
commit 7f6e020d97
6 changed files with 158 additions and 0 deletions

View file

@ -51,6 +51,17 @@ class VariableBase
$this->filterValue('');
$value = strval($args[$this->var]);
$is_expression = true;
if ($args[$this->var] instanceof NullValue)
{
if ($this->not_null)
{
throw new \Rhymix\Framework\Exceptions\QueryError('Variable ' . $this->var . ' for column ' . $this->column . ' must not be null');
}
if ($this instanceof Condition && in_array($this->operation, ['equal', 'notequal', 'not_equal']))
{
$this->operation = ($this->operation === 'equal') ? 'null' : 'notnull';
}
}
}
elseif ($args[$this->var] === '')
{

View file

@ -0,0 +1,11 @@
<query id="emptyStringTest1" action="update">
<tables>
<table name="documents" />
</tables>
<columns>
<column name="nick_name" var="nick_name" />
</columns>
<conditions>
<condition operation="equal" column="document_srl" var="document_srl" />
</conditions>
</query>

View file

@ -0,0 +1,12 @@
<query id="emptyStringTest2" action="select">
<tables>
<table name="documents" />
</tables>
<columns>
<column name="*" />
</columns>
<conditions>
<condition operation="equal" column="category_srl" var="category_srl" notnull="notnull" />
<condition operation="equal" column="nick_name" var="nick_name" />
</conditions>
</query>

View file

@ -0,0 +1,12 @@
<query id="nullValueTest1" action="update">
<tables>
<table name="documents" />
</tables>
<columns>
<column name="user_name" var="user_name" />
<column name="nick_name" var="nick_name" notnull="notnull" />
</columns>
<conditions>
<condition operation="equal" column="document_srl" var="document_srl" />
</conditions>
</query>

View file

@ -0,0 +1,12 @@
<query id="nullValueTest2" action="select">
<tables>
<table name="documents" />
</tables>
<columns>
<column name="*" />
</columns>
<conditions>
<condition operation="equal" column="module_srl" var="module_srl" />
<condition operation="notequal" column="member_srl" var="member_srl" />
</conditions>
</query>

View file

@ -446,4 +446,104 @@ class DBQueryParserTest extends \Codeception\TestCase\Test
$this->assertEquals('DELETE FROM `rx_documents` WHERE `document_srl` IN (?, ?, ?)', $sql);
$this->assertEquals(['12', '34', '56'], $params);
}
public function testEmptyString()
{
$query = Rhymix\Framework\Parsers\DBQueryParser::loadXML(\RX_BASEDIR . 'tests/_data/dbquery/emptyStringTest1.xml');
$sql = $query->getQueryString('rx_', array(
'nick_name' => '',
'document_srl' => 1234,
));
$this->assertEquals('UPDATE `rx_documents` SET `nick_name` = ? WHERE `document_srl` = ?', $sql);
$this->assertEquals(['', 1234], $query->getQueryParams());
$sql = $query->getQueryString('rx_', array(
'nick_name' => new \Rhymix\Framework\Parsers\DBQuery\EmptyString,
'document_srl' => 1234,
));
$this->assertEquals('UPDATE `rx_documents` SET `nick_name` = \'\' WHERE `document_srl` = ?', $sql);
$this->assertEquals([1234], $query->getQueryParams());
$sql = $query->getQueryString('rx_', array(
'nick_name' => new \Rhymix\Framework\Parsers\DBQuery\EmptyString,
'document_srl' => '',
));
$this->assertEquals('UPDATE `rx_documents` SET `nick_name` = \'\'', $sql);
$this->assertEquals([], $query->getQueryParams());
$sql = $query->getQueryString('rx_', array(
'nick_name' => new \Rhymix\Framework\Parsers\DBQuery\EmptyString,
'document_srl' => new \Rhymix\Framework\Parsers\DBQuery\EmptyString,
));
$this->assertEquals('UPDATE `rx_documents` SET `nick_name` = \'\' WHERE `document_srl` = \'\'', $sql);
$this->assertEquals([], $query->getQueryParams());
$query = Rhymix\Framework\Parsers\DBQueryParser::loadXML(\RX_BASEDIR . 'tests/_data/dbquery/emptyStringTest2.xml');
$sql = $query->getQueryString('rx_', array(
'category_srl' => 77,
'nick_name' => '',
));
$this->assertEquals('SELECT * FROM `rx_documents` AS `documents` WHERE `category_srl` = ?', $sql);
$this->assertEquals([77], $query->getQueryParams());
$sql = $query->getQueryString('rx_', array(
'category_srl' => 88,
'nick_name' => new \Rhymix\Framework\Parsers\DBQuery\EmptyString,
));
$this->assertEquals('SELECT * FROM `rx_documents` AS `documents` WHERE `category_srl` = ? AND `nick_name` = \'\'', $sql);
$this->assertEquals([88], $query->getQueryParams());
}
public function testNullValue()
{
$query = Rhymix\Framework\Parsers\DBQueryParser::loadXML(\RX_BASEDIR . 'tests/_data/dbquery/nullValueTest1.xml');
$sql = $query->getQueryString('rx_', array(
'user_name' => null,
'nick_name' => 'TEST',
'document_srl' => 1234,
));
$this->assertEquals('UPDATE `rx_documents` SET `nick_name` = ? WHERE `document_srl` = ?', $sql);
$this->assertEquals(['TEST', 1234], $query->getQueryParams());
$sql = $query->getQueryString('rx_', array(
'user_name' => new \Rhymix\Framework\Parsers\DBQuery\NullValue,
'nick_name' => 'TEST',
'document_srl' => 1234,
));
$this->assertEquals('UPDATE `rx_documents` SET `user_name` = NULL, `nick_name` = ? WHERE `document_srl` = ?', $sql);
$this->assertEquals(['TEST', 1234], $query->getQueryParams());
$this->tester->expectThrowable(\Rhymix\Framework\Exceptions\QueryError::class, function() use($query) {
$query->getQueryString('rx_', array(
'nick_name' => new \Rhymix\Framework\Parsers\DBQuery\NullValue,
'document_srl' => 1234,
));
});
$this->tester->expectThrowable(\Rhymix\Framework\Exceptions\QueryError::class, function() use($query) {
$query->getQueryString('rx_', array(
'nick_name' => null,
'document_srl' => 1234,
));
});
$query = Rhymix\Framework\Parsers\DBQueryParser::loadXML(\RX_BASEDIR . 'tests/_data/dbquery/nullValueTest2.xml');
$sql = $query->getQueryString('rx_', array(
'member_srl' => null,
'module_srl' => 456,
));
$this->assertEquals('SELECT * FROM `rx_documents` AS `documents` WHERE `module_srl` = ?', $sql);
$this->assertEquals([456], $query->getQueryParams());
$sql = $query->getQueryString('rx_', array(
'member_srl' => new \Rhymix\Framework\Parsers\DBQuery\NullValue,
'module_srl' => new \Rhymix\Framework\Parsers\DBQuery\NullValue,
));
$this->assertEquals('SELECT * FROM `rx_documents` AS `documents` WHERE `module_srl` IS NULL AND `member_srl` IS NOT NULL', $sql);
$this->assertEquals([], $query->getQueryParams());
}
}