diff options
Diffstat (limited to 'src/backend/utils/adt/xml.c')
-rw-r--r-- | src/backend/utils/adt/xml.c | 45 |
1 files changed, 22 insertions, 23 deletions
diff --git a/src/backend/utils/adt/xml.c b/src/backend/utils/adt/xml.c index 1908b13db5c..2f87151becc 100644 --- a/src/backend/utils/adt/xml.c +++ b/src/backend/utils/adt/xml.c @@ -72,7 +72,6 @@ #include "catalog/pg_class.h" #include "catalog/pg_type.h" #include "commands/dbcommands.h" -#include "executor/executor.h" #include "executor/spi.h" #include "executor/tablefunc.h" #include "fmgr.h" @@ -620,10 +619,11 @@ xmltotext_with_xmloption(xmltype *data, XmlOptionType xmloption_arg) xmltype * -xmlelement(XmlExprState *xmlExpr, ExprContext *econtext) +xmlelement(XmlExpr *xexpr, + Datum *named_argvalue, bool *named_argnull, + Datum *argvalue, bool *argnull) { #ifdef USE_LIBXML - XmlExpr *xexpr = (XmlExpr *) xmlExpr->xprstate.expr; xmltype *result; List *named_arg_strings; List *arg_strings; @@ -635,48 +635,47 @@ xmlelement(XmlExprState *xmlExpr, ExprContext *econtext) volatile xmlTextWriterPtr writer = NULL; /* - * We first evaluate all the arguments, then start up libxml and create - * the result. This avoids issues if one of the arguments involves a call - * to some other function or subsystem that wants to use libxml on its own - * terms. + * All arguments are already evaluated, and their values are passed in the + * named_argvalue/named_argnull or argvalue/argnull arrays. This avoids + * issues if one of the arguments involves a call to some other function + * or subsystem that wants to use libxml on its own terms. We examine the + * original XmlExpr to identify the numbers and types of the arguments. */ named_arg_strings = NIL; i = 0; - foreach(arg, xmlExpr->named_args) + foreach(arg, xexpr->named_args) { - ExprState *e = (ExprState *) lfirst(arg); - Datum value; - bool isnull; + Expr *e = (Expr *) lfirst(arg); char *str; - value = ExecEvalExpr(e, econtext, &isnull); - if (isnull) + if (named_argnull[i]) str = NULL; else - str = map_sql_value_to_xml_value(value, exprType((Node *) e->expr), false); + str = map_sql_value_to_xml_value(named_argvalue[i], + exprType((Node *) e), + false); named_arg_strings = lappend(named_arg_strings, str); i++; } arg_strings = NIL; - foreach(arg, xmlExpr->args) + i = 0; + foreach(arg, xexpr->args) { - ExprState *e = (ExprState *) lfirst(arg); - Datum value; - bool isnull; + Expr *e = (Expr *) lfirst(arg); char *str; - value = ExecEvalExpr(e, econtext, &isnull); /* here we can just forget NULL elements immediately */ - if (!isnull) + if (!argnull[i]) { - str = map_sql_value_to_xml_value(value, - exprType((Node *) e->expr), true); + str = map_sql_value_to_xml_value(argvalue[i], + exprType((Node *) e), + true); arg_strings = lappend(arg_strings, str); } + i++; } - /* now safe to run libxml */ xmlerrcxt = pg_xml_init(PG_XML_STRICTNESS_ALL); PG_TRY(); |