mirror of
https://github.com/PostgreSQL-For-Wordpress/postgresql-for-wordpress.git
synced 2025-07-31 10:17:13 +02:00
Merge remote-tracking branch 'origin/rewrite-fixes' into v3.4
This commit is contained in:
@ -31,23 +31,57 @@ class AlterTableSQLRewriter extends AbstractSQLRewriter
|
|||||||
|
|
||||||
$sql = $this->rewrite_numeric_type($sql);
|
$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')) {
|
if (str_contains($sql, 'CHANGE COLUMN')) {
|
||||||
$sql = $this->rewriteChangeColumn($sql);
|
$sql = $this->rewriteChangeColumn($sql);
|
||||||
|
return $sql;
|
||||||
}
|
}
|
||||||
if (str_contains($sql, 'ALTER COLUMN')) {
|
if (str_contains($sql, 'ALTER COLUMN')) {
|
||||||
$sql = $this->rewriteAlterColumn($sql);
|
$sql = $this->rewriteAlterColumn($sql);
|
||||||
|
return $sql;
|
||||||
}
|
}
|
||||||
if (str_contains($sql, 'ADD COLUMN')) {
|
if (str_contains($sql, 'ADD COLUMN')) {
|
||||||
$sql = $this->rewriteAddColumn($sql);
|
$sql = $this->rewriteAddColumn($sql);
|
||||||
|
return $sql;
|
||||||
}
|
}
|
||||||
if (str_contains($sql, 'ADD KEY') || str_contains($sql, 'ADD UNIQUE KEY')) {
|
if (str_contains($sql, 'ADD KEY') || str_contains($sql, 'ADD UNIQUE KEY')) {
|
||||||
$sql = $this->rewriteAddKey($sql);
|
$sql = $this->rewriteAddKey($sql);
|
||||||
|
return $sql;
|
||||||
}
|
}
|
||||||
if (str_contains($sql, 'DROP INDEX')) {
|
if (str_contains($sql, 'DROP INDEX')) {
|
||||||
$sql = $this->rewriteDropIndex($sql);
|
$sql = $this->rewriteDropIndex($sql);
|
||||||
|
return $sql;
|
||||||
}
|
}
|
||||||
if (str_contains($sql, 'DROP PRIMARY KEY')) {
|
if (str_contains($sql, 'DROP PRIMARY KEY')) {
|
||||||
$sql = $this->rewriteDropPrimaryKey($sql);
|
$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;
|
return $sql;
|
||||||
@ -164,7 +198,7 @@ class AlterTableSQLRewriter extends AbstractSQLRewriter
|
|||||||
if(1 === preg_match($pattern, $sql, $matches)) {
|
if(1 === preg_match($pattern, $sql, $matches)) {
|
||||||
$table = $matches[1];
|
$table = $matches[1];
|
||||||
$index = $matches[2];
|
$index = $matches[2];
|
||||||
$sql = "DROP INDEX ${table}_${index}";
|
$sql = "DROP INDEX {$table}_{$index}";
|
||||||
}
|
}
|
||||||
|
|
||||||
return $sql;
|
return $sql;
|
||||||
@ -176,7 +210,7 @@ class AlterTableSQLRewriter extends AbstractSQLRewriter
|
|||||||
|
|
||||||
if(1 === preg_match($pattern, $sql, $matches)) {
|
if(1 === preg_match($pattern, $sql, $matches)) {
|
||||||
$table = $matches[1];
|
$table = $matches[1];
|
||||||
$sql = "ALTER TABLE ${table} DROP CONSTRAINT ${table}_pkey";
|
$sql = "ALTER TABLE {$table} DROP CONSTRAINT {$table}_pkey";
|
||||||
}
|
}
|
||||||
|
|
||||||
return $sql;
|
return $sql;
|
||||||
|
@ -123,7 +123,6 @@ class SelectSQLRewriter extends AbstractSQLRewriter
|
|||||||
if(isset($wpdb)) {
|
if(isset($wpdb)) {
|
||||||
$sql = str_replace('GROUP BY ' . $wpdb->prefix . 'posts.ID', '', $sql);
|
$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
|
// MySQL 'LIKE' is case insensitive by default, whereas PostgreSQL 'LIKE' is
|
||||||
$sql = str_replace(' LIKE ', ' ILIKE ', $sql);
|
$sql = str_replace(' LIKE ', ' ILIKE ', $sql);
|
||||||
|
@ -1,6 +1,9 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<phpunit
|
<phpunit
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
displayDetailsOnTestsThatTriggerDeprecations="true"
|
||||||
|
displayDetailsOnTestsThatTriggerErrors="true"
|
||||||
|
displayDetailsOnTestsThatTriggerNotices="true"
|
||||||
displayDetailsOnTestsThatTriggerWarnings="true"
|
displayDetailsOnTestsThatTriggerWarnings="true"
|
||||||
colors="true">
|
colors="true">
|
||||||
<testsuites>
|
<testsuites>
|
||||||
|
@ -425,6 +425,70 @@ final class rewriteTest extends TestCase
|
|||||||
$this->assertSame(trim($expected), trim($postgresql));
|
$this->assertSame(trim($expected), trim($postgresql));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function test_it_doesnt_rewrite_when_it_doesnt_need_to()
|
||||||
|
{
|
||||||
|
$sql = <<<SQL
|
||||||
|
SELECT p.ID FROM wp_posts p
|
||||||
|
WHERE post_type='scheduled-action'
|
||||||
|
AND p.post_status IN ('pending')
|
||||||
|
AND p.post_modified_gmt <= '2023-11-27 14:23:34'
|
||||||
|
AND p.post_password != '' ORDER BY p.post_date_gmt ASC LIMIT 0, 20
|
||||||
|
SQL;
|
||||||
|
|
||||||
|
$expected = <<<SQL
|
||||||
|
SELECT p."ID" , p.post_date_gmt FROM wp_posts p
|
||||||
|
WHERE post_type='scheduled-action'
|
||||||
|
AND p.post_status IN ('pending')
|
||||||
|
AND p.post_modified_gmt <= '2023-11-27 14:23:34'
|
||||||
|
AND p.post_password != '' ORDER BY p.post_date_gmt ASC LIMIT 20 OFFSET 0
|
||||||
|
SQL;
|
||||||
|
|
||||||
|
$postgresql = pg4wp_rewrite($sql);
|
||||||
|
$this->assertSame(trim($expected), trim($postgresql));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function test_it_handles_alter_tables_with_indexes()
|
||||||
|
{
|
||||||
|
$sql = <<<SQL
|
||||||
|
ALTER TABLE wp_e_events ADD INDEX `created_at_index` (`created_at`)
|
||||||
|
SQL;
|
||||||
|
|
||||||
|
$expected = <<<SQL
|
||||||
|
CREATE INDEX IF NOT EXISTS wp_e_events_created_at_index ON wp_e_events (created_at)
|
||||||
|
SQL;
|
||||||
|
|
||||||
|
$postgresql = pg4wp_rewrite($sql);
|
||||||
|
$this->assertSame(trim($expected), trim($postgresql));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public function test_it_handles_alter_tables_with_unique_indexes()
|
||||||
|
{
|
||||||
|
$sql = <<<SQL
|
||||||
|
ALTER TABLE wp_e_events ADD UNIQUE INDEX `created_at_index` (`created_at`)
|
||||||
|
SQL;
|
||||||
|
|
||||||
|
$expected = <<<SQL
|
||||||
|
CREATE UNIQUE INDEX IF NOT EXISTS wp_e_events_created_at_index ON wp_e_events (created_at)
|
||||||
|
SQL;
|
||||||
|
|
||||||
|
$postgresql = pg4wp_rewrite($sql);
|
||||||
|
$this->assertSame(trim($expected), trim($postgresql));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function test_it_doesnt_remove_single_quotes()
|
||||||
|
{
|
||||||
|
$sql = <<<SQL
|
||||||
|
SELECT COUNT(*) FROM wp_comments WHERE user_id = 5 AND comment_approved = '1'
|
||||||
|
SQL;
|
||||||
|
|
||||||
|
$expected = <<<SQL
|
||||||
|
SELECT COUNT(*) FROM wp_comments WHERE user_id = 5 AND comment_approved = '1'
|
||||||
|
SQL;
|
||||||
|
|
||||||
|
$postgresql = pg4wp_rewrite($sql);
|
||||||
|
$this->assertSame(trim($expected), trim($postgresql));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user