packages/ztd-query-mysql/tests/Unit/Sql/Dml/InsertSelectSourceExtractorTest.php
1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Sql\Dml;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\Attributes\DataProvider;
9use PHPUnit\Framework\Attributes\UsesClass;
10use PHPUnit\Framework\TestCase;
11use ZtdQuery\Platform\MySql\Sql\Dml\InsertSelectSourceExtractor;
12
13#[CoversClass(InsertSelectSourceExtractor::class)]
14#[UsesClass(\ZtdQuery\Platform\MySql\Sql\MySqlLexerProfile::class)]
15final class InsertSelectSourceExtractorTest extends TestCase
16{
17 #[DataProvider('providerSources')]
18 public function testExtract(string $sql, ?string $expected): void
19 {
20 self::assertSame($expected, (new InsertSelectSourceExtractor())->extract($sql));
21 }
22
23 /**
24 * @return iterable<string, array{string, string|null}>
25 */
26 public static function providerSources(): iterable
27 {
28 yield 'union all' => [
29 'INSERT INTO combined (name, amount) SELECT name, amount FROM archive UNION ALL SELECT name, amount FROM current',
30 'SELECT name, amount FROM archive UNION ALL SELECT name, amount FROM current',
31 ];
32 yield 'nested select' => [
33 'INSERT INTO combined SELECT * FROM (SELECT id FROM archive UNION SELECT id FROM current) AS source',
34 'SELECT * FROM (SELECT id FROM archive UNION SELECT id FROM current) AS source',
35 ];
36 yield 'upsert suffix' => [
37 'INSERT INTO combined SELECT id FROM source ON DUPLICATE KEY UPDATE id = VALUES(id)',
38 'SELECT id FROM source',
39 ];
40 yield 'quoted keywords' => [
41 "INSERT INTO combined SELECT 'ON DUPLICATE KEY UPDATE', 'RETURNING' FROM source",
42 "SELECT 'ON DUPLICATE KEY UPDATE', 'RETURNING' FROM source",
43 ];
44 yield 'values insert' => ['INSERT INTO combined VALUES (1)', null];
45 yield 'empty select' => ['INSERT INTO combined SELECT', null];
46 }
47}
48