From 93e7824de2cce0ed525146e85b9f25f09a70ef90 Mon Sep 17 00:00:00 2001 From: Tomas Valenta <49156497+ValentaTomas@users.noreply.github.com> Date: Sun, 26 Jul 2026 21:03:33 -0700 Subject: [PATCH] db: drop duplicate access_tokens hash index --- ...rop_duplicate_access_tokens_hash_index.sql | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 packages/db/migrations/20260727041400_drop_duplicate_access_tokens_hash_index.sql diff --git a/packages/db/migrations/20260727041400_drop_duplicate_access_tokens_hash_index.sql b/packages/db/migrations/20260727041400_drop_duplicate_access_tokens_hash_index.sql new file mode 100644 index 0000000000..a44ada468b --- /dev/null +++ b/packages/db/migrations/20260727041400_drop_duplicate_access_tokens_hash_index.sql @@ -0,0 +1,33 @@ +-- +goose Up +-- +goose NO TRANSACTION + +-- DROP waits on in-flight lock holders rather than building anything; bound +-- it so it neither hangs unbounded nor dies to a short session default. +SET statement_timeout = '1h'; + +-- Two unique indexes cover the same key column: the UNIQUE constraint's own +-- index (access_tokens_access_token_hash_key) and this standalone unique +-- copy. Identical indexes are interchangeable to the planner, so lookups +-- continue on the constraint's index, uniqueness enforcement is untouched, +-- and every token write stops paying for the second copy. The standalone +-- one is the droppable twin (the constraint-backed index cannot be dropped +-- by DROP INDEX, which makes this fail-loud safe). +DROP INDEX CONCURRENTLY IF EXISTS public.idx_access_tokens_access_token_hash; + +-- The migrator session is reused for subsequent migrations: restore its +-- baseline (scripts/migrator.go sets 3h per connection). +SET statement_timeout = '3h'; + +-- +goose Down +-- +goose NO TRANSACTION + +SET statement_timeout = '1h'; + +-- An interrupted CONCURRENTLY build leaves an INVALID index that IF NOT +-- EXISTS would then skip forever — clear any leftover before rebuilding. +DROP INDEX CONCURRENTLY IF EXISTS public.idx_access_tokens_access_token_hash; + +CREATE UNIQUE INDEX CONCURRENTLY IF NOT EXISTS idx_access_tokens_access_token_hash + ON public.access_tokens (access_token_hash); + +SET statement_timeout = '3h';