mirror of
https://github.com/Lastorder-DC/rhymix.git
synced 2026-01-03 16:51:40 +09:00
PROPERLY fix null value handling in both read and write queries
This commit is contained in:
parent
7f5f67992d
commit
7f6e020d97
6 changed files with 158 additions and 0 deletions
|
|
@ -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] === '')
|
||||
{
|
||||
|
|
|
|||
11
tests/_data/dbquery/emptyStringTest1.xml
Normal file
11
tests/_data/dbquery/emptyStringTest1.xml
Normal 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>
|
||||
12
tests/_data/dbquery/emptyStringTest2.xml
Normal file
12
tests/_data/dbquery/emptyStringTest2.xml
Normal 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>
|
||||
12
tests/_data/dbquery/nullValueTest1.xml
Normal file
12
tests/_data/dbquery/nullValueTest1.xml
Normal 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>
|
||||
12
tests/_data/dbquery/nullValueTest2.xml
Normal file
12
tests/_data/dbquery/nullValueTest2.xml
Normal 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>
|
||||
|
|
@ -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());
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue