From 8aad333f8f6dbf2ed60b3b975d8bd15a6bf75718 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Sat, 15 Nov 2008 20:52:35 +0000 Subject: [PATCH] Fix crash of xmlconcat(NULL) also backpatched to 8.3 --- src/backend/executor/execQual.c | 38 ++++++++++++++++++----------- src/test/regress/expected/xml.out | 12 +++++++++ src/test/regress/expected/xml_1.out | 12 +++++++++ src/test/regress/sql/xml.sql | 2 ++ 4 files changed, 50 insertions(+), 14 deletions(-) diff --git a/src/backend/executor/execQual.c b/src/backend/executor/execQual.c index 4af50bebd7..87343b1c4e 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.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, 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; @@ -3195,12 +3192,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); @@ -3215,11 +3216,25 @@ ExecEvalXml(XmlExprState *xmlExpr, ExprContext *econtext, argname); *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; - /* The remaining cases don't need to set up buf */ case IS_XMLELEMENT: *isNull = false; return PointerGetDatum(xmlelement(xmlExpr, econtext)); @@ -3354,13 +3369,8 @@ ExecEvalXml(XmlExprState *xmlExpr, ExprContext *econtext, break; } - if (*isNull) - result = NULL; - else - result = cstring_to_text_with_len(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 fe5ccb8adc..f0c4d0a05c 100644 --- a/src/test/regress/expected/xml.out +++ b/src/test/regress/expected/xml.out @@ -77,6 +77,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 596031dd13..bfa3d612c5 100644 --- a/src/test/regress/expected/xml_1.out +++ b/src/test/regress/expected/xml_1.out @@ -79,6 +79,18 @@ LINE 1: SELECT xmlconcat('', NULL, '', NULL, ''); SELECT xmlconcat('', NULL, ''); +SELECT xmlconcat(NULL); +SELECT xmlconcat(NULL, NULL); SELECT xmlelement(name element, -- 2.40.0