From 61c6f4436eb82b0eeb94b040be9a9730703da047 Mon Sep 17 00:00:00 2001 From: designgears Date: Sun, 13 Jul 2025 13:26:14 -0600 Subject: [PATCH 1/4] Add TimescaleDB hypertable support to PostgresBuilder::dropAllTables() This change enhances the PostgreSQL schema builder to properly handle TimescaleDB hypertables when dropping all tables from the database. --- .../Database/Schema/PostgresBuilder.php | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/Illuminate/Database/Schema/PostgresBuilder.php b/src/Illuminate/Database/Schema/PostgresBuilder.php index 66f311742708..49804c3a6c46 100755 --- a/src/Illuminate/Database/Schema/PostgresBuilder.php +++ b/src/Illuminate/Database/Schema/PostgresBuilder.php @@ -16,12 +16,25 @@ class PostgresBuilder extends Builder public function dropAllTables() { $tables = []; + $hypertables = []; $excludedTables = $this->connection->getConfig('dont_drop') ?? ['spatial_ref_sys']; + $hasTimescaleDB = !empty($this->connection->select("SELECT 1 FROM pg_extension WHERE extname = 'timescaledb'")); + + if ($hasTimescaleDB) { + $hypertables = $this->connection->select( + "SELECT hypertable_schema || '.' || hypertable_name as name FROM timescaledb_information.hypertables" + ); + $hypertables = array_column($hypertables, 'name'); + } foreach ($this->getTables($this->getCurrentSchemaListing()) as $table) { - if (empty(array_intersect([$table['name'], $table['schema_qualified_name']], $excludedTables))) { - $tables[] = $table['schema_qualified_name']; + if (!in_array($table['name'], $excludedTables) && !in_array($table['schema_qualified_name'], $excludedTables)) { + if (in_array($table['schema_qualified_name'], $hypertables)) { + $this->connection->statement("DROP TABLE IF EXISTS {$table['schema_qualified_name']} CASCADE"); + } else { + $tables[] = $table['schema_qualified_name']; + } } } From 0bb800203ef81acfd3e0075a1e0479d62de19a8b Mon Sep 17 00:00:00 2001 From: designgears Date: Sun, 13 Jul 2025 13:35:15 -0600 Subject: [PATCH 2/4] Updates to adhere to style guide --- src/Illuminate/Database/Schema/PostgresBuilder.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Illuminate/Database/Schema/PostgresBuilder.php b/src/Illuminate/Database/Schema/PostgresBuilder.php index 49804c3a6c46..0581387a2e8b 100755 --- a/src/Illuminate/Database/Schema/PostgresBuilder.php +++ b/src/Illuminate/Database/Schema/PostgresBuilder.php @@ -19,7 +19,7 @@ public function dropAllTables() $hypertables = []; $excludedTables = $this->connection->getConfig('dont_drop') ?? ['spatial_ref_sys']; - $hasTimescaleDB = !empty($this->connection->select("SELECT 1 FROM pg_extension WHERE extname = 'timescaledb'")); + $hasTimescaleDB = ! empty($this->connection->select("SELECT 1 FROM pg_extension WHERE extname = 'timescaledb'")); if ($hasTimescaleDB) { $hypertables = $this->connection->select( @@ -29,7 +29,7 @@ public function dropAllTables() } foreach ($this->getTables($this->getCurrentSchemaListing()) as $table) { - if (!in_array($table['name'], $excludedTables) && !in_array($table['schema_qualified_name'], $excludedTables)) { + if (! in_array($table['name'], $excludedTables) && ! in_array($table['schema_qualified_name'], $excludedTables)) { if (in_array($table['schema_qualified_name'], $hypertables)) { $this->connection->statement("DROP TABLE IF EXISTS {$table['schema_qualified_name']} CASCADE"); } else { From 62d27ee40765dd61aee9435637e2f74ac7a1b3e0 Mon Sep 17 00:00:00 2001 From: designgears Date: Sun, 13 Jul 2025 13:44:37 -0600 Subject: [PATCH 3/4] style: remove whitespace in PostgresBuilder.php --- src/Illuminate/Database/Schema/PostgresBuilder.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Illuminate/Database/Schema/PostgresBuilder.php b/src/Illuminate/Database/Schema/PostgresBuilder.php index 0581387a2e8b..629012e595b5 100755 --- a/src/Illuminate/Database/Schema/PostgresBuilder.php +++ b/src/Illuminate/Database/Schema/PostgresBuilder.php @@ -20,7 +20,7 @@ public function dropAllTables() $excludedTables = $this->connection->getConfig('dont_drop') ?? ['spatial_ref_sys']; $hasTimescaleDB = ! empty($this->connection->select("SELECT 1 FROM pg_extension WHERE extname = 'timescaledb'")); - + if ($hasTimescaleDB) { $hypertables = $this->connection->select( "SELECT hypertable_schema || '.' || hypertable_name as name FROM timescaledb_information.hypertables" From 957a9218c44107c3ab91c3f9e7405eccf4a029e5 Mon Sep 17 00:00:00 2001 From: Taylor Otwell Date: Fri, 18 Jul 2025 11:11:34 -0500 Subject: [PATCH 4/4] formatting --- src/Illuminate/Database/Schema/PostgresBuilder.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Illuminate/Database/Schema/PostgresBuilder.php b/src/Illuminate/Database/Schema/PostgresBuilder.php index 629012e595b5..cc3c68764eba 100755 --- a/src/Illuminate/Database/Schema/PostgresBuilder.php +++ b/src/Illuminate/Database/Schema/PostgresBuilder.php @@ -19,13 +19,13 @@ public function dropAllTables() $hypertables = []; $excludedTables = $this->connection->getConfig('dont_drop') ?? ['spatial_ref_sys']; - $hasTimescaleDB = ! empty($this->connection->select("SELECT 1 FROM pg_extension WHERE extname = 'timescaledb'")); - if ($hasTimescaleDB) { - $hypertables = $this->connection->select( + $hasTimescaleDb = ! empty($this->connection->select("SELECT 1 FROM pg_extension WHERE extname = 'timescaledb'")); + + if ($hasTimescaleDb) { + $hypertables = array_column($this->connection->select( "SELECT hypertable_schema || '.' || hypertable_name as name FROM timescaledb_information.hypertables" - ); - $hypertables = array_column($hypertables, 'name'); + ), 'name'); } foreach ($this->getTables($this->getCurrentSchemaListing()) as $table) {