From 3a32ba2f3f54378e3e06366a5ff06e339984f065 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Mon, 8 Jan 2007 23:41:57 +0000 Subject: Prevent duplicate attribute names in XMLELEMENT. --- src/backend/parser/parse_expr.c | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) (limited to 'src/backend/parser/parse_expr.c') diff --git a/src/backend/parser/parse_expr.c b/src/backend/parser/parse_expr.c index c15858fc7a1..033dd6c75cf 100644 --- a/src/backend/parser/parse_expr.c +++ b/src/backend/parser/parse_expr.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/parser/parse_expr.c,v 1.204 2007/01/05 22:19:34 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/parser/parse_expr.c,v 1.205 2007/01/08 23:41:56 petere Exp $ * *------------------------------------------------------------------------- */ @@ -1415,8 +1415,8 @@ transformXmlExpr(ParseState *pstate, XmlExpr *x) ereport(ERROR, (errcode(ERRCODE_SYNTAX_ERROR), x->op == IS_XMLELEMENT - ? errmsg("unnamed attribute value must be a column reference") - : errmsg("unnamed element value must be a column reference"))); + ? errmsg("unnamed XML attribute value must be a column reference") + : errmsg("unnamed XML element value must be a column reference"))); argname = NULL; /* keep compiler quiet */ } @@ -1424,6 +1424,22 @@ transformXmlExpr(ParseState *pstate, XmlExpr *x) newx->arg_names = lappend(newx->arg_names, makeString(argname)); } + if (x->op == IS_XMLELEMENT) + { + foreach(lc, newx->arg_names) + { + ListCell *lc2; + + for_each_cell(lc2, lnext(lc)) + { + if (strcmp(strVal(lfirst(lc)), strVal(lfirst(lc2))) == 0) + ereport(ERROR, + (errcode(ERRCODE_SYNTAX_ERROR), + errmsg("XML attribute name \"%s\" appears more than once", strVal(lfirst(lc))))); + } + } + } + /* The other arguments are of varying types depending on the function */ newx->args = NIL; i = 0; -- cgit v1.2.3