diff options
| author | Bruce Momjian | 2006-06-27 03:43:20 +0000 |
|---|---|---|
| committer | Bruce Momjian | 2006-06-27 03:43:20 +0000 |
| commit | dc2c25fc6246866ce809a8b6bf1d2a2856334b54 (patch) | |
| tree | 4674e3a5b63f72f1bc0805c05d14b908b0dd589c /src/backend/parser | |
| parent | 62f2693688205bdfc5d61b905b70f3aad8234c5c (diff) | |
Add INCLUDING CONSTRAINTS to CREATE TABLE LIKE.
Greg Stark
Diffstat (limited to 'src/backend/parser')
| -rw-r--r-- | src/backend/parser/analyze.c | 64 | ||||
| -rw-r--r-- | src/backend/parser/gram.y | 32 | ||||
| -rw-r--r-- | src/backend/parser/keywords.c | 3 |
3 files changed, 83 insertions, 16 deletions
diff --git a/src/backend/parser/analyze.c b/src/backend/parser/analyze.c index 4e30d2b96f3..8b9b9eab536 100644 --- a/src/backend/parser/analyze.c +++ b/src/backend/parser/analyze.c @@ -6,7 +6,7 @@ * Portions Copyright (c) 1996-2006, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/backend/parser/analyze.c,v 1.335 2006/06/21 18:30:11 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/parser/analyze.c,v 1.336 2006/06/27 03:43:20 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -21,6 +21,7 @@ #include "catalog/pg_type.h" #include "commands/defrem.h" #include "commands/prepare.h" +#include "commands/tablecmds.h" #include "miscadmin.h" #include "nodes/makefuncs.h" #include "optimizer/clauses.h" @@ -1075,6 +1076,11 @@ transformInhRelation(ParseState *pstate, CreateStmtContext *cxt, TupleConstr *constr; AclResult aclresult; + bool including_defaults = false; + bool including_constraints = false; + bool including_indexes = false; + ListCell *elem; + relation = heap_openrv(inhRelation->relation, AccessShareLock); if (relation->rd_rel->relkind != RELKIND_RELATION) @@ -1095,6 +1101,37 @@ transformInhRelation(ParseState *pstate, CreateStmtContext *cxt, tupleDesc = RelationGetDescr(relation); constr = tupleDesc->constr; + foreach(elem, inhRelation->options) + { + int option = lfirst_int(elem); + switch (option) + { + case CREATE_TABLE_LIKE_INCLUDING_DEFAULTS: + including_defaults = true; + break; + case CREATE_TABLE_LIKE_EXCLUDING_DEFAULTS: + including_defaults = false; + break; + case CREATE_TABLE_LIKE_INCLUDING_CONSTRAINTS: + including_constraints = true; + break; + case CREATE_TABLE_LIKE_EXCLUDING_CONSTRAINTS: + including_constraints = false; + break; + case CREATE_TABLE_LIKE_INCLUDING_INDEXES: + including_indexes = true; + break; + case CREATE_TABLE_LIKE_EXCLUDING_INDEXES: + including_indexes = false; + break; + default: + elog(ERROR, "unrecognized CREATE TABLE LIKE option: %d", option); + } + } + + if (including_indexes) + elog(ERROR, "TODO"); + /* * Insert the inherited attributes into the cxt for the new table * definition. @@ -1123,7 +1160,7 @@ transformInhRelation(ParseState *pstate, CreateStmtContext *cxt, def->typename = makeTypeNameFromOid(attribute->atttypid, attribute->atttypmod); def->inhcount = 0; - def->is_local = false; + def->is_local = true; def->is_not_null = attribute->attnotnull; def->raw_default = NULL; def->cooked_default = NULL; @@ -1138,7 +1175,7 @@ transformInhRelation(ParseState *pstate, CreateStmtContext *cxt, /* * Copy default if any, and the default has been requested */ - if (attribute->atthasdef && inhRelation->including_defaults) + if (attribute->atthasdef && including_defaults) { char *this_default = NULL; AttrDefault *attrdef; @@ -1165,6 +1202,27 @@ transformInhRelation(ParseState *pstate, CreateStmtContext *cxt, def->cooked_default = pstrdup(this_default); } } + + if (including_constraints && tupleDesc->constr) { + int ccnum; + AttrNumber *attmap = varattnos_map_schema(tupleDesc, cxt->columns); + + for(ccnum = 0; ccnum < tupleDesc->constr->num_check; ccnum++) { + char *ccname = tupleDesc->constr->check[ccnum].ccname; + char *ccbin = tupleDesc->constr->check[ccnum].ccbin; + Node *ccbin_node = stringToNode(ccbin); + Constraint *n = makeNode(Constraint); + + change_varattnos_of_a_node(ccbin_node, attmap); + + n->contype = CONSTR_CHECK; + n->name = pstrdup(ccname); + n->raw_expr = ccbin_node; + n->cooked_expr = NULL; + n->indexspace = NULL; + cxt->ckconstraints = lappend(cxt->ckconstraints, (Node*)n); + } + } /* * Close the parent rel, but keep our AccessShareLock on it until xact diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y index 14f8b433481..246d1ef3a33 100644 --- a/src/backend/parser/gram.y +++ b/src/backend/parser/gram.y @@ -11,7 +11,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/parser/gram.y,v 2.547 2006/06/16 23:50:48 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/parser/gram.y,v 2.548 2006/06/27 03:43:20 momjian Exp $ * * HISTORY * AUTHOR DATE MAJOR EVENT @@ -193,8 +193,6 @@ static void doNegateFloat(Value *v); opt_grant_grant_option opt_grant_admin_option opt_nowait opt_if_exists -%type <boolean> like_including_defaults - %type <list> OptRoleList %type <defelt> OptRoleElem @@ -335,7 +333,9 @@ static void doNegateFloat(Value *v); %type <keyword> unreserved_keyword func_name_keyword %type <keyword> col_name_keyword reserved_keyword -%type <node> TableConstraint TableLikeClause +%type <node> TableConstraint TableLikeClause +%type <list> TableLikeOptionList +%type <ival> TableLikeOption %type <list> ColQualList %type <node> ColConstraint ColConstraintElem ConstraintAttr %type <ival> key_actions key_delete key_match key_update key_action @@ -385,7 +385,7 @@ static void doNegateFloat(Value *v); HANDLER HAVING HEADER_P HOLD HOUR_P IF_P ILIKE IMMEDIATE IMMUTABLE IMPLICIT_P IN_P INCLUDING INCREMENT - INDEX INHERIT INHERITS INITIALLY INNER_P INOUT INPUT_P + INDEX INDEXES INHERIT INHERITS INITIALLY INNER_P INOUT INPUT_P INSENSITIVE INSERT INSTEAD INT_P INTEGER INTERSECT INTERVAL INTO INVOKER IS ISNULL ISOLATION @@ -1994,20 +1994,27 @@ ConstraintAttr: * which is a part of SQL 200N */ TableLikeClause: - LIKE qualified_name like_including_defaults + LIKE qualified_name TableLikeOptionList { InhRelation *n = makeNode(InhRelation); n->relation = $2; - n->including_defaults = $3; - + n->options = $3; $$ = (Node *)n; } ; -like_including_defaults: - INCLUDING DEFAULTS { $$ = true; } - | EXCLUDING DEFAULTS { $$ = false; } - | /* EMPTY */ { $$ = false; } +TableLikeOptionList: + TableLikeOptionList TableLikeOption { $$ = lappend_int($1, $2); } + | /* EMPTY */ { $$ = NIL; } + ; + +TableLikeOption: + INCLUDING DEFAULTS { $$ = CREATE_TABLE_LIKE_INCLUDING_DEFAULTS; } + | EXCLUDING DEFAULTS { $$ = CREATE_TABLE_LIKE_EXCLUDING_DEFAULTS; } + | INCLUDING CONSTRAINTS { $$ = CREATE_TABLE_LIKE_INCLUDING_CONSTRAINTS; } + | EXCLUDING CONSTRAINTS { $$ = CREATE_TABLE_LIKE_EXCLUDING_CONSTRAINTS; } + | INCLUDING INDEXES { $$ = CREATE_TABLE_LIKE_INCLUDING_INDEXES; } + | EXCLUDING INDEXES { $$ = CREATE_TABLE_LIKE_EXCLUDING_INDEXES; } ; @@ -8507,6 +8514,7 @@ unreserved_keyword: | INCLUDING | INCREMENT | INDEX + | INDEXES | INHERIT | INHERITS | INPUT_P diff --git a/src/backend/parser/keywords.c b/src/backend/parser/keywords.c index 4b1a53762ef..6a022f585db 100644 --- a/src/backend/parser/keywords.c +++ b/src/backend/parser/keywords.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/parser/keywords.c,v 1.171 2006/03/05 15:58:32 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/parser/keywords.c,v 1.172 2006/06/27 03:43:20 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -169,6 +169,7 @@ static const ScanKeyword ScanKeywords[] = { {"including", INCLUDING}, {"increment", INCREMENT}, {"index", INDEX}, + {"indexes", INDEXES}, {"inherit", INHERIT}, {"inherits", INHERITS}, {"initially", INITIALLY}, |
