Fix ruleutils to print "INSERT INTO foo DEFAULT VALUES" correctly.
authorTom Lane
Fri, 19 Oct 2012 17:40:14 +0000 (13:40 -0400)
committerTom Lane
Fri, 19 Oct 2012 17:40:14 +0000 (13:40 -0400)
Per bug #7615 from Marko Tiikkaja.  Apparently nobody ever tried this
case before ...

src/backend/utils/adt/ruleutils.c

index 1e83218952b35f4f2bafc3d83435d7e1d4bd6c8c..873c19116093899f179a2fdc69bf0bbfe9bf40b9 100644 (file)
@@ -3196,8 +3196,8 @@ get_insert_query_def(Query *query, deparse_context *context)
    List       *strippedexprs;
 
    /*
-    * If it's an INSERT ... SELECT or VALUES (...), (...), ... there will be
-    * a single RTE for the SELECT or VALUES.
+    * If it's an INSERT ... SELECT or multi-row VALUES, there will be a
+    * single RTE for the SELECT or VALUES.  Plain VALUES has neither.
     */
    foreach(l, query->rtable)
    {
@@ -3231,7 +3231,7 @@ get_insert_query_def(Query *query, deparse_context *context)
        context->indentLevel += PRETTYINDENT_STD;
        appendStringInfoChar(buf, ' ');
    }
-   appendStringInfo(buf, "INSERT INTO %s (",
+   appendStringInfo(buf, "INSERT INTO %s ",
                     generate_relation_name(rte->relid, NIL));
 
    /*
@@ -3248,6 +3248,8 @@ get_insert_query_def(Query *query, deparse_context *context)
        values_cell = NULL;
    strippedexprs = NIL;
    sep = "";
+   if (query->targetList)
+       appendStringInfoChar(buf, '(');
    foreach(l, query->targetList)
    {
        TargetEntry *tle = (TargetEntry *) lfirst(l);
@@ -3284,7 +3286,8 @@ get_insert_query_def(Query *query, deparse_context *context)
                                                       context, true));
        }
    }
-   appendStringInfo(buf, ") ");
+   if (query->targetList)
+       appendStringInfo(buf, ") ");
 
    if (select_rte)
    {
@@ -3299,7 +3302,7 @@ get_insert_query_def(Query *query, deparse_context *context)
        /* Add the multi-VALUES expression lists */
        get_values_def(values_rte->values_lists, context);
    }
-   else
+   else if (strippedexprs)
    {
        /* A WITH clause is possible here */
        get_with_clause(query, context);
@@ -3309,6 +3312,11 @@ get_insert_query_def(Query *query, deparse_context *context)
        get_rule_expr((Node *) strippedexprs, context, false);
        appendStringInfoChar(buf, ')');
    }
+   else
+   {
+       /* No expressions, so it must be DEFAULT VALUES */
+       appendStringInfo(buf, "DEFAULT VALUES");
+   }
 
    /* Add RETURNING if present */
    if (query->returningList)