Skip to content

Commit 169192b

Browse files
fix: avoid infinite parsing loop for GREATEST() and LEAST() by using SimpleArithmeticExpression (#338)
1 parent 88dce8e commit 169192b

File tree

3 files changed

+13
-5
lines changed

3 files changed

+13
-5
lines changed

src/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/BaseComparisonFunction.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,5 +11,5 @@
1111
*/
1212
abstract class BaseComparisonFunction extends BaseVariadicFunction
1313
{
14-
protected string $commonNodeMapping = 'ArithmeticPrimary';
14+
protected string $commonNodeMapping = 'SimpleArithmeticExpression';
1515
}

tests/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/GreatestTest.php

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,14 +26,18 @@ protected function getStringFunctions(): array
2626
protected function getExpectedSqlStatements(): array
2727
{
2828
return [
29-
'SELECT greatest(c0_.integer1, c0_.integer2, c0_.integer3) AS sclr_0 FROM ContainsIntegers c0_',
29+
'multiple column values' => 'SELECT greatest(c0_.integer1, c0_.integer2, c0_.integer3) AS sclr_0 FROM ContainsIntegers c0_',
30+
'column value with expression' => 'SELECT greatest(c0_.integer1 * 100, SQRT(11) * 150) AS sclr_0 FROM ContainsIntegers c0_',
31+
'multiple expressions' => 'SELECT greatest(SQRT(30) * 100, SQRT(11) * 150) AS sclr_0 FROM ContainsIntegers c0_',
3032
];
3133
}
3234

3335
protected function getDqlStatements(): array
3436
{
3537
return [
36-
\sprintf('SELECT GREATEST(e.integer1, e.integer2, e.integer3) FROM %s e', ContainsIntegers::class),
38+
'multiple column values' => \sprintf('SELECT GREATEST(e.integer1, e.integer2, e.integer3) FROM %s e', ContainsIntegers::class),
39+
'column value with expression' => \sprintf('SELECT GREATEST(e.integer1 * 100, sqrt(11) * 150) FROM %s e', ContainsIntegers::class),
40+
'multiple expressions' => \sprintf('SELECT GREATEST(sqrt(30) * 100, sqrt(11) * 150) FROM %s e', ContainsIntegers::class),
3741
];
3842
}
3943

tests/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/LeastTest.php

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,14 +26,18 @@ protected function getStringFunctions(): array
2626
protected function getExpectedSqlStatements(): array
2727
{
2828
return [
29-
'SELECT least(c0_.integer1, c0_.integer2, c0_.integer3) AS sclr_0 FROM ContainsIntegers c0_',
29+
'multiple column values' => 'SELECT least(c0_.integer1, c0_.integer2, c0_.integer3) AS sclr_0 FROM ContainsIntegers c0_',
30+
'column value with expression' => 'SELECT least(c0_.integer1 * 100, SQRT(11) * 150) AS sclr_0 FROM ContainsIntegers c0_',
31+
'multiple expressions' => 'SELECT least(SQRT(30) * 100, SQRT(11) * 150) AS sclr_0 FROM ContainsIntegers c0_',
3032
];
3133
}
3234

3335
protected function getDqlStatements(): array
3436
{
3537
return [
36-
\sprintf('SELECT LEAST(e.integer1, e.integer2, e.integer3) FROM %s e', ContainsIntegers::class),
38+
'multiple column values' => \sprintf('SELECT LEAST(e.integer1, e.integer2, e.integer3) FROM %s e', ContainsIntegers::class),
39+
'column value with expression' => \sprintf('SELECT LEAST(e.integer1 * 100, sqrt(11) * 150) FROM %s e', ContainsIntegers::class),
40+
'multiple expressions' => \sprintf('SELECT LEAST(sqrt(30) * 100, sqrt(11) * 150) FROM %s e', ContainsIntegers::class),
3741
];
3842
}
3943

0 commit comments

Comments
 (0)