Add test for failing OR clause
authorEileen McNaughton <emcnaughton@wikimedia.org>
Tue, 20 Jul 2021 01:14:30 +0000 (13:14 +1200)
committerEileen McNaughton <emcnaughton@wikimedia.org>
Tue, 20 Jul 2021 01:14:32 +0000 (13:14 +1200)
This fails because when the field is being concatenated like
`a`.`first_name`='x' OR`a`.`last_name`='x'

The lack of a space between OR and `a` is fugly but it
is parsed by mysql. However, when the value requires utf8mb4
to be supported to do the comparison it returns '0=1' if the
database does not support utf8mb (or it thinks it doesn't per

0 = 1 OR0 = 1

Civi/Api4/Query/Api4SelectQuery.php
tests/phpunit/api/v4/Action/ContactGetTest.php

index 5a7e75d50f7b93173903b5960a874b92413c4219..64d94ed4c2b409cb2b72ffd84b79948df9c67290 100644 (file)
@@ -396,7 +396,7 @@ class Api4SelectQuery {
           foreach ($clause[1] as $subclause) {
             $sql_subclauses[] = $this->treeWalkClauses($subclause, $type, $depth + 1);
           }
-          return '(' . implode("\n" . $clause[0], $sql_subclauses) . ')';
+          return '(' . implode("\n" . $clause[0] . ' ', $sql_subclauses) . ')';
         }
 
       case 'NOT':
index c8cafd824d5e0b05356efaee9aa4a45ed0b8f3ab..f48e4d288290e1f519a2ebbd2988fc328088ce79 100644 (file)
@@ -259,4 +259,14 @@ class ContactGetTest extends \api\v4\UnitTestCase {
     $this->assertEquals(['Student'], $result['Contact_RelationshipCache_Contact_01.contact_sub_type:label']);
   }
 
+  /**
+   * @throws \API_Exception
+   */
+  public function testOrClause(): void {
+    Contact::get()
+      ->addClause('OR', ['first_name', '=', '🚂'], ['last_name', '=', '🚂'])
+      ->setCheckPermissions(FALSE)
+      ->execute();
+  }
+
 }