diff --git a/src/backend/executor/execQual.c b/src/backend/executor/execQual.c
index 6e7daa40e8f..27e764c19a9 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.226 2008/01/01 19:45:49 momjian Exp $
+ * $PostgreSQL: pgsql/src/backend/executor/execQual.c,v 1.226.2.1 2008/11/15 20:53:40 petere Exp $
*
*-------------------------------------------------------------------------
*/
@@ -2848,13 +2848,10 @@ ExecEvalXml(XmlExprState *xmlExpr, ExprContext *econtext,
bool *isNull, ExprDoneCond *isDone)
{
XmlExpr *xexpr = (XmlExpr *) xmlExpr->xprstate.expr;
- text *result;
- StringInfoData buf;
Datum value;
bool isnull;
ListCell *arg;
ListCell *narg;
- int i;
if (isDone)
*isDone = ExprSingleResult;
@@ -2880,12 +2877,16 @@ ExecEvalXml(XmlExprState *xmlExpr, ExprContext *econtext,
*isNull = false;
return PointerGetDatum(xmlconcat(values));
}
+ else
+ return (Datum) 0;
}
break;
case IS_XMLFOREST:
+ {
+ StringInfoData buf;
+
initStringInfo(&buf);
- i = 0;
forboth(arg, xmlExpr->named_args, narg, xexpr->arg_names)
{
ExprState *e = (ExprState *) lfirst(arg);
@@ -2900,11 +2901,30 @@ ExecEvalXml(XmlExprState *xmlExpr, ExprContext *econtext,
argname);
*isNull = false;
}
- i++;
}
+
+ if (*isNull)
+ {
+ pfree(buf.data);
+ return (Datum) 0;
+ }
+ else
+ {
+ int len;
+ text *result;
+
+ len = buf.len + VARHDRSZ;
+
+ result = palloc(len);
+ SET_VARSIZE(result, len);
+ memcpy(VARDATA(result), buf.data, buf.len);
+ pfree(buf.data);
+
+ return PointerGetDatum(result);
+ }
+ }
break;
- /* The remaining cases don't need to set up buf */
case IS_XMLELEMENT:
*isNull = false;
return PointerGetDatum(xmlelement(xmlExpr, econtext));
@@ -3039,19 +3059,8 @@ ExecEvalXml(XmlExprState *xmlExpr, ExprContext *econtext,
break;
}
- if (*isNull)
- result = NULL;
- else
- {
- int len = buf.len + VARHDRSZ;
-
- result = palloc(len);
- SET_VARSIZE(result, len);
- memcpy(VARDATA(result), buf.data, buf.len);
- }
-
- pfree(buf.data);
- return PointerGetDatum(result);
+ elog(ERROR, "unrecognized XML operation");
+ return (Datum) 0;
}
/* ----------------------------------------------------------------
diff --git a/src/test/regress/expected/xml.out b/src/test/regress/expected/xml.out
index 45d82c7dda8..3bfefcd9f94 100644
--- a/src/test/regress/expected/xml.out
+++ b/src/test/regress/expected/xml.out
@@ -71,6 +71,18 @@ SELECT xmlconcat('', NULL, '
(1 row)
+SELECT xmlconcat(NULL);
+ xmlconcat
+-----------
+
+(1 row)
+
+SELECT xmlconcat(NULL, NULL);
+ xmlconcat
+-----------
+
+(1 row)
+
SELECT xmlelement(name element,
xmlattributes (1 as one, 'deuce' as two),
'content');
diff --git a/src/test/regress/expected/xml_1.out b/src/test/regress/expected/xml_1.out
index 76455919fc0..d6a7c31e93c 100644
--- a/src/test/regress/expected/xml_1.out
+++ b/src/test/regress/expected/xml_1.out
@@ -63,6 +63,18 @@ SELECT xmlconcat('', NULL, '', NULL, '');
SELECT xmlconcat('', NULL, '');
+SELECT xmlconcat(NULL);
+SELECT xmlconcat(NULL, NULL);
SELECT xmlelement(name element,