Add support for per-column OPTIONS clause in CREATE FOREIGN TABLE statement.
authorShigeru Hanada <hanada@metrosystems.co.jp>
Thu, 9 Jun 2011 04:30:04 +0000 (13:30 +0900)
committerShigeru Hanada <shigeru.hanada@gmail.com>
Mon, 20 Jun 2011 04:32:03 +0000 (13:32 +0900)
src/backend/nodes/copyfuncs.c
src/backend/nodes/outfuncs.c
src/backend/parser/gram.y
src/backend/parser/parse_utilcmd.c
src/include/nodes/parsenodes.h
src/test/regress/expected/foreign_data.out

index c9133ddfa19b4a314180e3f20e81f58537e54329..148110f4b9549a427c50043a58d21b6cf885a018 100644 (file)
@@ -2312,6 +2312,7 @@ _copyColumnDef(ColumnDef *from)
    COPY_NODE_FIELD(collClause);
    COPY_SCALAR_FIELD(collOid);
    COPY_NODE_FIELD(constraints);
+   COPY_NODE_FIELD(fdwoptions);
 
    return newnode;
 }
index 681f5f85bc740ba6ab1922941eaac6e58bb5e0b3..cb9be13d8f46386be5b4ab1a5b632d35822d3780 100644 (file)
@@ -2101,6 +2101,7 @@ _outColumnDef(StringInfo str, ColumnDef *node)
    WRITE_NODE_FIELD(collClause);
    WRITE_OID_FIELD(collOid);
    WRITE_NODE_FIELD(constraints);
+   WRITE_NODE_FIELD(fdwoptions);
 }
 
 static void
index 1ff61e093964889a903dde0c0c3fda50808d0420..da569592a71c4c460f54afceb2942f199b4769ae 100644 (file)
@@ -2506,7 +2506,7 @@ TypedTableElement:
            | TableConstraint                   { $$ = $1; }
        ;
 
-columnDef: ColId Typename ColQualList
+columnDef: ColId Typename create_generic_options ColQualList
                {
                    ColumnDef *n = makeNode(ColumnDef);
                    n->colname = $1;
@@ -2519,7 +2519,8 @@ columnDef:    ColId Typename ColQualList
                    n->raw_default = NULL;
                    n->cooked_default = NULL;
                    n->collOid = InvalidOid;
-                   SplitColQualList($3, &n->constraints, &n->collClause,
+                   n->fdwoptions = $3;
+                   SplitColQualList($4, &n->constraints, &n->collClause,
                                     yyscanner);
                    $$ = (Node *)n;
                }
index 51899c6b5b4d342edc22dd6ed374bcf24a19a2a3..1600673af002e12eeee3de53f56b40b01cb28419 100644 (file)
@@ -548,6 +548,38 @@ transformColumnDefinition(CreateStmtContext *cxt, ColumnDef *column)
                break;
        }
    }
+
+   /*
+    * Generate ALTER FOREIGN TABLE ALTER COLUMN statement which adds 
+    * per-column generic options for this column.
+    */
+   if (column->fdwoptions != NIL)
+   {
+       AlterTableStmt *stmt;
+       AlterTableCmd  *cmd;
+
+       cmd = makeNode(AlterTableCmd);
+       cmd->subtype = AT_AlterColumnGenericOptions;
+       cmd->name = column->colname;
+       cmd->def = (Node *) column->fdwoptions;
+       cmd->behavior = DROP_RESTRICT;
+       cmd->missing_ok = false;
+       cmd->validated = true;
+
+       stmt = makeNode(AlterTableStmt);
+       stmt->relation = cxt->relation;
+       stmt->cmds = NIL;
+       stmt->relkind = OBJECT_FOREIGN_TABLE;
+       stmt->cmds = lappend(stmt->cmds, cmd);
+
+       cxt->alist = lappend(cxt->alist, stmt);
+
+       foreach (clist, column->fdwoptions)
+       {
+           DefElem        *option = (DefElem *) lfirst(clist);
+           elog(DEBUG3, "%s=%s", option->defname, strVal(option->arg));
+       }
+   }
 }
 
 /*
index 970240cf2816a22afb5d0a16d91569b81e2a6db5..19dff9bfc3493e537c9fda2fcc0a9570f8c9e87d 100644 (file)
@@ -500,6 +500,7 @@ typedef struct ColumnDef
    CollateClause *collClause;  /* untransformed COLLATE spec, if any */
    Oid         collOid;        /* collation OID (InvalidOid if not set) */
    List       *constraints;    /* other constraints on column */
+   List       *fdwoptions;     /* per-column FDW options */
 } ColumnDef;
 
 /*
index 2325253096e9e44f27eb72cb78ef733e11e7a23b..57da7eac83703667f21ce85ba21c5933ef7e99e1 100644 (file)
@@ -704,7 +704,7 @@ ALTER FOREIGN TABLE ft1 ALTER COLUMN c7 OPTIONS (ADD p1 'v1', ADD p2 'v2'),
                         ALTER COLUMN c8 OPTIONS (ADD p1 'v1', ADD p2 'v2');
 ALTER FOREIGN TABLE ft1 ALTER COLUMN c8 OPTIONS (SET p2 'V2', DROP p1);
 \dec+
-      List of foreign table columns
+            List of foreign table columns
  Schema | Table | Column |          Options          
 --------+-------+--------+---------------------------
  public | ft1   | c1     | {param1=val1}