]> granicus.if.org Git - postgresql/commitdiff
Fix ruleutils to print "INSERT INTO foo DEFAULT VALUES" correctly.
authorTom Lane <tgl@sss.pgh.pa.us>
Fri, 19 Oct 2012 17:40:05 +0000 (13:40 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Fri, 19 Oct 2012 17:40:05 +0000 (13:40 -0400)
Per bug #7615 from Marko Tiikkaja.  Apparently nobody ever tried this
case before ...

src/backend/utils/adt/ruleutils.c

index 77600c33f023f57c70d05669f8482c323c3f1303..3a3f7fb71d778be54da7490e1cdacd59c4945072 100644 (file)
@@ -3390,8 +3390,8 @@ get_insert_query_def(Query *query, deparse_context *context)
        get_with_clause(query, context);
 
        /*
-        * 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)
        {
@@ -3425,7 +3425,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));
 
        /*
@@ -3442,6 +3442,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);
@@ -3478,7 +3480,8 @@ get_insert_query_def(Query *query, deparse_context *context)
                                                                                                           context, true));
                }
        }
-       appendStringInfo(buf, ") ");
+       if (query->targetList)
+               appendStringInfo(buf, ") ");
 
        if (select_rte)
        {
@@ -3491,7 +3494,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)
        {
                /* Add the single-VALUES expression list */
                appendContextKeyword(context, "VALUES (",
@@ -3499,6 +3502,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)