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