]> granicus.if.org Git - postgresql/commitdiff
Fix crash of xmlconcat(NULL)
authorPeter Eisentraut <peter_e@gmx.net>
Sat, 15 Nov 2008 20:52:35 +0000 (20:52 +0000)
committerPeter Eisentraut <peter_e@gmx.net>
Sat, 15 Nov 2008 20:52:35 +0000 (20:52 +0000)
also backpatched to 8.3

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 4af50bebd77feabb1d9ea64a1bafb5d9634f33a8..87343b1c4e8526cf6dac48a05441bcb43e6eaf66 100644 (file)
@@ -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;
 }
 
 /* ----------------------------------------------------------------
index fe5ccb8adc1a9e1c483b2ace9419f08be55c865e..f0c4d0a05c80f5fb8f51e40b105c96545bc6eb9c 100644 (file)
@@ -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');
index 596031dd13e7e4f59f0300d53bd9773b28d7e13b..bfa3d612c5081e27f0ab25e401f56df14335b5b8 100644 (file)
@@ -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');
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,