diff options
author | Peter Eisentraut <peter_e@gmx.net> | 2007-01-20 09:27:20 +0000 |
---|---|---|
committer | Peter Eisentraut <peter_e@gmx.net> | 2007-01-20 09:27:20 +0000 |
commit | b4c8d49036b971d892b2dfe1c71d3f0cee116e7f (patch) | |
tree | a3db0050c3ea8815e44b2a4014502bfaa9822796 /src/backend/executor | |
parent | 9a83bd50b7ec61140fc400350b3e5b1f0cd15722 (diff) | |
download | postgresql-b4c8d49036b971d892b2dfe1c71d3f0cee116e7f.tar.gz postgresql-b4c8d49036b971d892b2dfe1c71d3f0cee116e7f.zip |
Fix xmlconcat by properly merging the XML declarations. Add aggregate
function xmlagg.
Diffstat (limited to 'src/backend/executor')
-rw-r--r-- | src/backend/executor/execQual.c | 25 |
1 files changed, 13 insertions, 12 deletions
diff --git a/src/backend/executor/execQual.c b/src/backend/executor/execQual.c index ca804dea210..60f9d35f1f7 100644 --- a/src/backend/executor/execQual.c +++ b/src/backend/executor/execQual.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/executor/execQual.c,v 1.207 2007/01/14 13:11:53 petere Exp $ + * $PostgreSQL: pgsql/src/backend/executor/execQual.c,v 1.208 2007/01/20 09:27:19 petere Exp $ * *------------------------------------------------------------------------- */ @@ -2651,7 +2651,6 @@ ExecEvalXml(XmlExprState *xmlExpr, ExprContext *econtext, StringInfoData buf; Datum value; bool isnull; - char *str; ListCell *arg; ListCell *narg; int i; @@ -2663,20 +2662,22 @@ ExecEvalXml(XmlExprState *xmlExpr, ExprContext *econtext, switch (xexpr->op) { case IS_XMLCONCAT: - initStringInfo(&buf); - foreach(arg, xmlExpr->args) { - ExprState *e = (ExprState *) lfirst(arg); + List *values = NIL; - value = ExecEvalExpr(e, econtext, &isnull, NULL); - if (!isnull) + foreach(arg, xmlExpr->args) + { + ExprState *e = (ExprState *) lfirst(arg); + + value = ExecEvalExpr(e, econtext, &isnull, NULL); + if (!isnull) + values = lappend(values, DatumGetPointer(value)); + } + + if (list_length(values) > 0) { - /* we know the value is XML type */ - str = DatumGetCString(DirectFunctionCall1(xml_out, - value)); - appendStringInfoString(&buf, str); - pfree(str); *isNull = false; + return PointerGetDatum(xmlconcat(values)); } } break; |