From 13f780096f65379b1c66968f38538183bf1745d2 Mon Sep 17 00:00:00 2001 From: abu-tahir-0 Date: Sun, 15 Nov 2026 01:14:09 +0530 Subject: [PATCH] fix(database): prevent incorrect identifier quoting inside function field expressions --- .../src/QueryStatements/FieldStatement.php | 30 +++++++++---------- .../QueryStatements/FieldStatementTest.php | 17 ++++++++++- 2 files changed, 30 insertions(+), 17 deletions(-) diff --git a/packages/database/src/QueryStatements/FieldStatement.php b/packages/database/src/QueryStatements/FieldStatement.php index 2ad2eac153..4fe24e891a 100644 --- a/packages/database/src/QueryStatements/FieldStatement.php +++ b/packages/database/src/QueryStatements/FieldStatement.php @@ -37,22 +37,20 @@ public function compile(DatabaseDialect $dialect): string $alias = trim($parts[1], '`" '); } - $field = arr(explode('.', $field)) - ->map(fn (string $part) => trim($part, '`" ')) - ->map( - function (string $part) use ($dialect) { - if (str_contains($part, '(')) { - return $part; - } - - if ($dialect === DatabaseDialect::SQLITE) { - return $part; - } - - return $dialect->quoteIdentifier($part); - }, - ) - ->implode('.'); + if (! str_contains($field, '(')) { + $field = arr(explode('.', $field)) + ->map(fn (string $part) => trim($part, '`" ')) + ->map( + function (string $part) use ($dialect) { + if ($dialect === DatabaseDialect::SQLITE) { + return $part; + } + + return $dialect->quoteIdentifier($part); + }, + ) + ->implode('.'); + } if ($alias === null) { return $field; diff --git a/packages/database/tests/QueryStatements/FieldStatementTest.php b/packages/database/tests/QueryStatements/FieldStatementTest.php index 9e92d3009c..5f80468645 100644 --- a/packages/database/tests/QueryStatements/FieldStatementTest.php +++ b/packages/database/tests/QueryStatements/FieldStatementTest.php @@ -24,7 +24,12 @@ public function sqlite(): void $this->assertSame( 'COUNT(*) AS `count`', - new FieldStatement('COUNT(*) AS count')->compile(DatabaseDialect::MYSQL), + new FieldStatement('COUNT(*) AS count')->compile(DatabaseDialect::SQLITE), + ); + + $this->assertSame( + 'COUNT(item.id) AS `count`', + new FieldStatement('COUNT(item.id) AS count')->compile(DatabaseDialect::SQLITE), ); } @@ -45,6 +50,11 @@ public function mysql(): void 'COUNT(*) AS `count`', new FieldStatement('COUNT(*) AS count')->compile(DatabaseDialect::MYSQL), ); + + $this->assertSame( + 'COUNT(item.id) AS `count`', + new FieldStatement('COUNT(item.id) AS count')->compile(DatabaseDialect::MYSQL), + ); } #[Test] @@ -59,6 +69,11 @@ public function postgres(): void '"table"."field"', new FieldStatement('table.field')->compile(DatabaseDialect::POSTGRESQL), ); + + $this->assertSame( + 'COUNT(item.id) AS "count"', + new FieldStatement('COUNT(item.id) AS count')->compile(DatabaseDialect::POSTGRESQL), + ); } #[Test]