From 81aeb4e392a9eb3aaf2c443e96846754001d8fa6 Mon Sep 17 00:00:00 2001 From: devin Date: Thu, 6 Aug 2026 17:02:29 +0000 Subject: [PATCH] feat(transform)!: drop transformVerifyCalls The pre-pass existed to rename schema names inside verify_*('schema.object') literals, keyed on a hand-maintained list of helper names -- a list that already omitted verify_security, so that call site never got renamed. Identity casts replaced those helpers: 'sch.tbl'::regclass and friends are routed by cast type (18.16.0), and the bare-schema case verify_schema needed the pre-pass for is now assert_schema('sch'::regnamespace). The kitchen-sink fixture is updated to the assertion form it replaces. --- .../__fixtures__/input/kitchen-sink.sql | 12 +++--- .../__fixtures__/output/kitchen-sink.sql | 12 +++--- .../transform/__tests__/transform.test.ts | 31 ++------------ packages/transform/package.json | 2 +- packages/transform/scripts/make-fixtures.ts | 3 +- packages/transform/src/index.ts | 1 - packages/transform/src/transform.ts | 40 ------------------- 7 files changed, 17 insertions(+), 84 deletions(-) diff --git a/packages/transform/__fixtures__/input/kitchen-sink.sql b/packages/transform/__fixtures__/input/kitchen-sink.sql index cf4e9c420..240aa5c46 100644 --- a/packages/transform/__fixtures__/input/kitchen-sink.sql +++ b/packages/transform/__fixtures__/input/kitchen-sink.sql @@ -284,12 +284,12 @@ ANALYZE "other-schema".audit_log; -- ============================================================================= -- 25. Verify function calls (string literal patterns) -- ============================================================================= -SELECT verify_schema('my-schema'); -SELECT verify_table('my-schema.users'); -SELECT verify_function('my-schema.get_user_by_id'); -SELECT verify_trigger('my-schema.trg_audit_insert'); -SELECT verify_type('my-schema.user_status_type'); -SELECT verify_domain('my-schema.positive_int'); +SELECT assert_schema('my-schema'::regnamespace); +SELECT assert_table('my-schema.users'::regclass); +SELECT assert_function('my-schema.get_user_by_id(uuid)'::regprocedure); +SELECT assert_trigger('my-schema.users'::regclass, 'trg_audit_insert', 'my-schema.tg_audit'::regproc, 5); +SELECT assert_type('my-schema.user_status_type'::regtype); +SELECT assert_domain('my-schema.positive_int'::regtype, 'int4'::regtype); -- ============================================================================= -- 26. JSON string values with schema names diff --git a/packages/transform/__fixtures__/output/kitchen-sink.sql b/packages/transform/__fixtures__/output/kitchen-sink.sql index 2e62f79db..db59bff0c 100644 --- a/packages/transform/__fixtures__/output/kitchen-sink.sql +++ b/packages/transform/__fixtures__/output/kitchen-sink.sql @@ -225,17 +225,17 @@ VACUUM my_schema.users; ANALYZE other_schema.audit_log; -SELECT verify_schema('my_schema'); +SELECT assert_schema(CAST('my_schema' AS regnamespace)); -SELECT verify_table('my_schema.users'); +SELECT assert_table(CAST('my_schema.users' AS regclass)); -SELECT verify_function('my_schema.get_user_by_id'); +SELECT assert_function(CAST('my_schema.get_user_by_id(uuid)' AS regprocedure)); -SELECT verify_trigger('my_schema.trg_audit_insert'); +SELECT assert_trigger(CAST('my_schema.users' AS regclass), 'trg_audit_insert', CAST('my_schema.tg_audit' AS regproc), 5); -SELECT verify_type('my_schema.user_status_type'); +SELECT assert_type(CAST('my_schema.user_status_type' AS regtype)); -SELECT verify_domain('my_schema.positive_int'); +SELECT assert_domain(CAST('my_schema.positive_int' AS regtype), CAST('int4' AS regtype)); SELECT '{"schema":"my_schema"}'::jsonb; diff --git a/packages/transform/__tests__/transform.test.ts b/packages/transform/__tests__/transform.test.ts index db2906aa2..31ffc64a3 100644 --- a/packages/transform/__tests__/transform.test.ts +++ b/packages/transform/__tests__/transform.test.ts @@ -16,7 +16,6 @@ import { transformSql, TransformSqlOptions, transformSqlStatement, - transformVerifyCalls, validateNoUntransformedSchemas, validateRoundTrip, } from '../src'; @@ -139,29 +138,6 @@ describe('transform_comments', () => { }); }); -describe('transform_verify_calls', () => { - it('transforms schema names inside verify_function calls', () => { - const content = "SELECT verify_function('my-schema.do_something');"; - const result = freshResult(); - const out = transformVerifyCalls(content, DEFAULT_MAPPING, result); - expect(out).toContain("verify_function('my_schema.do_something')"); - }); - - it('transforms verify_table, verify_trigger, etc.', () => { - const content = "SELECT verify_table('my-schema.users');"; - const result = freshResult(); - const out = transformVerifyCalls(content, DEFAULT_MAPPING, result); - expect(out).toContain("verify_table('my_schema.users')"); - }); - - it('transforms verify_schema with just the schema name', () => { - const content = "SELECT verify_schema('my-schema');"; - const result = freshResult(); - const out = transformVerifyCalls(content, DEFAULT_MAPPING, result); - expect(out).toContain("verify_schema('my_schema')"); - }); -}); - describe('transform_json_string_values', () => { it('transforms schema names in JSON value contexts', () => { const content = `'{"authenticate_schema":"my-schema"}'`; @@ -753,7 +729,6 @@ describe('transform_sql (full pipeline)', () => { ].join('\n'); const opts: TransformSqlOptions = { - prePasses: [transformVerifyCalls], }; const { content } = transformSql(input, DEFAULT_MAPPING, opts); expect(content).toContain("verify_table('my_schema.users')"); @@ -817,7 +792,7 @@ describe('transform_sql (full pipeline)', () => { ].join('\n'); const opts: TransformSqlOptions = { - prePasses: [transformVerifyCalls, transformJsonStringValues], + prePasses: [transformJsonStringValues], }; const { content } = transformSql(input, DEFAULT_MAPPING, opts); expect(content).toContain("verify_table('my_schema.config')"); @@ -883,7 +858,7 @@ const FIXTURE_FILES = fs describe.each(FIXTURE_FILES)('fixture: %s', (file) => { const FIXTURE_OPTS: TransformSqlOptions = { - prePasses: [transformVerifyCalls, transformJsonStringValues], + prePasses: [transformJsonStringValues], }; const input = fs.readFileSync(path.join(FIXTURE_INPUT_DIR, file), 'utf8'); @@ -941,7 +916,7 @@ describe('kitchen-sink fixture', () => { 'utf8' ); const { result } = transformSql(input, DEFAULT_MAPPING, { - prePasses: [transformVerifyCalls, transformJsonStringValues], + prePasses: [transformJsonStringValues], }); expect(result.schemasFound).toContain('my-schema'); expect(result.schemasFound).toContain('other-schema'); diff --git a/packages/transform/package.json b/packages/transform/package.json index 52e18fe3a..1687f2d00 100644 --- a/packages/transform/package.json +++ b/packages/transform/package.json @@ -1,6 +1,6 @@ { "name": "@pgsql/transform", - "version": "18.16.0", + "version": "18.17.0", "author": "Constructive ", "description": "AST-based SQL transformation, qualification, classification and closure analysis for PostgreSQL", "main": "index.js", diff --git a/packages/transform/scripts/make-fixtures.ts b/packages/transform/scripts/make-fixtures.ts index d92e605d0..499a2c932 100644 --- a/packages/transform/scripts/make-fixtures.ts +++ b/packages/transform/scripts/make-fixtures.ts @@ -19,7 +19,6 @@ import { transformJsonStringValues, transformSql, TransformSqlOptions, - transformVerifyCalls, } from '../src'; const FIXTURES_DIR = path.resolve(__dirname, '..', '__fixtures__'); @@ -35,7 +34,7 @@ async function main() { await loadModule(); const opts: TransformSqlOptions = { - prePasses: [transformVerifyCalls, transformJsonStringValues], + prePasses: [transformJsonStringValues], }; for (const file of fs.readdirSync(INPUT_DIR)) { diff --git a/packages/transform/src/index.ts b/packages/transform/src/index.ts index 1b80cadec..f28a5ed09 100644 --- a/packages/transform/src/index.ts +++ b/packages/transform/src/index.ts @@ -108,7 +108,6 @@ export { transformSchemaName, transformSql, transformSqlStatement, - transformVerifyCalls, validateNoUntransformedSchemas, walkPlpgsqlForSchemas, } from './transform'; diff --git a/packages/transform/src/transform.ts b/packages/transform/src/transform.ts index f0051a634..8a0d2748f 100644 --- a/packages/transform/src/transform.ts +++ b/packages/transform/src/transform.ts @@ -1315,46 +1315,6 @@ export function transformComments( }); } -/** - * Transform verify function calls that use string literals. - * These are inside SQL strings and not part of the main AST. - */ -export function transformVerifyCalls( - content: string, - schemaMapping: Map, - result: SchemaTransformResult -): string { - const schemas = Array.from(schemaMapping.keys()).sort((a, b) => b.length - a.length); - - let newContent = content; - // The pattern needs the schema name spelled out, case-insensitively. - let lowerContent = content.toLowerCase(); - - for (const schema of schemas) { - const newName = schemaMapping.get(schema); - if (!newName) continue; - if (!lowerContent.includes(schema.toLowerCase())) continue; - - const escapedSchema = cachedEscapeRegexp(schema); - - const verifyPattern = cachedRegExp( - `(verify_(?:function|table|trigger|type|domain|view|index|constraint|schema|policy|table_grant|function_grant|sequence_grant|type_grant)\\s*\\(\\s*')${escapedSchema}(\\.|'\\s*\\))`, - 'gi' - ); - - const before = newContent; - newContent = newContent.replace(verifyPattern, `$1${newName}$2`); - - if (newContent !== before) { - lowerContent = newContent.toLowerCase(); - result.schemasFound.add(schema); - result.schemasTransformed.set(schema, newName); - } - } - - return newContent; -} - /** * Transform schema names inside JSON/JSONB string values. */