From 4b9aeebd34f0861b9ee1cabbc2f4c0a2cd2f3f8c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Jake=C5=A1?= Date: Fri, 3 Apr 2026 12:46:10 +0200 Subject: [PATCH] Add support for INSERT without INTO --- .../sqlite/class-wp-pdo-mysql-on-sqlite.php | 5 ++++ .../tests/WP_SQLite_Driver_Tests.php | 28 +++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/packages/mysql-on-sqlite/src/sqlite/class-wp-pdo-mysql-on-sqlite.php b/packages/mysql-on-sqlite/src/sqlite/class-wp-pdo-mysql-on-sqlite.php index 27b44cc8..15e184cb 100644 --- a/packages/mysql-on-sqlite/src/sqlite/class-wp-pdo-mysql-on-sqlite.php +++ b/packages/mysql-on-sqlite/src/sqlite/class-wp-pdo-mysql-on-sqlite.php @@ -1835,6 +1835,11 @@ private function execute_insert_or_replace_statement( WP_Parser_Node $node ): vo $is_node = $child instanceof WP_Parser_Node; if ( $child instanceof WP_Parser_Node && 'tableRef' === $child->rule_name ) { + // MySQL supports INSERT without the INTO keyword; SQLite requires it. + if ( ! $node->has_child_token( WP_MySQL_Lexer::INTO_SYMBOL ) ) { + $parts[] = 'INTO'; + } + $database = $this->get_database_name( $child ); if ( 'information_schema' === strtolower( $database ) ) { throw $this->new_access_denied_to_information_schema_exception(); diff --git a/packages/mysql-on-sqlite/tests/WP_SQLite_Driver_Tests.php b/packages/mysql-on-sqlite/tests/WP_SQLite_Driver_Tests.php index 4cb7c0c1..f95d693c 100644 --- a/packages/mysql-on-sqlite/tests/WP_SQLite_Driver_Tests.php +++ b/packages/mysql-on-sqlite/tests/WP_SQLite_Driver_Tests.php @@ -9986,6 +9986,34 @@ public function testCastExpression(): void { ); } + public function testInsertWithoutInto(): void { + $this->assertQuery( 'CREATE TABLE t (id INT PRIMARY KEY, name VARCHAR(255))' ); + + // INSERT ... VALUES + $this->assertQuery( "INSERT t (id, name) VALUES (1, 'a')" ); + + // INSERT IGNORE + $this->assertQuery( "INSERT IGNORE t (id, name) VALUES (1, 'a')" ); + + // INSERT ... SET + $this->assertQuery( "INSERT t SET id = 2, name = 'b'" ); + + // INSERT IGNORE ... SET + $this->assertQuery( "INSERT IGNORE t SET id = 2, name = 'b'" ); + + // INSERT ... SELECT + $this->assertQuery( "INSERT t (id, name) SELECT 3, 'c'" ); + + // INSERT IGNORE ... SELECT + $this->assertQuery( "INSERT IGNORE t (id, name) SELECT 3, 'c'" ); + + $res = $this->assertQuery( 'SELECT * FROM t ORDER BY id' ); + $this->assertCount( 3, $res ); + $this->assertEquals( 'a', $res[0]->name ); + $this->assertEquals( 'b', $res[1]->name ); + $this->assertEquals( 'c', $res[2]->name ); + } + public function testInsertIntoSetSyntax(): void { $this->assertQuery( 'CREATE TABLE t (