@@ -782,7 +782,8 @@ export class V13ToV14Transformer {
782782 // Check if this is an operator by looking at the objname
783783 const isOperator = this . isOperatorName ( result . name . objname ) ;
784784
785- if ( ! isOperator ) {
785+ // Don't create objfuncargs in CreateTransformStmt contexts
786+ if ( ! isOperator && ! context . parentNodeTypes ?. includes ( 'CreateTransformStmt' ) ) {
786787 result . name . objfuncargs = Array . isArray ( result . name . objargs )
787788 ? result . name . objargs . map ( ( arg : any , index : number ) => this . createFunctionParameterFromTypeName ( arg , context , index ) )
788789 : [ this . createFunctionParameterFromTypeName ( result . name . objargs , context , 0 ) ] ;
@@ -1037,32 +1038,47 @@ export class V13ToV14Transformer {
10371038
10381039
10391040
1041+ private getFunctionNameFromContext ( context : TransformerContext ) : string | null {
1042+ if ( context . nodeStack ) {
1043+ for ( let i = context . nodeStack . length - 1 ; i >= 0 ; i -- ) {
1044+ const node = context . nodeStack [ i ] ;
1045+ if ( node && typeof node === 'object' ) {
1046+ if ( 'ObjectWithArgs' in node ) {
1047+ const objWithArgs = node . ObjectWithArgs ;
1048+ if ( objWithArgs . objname && Array . isArray ( objWithArgs . objname ) ) {
1049+ const lastName = objWithArgs . objname [ objWithArgs . objname . length - 1 ] ;
1050+ if ( lastName && lastName . String && lastName . String . str ) {
1051+ return lastName . String . str ;
1052+ }
1053+ }
1054+ }
1055+ }
1056+ }
1057+ }
1058+ return null ;
1059+ }
1060+
10401061 private isVariadicParameterType ( argType : any , index ?: number , allArgs ?: any [ ] , context ?: TransformerContext ) : boolean {
10411062 if ( ! argType ) return false ;
10421063
10431064 // Handle TypeName wrapper
10441065 const typeNode = argType . TypeName || argType ;
10451066
10461067 if ( typeNode . names && Array . isArray ( typeNode . names ) ) {
1047- // Check if any name in the chain contains "variadic"
1048- for ( const nameNode of typeNode . names ) {
1049- if ( nameNode && nameNode . String && nameNode . String . str ) {
1050- const typeStr = nameNode . String . str . toLowerCase ( ) ;
1051- if ( typeStr === 'variadic' ) {
1052- return true ;
1053- }
1054- }
1068+ const typeName = typeNode . names [ typeNode . names . length - 1 ] ?. String ?. str ;
1069+
1070+ if ( context && context . parentNodeTypes ?. includes ( 'DropStmt' ) ) {
1071+ return false ;
10551072 }
10561073
1057- const typeName = typeNode . names [ typeNode . names . length - 1 ] ?. String ?. str ;
1074+ if ( typeName === 'anyarray' || typeName === 'variadic' ) {
1075+ return true ;
1076+ }
10581077
10591078 // In RenameStmt context for aggregates, "any" type should be treated as variadic
1060- if ( context && context . parentNodeTypes ?. includes ( 'RenameStmt' ) &&
1061- ! context . parentNodeTypes ?. includes ( 'DropStmt' ) && typeName === 'any' ) {
1079+ if ( context && context . parentNodeTypes ?. includes ( 'RenameStmt' ) && typeName === 'any' ) {
10621080 return true ;
10631081 }
1064-
1065-
10661082 }
10671083
10681084 return false ;
@@ -1090,22 +1106,12 @@ export class V13ToV14Transformer {
10901106 }
10911107
10921108 if ( node . mode !== undefined ) {
1093- const isInRenameContext = context . parentNodeTypes ?. includes ( 'RenameStmt' ) ;
10941109 const isInDropContext = context . parentNodeTypes ?. includes ( 'DropStmt' ) ;
1095- const isInCommentContext = context . parentNodeTypes ?. includes ( 'CommentStmt' ) ;
1096-
1097- if ( isInRenameContext || isInCommentContext ) {
1098- result . mode = node . mode ; // Preserve original mode
1099- } else if ( isInDropContext ) {
1100- if ( node . mode === "FUNC_PARAM_VARIADIC" ) {
1101- result . mode = node . mode ; // Preserve variadic mode
1102- } else if ( node . mode === "FUNC_PARAM_IN" ) {
1103- result . mode = "FUNC_PARAM_DEFAULT" ; // Map IN to DEFAULT in PG14
1104- } else {
1105- result . mode = node . mode ; // Preserve other modes
1106- }
1107- } else if ( node . mode === "FUNC_PARAM_IN" ) {
1108- result . mode = "FUNC_PARAM_DEFAULT" ; // Map IN to DEFAULT in PG14
1110+
1111+ if ( node . mode === "FUNC_PARAM_IN" ) {
1112+ result . mode = "FUNC_PARAM_DEFAULT" ;
1113+ } else if ( isInDropContext && node . mode === "FUNC_PARAM_VARIADIC" ) {
1114+ result . mode = "FUNC_PARAM_DEFAULT" ;
11091115 } else {
11101116 result . mode = node . mode ; // Preserve all other modes unchanged
11111117 }
@@ -1139,10 +1145,12 @@ export class V13ToV14Transformer {
11391145 if ( ( node . func as any ) . objargs !== undefined ) {
11401146 funcResult . objargs = this . transform ( ( node . func as any ) . objargs , childContext ) ;
11411147
1142- // Create objfuncargs from objargs for PG14
1143- funcResult . objfuncargs = Array . isArray ( ( node . func as any ) . objargs )
1144- ? ( node . func as any ) . objargs . map ( ( arg : any , index : number ) => this . createFunctionParameterFromTypeName ( arg , childContext , index ) )
1145- : [ this . createFunctionParameterFromTypeName ( ( node . func as any ) . objargs , childContext , 0 ) ] ;
1148+ // Create objfuncargs from objargs for PG14, but not in CreateTransformStmt contexts
1149+ if ( ! childContext . parentNodeTypes ?. includes ( 'CreateTransformStmt' ) ) {
1150+ funcResult . objfuncargs = Array . isArray ( ( node . func as any ) . objargs )
1151+ ? ( node . func as any ) . objargs . map ( ( arg : any , index : number ) => this . createFunctionParameterFromTypeName ( arg , childContext , index ) )
1152+ : [ this . createFunctionParameterFromTypeName ( ( node . func as any ) . objargs , childContext , 0 ) ] ;
1153+ }
11461154 }
11471155
11481156 result . func = funcResult ;
@@ -1777,6 +1785,38 @@ export class V13ToV14Transformer {
17771785 return { CreateCastStmt : result } ;
17781786 }
17791787
1788+ CreateTransformStmt ( node : PG13 . CreateTransformStmt , context : TransformerContext ) : any {
1789+ const result : any = { } ;
1790+
1791+ const childContext : TransformerContext = {
1792+ ...context ,
1793+ parentNodeTypes : [ ...( context . parentNodeTypes || [ ] ) , 'CreateTransformStmt' ]
1794+ } ;
1795+
1796+
1797+ if ( node . type_name !== undefined ) {
1798+ result . type_name = this . transform ( node . type_name as any , childContext ) ;
1799+ }
1800+
1801+ if ( node . lang !== undefined ) {
1802+ result . lang = node . lang ;
1803+ }
1804+
1805+ if ( node . fromsql !== undefined ) {
1806+ result . fromsql = this . transform ( node . fromsql as any , childContext ) ;
1807+ }
1808+
1809+ if ( node . tosql !== undefined ) {
1810+ result . tosql = this . transform ( node . tosql as any , childContext ) ;
1811+ }
1812+
1813+ if ( node . replace !== undefined ) {
1814+ result . replace = node . replace ;
1815+ }
1816+
1817+ return { CreateTransformStmt : result } ;
1818+ }
1819+
17801820 CreateFunctionStmt ( node : PG13 . CreateFunctionStmt , context : TransformerContext ) : any {
17811821 const result : any = { ...node } ;
17821822
@@ -1885,29 +1925,57 @@ export class V13ToV14Transformer {
18851925 : [ this . transform ( result . objargs , context ) ] ;
18861926 }
18871927
1928+ // Never create or preserve objfuncargs in CreateTransformStmt contexts
1929+ if ( context . parentNodeTypes ?. includes ( 'CreateTransformStmt' ) ) {
1930+ if ( result . objfuncargs !== undefined ) {
1931+ delete result . objfuncargs ;
1932+ }
1933+ return { ObjectWithArgs : result } ;
1934+ }
1935+
18881936 // Handle objfuncargs based on context
18891937 const shouldCreateObjfuncargs = this . shouldCreateObjfuncargs ( context ) ;
18901938 const shouldPreserveObjfuncargs = this . shouldPreserveObjfuncargs ( context ) ;
18911939 const shouldCreateObjfuncargsFromObjargs = this . shouldCreateObjfuncargsFromObjargs ( context ) ;
1940+
18921941
18931942
18941943 if ( shouldCreateObjfuncargsFromObjargs && result . objargs ) {
18951944 // Create objfuncargs from objargs, with smart parameter mode handling
18961945 const originalObjfuncargs = ( node as any ) . objfuncargs ;
18971946 if ( originalObjfuncargs && Array . isArray ( originalObjfuncargs ) ) {
1898- result . objfuncargs = originalObjfuncargs . map ( ( item : any ) => {
1899- return this . transform ( item , context ) ;
1900- } ) ;
1947+ if ( ! context . parentNodeTypes ?. includes ( 'CreateTransformStmt' ) ) {
1948+ result . objfuncargs = originalObjfuncargs . map ( ( item : any ) => {
1949+ return this . transform ( item , context ) ;
1950+ } ) ;
1951+ }
19011952 } else {
1902- result . objfuncargs = Array . isArray ( result . objargs )
1903- ? result . objargs . map ( ( arg : any , index : number ) => {
1904-
1905- const transformedArgType = this . visit ( arg , context ) ;
1906- const isVariadic = this . isVariadicParameterType ( arg , index , result . objargs , context ) ;
1953+ // Don't create objfuncargs in CreateTransformStmt contexts
1954+ if ( ! context . parentNodeTypes ?. includes ( 'CreateTransformStmt' ) ) {
1955+ result . objfuncargs = Array . isArray ( result . objargs )
1956+ ? result . objargs . map ( ( arg : any , index : number ) => {
1957+
1958+ const transformedArgType = this . visit ( arg , context ) ;
1959+
1960+ // Check if there's an existing objfuncargs with original mode information
1961+ let mode = 'FUNC_PARAM_DEFAULT' ;
1962+ if ( originalObjfuncargs && Array . isArray ( originalObjfuncargs ) && originalObjfuncargs [ index ] ) {
1963+ const originalParam = originalObjfuncargs [ index ] ;
1964+ if ( originalParam && originalParam . FunctionParameter && originalParam . FunctionParameter . mode ) {
1965+ mode = this . mapFunctionParameterMode ( originalParam . FunctionParameter . mode ) ;
1966+ } else {
1967+ const isVariadic = this . isVariadicParameterType ( arg , index , result . objargs , context ) ;
1968+ mode = isVariadic ? 'FUNC_PARAM_VARIADIC' : 'FUNC_PARAM_DEFAULT' ;
1969+ }
1970+ } else {
1971+ const isVariadic = this . isVariadicParameterType ( arg , index , result . objargs , context ) ;
1972+ mode = isVariadic ? 'FUNC_PARAM_VARIADIC' : 'FUNC_PARAM_DEFAULT' ;
1973+ }
1974+
19071975 const parameter = {
19081976 FunctionParameter : {
19091977 argType : transformedArgType . TypeName || transformedArgType ,
1910- mode : isVariadic ? 'FUNC_PARAM_VARIADIC' : 'FUNC_PARAM_DEFAULT'
1978+ mode : mode
19111979 }
19121980 } ;
19131981
@@ -1916,9 +1984,12 @@ export class V13ToV14Transformer {
19161984 : [ {
19171985 FunctionParameter : {
19181986 argType : this . visit ( result . objargs , context ) ,
1919- mode : this . isVariadicParameterType ( result . objargs , 0 , [ result . objargs ] , context ) ? 'FUNC_PARAM_VARIADIC' : 'FUNC_PARAM_DEFAULT'
1987+ mode : ( originalObjfuncargs && originalObjfuncargs [ 0 ] && originalObjfuncargs [ 0 ] . FunctionParameter && originalObjfuncargs [ 0 ] . FunctionParameter . mode )
1988+ ? this . mapFunctionParameterMode ( originalObjfuncargs [ 0 ] . FunctionParameter . mode )
1989+ : ( this . isVariadicParameterType ( result . objargs , 0 , [ result . objargs ] , context ) ? 'FUNC_PARAM_VARIADIC' : 'FUNC_PARAM_DEFAULT' )
19201990 }
19211991 } ] ;
1992+ }
19221993 }
19231994
19241995 } else if ( shouldCreateObjfuncargs ) {
@@ -1978,7 +2049,8 @@ export class V13ToV14Transformer {
19782049 return false ;
19792050 }
19802051 if ( parentType === 'DropStmt' ) {
1981- return false ;
2052+ // For DropStmt, check if we should add objfuncargs based on removeType
2053+ return this . shouldAddObjfuncargsForDropStmt ( context ) ;
19822054 }
19832055 }
19842056
@@ -2009,6 +2081,9 @@ export class V13ToV14Transformer {
20092081 return false ;
20102082 }
20112083
2084+ if ( context . parentNodeTypes . includes ( 'CreateTransformStmt' ) ) {
2085+ return false ;
2086+ }
20122087
20132088 if ( ( context as any ) . commentObjtype === 'OBJECT_OPERATOR' &&
20142089 context . parentNodeTypes . includes ( 'CommentStmt' ) ) {
@@ -2054,7 +2129,7 @@ export class V13ToV14Transformer {
20542129 const excludedNodeTypes = [
20552130 'CreateOpClassStmt' , 'CreateAggregateStmt' , 'AlterAggregateStmt' ,
20562131 'CreateFunctionStmt' , 'CreateStmt' , 'CreateTypeStmt' , 'CreateOpFamilyStmt' ,
2057- 'CreateOperatorStmt'
2132+ 'CreateOperatorStmt' , 'CreateTransformStmt' , 'DefineStmt'
20582133 ] ;
20592134
20602135 for ( const node of path ) {
@@ -2108,11 +2183,13 @@ export class V13ToV14Transformer {
21082183 if ( dropStmt && dropStmt . removeType === 'OBJECT_OPERATOR' ) {
21092184 return false ;
21102185 }
2111- if ( dropStmt && ( dropStmt . removeType === 'OBJECT_FUNCTION' ||
2112- dropStmt . removeType === 'OBJECT_AGGREGATE' ||
2186+ if ( dropStmt && ( dropStmt . removeType === 'OBJECT_AGGREGATE' ||
21132187 dropStmt . removeType === 'OBJECT_PROCEDURE' ) ) {
21142188 return true ;
21152189 }
2190+ if ( dropStmt && dropStmt . removeType === 'OBJECT_FUNCTION' ) {
2191+ return true ;
2192+ }
21162193 }
21172194 }
21182195
@@ -2121,11 +2198,13 @@ export class V13ToV14Transformer {
21212198 if ( removeType === 'OBJECT_OPERATOR' ) {
21222199 return false ;
21232200 }
2124- if ( removeType === 'OBJECT_FUNCTION' ||
2125- removeType === 'OBJECT_AGGREGATE' ||
2201+ if ( removeType === 'OBJECT_AGGREGATE' ||
21262202 removeType === 'OBJECT_PROCEDURE' ) {
21272203 return true ;
21282204 }
2205+ if ( removeType === 'OBJECT_FUNCTION' ) {
2206+ return true ;
2207+ }
21292208 }
21302209
21312210 return false ;
@@ -2151,7 +2230,7 @@ export class V13ToV14Transformer {
21512230 }
21522231
21532232 private createFunctionParameterFromTypeName ( typeNameNode : any , context ?: TransformerContext , index : number = 0 ) : any {
2154- const transformedTypeName = this . transform ( typeNameNode , { parentNodeTypes : [ ] } ) ;
2233+ const transformedTypeName = this . transform ( typeNameNode , context || { parentNodeTypes : [ ] } ) ;
21552234
21562235 const argType = transformedTypeName . TypeName ? transformedTypeName . TypeName : transformedTypeName ;
21572236
@@ -2164,7 +2243,8 @@ export class V13ToV14Transformer {
21642243
21652244 const shouldAddParameterName = context && context . parentNodeTypes &&
21662245 ! context . parentNodeTypes . includes ( 'DropStmt' ) &&
2167- ! context . parentNodeTypes . includes ( 'ObjectWithArgs' ) ;
2246+ ! context . parentNodeTypes . includes ( 'ObjectWithArgs' ) &&
2247+ ! context . parentNodeTypes . includes ( 'CreateTransformStmt' ) ;
21682248
21692249 if ( typeNameNode && typeNameNode . name && shouldAddParameterName ) {
21702250 functionParam . name = typeNameNode . name ;
0 commit comments