@@ -1111,11 +1111,11 @@ export class V13ToV14Transformer {
11111111 return false ;
11121112 }
11131113
1114- // Check if ALL parameters have explicit modes (IN, OUT, INOUT, VARIADIC)
1114+ // Check if ALL parameters have truly explicit modes (OUT, INOUT, VARIADIC)
1115+ // FUNC_PARAM_IN is often the default assigned by v13 parser for implicit parameters
11151116 return parameters . every ( param => {
11161117 const mode = param ?. FunctionParameter ?. mode ;
1117- return mode === 'FUNC_PARAM_IN' || mode === 'FUNC_PARAM_OUT' ||
1118- mode === 'FUNC_PARAM_INOUT' || mode === 'FUNC_PARAM_VARIADIC' ;
1118+ return mode === 'FUNC_PARAM_OUT' || mode === 'FUNC_PARAM_INOUT' || mode === 'FUNC_PARAM_VARIADIC' ;
11191119 } ) ;
11201120 }
11211121
@@ -1127,19 +1127,32 @@ export class V13ToV14Transformer {
11271127 return false ;
11281128 }
11291129
1130+ private hasExplicitInParameters ( parameters : any [ ] ) : boolean {
1131+ if ( ! parameters || ! Array . isArray ( parameters ) ) {
1132+ return false ;
1133+ }
1134+
1135+ const inParams = parameters . filter ( p => p ?. FunctionParameter ?. mode === 'FUNC_PARAM_IN' ) ;
1136+ const outParams = parameters . filter ( p => p ?. FunctionParameter ?. mode === 'FUNC_PARAM_OUT' ) ;
1137+ const inoutParams = parameters . filter ( p => p ?. FunctionParameter ?. mode === 'FUNC_PARAM_INOUT' ) ;
1138+
1139+ const hasExplicitModes = outParams . length > 0 || inoutParams . length > 0 ;
1140+ const hasInParams = inParams . length > 0 ;
1141+
1142+ if ( ! hasExplicitModes || ! hasInParams ) {
1143+ return false ;
1144+ }
1145+
1146+ const inParamsWithNames = inParams . filter ( p => p ?. FunctionParameter ?. name ) ;
1147+ return inParamsWithNames . length > 0 ;
1148+ }
1149+
11301150 private isVariadicParameterType ( argType : any , index ?: number , allArgs ?: any [ ] , context ?: TransformerContext ) : boolean {
11311151 if ( ! argType ) return false ;
11321152
11331153 // Handle TypeName wrapper
11341154 const typeNode = argType . TypeName || argType ;
11351155
1136- if ( typeNode . arrayBounds && Array . isArray ( typeNode . arrayBounds ) ) {
1137- for ( const bound of typeNode . arrayBounds ) {
1138- if ( bound . Integer && bound . Integer . ival === - 1 ) {
1139- return true ;
1140- }
1141- }
1142- }
11431156
11441157 if ( typeNode . names && Array . isArray ( typeNode . names ) ) {
11451158 const typeName = typeNode . names [ typeNode . names . length - 1 ] ?. String ?. str ;
@@ -1149,7 +1162,6 @@ export class V13ToV14Transformer {
11491162 }
11501163
11511164 if ( typeName === 'anyarray' && allArgs && index !== undefined ) {
1152-
11531165 if ( typeName === 'anyarray' && index > 0 ) {
11541166 const prevArg = allArgs [ index - 1 ] ;
11551167 const prevTypeNode = prevArg ?. TypeName || prevArg ;
@@ -1169,16 +1181,40 @@ export class V13ToV14Transformer {
11691181 return false ;
11701182 }
11711183
1172- if ( typeName === 'int4' || typeName === 'int' || typeName === 'text' || typeName === 'varchar' ) {
1173- return false ;
1174- }
1175-
11761184 // In RenameStmt context for aggregates, "any" type should be treated as variadic
11771185 if ( context && context . parentNodeTypes ?. includes ( 'RenameStmt' ) && typeName === 'any' ) {
11781186 return true ;
11791187 }
11801188 }
11811189
1190+ if ( typeNode . arrayBounds && Array . isArray ( typeNode . arrayBounds ) ) {
1191+ if ( typeNode . names && Array . isArray ( typeNode . names ) ) {
1192+ const typeName = typeNode . names [ typeNode . names . length - 1 ] ?. String ?. str ;
1193+
1194+ if ( context ?. parentNodeTypes ?. includes ( 'DropStmt' ) && allArgs && index !== undefined ) {
1195+ // For DropStmt context, be extremely conservative about VARIADIC detection
1196+
1197+ for ( const bound of typeNode . arrayBounds ) {
1198+ if ( bound . Integer && bound . Integer . ival === - 1 ) {
1199+ // For DropStmt, default to regular array parameter (FUNC_PARAM_DEFAULT)
1200+ // Only mark as VARIADIC in very specific cases with clear VARIADIC syntax indicators
1201+
1202+ const isLastParameter = index === allArgs . length - 1 ;
1203+ const hasMultipleParameters = allArgs . length > 1 ;
1204+
1205+ if ( hasMultipleParameters && isLastParameter && typeNode . location && typeNode . location <= 15 ) {
1206+ return true ;
1207+ }
1208+
1209+ return false ;
1210+ }
1211+ }
1212+ // For DropStmt context, if we reach here, it's not VARIADIC
1213+ return false ;
1214+ }
1215+ }
1216+ }
1217+
11821218 return false ;
11831219 }
11841220
@@ -1910,14 +1946,16 @@ export class V13ToV14Transformer {
19101946 const hasExplicitModes = this . functionHasExplicitModes ( node . parameters ) ;
19111947 const allHaveExplicitModes = this . allParametersHaveExplicitModes ( node . parameters ) ;
19121948 const hasOnlyExplicitIn = this . hasOnlyExplicitInParameters ( node . parameters ) ;
1949+ const hasExplicitIn = this . hasExplicitInParameters ( node . parameters ) ;
19131950
19141951 // Create child context with CreateFunctionStmt as parent and explicit mode info
19151952 const childContext : TransformerContext = {
19161953 ...context ,
19171954 parentNodeTypes : [ ...( context . parentNodeTypes || [ ] ) , 'CreateFunctionStmt' ] ,
19181955 functionHasExplicitModes : hasExplicitModes ,
19191956 allParametersHaveExplicitModes : allHaveExplicitModes ,
1920- hasOnlyExplicitInParameters : hasOnlyExplicitIn
1957+ hasOnlyExplicitInParameters : hasOnlyExplicitIn ,
1958+ hasExplicitInParameters : hasExplicitIn
19211959 } ;
19221960
19231961 if ( node . funcname !== undefined ) {
@@ -3289,14 +3327,21 @@ export class V13ToV14Transformer {
32893327 return 'FUNC_PARAM_IN' ;
32903328 }
32913329
3292- if ( context && context . functionHasExplicitModes ) {
3293- if ( context . hasOnlyExplicitInParameters ) {
3294- return 'FUNC_PARAM_IN' ;
3295- }
3330+ if ( context &&
3331+ ( ( context as any ) . functionHasExplicitModes &&
3332+ ! ( context as any ) . hasExplicitInParameters &&
3333+ ( context as any ) . allParametersHaveExplicitModes === false ) ) {
3334+ return 'FUNC_PARAM_DEFAULT' ;
3335+ }
3336+
3337+ // Convert implicit IN parameters to DEFAULT for functions with only IN parameters
3338+ if ( context &&
3339+ ! ( context as any ) . functionHasExplicitModes &&
3340+ ! ( context as any ) . hasExplicitInParameters ) {
32963341 return 'FUNC_PARAM_DEFAULT' ;
32973342 }
32983343
3299- return 'FUNC_PARAM_DEFAULT ' ;
3344+ return 'FUNC_PARAM_IN ' ;
33003345 default :
33013346 return pg13Mode ;
33023347 }
0 commit comments