aboutsummaryrefslogtreecommitdiff
path: root/src/backend/utils/adt/xml.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/utils/adt/xml.c')
-rw-r--r--src/backend/utils/adt/xml.c45
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();