diff options
author | Peter Eisentraut <peter_e@gmx.net> | 2008-11-15 20:52:35 +0000 |
---|---|---|
committer | Peter Eisentraut <peter_e@gmx.net> | 2008-11-15 20:52:35 +0000 |
commit | 8aad333f8f6dbf2ed60b3b975d8bd15a6bf75718 (patch) | |
tree | ded9107f35ce9150581f409d8dcc97f9a420362b | |
parent | 0656ed3daa29b00c7c41ad44b407a7165f83d453 (diff) | |
download | postgresql-8aad333f8f6dbf2ed60b3b975d8bd15a6bf75718.tar.gz postgresql-8aad333f8f6dbf2ed60b3b975d8bd15a6bf75718.zip |
Fix crash of xmlconcat(NULL)
also backpatched to 8.3
-rw-r--r-- | src/backend/executor/execQual.c | 38 | ||||
-rw-r--r-- | src/test/regress/expected/xml.out | 12 | ||||
-rw-r--r-- | src/test/regress/expected/xml_1.out | 12 | ||||
-rw-r--r-- | 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 4af50bebd77..87343b1c4e8 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 fe5ccb8adc1..f0c4d0a05c8 100644 --- a/src/test/regress/expected/xml.out +++ b/src/test/regress/expected/xml.out @@ -77,6 +77,18 @@ SELECT xmlconcat('<?xml version="1.1"?><foo/>', NULL, '<?xml version="1.1" stand <?xml version="1.1"?><foo/><bar/> (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 596031dd13e..bfa3d612c50 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('<?xml version="1.1"?><foo/>', NULL, '<?xml... ^ DETAIL: This functionality requires the server to be built with libxml support. 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, xmlattributes (1 as one, 'deuce' as two), 'content'); diff --git a/src/test/regress/sql/xml.sql b/src/test/regress/sql/xml.sql index cae45dd28cb..edf639b8c53 100644 --- a/src/test/regress/sql/xml.sql +++ b/src/test/regress/sql/xml.sql @@ -26,6 +26,8 @@ SELECT xmlconcat(1, 2); SELECT xmlconcat('bad', '<syntax'); 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(NULL); +SELECT xmlconcat(NULL, NULL); SELECT xmlelement(name element, |