@@ -232,7 +232,7 @@ interpret_function_parameter_list(ParseState *pstate,
232232		if  (fpmode  ==  FUNC_PARAM_DEFAULT )
233233			fpmode  =  FUNC_PARAM_IN ;
234234
235- 		typtup  =  LookupTypeName (NULL , t , NULL , false);
235+ 		typtup  =  LookupTypeName (pstate , t , NULL , false);
236236		if  (typtup )
237237		{
238238			if  (!((Form_pg_type ) GETSTRUCT (typtup ))-> typisdefined )
@@ -242,18 +242,21 @@ interpret_function_parameter_list(ParseState *pstate,
242242					ereport (ERROR ,
243243							(errcode (ERRCODE_INVALID_FUNCTION_DEFINITION ),
244244							 errmsg ("SQL function cannot accept shell type %s" ,
245- 									TypeNameToString (t ))));
245+ 									TypeNameToString (t )),
246+ 							 parser_errposition (pstate , t -> location )));
246247				/* We don't allow creating aggregates on shell types either */ 
247248				else  if  (objtype  ==  OBJECT_AGGREGATE )
248249					ereport (ERROR ,
249250							(errcode (ERRCODE_INVALID_FUNCTION_DEFINITION ),
250251							 errmsg ("aggregate cannot accept shell type %s" ,
251- 									TypeNameToString (t ))));
252+ 									TypeNameToString (t )),
253+ 							 parser_errposition (pstate , t -> location )));
252254				else 
253255					ereport (NOTICE ,
254256							(errcode (ERRCODE_WRONG_OBJECT_TYPE ),
255257							 errmsg ("argument type %s is only a shell" ,
256- 									TypeNameToString (t ))));
258+ 									TypeNameToString (t )),
259+ 							 parser_errposition (pstate , t -> location )));
257260			}
258261			toid  =  typeTypeId (typtup );
259262			ReleaseSysCache (typtup );
@@ -263,7 +266,8 @@ interpret_function_parameter_list(ParseState *pstate,
263266			ereport (ERROR ,
264267					(errcode (ERRCODE_UNDEFINED_OBJECT ),
265268					 errmsg ("type %s does not exist" ,
266- 							TypeNameToString (t ))));
269+ 							TypeNameToString (t )),
270+ 					 parser_errposition (pstate , t -> location )));
267271			toid  =  InvalidOid ;	/* keep compiler quiet */ 
268272		}
269273
@@ -276,15 +280,18 @@ interpret_function_parameter_list(ParseState *pstate,
276280			if  (objtype  ==  OBJECT_AGGREGATE )
277281				ereport (ERROR ,
278282						(errcode (ERRCODE_INVALID_FUNCTION_DEFINITION ),
279- 						 errmsg ("aggregates cannot accept set arguments" )));
283+ 						 errmsg ("aggregates cannot accept set arguments" ),
284+ 						 parser_errposition (pstate , fp -> location )));
280285			else  if  (objtype  ==  OBJECT_PROCEDURE )
281286				ereport (ERROR ,
282287						(errcode (ERRCODE_INVALID_FUNCTION_DEFINITION ),
283- 						 errmsg ("procedures cannot accept set arguments" )));
288+ 						 errmsg ("procedures cannot accept set arguments" ),
289+ 						 parser_errposition (pstate , fp -> location )));
284290			else 
285291				ereport (ERROR ,
286292						(errcode (ERRCODE_INVALID_FUNCTION_DEFINITION ),
287- 						 errmsg ("functions cannot accept set arguments" )));
293+ 						 errmsg ("functions cannot accept set arguments" ),
294+ 						 parser_errposition (pstate , fp -> location )));
288295		}
289296
290297		/* handle input parameters */ 
@@ -294,7 +301,8 @@ interpret_function_parameter_list(ParseState *pstate,
294301			if  (varCount  >  0 )
295302				ereport (ERROR ,
296303						(errcode (ERRCODE_INVALID_FUNCTION_DEFINITION ),
297- 						 errmsg ("VARIADIC parameter must be the last input parameter" )));
304+ 						 errmsg ("VARIADIC parameter must be the last input parameter" ),
305+ 						 parser_errposition (pstate , fp -> location )));
298306			inTypes [inCount ++ ] =  toid ;
299307			isinput  =  true;
300308			if  (parameterTypes_list )
@@ -314,7 +322,8 @@ interpret_function_parameter_list(ParseState *pstate,
314322				if  (varCount  >  0 )
315323					ereport (ERROR ,
316324							(errcode (ERRCODE_INVALID_FUNCTION_DEFINITION ),
317- 							 errmsg ("VARIADIC parameter must be the last parameter" )));
325+ 							 errmsg ("VARIADIC parameter must be the last parameter" ),
326+ 							 parser_errposition (pstate , fp -> location )));
318327				/* Procedures with output parameters always return RECORD */ 
319328				* requiredResultType  =  RECORDOID ;
320329			}
@@ -339,7 +348,8 @@ interpret_function_parameter_list(ParseState *pstate,
339348					if  (!OidIsValid (get_element_type (toid )))
340349						ereport (ERROR ,
341350								(errcode (ERRCODE_INVALID_FUNCTION_DEFINITION ),
342- 								 errmsg ("VARIADIC parameter must be an array" )));
351+ 								 errmsg ("VARIADIC parameter must be an array" ),
352+ 								 parser_errposition (pstate , fp -> location )));
343353					break ;
344354			}
345355		}
@@ -385,7 +395,8 @@ interpret_function_parameter_list(ParseState *pstate,
385395					ereport (ERROR ,
386396							(errcode (ERRCODE_INVALID_FUNCTION_DEFINITION ),
387397							 errmsg ("parameter name \"%s\" used more than once" ,
388- 									fp -> name )));
398+ 									fp -> name ),
399+ 							 parser_errposition (pstate , fp -> location )));
389400			}
390401
391402			paramNames [i ] =  CStringGetTextDatum (fp -> name );
@@ -402,7 +413,8 @@ interpret_function_parameter_list(ParseState *pstate,
402413			if  (!isinput )
403414				ereport (ERROR ,
404415						(errcode (ERRCODE_INVALID_FUNCTION_DEFINITION ),
405- 						 errmsg ("only input parameters can have default values" )));
416+ 						 errmsg ("only input parameters can have default values" ),
417+ 						 parser_errposition (pstate , fp -> location )));
406418
407419			def  =  transformExpr (pstate , fp -> defexpr ,
408420								EXPR_KIND_FUNCTION_DEFAULT );
@@ -417,7 +429,8 @@ interpret_function_parameter_list(ParseState *pstate,
417429				contain_var_clause (def ))
418430				ereport (ERROR ,
419431						(errcode (ERRCODE_INVALID_COLUMN_REFERENCE ),
420- 						 errmsg ("cannot use table references in parameter default value" )));
432+ 						 errmsg ("cannot use table references in parameter default value" ),
433+ 						 parser_errposition (pstate , fp -> location )));
421434
422435			/* 
423436			 * transformExpr() should have already rejected subqueries, 
@@ -441,7 +454,8 @@ interpret_function_parameter_list(ParseState *pstate,
441454			if  (isinput  &&  have_defaults )
442455				ereport (ERROR ,
443456						(errcode (ERRCODE_INVALID_FUNCTION_DEFINITION ),
444- 						 errmsg ("input parameters after one with a default value must also have defaults" )));
457+ 						 errmsg ("input parameters after one with a default value must also have defaults" ),
458+ 						 parser_errposition (pstate , fp -> location )));
445459
446460			/* 
447461			 * For procedures, we also can't allow OUT parameters after one 
@@ -451,7 +465,8 @@ interpret_function_parameter_list(ParseState *pstate,
451465			if  (objtype  ==  OBJECT_PROCEDURE  &&  have_defaults )
452466				ereport (ERROR ,
453467						(errcode (ERRCODE_INVALID_FUNCTION_DEFINITION ),
454- 						 errmsg ("procedure OUT parameters cannot appear after one with a default value" )));
468+ 						 errmsg ("procedure OUT parameters cannot appear after one with a default value" ),
469+ 						 parser_errposition (pstate , fp -> location )));
455470		}
456471
457472		i ++ ;
0 commit comments