From b423724b9415f4337328ec0d030bd460482fc6b7 Mon Sep 17 00:00:00 2001 From: Martin Georgiev Date: Thu, 10 Apr 2025 00:28:47 +0100 Subject: [PATCH] bug: avoid infinite parsing loop for `GREATEST()` and `LEAST()` by using `SimpleArithmeticExpression` --- .../ORM/Query/AST/Functions/BaseComparisonFunction.php | 2 +- .../Doctrine/ORM/Query/AST/Functions/GreatestTest.php | 8 ++++++-- .../Doctrine/ORM/Query/AST/Functions/LeastTest.php | 8 ++++++-- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/BaseComparisonFunction.php b/src/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/BaseComparisonFunction.php index 80703a82..e745948b 100644 --- a/src/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/BaseComparisonFunction.php +++ b/src/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/BaseComparisonFunction.php @@ -11,5 +11,5 @@ */ abstract class BaseComparisonFunction extends BaseVariadicFunction { - protected string $commonNodeMapping = 'ArithmeticPrimary'; + protected string $commonNodeMapping = 'SimpleArithmeticExpression'; } diff --git a/tests/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/GreatestTest.php b/tests/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/GreatestTest.php index 78d66d01..2f9c3fe6 100644 --- a/tests/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/GreatestTest.php +++ b/tests/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/GreatestTest.php @@ -26,14 +26,18 @@ protected function getStringFunctions(): array protected function getExpectedSqlStatements(): array { return [ - 'SELECT greatest(c0_.integer1, c0_.integer2, c0_.integer3) AS sclr_0 FROM ContainsIntegers c0_', + 'multiple column values' => 'SELECT greatest(c0_.integer1, c0_.integer2, c0_.integer3) AS sclr_0 FROM ContainsIntegers c0_', + 'column value with expression' => 'SELECT greatest(c0_.integer1 * 100, SQRT(11) * 150) AS sclr_0 FROM ContainsIntegers c0_', + 'multiple expressions' => 'SELECT greatest(SQRT(30) * 100, SQRT(11) * 150) AS sclr_0 FROM ContainsIntegers c0_', ]; } protected function getDqlStatements(): array { return [ - \sprintf('SELECT GREATEST(e.integer1, e.integer2, e.integer3) FROM %s e', ContainsIntegers::class), + 'multiple column values' => \sprintf('SELECT GREATEST(e.integer1, e.integer2, e.integer3) FROM %s e', ContainsIntegers::class), + 'column value with expression' => \sprintf('SELECT GREATEST(e.integer1 * 100, sqrt(11) * 150) FROM %s e', ContainsIntegers::class), + 'multiple expressions' => \sprintf('SELECT GREATEST(sqrt(30) * 100, sqrt(11) * 150) FROM %s e', ContainsIntegers::class), ]; } diff --git a/tests/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/LeastTest.php b/tests/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/LeastTest.php index dab36589..6d99df1c 100644 --- a/tests/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/LeastTest.php +++ b/tests/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/LeastTest.php @@ -26,14 +26,18 @@ protected function getStringFunctions(): array protected function getExpectedSqlStatements(): array { return [ - 'SELECT least(c0_.integer1, c0_.integer2, c0_.integer3) AS sclr_0 FROM ContainsIntegers c0_', + 'multiple column values' => 'SELECT least(c0_.integer1, c0_.integer2, c0_.integer3) AS sclr_0 FROM ContainsIntegers c0_', + 'column value with expression' => 'SELECT least(c0_.integer1 * 100, SQRT(11) * 150) AS sclr_0 FROM ContainsIntegers c0_', + 'multiple expressions' => 'SELECT least(SQRT(30) * 100, SQRT(11) * 150) AS sclr_0 FROM ContainsIntegers c0_', ]; } protected function getDqlStatements(): array { return [ - \sprintf('SELECT LEAST(e.integer1, e.integer2, e.integer3) FROM %s e', ContainsIntegers::class), + 'multiple column values' => \sprintf('SELECT LEAST(e.integer1, e.integer2, e.integer3) FROM %s e', ContainsIntegers::class), + 'column value with expression' => \sprintf('SELECT LEAST(e.integer1 * 100, sqrt(11) * 150) FROM %s e', ContainsIntegers::class), + 'multiple expressions' => \sprintf('SELECT LEAST(sqrt(30) * 100, sqrt(11) * 150) FROM %s e', ContainsIntegers::class), ]; }