From 2ad4978b23a1d91cbbe5859f7b86cf4f50d54f3e Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Sun, 23 Feb 2014 20:26:14 +0700 Subject: [PATCH 1/2] Fixes #4521 --- library/Zend/Validator/Db/AbstractDb.php | 4 --- .../Validator/Db/RecordExistsTest.php | 35 +++++++++++++++++++ 2 files changed, 35 insertions(+), 4 deletions(-) diff --git a/library/Zend/Validator/Db/AbstractDb.php b/library/Zend/Validator/Db/AbstractDb.php index 6270fc6ab00..4dd52bd9026 100644 --- a/library/Zend/Validator/Db/AbstractDb.php +++ b/library/Zend/Validator/Db/AbstractDb.php @@ -280,10 +280,6 @@ public function setSelect(Select $select) */ public function getSelect() { - if ($this->select instanceof Select) { - return $this->select; - } - // Build select object $select = new Select(); $tableIdentifier = new TableIdentifier($this->table, $this->schema); diff --git a/tests/ZendTest/Validator/Db/RecordExistsTest.php b/tests/ZendTest/Validator/Db/RecordExistsTest.php index e1d6812b1ec..0255103fbe3 100644 --- a/tests/ZendTest/Validator/Db/RecordExistsTest.php +++ b/tests/ZendTest/Validator/Db/RecordExistsTest.php @@ -273,4 +273,39 @@ public function testGetSelect() $this->assertNull($parameters['where1']); $this->assertEquals($parameters['where2'], 'bar'); } + + /** + * @cover Zend\Validator\Db\RecordExists::getSelect + * @group ZF2-4521 + */ + public function testGetSelectWithSameValidatorTwice() + { + $validator = new RecordExists( + array( + 'table' => 'users', + 'schema' => 'my' + ), + 'field1', + array( + 'field' => 'foo', + 'value' => 'bar' + ), + $this->getMockHasResult() + ); + $select = $validator->getSelect(); + $this->assertInstanceOf('Zend\Db\Sql\Select', $select); + $this->assertEquals('SELECT "my"."users"."field1" AS "field1" FROM "my"."users" WHERE "field1" = \'\' AND "foo" != \'bar\'', $select->getSqlString(new TrustingSql92Platform())); + + // same validator instance with changing properties + $validator->setTable('othertable'); + $validator->setSchema('otherschema'); + $validator->setField('fieldother'); + $validator->setExclude(array( + 'field' => 'fieldexclude', + 'value' => 'fieldvalueexclude', + )); + $select = $validator->getSelect(); + $this->assertInstanceOf('Zend\Db\Sql\Select', $select); + $this->assertEquals('SELECT "otherschema"."othertable"."fieldother" AS "fieldother" FROM "otherschema"."othertable" WHERE "fieldother" = \'\' AND "fieldexclude" != \'fieldvalueexclude\'', $select->getSqlString(new TrustingSql92Platform())); + } } From 32d6030844e709f29161ab88d4456dbb68075e38 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Sat, 12 Apr 2014 00:36:19 +0700 Subject: [PATCH 2/2] change approach to reset $select only when $table, $shema, $field, or $exclude changed --- library/Zend/Validator/Db/AbstractDb.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/library/Zend/Validator/Db/AbstractDb.php b/library/Zend/Validator/Db/AbstractDb.php index 4dd52bd9026..3624f1efd36 100644 --- a/library/Zend/Validator/Db/AbstractDb.php +++ b/library/Zend/Validator/Db/AbstractDb.php @@ -280,6 +280,11 @@ public function setSelect(Select $select) */ public function getSelect() { + if ($this->select instanceof Select + && ($this->getSchema() === null || $this->getTable() === '' || $this->getField() === '' || $this->getExclude() === null)) { + return $this->select; + } + // Build select object $select = new Select(); $tableIdentifier = new TableIdentifier($this->table, $this->schema);