diff --git a/tests/QueryBuilderTest.php b/tests/QueryBuilderTest.php index dbd2ec7b..c24e87d5 100644 --- a/tests/QueryBuilderTest.php +++ b/tests/QueryBuilderTest.php @@ -15,6 +15,7 @@ use Yiisoft\Db\Expression\ExpressionInterface; use Yiisoft\Db\Expression\Function\ArrayMerge; use Yiisoft\Db\Expression\Value\Param; +use Yiisoft\Db\Expression\Value\Identifier; use Yiisoft\Db\Query\Query; use Yiisoft\Db\Query\QueryInterface; use Yiisoft\Db\Query\WithQuery; @@ -810,4 +811,27 @@ public function testArrayMergeWithOrdering(): void $this->assertEquals('[1,2,3,4,5,6,7,9,10]', $result); } + + public static function dataBuildIdentifier(): iterable + { + yield ['name', '"name"']; + yield ['t.name', '"t"."name"']; + yield ['s.t.name', '"s"."t"."name"']; + yield [['t', 'na.me'], '"t"."na.me"']; + yield ['LOWER(name)', '"LOWER(name)"']; + yield ['[[name]]', '"[[name]]"']; + yield ['{{%t}}.name', '"{{%t}}"."name"']; + yield ['*', '"*"']; + yield ['arr[1]', '"arr[1]"']; + yield ['a"b', '"a""b"']; + yield ['"a" DESC; DROP TABLE t; --', '"""a"" DESC; DROP TABLE t; --"']; + } + + #[DataProvider('dataBuildIdentifier')] + public function testBuildIdentifier(string|array $name, string $expected): void + { + $qb = $this->getSharedConnection()->getQueryBuilder(); + + $this->assertSame($expected, $qb->buildExpression(new Identifier($name))); + } } diff --git a/tests/QueryTest.php b/tests/QueryTest.php index a62c5705..045c4cfa 100644 --- a/tests/QueryTest.php +++ b/tests/QueryTest.php @@ -83,4 +83,11 @@ public function testLikeCaseSensitive(mixed $expected, string $value): void $this->expectExceptionMessage('SQLite doesn\'t support case-sensitive "LIKE" conditions.'); $query->scalar(); } + + public static function dataIdentifierColumnName(): iterable + { + yield from parent::dataIdentifierColumnName(); + yield 'quote: a"b' => ['a"b']; + yield 'quote: "a"' => ['"a"']; + } }