diff --git a/tests/Provider/QueryBuilderProvider.php b/tests/Provider/QueryBuilderProvider.php index 5b48a00b..3a42e9b5 100644 --- a/tests/Provider/QueryBuilderProvider.php +++ b/tests/Provider/QueryBuilderProvider.php @@ -354,10 +354,10 @@ public static function multiOperandFunctionBuilder(): array $stringParam = new Param('[3,4,5]', DataType::STRING); - $data['Longest with 2 operands'][2] = "(SELECT 'short' AS value UNION SELECT :qp0 AS value ORDER BY LENGTH(value) DESC LIMIT 1)"; - $data['Longest with 3 operands'][2] = "(SELECT 'short' AS value UNION SELECT (SELECT 'longest') AS value UNION SELECT :qp0 AS value ORDER BY LENGTH(value) DESC LIMIT 1)"; - $data['Shortest with 2 operands'][2] = "(SELECT 'short' AS value UNION SELECT :qp0 AS value ORDER BY LENGTH(value) ASC LIMIT 1)"; - $data['Shortest with 3 operands'][2] = "(SELECT 'short' AS value UNION SELECT (SELECT 'longest') AS value UNION SELECT :qp0 AS value ORDER BY LENGTH(value) ASC LIMIT 1)"; + $data['Longest with 2 operands'][2] = '(SELECT :qp0 AS value UNION SELECT :qp1 AS value ORDER BY LENGTH(value) DESC LIMIT 1)'; + $data['Longest with 3 operands'][2] = "(SELECT :qp0 AS value UNION SELECT (SELECT 'longest') AS value UNION SELECT :qp1 AS value ORDER BY LENGTH(value) DESC LIMIT 1)"; + $data['Shortest with 2 operands'][2] = '(SELECT :qp0 AS value UNION SELECT :qp1 AS value ORDER BY LENGTH(value) ASC LIMIT 1)'; + $data['Shortest with 3 operands'][2] = "(SELECT :qp0 AS value UNION SELECT (SELECT 'longest') AS value UNION SELECT :qp1 AS value ORDER BY LENGTH(value) ASC LIMIT 1)"; $db = self::getDb(); $serverVersion = $db->getServerInfo()->getVersion(); @@ -375,37 +375,42 @@ public static function multiOperandFunctionBuilder(): array $data['ArrayMerge with 1 operand'] = [ ArrayMerge::class, - ["'[1,2,3]'"], - "('[1,2,3]')", + [[1, 2, 3]], + '(:qp0)', [1, 2, 3], + [':qp0' => new Param('[1,2,3]', DataType::STRING)], ]; $data['ArrayMerge with 2 operands'] = [ ArrayMerge::class, - ["'[1,2,3]'", $stringParam], + [[1, 2, 3], $stringParam], '(SELECT JSON_ARRAYAGG(value) AS value FROM (' - . "SELECT value FROM JSON_TABLE('[1,2,3]', '$[*]' COLUMNS(value json PATH '$')) AS t" - . " UNION SELECT value FROM JSON_TABLE(:qp0, '$[*]' COLUMNS(value json PATH '$')) AS t" + . "SELECT value FROM JSON_TABLE(:qp0, '$[*]' COLUMNS(value json PATH '$')) AS t" + . " UNION SELECT value FROM JSON_TABLE(:qp1, '$[*]' COLUMNS(value json PATH '$')) AS t" . ') AS t)', [1, 2, 3, 4, 5], - [':qp0' => $stringParam], + [ + ':qp0' => new Param('[1,2,3]', DataType::STRING), + ':qp1' => $stringParam, + ], ]; if ($isMariadb) { // MySQL does not support query parameters in JSON_TABLE() function. $data['ArrayMerge with 4 operands'] = [ ArrayMerge::class, - ["'[1,2,3]'", [5, 6, 7], $stringParam, self::getDb()->select(new ArrayValue([9, 10]))], + [[1, 2, 3], new ArrayValue([5, 6, 7]), $stringParam, self::getDb()->select(new ArrayValue([9, 10]))], '(SELECT JSON_ARRAYAGG(value) AS value FROM (' - . "SELECT value FROM JSON_TABLE('[1,2,3]', '$[*]' COLUMNS(value json PATH '$')) AS t" - . " UNION SELECT value FROM JSON_TABLE(:qp0, '$[*]' COLUMNS(value json PATH '$')) AS t" + . "SELECT value FROM JSON_TABLE(:qp0, '$[*]' COLUMNS(value json PATH '$')) AS t" . " UNION SELECT value FROM JSON_TABLE(:qp1, '$[*]' COLUMNS(value json PATH '$')) AS t" - . " UNION SELECT value FROM JSON_TABLE((SELECT :qp2), '$[*]' COLUMNS(value json PATH '$')) AS t" + . " UNION SELECT value FROM JSON_TABLE(:qp2, '$[*]' COLUMNS(value json PATH '$')) AS t" + . " UNION SELECT value FROM JSON_TABLE((SELECT :qp3), '$[*]' COLUMNS(value json PATH '$')) AS t" . ') AS t)', [1, 2, 3, 4, 5, 6, 7, 9, 10], [ - ':qp0' => new Param('[5,6,7]', DataType::STRING), - ':qp1' => $stringParam, - ':qp2' => new Param('[9,10]', DataType::STRING), + ':qp0' => new Param('[1,2,3]', DataType::STRING), + ':qp1' => new Param('[5,6,7]', DataType::STRING), + ':qp2' => $stringParam, + ':qp3' => new Param('[9,10]', DataType::STRING), ], ]; } diff --git a/tests/QueryBuilderTest.php b/tests/QueryBuilderTest.php index 8f2afaad..de038f63 100644 --- a/tests/QueryBuilderTest.php +++ b/tests/QueryBuilderTest.php @@ -13,6 +13,7 @@ use Yiisoft\Db\Expression\Expression; use Yiisoft\Db\Expression\ExpressionInterface; use Yiisoft\Db\Expression\Function\ArrayMerge; +use Yiisoft\Db\Expression\Value\ArrayValue; use Yiisoft\Db\Expression\Value\Param; use Yiisoft\Db\Mysql\Tests\Provider\QueryBuilderProvider; use Yiisoft\Db\Mysql\Tests\Support\TestTrait; @@ -854,24 +855,25 @@ public function testArrayMergeWithTypeWithOrdering( $stringParam = new Param('[4,3,5]', DataType::STRING); $arrayMerge = (new ArrayMerge( - "'[2,1,3]'", - [6, 5, 7], + [2, 1, 3], + new ArrayValue([6, 5, 7]), $stringParam, ))->type($type)->ordered(); $params = []; $this->assertSame( '(SELECT JSON_ARRAYAGG(value) AS value FROM (' - . "SELECT value FROM JSON_TABLE('[2,1,3]', '$[*]' COLUMNS(value $operandType PATH '$')) AS t" - . " UNION SELECT value FROM JSON_TABLE(:qp0, '$[*]' COLUMNS(value $operandType PATH '$')) AS t" + . "SELECT value FROM JSON_TABLE(:qp0, '$[*]' COLUMNS(value $operandType PATH '$')) AS t" . " UNION SELECT value FROM JSON_TABLE(:qp1, '$[*]' COLUMNS(value $operandType PATH '$')) AS t" + . " UNION SELECT value FROM JSON_TABLE(:qp2, '$[*]' COLUMNS(value $operandType PATH '$')) AS t" . ' ORDER BY value) AS t)', $qb->buildExpression($arrayMerge, $params) ); Assert::arraysEquals( [ - ':qp0' => new Param('[6,5,7]', DataType::STRING), - ':qp1' => $stringParam, + ':qp0' => new Param('[2,1,3]', DataType::STRING), + ':qp1' => new Param('[6,5,7]', DataType::STRING), + ':qp2' => $stringParam, ], $params, );