diff --git a/pg4wp/rewriters/AlterTableSQLRewriter.php b/pg4wp/rewriters/AlterTableSQLRewriter.php index 5fccd84..191d099 100644 --- a/pg4wp/rewriters/AlterTableSQLRewriter.php +++ b/pg4wp/rewriters/AlterTableSQLRewriter.php @@ -31,28 +31,62 @@ class AlterTableSQLRewriter extends AbstractSQLRewriter $sql = $this->rewrite_numeric_type($sql); + if (str_contains($sql, 'ADD INDEX') || str_contains($sql, 'ADD UNIQUE INDEX')) { + $sql = $this->rewriteAddIndex($sql); + return $sql; + } if (str_contains($sql, 'CHANGE COLUMN')) { $sql = $this->rewriteChangeColumn($sql); + return $sql; } if (str_contains($sql, 'ALTER COLUMN')) { $sql = $this->rewriteAlterColumn($sql); + return $sql; } if (str_contains($sql, 'ADD COLUMN')) { $sql = $this->rewriteAddColumn($sql); + return $sql; } if (str_contains($sql, 'ADD KEY') || str_contains($sql, 'ADD UNIQUE KEY')) { $sql = $this->rewriteAddKey($sql); + return $sql; } if (str_contains($sql, 'DROP INDEX')) { $sql = $this->rewriteDropIndex($sql); + return $sql; } if (str_contains($sql, 'DROP PRIMARY KEY')) { $sql = $this->rewriteDropPrimaryKey($sql); + return $sql; } return $sql; } + private function rewriteAddIndex(string $sql): string + { + $pattern = '/ALTER TABLE\s+(\w+)\s+ADD (UNIQUE |)INDEX\s+([^\s]+)\s+\(((?:[^\(\)]+|\([^\(\)]+\))+)\)/'; + + if(1 === preg_match($pattern, $sql, $matches)) { + $table = $matches[1]; + $unique = $matches[2]; + $index = $matches[3]; + $columns = $matches[4]; + + // Remove prefix indexing + // Rarely used and apparently unnecessary for current uses + $columns = preg_replace('/\([^\)]*\)/', '', $columns); + + // Workaround for index name duplicate + $index = $table . '_' . $index; + + // Add backticks around index name and column name, and include IF NOT EXISTS clause + $sql = "CREATE {$unique}INDEX IF NOT EXISTS `{$index}` ON `{$table}` (`{$columns}`)"; + } + + return $sql; + } + private function rewriteChangeColumn(string $sql): string { $pattern = '/ALTER TABLE\s+(\w+)\s+CHANGE COLUMN\s+([^\s]+)\s+([^\s]+)\s+([^ ]+)( unsigned|)\s*(NOT NULL|)\s*(default (.+)|)/'; @@ -164,7 +198,7 @@ class AlterTableSQLRewriter extends AbstractSQLRewriter if(1 === preg_match($pattern, $sql, $matches)) { $table = $matches[1]; $index = $matches[2]; - $sql = "DROP INDEX ${table}_${index}"; + $sql = "DROP INDEX {$table}_{$index}"; } return $sql; @@ -176,7 +210,7 @@ class AlterTableSQLRewriter extends AbstractSQLRewriter if(1 === preg_match($pattern, $sql, $matches)) { $table = $matches[1]; - $sql = "ALTER TABLE ${table} DROP CONSTRAINT ${table}_pkey"; + $sql = "ALTER TABLE {$table} DROP CONSTRAINT {$table}_pkey"; } return $sql; diff --git a/pg4wp/rewriters/SelectSQLRewriter.php b/pg4wp/rewriters/SelectSQLRewriter.php index ea861d9..129dbb1 100644 --- a/pg4wp/rewriters/SelectSQLRewriter.php +++ b/pg4wp/rewriters/SelectSQLRewriter.php @@ -123,7 +123,6 @@ class SelectSQLRewriter extends AbstractSQLRewriter if(isset($wpdb)) { $sql = str_replace('GROUP BY ' . $wpdb->prefix . 'posts.ID', '', $sql); } - $sql = str_replace("!= ''", '<> 0', $sql); // MySQL 'LIKE' is case insensitive by default, whereas PostgreSQL 'LIKE' is $sql = str_replace(' LIKE ', ' ILIKE ', $sql); diff --git a/phpunit.xml b/phpunit.xml index 02f5990..0078610 100644 --- a/phpunit.xml +++ b/phpunit.xml @@ -1,9 +1,12 @@ - + tests diff --git a/tests/rewriteTest.php b/tests/rewriteTest.php index eeb5f8c..25e8f0e 100644 --- a/tests/rewriteTest.php +++ b/tests/rewriteTest.php @@ -425,9 +425,73 @@ final class rewriteTest extends TestCase $this->assertSame(trim($expected), trim($postgresql)); } + public function test_it_doesnt_rewrite_when_it_doesnt_need_to() + { + $sql = <<assertSame(trim($expected), trim($postgresql)); + } + + public function test_it_handles_alter_tables_with_indexes() + { + $sql = <<assertSame(trim($expected), trim($postgresql)); + + } + + public function test_it_handles_alter_tables_with_unique_indexes() + { + $sql = <<assertSame(trim($expected), trim($postgresql)); + } + + public function test_it_doesnt_remove_single_quotes() + { + $sql = <<assertSame(trim($expected), trim($postgresql)); + } - + protected function setUp(): void {