summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane2008-10-07 01:47:55 +0000
committerTom Lane2008-10-07 01:47:55 +0000
commitd5a798eb0aaf9d9d8ea5f55c688dbfd858809081 (patch)
tree215ffc657090ba14229967af68df4c5f28aaeae0
parent3a19099dd8afda0479384a10d666b93a26ebf9eb (diff)
Improve parser error location for cases where an INSERT or UPDATE command
supplies an expression that can't be coerced to the target column type. The code previously attempted to point at the target column name, which doesn't work at all in an INSERT with omitted column name list, and is also not remarkably helpful when the problem is buried somewhere in a long INSERT-multi-VALUES command. Make it point at the failed expression instead.
-rw-r--r--src/backend/parser/analyze.c14
-rw-r--r--src/backend/parser/parse_target.c11
2 files changed, 18 insertions, 7 deletions
diff --git a/src/backend/parser/analyze.c b/src/backend/parser/analyze.c
index e55eec0b8f..ac2c7ba84c 100644
--- a/src/backend/parser/analyze.c
+++ b/src/backend/parser/analyze.c
@@ -426,11 +426,15 @@ transformInsertStmt(ParseState *pstate, InsertStmt *stmt)
exprType((Node *) tle->expr) == UNKNOWNOID)
expr = tle->expr;
else
- expr = (Expr *) makeVar(rtr->rtindex,
- tle->resno,
- exprType((Node *) tle->expr),
- exprTypmod((Node *) tle->expr),
- 0);
+ {
+ Var *var = makeVar(rtr->rtindex,
+ tle->resno,
+ exprType((Node *) tle->expr),
+ exprTypmod((Node *) tle->expr),
+ 0);
+ var->location = exprLocation((Node *) tle->expr);
+ expr = (Expr *) var;
+ }
exprList = lappend(exprList, expr);
}
diff --git a/src/backend/parser/parse_target.c b/src/backend/parser/parse_target.c
index 4fedc6299a..1f19131ae2 100644
--- a/src/backend/parser/parse_target.c
+++ b/src/backend/parser/parse_target.c
@@ -343,6 +343,11 @@ markTargetListOrigin(ParseState *pstate, TargetEntry *tle,
* location error cursor position for the target column, or -1
*
* Returns the modified expression.
+ *
+ * Note: location points at the target column name (SET target or INSERT
+ * column name list entry), and must therefore be -1 in an INSERT that
+ * omits the column name list. So we should usually prefer to use
+ * exprLocation(expr) for errors that can happen in a default INSERT.
*/
Expr *
transformAssignedExpr(ParseState *pstate,
@@ -446,9 +451,11 @@ transformAssignedExpr(ParseState *pstate,
* For normal non-qualified target column, do type checking and
* coercion.
*/
+ Node *orig_expr = (Node *) expr;
+
expr = (Expr *)
coerce_to_target_type(pstate,
- (Node *) expr, type_id,
+ orig_expr, type_id,
attrtype, attrtypmod,
COERCION_ASSIGNMENT,
COERCE_IMPLICIT_CAST,
@@ -462,7 +469,7 @@ transformAssignedExpr(ParseState *pstate,
format_type_be(attrtype),
format_type_be(type_id)),
errhint("You will need to rewrite or cast the expression."),
- parser_errposition(pstate, location)));
+ parser_errposition(pstate, exprLocation(orig_expr))));
}
return expr;