Fix crash of xmlconcat(NULL)
authorPeter Eisentraut <peter_e@gmx.net>
Sat, 15 Nov 2008 20:53:40 +0000 (20:53 +0000)
committerPeter Eisentraut <peter_e@gmx.net>
Sat, 15 Nov 2008 20:53:40 +0000 (20:53 +0000)
backpatch from 8.4devel

src/backend/executor/execQual.c
src/test/regress/expected/xml.out
src/test/regress/expected/xml_1.out
src/test/regress/sql/xml.sql

index 6e7daa40e8fe7ed8b0bf8d2cdb11ac199fc34866..27e764c19a970d7d8a500ff29a957780a624e9f4 100644 (file)
@@ -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;
 }
 
 /* ----------------------------------------------------------------
index 45d82c7dda8ae8c1e9e93051725c4fe3171dc983..3bfefcd9f943e908d7351ff554b95795fe088eb8 100644 (file)
@@ -71,6 +71,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');
index 76455919fc0567a804914678e747b5179d1ba8c5..d6a7c31e93c19f5767aeb38d70e4f6017f5b2ff2 100644 (file)
@@ -63,6 +63,18 @@ SELECT xmlconcat('<?xml version="1.1"?><foo/>', NULL, '<?xml version="1.1" stand
 ERROR:  unsupported XML feature
 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');
index cae45dd28cb4dba8b7b6abde1a4cbb8bbcd9145e..edf639b8c53ffed4e1cd98a3c765ed1b711c1369 100644 (file)
@@ -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,