From cad040a5ec0c402e4799f61889aa9f8e3895cec5 Mon Sep 17 00:00:00 2001
From: Nathaniel Catchpole <catch@35733.no-reply.drupal.org>
Date: Thu, 13 Feb 2014 15:40:29 +0000
Subject: [PATCH] Issue #2161943 by Berdir, sun, jibran: Throw a helpful
 exception for empty IN conditions in Database\Query\Condition.

---
 .../Core/Database/InvalidQueryException.php   | 16 ++++++++++
 .../Drupal/Core/Database/Query/Condition.php  |  5 ++++
 .../system/Tests/Database/SelectTest.php      | 30 +++++++++++++++++++
 3 files changed, 51 insertions(+)
 create mode 100644 core/lib/Drupal/Core/Database/InvalidQueryException.php

diff --git a/core/lib/Drupal/Core/Database/InvalidQueryException.php b/core/lib/Drupal/Core/Database/InvalidQueryException.php
new file mode 100644
index 000000000000..ffd5bab23c4b
--- /dev/null
+++ b/core/lib/Drupal/Core/Database/InvalidQueryException.php
@@ -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 { }
diff --git a/core/lib/Drupal/Core/Database/Query/Condition.php b/core/lib/Drupal/Core/Database/Query/Condition.php
index 3b5fe9e6d586..0f2e1a6426e0 100644
--- a/core/lib/Drupal/Core/Database/Query/Condition.php
+++ b/core/lib/Drupal/Core/Database/Query/Condition.php
@@ -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 @@ public function condition($field, $value = NULL, $operator = NULL) {
         $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,
diff --git a/core/modules/system/lib/Drupal/system/Tests/Database/SelectTest.php b/core/modules/system/lib/Drupal/system/Tests/Database/SelectTest.php
index d9da2d6b8837..7b90e07c95b6 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Database/SelectTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Database/SelectTest.php
@@ -6,6 +6,7 @@
  */
 
 namespace Drupal\system\Tests\Database;
+use Drupal\Core\Database\InvalidQueryException;
 
 /**
  * Tests the SELECT builder.
@@ -481,4 +482,33 @@ function testInvalidSelectCount() {
     $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());
+    }
+  }
+
 }
-- 
GitLab