diff --git a/tests/WP_SQLite_Translator_Tests.php b/tests/WP_SQLite_Translator_Tests.php index f7f7242..d0e5c19 100644 --- a/tests/WP_SQLite_Translator_Tests.php +++ b/tests/WP_SQLite_Translator_Tests.php @@ -871,7 +871,7 @@ enum_column ENUM('a', 'b', 'c') NOT NULL DEFAULT 'a', ); } - public function testAlterTableAddColumn() { + public function testAlterTableAddAndDropColumn() { $result = $this->assertQuery( "CREATE TABLE _tmp_table ( name varchar(20) NOT NULL default '' @@ -905,6 +905,90 @@ public function testAlterTableAddColumn() { ), $results ); + + $result = $this->assertQuery( 'ALTER TABLE _tmp_table ADD `column2` int;' ); + $this->assertEquals( '', $this->engine->get_error_message() ); + $this->assertEquals( 1, $result ); + + $this->assertQuery( 'DESCRIBE _tmp_table;' ); + $results = $this->engine->get_query_results(); + $this->assertEquals( + array( + (object) array( + 'Field' => 'name', + 'Type' => 'varchar(20)', + 'Null' => 'NO', + 'Key' => '', + 'Default' => '', + 'Extra' => '', + ), + (object) array( + 'Field' => 'column', + 'Type' => 'int', + 'Null' => 'YES', + 'Key' => '', + 'Default' => null, + 'Extra' => '', + ), + (object) array( + 'Field' => 'column2', + 'Type' => 'int', + 'Null' => 'YES', + 'Key' => '', + 'Default' => null, + 'Extra' => '', + ), + ), + $results + ); + + $result = $this->assertQuery( 'ALTER TABLE _tmp_table DROP COLUMN `column`;' ); + $this->assertEquals( '', $this->engine->get_error_message() ); + $this->assertEquals( 1, $result ); + + $this->assertQuery( 'DESCRIBE _tmp_table;' ); + $results = $this->engine->get_query_results(); + $this->assertEquals( + array( + (object) array( + 'Field' => 'name', + 'Type' => 'varchar(20)', + 'Null' => 'NO', + 'Key' => '', + 'Default' => '', + 'Extra' => '', + ), + (object) array( + 'Field' => 'column2', + 'Type' => 'int', + 'Null' => 'YES', + 'Key' => '', + 'Default' => null, + 'Extra' => '', + ), + ), + $results + ); + + $result = $this->assertQuery( 'ALTER TABLE _tmp_table DROP `column2`;' ); + $this->assertEquals( '', $this->engine->get_error_message() ); + $this->assertEquals( 1, $result ); + + $this->assertQuery( 'DESCRIBE _tmp_table;' ); + $results = $this->engine->get_query_results(); + $this->assertEquals( + array( + (object) array( + 'Field' => 'name', + 'Type' => 'varchar(20)', + 'Null' => 'NO', + 'Key' => '', + 'Default' => '', + 'Extra' => '', + ), + ), + $results + ); } public function testAlterTableAddNotNullVarcharColumn() { diff --git a/wp-includes/sqlite/class-wp-sqlite-translator.php b/wp-includes/sqlite/class-wp-sqlite-translator.php index 489a5d5..431c9c0 100644 --- a/wp-includes/sqlite/class-wp-sqlite-translator.php +++ b/wp-includes/sqlite/class-wp-sqlite-translator.php @@ -2921,8 +2921,12 @@ private function execute_alter() { $mysql_index_type = $this->normalize_mysql_index_type( $op_subject ); $is_index_op = (bool) $mysql_index_type; - if ( 'ADD' === $op_type && 'COLUMN' === $op_subject ) { - $column_name = $this->rewriter->consume()->value; + if ( 'ADD' === $op_type && ! $is_index_op ) { + if ( 'COLUMN' === $op_subject ) { + $column_name = $this->rewriter->consume()->value; + } else { + $column_name = $op_subject; + } $skip_mysql_data_type_parts = $this->skip_mysql_data_type(); $sqlite_data_type = $skip_mysql_data_type_parts[0]; @@ -2940,7 +2944,7 @@ private function execute_alter() { $column_name, $mysql_data_type ); - } elseif ( 'DROP' === $op_type && 'COLUMN' === $op_subject ) { + } elseif ( 'DROP' === $op_type && ! $is_index_op ) { $this->rewriter->consume_all(); } elseif ( 'CHANGE' === $op_type ) { // Parse the new column definition.