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,