Browse Source

Merge pull request #7196 from dakota/fix-case-literal

Fix value where `literal` values did not work with case statements
Mark Story 10 years ago
parent
commit
999b0ef108

+ 4 - 2
src/Database/Expression/CaseExpression.php

@@ -111,6 +111,8 @@ class CaseExpression implements ExpressionInterface
      */
     protected function _addExpressions($conditions, $values, $types)
     {
+        $rawValues = array_values($values);
+        $keyValues = array_keys($values);
         foreach ($conditions as $k => $c) {
             $numericKey = is_numeric($k);
 
@@ -123,10 +125,10 @@ class CaseExpression implements ExpressionInterface
             }
             array_push($this->_conditions, $c);
 
-            $value = !empty($values[$k]) ? $values[$k] : 1;
+            $value = !empty($rawValues[$k]) ? $rawValues[$k] : 1;
 
             if ($value === 'literal') {
-                $value = $k;
+                $value = $keyValues[$k];
                 array_push($this->_values, $value);
                 continue;
             } elseif ($value instanceof ExpressionInterface) {

+ 7 - 2
tests/TestCase/Database/Expression/CaseExpressionTest.php

@@ -33,12 +33,13 @@ class CaseExpressionTest extends TestCase
     {
         $expr = new QueryExpression();
         $expr->eq('test', 'true');
+        $expr2 = new QueryExpression();
+        $expr2->eq('test2', 'false');
+
         $caseExpression = new CaseExpression($expr, 'foobar');
         $expected = 'CASE WHEN test = :c0 THEN :c1 END';
         $this->assertSame($expected, $caseExpression->sql(new ValueBinder()));
 
-        $expr2 = new QueryExpression();
-        $expr2->eq('test2', 'false');
         $caseExpression->add($expr2);
         $expected = 'CASE WHEN test = :c0 THEN :c1 WHEN test2 = :c2 THEN :c3 END';
         $this->assertSame($expected, $caseExpression->sql(new ValueBinder()));
@@ -46,6 +47,10 @@ class CaseExpressionTest extends TestCase
         $caseExpression = new CaseExpression([$expr], ['foobar', 'else']);
         $expected = 'CASE WHEN test = :c0 THEN :c1 ELSE :c2 END';
         $this->assertSame($expected, $caseExpression->sql(new ValueBinder()));
+
+        $caseExpression = new CaseExpression([$expr], ['foobar' => 'literal', 'else']);
+        $expected = 'CASE WHEN test = :c0 THEN foobar ELSE :c1 END';
+        $this->assertSame($expected, $caseExpression->sql(new ValueBinder()));
     }
 
     /**