From e256e765e74a0d506c96e768b9246efb1ec7d80c Mon Sep 17 00:00:00 2001 From: Andras Bacsai <5845193+andrasbacsai@users.noreply.github.com> Date: Fri, 10 Oct 2025 18:39:40 +0200 Subject: [PATCH] fix: properly handle transaction for concurrent index operations MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Instead of redefining the $withinTransaction property (which causes a type error), we now manually commit the transaction before running CREATE INDEX CONCURRENTLY and begin a new transaction afterward. This ensures PostgreSQL can execute the concurrent index operations while maintaining transaction safety for subsequent migrations. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- ...6_131350_optimize_activity_log_indexes.php | 28 ++++++++++++------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/database/migrations/2025_06_26_131350_optimize_activity_log_indexes.php b/database/migrations/2025_06_26_131350_optimize_activity_log_indexes.php index 94bcbec32..23073bd37 100644 --- a/database/migrations/2025_06_26_131350_optimize_activity_log_indexes.php +++ b/database/migrations/2025_06_26_131350_optimize_activity_log_indexes.php @@ -6,26 +6,28 @@ return new class extends Migration { - /** - * Disable transactions for this migration because CREATE INDEX CONCURRENTLY - * cannot run inside a transaction block in PostgreSQL. - */ - public bool $withinTransaction = false; - /** * Run the migrations. */ public function up(): void { try { + // CREATE INDEX CONCURRENTLY cannot run inside a transaction block + // We need to commit any open transaction first + DB::commit(); + // Add specific index for type_uuid queries with ordering - DB::statement('CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_activity_type_uuid_created_at ON activity_log ((properties->>\'type_uuid\'), created_at DESC)'); + DB::unprepared('CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_activity_type_uuid_created_at ON activity_log ((properties->>\'type_uuid\'), created_at DESC)'); // Add specific index for status queries on properties - DB::statement('CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_activity_properties_status ON activity_log ((properties->>\'status\'))'); + DB::unprepared('CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_activity_properties_status ON activity_log ((properties->>\'status\'))'); + // Begin a new transaction for subsequent migrations + DB::beginTransaction(); } catch (\Exception $e) { Log::error('Error adding optimized indexes to activity_log: '.$e->getMessage()); + // Ensure we have a transaction for subsequent migrations + DB::beginTransaction(); } } @@ -35,10 +37,16 @@ public function up(): void public function down(): void { try { - DB::statement('DROP INDEX CONCURRENTLY IF EXISTS idx_activity_type_uuid_created_at'); - DB::statement('DROP INDEX CONCURRENTLY IF EXISTS idx_activity_properties_status'); + // DROP INDEX CONCURRENTLY cannot run inside a transaction block + DB::commit(); + + DB::unprepared('DROP INDEX CONCURRENTLY IF EXISTS idx_activity_type_uuid_created_at'); + DB::unprepared('DROP INDEX CONCURRENTLY IF EXISTS idx_activity_properties_status'); + + DB::beginTransaction(); } catch (\Exception $e) { Log::error('Error dropping optimized indexes from activity_log: '.$e->getMessage()); + DB::beginTransaction(); } } };