Don't crash API4 if pseudoconstant lookups return nothing
authorJon Goldberg <jon@megaphonetech.com>
Tue, 22 Nov 2022 18:00:32 +0000 (13:00 -0500)
committerJon Goldberg <jon@megaphonetech.com>
Thu, 23 Feb 2023 23:28:55 +0000 (18:28 -0500)
Civi/Api4/Query/Api4SelectQuery.php
tests/phpunit/api/v4/Action/ContactGetTest.php

index 284afe6bbdd5bb8a7d072bc1b3334478da12fd26..57252aaa651a08646a2779f83ebc71f9b47e4195 100644 (file)
@@ -633,6 +633,10 @@ class Api4SelectQuery {
       return sprintf('%s %s "%s"', $fieldAlias, $operator, \CRM_Core_DAO::escapeString($value));
     }
 
+    if (!$value && ($operator === 'IN' || $operator === 'NOT IN')) {
+      $value[] = FALSE;
+    }
+
     if (is_bool($value)) {
       $value = (int) $value;
     }
index e2ada7b6563c55fb4096a805748306b4030623f6..03258bb792d02c224bad3b769e2f3981334e7116 100644 (file)
@@ -424,4 +424,17 @@ class ContactGetTest extends Api4TestBase implements TransactionalInterface {
     $this->assertCount(0, $result);
   }
 
+  public function testInvalidPseudoConstantWithIN(): void {
+    $this->createTestRecord('Contact', [
+      'first_name' => uniqid(),
+      'last_name' => uniqid(),
+      'prefix_id:name' => 'Ms.',
+    ]);
+    $resultCount = Contact::get(FALSE)
+      ->addSelect('id')
+      ->addWhere('prefix_id:name', 'IN', ['Msssss.'])
+      ->execute();
+    $this->assertCount(0, $resultCount);
+  }
+
 }