diff --git a/packages/transform/src/transformers/v15-to-v16.ts b/packages/transform/src/transformers/v15-to-v16.ts index e7ac6a7f..722d07a0 100644 --- a/packages/transform/src/transformers/v15-to-v16.ts +++ b/packages/transform/src/transformers/v15-to-v16.ts @@ -411,7 +411,7 @@ export class V15ToV16Transformer { return { BoolExpr: result }; } - FuncCall(node: PG15.FuncCall, context: TransformerContext): { FuncCall: PG16.FuncCall } { + FuncCall(node: PG15.FuncCall, context: TransformerContext): { FuncCall: PG16.FuncCall } | { ColumnRef: PG16.ColumnRef } { const result: any = {}; if (node.funcname !== undefined) { @@ -423,6 +423,17 @@ export class V15ToV16Transformer { }, { String: { sval: 'json_object' } } ]; + } else if (node.funcname.length === 2 && + (node.funcname[0] as any)?.String?.sval === 'pg_catalog' && + (node.funcname[1] as any)?.String?.sval === 'system_user' && + node.funcformat === 'COERCE_SQL_SYNTAX') { + return { + ColumnRef: { + fields: [ + { String: { sval: 'system_user' } } + ] + } + }; } else { result.funcname = Array.isArray(node.funcname) ? node.funcname.map((item: any) => this.transform(item as any, context)) @@ -550,7 +561,22 @@ export class V15ToV16Transformer { return { A_Const: result }; } - ColumnRef(node: PG15.ColumnRef, context: TransformerContext): { ColumnRef: PG16.ColumnRef } { + ColumnRef(node: PG15.ColumnRef, context: TransformerContext): { ColumnRef: PG16.ColumnRef } | { FuncCall: PG16.FuncCall } { + if (node.fields && Array.isArray(node.fields) && node.fields.length === 1) { + const field = node.fields[0]; + if ((field as any)?.String?.sval === 'system_user') { + return { + FuncCall: { + funcname: [ + { String: { sval: 'pg_catalog' } }, + { String: { sval: 'system_user' } } + ], + funcformat: 'COERCE_SQL_SYNTAX' + } + }; + } + } + const result: any = {}; if (node.fields !== undefined) { @@ -630,7 +656,32 @@ export class V15ToV16Transformer { return { Alias: result }; } - RangeVar(node: PG15.RangeVar, context: TransformerContext): { RangeVar: PG16.RangeVar } { + RangeVar(node: PG15.RangeVar, context: TransformerContext): { RangeVar: PG16.RangeVar } | { RangeFunction: PG16.RangeFunction } { + if (node.relname === 'system_user' && node.inh === true && node.relpersistence === 'p') { + return { + RangeFunction: { + functions: [ + { + List: { + items: [ + { + FuncCall: { + funcname: [ + { String: { sval: 'pg_catalog' } }, + { String: { sval: 'system_user' } } + ], + funcformat: 'COERCE_SQL_SYNTAX' + } + }, + {} as any + ] + } + } + ] + } + }; + } + const result: any = {}; if (node.catalogname !== undefined) { @@ -908,7 +959,13 @@ export class V15ToV16Transformer { if (node.items !== undefined) { result.items = Array.isArray(node.items) - ? node.items.map((item: any) => this.transform(item as any, context)) + ? node.items.map((item: any) => { + const transformed = this.transform(item as any, context); + if (transformed === null) { + return {}; + } + return transformed; + }) : this.transform(node.items as any, context); } diff --git a/packages/transform/test-utils/skip-tests/transformer-errors.ts b/packages/transform/test-utils/skip-tests/transformer-errors.ts index 40082b8c..4b6ff8bc 100644 --- a/packages/transform/test-utils/skip-tests/transformer-errors.ts +++ b/packages/transform/test-utils/skip-tests/transformer-errors.ts @@ -9,16 +9,8 @@ export const transformerErrors: SkipTest[] = [ [16, 17, "latest/postgres/create_am-106.sql", "16-17 transformer fails with 'syntax error at or near 'DEFAULT'"], [15, 16, "original/upstream/json-102.sql", "15-16 transformer fails with function name transformation - adds pg_catalog schema qualification"], - [15, 16, "latest/postgres/create_view-281.sql", "15-16 transformer fails with AST transformation mismatch"], - - // [15, 16, "latest/postgres/create_index-85.sql", "15-16 transformer fails with missing nulls_not_distinct property"], - // [15, 16, "latest/postgres/create_index-83.sql", "15-16 transformer fails with missing nulls_not_distinct property"], - // [15, 16, "latest/postgres/create_index-72.sql", "15-16 transformer fails with missing nulls_not_distinct property"], [15, 16, "latest/postgres/create_index-326.sql", "15-16 transformer fails with syntax error at end of input"], - // [15, 16, "latest/postgres/create_index-184.sql", "15-16 transformer fails with missing nulls_not_distinct property"], - - // [14, 15, "latest/postgres/create_index-345.sql", "AST transformation mismatch (extra \"num\": 1 field)"], [13, 14, "original/upstream/rangetypes-300.sql", "AST transformer bug - converts FUNC_PARAM_DEFAULT to FUNC_PARAM_IN for function parameters"], [13, 14, "original/upstream/rangetypes-294.sql", "AST transformer bug - converts FUNC_PARAM_DEFAULT to FUNC_PARAM_IN for function parameters"], @@ -89,4 +81,4 @@ export const transformerErrors: SkipTest[] = [ [13, 14, "latest/postgres/create_function_sql-91.sql", "AST transformer bug - converts FUNC_PARAM_DEFAULT to FUNC_PARAM_IN in CREATE FUNCTION statements with default parameter values"], [13, 14, "latest/postgres/create_function_sql-90.sql", "AST transformer bug - converts FUNC_PARAM_DEFAULT to FUNC_PARAM_IN in CREATE FUNCTION statements with default parameter values"], [13, 14, "latest/postgres/create_function_sql-115.sql", "AST transformer bug - incorrectly adds parameter names to objfuncargs in DROP FUNCTION statements"], -]; \ No newline at end of file +]; \ No newline at end of file