From: Shigeru Hanada Date: Thu, 9 Jun 2011 04:30:04 +0000 (+0900) Subject: Add support for per-column OPTIONS clause in CREATE FOREIGN TABLE statement. X-Git-Url: http://waps.l3s.uni-hannover.de/gitweb/?a=commitdiff_plain;h=b0c13cacfa80eb02ba05d651d7f7b81b139dc851;p=users%2Fhanada%2Fpostgres.git Add support for per-column OPTIONS clause in CREATE FOREIGN TABLE statement. --- diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c index c9133ddfa1..148110f4b9 100644 --- a/src/backend/nodes/copyfuncs.c +++ b/src/backend/nodes/copyfuncs.c @@ -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; } diff --git a/src/backend/nodes/outfuncs.c b/src/backend/nodes/outfuncs.c index 681f5f85bc..cb9be13d8f 100644 --- a/src/backend/nodes/outfuncs.c +++ b/src/backend/nodes/outfuncs.c @@ -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 diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y index 1ff61e0939..da569592a7 100644 --- a/src/backend/parser/gram.y +++ b/src/backend/parser/gram.y @@ -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; } diff --git a/src/backend/parser/parse_utilcmd.c b/src/backend/parser/parse_utilcmd.c index 51899c6b5b..1600673af0 100644 --- a/src/backend/parser/parse_utilcmd.c +++ b/src/backend/parser/parse_utilcmd.c @@ -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)); + } + } } /* diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 970240cf28..19dff9bfc3 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -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; /* diff --git a/src/test/regress/expected/foreign_data.out b/src/test/regress/expected/foreign_data.out index 2325253096..57da7eac83 100644 --- a/src/test/regress/expected/foreign_data.out +++ b/src/test/regress/expected/foreign_data.out @@ -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}