aboutsummaryrefslogtreecommitdiff
path: root/src/backend/executor
diff options
context:
space:
mode:
authorPeter Eisentraut <peter_e@gmx.net>2007-02-03 14:06:56 +0000
committerPeter Eisentraut <peter_e@gmx.net>2007-02-03 14:06:56 +0000
commitec020e1ceb94d0ceb3c0eee8c39cd197be7bb3cb (patch)
tree99f52eea439dd239d8e9a7f04f70f567b88ee798 /src/backend/executor
parent25dc46334b99f3161d931a608fb49f6eced42065 (diff)
downloadpostgresql-ec020e1ceb94d0ceb3c0eee8c39cd197be7bb3cb.tar.gz
postgresql-ec020e1ceb94d0ceb3c0eee8c39cd197be7bb3cb.zip
Implement XMLSERIALIZE for real. Analogously, make the xml to text cast
observe the xmloption. Reorganize the representation of the XML option in the parse tree and the API to make it easier to manage and understand. Add regression tests for parsing back XML expressions.
Diffstat (limited to 'src/backend/executor')
-rw-r--r--src/backend/executor/execQual.c35
1 files changed, 23 insertions, 12 deletions
diff --git a/src/backend/executor/execQual.c b/src/backend/executor/execQual.c
index 6b72c02781f..fd95672deec 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.211 2007/02/02 00:07:03 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/executor/execQual.c,v 1.212 2007/02/03 14:06:53 petere Exp $
*
*-------------------------------------------------------------------------
*/
@@ -2834,11 +2834,10 @@ ExecEvalXml(XmlExprState *xmlExpr, ExprContext *econtext,
{
ExprState *e;
text *data;
- bool is_document;
bool preserve_whitespace;
- /* arguments are known to be text, bool, bool */
- Assert(list_length(xmlExpr->args) == 3);
+ /* arguments are known to be text, bool */
+ Assert(list_length(xmlExpr->args) == 2);
e = (ExprState *) linitial(xmlExpr->args);
value = ExecEvalExpr(e, econtext, &isnull, NULL);
@@ -2850,18 +2849,12 @@ ExecEvalXml(XmlExprState *xmlExpr, ExprContext *econtext,
value = ExecEvalExpr(e, econtext, &isnull, NULL);
if (isnull) /* probably can't happen */
return (Datum) 0;
- is_document = DatumGetBool(value);
-
- e = (ExprState *) lthird(xmlExpr->args);
- value = ExecEvalExpr(e, econtext, &isnull, NULL);
- if (isnull) /* probably can't happen */
- return (Datum) 0;
preserve_whitespace = DatumGetBool(value);
*isNull = false;
return PointerGetDatum(xmlparse(data,
- is_document,
+ xexpr->xmloption,
preserve_whitespace));
}
break;
@@ -2900,7 +2893,7 @@ ExecEvalXml(XmlExprState *xmlExpr, ExprContext *econtext,
text *version;
int standalone;
- /* arguments are known to be xml, text, bool */
+ /* arguments are known to be xml, text, int */
Assert(list_length(xmlExpr->args) == 3);
e = (ExprState *) linitial(xmlExpr->args);
@@ -2928,6 +2921,24 @@ ExecEvalXml(XmlExprState *xmlExpr, ExprContext *econtext,
}
break;
+ case IS_XMLSERIALIZE:
+ {
+ ExprState *e;
+
+ /* argument type is known to be xml */
+ Assert(list_length(xmlExpr->args) == 1);
+
+ e = (ExprState *) linitial(xmlExpr->args);
+ value = ExecEvalExpr(e, econtext, &isnull, NULL);
+ if (isnull)
+ return (Datum) 0;
+
+ *isNull = false;
+
+ return PointerGetDatum(xmltotext_with_xmloption(DatumGetXmlP(value), xexpr->xmloption));
+ }
+ break;
+
case IS_DOCUMENT:
{
ExprState *e;