From 91f1612d10cc415824314c02907df905d4eef1df Mon Sep 17 00:00:00 2001 From: Matthew Bucci Date: Sun, 26 Nov 2023 01:34:10 -0800 Subject: [PATCH] add tests for table creation --- pg4wp/rewriters/CreateTableSQLRewriter.php | 25 ++++++++++--- tests/rewriteTest.php | 41 ++++++++++++++++++++++ 2 files changed, 62 insertions(+), 4 deletions(-) diff --git a/pg4wp/rewriters/CreateTableSQLRewriter.php b/pg4wp/rewriters/CreateTableSQLRewriter.php index fd31e4e..67586a4 100644 --- a/pg4wp/rewriters/CreateTableSQLRewriter.php +++ b/pg4wp/rewriters/CreateTableSQLRewriter.php @@ -6,6 +6,7 @@ class CreateTableSQLRewriter extends AbstractSQLRewriter 'bigint(20)' => 'bigint', 'bigint(10)' => 'int', 'int(11)' => 'int', + 'int(1)' => 'smallint', 'tinytext' => 'text', 'mediumtext' => 'text', 'longtext' => 'text', @@ -45,22 +46,22 @@ class CreateTableSQLRewriter extends AbstractSQLRewriter $sql = trim($sql) . ';'; // Translate types and some other replacements - $sql = str_replace( + $sql = str_ireplace( array_keys($this->stringReplacements), array_values($this->stringReplacements), $sql ); // Fix auto_increment by adding a sequence - $pattern = '/int[ ]+NOT NULL auto_increment/'; + $pattern = '/int[ ]+NOT NULL auto_increment/i'; preg_match($pattern, $sql, $matches); if($matches) { $seq = $table . '_seq'; - $sql = str_replace('NOT NULL auto_increment', "NOT NULL DEFAULT nextval('$seq'::text)", $sql); + $sql = str_ireplace('NOT NULL auto_increment', "NOT NULL DEFAULT nextval('$seq'::text)", $sql); $sql .= "\nCREATE SEQUENCE $seq;"; } - // Support for INDEX creation + // Support for UNIQUE INDEX creation $pattern = '/,\s+(UNIQUE |)KEY\s+([^\s]+)\s+\(((?:[\w]+(?:\([\d]+\))?[,]?)*)\)/'; if(preg_match_all($pattern, $sql, $matches, PREG_SET_ORDER)) { foreach($matches as $match) { @@ -75,6 +76,22 @@ class CreateTableSQLRewriter extends AbstractSQLRewriter } // Now remove handled indexes $sql = preg_replace($pattern, '', $sql); + + // Support for PRIMARY INDEX creation + $pattern = '/,\s+(PRIMARY |)KEY\s+\(((?:[\w]+(?:\([\d]+\))?[,]?)*)\)/'; + if(preg_match_all($pattern, $sql, $matches, PREG_SET_ORDER)) { + foreach($matches as $match) { + $primary = $match[1]; + $columns = $match[2]; + $columns = preg_replace('/\(\d+\)/', '', $columns); + $index = $columns; + // Workaround for index name duplicate + $index = $table . '_' . $index; + $sql .= "\nCREATE {$primary}INDEX $index ON $table ($columns);"; + } + } + // Now remove handled indexes + $sql = preg_replace($pattern, '', $sql); return $sql; } diff --git a/tests/rewriteTest.php b/tests/rewriteTest.php index 3328587..f01ab14 100644 --- a/tests/rewriteTest.php +++ b/tests/rewriteTest.php @@ -31,4 +31,45 @@ final class rewriteTest extends TestCase $postgresql = pg4wp_rewrite($sql); $this->assertSame($postgresql, $expected); } + + public function test_it_handles_auto_increment() + { + $sql = <<assertSame(trim($postgresql), trim($expected)); + } } \ No newline at end of file