Avoid generating bad remote SQL for INSERT ... DEFAULT VALUES.
authorTom Lane <tgl@sss.pgh.pa.us>
Mon, 11 Mar 2013 18:26:05 +0000 (14:26 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Mon, 11 Mar 2013 18:26:05 +0000 (14:26 -0400)
"INSERT INTO foo() VALUES ()" is invalid syntax, so don't do that.

contrib/postgres_fdw/deparse.c

index d667c997609bee89adb09b2f1c041c70dba0bd82..f5d723cc38aacf4502f61d2d16b73d2a98685216 100644 (file)
@@ -505,38 +505,44 @@ deparseInsertSql(StringInfo buf, PlannerInfo *root, Index rtindex,
 
    appendStringInfoString(buf, "INSERT INTO ");
    deparseRelation(buf, rte->relid);
-   appendStringInfoString(buf, "(");
 
-   first = true;
-   foreach(lc, targetAttrs)
+   if (targetAttrs)
    {
-       int         attnum = lfirst_int(lc);
-       Form_pg_attribute attr = tupdesc->attrs[attnum - 1];
+       appendStringInfoString(buf, "(");
 
-       Assert(!attr->attisdropped);
+       first = true;
+       foreach(lc, targetAttrs)
+       {
+           int         attnum = lfirst_int(lc);
+           Form_pg_attribute attr = tupdesc->attrs[attnum - 1];
 
-       if (!first)
-           appendStringInfoString(buf, ", ");
-       first = false;
+           Assert(!attr->attisdropped);
 
-       deparseColumnRef(buf, rtindex, attnum, root);
-   }
+           if (!first)
+               appendStringInfoString(buf, ", ");
+           first = false;
 
-   appendStringInfoString(buf, ") VALUES (");
+           deparseColumnRef(buf, rtindex, attnum, root);
+       }
 
-   pindex = 1;
-   first = true;
-   foreach(lc, targetAttrs)
-   {
-       if (!first)
-           appendStringInfoString(buf, ", ");
-       first = false;
+       appendStringInfoString(buf, ") VALUES (");
 
-       appendStringInfo(buf, "$%d", pindex);
-       pindex++;
-   }
+       pindex = 1;
+       first = true;
+       foreach(lc, targetAttrs)
+       {
+           if (!first)
+               appendStringInfoString(buf, ", ");
+           first = false;
+
+           appendStringInfo(buf, "$%d", pindex);
+           pindex++;
+       }
 
-   appendStringInfoString(buf, ")");
+       appendStringInfoString(buf, ")");
+   }
+   else
+       appendStringInfoString(buf, " DEFAULT VALUES");
 
    if (returningList)
        deparseReturningList(buf, root, rtindex, rel, returningList);