diff options
Diffstat (limited to 'src/backend')
-rw-r--r-- | src/backend/commands/functioncmds.c | 47 | ||||
-rw-r--r-- | src/backend/nodes/nodeFuncs.c | 3 | ||||
-rw-r--r-- | src/backend/parser/gram.y | 17 |
3 files changed, 44 insertions, 23 deletions
diff --git a/src/backend/commands/functioncmds.c b/src/backend/commands/functioncmds.c index d43b89d3efa..6fc3863265d 100644 --- a/src/backend/commands/functioncmds.c +++ b/src/backend/commands/functioncmds.c @@ -232,7 +232,7 @@ interpret_function_parameter_list(ParseState *pstate, if (fpmode == FUNC_PARAM_DEFAULT) fpmode = FUNC_PARAM_IN; - typtup = LookupTypeName(NULL, t, NULL, false); + typtup = LookupTypeName(pstate, t, NULL, false); if (typtup) { if (!((Form_pg_type) GETSTRUCT(typtup))->typisdefined) @@ -242,18 +242,21 @@ interpret_function_parameter_list(ParseState *pstate, ereport(ERROR, (errcode(ERRCODE_INVALID_FUNCTION_DEFINITION), errmsg("SQL function cannot accept shell type %s", - TypeNameToString(t)))); + TypeNameToString(t)), + parser_errposition(pstate, t->location))); /* We don't allow creating aggregates on shell types either */ else if (objtype == OBJECT_AGGREGATE) ereport(ERROR, (errcode(ERRCODE_INVALID_FUNCTION_DEFINITION), errmsg("aggregate cannot accept shell type %s", - TypeNameToString(t)))); + TypeNameToString(t)), + parser_errposition(pstate, t->location))); else ereport(NOTICE, (errcode(ERRCODE_WRONG_OBJECT_TYPE), errmsg("argument type %s is only a shell", - TypeNameToString(t)))); + TypeNameToString(t)), + parser_errposition(pstate, t->location))); } toid = typeTypeId(typtup); ReleaseSysCache(typtup); @@ -263,7 +266,8 @@ interpret_function_parameter_list(ParseState *pstate, ereport(ERROR, (errcode(ERRCODE_UNDEFINED_OBJECT), errmsg("type %s does not exist", - TypeNameToString(t)))); + TypeNameToString(t)), + parser_errposition(pstate, t->location))); toid = InvalidOid; /* keep compiler quiet */ } @@ -276,15 +280,18 @@ interpret_function_parameter_list(ParseState *pstate, if (objtype == OBJECT_AGGREGATE) ereport(ERROR, (errcode(ERRCODE_INVALID_FUNCTION_DEFINITION), - errmsg("aggregates cannot accept set arguments"))); + errmsg("aggregates cannot accept set arguments"), + parser_errposition(pstate, fp->location))); else if (objtype == OBJECT_PROCEDURE) ereport(ERROR, (errcode(ERRCODE_INVALID_FUNCTION_DEFINITION), - errmsg("procedures cannot accept set arguments"))); + errmsg("procedures cannot accept set arguments"), + parser_errposition(pstate, fp->location))); else ereport(ERROR, (errcode(ERRCODE_INVALID_FUNCTION_DEFINITION), - errmsg("functions cannot accept set arguments"))); + errmsg("functions cannot accept set arguments"), + parser_errposition(pstate, fp->location))); } /* handle input parameters */ @@ -294,7 +301,8 @@ interpret_function_parameter_list(ParseState *pstate, if (varCount > 0) ereport(ERROR, (errcode(ERRCODE_INVALID_FUNCTION_DEFINITION), - errmsg("VARIADIC parameter must be the last input parameter"))); + errmsg("VARIADIC parameter must be the last input parameter"), + parser_errposition(pstate, fp->location))); inTypes[inCount++] = toid; isinput = true; if (parameterTypes_list) @@ -314,7 +322,8 @@ interpret_function_parameter_list(ParseState *pstate, if (varCount > 0) ereport(ERROR, (errcode(ERRCODE_INVALID_FUNCTION_DEFINITION), - errmsg("VARIADIC parameter must be the last parameter"))); + errmsg("VARIADIC parameter must be the last parameter"), + parser_errposition(pstate, fp->location))); /* Procedures with output parameters always return RECORD */ *requiredResultType = RECORDOID; } @@ -339,7 +348,8 @@ interpret_function_parameter_list(ParseState *pstate, if (!OidIsValid(get_element_type(toid))) ereport(ERROR, (errcode(ERRCODE_INVALID_FUNCTION_DEFINITION), - errmsg("VARIADIC parameter must be an array"))); + errmsg("VARIADIC parameter must be an array"), + parser_errposition(pstate, fp->location))); break; } } @@ -385,7 +395,8 @@ interpret_function_parameter_list(ParseState *pstate, ereport(ERROR, (errcode(ERRCODE_INVALID_FUNCTION_DEFINITION), errmsg("parameter name \"%s\" used more than once", - fp->name))); + fp->name), + parser_errposition(pstate, fp->location))); } paramNames[i] = CStringGetTextDatum(fp->name); @@ -402,7 +413,8 @@ interpret_function_parameter_list(ParseState *pstate, if (!isinput) ereport(ERROR, (errcode(ERRCODE_INVALID_FUNCTION_DEFINITION), - errmsg("only input parameters can have default values"))); + errmsg("only input parameters can have default values"), + parser_errposition(pstate, fp->location))); def = transformExpr(pstate, fp->defexpr, EXPR_KIND_FUNCTION_DEFAULT); @@ -417,7 +429,8 @@ interpret_function_parameter_list(ParseState *pstate, contain_var_clause(def)) ereport(ERROR, (errcode(ERRCODE_INVALID_COLUMN_REFERENCE), - errmsg("cannot use table references in parameter default value"))); + errmsg("cannot use table references in parameter default value"), + parser_errposition(pstate, fp->location))); /* * transformExpr() should have already rejected subqueries, @@ -441,7 +454,8 @@ interpret_function_parameter_list(ParseState *pstate, if (isinput && have_defaults) ereport(ERROR, (errcode(ERRCODE_INVALID_FUNCTION_DEFINITION), - errmsg("input parameters after one with a default value must also have defaults"))); + errmsg("input parameters after one with a default value must also have defaults"), + parser_errposition(pstate, fp->location))); /* * For procedures, we also can't allow OUT parameters after one @@ -451,7 +465,8 @@ interpret_function_parameter_list(ParseState *pstate, if (objtype == OBJECT_PROCEDURE && have_defaults) ereport(ERROR, (errcode(ERRCODE_INVALID_FUNCTION_DEFINITION), - errmsg("procedure OUT parameters cannot appear after one with a default value"))); + errmsg("procedure OUT parameters cannot appear after one with a default value"), + parser_errposition(pstate, fp->location))); } i++; diff --git a/src/backend/nodes/nodeFuncs.c b/src/backend/nodes/nodeFuncs.c index f76072228c9..3060847b133 100644 --- a/src/backend/nodes/nodeFuncs.c +++ b/src/backend/nodes/nodeFuncs.c @@ -1723,8 +1723,7 @@ exprLocation(const Node *expr) loc = ((const Constraint *) expr)->location; break; case T_FunctionParameter: - /* just use typename's location */ - loc = exprLocation((Node *) ((const FunctionParameter *) expr)->argType); + loc = ((const FunctionParameter *) expr)->location; break; case T_XmlSerialize: /* XMLSERIALIZE keyword should always be the first thing */ diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y index dd458182f02..c96505f8b4e 100644 --- a/src/backend/parser/gram.y +++ b/src/backend/parser/gram.y @@ -184,7 +184,7 @@ static Node *makeSQLValueFunction(SQLValueFunctionOp op, int32 typmod, int location); static Node *makeXmlExpr(XmlExprOp op, char *name, List *named_args, List *args, int location); -static List *mergeTableFuncParameters(List *func_args, List *columns); +static List *mergeTableFuncParameters(List *func_args, List *columns, core_yyscan_t yyscanner); static TypeName *TableFuncTypeName(List *columns); static RangeVar *makeRangeVarFromAnyName(List *names, int position, core_yyscan_t yyscanner); static RangeVar *makeRangeVarFromQualifiedName(char *name, List *namelist, int location, @@ -8290,7 +8290,7 @@ CreateFunctionStmt: n->is_procedure = false; n->replace = $2; n->funcname = $4; - n->parameters = mergeTableFuncParameters($5, $9); + n->parameters = mergeTableFuncParameters($5, $9, yyscanner); n->returnType = TableFuncTypeName($9); n->returnType->location = @7; n->options = $11; @@ -8423,6 +8423,7 @@ func_arg: n->argType = $3; n->mode = $1; n->defexpr = NULL; + n->location = @1; $$ = n; } | param_name arg_class func_type @@ -8433,6 +8434,7 @@ func_arg: n->argType = $3; n->mode = $2; n->defexpr = NULL; + n->location = @1; $$ = n; } | param_name func_type @@ -8443,6 +8445,7 @@ func_arg: n->argType = $2; n->mode = FUNC_PARAM_DEFAULT; n->defexpr = NULL; + n->location = @1; $$ = n; } | arg_class func_type @@ -8453,6 +8456,7 @@ func_arg: n->argType = $2; n->mode = $1; n->defexpr = NULL; + n->location = @1; $$ = n; } | func_type @@ -8463,6 +8467,7 @@ func_arg: n->argType = $1; n->mode = FUNC_PARAM_DEFAULT; n->defexpr = NULL; + n->location = @1; $$ = n; } ; @@ -8799,6 +8804,7 @@ table_func_column: param_name func_type n->argType = $2; n->mode = FUNC_PARAM_TABLE; n->defexpr = NULL; + n->location = @1; $$ = n; } ; @@ -18908,7 +18914,7 @@ makeOrderedSetArgs(List *directargs, List *orderedargs, ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("an ordered-set aggregate with a VARIADIC direct argument must have one VARIADIC aggregated argument of the same data type"), - parser_errposition(exprLocation((Node *) firsto)))); + parser_errposition(firsto->location))); /* OK, drop the duplicate VARIADIC argument from the internal form */ orderedargs = NIL; @@ -19183,7 +19189,7 @@ makeXmlExpr(XmlExprOp op, char *name, List *named_args, List *args, * Merge the input and output parameters of a table function. */ static List * -mergeTableFuncParameters(List *func_args, List *columns) +mergeTableFuncParameters(List *func_args, List *columns, core_yyscan_t yyscanner) { ListCell *lc; @@ -19197,7 +19203,8 @@ mergeTableFuncParameters(List *func_args, List *columns) p->mode != FUNC_PARAM_VARIADIC) ereport(ERROR, (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("OUT and INOUT arguments aren't allowed in TABLE functions"))); + errmsg("OUT and INOUT arguments aren't allowed in TABLE functions"), + parser_errposition(p->location))); } return list_concat(func_args, columns); |