@@ -3955,71 +3955,78 @@ interpretRowidOption(List *defList, bool allowRowid)
39553955static void
39563956check_funcexpr_outparams (List * funcexprs )
39573957{
3958- HeapTuple procTup ;
3959- Form_pg_proc procStruct ;
3960- char * proname = NULL ;
3961- FuncExpr * func = (FuncExpr * ) linitial (funcexprs );
3958+ ListCell * lc ;
39623959
3963- if (list_length ( funcexprs ) <= 0 )
3960+ if (allow_out_parameter_const )
39643961 return ;
39653962
3966- if (!IsA (func , FuncExpr ))
3967- return ;
3968-
3969- if (!FUNC_EXPR_FROM_PG_PROC (func -> function_from ))
3970- return ;
3963+ foreach (lc , funcexprs )
3964+ {
3965+ FuncExpr * func = (FuncExpr * ) lfirst (lc );
3966+ int i ;
3967+ ListCell * lc1 ;
3968+ Oid * argtypes = NULL ;
3969+ char * * argnames = NULL ;
3970+ char * argmodes = NULL ;
3971+ HeapTuple procTup = NULL ;
3972+ char * proname = NULL ;
39713973
3972- procTup = SearchSysCache1 ( PROCOID ,
3973- ObjectIdGetDatum ( func -> funcid )) ;
3974+ if (! IsA ( func , FuncExpr ))
3975+ return ;
39743976
3975- if (!HeapTupleIsValid (procTup ))
3976- ereport (ERROR ,
3977- (errcode (ERRCODE_DATA_EXCEPTION ),
3978- errmsg ("cache lookup failed for function %u" , func -> funcid )));
3977+ if (FUNC_EXPR_FROM_PG_PROC (func -> function_from ))
3978+ {
3979+ Form_pg_proc procStruct ;
3980+
3981+ procTup = SearchSysCache1 (PROCOID , ObjectIdGetDatum (func -> funcid ));
39793982
3980- procStruct = (Form_pg_proc ) GETSTRUCT (procTup );
3983+ if (!HeapTupleIsValid (procTup ))
3984+ ereport (ERROR ,
3985+ (errcode (ERRCODE_DATA_EXCEPTION ),
3986+ errmsg ("cache lookup failed for function %u" , func -> funcid )));
39813987
3982- if (LANG_PLISQL_OID != procStruct -> prolang )
3983- {
3984- ReleaseSysCache (procTup );
3985- return ;
3986- }
3988+ procStruct = (Form_pg_proc ) GETSTRUCT (procTup );
39873989
3988- if (!heap_attisnull (procTup , Anum_pg_proc_proargmodes , NULL ) &&
3989- !allow_out_parameter_const )
3990- {
3991- int i ;
3992- ListCell * lc ;
3993- Oid * argtypes ;
3994- char * * argnames ;
3995- char * argmodes ;
3990+ if (LANG_PLISQL_OID != procStruct -> prolang )
3991+ {
3992+ ReleaseSysCache (procTup );
3993+ continue ;
3994+ }
39963995
3997- proname = pstrdup (NameStr (procStruct -> proname ));
3998- get_func_arg_info (procTup , & argtypes , & argnames , & argmodes );
3996+ proname = pstrdup (NameStr (procStruct -> proname ));
3997+ get_func_arg_info (procTup , & argtypes , & argnames , & argmodes );
3998+ ReleaseSysCache (procTup );
39993999
4000+ if (argmodes == NULL )
4001+ continue ;
4002+ }
4003+ else
4004+ {
4005+ get_subproc_arg_info (func , & argtypes ,
4006+ & argnames , & argmodes );
4007+ proname = get_internal_function_name (func );
4008+ }
40004009 i = 0 ;
4001- foreach (lc , func -> args )
4010+
4011+ foreach (lc1 , func -> args )
40024012 {
4013+
40034014 if (argmodes [i ] == PROARGMODE_OUT ||
40044015 argmodes [i ] == PROARGMODE_INOUT )
40054016 {
4006- Node * arg = (Node * ) lfirst (lc );
4017+ Node * arg = (Node * ) lfirst (lc1 );
40074018
40084019 arg = ParseParamVariable (arg );
40094020 if (!IsA (arg , Param ))
40104021 {
4011- ReleaseSysCache (procTup );
40124022 ereport (ERROR ,
40134023 (errcode (ERRCODE_DATA_EXCEPTION ),
4014- errmsg ("OUT or IN OUT arguments of the function %s must be variables " ,
4024+ errmsg ("OUT or IN OUT arguments of the function %s must be variables. " ,
40154025 proname )));
40164026 }
40174027 }
40184028 i ++ ;
40194029 }
40204030 }
4021- ReleaseSysCache (procTup );
4022-
4023- return ;
40244031}
40254032
0 commit comments