packages/ztd-query-mysql/tests/Unit/Rewrite/LoadData/InsertQueryTest.php
1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Rewrite\LoadData;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\TestCase;
9use ZtdQuery\Platform\MySql\Rewrite\LoadData\InsertQuery;
10
11#[\PHPUnit\Framework\Attributes\UsesClass(\ZtdQuery\Platform\MySql\Sql\MySqlIdentifierQuoter::class)]
12#[CoversClass(InsertQuery::class)]
13final class InsertQueryTest extends TestCase
14{
15 public function testOrderedColumns(): void
16 {
17 $definition = new \ZtdQuery\Schema\TableDefinition(['id', 'name', 'score'], [], [], [], [], generatedExpressions: ['score' => 'id * 2']);
18 $query = new InsertQuery(new \ZtdQuery\Platform\MySql\Sql\MySqlIdentifierQuoter());
19 self::assertSame(['id', 'name'], $query->orderedColumns(['name', '@raw', 'id'], ['name' => '@raw'], $definition));
20 }
21
22 public function testBuildInsertSql(): void
23 {
24 $sql = "LOAD DATA INFILE 'input.csv' INTO TABLE t";
25 $statement = (new \PhpMyAdmin\SqlParser\Parser($sql))->statements[0];
26 self::assertInstanceOf(\PhpMyAdmin\SqlParser\Statements\LoadStatement::class, $statement);
27 $definition = new \ZtdQuery\Schema\TableDefinition(['id', 'name', 'score'], [], [], [], [], generatedExpressions: ['score' => 'id * 2']);
28 $query = new InsertQuery(new \ZtdQuery\Platform\MySql\Sql\MySqlIdentifierQuoter());
29 self::assertSame("INSERT INTO `t` (`id`, `name`) VALUES (1, 'hello'), (2, DEFAULT)", $query->buildInsertSql($statement, 't', $definition, ['id', 'name'], [], [['id' => '1', 'name' => "'hello'"], ['id' => '2']]));
30 self::assertSame('INSERT INTO `t` (`id`) SELECT NULL AS `id` WHERE FALSE', $query->buildInsertSql($statement, 't', $definition, ['id'], [], []));
31 }
32
33 public function testBuildInsertSqlLocalAndReplace(): void
34 {
35 $sql = "LOAD DATA LOCAL INFILE 'input.csv' INTO TABLE t";
36 $statement = (new \PhpMyAdmin\SqlParser\Parser($sql))->statements[0];
37 self::assertInstanceOf(\PhpMyAdmin\SqlParser\Statements\LoadStatement::class, $statement);
38 $definition = new \ZtdQuery\Schema\TableDefinition(['id', 'name', 'score'], [], [], [], [], generatedExpressions: ['score' => 'id * 2']);
39 $query = new InsertQuery(new \ZtdQuery\Platform\MySql\Sql\MySqlIdentifierQuoter());
40 self::assertSame('INSERT IGNORE INTO `t` (`id`) VALUES (1)', $query->buildInsertSql($statement, 't', $definition, ['id'], [], [['id' => '1']]));
41 $statement->replace_ignore = 'REPLACE';
42 self::assertSame('REPLACE INTO `t` (`id`) VALUES (1)', $query->buildInsertSql($statement, 't', $definition, ['id'], [], [['id' => '1']]));
43 }
44
45}
46