From e3d36f64576f7161181e3ae3de97ae076585889a Mon Sep 17 00:00:00 2001 From: Tomasz Kopacki Date: Wed, 8 Apr 2026 19:29:16 +0200 Subject: [PATCH 1/5] Enable `pg_trgm` extension for ENSDb --- .../migrations/0001_enable_ext_pg_trgm.sql | 3 + .../migrations/meta/0001_snapshot.json | 55 +++++++++++++++++++ 2 files changed, 58 insertions(+) create mode 100644 packages/ensdb-sdk/migrations/0001_enable_ext_pg_trgm.sql create mode 100644 packages/ensdb-sdk/migrations/meta/0001_snapshot.json diff --git a/packages/ensdb-sdk/migrations/0001_enable_ext_pg_trgm.sql b/packages/ensdb-sdk/migrations/0001_enable_ext_pg_trgm.sql new file mode 100644 index 0000000000..52861e389d --- /dev/null +++ b/packages/ensdb-sdk/migrations/0001_enable_ext_pg_trgm.sql @@ -0,0 +1,3 @@ +-- This migration enables the pg_trgm extension, which is used for +-- trigram-based indexing and searching in PostgreSQL. +CREATE EXTENSION IF NOT EXISTS pg_trgm; diff --git a/packages/ensdb-sdk/migrations/meta/0001_snapshot.json b/packages/ensdb-sdk/migrations/meta/0001_snapshot.json new file mode 100644 index 0000000000..335e0426c2 --- /dev/null +++ b/packages/ensdb-sdk/migrations/meta/0001_snapshot.json @@ -0,0 +1,55 @@ +{ + "id": "899ad861-685e-4639-8f31-cf4130b730e6", + "prevId": "d661dcae-f64d-4ecd-a4da-3d5783e17e2c", + "version": "7", + "dialect": "postgresql", + "tables": { + "ensnode.metadata": { + "name": "metadata", + "schema": "ensnode", + "columns": { + "ens_indexer_schema_name": { + "name": "ens_indexer_schema_name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "key": { + "name": "key", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "value": { + "name": "value", + "type": "jsonb", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "metadata_pkey": { + "name": "metadata_pkey", + "columns": ["ens_indexer_schema_name", "key"] + } + }, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + } + }, + "enums": {}, + "schemas": {}, + "views": {}, + "sequences": {}, + "roles": {}, + "policies": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} From 3fb6448835891d5aaedb93b8d1ad2cff2ce98646 Mon Sep 17 00:00:00 2001 From: Tomasz Kopacki Date: Wed, 8 Apr 2026 19:31:36 +0200 Subject: [PATCH 2/5] Manage orphaned ENSNode Metadata records Clean up records referencing the schema being deleted. --- .../0002_manage_orphaned_ensnode_metadata.sql | 43 +++++++++++++++ .../migrations/meta/0002_snapshot.json | 55 +++++++++++++++++++ 2 files changed, 98 insertions(+) create mode 100644 packages/ensdb-sdk/migrations/0002_manage_orphaned_ensnode_metadata.sql create mode 100644 packages/ensdb-sdk/migrations/meta/0002_snapshot.json diff --git a/packages/ensdb-sdk/migrations/0002_manage_orphaned_ensnode_metadata.sql b/packages/ensdb-sdk/migrations/0002_manage_orphaned_ensnode_metadata.sql new file mode 100644 index 0000000000..392c5aacdc --- /dev/null +++ b/packages/ensdb-sdk/migrations/0002_manage_orphaned_ensnode_metadata.sql @@ -0,0 +1,43 @@ +-- This migration adds an event trigger to handle cleanup of orphaned records +-- in the `ensnode.metadata` table when an ENSIndexer Schema is dropped. +-- Note: Running this migration requires superuser privileges due to +-- the use of event triggers. + +CREATE OR REPLACE FUNCTION "ensnode"."handle_schema_dropped"() +RETURNS event_trigger +AS $$ +DECLARE + obj RECORD; +BEGIN + FOR obj IN + SELECT * + FROM pg_event_trigger_dropped_objects() + LOOP + IF obj.object_type = 'schema' + AND obj.object_name <> 'ensnode' + AND to_regclass('"ensnode"."metadata"') IS NOT NULL THEN + + DELETE FROM "ensnode"."metadata" + WHERE "ens_indexer_schema_name" = obj.object_name; + + END IF; + END LOOP; +END; +$$ LANGUAGE plpgsql; + + +DO $$ +BEGIN + CREATE EVENT TRIGGER cleanup_ensnode_metadata_on_schema_drop + ON sql_drop + WHEN TAG IN ('DROP SCHEMA') + EXECUTE FUNCTION "ensnode"."handle_schema_dropped"(); + +EXCEPTION + WHEN insufficient_privilege THEN + -- Event trigger creation requires superuser privileges. + -- This is expected in managed PostgreSQL environments. + RAISE NOTICE + 'Event trigger "cleanup_ensnode_metadata_on_schema_drop" could not be created due to insufficient privileges. This feature requires superuser access.'; +END; +$$; diff --git a/packages/ensdb-sdk/migrations/meta/0002_snapshot.json b/packages/ensdb-sdk/migrations/meta/0002_snapshot.json new file mode 100644 index 0000000000..df3968a388 --- /dev/null +++ b/packages/ensdb-sdk/migrations/meta/0002_snapshot.json @@ -0,0 +1,55 @@ +{ + "id": "1403ee88-a1d3-4192-a73c-f99b034c97b2", + "prevId": "899ad861-685e-4639-8f31-cf4130b730e6", + "version": "7", + "dialect": "postgresql", + "tables": { + "ensnode.metadata": { + "name": "metadata", + "schema": "ensnode", + "columns": { + "ens_indexer_schema_name": { + "name": "ens_indexer_schema_name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "key": { + "name": "key", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "value": { + "name": "value", + "type": "jsonb", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "metadata_pkey": { + "name": "metadata_pkey", + "columns": ["ens_indexer_schema_name", "key"] + } + }, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + } + }, + "enums": {}, + "schemas": {}, + "views": {}, + "sequences": {}, + "roles": {}, + "policies": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} From ffca2249ab28a468b8f4cc97fc07491362c410db Mon Sep 17 00:00:00 2001 From: Tomasz Kopacki Date: Wed, 8 Apr 2026 19:32:05 +0200 Subject: [PATCH 3/5] Update migrations journal file --- packages/ensdb-sdk/migrations/meta/_journal.json | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/packages/ensdb-sdk/migrations/meta/_journal.json b/packages/ensdb-sdk/migrations/meta/_journal.json index 46d9e212a3..ed5a9dfa67 100644 --- a/packages/ensdb-sdk/migrations/meta/_journal.json +++ b/packages/ensdb-sdk/migrations/meta/_journal.json @@ -8,6 +8,20 @@ "when": 1773743108514, "tag": "0000_cultured_captain_cross", "breakpoints": true + }, + { + "idx": 1, + "version": "7", + "when": 1775668778695, + "tag": "0001_enable_ext_pg_trgm", + "breakpoints": true + }, + { + "idx": 2, + "version": "7", + "when": 1775668818089, + "tag": "0002_manage_orphaned_ensnode_metadata", + "breakpoints": true } ] } From ad6c042b901955f1f0fca9b6d7ac9631dd0d46d8 Mon Sep 17 00:00:00 2001 From: Tomasz Kopacki Date: Wed, 8 Apr 2026 19:48:16 +0200 Subject: [PATCH 4/5] docs(changeset): Added `enable_ext_pg_trgm` migration. --- .changeset/metal-donkeys-bake.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/metal-donkeys-bake.md diff --git a/.changeset/metal-donkeys-bake.md b/.changeset/metal-donkeys-bake.md new file mode 100644 index 0000000000..00aafb76b1 --- /dev/null +++ b/.changeset/metal-donkeys-bake.md @@ -0,0 +1,5 @@ +--- +"@ensnode/ensdb-sdk": minor +--- + +Added `enable_ext_pg_trgm` migration. From 8c77000863f8d92e5f1b3117cc24220ea87f16f2 Mon Sep 17 00:00:00 2001 From: Tomasz Kopacki Date: Wed, 8 Apr 2026 19:48:31 +0200 Subject: [PATCH 5/5] docs(changeset): Added `manage_orphaned_ensnode_metadata` migration. --- .changeset/six-garlics-wish.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/six-garlics-wish.md diff --git a/.changeset/six-garlics-wish.md b/.changeset/six-garlics-wish.md new file mode 100644 index 0000000000..bdffa32558 --- /dev/null +++ b/.changeset/six-garlics-wish.md @@ -0,0 +1,5 @@ +--- +"@ensnode/ensdb-sdk": minor +--- + +Added `manage_orphaned_ensnode_metadata` migration.