Fix crash of xmlconcat(NULL)
authorPeter Eisentraut
Sat, 15 Nov 2008 20:52:35 +0000 (20:52 +0000)
committerPeter Eisentraut
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('', 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');
index 596031dd13e7e4f59f0300d53bd9773b28d7e13b..bfa3d612c5081e27f0ab25e401f56df14335b5b8 100644 (file)
@@ -79,6 +79,18 @@ LINE 1: SELECT xmlconcat('', NULL, '
                          ^
 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', '
 SELECT xmlconcat('', NULL, '');
 SELECT xmlconcat('', NULL, '');
+SELECT xmlconcat(NULL);
+SELECT xmlconcat(NULL, NULL);
 
 
 SELECT xmlelement(name element,