Browse Source

Merge pull request #11410 from raul338/FunctionExprNestQueryExpr

Avoid double parenthesis when nesting functions and query expressions
José Lorenzo Rodríguez 8 years ago
parent
commit
e6e31799d4

+ 1 - 1
src/Database/Expression/FunctionExpression.php

@@ -168,7 +168,7 @@ class FunctionExpression extends QueryExpression implements TypedResultInterface
         $parts = [];
         foreach ($this->_conditions as $condition) {
             if ($condition instanceof ExpressionInterface) {
-                $condition = sprintf('(%s)', $condition->sql($generator));
+                $condition = sprintf('%s', $condition->sql($generator));
             } elseif (is_array($condition)) {
                 $p = $generator->placeholder('param');
                 $generator->bind($p, $condition['value'], $condition['type']);

+ 16 - 1
tests/TestCase/Database/Expression/FunctionExpressionTest.php

@@ -14,6 +14,7 @@
 namespace Cake\Test\TestCase\Database\Expression;
 
 use Cake\Database\Expression\FunctionExpression;
+use Cake\Database\Expression\QueryExpression;
 use Cake\Database\ValueBinder;
 use Cake\TestSuite\TestCase;
 
@@ -78,7 +79,21 @@ class FunctionExpressionTest extends TestCase
         $binder = new ValueBinder;
         $f = new FunctionExpression('MyFunction', ['foo', 'bar']);
         $g = new FunctionExpression('Wrapper', ['bar' => 'literal', $f]);
-        $this->assertEquals('Wrapper(bar, (MyFunction(:param0, :param1)))', $g->sql($binder));
+        $this->assertEquals('Wrapper(bar, MyFunction(:param0, :param1))', $g->sql($binder));
+    }
+
+    /**
+     * Tests to avoid regression, prevents double parenthesis
+     * In particular nesting with QueryExpression
+     *
+     * @return void
+     */
+    public function testFunctionNestingQueryExpression()
+    {
+        $binder = new ValueBinder;
+        $q = new QueryExpression('a');
+        $f = new FunctionExpression('MyFunction', [$q]);
+        $this->assertEquals('MyFunction(a)', $f->sql($binder));
     }
 
     /**

+ 1 - 1
tests/TestCase/Database/ExpressionTypeCastingTest.php

@@ -158,7 +158,7 @@ class ExpressionTypeCastingTest extends TestCase
         $function = new FunctionExpression('DATE', ['2016-01'], ['test']);
         $binder = new ValueBinder;
         $sql = $function->sql($binder);
-        $this->assertEquals('DATE((CONCAT(:param0, :param1)))', $sql);
+        $this->assertEquals('DATE(CONCAT(:param0, :param1))', $sql);
         $this->assertEquals('2016-01', $binder->bindings()[':param0']['value']);
 
         $expressions = [];