]> 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:39:51 +0000 (13:39 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Fri, 19 Oct 2012 17:39:51 +0000 (13:39 -0400)
Per bug #7615 from Marko Tiikkaja.  Apparently nobody ever tried this
case before ...

src/backend/utils/adt/ruleutils.c

index c3ede233bcdb6043db5df2502c871cf030e0fc5f..b7aff1189b26909a7bc6b0db6c40685ba419f6f4 100644 (file)
@@ -3690,8 +3690,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)
        {
@@ -3725,7 +3725,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));
 
        /*
@@ -3742,6 +3742,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);
@@ -3778,7 +3780,8 @@ get_insert_query_def(Query *query, deparse_context *context)
                                                                                                           context, true));
                }
        }
-       appendStringInfo(buf, ") ");
+       if (query->targetList)
+               appendStringInfo(buf, ") ");
 
        if (select_rte)
        {
@@ -3791,7 +3794,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 (",
@@ -3799,6 +3802,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)