Commit 8aad333f authored by Peter Eisentraut's avatar Peter Eisentraut

Fix crash of xmlconcat(NULL)

also backpatched to 8.3
parent 0656ed3d
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/executor/execQual.c,v 1.236 2008/10/31 19:37:56 tgl Exp $ * $PostgreSQL: pgsql/src/backend/executor/execQual.c,v 1.237 2008/11/15 20:52:35 petere Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -3163,13 +3163,10 @@ ExecEvalXml(XmlExprState *xmlExpr, ExprContext *econtext, ...@@ -3163,13 +3163,10 @@ ExecEvalXml(XmlExprState *xmlExpr, ExprContext *econtext,
bool *isNull, ExprDoneCond *isDone) bool *isNull, ExprDoneCond *isDone)
{ {
XmlExpr *xexpr = (XmlExpr *) xmlExpr->xprstate.expr; XmlExpr *xexpr = (XmlExpr *) xmlExpr->xprstate.expr;
text *result;
StringInfoData buf;
Datum value; Datum value;
bool isnull; bool isnull;
ListCell *arg; ListCell *arg;
ListCell *narg; ListCell *narg;
int i;
if (isDone) if (isDone)
*isDone = ExprSingleResult; *isDone = ExprSingleResult;
...@@ -3195,12 +3192,16 @@ ExecEvalXml(XmlExprState *xmlExpr, ExprContext *econtext, ...@@ -3195,12 +3192,16 @@ ExecEvalXml(XmlExprState *xmlExpr, ExprContext *econtext,
*isNull = false; *isNull = false;
return PointerGetDatum(xmlconcat(values)); return PointerGetDatum(xmlconcat(values));
} }
else
return (Datum) 0;
} }
break; break;
case IS_XMLFOREST: case IS_XMLFOREST:
{
StringInfoData buf;
initStringInfo(&buf); initStringInfo(&buf);
i = 0;
forboth(arg, xmlExpr->named_args, narg, xexpr->arg_names) forboth(arg, xmlExpr->named_args, narg, xexpr->arg_names)
{ {
ExprState *e = (ExprState *) lfirst(arg); ExprState *e = (ExprState *) lfirst(arg);
...@@ -3215,11 +3216,25 @@ ExecEvalXml(XmlExprState *xmlExpr, ExprContext *econtext, ...@@ -3215,11 +3216,25 @@ ExecEvalXml(XmlExprState *xmlExpr, ExprContext *econtext,
argname); argname);
*isNull = false; *isNull = false;
} }
i++;
} }
if (*isNull)
{
pfree(buf.data);
return (Datum) 0;
}
else
{
text *result;
result = cstring_to_text_with_len(buf.data, buf.len);
pfree(buf.data);
return PointerGetDatum(result);
}
}
break; break;
/* The remaining cases don't need to set up buf */
case IS_XMLELEMENT: case IS_XMLELEMENT:
*isNull = false; *isNull = false;
return PointerGetDatum(xmlelement(xmlExpr, econtext)); return PointerGetDatum(xmlelement(xmlExpr, econtext));
...@@ -3354,13 +3369,8 @@ ExecEvalXml(XmlExprState *xmlExpr, ExprContext *econtext, ...@@ -3354,13 +3369,8 @@ ExecEvalXml(XmlExprState *xmlExpr, ExprContext *econtext,
break; break;
} }
if (*isNull) elog(ERROR, "unrecognized XML operation");
result = NULL; return (Datum) 0;
else
result = cstring_to_text_with_len(buf.data, buf.len);
pfree(buf.data);
return PointerGetDatum(result);
} }
/* ---------------------------------------------------------------- /* ----------------------------------------------------------------
......
...@@ -77,6 +77,18 @@ SELECT xmlconcat('<?xml version="1.1"?><foo/>', NULL, '<?xml version="1.1" stand ...@@ -77,6 +77,18 @@ SELECT xmlconcat('<?xml version="1.1"?><foo/>', NULL, '<?xml version="1.1" stand
<?xml version="1.1"?><foo/><bar/> <?xml version="1.1"?><foo/><bar/>
(1 row) (1 row)
SELECT xmlconcat(NULL);
xmlconcat
-----------
(1 row)
SELECT xmlconcat(NULL, NULL);
xmlconcat
-----------
(1 row)
SELECT xmlelement(name element, SELECT xmlelement(name element,
xmlattributes (1 as one, 'deuce' as two), xmlattributes (1 as one, 'deuce' as two),
'content'); 'content');
......
...@@ -79,6 +79,18 @@ LINE 1: SELECT xmlconcat('<?xml version="1.1"?><foo/>', NULL, '<?xml... ...@@ -79,6 +79,18 @@ LINE 1: SELECT xmlconcat('<?xml version="1.1"?><foo/>', NULL, '<?xml...
^ ^
DETAIL: This functionality requires the server to be built with libxml support. DETAIL: This functionality requires the server to be built with libxml support.
HINT: You need to rebuild PostgreSQL using --with-libxml. HINT: You need to rebuild PostgreSQL using --with-libxml.
SELECT xmlconcat(NULL);
xmlconcat
-----------
(1 row)
SELECT xmlconcat(NULL, NULL);
xmlconcat
-----------
(1 row)
SELECT xmlelement(name element, SELECT xmlelement(name element,
xmlattributes (1 as one, 'deuce' as two), xmlattributes (1 as one, 'deuce' as two),
'content'); 'content');
......
...@@ -26,6 +26,8 @@ SELECT xmlconcat(1, 2); ...@@ -26,6 +26,8 @@ SELECT xmlconcat(1, 2);
SELECT xmlconcat('bad', '<syntax'); SELECT xmlconcat('bad', '<syntax');
SELECT xmlconcat('<foo/>', NULL, '<?xml version="1.1" standalone="no"?><bar/>'); SELECT xmlconcat('<foo/>', NULL, '<?xml version="1.1" standalone="no"?><bar/>');
SELECT xmlconcat('<?xml version="1.1"?><foo/>', NULL, '<?xml version="1.1" standalone="no"?><bar/>'); SELECT xmlconcat('<?xml version="1.1"?><foo/>', NULL, '<?xml version="1.1" standalone="no"?><bar/>');
SELECT xmlconcat(NULL);
SELECT xmlconcat(NULL, NULL);
SELECT xmlelement(name element, SELECT xmlelement(name element,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment