Skip to content

Commit ea8c36f

Browse files
committed
Use quote_identifier() consistently in the legacy SQLite translator
1 parent 0650983 commit ea8c36f

2 files changed

Lines changed: 138 additions & 58 deletions

File tree

tests/WP_SQLite_Translator_Tests.php

Lines changed: 38 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1170,14 +1170,14 @@ public function testColumnWithOnUpdate() {
11701170
'name' => '___tmp_table_created_at_on_update__',
11711171
'tbl_name' => '_tmp_table',
11721172
'rootpage' => '0',
1173-
'sql' => "CREATE TRIGGER \"___tmp_table_created_at_on_update__\"\n\t\t\tAFTER UPDATE ON \"_tmp_table\"\n\t\t\tFOR EACH ROW\n\t\t\tBEGIN\n\t\t\t UPDATE \"_tmp_table\" SET \"created_at\" = CURRENT_TIMESTAMP WHERE rowid = NEW.rowid;\n\t\t\tEND",
1173+
'sql' => "CREATE TRIGGER `___tmp_table_created_at_on_update__`\n\t\t\tAFTER UPDATE ON `_tmp_table`\n\t\t\tFOR EACH ROW\n\t\t\tBEGIN\n\t\t\t UPDATE `_tmp_table` SET `created_at` = CURRENT_TIMESTAMP WHERE rowid = NEW.rowid;\n\t\t\tEND",
11741174
),
11751175
(object) array(
11761176
'type' => 'trigger',
11771177
'name' => '___tmp_table_updated_at_on_update__',
11781178
'tbl_name' => '_tmp_table',
11791179
'rootpage' => '0',
1180-
'sql' => "CREATE TRIGGER \"___tmp_table_updated_at_on_update__\"\n\t\t\tAFTER UPDATE ON \"_tmp_table\"\n\t\t\tFOR EACH ROW\n\t\t\tBEGIN\n\t\t\t UPDATE \"_tmp_table\" SET \"updated_at\" = CURRENT_TIMESTAMP WHERE rowid = NEW.rowid;\n\t\t\tEND",
1180+
'sql' => "CREATE TRIGGER `___tmp_table_updated_at_on_update__`\n\t\t\tAFTER UPDATE ON `_tmp_table`\n\t\t\tFOR EACH ROW\n\t\t\tBEGIN\n\t\t\t UPDATE `_tmp_table` SET `updated_at` = CURRENT_TIMESTAMP WHERE rowid = NEW.rowid;\n\t\t\tEND",
11811181
),
11821182
),
11831183
$results
@@ -3557,4 +3557,40 @@ public function testCreateTableWithDefaultNowFunction() {
35573557
$result = $this->assertQuery( 'SELECT * FROM test_now_default WHERE id = 2' );
35583558
$this->assertRegExp( '/\d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d/', $result[0]->updated );
35593559
}
3560+
3561+
public function testQuoteIdentifierEscapesBackticks() {
3562+
// Create a table with a backtick in the column name using double-quote
3563+
// quoting (MySQL syntax). The translator must properly escape the
3564+
// backtick when generating SQLite DDL with backtick-quoted identifiers.
3565+
$this->assertQuery(
3566+
'CREATE TABLE _tmp_backtick_test (
3567+
ID INTEGER PRIMARY KEY AUTO_INCREMENT NOT NULL,
3568+
"col`name" varchar(50) NOT NULL
3569+
);'
3570+
);
3571+
3572+
$this->assertQuery( "INSERT INTO _tmp_backtick_test (ID, \"col`name\") VALUES (1, 'value1')" );
3573+
3574+
$result = $this->assertQuery( 'SELECT * FROM _tmp_backtick_test WHERE ID = 1' );
3575+
$this->assertCount( 1, $result );
3576+
$this->assertEquals( 'value1', $result[0]->{'col`name'} );
3577+
3578+
// Verify the column appears in DESCRIBE output.
3579+
$description = $this->assertQuery( 'DESCRIBE _tmp_backtick_test' );
3580+
$column_names = array_map(
3581+
function ( $row ) {
3582+
return $row->Field;
3583+
},
3584+
$description
3585+
);
3586+
$this->assertContains( 'col`name', $column_names );
3587+
3588+
// Verify SHOW CREATE TABLE produces valid, parseable output.
3589+
$create = $this->assertQuery( 'SHOW CREATE TABLE _tmp_backtick_test' );
3590+
$create_sql = $create[0]->{'Create Table'};
3591+
$this->assertStringContainsString( '`col``name`', $create_sql );
3592+
3593+
// Verify autoincrement detection works with backtick-quoted identifiers.
3594+
$this->assertStringContainsString( 'AUTO_INCREMENT', $create_sql );
3595+
}
35603596
}

0 commit comments

Comments
 (0)