Skip to content

Commit ebb943e

Browse files
committed
Merge branch '5.11.x'
2 parents c77153a + 0195e94 commit ebb943e

File tree

2 files changed

+52
-52
lines changed

2 files changed

+52
-52
lines changed

src/Components/IntoKeyword.php

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
namespace PhpMyAdmin\SqlParser\Components;
66

77
use PhpMyAdmin\SqlParser\Component;
8+
use PhpMyAdmin\SqlParser\Context;
89
use PhpMyAdmin\SqlParser\Parser;
910
use PhpMyAdmin\SqlParser\Parsers\Expressions;
1011
use PhpMyAdmin\SqlParser\Parsers\OptionsArrays;
@@ -141,7 +142,9 @@ public function parseFileOptions(Parser $parser, TokensList $list, string $keywo
141142
public function build(): string
142143
{
143144
if ($this->dest instanceof Expression) {
144-
$columns = ! empty($this->columns) ? '(`' . implode('`, `', $this->columns) . '`)' : '';
145+
$columns = $this->columns === null || $this->columns === []
146+
? ''
147+
: '(' . implode(', ', Context::escape($this->columns)) . ')';
145148

146149
return $this->dest . $columns;
147150
}

tests/Builder/InsertStatementTest.php

Lines changed: 48 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -4,64 +4,61 @@
44

55
namespace PhpMyAdmin\SqlParser\Tests\Builder;
66

7+
use Generator;
8+
use PhpMyAdmin\SqlParser\Context;
79
use PhpMyAdmin\SqlParser\Parser;
810
use PhpMyAdmin\SqlParser\Tests\TestCase;
911

1012
class InsertStatementTest extends TestCase
1113
{
12-
public function testBuilder(): void
14+
/** @var int */
15+
private $sqlMode;
16+
17+
public function setUp(): void
1318
{
14-
/* Assertion 1 */
15-
$parser = new Parser('INSERT INTO tbl(`col1`, `col2`, `col3`) VALUES (1, "str", 3.14)');
16-
$stmt = $parser->statements[0];
17-
$this->assertEquals(
18-
'INSERT INTO tbl(`col1`, `col2`, `col3`) VALUES (1, "str", 3.14)',
19-
$stmt->build(),
20-
);
21-
22-
/* Assertion 2 */
23-
/* Reserved keywords (with backquotes as field name) */
24-
$parser = new Parser('INSERT INTO tbl(`order`) VALUES (1)');
25-
$stmt = $parser->statements[0];
26-
$this->assertEquals(
27-
'INSERT INTO tbl(`order`) VALUES (1)',
28-
$stmt->build(),
29-
);
30-
31-
/* Assertion 3 */
32-
/* INSERT ... SET ... */
33-
$parser = new Parser('INSERT INTO tbl SET FOO = 1');
34-
$stmt = $parser->statements[0];
35-
$this->assertEquals(
36-
'INSERT INTO tbl SET FOO = 1',
37-
$stmt->build(),
38-
);
39-
40-
/* Assertion 4 */
41-
/* INSERT ... SELECT ... */
42-
$parser = new Parser('INSERT INTO tbl SELECT * FROM bar');
43-
$stmt = $parser->statements[0];
44-
$this->assertEquals(
45-
'INSERT INTO tbl SELECT * FROM bar',
46-
$stmt->build(),
47-
);
48-
49-
/* Assertion 5 */
50-
/* INSERT ... ON DUPLICATE KEY UPDATE ... */
51-
$parser = new Parser('INSERT INTO tbl SELECT * FROM bar ON DUPLICATE KEY UPDATE baz = 1');
19+
parent::setUp();
20+
21+
$this->sqlMode = Context::getMode();
22+
}
23+
24+
protected function tearDown(): void
25+
{
26+
Context::setMode($this->sqlMode);
27+
28+
parent::tearDown();
29+
}
30+
31+
/** @dataProvider providerForTestBuilder */
32+
public function testBuilder(string $sql): void
33+
{
34+
$parser = new Parser($sql);
5235
$stmt = $parser->statements[0];
53-
$this->assertEquals(
54-
'INSERT INTO tbl SELECT * FROM bar ON DUPLICATE KEY UPDATE baz = 1',
55-
$stmt->build(),
56-
);
57-
58-
/* Assertion 6 */
59-
/* INSERT [OPTIONS] INTO ... */
60-
$parser = new Parser('INSERT DELAYED IGNORE INTO tbl SELECT * FROM bar');
36+
self::assertEquals($sql, $stmt->build());
37+
}
38+
39+
/** @return Generator<string, list<string>> */
40+
public function providerForTestBuilder(): Generator
41+
{
42+
yield 'INSERT ... VALUES ...' => ['INSERT INTO tbl(`col1`, `col2`, `col3`) VALUES (1, "str", 3.14)'];
43+
44+
yield 'Reserved keywords (with backquotes as field name)' => ['INSERT INTO tbl(`order`) VALUES (1)'];
45+
46+
yield 'INSERT ... SET ...' => ['INSERT INTO tbl SET FOO = 1'];
47+
48+
yield 'INSERT ... SELECT ... ' => ['INSERT INTO tbl SELECT * FROM bar'];
49+
50+
yield 'INSERT ... ON DUPLICATE KEY UPDATE ...' =>
51+
['INSERT INTO tbl SELECT * FROM bar ON DUPLICATE KEY UPDATE baz = 1'];
52+
53+
yield 'INSERT [OPTIONS] INTO ...' => ['INSERT DELAYED IGNORE INTO tbl SELECT * FROM bar'];
54+
}
55+
56+
public function testBuilderAnsi(): void
57+
{
58+
Context::setMode(Context::SQL_MODE_ANSI_QUOTES);
59+
$sql = "INSERT INTO foo (bar, baz) VALUES ('bar', 'baz')";
60+
$parser = new Parser($sql);
6161
$stmt = $parser->statements[0];
62-
$this->assertEquals(
63-
'INSERT DELAYED IGNORE INTO tbl SELECT * FROM bar',
64-
$stmt->build(),
65-
);
62+
self::assertEquals('INSERT INTO foo("bar", "baz") VALUES (\'bar\', \'baz\')', $stmt->build());
6663
}
6764
}

0 commit comments

Comments
 (0)