From 052f0d96db8310e53f42db0015a178e8cb55a658 Mon Sep 17 00:00:00 2001 From: Shehjad Date: Thu, 15 Oct 2026 00:13:27 +0600 Subject: [PATCH 1/3] fix: schema-qualify the CREATE INDEX CONCURRENTLY wait query (#641) The wait directive emitted after CREATE INDEX CONCURRENTLY matched the index by pg_class.relname only. checkWaitStatus reads the first row, so an invalid index with the same name in another schema (e.g. a failed concurrent build left behind in a sibling tenant schema) made apply wait forever. Filter the wait query by relnamespace as well, for the create, change, and rewrite paths, and update the plan fixtures that embed the wait query. --- cmd/issue_641_integration_test.go | 160 ++++++++++++++++++ internal/plan/rewrite.go | 16 +- internal/plan/rewrite_test.go | 38 +++++ .../add_index_with_reloptions/plan.json | 4 +- .../add_index_with_reloptions/plan.sql | 6 +- .../add_index_with_reloptions/plan.txt | 6 +- .../alter_index_null_order/plan.json | 2 +- .../alter_index_null_order/plan.sql | 3 +- .../alter_index_null_order/plan.txt | 3 +- .../issue_295_pgvector_typmod/plan.json | 2 +- .../issue_295_pgvector_typmod/plan.sql | 3 +- .../issue_295_pgvector_typmod/plan.txt | 3 +- .../plan.json | 2 +- .../plan.sql | 3 +- .../plan.txt | 5 +- .../plan.json | 8 +- .../issue_591_alter_generated_column/plan.sql | 12 +- .../issue_591_alter_generated_column/plan.txt | 12 +- .../diff/create_trigger/add_trigger/plan.txt | 2 +- .../plan.json | 2 +- .../plan.sql | 3 +- .../plan.txt | 3 +- .../plan.txt | 2 +- .../plan.txt | 2 +- testdata/diff/migrate/v2/plan.json | 4 +- testdata/diff/migrate/v2/plan.sql | 6 +- testdata/diff/migrate/v2/plan.txt | 6 +- testdata/diff/migrate/v4/plan.json | 4 +- testdata/diff/migrate/v4/plan.sql | 6 +- testdata/diff/migrate/v4/plan.txt | 6 +- .../diff/online/add_composite_index/plan.json | 4 +- .../diff/online/add_composite_index/plan.sql | 6 +- .../diff/online/add_composite_index/plan.txt | 6 +- .../online/add_functional_index/plan.json | 2 +- .../diff/online/add_functional_index/plan.sql | 3 +- .../diff/online/add_functional_index/plan.txt | 3 +- .../add_materialized_view_index/plan.json | 2 +- .../add_materialized_view_index/plan.sql | 3 +- .../add_materialized_view_index/plan.txt | 3 +- .../diff/online/add_partial_index/plan.json | 2 +- .../diff/online/add_partial_index/plan.sql | 3 +- .../diff/online/add_partial_index/plan.txt | 3 +- .../add_unique_multi_column_index/plan.json | 2 +- .../add_unique_multi_column_index/plan.sql | 3 +- .../add_unique_multi_column_index/plan.txt | 3 +- .../online/alter_composite_index/plan.json | 4 +- .../online/alter_composite_index/plan.sql | 6 +- .../online/alter_composite_index/plan.txt | 6 +- .../alter_materialized_view_index/plan.json | 2 +- .../alter_materialized_view_index/plan.sql | 3 +- .../alter_materialized_view_index/plan.txt | 3 +- .../plan.json | 2 +- .../plan.sql | 3 +- .../plan.txt | 3 +- .../plan.json | 2 +- .../plan.sql | 3 +- .../plan.txt | 3 +- .../plan.json | 2 +- .../plan.sql | 3 +- .../plan.txt | 3 +- 60 files changed, 342 insertions(+), 88 deletions(-) create mode 100644 cmd/issue_641_integration_test.go diff --git a/cmd/issue_641_integration_test.go b/cmd/issue_641_integration_test.go new file mode 100644 index 000000000..44f64dc16 --- /dev/null +++ b/cmd/issue_641_integration_test.go @@ -0,0 +1,160 @@ +package cmd + +import ( + "context" + "os" + "path/filepath" + "strings" + "testing" + "time" + + "github.com/pgplex/pgschema/testutil" +) + +// TestIssue641ConcurrentIndexWaitCrossSchema reproduces +// https://github.com/pgplex/pgschema/issues/641: an invalid index of the same +// name in another schema makes an unqualified wait query report done=false +// forever. The fixed wait query is schema-qualified and returns done=true for +// the target schema's valid index. An end-to-end apply on tenant_b also +// completes quickly despite the invalid peer in tenant_a. +func TestIssue641ConcurrentIndexWaitCrossSchema(t *testing.T) { + if testing.Short() { + t.Skip("Skipping integration test in short mode") + } + + ctx := context.Background() + + embeddedPG := testutil.SetupPostgres(t) + defer embeddedPG.Stop() + conn, host, port, dbname, user, password := testutil.ConnectToPostgres(t, embeddedPG) + defer conn.Close() + + setup := ` +CREATE SCHEMA tenant_a; +CREATE SCHEMA tenant_b; +CREATE TABLE tenant_a.items (sku int); +INSERT INTO tenant_a.items VALUES (1), (1); +CREATE TABLE tenant_b.items (sku int); +INSERT INTO tenant_b.items VALUES (1), (2); +` + if _, err := conn.ExecContext(ctx, setup); err != nil { + t.Fatalf("setup schemas: %v", err) + } + + _, err := conn.ExecContext(ctx, `CREATE UNIQUE INDEX CONCURRENTLY items_sku_idx ON tenant_a.items (sku)`) + if err == nil { + t.Fatal("expected unique violation creating concurrent index on tenant_a") + } + + var aValid bool + if err := conn.QueryRowContext(ctx, ` + SELECT i.indisvalid FROM pg_class c + JOIN pg_namespace n ON c.relnamespace = n.oid + JOIN pg_index i ON c.oid = i.indexrelid + WHERE n.nspname = 'tenant_a' AND c.relname = 'items_sku_idx' + `).Scan(&aValid); err != nil { + t.Fatalf("inspect tenant_a index: %v", err) + } + if aValid { + t.Fatal("expected tenant_a.items_sku_idx to be invalid") + } + + // Pre-fix wait query (name only) — matches checkWaitStatus's first-row scan. + unqualified := ` +SELECT COALESCE(i.indisvalid, false) as done +FROM pg_class c +LEFT JOIN pg_index i ON c.oid = i.indexrelid +WHERE c.relname = 'items_sku_idx' +` + var done bool + if err := conn.QueryRowContext(ctx, unqualified).Scan(&done); err != nil { + t.Fatalf("unqualified wait query: %v", err) + } + if done { + t.Fatal("expected unqualified wait on invalid index to report done=false") + } + t.Log("reproduced issue #641 root cause: unqualified wait on invalid cross-schema index returns done=false (would hang apply)") + + if _, err := conn.ExecContext(ctx, `CREATE INDEX items_sku_idx ON tenant_b.items (sku)`); err != nil { + t.Fatalf("create valid index on tenant_b: %v", err) + } + + // With both indexes present, unqualified can return either row first. + var n int + if err := conn.QueryRowContext(ctx, `SELECT count(*) FROM pg_class c WHERE c.relname = 'items_sku_idx'`).Scan(&n); err != nil { + t.Fatal(err) + } + if n != 2 { + t.Fatalf("expected 2 indexes named items_sku_idx, got %d", n) + } + + qualified := ` +SELECT + COALESCE(i.indisvalid, false) as done, + CASE + WHEN p.blocks_total > 0 THEN p.blocks_done * 100 / p.blocks_total + ELSE 0 + END as progress +FROM pg_class c +LEFT JOIN pg_index i ON c.oid = i.indexrelid +LEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid +WHERE c.relname = 'items_sku_idx' + AND c.relnamespace = 'tenant_b'::regnamespace; +` + var progress int + if err := conn.QueryRowContext(ctx, qualified).Scan(&done, &progress); err != nil { + t.Fatalf("qualified wait query: %v", err) + } + if !done { + t.Fatal("schema-qualified wait query should report done=true for tenant_b") + } + t.Log("schema-qualified wait query reports done=true for tenant_b despite invalid peer in tenant_a") + + if _, err := conn.ExecContext(ctx, `DROP INDEX tenant_b.items_sku_idx`); err != nil { + t.Fatalf("drop tenant_b index for apply: %v", err) + } + + desired := ` +CREATE TABLE items (sku int); +CREATE INDEX items_sku_idx ON tenant_b.items USING btree (sku); +` + tmp := t.TempDir() + desiredFile := filepath.Join(tmp, "desired.sql") + if err := os.WriteFile(desiredFile, []byte(desired), 0644); err != nil { + t.Fatal(err) + } + + planSQL, err := generatePlanSQLFormatted(host, port, dbname, user, password, "tenant_b", desiredFile) + if err != nil { + t.Fatalf("plan tenant_b index: %v", err) + } + if !strings.Contains(planSQL, "CREATE INDEX") { + t.Fatalf("expected index create in plan:\n%s", planSQL) + } + if strings.Contains(planSQL, "relname") && !strings.Contains(planSQL, "relnamespace = 'tenant_b'::regnamespace") { + t.Fatalf("plan wait query missing schema qualification:\n%s", planSQL) + } + + start := time.Now() + if err := applySchemaChanges(host, port, dbname, user, password, "tenant_b", desiredFile); err != nil { + t.Fatalf("apply tenant_b index with invalid peer in tenant_a: %v", err) + } + elapsed := time.Since(start) + if elapsed > 30*time.Second { + t.Fatalf("apply took %v; likely hung on cross-schema invalid index (issue #641)", elapsed) + } + + var bValid bool + if err := conn.QueryRowContext(ctx, ` + SELECT i.indisvalid FROM pg_class c + JOIN pg_namespace n ON c.relnamespace = n.oid + JOIN pg_index i ON c.oid = i.indexrelid + WHERE n.nspname = 'tenant_b' AND c.relname = 'items_sku_idx' + `).Scan(&bValid); err != nil { + t.Fatalf("inspect tenant_b after apply: %v", err) + } + if !bValid { + t.Fatal("expected tenant_b.items_sku_idx valid after apply") + } + t.Logf("apply completed in %v with schema-qualified wait (issue #641 fixed)", elapsed) +} diff --git a/internal/plan/rewrite.go b/internal/plan/rewrite.go index ccbd5bd7d..221b21236 100644 --- a/internal/plan/rewrite.go +++ b/internal/plan/rewrite.go @@ -142,7 +142,7 @@ func generateIndexRewrite(index *ir.Index) []RewriteStep { // Generate concurrent SQL concurrentSQL := generateIndexSQL(index, true) // With CONCURRENTLY - waitSQL := generateIndexWaitQueryWithName(index.Name) + waitSQL := generateIndexWaitQueryWithName(index.Schema, index.Name) return []RewriteStep{ { @@ -176,7 +176,7 @@ func generateIndexChangeRewriteFromIndex(index *ir.Index) []RewriteStep { tempIndex := *index tempIndex.Name = tempIndexName concurrentSQL := generateIndexSQL(&tempIndex, true) - waitSQL := generateIndexWaitQueryWithName(tempIndexName) + waitSQL := generateIndexWaitQueryWithName(index.Schema, tempIndexName) // Drop old index and rename new one. Use IF EXISTS because a same-plan // DROP COLUMN step may already have implicitly dropped this index @@ -227,7 +227,7 @@ func generateIndexChangeRewrite(indexDiff *diff.IndexDiff) []RewriteStep { tempIndex := *indexDiff.New tempIndex.Name = tempIndexName concurrentSQL := generateIndexSQL(&tempIndex, true) - waitSQL := generateIndexWaitQueryWithName(tempIndexName) + waitSQL := generateIndexWaitQueryWithName(indexDiff.New.Schema, tempIndexName) // Drop old index and rename new one. Use IF EXISTS because a same-plan // DROP COLUMN step may already have implicitly dropped this index @@ -550,8 +550,11 @@ func generateIndexSQL(index *ir.Index, isConcurrent bool) string { return sql.String() } -// generateIndexWaitQueryWithName creates a wait query for monitoring concurrent index creation -func generateIndexWaitQueryWithName(indexName string) string { +// generateIndexWaitQueryWithName creates a wait query for monitoring concurrent index creation. +// The query is schema-qualified so an invalid index of the same name in another +// schema (e.g. a failed CREATE INDEX CONCURRENTLY left behind in a sibling +// tenant schema) cannot make apply hang forever. See issue #641. +func generateIndexWaitQueryWithName(schemaName, indexName string) string { return fmt.Sprintf(`SELECT COALESCE(i.indisvalid, false) as done, CASE @@ -561,7 +564,8 @@ func generateIndexWaitQueryWithName(indexName string) string { FROM pg_class c LEFT JOIN pg_index i ON c.oid = i.indexrelid LEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid -WHERE c.relname = '%s';`, indexName) +WHERE c.relname = '%s' + AND c.relnamespace = '%s'::regnamespace;`, indexName, schemaName) } // Helper functions diff --git a/internal/plan/rewrite_test.go b/internal/plan/rewrite_test.go index 2b1d16295..f0345dc9b 100644 --- a/internal/plan/rewrite_test.go +++ b/internal/plan/rewrite_test.go @@ -215,3 +215,41 @@ func TestPendingNotNullValidateIsolated(t *testing.T) { t.Errorf("isolated step SQL = %q, want %q", got, validate.Statements[0].SQL) } } + +// TestGenerateIndexWaitQuerySchemaQualified verifies the wait query for +// CREATE INDEX CONCURRENTLY is limited to the target schema (issue #641). +// Without the namespace filter, an invalid index of the same name in another +// schema makes apply hang forever because checkWaitStatus reads the first row. +func TestGenerateIndexWaitQuerySchemaQualified(t *testing.T) { + sql := generateIndexWaitQueryWithName("tenant_b", "items_sku_idx") + if !strings.Contains(sql, "c.relname = 'items_sku_idx'") { + t.Fatalf("wait query missing index name filter:\n%s", sql) + } + if !strings.Contains(sql, "c.relnamespace = 'tenant_b'::regnamespace") { + t.Fatalf("wait query missing schema qualification (issue #641):\n%s", sql) + } +} + +// TestGenerateIndexRewriteWaitIsSchemaQualified wires the schema through the +// concurrent rewrite path so apply waits on the right index. +func TestGenerateIndexRewriteWaitIsSchemaQualified(t *testing.T) { + index := &ir.Index{ + Schema: "tenant_b", + Table: "items", + Name: "items_sku_idx", + Type: ir.IndexTypeRegular, + Method: "btree", + Columns: []*ir.IndexColumn{{Name: "sku"}}, + } + steps := generateIndexRewrite(index) + if len(steps) < 2 { + t.Fatalf("expected concurrent create + wait steps, got %d", len(steps)) + } + wait := steps[1].SQL + if !strings.Contains(wait, "c.relnamespace = 'tenant_b'::regnamespace") { + t.Fatalf("rewrite wait step not schema-qualified:\n%s", wait) + } + if steps[1].Directive == nil || steps[1].Directive.Type != DirectiveTypeWait { + t.Fatalf("expected wait directive on step 1, got %#v", steps[1].Directive) + } +} diff --git a/testdata/diff/create_index/add_index_with_reloptions/plan.json b/testdata/diff/create_index/add_index_with_reloptions/plan.json index 3453b2d1d..68c4f64e7 100644 --- a/testdata/diff/create_index/add_index_with_reloptions/plan.json +++ b/testdata/diff/create_index/add_index_with_reloptions/plan.json @@ -19,7 +19,7 @@ { "steps": [ { - "sql": "SELECT \n COALESCE(i.indisvalid, false) as done,\n CASE \n WHEN p.blocks_total > 0 THEN p.blocks_done * 100 / p.blocks_total\n ELSE 0\n END as progress\nFROM pg_class c\nLEFT JOIN pg_index i ON c.oid = i.indexrelid\nLEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid\nWHERE c.relname = 'idx_orders_status_active';", + "sql": "SELECT \n COALESCE(i.indisvalid, false) as done,\n CASE \n WHEN p.blocks_total > 0 THEN p.blocks_done * 100 / p.blocks_total\n ELSE 0\n END as progress\nFROM pg_class c\nLEFT JOIN pg_index i ON c.oid = i.indexrelid\nLEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid\nWHERE c.relname = 'idx_orders_status_active'\n AND c.relnamespace = 'public'::regnamespace;", "directive": { "type": "wait", "message": "Creating index idx_orders_status_active" @@ -43,7 +43,7 @@ { "steps": [ { - "sql": "SELECT \n COALESCE(i.indisvalid, false) as done,\n CASE \n WHEN p.blocks_total > 0 THEN p.blocks_done * 100 / p.blocks_total\n ELSE 0\n END as progress\nFROM pg_class c\nLEFT JOIN pg_index i ON c.oid = i.indexrelid\nLEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid\nWHERE c.relname = 'idx_orders_user_id';", + "sql": "SELECT \n COALESCE(i.indisvalid, false) as done,\n CASE \n WHEN p.blocks_total > 0 THEN p.blocks_done * 100 / p.blocks_total\n ELSE 0\n END as progress\nFROM pg_class c\nLEFT JOIN pg_index i ON c.oid = i.indexrelid\nLEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid\nWHERE c.relname = 'idx_orders_user_id'\n AND c.relnamespace = 'public'::regnamespace;", "directive": { "type": "wait", "message": "Creating index idx_orders_user_id" diff --git a/testdata/diff/create_index/add_index_with_reloptions/plan.sql b/testdata/diff/create_index/add_index_with_reloptions/plan.sql index 30b0a0f33..d19d66f8a 100644 --- a/testdata/diff/create_index/add_index_with_reloptions/plan.sql +++ b/testdata/diff/create_index/add_index_with_reloptions/plan.sql @@ -10,7 +10,8 @@ SELECT FROM pg_class c LEFT JOIN pg_index i ON c.oid = i.indexrelid LEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid -WHERE c.relname = 'idx_orders_status_active'; +WHERE c.relname = 'idx_orders_status_active' + AND c.relnamespace = 'public'::regnamespace; CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_orders_user_id ON orders (user_id) WITH (fillfactor=90); @@ -24,4 +25,5 @@ SELECT FROM pg_class c LEFT JOIN pg_index i ON c.oid = i.indexrelid LEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid -WHERE c.relname = 'idx_orders_user_id'; +WHERE c.relname = 'idx_orders_user_id' + AND c.relnamespace = 'public'::regnamespace; diff --git a/testdata/diff/create_index/add_index_with_reloptions/plan.txt b/testdata/diff/create_index/add_index_with_reloptions/plan.txt index d92037f9c..73a60f744 100644 --- a/testdata/diff/create_index/add_index_with_reloptions/plan.txt +++ b/testdata/diff/create_index/add_index_with_reloptions/plan.txt @@ -25,7 +25,8 @@ SELECT FROM pg_class c LEFT JOIN pg_index i ON c.oid = i.indexrelid LEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid -WHERE c.relname = 'idx_orders_status_active'; +WHERE c.relname = 'idx_orders_status_active' + AND c.relnamespace = 'public'::regnamespace; -- Transaction Group #3 CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_orders_user_id ON orders (user_id) WITH (fillfactor=90); @@ -41,4 +42,5 @@ SELECT FROM pg_class c LEFT JOIN pg_index i ON c.oid = i.indexrelid LEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid -WHERE c.relname = 'idx_orders_user_id'; +WHERE c.relname = 'idx_orders_user_id' + AND c.relnamespace = 'public'::regnamespace; diff --git a/testdata/diff/create_index/alter_index_null_order/plan.json b/testdata/diff/create_index/alter_index_null_order/plan.json index 1df03dce6..3922f2260 100644 --- a/testdata/diff/create_index/alter_index_null_order/plan.json +++ b/testdata/diff/create_index/alter_index_null_order/plan.json @@ -19,7 +19,7 @@ { "steps": [ { - "sql": "SELECT \n COALESCE(i.indisvalid, false) as done,\n CASE \n WHEN p.blocks_total > 0 THEN p.blocks_done * 100 / p.blocks_total\n ELSE 0\n END as progress\nFROM pg_class c\nLEFT JOIN pg_index i ON c.oid = i.indexrelid\nLEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid\nWHERE c.relname = 'idx_events_desc_pgschema_new';", + "sql": "SELECT \n COALESCE(i.indisvalid, false) as done,\n CASE \n WHEN p.blocks_total > 0 THEN p.blocks_done * 100 / p.blocks_total\n ELSE 0\n END as progress\nFROM pg_class c\nLEFT JOIN pg_index i ON c.oid = i.indexrelid\nLEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid\nWHERE c.relname = 'idx_events_desc_pgschema_new'\n AND c.relnamespace = 'public'::regnamespace;", "directive": { "type": "wait", "message": "Creating index idx_events_desc_pgschema_new" diff --git a/testdata/diff/create_index/alter_index_null_order/plan.sql b/testdata/diff/create_index/alter_index_null_order/plan.sql index 43b377bba..45e33e56f 100644 --- a/testdata/diff/create_index/alter_index_null_order/plan.sql +++ b/testdata/diff/create_index/alter_index_null_order/plan.sql @@ -10,7 +10,8 @@ SELECT FROM pg_class c LEFT JOIN pg_index i ON c.oid = i.indexrelid LEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid -WHERE c.relname = 'idx_events_desc_pgschema_new'; +WHERE c.relname = 'idx_events_desc_pgschema_new' + AND c.relnamespace = 'public'::regnamespace; DROP INDEX IF EXISTS idx_events_desc; diff --git a/testdata/diff/create_index/alter_index_null_order/plan.txt b/testdata/diff/create_index/alter_index_null_order/plan.txt index 1d9356858..78dc92ecb 100644 --- a/testdata/diff/create_index/alter_index_null_order/plan.txt +++ b/testdata/diff/create_index/alter_index_null_order/plan.txt @@ -24,7 +24,8 @@ SELECT FROM pg_class c LEFT JOIN pg_index i ON c.oid = i.indexrelid LEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid -WHERE c.relname = 'idx_events_desc_pgschema_new'; +WHERE c.relname = 'idx_events_desc_pgschema_new' + AND c.relnamespace = 'public'::regnamespace; -- Transaction Group #3 DROP INDEX IF EXISTS idx_events_desc; diff --git a/testdata/diff/create_table/issue_295_pgvector_typmod/plan.json b/testdata/diff/create_table/issue_295_pgvector_typmod/plan.json index d6330d566..f706c14c4 100644 --- a/testdata/diff/create_table/issue_295_pgvector_typmod/plan.json +++ b/testdata/diff/create_table/issue_295_pgvector_typmod/plan.json @@ -29,7 +29,7 @@ { "steps": [ { - "sql": "SELECT \n COALESCE(i.indisvalid, false) as done,\n CASE \n WHEN p.blocks_total > 0 THEN p.blocks_done * 100 / p.blocks_total\n ELSE 0\n END as progress\nFROM pg_class c\nLEFT JOIN pg_index i ON c.oid = i.indexrelid\nLEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid\nWHERE c.relname = 'activity_embedding_idx';", + "sql": "SELECT \n COALESCE(i.indisvalid, false) as done,\n CASE \n WHEN p.blocks_total > 0 THEN p.blocks_done * 100 / p.blocks_total\n ELSE 0\n END as progress\nFROM pg_class c\nLEFT JOIN pg_index i ON c.oid = i.indexrelid\nLEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid\nWHERE c.relname = 'activity_embedding_idx'\n AND c.relnamespace = 'public'::regnamespace;", "directive": { "type": "wait", "message": "Creating index activity_embedding_idx" diff --git a/testdata/diff/create_table/issue_295_pgvector_typmod/plan.sql b/testdata/diff/create_table/issue_295_pgvector_typmod/plan.sql index 6fe860660..7a33b76e5 100644 --- a/testdata/diff/create_table/issue_295_pgvector_typmod/plan.sql +++ b/testdata/diff/create_table/issue_295_pgvector_typmod/plan.sql @@ -12,4 +12,5 @@ SELECT FROM pg_class c LEFT JOIN pg_index i ON c.oid = i.indexrelid LEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid -WHERE c.relname = 'activity_embedding_idx'; +WHERE c.relname = 'activity_embedding_idx' + AND c.relnamespace = 'public'::regnamespace; diff --git a/testdata/diff/create_table/issue_295_pgvector_typmod/plan.txt b/testdata/diff/create_table/issue_295_pgvector_typmod/plan.txt index 99553987f..a068a7964 100644 --- a/testdata/diff/create_table/issue_295_pgvector_typmod/plan.txt +++ b/testdata/diff/create_table/issue_295_pgvector_typmod/plan.txt @@ -25,4 +25,5 @@ SELECT FROM pg_class c LEFT JOIN pg_index i ON c.oid = i.indexrelid LEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid -WHERE c.relname = 'activity_embedding_idx'; +WHERE c.relname = 'activity_embedding_idx' + AND c.relnamespace = 'public'::regnamespace; diff --git a/testdata/diff/create_table/issue_506_fk_depends_on_new_unique/plan.json b/testdata/diff/create_table/issue_506_fk_depends_on_new_unique/plan.json index 0e7cd5f3d..e8e778c63 100644 --- a/testdata/diff/create_table/issue_506_fk_depends_on_new_unique/plan.json +++ b/testdata/diff/create_table/issue_506_fk_depends_on_new_unique/plan.json @@ -41,7 +41,7 @@ { "steps": [ { - "sql": "SELECT \n COALESCE(i.indisvalid, false) as done,\n CASE \n WHEN p.blocks_total > 0 THEN p.blocks_done * 100 / p.blocks_total\n ELSE 0\n END as progress\nFROM pg_class c\nLEFT JOIN pg_index i ON c.oid = i.indexrelid\nLEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid\nWHERE c.relname = 'parent2_id_tenant_key';", + "sql": "SELECT \n COALESCE(i.indisvalid, false) as done,\n CASE \n WHEN p.blocks_total > 0 THEN p.blocks_done * 100 / p.blocks_total\n ELSE 0\n END as progress\nFROM pg_class c\nLEFT JOIN pg_index i ON c.oid = i.indexrelid\nLEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid\nWHERE c.relname = 'parent2_id_tenant_key'\n AND c.relnamespace = 'public'::regnamespace;", "directive": { "type": "wait", "message": "Creating index parent2_id_tenant_key" diff --git a/testdata/diff/create_table/issue_506_fk_depends_on_new_unique/plan.sql b/testdata/diff/create_table/issue_506_fk_depends_on_new_unique/plan.sql index f1619ce53..dfaccab9c 100644 --- a/testdata/diff/create_table/issue_506_fk_depends_on_new_unique/plan.sql +++ b/testdata/diff/create_table/issue_506_fk_depends_on_new_unique/plan.sql @@ -27,7 +27,8 @@ SELECT FROM pg_class c LEFT JOIN pg_index i ON c.oid = i.indexrelid LEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid -WHERE c.relname = 'parent2_id_tenant_key'; +WHERE c.relname = 'parent2_id_tenant_key' + AND c.relnamespace = 'public'::regnamespace; ALTER TABLE child ADD CONSTRAINT child_parent_id_tenant_fkey FOREIGN KEY (parent_id, tenant) REFERENCES parent (id, tenant); diff --git a/testdata/diff/create_table/issue_506_fk_depends_on_new_unique/plan.txt b/testdata/diff/create_table/issue_506_fk_depends_on_new_unique/plan.txt index 50fd88ce5..cef3420ab 100644 --- a/testdata/diff/create_table/issue_506_fk_depends_on_new_unique/plan.txt +++ b/testdata/diff/create_table/issue_506_fk_depends_on_new_unique/plan.txt @@ -48,11 +48,12 @@ SELECT FROM pg_class c LEFT JOIN pg_index i ON c.oid = i.indexrelid LEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid -WHERE c.relname = 'parent2_id_tenant_key'; +WHERE c.relname = 'parent2_id_tenant_key' + AND c.relnamespace = 'public'::regnamespace; -- Transaction Group #4 ALTER TABLE child ADD CONSTRAINT child_parent_id_tenant_fkey FOREIGN KEY (parent_id, tenant) REFERENCES parent (id, tenant); ALTER TABLE child2 -ADD CONSTRAINT child2_parent2_id_tenant_fkey FOREIGN KEY (parent2_id, tenant) REFERENCES parent2 (id, tenant); \ No newline at end of file +ADD CONSTRAINT child2_parent2_id_tenant_fkey FOREIGN KEY (parent2_id, tenant) REFERENCES parent2 (id, tenant); diff --git a/testdata/diff/create_table/issue_591_alter_generated_column/plan.json b/testdata/diff/create_table/issue_591_alter_generated_column/plan.json index 16baba77a..806bf1b4f 100644 --- a/testdata/diff/create_table/issue_591_alter_generated_column/plan.json +++ b/testdata/diff/create_table/issue_591_alter_generated_column/plan.json @@ -105,7 +105,7 @@ { "steps": [ { - "sql": "SELECT \n COALESCE(i.indisvalid, false) as done,\n CASE \n WHEN p.blocks_total > 0 THEN p.blocks_done * 100 / p.blocks_total\n ELSE 0\n END as progress\nFROM pg_class c\nLEFT JOIN pg_index i ON c.oid = i.indexrelid\nLEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid\nWHERE c.relname = 'metrics_tripled_idx_pgschema_new';", + "sql": "SELECT \n COALESCE(i.indisvalid, false) as done,\n CASE \n WHEN p.blocks_total > 0 THEN p.blocks_done * 100 / p.blocks_total\n ELSE 0\n END as progress\nFROM pg_class c\nLEFT JOIN pg_index i ON c.oid = i.indexrelid\nLEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid\nWHERE c.relname = 'metrics_tripled_idx_pgschema_new'\n AND c.relnamespace = 'public'::regnamespace;", "directive": { "type": "wait", "message": "Creating index metrics_tripled_idx_pgschema_new" @@ -199,7 +199,7 @@ { "steps": [ { - "sql": "SELECT \n COALESCE(i.indisvalid, false) as done,\n CASE \n WHEN p.blocks_total > 0 THEN p.blocks_done * 100 / p.blocks_total\n ELSE 0\n END as progress\nFROM pg_class c\nLEFT JOIN pg_index i ON c.oid = i.indexrelid\nLEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid\nWHERE c.relname = 'orders_code_key_pgschema_new';", + "sql": "SELECT \n COALESCE(i.indisvalid, false) as done,\n CASE \n WHEN p.blocks_total > 0 THEN p.blocks_done * 100 / p.blocks_total\n ELSE 0\n END as progress\nFROM pg_class c\nLEFT JOIN pg_index i ON c.oid = i.indexrelid\nLEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid\nWHERE c.relname = 'orders_code_key_pgschema_new'\n AND c.relnamespace = 'public'::regnamespace;", "directive": { "type": "wait", "message": "Creating index orders_code_key_pgschema_new" @@ -239,7 +239,7 @@ { "steps": [ { - "sql": "SELECT \n COALESCE(i.indisvalid, false) as done,\n CASE \n WHEN p.blocks_total > 0 THEN p.blocks_done * 100 / p.blocks_total\n ELSE 0\n END as progress\nFROM pg_class c\nLEFT JOIN pg_index i ON c.oid = i.indexrelid\nLEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid\nWHERE c.relname = 'orders_lookup_idx_pgschema_new';", + "sql": "SELECT \n COALESCE(i.indisvalid, false) as done,\n CASE \n WHEN p.blocks_total > 0 THEN p.blocks_done * 100 / p.blocks_total\n ELSE 0\n END as progress\nFROM pg_class c\nLEFT JOIN pg_index i ON c.oid = i.indexrelid\nLEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid\nWHERE c.relname = 'orders_lookup_idx_pgschema_new'\n AND c.relnamespace = 'public'::regnamespace;", "directive": { "type": "wait", "message": "Creating index orders_lookup_idx_pgschema_new" @@ -279,7 +279,7 @@ { "steps": [ { - "sql": "SELECT \n COALESCE(i.indisvalid, false) as done,\n CASE \n WHEN p.blocks_total > 0 THEN p.blocks_done * 100 / p.blocks_total\n ELSE 0\n END as progress\nFROM pg_class c\nLEFT JOIN pg_index i ON c.oid = i.indexrelid\nLEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid\nWHERE c.relname = 'orders_total_key';", + "sql": "SELECT \n COALESCE(i.indisvalid, false) as done,\n CASE \n WHEN p.blocks_total > 0 THEN p.blocks_done * 100 / p.blocks_total\n ELSE 0\n END as progress\nFROM pg_class c\nLEFT JOIN pg_index i ON c.oid = i.indexrelid\nLEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid\nWHERE c.relname = 'orders_total_key'\n AND c.relnamespace = 'public'::regnamespace;", "directive": { "type": "wait", "message": "Creating index orders_total_key" diff --git a/testdata/diff/create_table/issue_591_alter_generated_column/plan.sql b/testdata/diff/create_table/issue_591_alter_generated_column/plan.sql index 110113226..38400769d 100644 --- a/testdata/diff/create_table/issue_591_alter_generated_column/plan.sql +++ b/testdata/diff/create_table/issue_591_alter_generated_column/plan.sql @@ -38,7 +38,8 @@ SELECT FROM pg_class c LEFT JOIN pg_index i ON c.oid = i.indexrelid LEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid -WHERE c.relname = 'metrics_tripled_idx_pgschema_new'; +WHERE c.relname = 'metrics_tripled_idx_pgschema_new' + AND c.relnamespace = 'public'::regnamespace; DROP INDEX IF EXISTS metrics_tripled_idx; @@ -79,7 +80,8 @@ SELECT FROM pg_class c LEFT JOIN pg_index i ON c.oid = i.indexrelid LEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid -WHERE c.relname = 'orders_code_key_pgschema_new'; +WHERE c.relname = 'orders_code_key_pgschema_new' + AND c.relnamespace = 'public'::regnamespace; DROP INDEX IF EXISTS orders_code_key; @@ -97,7 +99,8 @@ SELECT FROM pg_class c LEFT JOIN pg_index i ON c.oid = i.indexrelid LEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid -WHERE c.relname = 'orders_lookup_idx_pgschema_new'; +WHERE c.relname = 'orders_lookup_idx_pgschema_new' + AND c.relnamespace = 'public'::regnamespace; DROP INDEX IF EXISTS orders_lookup_idx; @@ -115,7 +118,8 @@ SELECT FROM pg_class c LEFT JOIN pg_index i ON c.oid = i.indexrelid LEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid -WHERE c.relname = 'orders_total_key'; +WHERE c.relname = 'orders_total_key' + AND c.relnamespace = 'public'::regnamespace; ALTER TABLE vt DROP COLUMN v2; diff --git a/testdata/diff/create_table/issue_591_alter_generated_column/plan.txt b/testdata/diff/create_table/issue_591_alter_generated_column/plan.txt index 7f34b6836..320d96fd9 100644 --- a/testdata/diff/create_table/issue_591_alter_generated_column/plan.txt +++ b/testdata/diff/create_table/issue_591_alter_generated_column/plan.txt @@ -103,7 +103,8 @@ SELECT FROM pg_class c LEFT JOIN pg_index i ON c.oid = i.indexrelid LEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid -WHERE c.relname = 'metrics_tripled_idx_pgschema_new'; +WHERE c.relname = 'metrics_tripled_idx_pgschema_new' + AND c.relnamespace = 'public'::regnamespace; -- Transaction Group #5 DROP INDEX IF EXISTS metrics_tripled_idx; @@ -147,7 +148,8 @@ SELECT FROM pg_class c LEFT JOIN pg_index i ON c.oid = i.indexrelid LEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid -WHERE c.relname = 'orders_code_key_pgschema_new'; +WHERE c.relname = 'orders_code_key_pgschema_new' + AND c.relnamespace = 'public'::regnamespace; -- Transaction Group #8 DROP INDEX IF EXISTS orders_code_key; @@ -168,7 +170,8 @@ SELECT FROM pg_class c LEFT JOIN pg_index i ON c.oid = i.indexrelid LEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid -WHERE c.relname = 'orders_lookup_idx_pgschema_new'; +WHERE c.relname = 'orders_lookup_idx_pgschema_new' + AND c.relnamespace = 'public'::regnamespace; -- Transaction Group #11 DROP INDEX IF EXISTS orders_lookup_idx; @@ -189,7 +192,8 @@ SELECT FROM pg_class c LEFT JOIN pg_index i ON c.oid = i.indexrelid LEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid -WHERE c.relname = 'orders_total_key'; +WHERE c.relname = 'orders_total_key' + AND c.relnamespace = 'public'::regnamespace; -- Transaction Group #14 ALTER TABLE vt DROP COLUMN v2; diff --git a/testdata/diff/create_trigger/add_trigger/plan.txt b/testdata/diff/create_trigger/add_trigger/plan.txt index 71977f9f6..e0629aabc 100644 --- a/testdata/diff/create_trigger/add_trigger/plan.txt +++ b/testdata/diff/create_trigger/add_trigger/plan.txt @@ -44,4 +44,4 @@ CREATE OR REPLACE TRIGGER employees_truncate_log_trigger CREATE OR REPLACE TRIGGER trg_employee_emails_insert INSTEAD OF INSERT ON employee_emails FOR EACH ROW - EXECUTE FUNCTION insert_employee_emails(); \ No newline at end of file + EXECUTE FUNCTION insert_employee_emails(); diff --git a/testdata/diff/dependency/issue_308_view_select_star_column_reorder/plan.json b/testdata/diff/dependency/issue_308_view_select_star_column_reorder/plan.json index 92831c9e7..ce6d6eb0b 100644 --- a/testdata/diff/dependency/issue_308_view_select_star_column_reorder/plan.json +++ b/testdata/diff/dependency/issue_308_view_select_star_column_reorder/plan.json @@ -53,7 +53,7 @@ { "steps": [ { - "sql": "SELECT \n COALESCE(i.indisvalid, false) as done,\n CASE \n WHEN p.blocks_total > 0 THEN p.blocks_done * 100 / p.blocks_total\n ELSE 0\n END as progress\nFROM pg_class c\nLEFT JOIN pg_index i ON c.oid = i.indexrelid\nLEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid\nWHERE c.relname = 'item_summary_id_idx';", + "sql": "SELECT \n COALESCE(i.indisvalid, false) as done,\n CASE \n WHEN p.blocks_total > 0 THEN p.blocks_done * 100 / p.blocks_total\n ELSE 0\n END as progress\nFROM pg_class c\nLEFT JOIN pg_index i ON c.oid = i.indexrelid\nLEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid\nWHERE c.relname = 'item_summary_id_idx'\n AND c.relnamespace = 'public'::regnamespace;", "directive": { "type": "wait", "message": "Creating index item_summary_id_idx" diff --git a/testdata/diff/dependency/issue_308_view_select_star_column_reorder/plan.sql b/testdata/diff/dependency/issue_308_view_select_star_column_reorder/plan.sql index fdb498dcd..833ef5761 100644 --- a/testdata/diff/dependency/issue_308_view_select_star_column_reorder/plan.sql +++ b/testdata/diff/dependency/issue_308_view_select_star_column_reorder/plan.sql @@ -30,4 +30,5 @@ SELECT FROM pg_class c LEFT JOIN pg_index i ON c.oid = i.indexrelid LEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid -WHERE c.relname = 'item_summary_id_idx'; +WHERE c.relname = 'item_summary_id_idx' + AND c.relnamespace = 'public'::regnamespace; diff --git a/testdata/diff/dependency/issue_308_view_select_star_column_reorder/plan.txt b/testdata/diff/dependency/issue_308_view_select_star_column_reorder/plan.txt index f40cc58e1..d5c2eade2 100644 --- a/testdata/diff/dependency/issue_308_view_select_star_column_reorder/plan.txt +++ b/testdata/diff/dependency/issue_308_view_select_star_column_reorder/plan.txt @@ -54,4 +54,5 @@ SELECT FROM pg_class c LEFT JOIN pg_index i ON c.oid = i.indexrelid LEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid -WHERE c.relname = 'item_summary_id_idx'; +WHERE c.relname = 'item_summary_id_idx' + AND c.relnamespace = 'public'::regnamespace; diff --git a/testdata/diff/dependency/issue_505_drop_trigger_function_with_table/plan.txt b/testdata/diff/dependency/issue_505_drop_trigger_function_with_table/plan.txt index 60bddc0a9..aabbaadd7 100644 --- a/testdata/diff/dependency/issue_505_drop_trigger_function_with_table/plan.txt +++ b/testdata/diff/dependency/issue_505_drop_trigger_function_with_table/plan.txt @@ -18,4 +18,4 @@ DROP TRIGGER IF EXISTS events_notify ON events; DROP FUNCTION IF EXISTS notify_event(); -DROP TABLE IF EXISTS events CASCADE; \ No newline at end of file +DROP TABLE IF EXISTS events CASCADE; diff --git a/testdata/diff/dependency/issue_535_domain_depends_on_table/plan.txt b/testdata/diff/dependency/issue_535_domain_depends_on_table/plan.txt index 6980c7c17..0c08a0afd 100644 --- a/testdata/diff/dependency/issue_535_domain_depends_on_table/plan.txt +++ b/testdata/diff/dependency/issue_535_domain_depends_on_table/plan.txt @@ -13,4 +13,4 @@ CREATE TABLE IF NOT EXISTS x ( ); -CREATE DOMAIN y AS x; \ No newline at end of file +CREATE DOMAIN y AS x; diff --git a/testdata/diff/migrate/v2/plan.json b/testdata/diff/migrate/v2/plan.json index def85dbed..1651b48e0 100644 --- a/testdata/diff/migrate/v2/plan.json +++ b/testdata/diff/migrate/v2/plan.json @@ -149,7 +149,7 @@ { "steps": [ { - "sql": "SELECT \n COALESCE(i.indisvalid, false) as done,\n CASE \n WHEN p.blocks_total > 0 THEN p.blocks_done * 100 / p.blocks_total\n ELSE 0\n END as progress\nFROM pg_class c\nLEFT JOIN pg_index i ON c.oid = i.indexrelid\nLEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid\nWHERE c.relname = 'idx_employee_hire_date';", + "sql": "SELECT \n COALESCE(i.indisvalid, false) as done,\n CASE \n WHEN p.blocks_total > 0 THEN p.blocks_done * 100 / p.blocks_total\n ELSE 0\n END as progress\nFROM pg_class c\nLEFT JOIN pg_index i ON c.oid = i.indexrelid\nLEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid\nWHERE c.relname = 'idx_employee_hire_date'\n AND c.relnamespace = 'public'::regnamespace;", "directive": { "type": "wait", "message": "Creating index idx_employee_hire_date" @@ -199,7 +199,7 @@ { "steps": [ { - "sql": "SELECT \n COALESCE(i.indisvalid, false) as done,\n CASE \n WHEN p.blocks_total > 0 THEN p.blocks_done * 100 / p.blocks_total\n ELSE 0\n END as progress\nFROM pg_class c\nLEFT JOIN pg_index i ON c.oid = i.indexrelid\nLEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid\nWHERE c.relname = 'idx_salary_amount';", + "sql": "SELECT \n COALESCE(i.indisvalid, false) as done,\n CASE \n WHEN p.blocks_total > 0 THEN p.blocks_done * 100 / p.blocks_total\n ELSE 0\n END as progress\nFROM pg_class c\nLEFT JOIN pg_index i ON c.oid = i.indexrelid\nLEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid\nWHERE c.relname = 'idx_salary_amount'\n AND c.relnamespace = 'public'::regnamespace;", "directive": { "type": "wait", "message": "Creating index idx_salary_amount" diff --git a/testdata/diff/migrate/v2/plan.sql b/testdata/diff/migrate/v2/plan.sql index 1cfa6c837..b8cd0e241 100644 --- a/testdata/diff/migrate/v2/plan.sql +++ b/testdata/diff/migrate/v2/plan.sql @@ -46,7 +46,8 @@ SELECT FROM pg_class c LEFT JOIN pg_index i ON c.oid = i.indexrelid LEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid -WHERE c.relname = 'idx_employee_hire_date'; +WHERE c.relname = 'idx_employee_hire_date' + AND c.relnamespace = 'public'::regnamespace; ALTER TABLE salary DROP CONSTRAINT salary_emp_no_fkey; @@ -67,7 +68,8 @@ SELECT FROM pg_class c LEFT JOIN pg_index i ON c.oid = i.indexrelid LEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid -WHERE c.relname = 'idx_salary_amount'; +WHERE c.relname = 'idx_salary_amount' + AND c.relnamespace = 'public'::regnamespace; ALTER TABLE title DROP CONSTRAINT title_emp_no_fkey; diff --git a/testdata/diff/migrate/v2/plan.txt b/testdata/diff/migrate/v2/plan.txt index e395be4f4..824c026b3 100644 --- a/testdata/diff/migrate/v2/plan.txt +++ b/testdata/diff/migrate/v2/plan.txt @@ -90,7 +90,8 @@ SELECT FROM pg_class c LEFT JOIN pg_index i ON c.oid = i.indexrelid LEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid -WHERE c.relname = 'idx_employee_hire_date'; +WHERE c.relname = 'idx_employee_hire_date' + AND c.relnamespace = 'public'::regnamespace; -- Transaction Group #13 ALTER TABLE salary DROP CONSTRAINT salary_emp_no_fkey; @@ -115,7 +116,8 @@ SELECT FROM pg_class c LEFT JOIN pg_index i ON c.oid = i.indexrelid LEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid -WHERE c.relname = 'idx_salary_amount'; +WHERE c.relname = 'idx_salary_amount' + AND c.relnamespace = 'public'::regnamespace; -- Transaction Group #17 ALTER TABLE title DROP CONSTRAINT title_emp_no_fkey; diff --git a/testdata/diff/migrate/v4/plan.json b/testdata/diff/migrate/v4/plan.json index 49a205075..bfccb6b58 100644 --- a/testdata/diff/migrate/v4/plan.json +++ b/testdata/diff/migrate/v4/plan.json @@ -53,7 +53,7 @@ { "steps": [ { - "sql": "SELECT \n COALESCE(i.indisvalid, false) as done,\n CASE \n WHEN p.blocks_total > 0 THEN p.blocks_done * 100 / p.blocks_total\n ELSE 0\n END as progress\nFROM pg_class c\nLEFT JOIN pg_index i ON c.oid = i.indexrelid\nLEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid\nWHERE c.relname = 'idx_audit_operation';", + "sql": "SELECT \n COALESCE(i.indisvalid, false) as done,\n CASE \n WHEN p.blocks_total > 0 THEN p.blocks_done * 100 / p.blocks_total\n ELSE 0\n END as progress\nFROM pg_class c\nLEFT JOIN pg_index i ON c.oid = i.indexrelid\nLEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid\nWHERE c.relname = 'idx_audit_operation'\n AND c.relnamespace = 'public'::regnamespace;", "directive": { "type": "wait", "message": "Creating index idx_audit_operation" @@ -77,7 +77,7 @@ { "steps": [ { - "sql": "SELECT \n COALESCE(i.indisvalid, false) as done,\n CASE \n WHEN p.blocks_total > 0 THEN p.blocks_done * 100 / p.blocks_total\n ELSE 0\n END as progress\nFROM pg_class c\nLEFT JOIN pg_index i ON c.oid = i.indexrelid\nLEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid\nWHERE c.relname = 'idx_audit_username';", + "sql": "SELECT \n COALESCE(i.indisvalid, false) as done,\n CASE \n WHEN p.blocks_total > 0 THEN p.blocks_done * 100 / p.blocks_total\n ELSE 0\n END as progress\nFROM pg_class c\nLEFT JOIN pg_index i ON c.oid = i.indexrelid\nLEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid\nWHERE c.relname = 'idx_audit_username'\n AND c.relnamespace = 'public'::regnamespace;", "directive": { "type": "wait", "message": "Creating index idx_audit_username" diff --git a/testdata/diff/migrate/v4/plan.sql b/testdata/diff/migrate/v4/plan.sql index e6c6016b2..4a9f80579 100644 --- a/testdata/diff/migrate/v4/plan.sql +++ b/testdata/diff/migrate/v4/plan.sql @@ -58,7 +58,8 @@ SELECT FROM pg_class c LEFT JOIN pg_index i ON c.oid = i.indexrelid LEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid -WHERE c.relname = 'idx_audit_operation'; +WHERE c.relname = 'idx_audit_operation' + AND c.relnamespace = 'public'::regnamespace; CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_audit_username ON audit (user_name); @@ -72,7 +73,8 @@ SELECT FROM pg_class c LEFT JOIN pg_index i ON c.oid = i.indexrelid LEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid -WHERE c.relname = 'idx_audit_username'; +WHERE c.relname = 'idx_audit_username' + AND c.relnamespace = 'public'::regnamespace; CREATE OR REPLACE TRIGGER salary_log_trigger AFTER UPDATE OR DELETE ON salary diff --git a/testdata/diff/migrate/v4/plan.txt b/testdata/diff/migrate/v4/plan.txt index 4496e76b2..35c96036d 100644 --- a/testdata/diff/migrate/v4/plan.txt +++ b/testdata/diff/migrate/v4/plan.txt @@ -94,7 +94,8 @@ SELECT FROM pg_class c LEFT JOIN pg_index i ON c.oid = i.indexrelid LEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid -WHERE c.relname = 'idx_audit_operation'; +WHERE c.relname = 'idx_audit_operation' + AND c.relnamespace = 'public'::regnamespace; -- Transaction Group #4 CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_audit_username ON audit (user_name); @@ -110,7 +111,8 @@ SELECT FROM pg_class c LEFT JOIN pg_index i ON c.oid = i.indexrelid LEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid -WHERE c.relname = 'idx_audit_username'; +WHERE c.relname = 'idx_audit_username' + AND c.relnamespace = 'public'::regnamespace; -- Transaction Group #6 CREATE OR REPLACE TRIGGER salary_log_trigger diff --git a/testdata/diff/online/add_composite_index/plan.json b/testdata/diff/online/add_composite_index/plan.json index cf69e82ec..0cdb6e31f 100644 --- a/testdata/diff/online/add_composite_index/plan.json +++ b/testdata/diff/online/add_composite_index/plan.json @@ -19,7 +19,7 @@ { "steps": [ { - "sql": "SELECT \n COALESCE(i.indisvalid, false) as done,\n CASE \n WHEN p.blocks_total > 0 THEN p.blocks_done * 100 / p.blocks_total\n ELSE 0\n END as progress\nFROM pg_class c\nLEFT JOIN pg_index i ON c.oid = i.indexrelid\nLEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid\nWHERE c.relname = 'idx_users_email_include';", + "sql": "SELECT \n COALESCE(i.indisvalid, false) as done,\n CASE \n WHEN p.blocks_total > 0 THEN p.blocks_done * 100 / p.blocks_total\n ELSE 0\n END as progress\nFROM pg_class c\nLEFT JOIN pg_index i ON c.oid = i.indexrelid\nLEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid\nWHERE c.relname = 'idx_users_email_include'\n AND c.relnamespace = 'public'::regnamespace;", "directive": { "type": "wait", "message": "Creating index idx_users_email_include" @@ -43,7 +43,7 @@ { "steps": [ { - "sql": "SELECT \n COALESCE(i.indisvalid, false) as done,\n CASE \n WHEN p.blocks_total > 0 THEN p.blocks_done * 100 / p.blocks_total\n ELSE 0\n END as progress\nFROM pg_class c\nLEFT JOIN pg_index i ON c.oid = i.indexrelid\nLEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid\nWHERE c.relname = 'idx_users_email_status';", + "sql": "SELECT \n COALESCE(i.indisvalid, false) as done,\n CASE \n WHEN p.blocks_total > 0 THEN p.blocks_done * 100 / p.blocks_total\n ELSE 0\n END as progress\nFROM pg_class c\nLEFT JOIN pg_index i ON c.oid = i.indexrelid\nLEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid\nWHERE c.relname = 'idx_users_email_status'\n AND c.relnamespace = 'public'::regnamespace;", "directive": { "type": "wait", "message": "Creating index idx_users_email_status" diff --git a/testdata/diff/online/add_composite_index/plan.sql b/testdata/diff/online/add_composite_index/plan.sql index 9d42d6f13..a2a7471fd 100644 --- a/testdata/diff/online/add_composite_index/plan.sql +++ b/testdata/diff/online/add_composite_index/plan.sql @@ -10,7 +10,8 @@ SELECT FROM pg_class c LEFT JOIN pg_index i ON c.oid = i.indexrelid LEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid -WHERE c.relname = 'idx_users_email_include'; +WHERE c.relname = 'idx_users_email_include' + AND c.relnamespace = 'public'::regnamespace; CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_users_email_status ON users (email, status DESC); @@ -24,4 +25,5 @@ SELECT FROM pg_class c LEFT JOIN pg_index i ON c.oid = i.indexrelid LEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid -WHERE c.relname = 'idx_users_email_status'; +WHERE c.relname = 'idx_users_email_status' + AND c.relnamespace = 'public'::regnamespace; diff --git a/testdata/diff/online/add_composite_index/plan.txt b/testdata/diff/online/add_composite_index/plan.txt index 685eb6a38..0a4691881 100644 --- a/testdata/diff/online/add_composite_index/plan.txt +++ b/testdata/diff/online/add_composite_index/plan.txt @@ -25,7 +25,8 @@ SELECT FROM pg_class c LEFT JOIN pg_index i ON c.oid = i.indexrelid LEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid -WHERE c.relname = 'idx_users_email_include'; +WHERE c.relname = 'idx_users_email_include' + AND c.relnamespace = 'public'::regnamespace; -- Transaction Group #3 CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_users_email_status ON users (email, status DESC); @@ -41,4 +42,5 @@ SELECT FROM pg_class c LEFT JOIN pg_index i ON c.oid = i.indexrelid LEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid -WHERE c.relname = 'idx_users_email_status'; +WHERE c.relname = 'idx_users_email_status' + AND c.relnamespace = 'public'::regnamespace; diff --git a/testdata/diff/online/add_functional_index/plan.json b/testdata/diff/online/add_functional_index/plan.json index a6215ec8a..ec9656dc2 100644 --- a/testdata/diff/online/add_functional_index/plan.json +++ b/testdata/diff/online/add_functional_index/plan.json @@ -19,7 +19,7 @@ { "steps": [ { - "sql": "SELECT \n COALESCE(i.indisvalid, false) as done,\n CASE \n WHEN p.blocks_total > 0 THEN p.blocks_done * 100 / p.blocks_total\n ELSE 0\n END as progress\nFROM pg_class c\nLEFT JOIN pg_index i ON c.oid = i.indexrelid\nLEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid\nWHERE c.relname = 'idx_users_fullname_search';", + "sql": "SELECT \n COALESCE(i.indisvalid, false) as done,\n CASE \n WHEN p.blocks_total > 0 THEN p.blocks_done * 100 / p.blocks_total\n ELSE 0\n END as progress\nFROM pg_class c\nLEFT JOIN pg_index i ON c.oid = i.indexrelid\nLEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid\nWHERE c.relname = 'idx_users_fullname_search'\n AND c.relnamespace = 'public'::regnamespace;", "directive": { "type": "wait", "message": "Creating index idx_users_fullname_search" diff --git a/testdata/diff/online/add_functional_index/plan.sql b/testdata/diff/online/add_functional_index/plan.sql index 9837516d0..fadd5a6d4 100644 --- a/testdata/diff/online/add_functional_index/plan.sql +++ b/testdata/diff/online/add_functional_index/plan.sql @@ -10,4 +10,5 @@ SELECT FROM pg_class c LEFT JOIN pg_index i ON c.oid = i.indexrelid LEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid -WHERE c.relname = 'idx_users_fullname_search'; +WHERE c.relname = 'idx_users_fullname_search' + AND c.relnamespace = 'public'::regnamespace; diff --git a/testdata/diff/online/add_functional_index/plan.txt b/testdata/diff/online/add_functional_index/plan.txt index d6f63a8c9..1103c58e4 100644 --- a/testdata/diff/online/add_functional_index/plan.txt +++ b/testdata/diff/online/add_functional_index/plan.txt @@ -24,4 +24,5 @@ SELECT FROM pg_class c LEFT JOIN pg_index i ON c.oid = i.indexrelid LEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid -WHERE c.relname = 'idx_users_fullname_search'; +WHERE c.relname = 'idx_users_fullname_search' + AND c.relnamespace = 'public'::regnamespace; diff --git a/testdata/diff/online/add_materialized_view_index/plan.json b/testdata/diff/online/add_materialized_view_index/plan.json index 542866190..61f1519b7 100644 --- a/testdata/diff/online/add_materialized_view_index/plan.json +++ b/testdata/diff/online/add_materialized_view_index/plan.json @@ -19,7 +19,7 @@ { "steps": [ { - "sql": "SELECT \n COALESCE(i.indisvalid, false) as done,\n CASE \n WHEN p.blocks_total > 0 THEN p.blocks_done * 100 / p.blocks_total\n ELSE 0\n END as progress\nFROM pg_class c\nLEFT JOIN pg_index i ON c.oid = i.indexrelid\nLEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid\nWHERE c.relname = 'idx_user_summary_created_at';", + "sql": "SELECT \n COALESCE(i.indisvalid, false) as done,\n CASE \n WHEN p.blocks_total > 0 THEN p.blocks_done * 100 / p.blocks_total\n ELSE 0\n END as progress\nFROM pg_class c\nLEFT JOIN pg_index i ON c.oid = i.indexrelid\nLEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid\nWHERE c.relname = 'idx_user_summary_created_at'\n AND c.relnamespace = 'public'::regnamespace;", "directive": { "type": "wait", "message": "Creating index idx_user_summary_created_at" diff --git a/testdata/diff/online/add_materialized_view_index/plan.sql b/testdata/diff/online/add_materialized_view_index/plan.sql index d0657d511..22b695c34 100644 --- a/testdata/diff/online/add_materialized_view_index/plan.sql +++ b/testdata/diff/online/add_materialized_view_index/plan.sql @@ -10,4 +10,5 @@ SELECT FROM pg_class c LEFT JOIN pg_index i ON c.oid = i.indexrelid LEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid -WHERE c.relname = 'idx_user_summary_created_at'; +WHERE c.relname = 'idx_user_summary_created_at' + AND c.relnamespace = 'public'::regnamespace; diff --git a/testdata/diff/online/add_materialized_view_index/plan.txt b/testdata/diff/online/add_materialized_view_index/plan.txt index 2ec00239f..f0f5cefbc 100644 --- a/testdata/diff/online/add_materialized_view_index/plan.txt +++ b/testdata/diff/online/add_materialized_view_index/plan.txt @@ -24,4 +24,5 @@ SELECT FROM pg_class c LEFT JOIN pg_index i ON c.oid = i.indexrelid LEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid -WHERE c.relname = 'idx_user_summary_created_at'; +WHERE c.relname = 'idx_user_summary_created_at' + AND c.relnamespace = 'public'::regnamespace; diff --git a/testdata/diff/online/add_partial_index/plan.json b/testdata/diff/online/add_partial_index/plan.json index 40683bae4..3488d2d5e 100644 --- a/testdata/diff/online/add_partial_index/plan.json +++ b/testdata/diff/online/add_partial_index/plan.json @@ -19,7 +19,7 @@ { "steps": [ { - "sql": "SELECT \n COALESCE(i.indisvalid, false) as done,\n CASE \n WHEN p.blocks_total > 0 THEN p.blocks_done * 100 / p.blocks_total\n ELSE 0\n END as progress\nFROM pg_class c\nLEFT JOIN pg_index i ON c.oid = i.indexrelid\nLEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid\nWHERE c.relname = 'idx_active_orders_customer_date';", + "sql": "SELECT \n COALESCE(i.indisvalid, false) as done,\n CASE \n WHEN p.blocks_total > 0 THEN p.blocks_done * 100 / p.blocks_total\n ELSE 0\n END as progress\nFROM pg_class c\nLEFT JOIN pg_index i ON c.oid = i.indexrelid\nLEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid\nWHERE c.relname = 'idx_active_orders_customer_date'\n AND c.relnamespace = 'public'::regnamespace;", "directive": { "type": "wait", "message": "Creating index idx_active_orders_customer_date" diff --git a/testdata/diff/online/add_partial_index/plan.sql b/testdata/diff/online/add_partial_index/plan.sql index 1326ffb9f..b9e7ec27e 100644 --- a/testdata/diff/online/add_partial_index/plan.sql +++ b/testdata/diff/online/add_partial_index/plan.sql @@ -10,4 +10,5 @@ SELECT FROM pg_class c LEFT JOIN pg_index i ON c.oid = i.indexrelid LEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid -WHERE c.relname = 'idx_active_orders_customer_date'; +WHERE c.relname = 'idx_active_orders_customer_date' + AND c.relnamespace = 'public'::regnamespace; diff --git a/testdata/diff/online/add_partial_index/plan.txt b/testdata/diff/online/add_partial_index/plan.txt index 5031615be..3f5c84478 100644 --- a/testdata/diff/online/add_partial_index/plan.txt +++ b/testdata/diff/online/add_partial_index/plan.txt @@ -24,4 +24,5 @@ SELECT FROM pg_class c LEFT JOIN pg_index i ON c.oid = i.indexrelid LEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid -WHERE c.relname = 'idx_active_orders_customer_date'; +WHERE c.relname = 'idx_active_orders_customer_date' + AND c.relnamespace = 'public'::regnamespace; diff --git a/testdata/diff/online/add_unique_multi_column_index/plan.json b/testdata/diff/online/add_unique_multi_column_index/plan.json index dbdaef609..c0c843d01 100644 --- a/testdata/diff/online/add_unique_multi_column_index/plan.json +++ b/testdata/diff/online/add_unique_multi_column_index/plan.json @@ -19,7 +19,7 @@ { "steps": [ { - "sql": "SELECT \n COALESCE(i.indisvalid, false) as done,\n CASE \n WHEN p.blocks_total > 0 THEN p.blocks_done * 100 / p.blocks_total\n ELSE 0\n END as progress\nFROM pg_class c\nLEFT JOIN pg_index i ON c.oid = i.indexrelid\nLEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid\nWHERE c.relname = 'idx_unique_email_org';", + "sql": "SELECT \n COALESCE(i.indisvalid, false) as done,\n CASE \n WHEN p.blocks_total > 0 THEN p.blocks_done * 100 / p.blocks_total\n ELSE 0\n END as progress\nFROM pg_class c\nLEFT JOIN pg_index i ON c.oid = i.indexrelid\nLEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid\nWHERE c.relname = 'idx_unique_email_org'\n AND c.relnamespace = 'public'::regnamespace;", "directive": { "type": "wait", "message": "Creating index idx_unique_email_org" diff --git a/testdata/diff/online/add_unique_multi_column_index/plan.sql b/testdata/diff/online/add_unique_multi_column_index/plan.sql index 68d55c810..f1c9ee6a0 100644 --- a/testdata/diff/online/add_unique_multi_column_index/plan.sql +++ b/testdata/diff/online/add_unique_multi_column_index/plan.sql @@ -10,4 +10,5 @@ SELECT FROM pg_class c LEFT JOIN pg_index i ON c.oid = i.indexrelid LEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid -WHERE c.relname = 'idx_unique_email_org'; +WHERE c.relname = 'idx_unique_email_org' + AND c.relnamespace = 'public'::regnamespace; diff --git a/testdata/diff/online/add_unique_multi_column_index/plan.txt b/testdata/diff/online/add_unique_multi_column_index/plan.txt index 7a0d4e440..13a6d74ec 100644 --- a/testdata/diff/online/add_unique_multi_column_index/plan.txt +++ b/testdata/diff/online/add_unique_multi_column_index/plan.txt @@ -24,4 +24,5 @@ SELECT FROM pg_class c LEFT JOIN pg_index i ON c.oid = i.indexrelid LEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid -WHERE c.relname = 'idx_unique_email_org'; +WHERE c.relname = 'idx_unique_email_org' + AND c.relnamespace = 'public'::regnamespace; diff --git a/testdata/diff/online/alter_composite_index/plan.json b/testdata/diff/online/alter_composite_index/plan.json index 6aab2dc64..f19500982 100644 --- a/testdata/diff/online/alter_composite_index/plan.json +++ b/testdata/diff/online/alter_composite_index/plan.json @@ -19,7 +19,7 @@ { "steps": [ { - "sql": "SELECT \n COALESCE(i.indisvalid, false) as done,\n CASE \n WHEN p.blocks_total > 0 THEN p.blocks_done * 100 / p.blocks_total\n ELSE 0\n END as progress\nFROM pg_class c\nLEFT JOIN pg_index i ON c.oid = i.indexrelid\nLEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid\nWHERE c.relname = 'idx_users_email_pgschema_new';", + "sql": "SELECT \n COALESCE(i.indisvalid, false) as done,\n CASE \n WHEN p.blocks_total > 0 THEN p.blocks_done * 100 / p.blocks_total\n ELSE 0\n END as progress\nFROM pg_class c\nLEFT JOIN pg_index i ON c.oid = i.indexrelid\nLEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid\nWHERE c.relname = 'idx_users_email_pgschema_new'\n AND c.relnamespace = 'public'::regnamespace;", "directive": { "type": "wait", "message": "Creating index idx_users_email_pgschema_new" @@ -59,7 +59,7 @@ { "steps": [ { - "sql": "SELECT \n COALESCE(i.indisvalid, false) as done,\n CASE \n WHEN p.blocks_total > 0 THEN p.blocks_done * 100 / p.blocks_total\n ELSE 0\n END as progress\nFROM pg_class c\nLEFT JOIN pg_index i ON c.oid = i.indexrelid\nLEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid\nWHERE c.relname = 'idx_users_status_pgschema_new';", + "sql": "SELECT \n COALESCE(i.indisvalid, false) as done,\n CASE \n WHEN p.blocks_total > 0 THEN p.blocks_done * 100 / p.blocks_total\n ELSE 0\n END as progress\nFROM pg_class c\nLEFT JOIN pg_index i ON c.oid = i.indexrelid\nLEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid\nWHERE c.relname = 'idx_users_status_pgschema_new'\n AND c.relnamespace = 'public'::regnamespace;", "directive": { "type": "wait", "message": "Creating index idx_users_status_pgschema_new" diff --git a/testdata/diff/online/alter_composite_index/plan.sql b/testdata/diff/online/alter_composite_index/plan.sql index 1e351f35d..32c587ad9 100644 --- a/testdata/diff/online/alter_composite_index/plan.sql +++ b/testdata/diff/online/alter_composite_index/plan.sql @@ -10,7 +10,8 @@ SELECT FROM pg_class c LEFT JOIN pg_index i ON c.oid = i.indexrelid LEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid -WHERE c.relname = 'idx_users_email_pgschema_new'; +WHERE c.relname = 'idx_users_email_pgschema_new' + AND c.relnamespace = 'public'::regnamespace; DROP INDEX IF EXISTS idx_users_email; @@ -28,7 +29,8 @@ SELECT FROM pg_class c LEFT JOIN pg_index i ON c.oid = i.indexrelid LEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid -WHERE c.relname = 'idx_users_status_pgschema_new'; +WHERE c.relname = 'idx_users_status_pgschema_new' + AND c.relnamespace = 'public'::regnamespace; DROP INDEX IF EXISTS idx_users_status; diff --git a/testdata/diff/online/alter_composite_index/plan.txt b/testdata/diff/online/alter_composite_index/plan.txt index 42d0816cf..d2762e8f3 100644 --- a/testdata/diff/online/alter_composite_index/plan.txt +++ b/testdata/diff/online/alter_composite_index/plan.txt @@ -25,7 +25,8 @@ SELECT FROM pg_class c LEFT JOIN pg_index i ON c.oid = i.indexrelid LEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid -WHERE c.relname = 'idx_users_email_pgschema_new'; +WHERE c.relname = 'idx_users_email_pgschema_new' + AND c.relnamespace = 'public'::regnamespace; -- Transaction Group #3 DROP INDEX IF EXISTS idx_users_email; @@ -46,7 +47,8 @@ SELECT FROM pg_class c LEFT JOIN pg_index i ON c.oid = i.indexrelid LEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid -WHERE c.relname = 'idx_users_status_pgschema_new'; +WHERE c.relname = 'idx_users_status_pgschema_new' + AND c.relnamespace = 'public'::regnamespace; -- Transaction Group #6 DROP INDEX IF EXISTS idx_users_status; diff --git a/testdata/diff/online/alter_materialized_view_index/plan.json b/testdata/diff/online/alter_materialized_view_index/plan.json index 9b4c81bc3..4f0e5a01b 100644 --- a/testdata/diff/online/alter_materialized_view_index/plan.json +++ b/testdata/diff/online/alter_materialized_view_index/plan.json @@ -19,7 +19,7 @@ { "steps": [ { - "sql": "SELECT \n COALESCE(i.indisvalid, false) as done,\n CASE \n WHEN p.blocks_total > 0 THEN p.blocks_done * 100 / p.blocks_total\n ELSE 0\n END as progress\nFROM pg_class c\nLEFT JOIN pg_index i ON c.oid = i.indexrelid\nLEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid\nWHERE c.relname = 'idx_user_summary_email_pgschema_new';", + "sql": "SELECT \n COALESCE(i.indisvalid, false) as done,\n CASE \n WHEN p.blocks_total > 0 THEN p.blocks_done * 100 / p.blocks_total\n ELSE 0\n END as progress\nFROM pg_class c\nLEFT JOIN pg_index i ON c.oid = i.indexrelid\nLEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid\nWHERE c.relname = 'idx_user_summary_email_pgschema_new'\n AND c.relnamespace = 'public'::regnamespace;", "directive": { "type": "wait", "message": "Creating index idx_user_summary_email_pgschema_new" diff --git a/testdata/diff/online/alter_materialized_view_index/plan.sql b/testdata/diff/online/alter_materialized_view_index/plan.sql index 8e7e8a1fc..ac2e440cf 100644 --- a/testdata/diff/online/alter_materialized_view_index/plan.sql +++ b/testdata/diff/online/alter_materialized_view_index/plan.sql @@ -10,7 +10,8 @@ SELECT FROM pg_class c LEFT JOIN pg_index i ON c.oid = i.indexrelid LEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid -WHERE c.relname = 'idx_user_summary_email_pgschema_new'; +WHERE c.relname = 'idx_user_summary_email_pgschema_new' + AND c.relnamespace = 'public'::regnamespace; DROP INDEX IF EXISTS idx_user_summary_email; diff --git a/testdata/diff/online/alter_materialized_view_index/plan.txt b/testdata/diff/online/alter_materialized_view_index/plan.txt index c764e24b1..95c6adc5e 100644 --- a/testdata/diff/online/alter_materialized_view_index/plan.txt +++ b/testdata/diff/online/alter_materialized_view_index/plan.txt @@ -24,7 +24,8 @@ SELECT FROM pg_class c LEFT JOIN pg_index i ON c.oid = i.indexrelid LEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid -WHERE c.relname = 'idx_user_summary_email_pgschema_new'; +WHERE c.relname = 'idx_user_summary_email_pgschema_new' + AND c.relnamespace = 'public'::regnamespace; -- Transaction Group #3 DROP INDEX IF EXISTS idx_user_summary_email; diff --git a/testdata/diff/online/issue_286_reserved_keyword_quoting/plan.json b/testdata/diff/online/issue_286_reserved_keyword_quoting/plan.json index 23f98097b..428542c62 100644 --- a/testdata/diff/online/issue_286_reserved_keyword_quoting/plan.json +++ b/testdata/diff/online/issue_286_reserved_keyword_quoting/plan.json @@ -29,7 +29,7 @@ { "steps": [ { - "sql": "SELECT \n COALESCE(i.indisvalid, false) as done,\n CASE \n WHEN p.blocks_total > 0 THEN p.blocks_done * 100 / p.blocks_total\n ELSE 0\n END as progress\nFROM pg_class c\nLEFT JOIN pg_index i ON c.oid = i.indexrelid\nLEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid\nWHERE c.relname = 'IDX_order_tenant_order_number';", + "sql": "SELECT \n COALESCE(i.indisvalid, false) as done,\n CASE \n WHEN p.blocks_total > 0 THEN p.blocks_done * 100 / p.blocks_total\n ELSE 0\n END as progress\nFROM pg_class c\nLEFT JOIN pg_index i ON c.oid = i.indexrelid\nLEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid\nWHERE c.relname = 'IDX_order_tenant_order_number'\n AND c.relnamespace = 'public'::regnamespace;", "directive": { "type": "wait", "message": "Creating index IDX_order_tenant_order_number" diff --git a/testdata/diff/online/issue_286_reserved_keyword_quoting/plan.sql b/testdata/diff/online/issue_286_reserved_keyword_quoting/plan.sql index 27f857efa..80ee2db9f 100644 --- a/testdata/diff/online/issue_286_reserved_keyword_quoting/plan.sql +++ b/testdata/diff/online/issue_286_reserved_keyword_quoting/plan.sql @@ -13,4 +13,5 @@ SELECT FROM pg_class c LEFT JOIN pg_index i ON c.oid = i.indexrelid LEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid -WHERE c.relname = 'IDX_order_tenant_order_number'; +WHERE c.relname = 'IDX_order_tenant_order_number' + AND c.relnamespace = 'public'::regnamespace; diff --git a/testdata/diff/online/issue_286_reserved_keyword_quoting/plan.txt b/testdata/diff/online/issue_286_reserved_keyword_quoting/plan.txt index df9ca2368..b93706c1b 100644 --- a/testdata/diff/online/issue_286_reserved_keyword_quoting/plan.txt +++ b/testdata/diff/online/issue_286_reserved_keyword_quoting/plan.txt @@ -29,4 +29,5 @@ SELECT FROM pg_class c LEFT JOIN pg_index i ON c.oid = i.indexrelid LEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid -WHERE c.relname = 'IDX_order_tenant_order_number'; +WHERE c.relname = 'IDX_order_tenant_order_number' + AND c.relnamespace = 'public'::regnamespace; diff --git a/testdata/diff/online/issue_418_partitioned_parent_index/plan.json b/testdata/diff/online/issue_418_partitioned_parent_index/plan.json index 01c5057b2..c2af9c65d 100644 --- a/testdata/diff/online/issue_418_partitioned_parent_index/plan.json +++ b/testdata/diff/online/issue_418_partitioned_parent_index/plan.json @@ -29,7 +29,7 @@ { "steps": [ { - "sql": "SELECT \n COALESCE(i.indisvalid, false) as done,\n CASE \n WHEN p.blocks_total > 0 THEN p.blocks_done * 100 / p.blocks_total\n ELSE 0\n END as progress\nFROM pg_class c\nLEFT JOIN pg_index i ON c.oid = i.indexrelid\nLEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid\nWHERE c.relname = 'events_2026_04_payload_idx';", + "sql": "SELECT \n COALESCE(i.indisvalid, false) as done,\n CASE \n WHEN p.blocks_total > 0 THEN p.blocks_done * 100 / p.blocks_total\n ELSE 0\n END as progress\nFROM pg_class c\nLEFT JOIN pg_index i ON c.oid = i.indexrelid\nLEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid\nWHERE c.relname = 'events_2026_04_payload_idx'\n AND c.relnamespace = 'public'::regnamespace;", "directive": { "type": "wait", "message": "Creating index events_2026_04_payload_idx" diff --git a/testdata/diff/online/issue_418_partitioned_parent_index/plan.sql b/testdata/diff/online/issue_418_partitioned_parent_index/plan.sql index 3abd716d9..b00a2adf8 100644 --- a/testdata/diff/online/issue_418_partitioned_parent_index/plan.sql +++ b/testdata/diff/online/issue_418_partitioned_parent_index/plan.sql @@ -12,4 +12,5 @@ SELECT FROM pg_class c LEFT JOIN pg_index i ON c.oid = i.indexrelid LEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid -WHERE c.relname = 'events_2026_04_payload_idx'; +WHERE c.relname = 'events_2026_04_payload_idx' + AND c.relnamespace = 'public'::regnamespace; diff --git a/testdata/diff/online/issue_418_partitioned_parent_index/plan.txt b/testdata/diff/online/issue_418_partitioned_parent_index/plan.txt index 9744e6577..0f4059638 100644 --- a/testdata/diff/online/issue_418_partitioned_parent_index/plan.txt +++ b/testdata/diff/online/issue_418_partitioned_parent_index/plan.txt @@ -29,4 +29,5 @@ SELECT FROM pg_class c LEFT JOIN pg_index i ON c.oid = i.indexrelid LEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid -WHERE c.relname = 'events_2026_04_payload_idx'; +WHERE c.relname = 'events_2026_04_payload_idx' + AND c.relnamespace = 'public'::regnamespace; diff --git a/testdata/diff/online/issue_509_index_rebuild_dropped_column/plan.json b/testdata/diff/online/issue_509_index_rebuild_dropped_column/plan.json index 139ce8ee8..1984ff186 100644 --- a/testdata/diff/online/issue_509_index_rebuild_dropped_column/plan.json +++ b/testdata/diff/online/issue_509_index_rebuild_dropped_column/plan.json @@ -29,7 +29,7 @@ { "steps": [ { - "sql": "SELECT \n COALESCE(i.indisvalid, false) as done,\n CASE \n WHEN p.blocks_total > 0 THEN p.blocks_done * 100 / p.blocks_total\n ELSE 0\n END as progress\nFROM pg_class c\nLEFT JOIN pg_index i ON c.oid = i.indexrelid\nLEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid\nWHERE c.relname = 'idx_notifications_tenant_user_pgschema_new';", + "sql": "SELECT \n COALESCE(i.indisvalid, false) as done,\n CASE \n WHEN p.blocks_total > 0 THEN p.blocks_done * 100 / p.blocks_total\n ELSE 0\n END as progress\nFROM pg_class c\nLEFT JOIN pg_index i ON c.oid = i.indexrelid\nLEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid\nWHERE c.relname = 'idx_notifications_tenant_user_pgschema_new'\n AND c.relnamespace = 'public'::regnamespace;", "directive": { "type": "wait", "message": "Creating index idx_notifications_tenant_user_pgschema_new" diff --git a/testdata/diff/online/issue_509_index_rebuild_dropped_column/plan.sql b/testdata/diff/online/issue_509_index_rebuild_dropped_column/plan.sql index 349c03c9c..bb7bb96ad 100644 --- a/testdata/diff/online/issue_509_index_rebuild_dropped_column/plan.sql +++ b/testdata/diff/online/issue_509_index_rebuild_dropped_column/plan.sql @@ -12,7 +12,8 @@ SELECT FROM pg_class c LEFT JOIN pg_index i ON c.oid = i.indexrelid LEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid -WHERE c.relname = 'idx_notifications_tenant_user_pgschema_new'; +WHERE c.relname = 'idx_notifications_tenant_user_pgschema_new' + AND c.relnamespace = 'public'::regnamespace; DROP INDEX IF EXISTS idx_notifications_tenant_user; diff --git a/testdata/diff/online/issue_509_index_rebuild_dropped_column/plan.txt b/testdata/diff/online/issue_509_index_rebuild_dropped_column/plan.txt index 7eb4b5255..dcf3989cb 100644 --- a/testdata/diff/online/issue_509_index_rebuild_dropped_column/plan.txt +++ b/testdata/diff/online/issue_509_index_rebuild_dropped_column/plan.txt @@ -28,7 +28,8 @@ SELECT FROM pg_class c LEFT JOIN pg_index i ON c.oid = i.indexrelid LEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid -WHERE c.relname = 'idx_notifications_tenant_user_pgschema_new'; +WHERE c.relname = 'idx_notifications_tenant_user_pgschema_new' + AND c.relnamespace = 'public'::regnamespace; -- Transaction Group #4 DROP INDEX IF EXISTS idx_notifications_tenant_user; From 4acabf966e1f7b51d9131ebe15b9cfd99dfe1a0a Mon Sep 17 00:00:00 2001 From: Shehjad Date: Thu, 15 Oct 2026 10:50:22 +0600 Subject: [PATCH 2/3] fix: compare wait-query schema by escaped nspname (#641) The ''::regnamespace cast case-folds unquoted names, so a mixed-case schema such as "TenantB" was looked up as tenantb, and an apostrophe in the schema name produced invalid SQL. Join pg_namespace and compare nspname (and relname) against properly escaped string literals. Make the issue #641 integration test fail after a deadline instead of hanging, cover a mixed-case quoted schema, and regenerate the plan fixtures that embed the wait query. --- cmd/issue_641_integration_test.go | 174 +++++++----------- internal/plan/rewrite.go | 15 +- internal/plan/rewrite_test.go | 36 +++- .../add_index_with_reloptions/plan.json | 4 +- .../add_index_with_reloptions/plan.sql | 6 +- .../add_index_with_reloptions/plan.txt | 6 +- .../alter_index_null_order/plan.json | 2 +- .../alter_index_null_order/plan.sql | 3 +- .../alter_index_null_order/plan.txt | 3 +- .../issue_295_pgvector_typmod/plan.json | 2 +- .../issue_295_pgvector_typmod/plan.sql | 3 +- .../issue_295_pgvector_typmod/plan.txt | 3 +- .../plan.json | 2 +- .../plan.sql | 3 +- .../plan.txt | 3 +- .../plan.json | 8 +- .../issue_591_alter_generated_column/plan.sql | 12 +- .../issue_591_alter_generated_column/plan.txt | 12 +- .../plan.json | 2 +- .../plan.sql | 3 +- .../plan.txt | 3 +- testdata/diff/migrate/v2/plan.json | 4 +- testdata/diff/migrate/v2/plan.sql | 6 +- testdata/diff/migrate/v2/plan.txt | 6 +- testdata/diff/migrate/v4/plan.json | 4 +- testdata/diff/migrate/v4/plan.sql | 6 +- testdata/diff/migrate/v4/plan.txt | 6 +- .../diff/online/add_composite_index/plan.json | 4 +- .../diff/online/add_composite_index/plan.sql | 6 +- .../diff/online/add_composite_index/plan.txt | 6 +- .../online/add_functional_index/plan.json | 2 +- .../diff/online/add_functional_index/plan.sql | 3 +- .../diff/online/add_functional_index/plan.txt | 3 +- .../add_materialized_view_index/plan.json | 2 +- .../add_materialized_view_index/plan.sql | 3 +- .../add_materialized_view_index/plan.txt | 3 +- .../diff/online/add_partial_index/plan.json | 2 +- .../diff/online/add_partial_index/plan.sql | 3 +- .../diff/online/add_partial_index/plan.txt | 3 +- .../add_unique_multi_column_index/plan.json | 2 +- .../add_unique_multi_column_index/plan.sql | 3 +- .../add_unique_multi_column_index/plan.txt | 3 +- .../online/alter_composite_index/plan.json | 4 +- .../online/alter_composite_index/plan.sql | 6 +- .../online/alter_composite_index/plan.txt | 6 +- .../alter_materialized_view_index/plan.json | 2 +- .../alter_materialized_view_index/plan.sql | 3 +- .../alter_materialized_view_index/plan.txt | 3 +- .../plan.json | 2 +- .../plan.sql | 3 +- .../plan.txt | 3 +- .../plan.json | 2 +- .../plan.sql | 3 +- .../plan.txt | 3 +- .../plan.json | 2 +- .../plan.sql | 3 +- .../plan.txt | 3 +- 57 files changed, 245 insertions(+), 188 deletions(-) diff --git a/cmd/issue_641_integration_test.go b/cmd/issue_641_integration_test.go index 44f64dc16..3efbfcdfd 100644 --- a/cmd/issue_641_integration_test.go +++ b/cmd/issue_641_integration_test.go @@ -2,6 +2,8 @@ package cmd import ( "context" + "database/sql" + "fmt" "os" "path/filepath" "strings" @@ -13,10 +15,10 @@ import ( // TestIssue641ConcurrentIndexWaitCrossSchema reproduces // https://github.com/pgplex/pgschema/issues/641: an invalid index of the same -// name in another schema makes an unqualified wait query report done=false -// forever. The fixed wait query is schema-qualified and returns done=true for -// the target schema's valid index. An end-to-end apply on tenant_b also -// completes quickly despite the invalid peer in tenant_a. +// name in another schema made the CREATE INDEX CONCURRENTLY wait query, which +// matched by index name only, report done=false forever. The wait query is now +// schema-qualified by exact nspname, so apply completes for the target schema, +// including mixed-case quoted schema names. func TestIssue641ConcurrentIndexWaitCrossSchema(t *testing.T) { if testing.Short() { t.Skip("Skipping integration test in short mode") @@ -29,132 +31,92 @@ func TestIssue641ConcurrentIndexWaitCrossSchema(t *testing.T) { conn, host, port, dbname, user, password := testutil.ConnectToPostgres(t, embeddedPG) defer conn.Close() - setup := ` + // A failed concurrent unique build leaves an invalid tenant_a.items_sku_idx. + if _, err := conn.ExecContext(ctx, ` CREATE SCHEMA tenant_a; -CREATE SCHEMA tenant_b; CREATE TABLE tenant_a.items (sku int); INSERT INTO tenant_a.items VALUES (1), (1); -CREATE TABLE tenant_b.items (sku int); -INSERT INTO tenant_b.items VALUES (1), (2); -` - if _, err := conn.ExecContext(ctx, setup); err != nil { - t.Fatalf("setup schemas: %v", err) +`); err != nil { + t.Fatalf("setup tenant_a: %v", err) } - - _, err := conn.ExecContext(ctx, `CREATE UNIQUE INDEX CONCURRENTLY items_sku_idx ON tenant_a.items (sku)`) - if err == nil { + if _, err := conn.ExecContext(ctx, `CREATE UNIQUE INDEX CONCURRENTLY items_sku_idx ON tenant_a.items (sku)`); err == nil { t.Fatal("expected unique violation creating concurrent index on tenant_a") } - - var aValid bool - if err := conn.QueryRowContext(ctx, ` - SELECT i.indisvalid FROM pg_class c - JOIN pg_namespace n ON c.relnamespace = n.oid - JOIN pg_index i ON c.oid = i.indexrelid - WHERE n.nspname = 'tenant_a' AND c.relname = 'items_sku_idx' - `).Scan(&aValid); err != nil { - t.Fatalf("inspect tenant_a index: %v", err) - } - if aValid { + if valid := indexValid(t, conn, "tenant_a", "items_sku_idx"); valid { t.Fatal("expected tenant_a.items_sku_idx to be invalid") } - // Pre-fix wait query (name only) — matches checkWaitStatus's first-row scan. - unqualified := ` + // The pre-fix wait query (index name only) reports done=false: apply hangs. + var done bool + if err := conn.QueryRowContext(ctx, ` SELECT COALESCE(i.indisvalid, false) as done FROM pg_class c LEFT JOIN pg_index i ON c.oid = i.indexrelid -WHERE c.relname = 'items_sku_idx' -` - var done bool - if err := conn.QueryRowContext(ctx, unqualified).Scan(&done); err != nil { +WHERE c.relname = 'items_sku_idx'`).Scan(&done); err != nil { t.Fatalf("unqualified wait query: %v", err) } if done { - t.Fatal("expected unqualified wait on invalid index to report done=false") - } - t.Log("reproduced issue #641 root cause: unqualified wait on invalid cross-schema index returns done=false (would hang apply)") - - if _, err := conn.ExecContext(ctx, `CREATE INDEX items_sku_idx ON tenant_b.items (sku)`); err != nil { - t.Fatalf("create valid index on tenant_b: %v", err) - } - - // With both indexes present, unqualified can return either row first. - var n int - if err := conn.QueryRowContext(ctx, `SELECT count(*) FROM pg_class c WHERE c.relname = 'items_sku_idx'`).Scan(&n); err != nil { - t.Fatal(err) - } - if n != 2 { - t.Fatalf("expected 2 indexes named items_sku_idx, got %d", n) + t.Fatal("expected name-only wait query on invalid index to report done=false") } - qualified := ` -SELECT - COALESCE(i.indisvalid, false) as done, - CASE - WHEN p.blocks_total > 0 THEN p.blocks_done * 100 / p.blocks_total - ELSE 0 - END as progress -FROM pg_class c -LEFT JOIN pg_index i ON c.oid = i.indexrelid -LEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid -WHERE c.relname = 'items_sku_idx' - AND c.relnamespace = 'tenant_b'::regnamespace; -` - var progress int - if err := conn.QueryRowContext(ctx, qualified).Scan(&done, &progress); err != nil { - t.Fatalf("qualified wait query: %v", err) - } - if !done { - t.Fatal("schema-qualified wait query should report done=true for tenant_b") - } - t.Log("schema-qualified wait query reports done=true for tenant_b despite invalid peer in tenant_a") + for _, schema := range []string{"tenant_b", "TenantB"} { + t.Run(schema, func(t *testing.T) { + quoted := `"` + schema + `"` + if _, err := conn.ExecContext(ctx, fmt.Sprintf(` +CREATE SCHEMA %[1]s; +CREATE TABLE %[1]s.items (sku int); +INSERT INTO %[1]s.items VALUES (1), (2);`, quoted)); err != nil { + t.Fatalf("setup %s: %v", schema, err) + } - if _, err := conn.ExecContext(ctx, `DROP INDEX tenant_b.items_sku_idx`); err != nil { - t.Fatalf("drop tenant_b index for apply: %v", err) - } - - desired := ` + desiredFile := filepath.Join(t.TempDir(), "desired.sql") + desired := ` CREATE TABLE items (sku int); -CREATE INDEX items_sku_idx ON tenant_b.items USING btree (sku); +CREATE INDEX items_sku_idx ON items USING btree (sku); ` - tmp := t.TempDir() - desiredFile := filepath.Join(tmp, "desired.sql") - if err := os.WriteFile(desiredFile, []byte(desired), 0644); err != nil { - t.Fatal(err) - } - - planSQL, err := generatePlanSQLFormatted(host, port, dbname, user, password, "tenant_b", desiredFile) - if err != nil { - t.Fatalf("plan tenant_b index: %v", err) - } - if !strings.Contains(planSQL, "CREATE INDEX") { - t.Fatalf("expected index create in plan:\n%s", planSQL) - } - if strings.Contains(planSQL, "relname") && !strings.Contains(planSQL, "relnamespace = 'tenant_b'::regnamespace") { - t.Fatalf("plan wait query missing schema qualification:\n%s", planSQL) - } - - start := time.Now() - if err := applySchemaChanges(host, port, dbname, user, password, "tenant_b", desiredFile); err != nil { - t.Fatalf("apply tenant_b index with invalid peer in tenant_a: %v", err) - } - elapsed := time.Since(start) - if elapsed > 30*time.Second { - t.Fatalf("apply took %v; likely hung on cross-schema invalid index (issue #641)", elapsed) + if err := os.WriteFile(desiredFile, []byte(desired), 0644); err != nil { + t.Fatal(err) + } + + planSQL, err := generatePlanSQLFormatted(host, port, dbname, user, password, schema, desiredFile) + if err != nil { + t.Fatalf("plan: %v", err) + } + wantFilter := "n.nspname = '" + schema + "'" + if !strings.Contains(planSQL, "CREATE INDEX CONCURRENTLY") || !strings.Contains(planSQL, wantFilter) { + t.Fatalf("expected concurrent index with wait filter %q in plan:\n%s", wantFilter, planSQL) + } + + // Fail rather than hang if the wait directive never completes. + errCh := make(chan error, 1) + go func() { + errCh <- applySchemaChanges(host, port, dbname, user, password, schema, desiredFile) + }() + select { + case err := <-errCh: + if err != nil { + t.Fatalf("apply with invalid peer index in tenant_a: %v", err) + } + case <-time.After(60 * time.Second): + t.Fatal("apply did not finish within 60s; wait directive likely matched tenant_a's invalid index (issue #641)") + } + + if !indexValid(t, conn, schema, "items_sku_idx") { + t.Fatalf("expected %s.items_sku_idx valid after apply", schema) + } + }) } +} - var bValid bool - if err := conn.QueryRowContext(ctx, ` +func indexValid(t *testing.T, conn *sql.DB, schema, index string) bool { + t.Helper() + var valid bool + if err := conn.QueryRow(` SELECT i.indisvalid FROM pg_class c JOIN pg_namespace n ON c.relnamespace = n.oid JOIN pg_index i ON c.oid = i.indexrelid - WHERE n.nspname = 'tenant_b' AND c.relname = 'items_sku_idx' - `).Scan(&bValid); err != nil { - t.Fatalf("inspect tenant_b after apply: %v", err) - } - if !bValid { - t.Fatal("expected tenant_b.items_sku_idx valid after apply") + WHERE n.nspname = $1 AND c.relname = $2`, schema, index).Scan(&valid); err != nil { + t.Fatalf("inspect %s.%s: %v", schema, index, err) } - t.Logf("apply completed in %v with schema-qualified wait (issue #641 fixed)", elapsed) + return valid } diff --git a/internal/plan/rewrite.go b/internal/plan/rewrite.go index 221b21236..2c2611720 100644 --- a/internal/plan/rewrite.go +++ b/internal/plan/rewrite.go @@ -554,6 +554,10 @@ func generateIndexSQL(index *ir.Index, isConcurrent bool) string { // The query is schema-qualified so an invalid index of the same name in another // schema (e.g. a failed CREATE INDEX CONCURRENTLY left behind in a sibling // tenant schema) cannot make apply hang forever. See issue #641. +// +// The schema is matched by pg_namespace.nspname against an escaped string +// literal rather than a '...'::regnamespace cast, which would case-fold +// unquoted mixed-case names and break on embedded quotes. func generateIndexWaitQueryWithName(schemaName, indexName string) string { return fmt.Sprintf(`SELECT COALESCE(i.indisvalid, false) as done, @@ -562,10 +566,17 @@ func generateIndexWaitQueryWithName(schemaName, indexName string) string { ELSE 0 END as progress FROM pg_class c +JOIN pg_namespace n ON c.relnamespace = n.oid LEFT JOIN pg_index i ON c.oid = i.indexrelid LEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid -WHERE c.relname = '%s' - AND c.relnamespace = '%s'::regnamespace;`, indexName, schemaName) +WHERE c.relname = %s + AND n.nspname = %s;`, quoteSQLLiteral(indexName), quoteSQLLiteral(schemaName)) +} + +// quoteSQLLiteral returns s as a single-quoted SQL string literal, doubling +// embedded single quotes. +func quoteSQLLiteral(s string) string { + return "'" + strings.ReplaceAll(s, "'", "''") + "'" } // Helper functions diff --git a/internal/plan/rewrite_test.go b/internal/plan/rewrite_test.go index f0345dc9b..5bbd70d21 100644 --- a/internal/plan/rewrite_test.go +++ b/internal/plan/rewrite_test.go @@ -225,7 +225,7 @@ func TestGenerateIndexWaitQuerySchemaQualified(t *testing.T) { if !strings.Contains(sql, "c.relname = 'items_sku_idx'") { t.Fatalf("wait query missing index name filter:\n%s", sql) } - if !strings.Contains(sql, "c.relnamespace = 'tenant_b'::regnamespace") { + if !strings.Contains(sql, "n.nspname = 'tenant_b'") { t.Fatalf("wait query missing schema qualification (issue #641):\n%s", sql) } } @@ -246,10 +246,42 @@ func TestGenerateIndexRewriteWaitIsSchemaQualified(t *testing.T) { t.Fatalf("expected concurrent create + wait steps, got %d", len(steps)) } wait := steps[1].SQL - if !strings.Contains(wait, "c.relnamespace = 'tenant_b'::regnamespace") { + if !strings.Contains(wait, "n.nspname = 'tenant_b'") { t.Fatalf("rewrite wait step not schema-qualified:\n%s", wait) } if steps[1].Directive == nil || steps[1].Directive.Type != DirectiveTypeWait { t.Fatalf("expected wait directive on step 1, got %#v", steps[1].Directive) } } + +// TestGenerateIndexWaitQueryEscapesNames verifies the wait query matches the +// exact (case-sensitive) schema name and escapes embedded single quotes, +// instead of relying on a '...'::regnamespace cast that case-folds unquoted +// names (issue #641). +func TestGenerateIndexWaitQueryEscapesNames(t *testing.T) { + tests := []struct { + name string + schema string + index string + wantSchema string + wantIndex string + }{ + {"mixed case schema", "TenantB", "items_sku_idx", "n.nspname = 'TenantB'", "c.relname = 'items_sku_idx'"}, + {"apostrophe in schema", "o'brien", "items_sku_idx", "n.nspname = 'o''brien'", "c.relname = 'items_sku_idx'"}, + {"apostrophe in index", "public", "it's_idx", "n.nspname = 'public'", "c.relname = 'it''s_idx'"}, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + sql := generateIndexWaitQueryWithName(tt.schema, tt.index) + if !strings.Contains(sql, tt.wantSchema) { + t.Errorf("wait query missing %q:\n%s", tt.wantSchema, sql) + } + if !strings.Contains(sql, tt.wantIndex) { + t.Errorf("wait query missing %q:\n%s", tt.wantIndex, sql) + } + if strings.Contains(sql, "regnamespace") { + t.Errorf("wait query must not cast to regnamespace:\n%s", sql) + } + }) + } +} diff --git a/testdata/diff/create_index/add_index_with_reloptions/plan.json b/testdata/diff/create_index/add_index_with_reloptions/plan.json index 68c4f64e7..d43c109e1 100644 --- a/testdata/diff/create_index/add_index_with_reloptions/plan.json +++ b/testdata/diff/create_index/add_index_with_reloptions/plan.json @@ -19,7 +19,7 @@ { "steps": [ { - "sql": "SELECT \n COALESCE(i.indisvalid, false) as done,\n CASE \n WHEN p.blocks_total > 0 THEN p.blocks_done * 100 / p.blocks_total\n ELSE 0\n END as progress\nFROM pg_class c\nLEFT JOIN pg_index i ON c.oid = i.indexrelid\nLEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid\nWHERE c.relname = 'idx_orders_status_active'\n AND c.relnamespace = 'public'::regnamespace;", + "sql": "SELECT \n COALESCE(i.indisvalid, false) as done,\n CASE \n WHEN p.blocks_total > 0 THEN p.blocks_done * 100 / p.blocks_total\n ELSE 0\n END as progress\nFROM pg_class c\nJOIN pg_namespace n ON c.relnamespace = n.oid\nLEFT JOIN pg_index i ON c.oid = i.indexrelid\nLEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid\nWHERE c.relname = 'idx_orders_status_active'\n AND n.nspname = 'public';", "directive": { "type": "wait", "message": "Creating index idx_orders_status_active" @@ -43,7 +43,7 @@ { "steps": [ { - "sql": "SELECT \n COALESCE(i.indisvalid, false) as done,\n CASE \n WHEN p.blocks_total > 0 THEN p.blocks_done * 100 / p.blocks_total\n ELSE 0\n END as progress\nFROM pg_class c\nLEFT JOIN pg_index i ON c.oid = i.indexrelid\nLEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid\nWHERE c.relname = 'idx_orders_user_id'\n AND c.relnamespace = 'public'::regnamespace;", + "sql": "SELECT \n COALESCE(i.indisvalid, false) as done,\n CASE \n WHEN p.blocks_total > 0 THEN p.blocks_done * 100 / p.blocks_total\n ELSE 0\n END as progress\nFROM pg_class c\nJOIN pg_namespace n ON c.relnamespace = n.oid\nLEFT JOIN pg_index i ON c.oid = i.indexrelid\nLEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid\nWHERE c.relname = 'idx_orders_user_id'\n AND n.nspname = 'public';", "directive": { "type": "wait", "message": "Creating index idx_orders_user_id" diff --git a/testdata/diff/create_index/add_index_with_reloptions/plan.sql b/testdata/diff/create_index/add_index_with_reloptions/plan.sql index d19d66f8a..82e697962 100644 --- a/testdata/diff/create_index/add_index_with_reloptions/plan.sql +++ b/testdata/diff/create_index/add_index_with_reloptions/plan.sql @@ -8,10 +8,11 @@ SELECT ELSE 0 END as progress FROM pg_class c +JOIN pg_namespace n ON c.relnamespace = n.oid LEFT JOIN pg_index i ON c.oid = i.indexrelid LEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid WHERE c.relname = 'idx_orders_status_active' - AND c.relnamespace = 'public'::regnamespace; + AND n.nspname = 'public'; CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_orders_user_id ON orders (user_id) WITH (fillfactor=90); @@ -23,7 +24,8 @@ SELECT ELSE 0 END as progress FROM pg_class c +JOIN pg_namespace n ON c.relnamespace = n.oid LEFT JOIN pg_index i ON c.oid = i.indexrelid LEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid WHERE c.relname = 'idx_orders_user_id' - AND c.relnamespace = 'public'::regnamespace; + AND n.nspname = 'public'; diff --git a/testdata/diff/create_index/add_index_with_reloptions/plan.txt b/testdata/diff/create_index/add_index_with_reloptions/plan.txt index 73a60f744..4f05e268a 100644 --- a/testdata/diff/create_index/add_index_with_reloptions/plan.txt +++ b/testdata/diff/create_index/add_index_with_reloptions/plan.txt @@ -23,10 +23,11 @@ SELECT ELSE 0 END as progress FROM pg_class c +JOIN pg_namespace n ON c.relnamespace = n.oid LEFT JOIN pg_index i ON c.oid = i.indexrelid LEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid WHERE c.relname = 'idx_orders_status_active' - AND c.relnamespace = 'public'::regnamespace; + AND n.nspname = 'public'; -- Transaction Group #3 CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_orders_user_id ON orders (user_id) WITH (fillfactor=90); @@ -40,7 +41,8 @@ SELECT ELSE 0 END as progress FROM pg_class c +JOIN pg_namespace n ON c.relnamespace = n.oid LEFT JOIN pg_index i ON c.oid = i.indexrelid LEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid WHERE c.relname = 'idx_orders_user_id' - AND c.relnamespace = 'public'::regnamespace; + AND n.nspname = 'public'; diff --git a/testdata/diff/create_index/alter_index_null_order/plan.json b/testdata/diff/create_index/alter_index_null_order/plan.json index 3922f2260..20219e24d 100644 --- a/testdata/diff/create_index/alter_index_null_order/plan.json +++ b/testdata/diff/create_index/alter_index_null_order/plan.json @@ -19,7 +19,7 @@ { "steps": [ { - "sql": "SELECT \n COALESCE(i.indisvalid, false) as done,\n CASE \n WHEN p.blocks_total > 0 THEN p.blocks_done * 100 / p.blocks_total\n ELSE 0\n END as progress\nFROM pg_class c\nLEFT JOIN pg_index i ON c.oid = i.indexrelid\nLEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid\nWHERE c.relname = 'idx_events_desc_pgschema_new'\n AND c.relnamespace = 'public'::regnamespace;", + "sql": "SELECT \n COALESCE(i.indisvalid, false) as done,\n CASE \n WHEN p.blocks_total > 0 THEN p.blocks_done * 100 / p.blocks_total\n ELSE 0\n END as progress\nFROM pg_class c\nJOIN pg_namespace n ON c.relnamespace = n.oid\nLEFT JOIN pg_index i ON c.oid = i.indexrelid\nLEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid\nWHERE c.relname = 'idx_events_desc_pgschema_new'\n AND n.nspname = 'public';", "directive": { "type": "wait", "message": "Creating index idx_events_desc_pgschema_new" diff --git a/testdata/diff/create_index/alter_index_null_order/plan.sql b/testdata/diff/create_index/alter_index_null_order/plan.sql index 45e33e56f..32eb824d7 100644 --- a/testdata/diff/create_index/alter_index_null_order/plan.sql +++ b/testdata/diff/create_index/alter_index_null_order/plan.sql @@ -8,10 +8,11 @@ SELECT ELSE 0 END as progress FROM pg_class c +JOIN pg_namespace n ON c.relnamespace = n.oid LEFT JOIN pg_index i ON c.oid = i.indexrelid LEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid WHERE c.relname = 'idx_events_desc_pgschema_new' - AND c.relnamespace = 'public'::regnamespace; + AND n.nspname = 'public'; DROP INDEX IF EXISTS idx_events_desc; diff --git a/testdata/diff/create_index/alter_index_null_order/plan.txt b/testdata/diff/create_index/alter_index_null_order/plan.txt index 78dc92ecb..b617b01fd 100644 --- a/testdata/diff/create_index/alter_index_null_order/plan.txt +++ b/testdata/diff/create_index/alter_index_null_order/plan.txt @@ -22,10 +22,11 @@ SELECT ELSE 0 END as progress FROM pg_class c +JOIN pg_namespace n ON c.relnamespace = n.oid LEFT JOIN pg_index i ON c.oid = i.indexrelid LEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid WHERE c.relname = 'idx_events_desc_pgschema_new' - AND c.relnamespace = 'public'::regnamespace; + AND n.nspname = 'public'; -- Transaction Group #3 DROP INDEX IF EXISTS idx_events_desc; diff --git a/testdata/diff/create_table/issue_295_pgvector_typmod/plan.json b/testdata/diff/create_table/issue_295_pgvector_typmod/plan.json index f706c14c4..54fdfe750 100644 --- a/testdata/diff/create_table/issue_295_pgvector_typmod/plan.json +++ b/testdata/diff/create_table/issue_295_pgvector_typmod/plan.json @@ -29,7 +29,7 @@ { "steps": [ { - "sql": "SELECT \n COALESCE(i.indisvalid, false) as done,\n CASE \n WHEN p.blocks_total > 0 THEN p.blocks_done * 100 / p.blocks_total\n ELSE 0\n END as progress\nFROM pg_class c\nLEFT JOIN pg_index i ON c.oid = i.indexrelid\nLEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid\nWHERE c.relname = 'activity_embedding_idx'\n AND c.relnamespace = 'public'::regnamespace;", + "sql": "SELECT \n COALESCE(i.indisvalid, false) as done,\n CASE \n WHEN p.blocks_total > 0 THEN p.blocks_done * 100 / p.blocks_total\n ELSE 0\n END as progress\nFROM pg_class c\nJOIN pg_namespace n ON c.relnamespace = n.oid\nLEFT JOIN pg_index i ON c.oid = i.indexrelid\nLEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid\nWHERE c.relname = 'activity_embedding_idx'\n AND n.nspname = 'public';", "directive": { "type": "wait", "message": "Creating index activity_embedding_idx" diff --git a/testdata/diff/create_table/issue_295_pgvector_typmod/plan.sql b/testdata/diff/create_table/issue_295_pgvector_typmod/plan.sql index 7a33b76e5..61e23a394 100644 --- a/testdata/diff/create_table/issue_295_pgvector_typmod/plan.sql +++ b/testdata/diff/create_table/issue_295_pgvector_typmod/plan.sql @@ -10,7 +10,8 @@ SELECT ELSE 0 END as progress FROM pg_class c +JOIN pg_namespace n ON c.relnamespace = n.oid LEFT JOIN pg_index i ON c.oid = i.indexrelid LEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid WHERE c.relname = 'activity_embedding_idx' - AND c.relnamespace = 'public'::regnamespace; + AND n.nspname = 'public'; diff --git a/testdata/diff/create_table/issue_295_pgvector_typmod/plan.txt b/testdata/diff/create_table/issue_295_pgvector_typmod/plan.txt index a068a7964..f172ccb12 100644 --- a/testdata/diff/create_table/issue_295_pgvector_typmod/plan.txt +++ b/testdata/diff/create_table/issue_295_pgvector_typmod/plan.txt @@ -23,7 +23,8 @@ SELECT ELSE 0 END as progress FROM pg_class c +JOIN pg_namespace n ON c.relnamespace = n.oid LEFT JOIN pg_index i ON c.oid = i.indexrelid LEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid WHERE c.relname = 'activity_embedding_idx' - AND c.relnamespace = 'public'::regnamespace; + AND n.nspname = 'public'; diff --git a/testdata/diff/create_table/issue_506_fk_depends_on_new_unique/plan.json b/testdata/diff/create_table/issue_506_fk_depends_on_new_unique/plan.json index e8e778c63..838380d88 100644 --- a/testdata/diff/create_table/issue_506_fk_depends_on_new_unique/plan.json +++ b/testdata/diff/create_table/issue_506_fk_depends_on_new_unique/plan.json @@ -41,7 +41,7 @@ { "steps": [ { - "sql": "SELECT \n COALESCE(i.indisvalid, false) as done,\n CASE \n WHEN p.blocks_total > 0 THEN p.blocks_done * 100 / p.blocks_total\n ELSE 0\n END as progress\nFROM pg_class c\nLEFT JOIN pg_index i ON c.oid = i.indexrelid\nLEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid\nWHERE c.relname = 'parent2_id_tenant_key'\n AND c.relnamespace = 'public'::regnamespace;", + "sql": "SELECT \n COALESCE(i.indisvalid, false) as done,\n CASE \n WHEN p.blocks_total > 0 THEN p.blocks_done * 100 / p.blocks_total\n ELSE 0\n END as progress\nFROM pg_class c\nJOIN pg_namespace n ON c.relnamespace = n.oid\nLEFT JOIN pg_index i ON c.oid = i.indexrelid\nLEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid\nWHERE c.relname = 'parent2_id_tenant_key'\n AND n.nspname = 'public';", "directive": { "type": "wait", "message": "Creating index parent2_id_tenant_key" diff --git a/testdata/diff/create_table/issue_506_fk_depends_on_new_unique/plan.sql b/testdata/diff/create_table/issue_506_fk_depends_on_new_unique/plan.sql index dfaccab9c..4cde01214 100644 --- a/testdata/diff/create_table/issue_506_fk_depends_on_new_unique/plan.sql +++ b/testdata/diff/create_table/issue_506_fk_depends_on_new_unique/plan.sql @@ -25,10 +25,11 @@ SELECT ELSE 0 END as progress FROM pg_class c +JOIN pg_namespace n ON c.relnamespace = n.oid LEFT JOIN pg_index i ON c.oid = i.indexrelid LEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid WHERE c.relname = 'parent2_id_tenant_key' - AND c.relnamespace = 'public'::regnamespace; + AND n.nspname = 'public'; ALTER TABLE child ADD CONSTRAINT child_parent_id_tenant_fkey FOREIGN KEY (parent_id, tenant) REFERENCES parent (id, tenant); diff --git a/testdata/diff/create_table/issue_506_fk_depends_on_new_unique/plan.txt b/testdata/diff/create_table/issue_506_fk_depends_on_new_unique/plan.txt index cef3420ab..601068967 100644 --- a/testdata/diff/create_table/issue_506_fk_depends_on_new_unique/plan.txt +++ b/testdata/diff/create_table/issue_506_fk_depends_on_new_unique/plan.txt @@ -46,10 +46,11 @@ SELECT ELSE 0 END as progress FROM pg_class c +JOIN pg_namespace n ON c.relnamespace = n.oid LEFT JOIN pg_index i ON c.oid = i.indexrelid LEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid WHERE c.relname = 'parent2_id_tenant_key' - AND c.relnamespace = 'public'::regnamespace; + AND n.nspname = 'public'; -- Transaction Group #4 ALTER TABLE child diff --git a/testdata/diff/create_table/issue_591_alter_generated_column/plan.json b/testdata/diff/create_table/issue_591_alter_generated_column/plan.json index 806bf1b4f..7c9a797b0 100644 --- a/testdata/diff/create_table/issue_591_alter_generated_column/plan.json +++ b/testdata/diff/create_table/issue_591_alter_generated_column/plan.json @@ -105,7 +105,7 @@ { "steps": [ { - "sql": "SELECT \n COALESCE(i.indisvalid, false) as done,\n CASE \n WHEN p.blocks_total > 0 THEN p.blocks_done * 100 / p.blocks_total\n ELSE 0\n END as progress\nFROM pg_class c\nLEFT JOIN pg_index i ON c.oid = i.indexrelid\nLEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid\nWHERE c.relname = 'metrics_tripled_idx_pgschema_new'\n AND c.relnamespace = 'public'::regnamespace;", + "sql": "SELECT \n COALESCE(i.indisvalid, false) as done,\n CASE \n WHEN p.blocks_total > 0 THEN p.blocks_done * 100 / p.blocks_total\n ELSE 0\n END as progress\nFROM pg_class c\nJOIN pg_namespace n ON c.relnamespace = n.oid\nLEFT JOIN pg_index i ON c.oid = i.indexrelid\nLEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid\nWHERE c.relname = 'metrics_tripled_idx_pgschema_new'\n AND n.nspname = 'public';", "directive": { "type": "wait", "message": "Creating index metrics_tripled_idx_pgschema_new" @@ -199,7 +199,7 @@ { "steps": [ { - "sql": "SELECT \n COALESCE(i.indisvalid, false) as done,\n CASE \n WHEN p.blocks_total > 0 THEN p.blocks_done * 100 / p.blocks_total\n ELSE 0\n END as progress\nFROM pg_class c\nLEFT JOIN pg_index i ON c.oid = i.indexrelid\nLEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid\nWHERE c.relname = 'orders_code_key_pgschema_new'\n AND c.relnamespace = 'public'::regnamespace;", + "sql": "SELECT \n COALESCE(i.indisvalid, false) as done,\n CASE \n WHEN p.blocks_total > 0 THEN p.blocks_done * 100 / p.blocks_total\n ELSE 0\n END as progress\nFROM pg_class c\nJOIN pg_namespace n ON c.relnamespace = n.oid\nLEFT JOIN pg_index i ON c.oid = i.indexrelid\nLEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid\nWHERE c.relname = 'orders_code_key_pgschema_new'\n AND n.nspname = 'public';", "directive": { "type": "wait", "message": "Creating index orders_code_key_pgschema_new" @@ -239,7 +239,7 @@ { "steps": [ { - "sql": "SELECT \n COALESCE(i.indisvalid, false) as done,\n CASE \n WHEN p.blocks_total > 0 THEN p.blocks_done * 100 / p.blocks_total\n ELSE 0\n END as progress\nFROM pg_class c\nLEFT JOIN pg_index i ON c.oid = i.indexrelid\nLEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid\nWHERE c.relname = 'orders_lookup_idx_pgschema_new'\n AND c.relnamespace = 'public'::regnamespace;", + "sql": "SELECT \n COALESCE(i.indisvalid, false) as done,\n CASE \n WHEN p.blocks_total > 0 THEN p.blocks_done * 100 / p.blocks_total\n ELSE 0\n END as progress\nFROM pg_class c\nJOIN pg_namespace n ON c.relnamespace = n.oid\nLEFT JOIN pg_index i ON c.oid = i.indexrelid\nLEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid\nWHERE c.relname = 'orders_lookup_idx_pgschema_new'\n AND n.nspname = 'public';", "directive": { "type": "wait", "message": "Creating index orders_lookup_idx_pgschema_new" @@ -279,7 +279,7 @@ { "steps": [ { - "sql": "SELECT \n COALESCE(i.indisvalid, false) as done,\n CASE \n WHEN p.blocks_total > 0 THEN p.blocks_done * 100 / p.blocks_total\n ELSE 0\n END as progress\nFROM pg_class c\nLEFT JOIN pg_index i ON c.oid = i.indexrelid\nLEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid\nWHERE c.relname = 'orders_total_key'\n AND c.relnamespace = 'public'::regnamespace;", + "sql": "SELECT \n COALESCE(i.indisvalid, false) as done,\n CASE \n WHEN p.blocks_total > 0 THEN p.blocks_done * 100 / p.blocks_total\n ELSE 0\n END as progress\nFROM pg_class c\nJOIN pg_namespace n ON c.relnamespace = n.oid\nLEFT JOIN pg_index i ON c.oid = i.indexrelid\nLEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid\nWHERE c.relname = 'orders_total_key'\n AND n.nspname = 'public';", "directive": { "type": "wait", "message": "Creating index orders_total_key" diff --git a/testdata/diff/create_table/issue_591_alter_generated_column/plan.sql b/testdata/diff/create_table/issue_591_alter_generated_column/plan.sql index 38400769d..1308f0f49 100644 --- a/testdata/diff/create_table/issue_591_alter_generated_column/plan.sql +++ b/testdata/diff/create_table/issue_591_alter_generated_column/plan.sql @@ -36,10 +36,11 @@ SELECT ELSE 0 END as progress FROM pg_class c +JOIN pg_namespace n ON c.relnamespace = n.oid LEFT JOIN pg_index i ON c.oid = i.indexrelid LEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid WHERE c.relname = 'metrics_tripled_idx_pgschema_new' - AND c.relnamespace = 'public'::regnamespace; + AND n.nspname = 'public'; DROP INDEX IF EXISTS metrics_tripled_idx; @@ -78,10 +79,11 @@ SELECT ELSE 0 END as progress FROM pg_class c +JOIN pg_namespace n ON c.relnamespace = n.oid LEFT JOIN pg_index i ON c.oid = i.indexrelid LEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid WHERE c.relname = 'orders_code_key_pgschema_new' - AND c.relnamespace = 'public'::regnamespace; + AND n.nspname = 'public'; DROP INDEX IF EXISTS orders_code_key; @@ -97,10 +99,11 @@ SELECT ELSE 0 END as progress FROM pg_class c +JOIN pg_namespace n ON c.relnamespace = n.oid LEFT JOIN pg_index i ON c.oid = i.indexrelid LEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid WHERE c.relname = 'orders_lookup_idx_pgschema_new' - AND c.relnamespace = 'public'::regnamespace; + AND n.nspname = 'public'; DROP INDEX IF EXISTS orders_lookup_idx; @@ -116,10 +119,11 @@ SELECT ELSE 0 END as progress FROM pg_class c +JOIN pg_namespace n ON c.relnamespace = n.oid LEFT JOIN pg_index i ON c.oid = i.indexrelid LEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid WHERE c.relname = 'orders_total_key' - AND c.relnamespace = 'public'::regnamespace; + AND n.nspname = 'public'; ALTER TABLE vt DROP COLUMN v2; diff --git a/testdata/diff/create_table/issue_591_alter_generated_column/plan.txt b/testdata/diff/create_table/issue_591_alter_generated_column/plan.txt index 320d96fd9..8a1109fa4 100644 --- a/testdata/diff/create_table/issue_591_alter_generated_column/plan.txt +++ b/testdata/diff/create_table/issue_591_alter_generated_column/plan.txt @@ -101,10 +101,11 @@ SELECT ELSE 0 END as progress FROM pg_class c +JOIN pg_namespace n ON c.relnamespace = n.oid LEFT JOIN pg_index i ON c.oid = i.indexrelid LEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid WHERE c.relname = 'metrics_tripled_idx_pgschema_new' - AND c.relnamespace = 'public'::regnamespace; + AND n.nspname = 'public'; -- Transaction Group #5 DROP INDEX IF EXISTS metrics_tripled_idx; @@ -146,10 +147,11 @@ SELECT ELSE 0 END as progress FROM pg_class c +JOIN pg_namespace n ON c.relnamespace = n.oid LEFT JOIN pg_index i ON c.oid = i.indexrelid LEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid WHERE c.relname = 'orders_code_key_pgschema_new' - AND c.relnamespace = 'public'::regnamespace; + AND n.nspname = 'public'; -- Transaction Group #8 DROP INDEX IF EXISTS orders_code_key; @@ -168,10 +170,11 @@ SELECT ELSE 0 END as progress FROM pg_class c +JOIN pg_namespace n ON c.relnamespace = n.oid LEFT JOIN pg_index i ON c.oid = i.indexrelid LEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid WHERE c.relname = 'orders_lookup_idx_pgschema_new' - AND c.relnamespace = 'public'::regnamespace; + AND n.nspname = 'public'; -- Transaction Group #11 DROP INDEX IF EXISTS orders_lookup_idx; @@ -190,10 +193,11 @@ SELECT ELSE 0 END as progress FROM pg_class c +JOIN pg_namespace n ON c.relnamespace = n.oid LEFT JOIN pg_index i ON c.oid = i.indexrelid LEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid WHERE c.relname = 'orders_total_key' - AND c.relnamespace = 'public'::regnamespace; + AND n.nspname = 'public'; -- Transaction Group #14 ALTER TABLE vt DROP COLUMN v2; diff --git a/testdata/diff/dependency/issue_308_view_select_star_column_reorder/plan.json b/testdata/diff/dependency/issue_308_view_select_star_column_reorder/plan.json index ce6d6eb0b..e395ca7e1 100644 --- a/testdata/diff/dependency/issue_308_view_select_star_column_reorder/plan.json +++ b/testdata/diff/dependency/issue_308_view_select_star_column_reorder/plan.json @@ -53,7 +53,7 @@ { "steps": [ { - "sql": "SELECT \n COALESCE(i.indisvalid, false) as done,\n CASE \n WHEN p.blocks_total > 0 THEN p.blocks_done * 100 / p.blocks_total\n ELSE 0\n END as progress\nFROM pg_class c\nLEFT JOIN pg_index i ON c.oid = i.indexrelid\nLEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid\nWHERE c.relname = 'item_summary_id_idx'\n AND c.relnamespace = 'public'::regnamespace;", + "sql": "SELECT \n COALESCE(i.indisvalid, false) as done,\n CASE \n WHEN p.blocks_total > 0 THEN p.blocks_done * 100 / p.blocks_total\n ELSE 0\n END as progress\nFROM pg_class c\nJOIN pg_namespace n ON c.relnamespace = n.oid\nLEFT JOIN pg_index i ON c.oid = i.indexrelid\nLEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid\nWHERE c.relname = 'item_summary_id_idx'\n AND n.nspname = 'public';", "directive": { "type": "wait", "message": "Creating index item_summary_id_idx" diff --git a/testdata/diff/dependency/issue_308_view_select_star_column_reorder/plan.sql b/testdata/diff/dependency/issue_308_view_select_star_column_reorder/plan.sql index 833ef5761..e339f28ba 100644 --- a/testdata/diff/dependency/issue_308_view_select_star_column_reorder/plan.sql +++ b/testdata/diff/dependency/issue_308_view_select_star_column_reorder/plan.sql @@ -28,7 +28,8 @@ SELECT ELSE 0 END as progress FROM pg_class c +JOIN pg_namespace n ON c.relnamespace = n.oid LEFT JOIN pg_index i ON c.oid = i.indexrelid LEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid WHERE c.relname = 'item_summary_id_idx' - AND c.relnamespace = 'public'::regnamespace; + AND n.nspname = 'public'; diff --git a/testdata/diff/dependency/issue_308_view_select_star_column_reorder/plan.txt b/testdata/diff/dependency/issue_308_view_select_star_column_reorder/plan.txt index d5c2eade2..367a8c39e 100644 --- a/testdata/diff/dependency/issue_308_view_select_star_column_reorder/plan.txt +++ b/testdata/diff/dependency/issue_308_view_select_star_column_reorder/plan.txt @@ -52,7 +52,8 @@ SELECT ELSE 0 END as progress FROM pg_class c +JOIN pg_namespace n ON c.relnamespace = n.oid LEFT JOIN pg_index i ON c.oid = i.indexrelid LEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid WHERE c.relname = 'item_summary_id_idx' - AND c.relnamespace = 'public'::regnamespace; + AND n.nspname = 'public'; diff --git a/testdata/diff/migrate/v2/plan.json b/testdata/diff/migrate/v2/plan.json index 1651b48e0..23eedeacc 100644 --- a/testdata/diff/migrate/v2/plan.json +++ b/testdata/diff/migrate/v2/plan.json @@ -149,7 +149,7 @@ { "steps": [ { - "sql": "SELECT \n COALESCE(i.indisvalid, false) as done,\n CASE \n WHEN p.blocks_total > 0 THEN p.blocks_done * 100 / p.blocks_total\n ELSE 0\n END as progress\nFROM pg_class c\nLEFT JOIN pg_index i ON c.oid = i.indexrelid\nLEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid\nWHERE c.relname = 'idx_employee_hire_date'\n AND c.relnamespace = 'public'::regnamespace;", + "sql": "SELECT \n COALESCE(i.indisvalid, false) as done,\n CASE \n WHEN p.blocks_total > 0 THEN p.blocks_done * 100 / p.blocks_total\n ELSE 0\n END as progress\nFROM pg_class c\nJOIN pg_namespace n ON c.relnamespace = n.oid\nLEFT JOIN pg_index i ON c.oid = i.indexrelid\nLEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid\nWHERE c.relname = 'idx_employee_hire_date'\n AND n.nspname = 'public';", "directive": { "type": "wait", "message": "Creating index idx_employee_hire_date" @@ -199,7 +199,7 @@ { "steps": [ { - "sql": "SELECT \n COALESCE(i.indisvalid, false) as done,\n CASE \n WHEN p.blocks_total > 0 THEN p.blocks_done * 100 / p.blocks_total\n ELSE 0\n END as progress\nFROM pg_class c\nLEFT JOIN pg_index i ON c.oid = i.indexrelid\nLEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid\nWHERE c.relname = 'idx_salary_amount'\n AND c.relnamespace = 'public'::regnamespace;", + "sql": "SELECT \n COALESCE(i.indisvalid, false) as done,\n CASE \n WHEN p.blocks_total > 0 THEN p.blocks_done * 100 / p.blocks_total\n ELSE 0\n END as progress\nFROM pg_class c\nJOIN pg_namespace n ON c.relnamespace = n.oid\nLEFT JOIN pg_index i ON c.oid = i.indexrelid\nLEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid\nWHERE c.relname = 'idx_salary_amount'\n AND n.nspname = 'public';", "directive": { "type": "wait", "message": "Creating index idx_salary_amount" diff --git a/testdata/diff/migrate/v2/plan.sql b/testdata/diff/migrate/v2/plan.sql index b8cd0e241..0813a06f7 100644 --- a/testdata/diff/migrate/v2/plan.sql +++ b/testdata/diff/migrate/v2/plan.sql @@ -44,10 +44,11 @@ SELECT ELSE 0 END as progress FROM pg_class c +JOIN pg_namespace n ON c.relnamespace = n.oid LEFT JOIN pg_index i ON c.oid = i.indexrelid LEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid WHERE c.relname = 'idx_employee_hire_date' - AND c.relnamespace = 'public'::regnamespace; + AND n.nspname = 'public'; ALTER TABLE salary DROP CONSTRAINT salary_emp_no_fkey; @@ -66,10 +67,11 @@ SELECT ELSE 0 END as progress FROM pg_class c +JOIN pg_namespace n ON c.relnamespace = n.oid LEFT JOIN pg_index i ON c.oid = i.indexrelid LEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid WHERE c.relname = 'idx_salary_amount' - AND c.relnamespace = 'public'::regnamespace; + AND n.nspname = 'public'; ALTER TABLE title DROP CONSTRAINT title_emp_no_fkey; diff --git a/testdata/diff/migrate/v2/plan.txt b/testdata/diff/migrate/v2/plan.txt index 824c026b3..ac1f2c746 100644 --- a/testdata/diff/migrate/v2/plan.txt +++ b/testdata/diff/migrate/v2/plan.txt @@ -88,10 +88,11 @@ SELECT ELSE 0 END as progress FROM pg_class c +JOIN pg_namespace n ON c.relnamespace = n.oid LEFT JOIN pg_index i ON c.oid = i.indexrelid LEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid WHERE c.relname = 'idx_employee_hire_date' - AND c.relnamespace = 'public'::regnamespace; + AND n.nspname = 'public'; -- Transaction Group #13 ALTER TABLE salary DROP CONSTRAINT salary_emp_no_fkey; @@ -114,10 +115,11 @@ SELECT ELSE 0 END as progress FROM pg_class c +JOIN pg_namespace n ON c.relnamespace = n.oid LEFT JOIN pg_index i ON c.oid = i.indexrelid LEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid WHERE c.relname = 'idx_salary_amount' - AND c.relnamespace = 'public'::regnamespace; + AND n.nspname = 'public'; -- Transaction Group #17 ALTER TABLE title DROP CONSTRAINT title_emp_no_fkey; diff --git a/testdata/diff/migrate/v4/plan.json b/testdata/diff/migrate/v4/plan.json index bfccb6b58..b4bae8b40 100644 --- a/testdata/diff/migrate/v4/plan.json +++ b/testdata/diff/migrate/v4/plan.json @@ -53,7 +53,7 @@ { "steps": [ { - "sql": "SELECT \n COALESCE(i.indisvalid, false) as done,\n CASE \n WHEN p.blocks_total > 0 THEN p.blocks_done * 100 / p.blocks_total\n ELSE 0\n END as progress\nFROM pg_class c\nLEFT JOIN pg_index i ON c.oid = i.indexrelid\nLEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid\nWHERE c.relname = 'idx_audit_operation'\n AND c.relnamespace = 'public'::regnamespace;", + "sql": "SELECT \n COALESCE(i.indisvalid, false) as done,\n CASE \n WHEN p.blocks_total > 0 THEN p.blocks_done * 100 / p.blocks_total\n ELSE 0\n END as progress\nFROM pg_class c\nJOIN pg_namespace n ON c.relnamespace = n.oid\nLEFT JOIN pg_index i ON c.oid = i.indexrelid\nLEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid\nWHERE c.relname = 'idx_audit_operation'\n AND n.nspname = 'public';", "directive": { "type": "wait", "message": "Creating index idx_audit_operation" @@ -77,7 +77,7 @@ { "steps": [ { - "sql": "SELECT \n COALESCE(i.indisvalid, false) as done,\n CASE \n WHEN p.blocks_total > 0 THEN p.blocks_done * 100 / p.blocks_total\n ELSE 0\n END as progress\nFROM pg_class c\nLEFT JOIN pg_index i ON c.oid = i.indexrelid\nLEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid\nWHERE c.relname = 'idx_audit_username'\n AND c.relnamespace = 'public'::regnamespace;", + "sql": "SELECT \n COALESCE(i.indisvalid, false) as done,\n CASE \n WHEN p.blocks_total > 0 THEN p.blocks_done * 100 / p.blocks_total\n ELSE 0\n END as progress\nFROM pg_class c\nJOIN pg_namespace n ON c.relnamespace = n.oid\nLEFT JOIN pg_index i ON c.oid = i.indexrelid\nLEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid\nWHERE c.relname = 'idx_audit_username'\n AND n.nspname = 'public';", "directive": { "type": "wait", "message": "Creating index idx_audit_username" diff --git a/testdata/diff/migrate/v4/plan.sql b/testdata/diff/migrate/v4/plan.sql index 4a9f80579..537930a37 100644 --- a/testdata/diff/migrate/v4/plan.sql +++ b/testdata/diff/migrate/v4/plan.sql @@ -56,10 +56,11 @@ SELECT ELSE 0 END as progress FROM pg_class c +JOIN pg_namespace n ON c.relnamespace = n.oid LEFT JOIN pg_index i ON c.oid = i.indexrelid LEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid WHERE c.relname = 'idx_audit_operation' - AND c.relnamespace = 'public'::regnamespace; + AND n.nspname = 'public'; CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_audit_username ON audit (user_name); @@ -71,10 +72,11 @@ SELECT ELSE 0 END as progress FROM pg_class c +JOIN pg_namespace n ON c.relnamespace = n.oid LEFT JOIN pg_index i ON c.oid = i.indexrelid LEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid WHERE c.relname = 'idx_audit_username' - AND c.relnamespace = 'public'::regnamespace; + AND n.nspname = 'public'; CREATE OR REPLACE TRIGGER salary_log_trigger AFTER UPDATE OR DELETE ON salary diff --git a/testdata/diff/migrate/v4/plan.txt b/testdata/diff/migrate/v4/plan.txt index 35c96036d..2431ee64f 100644 --- a/testdata/diff/migrate/v4/plan.txt +++ b/testdata/diff/migrate/v4/plan.txt @@ -92,10 +92,11 @@ SELECT ELSE 0 END as progress FROM pg_class c +JOIN pg_namespace n ON c.relnamespace = n.oid LEFT JOIN pg_index i ON c.oid = i.indexrelid LEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid WHERE c.relname = 'idx_audit_operation' - AND c.relnamespace = 'public'::regnamespace; + AND n.nspname = 'public'; -- Transaction Group #4 CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_audit_username ON audit (user_name); @@ -109,10 +110,11 @@ SELECT ELSE 0 END as progress FROM pg_class c +JOIN pg_namespace n ON c.relnamespace = n.oid LEFT JOIN pg_index i ON c.oid = i.indexrelid LEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid WHERE c.relname = 'idx_audit_username' - AND c.relnamespace = 'public'::regnamespace; + AND n.nspname = 'public'; -- Transaction Group #6 CREATE OR REPLACE TRIGGER salary_log_trigger diff --git a/testdata/diff/online/add_composite_index/plan.json b/testdata/diff/online/add_composite_index/plan.json index 0cdb6e31f..daeeeaa3d 100644 --- a/testdata/diff/online/add_composite_index/plan.json +++ b/testdata/diff/online/add_composite_index/plan.json @@ -19,7 +19,7 @@ { "steps": [ { - "sql": "SELECT \n COALESCE(i.indisvalid, false) as done,\n CASE \n WHEN p.blocks_total > 0 THEN p.blocks_done * 100 / p.blocks_total\n ELSE 0\n END as progress\nFROM pg_class c\nLEFT JOIN pg_index i ON c.oid = i.indexrelid\nLEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid\nWHERE c.relname = 'idx_users_email_include'\n AND c.relnamespace = 'public'::regnamespace;", + "sql": "SELECT \n COALESCE(i.indisvalid, false) as done,\n CASE \n WHEN p.blocks_total > 0 THEN p.blocks_done * 100 / p.blocks_total\n ELSE 0\n END as progress\nFROM pg_class c\nJOIN pg_namespace n ON c.relnamespace = n.oid\nLEFT JOIN pg_index i ON c.oid = i.indexrelid\nLEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid\nWHERE c.relname = 'idx_users_email_include'\n AND n.nspname = 'public';", "directive": { "type": "wait", "message": "Creating index idx_users_email_include" @@ -43,7 +43,7 @@ { "steps": [ { - "sql": "SELECT \n COALESCE(i.indisvalid, false) as done,\n CASE \n WHEN p.blocks_total > 0 THEN p.blocks_done * 100 / p.blocks_total\n ELSE 0\n END as progress\nFROM pg_class c\nLEFT JOIN pg_index i ON c.oid = i.indexrelid\nLEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid\nWHERE c.relname = 'idx_users_email_status'\n AND c.relnamespace = 'public'::regnamespace;", + "sql": "SELECT \n COALESCE(i.indisvalid, false) as done,\n CASE \n WHEN p.blocks_total > 0 THEN p.blocks_done * 100 / p.blocks_total\n ELSE 0\n END as progress\nFROM pg_class c\nJOIN pg_namespace n ON c.relnamespace = n.oid\nLEFT JOIN pg_index i ON c.oid = i.indexrelid\nLEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid\nWHERE c.relname = 'idx_users_email_status'\n AND n.nspname = 'public';", "directive": { "type": "wait", "message": "Creating index idx_users_email_status" diff --git a/testdata/diff/online/add_composite_index/plan.sql b/testdata/diff/online/add_composite_index/plan.sql index a2a7471fd..df0191602 100644 --- a/testdata/diff/online/add_composite_index/plan.sql +++ b/testdata/diff/online/add_composite_index/plan.sql @@ -8,10 +8,11 @@ SELECT ELSE 0 END as progress FROM pg_class c +JOIN pg_namespace n ON c.relnamespace = n.oid LEFT JOIN pg_index i ON c.oid = i.indexrelid LEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid WHERE c.relname = 'idx_users_email_include' - AND c.relnamespace = 'public'::regnamespace; + AND n.nspname = 'public'; CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_users_email_status ON users (email, status DESC); @@ -23,7 +24,8 @@ SELECT ELSE 0 END as progress FROM pg_class c +JOIN pg_namespace n ON c.relnamespace = n.oid LEFT JOIN pg_index i ON c.oid = i.indexrelid LEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid WHERE c.relname = 'idx_users_email_status' - AND c.relnamespace = 'public'::regnamespace; + AND n.nspname = 'public'; diff --git a/testdata/diff/online/add_composite_index/plan.txt b/testdata/diff/online/add_composite_index/plan.txt index 0a4691881..21c5e8aac 100644 --- a/testdata/diff/online/add_composite_index/plan.txt +++ b/testdata/diff/online/add_composite_index/plan.txt @@ -23,10 +23,11 @@ SELECT ELSE 0 END as progress FROM pg_class c +JOIN pg_namespace n ON c.relnamespace = n.oid LEFT JOIN pg_index i ON c.oid = i.indexrelid LEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid WHERE c.relname = 'idx_users_email_include' - AND c.relnamespace = 'public'::regnamespace; + AND n.nspname = 'public'; -- Transaction Group #3 CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_users_email_status ON users (email, status DESC); @@ -40,7 +41,8 @@ SELECT ELSE 0 END as progress FROM pg_class c +JOIN pg_namespace n ON c.relnamespace = n.oid LEFT JOIN pg_index i ON c.oid = i.indexrelid LEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid WHERE c.relname = 'idx_users_email_status' - AND c.relnamespace = 'public'::regnamespace; + AND n.nspname = 'public'; diff --git a/testdata/diff/online/add_functional_index/plan.json b/testdata/diff/online/add_functional_index/plan.json index ec9656dc2..38df9dfd1 100644 --- a/testdata/diff/online/add_functional_index/plan.json +++ b/testdata/diff/online/add_functional_index/plan.json @@ -19,7 +19,7 @@ { "steps": [ { - "sql": "SELECT \n COALESCE(i.indisvalid, false) as done,\n CASE \n WHEN p.blocks_total > 0 THEN p.blocks_done * 100 / p.blocks_total\n ELSE 0\n END as progress\nFROM pg_class c\nLEFT JOIN pg_index i ON c.oid = i.indexrelid\nLEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid\nWHERE c.relname = 'idx_users_fullname_search'\n AND c.relnamespace = 'public'::regnamespace;", + "sql": "SELECT \n COALESCE(i.indisvalid, false) as done,\n CASE \n WHEN p.blocks_total > 0 THEN p.blocks_done * 100 / p.blocks_total\n ELSE 0\n END as progress\nFROM pg_class c\nJOIN pg_namespace n ON c.relnamespace = n.oid\nLEFT JOIN pg_index i ON c.oid = i.indexrelid\nLEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid\nWHERE c.relname = 'idx_users_fullname_search'\n AND n.nspname = 'public';", "directive": { "type": "wait", "message": "Creating index idx_users_fullname_search" diff --git a/testdata/diff/online/add_functional_index/plan.sql b/testdata/diff/online/add_functional_index/plan.sql index fadd5a6d4..09928c2fe 100644 --- a/testdata/diff/online/add_functional_index/plan.sql +++ b/testdata/diff/online/add_functional_index/plan.sql @@ -8,7 +8,8 @@ SELECT ELSE 0 END as progress FROM pg_class c +JOIN pg_namespace n ON c.relnamespace = n.oid LEFT JOIN pg_index i ON c.oid = i.indexrelid LEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid WHERE c.relname = 'idx_users_fullname_search' - AND c.relnamespace = 'public'::regnamespace; + AND n.nspname = 'public'; diff --git a/testdata/diff/online/add_functional_index/plan.txt b/testdata/diff/online/add_functional_index/plan.txt index 1103c58e4..b0bb46466 100644 --- a/testdata/diff/online/add_functional_index/plan.txt +++ b/testdata/diff/online/add_functional_index/plan.txt @@ -22,7 +22,8 @@ SELECT ELSE 0 END as progress FROM pg_class c +JOIN pg_namespace n ON c.relnamespace = n.oid LEFT JOIN pg_index i ON c.oid = i.indexrelid LEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid WHERE c.relname = 'idx_users_fullname_search' - AND c.relnamespace = 'public'::regnamespace; + AND n.nspname = 'public'; diff --git a/testdata/diff/online/add_materialized_view_index/plan.json b/testdata/diff/online/add_materialized_view_index/plan.json index 61f1519b7..e07595de0 100644 --- a/testdata/diff/online/add_materialized_view_index/plan.json +++ b/testdata/diff/online/add_materialized_view_index/plan.json @@ -19,7 +19,7 @@ { "steps": [ { - "sql": "SELECT \n COALESCE(i.indisvalid, false) as done,\n CASE \n WHEN p.blocks_total > 0 THEN p.blocks_done * 100 / p.blocks_total\n ELSE 0\n END as progress\nFROM pg_class c\nLEFT JOIN pg_index i ON c.oid = i.indexrelid\nLEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid\nWHERE c.relname = 'idx_user_summary_created_at'\n AND c.relnamespace = 'public'::regnamespace;", + "sql": "SELECT \n COALESCE(i.indisvalid, false) as done,\n CASE \n WHEN p.blocks_total > 0 THEN p.blocks_done * 100 / p.blocks_total\n ELSE 0\n END as progress\nFROM pg_class c\nJOIN pg_namespace n ON c.relnamespace = n.oid\nLEFT JOIN pg_index i ON c.oid = i.indexrelid\nLEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid\nWHERE c.relname = 'idx_user_summary_created_at'\n AND n.nspname = 'public';", "directive": { "type": "wait", "message": "Creating index idx_user_summary_created_at" diff --git a/testdata/diff/online/add_materialized_view_index/plan.sql b/testdata/diff/online/add_materialized_view_index/plan.sql index 22b695c34..11583f72c 100644 --- a/testdata/diff/online/add_materialized_view_index/plan.sql +++ b/testdata/diff/online/add_materialized_view_index/plan.sql @@ -8,7 +8,8 @@ SELECT ELSE 0 END as progress FROM pg_class c +JOIN pg_namespace n ON c.relnamespace = n.oid LEFT JOIN pg_index i ON c.oid = i.indexrelid LEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid WHERE c.relname = 'idx_user_summary_created_at' - AND c.relnamespace = 'public'::regnamespace; + AND n.nspname = 'public'; diff --git a/testdata/diff/online/add_materialized_view_index/plan.txt b/testdata/diff/online/add_materialized_view_index/plan.txt index f0f5cefbc..7d8d60887 100644 --- a/testdata/diff/online/add_materialized_view_index/plan.txt +++ b/testdata/diff/online/add_materialized_view_index/plan.txt @@ -22,7 +22,8 @@ SELECT ELSE 0 END as progress FROM pg_class c +JOIN pg_namespace n ON c.relnamespace = n.oid LEFT JOIN pg_index i ON c.oid = i.indexrelid LEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid WHERE c.relname = 'idx_user_summary_created_at' - AND c.relnamespace = 'public'::regnamespace; + AND n.nspname = 'public'; diff --git a/testdata/diff/online/add_partial_index/plan.json b/testdata/diff/online/add_partial_index/plan.json index 3488d2d5e..c0358b7b0 100644 --- a/testdata/diff/online/add_partial_index/plan.json +++ b/testdata/diff/online/add_partial_index/plan.json @@ -19,7 +19,7 @@ { "steps": [ { - "sql": "SELECT \n COALESCE(i.indisvalid, false) as done,\n CASE \n WHEN p.blocks_total > 0 THEN p.blocks_done * 100 / p.blocks_total\n ELSE 0\n END as progress\nFROM pg_class c\nLEFT JOIN pg_index i ON c.oid = i.indexrelid\nLEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid\nWHERE c.relname = 'idx_active_orders_customer_date'\n AND c.relnamespace = 'public'::regnamespace;", + "sql": "SELECT \n COALESCE(i.indisvalid, false) as done,\n CASE \n WHEN p.blocks_total > 0 THEN p.blocks_done * 100 / p.blocks_total\n ELSE 0\n END as progress\nFROM pg_class c\nJOIN pg_namespace n ON c.relnamespace = n.oid\nLEFT JOIN pg_index i ON c.oid = i.indexrelid\nLEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid\nWHERE c.relname = 'idx_active_orders_customer_date'\n AND n.nspname = 'public';", "directive": { "type": "wait", "message": "Creating index idx_active_orders_customer_date" diff --git a/testdata/diff/online/add_partial_index/plan.sql b/testdata/diff/online/add_partial_index/plan.sql index b9e7ec27e..c8213bc7b 100644 --- a/testdata/diff/online/add_partial_index/plan.sql +++ b/testdata/diff/online/add_partial_index/plan.sql @@ -8,7 +8,8 @@ SELECT ELSE 0 END as progress FROM pg_class c +JOIN pg_namespace n ON c.relnamespace = n.oid LEFT JOIN pg_index i ON c.oid = i.indexrelid LEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid WHERE c.relname = 'idx_active_orders_customer_date' - AND c.relnamespace = 'public'::regnamespace; + AND n.nspname = 'public'; diff --git a/testdata/diff/online/add_partial_index/plan.txt b/testdata/diff/online/add_partial_index/plan.txt index 3f5c84478..d8f76c678 100644 --- a/testdata/diff/online/add_partial_index/plan.txt +++ b/testdata/diff/online/add_partial_index/plan.txt @@ -22,7 +22,8 @@ SELECT ELSE 0 END as progress FROM pg_class c +JOIN pg_namespace n ON c.relnamespace = n.oid LEFT JOIN pg_index i ON c.oid = i.indexrelid LEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid WHERE c.relname = 'idx_active_orders_customer_date' - AND c.relnamespace = 'public'::regnamespace; + AND n.nspname = 'public'; diff --git a/testdata/diff/online/add_unique_multi_column_index/plan.json b/testdata/diff/online/add_unique_multi_column_index/plan.json index c0c843d01..a2a94db75 100644 --- a/testdata/diff/online/add_unique_multi_column_index/plan.json +++ b/testdata/diff/online/add_unique_multi_column_index/plan.json @@ -19,7 +19,7 @@ { "steps": [ { - "sql": "SELECT \n COALESCE(i.indisvalid, false) as done,\n CASE \n WHEN p.blocks_total > 0 THEN p.blocks_done * 100 / p.blocks_total\n ELSE 0\n END as progress\nFROM pg_class c\nLEFT JOIN pg_index i ON c.oid = i.indexrelid\nLEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid\nWHERE c.relname = 'idx_unique_email_org'\n AND c.relnamespace = 'public'::regnamespace;", + "sql": "SELECT \n COALESCE(i.indisvalid, false) as done,\n CASE \n WHEN p.blocks_total > 0 THEN p.blocks_done * 100 / p.blocks_total\n ELSE 0\n END as progress\nFROM pg_class c\nJOIN pg_namespace n ON c.relnamespace = n.oid\nLEFT JOIN pg_index i ON c.oid = i.indexrelid\nLEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid\nWHERE c.relname = 'idx_unique_email_org'\n AND n.nspname = 'public';", "directive": { "type": "wait", "message": "Creating index idx_unique_email_org" diff --git a/testdata/diff/online/add_unique_multi_column_index/plan.sql b/testdata/diff/online/add_unique_multi_column_index/plan.sql index f1c9ee6a0..d99093802 100644 --- a/testdata/diff/online/add_unique_multi_column_index/plan.sql +++ b/testdata/diff/online/add_unique_multi_column_index/plan.sql @@ -8,7 +8,8 @@ SELECT ELSE 0 END as progress FROM pg_class c +JOIN pg_namespace n ON c.relnamespace = n.oid LEFT JOIN pg_index i ON c.oid = i.indexrelid LEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid WHERE c.relname = 'idx_unique_email_org' - AND c.relnamespace = 'public'::regnamespace; + AND n.nspname = 'public'; diff --git a/testdata/diff/online/add_unique_multi_column_index/plan.txt b/testdata/diff/online/add_unique_multi_column_index/plan.txt index 13a6d74ec..b9f61b949 100644 --- a/testdata/diff/online/add_unique_multi_column_index/plan.txt +++ b/testdata/diff/online/add_unique_multi_column_index/plan.txt @@ -22,7 +22,8 @@ SELECT ELSE 0 END as progress FROM pg_class c +JOIN pg_namespace n ON c.relnamespace = n.oid LEFT JOIN pg_index i ON c.oid = i.indexrelid LEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid WHERE c.relname = 'idx_unique_email_org' - AND c.relnamespace = 'public'::regnamespace; + AND n.nspname = 'public'; diff --git a/testdata/diff/online/alter_composite_index/plan.json b/testdata/diff/online/alter_composite_index/plan.json index f19500982..7d7c752e2 100644 --- a/testdata/diff/online/alter_composite_index/plan.json +++ b/testdata/diff/online/alter_composite_index/plan.json @@ -19,7 +19,7 @@ { "steps": [ { - "sql": "SELECT \n COALESCE(i.indisvalid, false) as done,\n CASE \n WHEN p.blocks_total > 0 THEN p.blocks_done * 100 / p.blocks_total\n ELSE 0\n END as progress\nFROM pg_class c\nLEFT JOIN pg_index i ON c.oid = i.indexrelid\nLEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid\nWHERE c.relname = 'idx_users_email_pgschema_new'\n AND c.relnamespace = 'public'::regnamespace;", + "sql": "SELECT \n COALESCE(i.indisvalid, false) as done,\n CASE \n WHEN p.blocks_total > 0 THEN p.blocks_done * 100 / p.blocks_total\n ELSE 0\n END as progress\nFROM pg_class c\nJOIN pg_namespace n ON c.relnamespace = n.oid\nLEFT JOIN pg_index i ON c.oid = i.indexrelid\nLEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid\nWHERE c.relname = 'idx_users_email_pgschema_new'\n AND n.nspname = 'public';", "directive": { "type": "wait", "message": "Creating index idx_users_email_pgschema_new" @@ -59,7 +59,7 @@ { "steps": [ { - "sql": "SELECT \n COALESCE(i.indisvalid, false) as done,\n CASE \n WHEN p.blocks_total > 0 THEN p.blocks_done * 100 / p.blocks_total\n ELSE 0\n END as progress\nFROM pg_class c\nLEFT JOIN pg_index i ON c.oid = i.indexrelid\nLEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid\nWHERE c.relname = 'idx_users_status_pgschema_new'\n AND c.relnamespace = 'public'::regnamespace;", + "sql": "SELECT \n COALESCE(i.indisvalid, false) as done,\n CASE \n WHEN p.blocks_total > 0 THEN p.blocks_done * 100 / p.blocks_total\n ELSE 0\n END as progress\nFROM pg_class c\nJOIN pg_namespace n ON c.relnamespace = n.oid\nLEFT JOIN pg_index i ON c.oid = i.indexrelid\nLEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid\nWHERE c.relname = 'idx_users_status_pgschema_new'\n AND n.nspname = 'public';", "directive": { "type": "wait", "message": "Creating index idx_users_status_pgschema_new" diff --git a/testdata/diff/online/alter_composite_index/plan.sql b/testdata/diff/online/alter_composite_index/plan.sql index 32c587ad9..d0f025bed 100644 --- a/testdata/diff/online/alter_composite_index/plan.sql +++ b/testdata/diff/online/alter_composite_index/plan.sql @@ -8,10 +8,11 @@ SELECT ELSE 0 END as progress FROM pg_class c +JOIN pg_namespace n ON c.relnamespace = n.oid LEFT JOIN pg_index i ON c.oid = i.indexrelid LEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid WHERE c.relname = 'idx_users_email_pgschema_new' - AND c.relnamespace = 'public'::regnamespace; + AND n.nspname = 'public'; DROP INDEX IF EXISTS idx_users_email; @@ -27,10 +28,11 @@ SELECT ELSE 0 END as progress FROM pg_class c +JOIN pg_namespace n ON c.relnamespace = n.oid LEFT JOIN pg_index i ON c.oid = i.indexrelid LEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid WHERE c.relname = 'idx_users_status_pgschema_new' - AND c.relnamespace = 'public'::regnamespace; + AND n.nspname = 'public'; DROP INDEX IF EXISTS idx_users_status; diff --git a/testdata/diff/online/alter_composite_index/plan.txt b/testdata/diff/online/alter_composite_index/plan.txt index d2762e8f3..acd2d5c4d 100644 --- a/testdata/diff/online/alter_composite_index/plan.txt +++ b/testdata/diff/online/alter_composite_index/plan.txt @@ -23,10 +23,11 @@ SELECT ELSE 0 END as progress FROM pg_class c +JOIN pg_namespace n ON c.relnamespace = n.oid LEFT JOIN pg_index i ON c.oid = i.indexrelid LEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid WHERE c.relname = 'idx_users_email_pgschema_new' - AND c.relnamespace = 'public'::regnamespace; + AND n.nspname = 'public'; -- Transaction Group #3 DROP INDEX IF EXISTS idx_users_email; @@ -45,10 +46,11 @@ SELECT ELSE 0 END as progress FROM pg_class c +JOIN pg_namespace n ON c.relnamespace = n.oid LEFT JOIN pg_index i ON c.oid = i.indexrelid LEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid WHERE c.relname = 'idx_users_status_pgschema_new' - AND c.relnamespace = 'public'::regnamespace; + AND n.nspname = 'public'; -- Transaction Group #6 DROP INDEX IF EXISTS idx_users_status; diff --git a/testdata/diff/online/alter_materialized_view_index/plan.json b/testdata/diff/online/alter_materialized_view_index/plan.json index 4f0e5a01b..3c693a4a3 100644 --- a/testdata/diff/online/alter_materialized_view_index/plan.json +++ b/testdata/diff/online/alter_materialized_view_index/plan.json @@ -19,7 +19,7 @@ { "steps": [ { - "sql": "SELECT \n COALESCE(i.indisvalid, false) as done,\n CASE \n WHEN p.blocks_total > 0 THEN p.blocks_done * 100 / p.blocks_total\n ELSE 0\n END as progress\nFROM pg_class c\nLEFT JOIN pg_index i ON c.oid = i.indexrelid\nLEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid\nWHERE c.relname = 'idx_user_summary_email_pgschema_new'\n AND c.relnamespace = 'public'::regnamespace;", + "sql": "SELECT \n COALESCE(i.indisvalid, false) as done,\n CASE \n WHEN p.blocks_total > 0 THEN p.blocks_done * 100 / p.blocks_total\n ELSE 0\n END as progress\nFROM pg_class c\nJOIN pg_namespace n ON c.relnamespace = n.oid\nLEFT JOIN pg_index i ON c.oid = i.indexrelid\nLEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid\nWHERE c.relname = 'idx_user_summary_email_pgschema_new'\n AND n.nspname = 'public';", "directive": { "type": "wait", "message": "Creating index idx_user_summary_email_pgschema_new" diff --git a/testdata/diff/online/alter_materialized_view_index/plan.sql b/testdata/diff/online/alter_materialized_view_index/plan.sql index ac2e440cf..8e9ea8893 100644 --- a/testdata/diff/online/alter_materialized_view_index/plan.sql +++ b/testdata/diff/online/alter_materialized_view_index/plan.sql @@ -8,10 +8,11 @@ SELECT ELSE 0 END as progress FROM pg_class c +JOIN pg_namespace n ON c.relnamespace = n.oid LEFT JOIN pg_index i ON c.oid = i.indexrelid LEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid WHERE c.relname = 'idx_user_summary_email_pgschema_new' - AND c.relnamespace = 'public'::regnamespace; + AND n.nspname = 'public'; DROP INDEX IF EXISTS idx_user_summary_email; diff --git a/testdata/diff/online/alter_materialized_view_index/plan.txt b/testdata/diff/online/alter_materialized_view_index/plan.txt index 95c6adc5e..0f2dc918a 100644 --- a/testdata/diff/online/alter_materialized_view_index/plan.txt +++ b/testdata/diff/online/alter_materialized_view_index/plan.txt @@ -22,10 +22,11 @@ SELECT ELSE 0 END as progress FROM pg_class c +JOIN pg_namespace n ON c.relnamespace = n.oid LEFT JOIN pg_index i ON c.oid = i.indexrelid LEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid WHERE c.relname = 'idx_user_summary_email_pgschema_new' - AND c.relnamespace = 'public'::regnamespace; + AND n.nspname = 'public'; -- Transaction Group #3 DROP INDEX IF EXISTS idx_user_summary_email; diff --git a/testdata/diff/online/issue_286_reserved_keyword_quoting/plan.json b/testdata/diff/online/issue_286_reserved_keyword_quoting/plan.json index 428542c62..068bb85fe 100644 --- a/testdata/diff/online/issue_286_reserved_keyword_quoting/plan.json +++ b/testdata/diff/online/issue_286_reserved_keyword_quoting/plan.json @@ -29,7 +29,7 @@ { "steps": [ { - "sql": "SELECT \n COALESCE(i.indisvalid, false) as done,\n CASE \n WHEN p.blocks_total > 0 THEN p.blocks_done * 100 / p.blocks_total\n ELSE 0\n END as progress\nFROM pg_class c\nLEFT JOIN pg_index i ON c.oid = i.indexrelid\nLEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid\nWHERE c.relname = 'IDX_order_tenant_order_number'\n AND c.relnamespace = 'public'::regnamespace;", + "sql": "SELECT \n COALESCE(i.indisvalid, false) as done,\n CASE \n WHEN p.blocks_total > 0 THEN p.blocks_done * 100 / p.blocks_total\n ELSE 0\n END as progress\nFROM pg_class c\nJOIN pg_namespace n ON c.relnamespace = n.oid\nLEFT JOIN pg_index i ON c.oid = i.indexrelid\nLEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid\nWHERE c.relname = 'IDX_order_tenant_order_number'\n AND n.nspname = 'public';", "directive": { "type": "wait", "message": "Creating index IDX_order_tenant_order_number" diff --git a/testdata/diff/online/issue_286_reserved_keyword_quoting/plan.sql b/testdata/diff/online/issue_286_reserved_keyword_quoting/plan.sql index 80ee2db9f..bac32f8eb 100644 --- a/testdata/diff/online/issue_286_reserved_keyword_quoting/plan.sql +++ b/testdata/diff/online/issue_286_reserved_keyword_quoting/plan.sql @@ -11,7 +11,8 @@ SELECT ELSE 0 END as progress FROM pg_class c +JOIN pg_namespace n ON c.relnamespace = n.oid LEFT JOIN pg_index i ON c.oid = i.indexrelid LEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid WHERE c.relname = 'IDX_order_tenant_order_number' - AND c.relnamespace = 'public'::regnamespace; + AND n.nspname = 'public'; diff --git a/testdata/diff/online/issue_286_reserved_keyword_quoting/plan.txt b/testdata/diff/online/issue_286_reserved_keyword_quoting/plan.txt index b93706c1b..bfefb5e96 100644 --- a/testdata/diff/online/issue_286_reserved_keyword_quoting/plan.txt +++ b/testdata/diff/online/issue_286_reserved_keyword_quoting/plan.txt @@ -27,7 +27,8 @@ SELECT ELSE 0 END as progress FROM pg_class c +JOIN pg_namespace n ON c.relnamespace = n.oid LEFT JOIN pg_index i ON c.oid = i.indexrelid LEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid WHERE c.relname = 'IDX_order_tenant_order_number' - AND c.relnamespace = 'public'::regnamespace; + AND n.nspname = 'public'; diff --git a/testdata/diff/online/issue_418_partitioned_parent_index/plan.json b/testdata/diff/online/issue_418_partitioned_parent_index/plan.json index c2af9c65d..10138074a 100644 --- a/testdata/diff/online/issue_418_partitioned_parent_index/plan.json +++ b/testdata/diff/online/issue_418_partitioned_parent_index/plan.json @@ -29,7 +29,7 @@ { "steps": [ { - "sql": "SELECT \n COALESCE(i.indisvalid, false) as done,\n CASE \n WHEN p.blocks_total > 0 THEN p.blocks_done * 100 / p.blocks_total\n ELSE 0\n END as progress\nFROM pg_class c\nLEFT JOIN pg_index i ON c.oid = i.indexrelid\nLEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid\nWHERE c.relname = 'events_2026_04_payload_idx'\n AND c.relnamespace = 'public'::regnamespace;", + "sql": "SELECT \n COALESCE(i.indisvalid, false) as done,\n CASE \n WHEN p.blocks_total > 0 THEN p.blocks_done * 100 / p.blocks_total\n ELSE 0\n END as progress\nFROM pg_class c\nJOIN pg_namespace n ON c.relnamespace = n.oid\nLEFT JOIN pg_index i ON c.oid = i.indexrelid\nLEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid\nWHERE c.relname = 'events_2026_04_payload_idx'\n AND n.nspname = 'public';", "directive": { "type": "wait", "message": "Creating index events_2026_04_payload_idx" diff --git a/testdata/diff/online/issue_418_partitioned_parent_index/plan.sql b/testdata/diff/online/issue_418_partitioned_parent_index/plan.sql index b00a2adf8..6a13e91ef 100644 --- a/testdata/diff/online/issue_418_partitioned_parent_index/plan.sql +++ b/testdata/diff/online/issue_418_partitioned_parent_index/plan.sql @@ -10,7 +10,8 @@ SELECT ELSE 0 END as progress FROM pg_class c +JOIN pg_namespace n ON c.relnamespace = n.oid LEFT JOIN pg_index i ON c.oid = i.indexrelid LEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid WHERE c.relname = 'events_2026_04_payload_idx' - AND c.relnamespace = 'public'::regnamespace; + AND n.nspname = 'public'; diff --git a/testdata/diff/online/issue_418_partitioned_parent_index/plan.txt b/testdata/diff/online/issue_418_partitioned_parent_index/plan.txt index 0f4059638..6d773f2cb 100644 --- a/testdata/diff/online/issue_418_partitioned_parent_index/plan.txt +++ b/testdata/diff/online/issue_418_partitioned_parent_index/plan.txt @@ -27,7 +27,8 @@ SELECT ELSE 0 END as progress FROM pg_class c +JOIN pg_namespace n ON c.relnamespace = n.oid LEFT JOIN pg_index i ON c.oid = i.indexrelid LEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid WHERE c.relname = 'events_2026_04_payload_idx' - AND c.relnamespace = 'public'::regnamespace; + AND n.nspname = 'public'; diff --git a/testdata/diff/online/issue_509_index_rebuild_dropped_column/plan.json b/testdata/diff/online/issue_509_index_rebuild_dropped_column/plan.json index 1984ff186..855a51dab 100644 --- a/testdata/diff/online/issue_509_index_rebuild_dropped_column/plan.json +++ b/testdata/diff/online/issue_509_index_rebuild_dropped_column/plan.json @@ -29,7 +29,7 @@ { "steps": [ { - "sql": "SELECT \n COALESCE(i.indisvalid, false) as done,\n CASE \n WHEN p.blocks_total > 0 THEN p.blocks_done * 100 / p.blocks_total\n ELSE 0\n END as progress\nFROM pg_class c\nLEFT JOIN pg_index i ON c.oid = i.indexrelid\nLEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid\nWHERE c.relname = 'idx_notifications_tenant_user_pgschema_new'\n AND c.relnamespace = 'public'::regnamespace;", + "sql": "SELECT \n COALESCE(i.indisvalid, false) as done,\n CASE \n WHEN p.blocks_total > 0 THEN p.blocks_done * 100 / p.blocks_total\n ELSE 0\n END as progress\nFROM pg_class c\nJOIN pg_namespace n ON c.relnamespace = n.oid\nLEFT JOIN pg_index i ON c.oid = i.indexrelid\nLEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid\nWHERE c.relname = 'idx_notifications_tenant_user_pgschema_new'\n AND n.nspname = 'public';", "directive": { "type": "wait", "message": "Creating index idx_notifications_tenant_user_pgschema_new" diff --git a/testdata/diff/online/issue_509_index_rebuild_dropped_column/plan.sql b/testdata/diff/online/issue_509_index_rebuild_dropped_column/plan.sql index bb7bb96ad..68a3dfb2c 100644 --- a/testdata/diff/online/issue_509_index_rebuild_dropped_column/plan.sql +++ b/testdata/diff/online/issue_509_index_rebuild_dropped_column/plan.sql @@ -10,10 +10,11 @@ SELECT ELSE 0 END as progress FROM pg_class c +JOIN pg_namespace n ON c.relnamespace = n.oid LEFT JOIN pg_index i ON c.oid = i.indexrelid LEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid WHERE c.relname = 'idx_notifications_tenant_user_pgschema_new' - AND c.relnamespace = 'public'::regnamespace; + AND n.nspname = 'public'; DROP INDEX IF EXISTS idx_notifications_tenant_user; diff --git a/testdata/diff/online/issue_509_index_rebuild_dropped_column/plan.txt b/testdata/diff/online/issue_509_index_rebuild_dropped_column/plan.txt index dcf3989cb..1e471437d 100644 --- a/testdata/diff/online/issue_509_index_rebuild_dropped_column/plan.txt +++ b/testdata/diff/online/issue_509_index_rebuild_dropped_column/plan.txt @@ -26,10 +26,11 @@ SELECT ELSE 0 END as progress FROM pg_class c +JOIN pg_namespace n ON c.relnamespace = n.oid LEFT JOIN pg_index i ON c.oid = i.indexrelid LEFT JOIN pg_stat_progress_create_index p ON c.oid = p.index_relid WHERE c.relname = 'idx_notifications_tenant_user_pgschema_new' - AND c.relnamespace = 'public'::regnamespace; + AND n.nspname = 'public'; -- Transaction Group #4 DROP INDEX IF EXISTS idx_notifications_tenant_user; From 250d171b2fca821a2e32af3d1987848866b796c1 Mon Sep 17 00:00:00 2001 From: Shehjad Date: Thu, 15 Oct 2026 14:25:26 +0600 Subject: [PATCH 3/3] test: drop standalone integration test for #641 (covered by unit tests and fixtures) --- cmd/issue_641_integration_test.go | 122 ------------------------------ 1 file changed, 122 deletions(-) delete mode 100644 cmd/issue_641_integration_test.go diff --git a/cmd/issue_641_integration_test.go b/cmd/issue_641_integration_test.go deleted file mode 100644 index 3efbfcdfd..000000000 --- a/cmd/issue_641_integration_test.go +++ /dev/null @@ -1,122 +0,0 @@ -package cmd - -import ( - "context" - "database/sql" - "fmt" - "os" - "path/filepath" - "strings" - "testing" - "time" - - "github.com/pgplex/pgschema/testutil" -) - -// TestIssue641ConcurrentIndexWaitCrossSchema reproduces -// https://github.com/pgplex/pgschema/issues/641: an invalid index of the same -// name in another schema made the CREATE INDEX CONCURRENTLY wait query, which -// matched by index name only, report done=false forever. The wait query is now -// schema-qualified by exact nspname, so apply completes for the target schema, -// including mixed-case quoted schema names. -func TestIssue641ConcurrentIndexWaitCrossSchema(t *testing.T) { - if testing.Short() { - t.Skip("Skipping integration test in short mode") - } - - ctx := context.Background() - - embeddedPG := testutil.SetupPostgres(t) - defer embeddedPG.Stop() - conn, host, port, dbname, user, password := testutil.ConnectToPostgres(t, embeddedPG) - defer conn.Close() - - // A failed concurrent unique build leaves an invalid tenant_a.items_sku_idx. - if _, err := conn.ExecContext(ctx, ` -CREATE SCHEMA tenant_a; -CREATE TABLE tenant_a.items (sku int); -INSERT INTO tenant_a.items VALUES (1), (1); -`); err != nil { - t.Fatalf("setup tenant_a: %v", err) - } - if _, err := conn.ExecContext(ctx, `CREATE UNIQUE INDEX CONCURRENTLY items_sku_idx ON tenant_a.items (sku)`); err == nil { - t.Fatal("expected unique violation creating concurrent index on tenant_a") - } - if valid := indexValid(t, conn, "tenant_a", "items_sku_idx"); valid { - t.Fatal("expected tenant_a.items_sku_idx to be invalid") - } - - // The pre-fix wait query (index name only) reports done=false: apply hangs. - var done bool - if err := conn.QueryRowContext(ctx, ` -SELECT COALESCE(i.indisvalid, false) as done -FROM pg_class c -LEFT JOIN pg_index i ON c.oid = i.indexrelid -WHERE c.relname = 'items_sku_idx'`).Scan(&done); err != nil { - t.Fatalf("unqualified wait query: %v", err) - } - if done { - t.Fatal("expected name-only wait query on invalid index to report done=false") - } - - for _, schema := range []string{"tenant_b", "TenantB"} { - t.Run(schema, func(t *testing.T) { - quoted := `"` + schema + `"` - if _, err := conn.ExecContext(ctx, fmt.Sprintf(` -CREATE SCHEMA %[1]s; -CREATE TABLE %[1]s.items (sku int); -INSERT INTO %[1]s.items VALUES (1), (2);`, quoted)); err != nil { - t.Fatalf("setup %s: %v", schema, err) - } - - desiredFile := filepath.Join(t.TempDir(), "desired.sql") - desired := ` -CREATE TABLE items (sku int); -CREATE INDEX items_sku_idx ON items USING btree (sku); -` - if err := os.WriteFile(desiredFile, []byte(desired), 0644); err != nil { - t.Fatal(err) - } - - planSQL, err := generatePlanSQLFormatted(host, port, dbname, user, password, schema, desiredFile) - if err != nil { - t.Fatalf("plan: %v", err) - } - wantFilter := "n.nspname = '" + schema + "'" - if !strings.Contains(planSQL, "CREATE INDEX CONCURRENTLY") || !strings.Contains(planSQL, wantFilter) { - t.Fatalf("expected concurrent index with wait filter %q in plan:\n%s", wantFilter, planSQL) - } - - // Fail rather than hang if the wait directive never completes. - errCh := make(chan error, 1) - go func() { - errCh <- applySchemaChanges(host, port, dbname, user, password, schema, desiredFile) - }() - select { - case err := <-errCh: - if err != nil { - t.Fatalf("apply with invalid peer index in tenant_a: %v", err) - } - case <-time.After(60 * time.Second): - t.Fatal("apply did not finish within 60s; wait directive likely matched tenant_a's invalid index (issue #641)") - } - - if !indexValid(t, conn, schema, "items_sku_idx") { - t.Fatalf("expected %s.items_sku_idx valid after apply", schema) - } - }) - } -} - -func indexValid(t *testing.T, conn *sql.DB, schema, index string) bool { - t.Helper() - var valid bool - if err := conn.QueryRow(` - SELECT i.indisvalid FROM pg_class c - JOIN pg_namespace n ON c.relnamespace = n.oid - JOIN pg_index i ON c.oid = i.indexrelid - WHERE n.nspname = $1 AND c.relname = $2`, schema, index).Scan(&valid); err != nil { - t.Fatalf("inspect %s.%s: %v", schema, index, err) - } - return valid -}