migrations: use COMMIT AND CHAIN for tenant_id (#64431)

We dived into our go postgres driver and when executing a migration it
is executed as a "simple query". Postgres in this case automatically
wraps the collection of statements in a transaction, unless it contains
transaction statements. So our last attempt at removing the transaction
failed.

In this attempt we use COMMIT AND CHAIN after each table alter. What
this does is commit the current transaction and then starts it up again.
From the perspective of the go driver, it is as if there was only one
transaction. We then switch the migration to using a transaction to
ensure the go drivers clean up the postgres connection in case of
failure.

IE if a query manually starts a transaction and does not clean up, the
connection will be marked as broken for the next person who gets the
connection from the pool. By wrapping in go's transaction code the
connection will be properly cleaned up.

Test Plan: All continuous environments have already succeeded or failed
on this migration number. So we will manually run this again against
them with the migrator code to ensure the same code paths. If they
succeed we will keep code as is, otherwise we will rollback.

Additionally we did lots of adhoc testing to understand the
characteristics of go and transaction handling.

Co-authored-by: Erik Seliger <erikseliger@me.com>
This commit is contained in:
Keegan Carruthers-Smith 2024-08-13 13:59:59 +02:00 committed by GitHub
parent 7b1bc10a30
commit e93b69bef2
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
12 changed files with 667 additions and 428 deletions

View File

@ -0,0 +1,192 @@
diff --git a/internal/database/connections/live/BUILD.bazel b/internal/database/connections/live/BUILD.bazel
index cd397a24b1a..e2b0ba10c9d 100644
--- a/internal/database/connections/live/BUILD.bazel
+++ b/internal/database/connections/live/BUILD.bazel
@@ -35,6 +35,7 @@ go_test(
],
deps = [
"//internal/database/dbtest",
+ "//internal/database/migration/definition",
"//internal/database/migration/drift",
"//internal/database/migration/runner",
"//internal/database/migration/schemas",
diff --git a/internal/database/connections/live/migration_test.go b/internal/database/connections/live/migration_test.go
index 18938f332c6..8880ec58259 100644
--- a/internal/database/connections/live/migration_test.go
+++ b/internal/database/connections/live/migration_test.go
@@ -2,6 +2,7 @@ package connections
import (
"context"
+ "database/sql"
"fmt"
"strings"
"testing"
@@ -12,6 +13,7 @@ import (
"github.com/sourcegraph/log/logtest"
"github.com/sourcegraph/sourcegraph/internal/database/dbtest"
+ "github.com/sourcegraph/sourcegraph/internal/database/migration/definition"
"github.com/sourcegraph/sourcegraph/internal/database/migration/drift"
"github.com/sourcegraph/sourcegraph/internal/database/migration/runner"
"github.com/sourcegraph/sourcegraph/internal/database/migration/schemas"
@@ -129,7 +131,7 @@ func testMigrationIdempotency(t *testing.T, name string, schema *schemas.Schema)
t.Run("idempotent up", func(t *testing.T) {
for _, definition := range all {
- if _, err := db.Exec(definition.UpQuery.Query(sqlf.PostgresBindVar)); err != nil {
+ if err := applyMigration(db, definition, true); err != nil {
t.Fatalf("failed to perform upgrade of migration %d: %s", definition.ID, err)
}
@@ -139,7 +141,7 @@ func testMigrationIdempotency(t *testing.T, name string, schema *schemas.Schema)
continue
}
- if _, err := db.Exec(definition.UpQuery.Query(sqlf.PostgresBindVar)); err != nil {
+ if err := applyMigration(db, definition, true); err != nil {
t.Fatalf("migration %d is not idempotent%s: %s", definition.ID, formatHint(err), err)
}
}
@@ -149,7 +151,7 @@ func testMigrationIdempotency(t *testing.T, name string, schema *schemas.Schema)
for i := len(all) - 1; i >= 0; i-- {
definition := all[i]
- if _, err := db.Exec(definition.DownQuery.Query(sqlf.PostgresBindVar)); err != nil {
+ if err := applyMigration(db, definition, false); err != nil {
t.Fatalf("failed to perform downgrade of migration %d: %s", definition.ID, err)
}
@@ -159,7 +161,7 @@ func testMigrationIdempotency(t *testing.T, name string, schema *schemas.Schema)
continue
}
- if _, err := db.Exec(definition.DownQuery.Query(sqlf.PostgresBindVar)); err != nil {
+ if err := applyMigration(db, definition, false); err != nil {
t.Fatalf("migration %d is not idempotent%s: %s", definition.ID, formatHint(err), err)
}
}
@@ -183,7 +185,7 @@ func testDownMigrationsDoNotCreateDrift(t *testing.T, name string, schema *schem
expectedDescription := expectedDescriptions["public"]
// Run query up
- if _, err := db.Exec(definition.UpQuery.Query(sqlf.PostgresBindVar)); err != nil {
+ if err := applyMigration(db, definition, true); err != nil {
t.Fatalf("failed to perform upgrade of migration %d: %s", definition.ID, err)
}
@@ -194,7 +196,7 @@ func testDownMigrationsDoNotCreateDrift(t *testing.T, name string, schema *schem
}
// Run query down (should restore previous state)
- if _, err := db.Exec(definition.DownQuery.Query(sqlf.PostgresBindVar)); err != nil {
+ if err := applyMigration(db, definition, false); err != nil {
t.Fatalf("failed to perform downgrade of migration %d: %s", definition.ID, err)
}
@@ -232,7 +234,7 @@ func testDownMigrationsDoNotCreateDrift(t *testing.T, name string, schema *schem
}
// Re-run query up to prepare for next round
- if _, err := db.Exec(definition.UpQuery.Query(sqlf.PostgresBindVar)); err != nil {
+ if err := applyMigration(db, definition, true); err != nil {
t.Fatalf("failed to re-perform upgrade of migration %d: %s", definition.ID, err)
}
}
@@ -264,3 +266,38 @@ func formatHint(err error) string {
return ""
}
+
+// applyMigration applies migrations for testing. In real-world, they run inside of a
+// transaction, sp we mimic that in this helper as well.
+func applyMigration(db *sql.DB, definition definition.Definition, up bool) (err error) {
+ type execer interface {
+ Exec(query string, args ...any) (sql.Result, error)
+ }
+ var queryRunner execer = db
+
+ if !definition.IsCreateIndexConcurrently {
+ tx, err := db.BeginTx(context.Background(), &sql.TxOptions{})
+ if err != nil {
+ return err
+ }
+ queryRunner = tx
+ defer func() {
+ if err != nil {
+ err = errors.Append(err, tx.Rollback())
+ }
+ err = tx.Commit()
+ }()
+ }
+
+ if up {
+ if _, err := queryRunner.Exec(definition.UpQuery.Query(sqlf.PostgresBindVar)); err != nil {
+ return errors.Wrapf(err, "failed to apply migration %d:\n```\n%s\n```\n", definition.ID, definition.UpQuery.Query(sqlf.PostgresBindVar))
+ }
+ } else {
+ if _, err := queryRunner.Exec(definition.DownQuery.Query(sqlf.PostgresBindVar)); err != nil {
+ return errors.Wrapf(err, "failed to apply migration %d:\n```\n%s\n```\n", definition.ID, definition.DownQuery.Query(sqlf.PostgresBindVar))
+ }
+ }
+
+ return nil
+}
diff --git a/internal/database/connections/test/store.go b/internal/database/connections/test/store.go
index bd4439c96a1..df755f98920 100644
--- a/internal/database/connections/test/store.go
+++ b/internal/database/connections/test/store.go
@@ -17,6 +17,7 @@ import (
// not passed to any underlying persistence layer.
type memoryStore struct {
db *sql.DB
+ tx *sql.Tx
appliedVersions []int
pendingVersions []int
failedVersions []int
@@ -28,11 +29,25 @@ func newMemoryStore(db *sql.DB) runner.Store {
}
}
-func (s *memoryStore) Transact(ctx context.Context) (runner.Store, error) {
- return s, nil
+func (s *memoryStore) Transact(ctx context.Context) (_ runner.Store, err error) {
+ if s.tx != nil {
+ return nil, errors.New("cannot start transaction when another transaction is in progress, call Done before")
+ }
+ s.tx, err = s.db.BeginTx(ctx, &sql.TxOptions{})
+ return s, err
}
func (s *memoryStore) Done(err error) error {
+ defer func() {
+ s.tx = nil
+ }()
+
+ if s.tx != nil {
+ if err != nil {
+ return errors.Append(err, s.tx.Rollback())
+ }
+ return s.tx.Commit()
+ }
return err
}
@@ -68,8 +83,16 @@ func (s *memoryStore) IndexStatus(_ context.Context, _, _ string) (shared.IndexS
return shared.IndexStatus{}, false, nil
}
+type execContexter interface {
+ ExecContext(ctx context.Context, query string, args ...any) (sql.Result, error)
+}
+
func (s *memoryStore) exec(ctx context.Context, migration definition.Definition, query *sqlf.Query) error {
- _, err := s.db.ExecContext(ctx, query.Query(sqlf.PostgresBindVar), query.Args()...)
+ var db execContexter = s.db
+ if s.tx != nil {
+ db = s.tx
+ }
+ _, err := db.ExecContext(ctx, query.Query(sqlf.PostgresBindVar), query.Args()...)
if err != nil {
s.failedVersions = append(s.failedVersions, migration.ID)
return err

View File

@ -35,6 +35,7 @@ go_test(
],
deps = [
"//internal/database/dbtest",
"//internal/database/migration/definition",
"//internal/database/migration/drift",
"//internal/database/migration/runner",
"//internal/database/migration/schemas",

View File

@ -2,6 +2,7 @@ package connections
import (
"context"
"database/sql"
"fmt"
"strings"
"testing"
@ -12,6 +13,7 @@ import (
"github.com/sourcegraph/log/logtest"
"github.com/sourcegraph/sourcegraph/internal/database/dbtest"
"github.com/sourcegraph/sourcegraph/internal/database/migration/definition"
"github.com/sourcegraph/sourcegraph/internal/database/migration/drift"
"github.com/sourcegraph/sourcegraph/internal/database/migration/runner"
"github.com/sourcegraph/sourcegraph/internal/database/migration/schemas"
@ -129,7 +131,7 @@ func testMigrationIdempotency(t *testing.T, name string, schema *schemas.Schema)
t.Run("idempotent up", func(t *testing.T) {
for _, definition := range all {
if _, err := db.Exec(definition.UpQuery.Query(sqlf.PostgresBindVar)); err != nil {
if err := applyMigration(db, definition, true); err != nil {
t.Fatalf("failed to perform upgrade of migration %d: %s", definition.ID, err)
}
@ -139,7 +141,7 @@ func testMigrationIdempotency(t *testing.T, name string, schema *schemas.Schema)
continue
}
if _, err := db.Exec(definition.UpQuery.Query(sqlf.PostgresBindVar)); err != nil {
if err := applyMigration(db, definition, true); err != nil {
t.Fatalf("migration %d is not idempotent%s: %s", definition.ID, formatHint(err), err)
}
}
@ -149,7 +151,7 @@ func testMigrationIdempotency(t *testing.T, name string, schema *schemas.Schema)
for i := len(all) - 1; i >= 0; i-- {
definition := all[i]
if _, err := db.Exec(definition.DownQuery.Query(sqlf.PostgresBindVar)); err != nil {
if err := applyMigration(db, definition, false); err != nil {
t.Fatalf("failed to perform downgrade of migration %d: %s", definition.ID, err)
}
@ -159,7 +161,7 @@ func testMigrationIdempotency(t *testing.T, name string, schema *schemas.Schema)
continue
}
if _, err := db.Exec(definition.DownQuery.Query(sqlf.PostgresBindVar)); err != nil {
if err := applyMigration(db, definition, false); err != nil {
t.Fatalf("migration %d is not idempotent%s: %s", definition.ID, formatHint(err), err)
}
}
@ -183,7 +185,7 @@ func testDownMigrationsDoNotCreateDrift(t *testing.T, name string, schema *schem
expectedDescription := expectedDescriptions["public"]
// Run query up
if _, err := db.Exec(definition.UpQuery.Query(sqlf.PostgresBindVar)); err != nil {
if err := applyMigration(db, definition, true); err != nil {
t.Fatalf("failed to perform upgrade of migration %d: %s", definition.ID, err)
}
@ -194,7 +196,7 @@ func testDownMigrationsDoNotCreateDrift(t *testing.T, name string, schema *schem
}
// Run query down (should restore previous state)
if _, err := db.Exec(definition.DownQuery.Query(sqlf.PostgresBindVar)); err != nil {
if err := applyMigration(db, definition, false); err != nil {
t.Fatalf("failed to perform downgrade of migration %d: %s", definition.ID, err)
}
@ -232,7 +234,7 @@ func testDownMigrationsDoNotCreateDrift(t *testing.T, name string, schema *schem
}
// Re-run query up to prepare for next round
if _, err := db.Exec(definition.UpQuery.Query(sqlf.PostgresBindVar)); err != nil {
if err := applyMigration(db, definition, true); err != nil {
t.Fatalf("failed to re-perform upgrade of migration %d: %s", definition.ID, err)
}
}
@ -264,3 +266,38 @@ func formatHint(err error) string {
return ""
}
// applyMigration applies migrations for testing. In real-world, they run inside of a
// transaction, sp we mimic that in this helper as well.
func applyMigration(db *sql.DB, definition definition.Definition, up bool) (err error) {
type execer interface {
Exec(query string, args ...any) (sql.Result, error)
}
var queryRunner execer = db
if !definition.IsCreateIndexConcurrently && !definition.NoTransaction {
tx, err := db.BeginTx(context.Background(), &sql.TxOptions{})
if err != nil {
return err
}
queryRunner = tx
defer func() {
if err != nil {
err = errors.Append(err, tx.Rollback())
}
err = tx.Commit()
}()
}
if up {
if _, err := queryRunner.Exec(definition.UpQuery.Query(sqlf.PostgresBindVar)); err != nil {
return errors.Wrapf(err, "failed to apply migration %d:\n```\n%s\n```\n", definition.ID, definition.UpQuery.Query(sqlf.PostgresBindVar))
}
} else {
if _, err := queryRunner.Exec(definition.DownQuery.Query(sqlf.PostgresBindVar)); err != nil {
return errors.Wrapf(err, "failed to apply migration %d:\n```\n%s\n```\n", definition.ID, definition.DownQuery.Query(sqlf.PostgresBindVar))
}
}
return nil
}

View File

@ -6,25 +6,25 @@ BEGIN
END;
$$ LANGUAGE plpgsql;
SELECT migrate_add_tenant_id_codeinsights('archived_insight_series_recording_times');
SELECT migrate_add_tenant_id_codeinsights('archived_series_points');
SELECT migrate_add_tenant_id_codeinsights('dashboard');
SELECT migrate_add_tenant_id_codeinsights('dashboard_grants');
SELECT migrate_add_tenant_id_codeinsights('dashboard_insight_view');
SELECT migrate_add_tenant_id_codeinsights('insight_series');
SELECT migrate_add_tenant_id_codeinsights('insight_series_backfill');
SELECT migrate_add_tenant_id_codeinsights('insight_series_incomplete_points');
SELECT migrate_add_tenant_id_codeinsights('insight_series_recording_times');
SELECT migrate_add_tenant_id_codeinsights('insight_view');
SELECT migrate_add_tenant_id_codeinsights('insight_view_grants');
SELECT migrate_add_tenant_id_codeinsights('insight_view_series');
SELECT migrate_add_tenant_id_codeinsights('insights_background_jobs');
SELECT migrate_add_tenant_id_codeinsights('insights_data_retention_jobs');
SELECT migrate_add_tenant_id_codeinsights('metadata');
SELECT migrate_add_tenant_id_codeinsights('repo_iterator');
SELECT migrate_add_tenant_id_codeinsights('repo_iterator_errors');
SELECT migrate_add_tenant_id_codeinsights('repo_names');
SELECT migrate_add_tenant_id_codeinsights('series_points');
SELECT migrate_add_tenant_id_codeinsights('series_points_snapshots');
SELECT migrate_add_tenant_id_codeinsights('archived_insight_series_recording_times'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_codeinsights('archived_series_points'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_codeinsights('dashboard'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_codeinsights('dashboard_grants'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_codeinsights('dashboard_insight_view'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_codeinsights('insight_series'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_codeinsights('insight_series_backfill'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_codeinsights('insight_series_incomplete_points'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_codeinsights('insight_series_recording_times'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_codeinsights('insight_view'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_codeinsights('insight_view_grants'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_codeinsights('insight_view_series'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_codeinsights('insights_background_jobs'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_codeinsights('insights_data_retention_jobs'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_codeinsights('metadata'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_codeinsights('repo_iterator'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_codeinsights('repo_iterator_errors'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_codeinsights('repo_names'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_codeinsights('series_points'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_codeinsights('series_points_snapshots'); COMMIT AND CHAIN;
DROP FUNCTION migrate_add_tenant_id_codeinsights(text);

View File

@ -1,3 +1,2 @@
name: add tenant id to most tables
noTransaction: true
parents: [1719914228]

View File

@ -1,6 +1,10 @@
-- This migration adds the tenant_id column in a way which doesn't require
-- updating every row. The value is null and an out of band migration will set
-- it to the default. A later migration will enforce tenant_id to be set.
--
-- We COMMIT AND CHAIN after each table is altered to prevent a single
-- transaction over all the alters. A single transaction would lead to a
-- deadlock with concurrent application queries.
-- Temporary function to deduplicate the logic required for each table:
CREATE OR REPLACE FUNCTION migrate_add_tenant_id_codeinsights(table_name text)
@ -10,26 +14,26 @@ BEGIN
END;
$$ LANGUAGE plpgsql;
SELECT migrate_add_tenant_id_codeinsights('archived_insight_series_recording_times');
SELECT migrate_add_tenant_id_codeinsights('archived_series_points');
SELECT migrate_add_tenant_id_codeinsights('dashboard');
SELECT migrate_add_tenant_id_codeinsights('dashboard_grants');
SELECT migrate_add_tenant_id_codeinsights('dashboard_insight_view');
SELECT migrate_add_tenant_id_codeinsights('insight_series');
SELECT migrate_add_tenant_id_codeinsights('insight_series_backfill');
SELECT migrate_add_tenant_id_codeinsights('insight_series_incomplete_points');
SELECT migrate_add_tenant_id_codeinsights('insight_series_recording_times');
SELECT migrate_add_tenant_id_codeinsights('insight_view');
SELECT migrate_add_tenant_id_codeinsights('insight_view_grants');
SELECT migrate_add_tenant_id_codeinsights('insight_view_series');
SELECT migrate_add_tenant_id_codeinsights('insights_background_jobs');
SELECT migrate_add_tenant_id_codeinsights('insights_data_retention_jobs');
SELECT migrate_add_tenant_id_codeinsights('metadata');
SELECT migrate_add_tenant_id_codeinsights('repo_iterator');
SELECT migrate_add_tenant_id_codeinsights('repo_iterator_errors');
SELECT migrate_add_tenant_id_codeinsights('repo_names');
SELECT migrate_add_tenant_id_codeinsights('series_points');
SELECT migrate_add_tenant_id_codeinsights('series_points_snapshots');
SELECT migrate_add_tenant_id_codeinsights('archived_insight_series_recording_times'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_codeinsights('archived_series_points'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_codeinsights('dashboard'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_codeinsights('dashboard_grants'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_codeinsights('dashboard_insight_view'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_codeinsights('insight_series'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_codeinsights('insight_series_backfill'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_codeinsights('insight_series_incomplete_points'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_codeinsights('insight_series_recording_times'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_codeinsights('insight_view'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_codeinsights('insight_view_grants'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_codeinsights('insight_view_series'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_codeinsights('insights_background_jobs'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_codeinsights('insights_data_retention_jobs'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_codeinsights('metadata'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_codeinsights('repo_iterator'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_codeinsights('repo_iterator_errors'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_codeinsights('repo_names'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_codeinsights('series_points'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_codeinsights('series_points_snapshots'); COMMIT AND CHAIN;
-- Explicitly excluded tables
-- migration_logs :: about DB

View File

@ -6,17 +6,17 @@ BEGIN
END;
$$ LANGUAGE plpgsql;
SELECT migrate_add_tenant_id_codeintel('codeintel_last_reconcile');
SELECT migrate_add_tenant_id_codeintel('codeintel_scip_document_lookup');
SELECT migrate_add_tenant_id_codeintel('codeintel_scip_document_lookup_schema_versions');
SELECT migrate_add_tenant_id_codeintel('codeintel_scip_documents');
SELECT migrate_add_tenant_id_codeintel('codeintel_scip_documents_dereference_logs');
SELECT migrate_add_tenant_id_codeintel('codeintel_scip_metadata');
SELECT migrate_add_tenant_id_codeintel('codeintel_scip_symbol_names');
SELECT migrate_add_tenant_id_codeintel('codeintel_scip_symbols');
SELECT migrate_add_tenant_id_codeintel('codeintel_scip_symbols_schema_versions');
SELECT migrate_add_tenant_id_codeintel('rockskip_ancestry');
SELECT migrate_add_tenant_id_codeintel('rockskip_repos');
SELECT migrate_add_tenant_id_codeintel('rockskip_symbols');
SELECT migrate_add_tenant_id_codeintel('codeintel_last_reconcile'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_codeintel('codeintel_scip_document_lookup'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_codeintel('codeintel_scip_document_lookup_schema_versions'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_codeintel('codeintel_scip_documents'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_codeintel('codeintel_scip_documents_dereference_logs'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_codeintel('codeintel_scip_metadata'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_codeintel('codeintel_scip_symbol_names'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_codeintel('codeintel_scip_symbols'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_codeintel('codeintel_scip_symbols_schema_versions'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_codeintel('rockskip_ancestry'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_codeintel('rockskip_repos'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_codeintel('rockskip_symbols'); COMMIT AND CHAIN;
DROP FUNCTION migrate_add_tenant_id_codeintel(text);

View File

@ -1,3 +1,2 @@
name: add tenant id to most tables
noTransaction: true
parents: [1686315964]

View File

@ -1,6 +1,10 @@
-- This migration adds the tenant_id column in a way which doesn't require
-- updating every row. The value is null and an out of band migration will set
-- it to the default. A later migration will enforce tenant_id to be set.
--
-- We COMMIT AND CHAIN after each table is altered to prevent a single
-- transaction over all the alters. A single transaction would lead to a
-- deadlock with concurrent application queries.
-- Temporary function to deduplicate the logic required for each table:
CREATE OR REPLACE FUNCTION migrate_add_tenant_id_codeintel(table_name text)
@ -10,18 +14,18 @@ BEGIN
END;
$$ LANGUAGE plpgsql;
SELECT migrate_add_tenant_id_codeintel('codeintel_last_reconcile');
SELECT migrate_add_tenant_id_codeintel('codeintel_scip_document_lookup');
SELECT migrate_add_tenant_id_codeintel('codeintel_scip_document_lookup_schema_versions');
SELECT migrate_add_tenant_id_codeintel('codeintel_scip_documents');
SELECT migrate_add_tenant_id_codeintel('codeintel_scip_documents_dereference_logs');
SELECT migrate_add_tenant_id_codeintel('codeintel_scip_metadata');
SELECT migrate_add_tenant_id_codeintel('codeintel_scip_symbol_names');
SELECT migrate_add_tenant_id_codeintel('codeintel_scip_symbols');
SELECT migrate_add_tenant_id_codeintel('codeintel_scip_symbols_schema_versions');
SELECT migrate_add_tenant_id_codeintel('rockskip_ancestry');
SELECT migrate_add_tenant_id_codeintel('rockskip_repos');
SELECT migrate_add_tenant_id_codeintel('rockskip_symbols');
SELECT migrate_add_tenant_id_codeintel('codeintel_last_reconcile'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_codeintel('codeintel_scip_document_lookup'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_codeintel('codeintel_scip_document_lookup_schema_versions'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_codeintel('codeintel_scip_documents'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_codeintel('codeintel_scip_documents_dereference_logs'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_codeintel('codeintel_scip_metadata'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_codeintel('codeintel_scip_symbol_names'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_codeintel('codeintel_scip_symbols'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_codeintel('codeintel_scip_symbols_schema_versions'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_codeintel('rockskip_ancestry'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_codeintel('rockskip_repos'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_codeintel('rockskip_symbols'); COMMIT AND CHAIN;
-- Explicitly excluded tables
-- migration_logs :: about DB

View File

@ -6,182 +6,182 @@ BEGIN
END;
$$ LANGUAGE plpgsql;
SELECT migrate_add_tenant_id_frontend('access_requests');
SELECT migrate_add_tenant_id_frontend('access_tokens');
SELECT migrate_add_tenant_id_frontend('aggregated_user_statistics');
SELECT migrate_add_tenant_id_frontend('assigned_owners');
SELECT migrate_add_tenant_id_frontend('assigned_teams');
SELECT migrate_add_tenant_id_frontend('batch_changes');
SELECT migrate_add_tenant_id_frontend('batch_changes_site_credentials');
SELECT migrate_add_tenant_id_frontend('batch_spec_execution_cache_entries');
SELECT migrate_add_tenant_id_frontend('batch_spec_resolution_jobs');
SELECT migrate_add_tenant_id_frontend('batch_spec_workspace_execution_jobs');
SELECT migrate_add_tenant_id_frontend('batch_spec_workspace_execution_last_dequeues');
SELECT migrate_add_tenant_id_frontend('batch_spec_workspace_files');
SELECT migrate_add_tenant_id_frontend('batch_spec_workspaces');
SELECT migrate_add_tenant_id_frontend('batch_specs');
SELECT migrate_add_tenant_id_frontend('cached_available_indexers');
SELECT migrate_add_tenant_id_frontend('changeset_events');
SELECT migrate_add_tenant_id_frontend('changeset_jobs');
SELECT migrate_add_tenant_id_frontend('changeset_specs');
SELECT migrate_add_tenant_id_frontend('changesets');
SELECT migrate_add_tenant_id_frontend('cm_action_jobs');
SELECT migrate_add_tenant_id_frontend('cm_emails');
SELECT migrate_add_tenant_id_frontend('cm_last_searched');
SELECT migrate_add_tenant_id_frontend('cm_monitors');
SELECT migrate_add_tenant_id_frontend('cm_queries');
SELECT migrate_add_tenant_id_frontend('cm_recipients');
SELECT migrate_add_tenant_id_frontend('cm_slack_webhooks');
SELECT migrate_add_tenant_id_frontend('cm_trigger_jobs');
SELECT migrate_add_tenant_id_frontend('cm_webhooks');
SELECT migrate_add_tenant_id_frontend('code_hosts');
SELECT migrate_add_tenant_id_frontend('codeintel_autoindex_queue');
SELECT migrate_add_tenant_id_frontend('codeintel_autoindexing_exceptions');
SELECT migrate_add_tenant_id_frontend('codeintel_commit_dates');
SELECT migrate_add_tenant_id_frontend('codeintel_inference_scripts');
SELECT migrate_add_tenant_id_frontend('codeintel_initial_path_ranks');
SELECT migrate_add_tenant_id_frontend('codeintel_initial_path_ranks_processed');
SELECT migrate_add_tenant_id_frontend('codeintel_langugage_support_requests');
SELECT migrate_add_tenant_id_frontend('codeintel_path_ranks');
SELECT migrate_add_tenant_id_frontend('codeintel_ranking_definitions');
SELECT migrate_add_tenant_id_frontend('codeintel_ranking_exports');
SELECT migrate_add_tenant_id_frontend('codeintel_ranking_graph_keys');
SELECT migrate_add_tenant_id_frontend('codeintel_ranking_path_counts_inputs');
SELECT migrate_add_tenant_id_frontend('codeintel_ranking_progress');
SELECT migrate_add_tenant_id_frontend('codeintel_ranking_references');
SELECT migrate_add_tenant_id_frontend('codeintel_ranking_references_processed');
SELECT migrate_add_tenant_id_frontend('codeowners');
SELECT migrate_add_tenant_id_frontend('codeowners_individual_stats');
SELECT migrate_add_tenant_id_frontend('codeowners_owners');
SELECT migrate_add_tenant_id_frontend('commit_authors');
SELECT migrate_add_tenant_id_frontend('configuration_policies_audit_logs');
SELECT migrate_add_tenant_id_frontend('context_detection_embedding_jobs');
SELECT migrate_add_tenant_id_frontend('discussion_comments');
SELECT migrate_add_tenant_id_frontend('discussion_mail_reply_tokens');
SELECT migrate_add_tenant_id_frontend('discussion_threads');
SELECT migrate_add_tenant_id_frontend('discussion_threads_target_repo');
SELECT migrate_add_tenant_id_frontend('event_logs');
SELECT migrate_add_tenant_id_frontend('event_logs_export_allowlist');
SELECT migrate_add_tenant_id_frontend('event_logs_scrape_state');
SELECT migrate_add_tenant_id_frontend('event_logs_scrape_state_own');
SELECT migrate_add_tenant_id_frontend('executor_heartbeats');
SELECT migrate_add_tenant_id_frontend('executor_job_tokens');
SELECT migrate_add_tenant_id_frontend('executor_secret_access_logs');
SELECT migrate_add_tenant_id_frontend('executor_secrets');
SELECT migrate_add_tenant_id_frontend('exhaustive_search_jobs');
SELECT migrate_add_tenant_id_frontend('exhaustive_search_repo_jobs');
SELECT migrate_add_tenant_id_frontend('exhaustive_search_repo_revision_jobs');
SELECT migrate_add_tenant_id_frontend('explicit_permissions_bitbucket_projects_jobs');
SELECT migrate_add_tenant_id_frontend('external_service_repos');
SELECT migrate_add_tenant_id_frontend('external_service_sync_jobs');
SELECT migrate_add_tenant_id_frontend('external_services');
SELECT migrate_add_tenant_id_frontend('feature_flag_overrides');
SELECT migrate_add_tenant_id_frontend('feature_flags');
SELECT migrate_add_tenant_id_frontend('github_app_installs');
SELECT migrate_add_tenant_id_frontend('github_apps');
SELECT migrate_add_tenant_id_frontend('gitserver_relocator_jobs');
SELECT migrate_add_tenant_id_frontend('gitserver_repos');
SELECT migrate_add_tenant_id_frontend('gitserver_repos_statistics');
SELECT migrate_add_tenant_id_frontend('gitserver_repos_sync_output');
SELECT migrate_add_tenant_id_frontend('global_state');
SELECT migrate_add_tenant_id_frontend('insights_query_runner_jobs');
SELECT migrate_add_tenant_id_frontend('insights_query_runner_jobs_dependencies');
SELECT migrate_add_tenant_id_frontend('insights_settings_migration_jobs');
SELECT migrate_add_tenant_id_frontend('lsif_configuration_policies');
SELECT migrate_add_tenant_id_frontend('lsif_configuration_policies_repository_pattern_lookup');
SELECT migrate_add_tenant_id_frontend('lsif_dependency_indexing_jobs');
SELECT migrate_add_tenant_id_frontend('lsif_dependency_repos');
SELECT migrate_add_tenant_id_frontend('lsif_dependency_syncing_jobs');
SELECT migrate_add_tenant_id_frontend('lsif_dirty_repositories');
SELECT migrate_add_tenant_id_frontend('lsif_index_configuration');
SELECT migrate_add_tenant_id_frontend('lsif_indexes');
SELECT migrate_add_tenant_id_frontend('lsif_last_index_scan');
SELECT migrate_add_tenant_id_frontend('lsif_last_retention_scan');
SELECT migrate_add_tenant_id_frontend('lsif_nearest_uploads');
SELECT migrate_add_tenant_id_frontend('lsif_nearest_uploads_links');
SELECT migrate_add_tenant_id_frontend('lsif_packages');
SELECT migrate_add_tenant_id_frontend('lsif_references');
SELECT migrate_add_tenant_id_frontend('lsif_retention_configuration');
SELECT migrate_add_tenant_id_frontend('lsif_uploads');
SELECT migrate_add_tenant_id_frontend('lsif_uploads_audit_logs');
SELECT migrate_add_tenant_id_frontend('lsif_uploads_reference_counts');
SELECT migrate_add_tenant_id_frontend('lsif_uploads_visible_at_tip');
SELECT migrate_add_tenant_id_frontend('lsif_uploads_vulnerability_scan');
SELECT migrate_add_tenant_id_frontend('names');
SELECT migrate_add_tenant_id_frontend('namespace_permissions');
SELECT migrate_add_tenant_id_frontend('notebook_stars');
SELECT migrate_add_tenant_id_frontend('notebooks');
SELECT migrate_add_tenant_id_frontend('org_invitations');
SELECT migrate_add_tenant_id_frontend('org_members');
SELECT migrate_add_tenant_id_frontend('org_stats');
SELECT migrate_add_tenant_id_frontend('orgs');
SELECT migrate_add_tenant_id_frontend('orgs_open_beta_stats');
SELECT migrate_add_tenant_id_frontend('out_of_band_migrations');
SELECT migrate_add_tenant_id_frontend('out_of_band_migrations_errors');
SELECT migrate_add_tenant_id_frontend('outbound_webhook_event_types');
SELECT migrate_add_tenant_id_frontend('outbound_webhook_jobs');
SELECT migrate_add_tenant_id_frontend('outbound_webhook_logs');
SELECT migrate_add_tenant_id_frontend('outbound_webhooks');
SELECT migrate_add_tenant_id_frontend('own_aggregate_recent_contribution');
SELECT migrate_add_tenant_id_frontend('own_aggregate_recent_view');
SELECT migrate_add_tenant_id_frontend('own_background_jobs');
SELECT migrate_add_tenant_id_frontend('own_signal_configurations');
SELECT migrate_add_tenant_id_frontend('own_signal_recent_contribution');
SELECT migrate_add_tenant_id_frontend('ownership_path_stats');
SELECT migrate_add_tenant_id_frontend('package_repo_filters');
SELECT migrate_add_tenant_id_frontend('package_repo_versions');
SELECT migrate_add_tenant_id_frontend('permission_sync_jobs');
SELECT migrate_add_tenant_id_frontend('permissions');
SELECT migrate_add_tenant_id_frontend('phabricator_repos');
SELECT migrate_add_tenant_id_frontend('product_licenses');
SELECT migrate_add_tenant_id_frontend('product_subscriptions');
SELECT migrate_add_tenant_id_frontend('prompts');
SELECT migrate_add_tenant_id_frontend('query_runner_state');
SELECT migrate_add_tenant_id_frontend('redis_key_value');
SELECT migrate_add_tenant_id_frontend('registry_extension_releases');
SELECT migrate_add_tenant_id_frontend('registry_extensions');
SELECT migrate_add_tenant_id_frontend('repo');
SELECT migrate_add_tenant_id_frontend('repo_commits_changelists');
SELECT migrate_add_tenant_id_frontend('repo_embedding_job_stats');
SELECT migrate_add_tenant_id_frontend('repo_embedding_jobs');
SELECT migrate_add_tenant_id_frontend('repo_kvps');
SELECT migrate_add_tenant_id_frontend('repo_paths');
SELECT migrate_add_tenant_id_frontend('repo_pending_permissions');
SELECT migrate_add_tenant_id_frontend('repo_permissions');
SELECT migrate_add_tenant_id_frontend('repo_statistics');
SELECT migrate_add_tenant_id_frontend('role_permissions');
SELECT migrate_add_tenant_id_frontend('roles');
SELECT migrate_add_tenant_id_frontend('saved_searches');
SELECT migrate_add_tenant_id_frontend('search_context_default');
SELECT migrate_add_tenant_id_frontend('search_context_repos');
SELECT migrate_add_tenant_id_frontend('search_context_stars');
SELECT migrate_add_tenant_id_frontend('search_contexts');
SELECT migrate_add_tenant_id_frontend('security_event_logs');
SELECT migrate_add_tenant_id_frontend('settings');
SELECT migrate_add_tenant_id_frontend('sub_repo_permissions');
SELECT migrate_add_tenant_id_frontend('survey_responses');
SELECT migrate_add_tenant_id_frontend('syntactic_scip_indexing_jobs');
SELECT migrate_add_tenant_id_frontend('syntactic_scip_last_index_scan');
SELECT migrate_add_tenant_id_frontend('team_members');
SELECT migrate_add_tenant_id_frontend('teams');
SELECT migrate_add_tenant_id_frontend('telemetry_events_export_queue');
SELECT migrate_add_tenant_id_frontend('temporary_settings');
SELECT migrate_add_tenant_id_frontend('user_credentials');
SELECT migrate_add_tenant_id_frontend('user_emails');
SELECT migrate_add_tenant_id_frontend('user_external_accounts');
SELECT migrate_add_tenant_id_frontend('user_onboarding_tour');
SELECT migrate_add_tenant_id_frontend('user_pending_permissions');
SELECT migrate_add_tenant_id_frontend('user_permissions');
SELECT migrate_add_tenant_id_frontend('user_public_repos');
SELECT migrate_add_tenant_id_frontend('user_repo_permissions');
SELECT migrate_add_tenant_id_frontend('user_roles');
SELECT migrate_add_tenant_id_frontend('users');
SELECT migrate_add_tenant_id_frontend('vulnerabilities');
SELECT migrate_add_tenant_id_frontend('vulnerability_affected_packages');
SELECT migrate_add_tenant_id_frontend('vulnerability_affected_symbols');
SELECT migrate_add_tenant_id_frontend('vulnerability_matches');
SELECT migrate_add_tenant_id_frontend('webhook_logs');
SELECT migrate_add_tenant_id_frontend('webhooks');
SELECT migrate_add_tenant_id_frontend('zoekt_repos');
SELECT migrate_add_tenant_id_frontend('access_requests'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('access_tokens'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('aggregated_user_statistics'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('assigned_owners'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('assigned_teams'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('batch_changes'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('batch_changes_site_credentials'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('batch_spec_execution_cache_entries'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('batch_spec_resolution_jobs'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('batch_spec_workspace_execution_jobs'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('batch_spec_workspace_execution_last_dequeues'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('batch_spec_workspace_files'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('batch_spec_workspaces'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('batch_specs'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('cached_available_indexers'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('changeset_events'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('changeset_jobs'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('changeset_specs'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('changesets'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('cm_action_jobs'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('cm_emails'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('cm_last_searched'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('cm_monitors'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('cm_queries'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('cm_recipients'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('cm_slack_webhooks'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('cm_trigger_jobs'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('cm_webhooks'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('code_hosts'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('codeintel_autoindex_queue'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('codeintel_autoindexing_exceptions'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('codeintel_commit_dates'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('codeintel_inference_scripts'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('codeintel_initial_path_ranks'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('codeintel_initial_path_ranks_processed'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('codeintel_langugage_support_requests'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('codeintel_path_ranks'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('codeintel_ranking_definitions'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('codeintel_ranking_exports'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('codeintel_ranking_graph_keys'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('codeintel_ranking_path_counts_inputs'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('codeintel_ranking_progress'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('codeintel_ranking_references'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('codeintel_ranking_references_processed'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('codeowners'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('codeowners_individual_stats'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('codeowners_owners'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('commit_authors'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('configuration_policies_audit_logs'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('context_detection_embedding_jobs'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('discussion_comments'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('discussion_mail_reply_tokens'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('discussion_threads'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('discussion_threads_target_repo'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('event_logs'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('event_logs_export_allowlist'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('event_logs_scrape_state'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('event_logs_scrape_state_own'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('executor_heartbeats'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('executor_job_tokens'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('executor_secret_access_logs'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('executor_secrets'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('exhaustive_search_jobs'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('exhaustive_search_repo_jobs'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('exhaustive_search_repo_revision_jobs'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('explicit_permissions_bitbucket_projects_jobs'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('external_service_repos'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('external_service_sync_jobs'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('external_services'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('feature_flag_overrides'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('feature_flags'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('github_app_installs'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('github_apps'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('gitserver_relocator_jobs'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('gitserver_repos'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('gitserver_repos_statistics'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('gitserver_repos_sync_output'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('global_state'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('insights_query_runner_jobs'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('insights_query_runner_jobs_dependencies'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('insights_settings_migration_jobs'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('lsif_configuration_policies'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('lsif_configuration_policies_repository_pattern_lookup'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('lsif_dependency_indexing_jobs'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('lsif_dependency_repos'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('lsif_dependency_syncing_jobs'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('lsif_dirty_repositories'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('lsif_index_configuration'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('lsif_indexes'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('lsif_last_index_scan'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('lsif_last_retention_scan'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('lsif_nearest_uploads'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('lsif_nearest_uploads_links'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('lsif_packages'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('lsif_references'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('lsif_retention_configuration'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('lsif_uploads'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('lsif_uploads_audit_logs'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('lsif_uploads_reference_counts'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('lsif_uploads_visible_at_tip'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('lsif_uploads_vulnerability_scan'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('names'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('namespace_permissions'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('notebook_stars'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('notebooks'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('org_invitations'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('org_members'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('org_stats'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('orgs'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('orgs_open_beta_stats'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('out_of_band_migrations'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('out_of_band_migrations_errors'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('outbound_webhook_event_types'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('outbound_webhook_jobs'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('outbound_webhook_logs'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('outbound_webhooks'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('own_aggregate_recent_contribution'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('own_aggregate_recent_view'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('own_background_jobs'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('own_signal_configurations'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('own_signal_recent_contribution'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('ownership_path_stats'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('package_repo_filters'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('package_repo_versions'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('permission_sync_jobs'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('permissions'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('phabricator_repos'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('product_licenses'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('product_subscriptions'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('prompts'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('query_runner_state'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('redis_key_value'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('registry_extension_releases'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('registry_extensions'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('repo'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('repo_commits_changelists'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('repo_embedding_job_stats'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('repo_embedding_jobs'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('repo_kvps'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('repo_paths'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('repo_pending_permissions'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('repo_permissions'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('repo_statistics'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('role_permissions'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('roles'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('saved_searches'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('search_context_default'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('search_context_repos'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('search_context_stars'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('search_contexts'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('security_event_logs'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('settings'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('sub_repo_permissions'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('survey_responses'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('syntactic_scip_indexing_jobs'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('syntactic_scip_last_index_scan'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('team_members'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('teams'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('telemetry_events_export_queue'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('temporary_settings'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('user_credentials'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('user_emails'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('user_external_accounts'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('user_onboarding_tour'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('user_pending_permissions'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('user_permissions'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('user_public_repos'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('user_repo_permissions'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('user_roles'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('users'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('vulnerabilities'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('vulnerability_affected_packages'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('vulnerability_affected_symbols'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('vulnerability_matches'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('webhook_logs'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('webhooks'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('zoekt_repos'); COMMIT AND CHAIN;
DROP FUNCTION migrate_add_tenant_id_frontend(text);

View File

@ -1,3 +1,2 @@
name: Add tenant ID to most tables
noTransaction: true
parents: [1722961262]

View File

@ -1,6 +1,10 @@
-- This migration adds the tenant_id column in a way which doesn't require
-- updating every row. The value is null and an out of band migration will set
-- it to the default. A later migration will enforce tenant_id to be set.
--
-- We COMMIT AND CHAIN after each table is altered to prevent a single
-- transaction over all the alters. A single transaction would lead to a
-- deadlock with concurrent application queries.
-- Temporary function to deduplicate the logic required for each table:
CREATE OR REPLACE FUNCTION migrate_add_tenant_id_frontend(table_name text)
@ -10,183 +14,183 @@ BEGIN
END;
$$ LANGUAGE plpgsql;
SELECT migrate_add_tenant_id_frontend('access_requests');
SELECT migrate_add_tenant_id_frontend('access_tokens');
SELECT migrate_add_tenant_id_frontend('aggregated_user_statistics');
SELECT migrate_add_tenant_id_frontend('assigned_owners');
SELECT migrate_add_tenant_id_frontend('assigned_teams');
SELECT migrate_add_tenant_id_frontend('batch_changes');
SELECT migrate_add_tenant_id_frontend('batch_changes_site_credentials');
SELECT migrate_add_tenant_id_frontend('batch_spec_execution_cache_entries');
SELECT migrate_add_tenant_id_frontend('batch_spec_resolution_jobs');
SELECT migrate_add_tenant_id_frontend('batch_spec_workspace_execution_jobs');
SELECT migrate_add_tenant_id_frontend('batch_spec_workspace_execution_last_dequeues');
SELECT migrate_add_tenant_id_frontend('batch_spec_workspace_files');
SELECT migrate_add_tenant_id_frontend('batch_spec_workspaces');
SELECT migrate_add_tenant_id_frontend('batch_specs');
SELECT migrate_add_tenant_id_frontend('cached_available_indexers');
SELECT migrate_add_tenant_id_frontend('changeset_events');
SELECT migrate_add_tenant_id_frontend('changeset_jobs');
SELECT migrate_add_tenant_id_frontend('changeset_specs');
SELECT migrate_add_tenant_id_frontend('changesets');
SELECT migrate_add_tenant_id_frontend('cm_action_jobs');
SELECT migrate_add_tenant_id_frontend('cm_emails');
SELECT migrate_add_tenant_id_frontend('cm_last_searched');
SELECT migrate_add_tenant_id_frontend('cm_monitors');
SELECT migrate_add_tenant_id_frontend('cm_queries');
SELECT migrate_add_tenant_id_frontend('cm_recipients');
SELECT migrate_add_tenant_id_frontend('cm_slack_webhooks');
SELECT migrate_add_tenant_id_frontend('cm_trigger_jobs');
SELECT migrate_add_tenant_id_frontend('cm_webhooks');
SELECT migrate_add_tenant_id_frontend('code_hosts');
SELECT migrate_add_tenant_id_frontend('codeintel_autoindex_queue');
SELECT migrate_add_tenant_id_frontend('codeintel_autoindexing_exceptions');
SELECT migrate_add_tenant_id_frontend('codeintel_commit_dates');
SELECT migrate_add_tenant_id_frontend('codeintel_inference_scripts');
SELECT migrate_add_tenant_id_frontend('codeintel_initial_path_ranks');
SELECT migrate_add_tenant_id_frontend('codeintel_initial_path_ranks_processed');
SELECT migrate_add_tenant_id_frontend('codeintel_langugage_support_requests');
SELECT migrate_add_tenant_id_frontend('codeintel_path_ranks');
SELECT migrate_add_tenant_id_frontend('codeintel_ranking_definitions');
SELECT migrate_add_tenant_id_frontend('codeintel_ranking_exports');
SELECT migrate_add_tenant_id_frontend('codeintel_ranking_graph_keys');
SELECT migrate_add_tenant_id_frontend('codeintel_ranking_path_counts_inputs');
SELECT migrate_add_tenant_id_frontend('codeintel_ranking_progress');
SELECT migrate_add_tenant_id_frontend('codeintel_ranking_references');
SELECT migrate_add_tenant_id_frontend('codeintel_ranking_references_processed');
SELECT migrate_add_tenant_id_frontend('codeowners');
SELECT migrate_add_tenant_id_frontend('codeowners_individual_stats');
SELECT migrate_add_tenant_id_frontend('codeowners_owners');
SELECT migrate_add_tenant_id_frontend('commit_authors');
SELECT migrate_add_tenant_id_frontend('configuration_policies_audit_logs');
SELECT migrate_add_tenant_id_frontend('context_detection_embedding_jobs');
SELECT migrate_add_tenant_id_frontend('discussion_comments');
SELECT migrate_add_tenant_id_frontend('discussion_mail_reply_tokens');
SELECT migrate_add_tenant_id_frontend('discussion_threads');
SELECT migrate_add_tenant_id_frontend('discussion_threads_target_repo');
SELECT migrate_add_tenant_id_frontend('event_logs');
SELECT migrate_add_tenant_id_frontend('event_logs_export_allowlist');
SELECT migrate_add_tenant_id_frontend('event_logs_scrape_state');
SELECT migrate_add_tenant_id_frontend('event_logs_scrape_state_own');
SELECT migrate_add_tenant_id_frontend('executor_heartbeats');
SELECT migrate_add_tenant_id_frontend('executor_job_tokens');
SELECT migrate_add_tenant_id_frontend('executor_secret_access_logs');
SELECT migrate_add_tenant_id_frontend('executor_secrets');
SELECT migrate_add_tenant_id_frontend('exhaustive_search_jobs');
SELECT migrate_add_tenant_id_frontend('exhaustive_search_repo_jobs');
SELECT migrate_add_tenant_id_frontend('exhaustive_search_repo_revision_jobs');
SELECT migrate_add_tenant_id_frontend('explicit_permissions_bitbucket_projects_jobs');
SELECT migrate_add_tenant_id_frontend('external_service_repos');
SELECT migrate_add_tenant_id_frontend('external_service_sync_jobs');
SELECT migrate_add_tenant_id_frontend('external_services');
SELECT migrate_add_tenant_id_frontend('feature_flag_overrides');
SELECT migrate_add_tenant_id_frontend('feature_flags');
SELECT migrate_add_tenant_id_frontend('github_app_installs');
SELECT migrate_add_tenant_id_frontend('github_apps');
SELECT migrate_add_tenant_id_frontend('gitserver_relocator_jobs');
SELECT migrate_add_tenant_id_frontend('gitserver_repos');
SELECT migrate_add_tenant_id_frontend('gitserver_repos_statistics');
SELECT migrate_add_tenant_id_frontend('gitserver_repos_sync_output');
SELECT migrate_add_tenant_id_frontend('global_state');
SELECT migrate_add_tenant_id_frontend('insights_query_runner_jobs');
SELECT migrate_add_tenant_id_frontend('insights_query_runner_jobs_dependencies');
SELECT migrate_add_tenant_id_frontend('insights_settings_migration_jobs');
SELECT migrate_add_tenant_id_frontend('lsif_configuration_policies');
SELECT migrate_add_tenant_id_frontend('lsif_configuration_policies_repository_pattern_lookup');
SELECT migrate_add_tenant_id_frontend('lsif_dependency_indexing_jobs');
SELECT migrate_add_tenant_id_frontend('lsif_dependency_repos');
SELECT migrate_add_tenant_id_frontend('lsif_dependency_syncing_jobs');
SELECT migrate_add_tenant_id_frontend('lsif_dirty_repositories');
SELECT migrate_add_tenant_id_frontend('lsif_index_configuration');
SELECT migrate_add_tenant_id_frontend('lsif_indexes');
SELECT migrate_add_tenant_id_frontend('lsif_last_index_scan');
SELECT migrate_add_tenant_id_frontend('lsif_last_retention_scan');
SELECT migrate_add_tenant_id_frontend('lsif_nearest_uploads');
SELECT migrate_add_tenant_id_frontend('lsif_nearest_uploads_links');
SELECT migrate_add_tenant_id_frontend('lsif_packages');
SELECT migrate_add_tenant_id_frontend('lsif_references');
SELECT migrate_add_tenant_id_frontend('lsif_retention_configuration');
SELECT migrate_add_tenant_id_frontend('lsif_uploads');
SELECT migrate_add_tenant_id_frontend('lsif_uploads_audit_logs');
SELECT migrate_add_tenant_id_frontend('lsif_uploads_reference_counts');
SELECT migrate_add_tenant_id_frontend('lsif_uploads_visible_at_tip');
SELECT migrate_add_tenant_id_frontend('lsif_uploads_vulnerability_scan');
SELECT migrate_add_tenant_id_frontend('names');
SELECT migrate_add_tenant_id_frontend('namespace_permissions');
SELECT migrate_add_tenant_id_frontend('notebook_stars');
SELECT migrate_add_tenant_id_frontend('notebooks');
SELECT migrate_add_tenant_id_frontend('org_invitations');
SELECT migrate_add_tenant_id_frontend('org_members');
SELECT migrate_add_tenant_id_frontend('org_stats');
SELECT migrate_add_tenant_id_frontend('orgs');
SELECT migrate_add_tenant_id_frontend('orgs_open_beta_stats');
SELECT migrate_add_tenant_id_frontend('out_of_band_migrations');
SELECT migrate_add_tenant_id_frontend('out_of_band_migrations_errors');
SELECT migrate_add_tenant_id_frontend('outbound_webhook_event_types');
SELECT migrate_add_tenant_id_frontend('outbound_webhook_jobs');
SELECT migrate_add_tenant_id_frontend('outbound_webhook_logs');
SELECT migrate_add_tenant_id_frontend('outbound_webhooks');
SELECT migrate_add_tenant_id_frontend('own_aggregate_recent_contribution');
SELECT migrate_add_tenant_id_frontend('own_aggregate_recent_view');
SELECT migrate_add_tenant_id_frontend('own_background_jobs');
SELECT migrate_add_tenant_id_frontend('own_signal_configurations');
SELECT migrate_add_tenant_id_frontend('own_signal_recent_contribution');
SELECT migrate_add_tenant_id_frontend('ownership_path_stats');
SELECT migrate_add_tenant_id_frontend('package_repo_filters');
SELECT migrate_add_tenant_id_frontend('package_repo_versions');
SELECT migrate_add_tenant_id_frontend('permission_sync_jobs');
SELECT migrate_add_tenant_id_frontend('permissions');
SELECT migrate_add_tenant_id_frontend('phabricator_repos');
SELECT migrate_add_tenant_id_frontend('product_licenses');
SELECT migrate_add_tenant_id_frontend('product_subscriptions');
SELECT migrate_add_tenant_id_frontend('prompts');
SELECT migrate_add_tenant_id_frontend('query_runner_state');
SELECT migrate_add_tenant_id_frontend('redis_key_value');
SELECT migrate_add_tenant_id_frontend('registry_extension_releases');
SELECT migrate_add_tenant_id_frontend('registry_extensions');
SELECT migrate_add_tenant_id_frontend('repo');
SELECT migrate_add_tenant_id_frontend('repo_commits_changelists');
SELECT migrate_add_tenant_id_frontend('repo_embedding_job_stats');
SELECT migrate_add_tenant_id_frontend('repo_embedding_jobs');
SELECT migrate_add_tenant_id_frontend('repo_kvps');
SELECT migrate_add_tenant_id_frontend('repo_paths');
SELECT migrate_add_tenant_id_frontend('repo_pending_permissions');
SELECT migrate_add_tenant_id_frontend('repo_permissions');
SELECT migrate_add_tenant_id_frontend('repo_statistics');
SELECT migrate_add_tenant_id_frontend('role_permissions');
SELECT migrate_add_tenant_id_frontend('roles');
SELECT migrate_add_tenant_id_frontend('saved_searches');
SELECT migrate_add_tenant_id_frontend('search_context_default');
SELECT migrate_add_tenant_id_frontend('search_context_repos');
SELECT migrate_add_tenant_id_frontend('search_context_stars');
SELECT migrate_add_tenant_id_frontend('search_contexts');
SELECT migrate_add_tenant_id_frontend('security_event_logs');
SELECT migrate_add_tenant_id_frontend('settings');
SELECT migrate_add_tenant_id_frontend('sub_repo_permissions');
SELECT migrate_add_tenant_id_frontend('survey_responses');
SELECT migrate_add_tenant_id_frontend('syntactic_scip_indexing_jobs');
SELECT migrate_add_tenant_id_frontend('syntactic_scip_last_index_scan');
SELECT migrate_add_tenant_id_frontend('team_members');
SELECT migrate_add_tenant_id_frontend('teams');
SELECT migrate_add_tenant_id_frontend('telemetry_events_export_queue');
SELECT migrate_add_tenant_id_frontend('temporary_settings');
SELECT migrate_add_tenant_id_frontend('user_credentials');
SELECT migrate_add_tenant_id_frontend('user_emails');
SELECT migrate_add_tenant_id_frontend('user_external_accounts');
SELECT migrate_add_tenant_id_frontend('user_onboarding_tour');
SELECT migrate_add_tenant_id_frontend('user_pending_permissions');
SELECT migrate_add_tenant_id_frontend('user_permissions');
SELECT migrate_add_tenant_id_frontend('user_public_repos');
SELECT migrate_add_tenant_id_frontend('user_repo_permissions');
SELECT migrate_add_tenant_id_frontend('user_roles');
SELECT migrate_add_tenant_id_frontend('users');
SELECT migrate_add_tenant_id_frontend('vulnerabilities');
SELECT migrate_add_tenant_id_frontend('vulnerability_affected_packages');
SELECT migrate_add_tenant_id_frontend('vulnerability_affected_symbols');
SELECT migrate_add_tenant_id_frontend('vulnerability_matches');
SELECT migrate_add_tenant_id_frontend('webhook_logs');
SELECT migrate_add_tenant_id_frontend('webhooks');
SELECT migrate_add_tenant_id_frontend('zoekt_repos');
SELECT migrate_add_tenant_id_frontend('access_requests'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('access_tokens'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('aggregated_user_statistics'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('assigned_owners'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('assigned_teams'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('batch_changes'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('batch_changes_site_credentials'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('batch_spec_execution_cache_entries'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('batch_spec_resolution_jobs'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('batch_spec_workspace_execution_jobs'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('batch_spec_workspace_execution_last_dequeues'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('batch_spec_workspace_files'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('batch_spec_workspaces'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('batch_specs'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('cached_available_indexers'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('changeset_events'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('changeset_jobs'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('changeset_specs'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('changesets'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('cm_action_jobs'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('cm_emails'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('cm_last_searched'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('cm_monitors'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('cm_queries'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('cm_recipients'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('cm_slack_webhooks'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('cm_trigger_jobs'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('cm_webhooks'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('code_hosts'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('codeintel_autoindex_queue'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('codeintel_autoindexing_exceptions'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('codeintel_commit_dates'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('codeintel_inference_scripts'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('codeintel_initial_path_ranks'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('codeintel_initial_path_ranks_processed'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('codeintel_langugage_support_requests'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('codeintel_path_ranks'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('codeintel_ranking_definitions'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('codeintel_ranking_exports'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('codeintel_ranking_graph_keys'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('codeintel_ranking_path_counts_inputs'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('codeintel_ranking_progress'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('codeintel_ranking_references'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('codeintel_ranking_references_processed'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('codeowners'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('codeowners_individual_stats'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('codeowners_owners'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('commit_authors'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('configuration_policies_audit_logs'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('context_detection_embedding_jobs'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('discussion_comments'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('discussion_mail_reply_tokens'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('discussion_threads'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('discussion_threads_target_repo'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('event_logs'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('event_logs_export_allowlist'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('event_logs_scrape_state'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('event_logs_scrape_state_own'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('executor_heartbeats'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('executor_job_tokens'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('executor_secret_access_logs'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('executor_secrets'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('exhaustive_search_jobs'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('exhaustive_search_repo_jobs'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('exhaustive_search_repo_revision_jobs'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('explicit_permissions_bitbucket_projects_jobs'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('external_service_repos'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('external_service_sync_jobs'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('external_services'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('feature_flag_overrides'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('feature_flags'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('github_app_installs'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('github_apps'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('gitserver_relocator_jobs'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('gitserver_repos'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('gitserver_repos_statistics'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('gitserver_repos_sync_output'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('global_state'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('insights_query_runner_jobs'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('insights_query_runner_jobs_dependencies'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('insights_settings_migration_jobs'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('lsif_configuration_policies'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('lsif_configuration_policies_repository_pattern_lookup'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('lsif_dependency_indexing_jobs'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('lsif_dependency_repos'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('lsif_dependency_syncing_jobs'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('lsif_dirty_repositories'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('lsif_index_configuration'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('lsif_indexes'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('lsif_last_index_scan'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('lsif_last_retention_scan'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('lsif_nearest_uploads'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('lsif_nearest_uploads_links'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('lsif_packages'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('lsif_references'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('lsif_retention_configuration'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('lsif_uploads'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('lsif_uploads_audit_logs'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('lsif_uploads_reference_counts'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('lsif_uploads_visible_at_tip'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('lsif_uploads_vulnerability_scan'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('names'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('namespace_permissions'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('notebook_stars'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('notebooks'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('org_invitations'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('org_members'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('org_stats'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('orgs'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('orgs_open_beta_stats'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('out_of_band_migrations'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('out_of_band_migrations_errors'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('outbound_webhook_event_types'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('outbound_webhook_jobs'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('outbound_webhook_logs'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('outbound_webhooks'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('own_aggregate_recent_contribution'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('own_aggregate_recent_view'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('own_background_jobs'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('own_signal_configurations'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('own_signal_recent_contribution'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('ownership_path_stats'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('package_repo_filters'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('package_repo_versions'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('permission_sync_jobs'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('permissions'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('phabricator_repos'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('product_licenses'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('product_subscriptions'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('prompts'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('query_runner_state'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('redis_key_value'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('registry_extension_releases'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('registry_extensions'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('repo'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('repo_commits_changelists'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('repo_embedding_job_stats'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('repo_embedding_jobs'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('repo_kvps'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('repo_paths'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('repo_pending_permissions'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('repo_permissions'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('repo_statistics'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('role_permissions'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('roles'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('saved_searches'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('search_context_default'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('search_context_repos'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('search_context_stars'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('search_contexts'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('security_event_logs'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('settings'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('sub_repo_permissions'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('survey_responses'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('syntactic_scip_indexing_jobs'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('syntactic_scip_last_index_scan'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('team_members'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('teams'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('telemetry_events_export_queue'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('temporary_settings'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('user_credentials'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('user_emails'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('user_external_accounts'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('user_onboarding_tour'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('user_pending_permissions'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('user_permissions'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('user_public_repos'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('user_repo_permissions'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('user_roles'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('users'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('vulnerabilities'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('vulnerability_affected_packages'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('vulnerability_affected_symbols'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('vulnerability_matches'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('webhook_logs'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('webhooks'); COMMIT AND CHAIN;
SELECT migrate_add_tenant_id_frontend('zoekt_repos'); COMMIT AND CHAIN;
-- Explicitly excluded tables
-- critical_and_site_config :: for instance not tenant