aboutsummaryrefslogtreecommitdiff
path: root/src/backend
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend')
-rw-r--r--src/backend/commands/functioncmds.c47
-rw-r--r--src/backend/nodes/nodeFuncs.c3
-rw-r--r--src/backend/parser/gram.y17
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);