Issue #2161943 by Berdir, sun, jibran: Throw a helpful exception for empty IN conditions in Database\Query\Condition.

8.0.x
Nathaniel Catchpole 2014-02-13 15:40:29 +00:00
parent ea9ed40f79
commit cad040a5ec
3 changed files with 51 additions and 0 deletions

View File

@ -0,0 +1,16 @@
<?php
/**
* @file
* Definition of Drupal\Core\Database\IntegrityConstraintViolationException
*/
namespace Drupal\Core\Database;
/**
* Exception thrown if a query would be invalidt.
*
* This exception is thrown e.g. when trying to have an IN condition with an
* empty array.
*/
class InvalidQueryException extends \InvalidArgumentException implements DatabaseException { }

View File

@ -8,6 +8,7 @@
namespace Drupal\Core\Database\Query;
use Drupal\Core\Database\Connection;
use Drupal\Core\Database\InvalidQueryException;
/**
* Generic class for a series of conditions in a query.
@ -76,6 +77,10 @@ class Condition implements ConditionInterface, \Countable {
$operator = '=';
}
}
if (empty($value) && is_array($value)) {
throw new InvalidQueryException(sprintf("Query condition '%s %s ()' cannot be empty.", $field, $operator));
}
$this->conditions[] = array(
'field' => $field,
'value' => $value,

View File

@ -6,6 +6,7 @@
*/
namespace Drupal\system\Tests\Database;
use Drupal\Core\Database\InvalidQueryException;
/**
* Tests the SELECT builder.
@ -481,4 +482,33 @@ class SelectTest extends DatabaseTestBase {
$this->fail('No Exception thrown.');
}
/**
* Tests thrown exception for IN query conditions with an empty array.
*/
function testEmptyInCondition() {
try {
db_select('test', 't')
->fields('t')
->condition('age', array(), 'IN')
->execute();
$this->fail('Expected exception not thrown');
}
catch (InvalidQueryException $e) {
$this->assertEqual("Query condition 'age IN ()' cannot be empty.", $e->getMessage());
}
try {
db_select('test', 't')
->fields('t')
->condition('age', array(), 'NOT IN')
->execute();
$this->fail('Expected exception not thrown');
}
catch (InvalidQueryException $e) {
$this->assertEqual("Query condition 'age NOT IN ()' cannot be empty.", $e->getMessage());
}
}
}