Commit dc2c25fc authored by Bruce Momjian's avatar Bruce Momjian

Add INCLUDING CONSTRAINTS to CREATE TABLE LIKE.

Greg Stark
parent 62f26936
<!-- <!--
$PostgreSQL: pgsql/doc/src/sgml/ref/create_table.sgml,v 1.100 2006/02/19 00:04:26 neilc Exp $ $PostgreSQL: pgsql/doc/src/sgml/ref/create_table.sgml,v 1.101 2006/06/27 03:43:19 momjian Exp $
PostgreSQL documentation PostgreSQL documentation
--> -->
...@@ -23,7 +23,7 @@ PostgreSQL documentation ...@@ -23,7 +23,7 @@ PostgreSQL documentation
CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } ] TABLE <replaceable class="PARAMETER">table_name</replaceable> ( [ CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } ] TABLE <replaceable class="PARAMETER">table_name</replaceable> ( [
{ <replaceable class="PARAMETER">column_name</replaceable> <replaceable class="PARAMETER">data_type</replaceable> [ DEFAULT <replaceable>default_expr</> ] [ <replaceable class="PARAMETER">column_constraint</replaceable> [ ... ] ] { <replaceable class="PARAMETER">column_name</replaceable> <replaceable class="PARAMETER">data_type</replaceable> [ DEFAULT <replaceable>default_expr</> ] [ <replaceable class="PARAMETER">column_constraint</replaceable> [ ... ] ]
| <replaceable>table_constraint</replaceable> | <replaceable>table_constraint</replaceable>
| LIKE <replaceable>parent_table</replaceable> [ { INCLUDING | EXCLUDING } DEFAULTS ] } | LIKE <replaceable>parent_table</replaceable> [ { INCLUDING | EXCLUDING } { DEFAULTS | CONSTRAINTS } ] ... }
[, ... ] [, ... ]
] ) ] )
[ INHERITS ( <replaceable>parent_table</replaceable> [, ... ] ) ] [ INHERITS ( <replaceable>parent_table</replaceable> [, ... ] ) ]
...@@ -232,7 +232,7 @@ and <replaceable class="PARAMETER">table_constraint</replaceable> is: ...@@ -232,7 +232,7 @@ and <replaceable class="PARAMETER">table_constraint</replaceable> is:
</varlistentry> </varlistentry>
<varlistentry> <varlistentry>
<term><literal>LIKE <replaceable>parent_table</replaceable> [ { INCLUDING | EXCLUDING } DEFAULTS ]</literal></term> <term><literal>LIKE <replaceable>parent_table</replaceable> [ { INCLUDING | EXCLUDING } { DEFAULTS | CONSTRAINTS } ]</literal></term>
<listitem> <listitem>
<para> <para>
The <literal>LIKE</literal> clause specifies a table from which The <literal>LIKE</literal> clause specifies a table from which
...@@ -252,6 +252,20 @@ and <replaceable class="PARAMETER">table_constraint</replaceable> is: ...@@ -252,6 +252,20 @@ and <replaceable class="PARAMETER">table_constraint</replaceable> is:
default behavior is to exclude default expressions, resulting in default behavior is to exclude default expressions, resulting in
all columns of the new table having null defaults. all columns of the new table having null defaults.
</para> </para>
<para>
Likewise constraints for the copied column definitions will only be
copied if <literal>INCLUDING CONSTRAINTS</literal> is specified. Note
that currently even when <literal>INCLUDING CONSTRAINTS</literal> is specified
only CHECK constraints are copied. Also, no distinction is made between
column constraints and table constraints -- when constraints are
requested all check constraints are copied.
</para>
<para>
Note also that unlike <literal>INHERITS<literal> copied columns and
constraints are not merged with similarly named columns and constraints.
If the same name is specified explicitly or in another
<literal>LIKE</literal> clause an error is signalled.
</para>
</listitem> </listitem>
</varlistentry> </varlistentry>
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/commands/tablecmds.c,v 1.186 2006/06/27 03:21:54 momjian Exp $ * $PostgreSQL: pgsql/src/backend/commands/tablecmds.c,v 1.187 2006/06/27 03:43:19 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -159,7 +159,7 @@ typedef struct NewColumnValue ...@@ -159,7 +159,7 @@ typedef struct NewColumnValue
static void truncate_check_rel(Relation rel); static void truncate_check_rel(Relation rel);
static List *MergeAttributes(List *schema, List *supers, bool istemp, static List *MergeAttributes(List *schema, List *supers, bool istemp,
List **supOids, List **supconstr, int *supOidCount); List **supOids, List **supconstr, int *supOidCount);
static bool change_varattnos_of_a_node(Node *node, const AttrNumber *newattno); static bool change_varattnos_walker(Node *node, const AttrNumber *newattno);
static void StoreCatalogInheritance(Oid relationId, List *supers); static void StoreCatalogInheritance(Oid relationId, List *supers);
static int findAttrByName(const char *attributeName, List *schema); static int findAttrByName(const char *attributeName, List *schema);
static void setRelhassubclassInRelation(Oid relationId, bool relhassubclass); static void setRelhassubclassInRelation(Oid relationId, bool relhassubclass);
...@@ -1106,14 +1106,59 @@ MergeAttributes(List *schema, List *supers, bool istemp, ...@@ -1106,14 +1106,59 @@ MergeAttributes(List *schema, List *supers, bool istemp,
} }
/* /*
* complementary static functions for MergeAttributes().
*
* Varattnos of pg_constraint.conbin must be rewritten when subclasses inherit * Varattnos of pg_constraint.conbin must be rewritten when subclasses inherit
* constraints from parent classes, since the inherited attributes could * constraints from parent classes, since the inherited attributes could
* be given different column numbers in multiple-inheritance cases. * be given different column numbers in multiple-inheritance cases.
* *
* Note that the passed node tree is modified in place! * Note that the passed node tree is modified in place!
*
* This function is used elsewhere such as in analyze.c
*
*/ */
void
change_varattnos_of_a_node(Node *node, const AttrNumber *newattno)
{
change_varattnos_walker(node, newattno);
}
/* Generate a map for change_varattnos_of_a_node from two tupledesc's. */
AttrNumber *
varattnos_map(TupleDesc old, TupleDesc new)
{
int i,j;
AttrNumber *attmap = palloc0(sizeof(AttrNumber)*old->natts);
for (i=1; i <= old->natts; i++) {
if (old->attrs[i-1]->attisdropped) {
attmap[i-1] = 0;
continue;
}
for (j=1; j<= new->natts; j++)
if (!strcmp(NameStr(old->attrs[i-1]->attname), NameStr(new->attrs[j-1]->attname)))
attmap[i-1] = j;
}
return attmap;
}
/* Generate a map for change_varattnos_of_a_node from a tupledesc and a list of
* ColumnDefs */
AttrNumber *
varattnos_map_schema(TupleDesc old, List *schema)
{
int i;
AttrNumber *attmap = palloc0(sizeof(AttrNumber)*old->natts);
for (i=1; i <= old->natts; i++) {
if (old->attrs[i-1]->attisdropped) {
attmap[i-1] = 0;
continue;
}
attmap[i-1] = findAttrByName(NameStr(old->attrs[i-1]->attname), schema);
}
return attmap;
}
static bool static bool
change_varattnos_walker(Node *node, const AttrNumber *newattno) change_varattnos_walker(Node *node, const AttrNumber *newattno)
{ {
...@@ -1140,12 +1185,6 @@ change_varattnos_walker(Node *node, const AttrNumber *newattno) ...@@ -1140,12 +1185,6 @@ change_varattnos_walker(Node *node, const AttrNumber *newattno)
(void *) newattno); (void *) newattno);
} }
static bool
change_varattnos_of_a_node(Node *node, const AttrNumber *newattno)
{
return change_varattnos_walker(node, newattno);
}
/* /*
* StoreCatalogInheritance * StoreCatalogInheritance
* Updates the system catalogs with proper inheritance information. * Updates the system catalogs with proper inheritance information.
......
...@@ -15,7 +15,7 @@ ...@@ -15,7 +15,7 @@
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/nodes/copyfuncs.c,v 1.336 2006/06/16 20:23:44 adunstan Exp $ * $PostgreSQL: pgsql/src/backend/nodes/copyfuncs.c,v 1.337 2006/06/27 03:43:19 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -1940,7 +1940,7 @@ _copyInhRelation(InhRelation *from) ...@@ -1940,7 +1940,7 @@ _copyInhRelation(InhRelation *from)
InhRelation *newnode = makeNode(InhRelation); InhRelation *newnode = makeNode(InhRelation);
COPY_NODE_FIELD(relation); COPY_NODE_FIELD(relation);
COPY_SCALAR_FIELD(including_defaults); COPY_NODE_FIELD(options);
return newnode; return newnode;
} }
......
...@@ -18,7 +18,7 @@ ...@@ -18,7 +18,7 @@
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/nodes/equalfuncs.c,v 1.272 2006/06/16 20:23:44 adunstan Exp $ * $PostgreSQL: pgsql/src/backend/nodes/equalfuncs.c,v 1.273 2006/06/27 03:43:20 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -884,7 +884,7 @@ static bool ...@@ -884,7 +884,7 @@ static bool
_equalInhRelation(InhRelation *a, InhRelation *b) _equalInhRelation(InhRelation *a, InhRelation *b)
{ {
COMPARE_NODE_FIELD(relation); COMPARE_NODE_FIELD(relation);
COMPARE_SCALAR_FIELD(including_defaults); COMPARE_NODE_FIELD(options);
return true; return true;
} }
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
* Portions Copyright (c) 1996-2006, PostgreSQL Global Development Group * Portions Copyright (c) 1996-2006, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California * 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 @@ ...@@ -21,6 +21,7 @@
#include "catalog/pg_type.h" #include "catalog/pg_type.h"
#include "commands/defrem.h" #include "commands/defrem.h"
#include "commands/prepare.h" #include "commands/prepare.h"
#include "commands/tablecmds.h"
#include "miscadmin.h" #include "miscadmin.h"
#include "nodes/makefuncs.h" #include "nodes/makefuncs.h"
#include "optimizer/clauses.h" #include "optimizer/clauses.h"
...@@ -1075,6 +1076,11 @@ transformInhRelation(ParseState *pstate, CreateStmtContext *cxt, ...@@ -1075,6 +1076,11 @@ transformInhRelation(ParseState *pstate, CreateStmtContext *cxt,
TupleConstr *constr; TupleConstr *constr;
AclResult aclresult; AclResult aclresult;
bool including_defaults = false;
bool including_constraints = false;
bool including_indexes = false;
ListCell *elem;
relation = heap_openrv(inhRelation->relation, AccessShareLock); relation = heap_openrv(inhRelation->relation, AccessShareLock);
if (relation->rd_rel->relkind != RELKIND_RELATION) if (relation->rd_rel->relkind != RELKIND_RELATION)
...@@ -1095,6 +1101,37 @@ transformInhRelation(ParseState *pstate, CreateStmtContext *cxt, ...@@ -1095,6 +1101,37 @@ transformInhRelation(ParseState *pstate, CreateStmtContext *cxt,
tupleDesc = RelationGetDescr(relation); tupleDesc = RelationGetDescr(relation);
constr = tupleDesc->constr; 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 * Insert the inherited attributes into the cxt for the new table
* definition. * definition.
...@@ -1123,7 +1160,7 @@ transformInhRelation(ParseState *pstate, CreateStmtContext *cxt, ...@@ -1123,7 +1160,7 @@ transformInhRelation(ParseState *pstate, CreateStmtContext *cxt,
def->typename = makeTypeNameFromOid(attribute->atttypid, def->typename = makeTypeNameFromOid(attribute->atttypid,
attribute->atttypmod); attribute->atttypmod);
def->inhcount = 0; def->inhcount = 0;
def->is_local = false; def->is_local = true;
def->is_not_null = attribute->attnotnull; def->is_not_null = attribute->attnotnull;
def->raw_default = NULL; def->raw_default = NULL;
def->cooked_default = NULL; def->cooked_default = NULL;
...@@ -1138,7 +1175,7 @@ transformInhRelation(ParseState *pstate, CreateStmtContext *cxt, ...@@ -1138,7 +1175,7 @@ transformInhRelation(ParseState *pstate, CreateStmtContext *cxt,
/* /*
* Copy default if any, and the default has been requested * 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; char *this_default = NULL;
AttrDefault *attrdef; AttrDefault *attrdef;
...@@ -1165,6 +1202,27 @@ transformInhRelation(ParseState *pstate, CreateStmtContext *cxt, ...@@ -1165,6 +1202,27 @@ transformInhRelation(ParseState *pstate, CreateStmtContext *cxt,
def->cooked_default = pstrdup(this_default); 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 * Close the parent rel, but keep our AccessShareLock on it until xact
......
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
* *
* *
* IDENTIFICATION * 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 * HISTORY
* AUTHOR DATE MAJOR EVENT * AUTHOR DATE MAJOR EVENT
...@@ -193,8 +193,6 @@ static void doNegateFloat(Value *v); ...@@ -193,8 +193,6 @@ static void doNegateFloat(Value *v);
opt_grant_grant_option opt_grant_admin_option opt_grant_grant_option opt_grant_admin_option
opt_nowait opt_if_exists opt_nowait opt_if_exists
%type <boolean> like_including_defaults
%type <list> OptRoleList %type <list> OptRoleList
%type <defelt> OptRoleElem %type <defelt> OptRoleElem
...@@ -335,7 +333,9 @@ static void doNegateFloat(Value *v); ...@@ -335,7 +333,9 @@ static void doNegateFloat(Value *v);
%type <keyword> unreserved_keyword func_name_keyword %type <keyword> unreserved_keyword func_name_keyword
%type <keyword> col_name_keyword reserved_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 <list> ColQualList
%type <node> ColConstraint ColConstraintElem ConstraintAttr %type <node> ColConstraint ColConstraintElem ConstraintAttr
%type <ival> key_actions key_delete key_match key_update key_action %type <ival> key_actions key_delete key_match key_update key_action
...@@ -385,7 +385,7 @@ static void doNegateFloat(Value *v); ...@@ -385,7 +385,7 @@ static void doNegateFloat(Value *v);
HANDLER HAVING HEADER_P HOLD HOUR_P HANDLER HAVING HEADER_P HOLD HOUR_P
IF_P ILIKE IMMEDIATE IMMUTABLE IMPLICIT_P IN_P INCLUDING INCREMENT 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 INSENSITIVE INSERT INSTEAD INT_P INTEGER INTERSECT
INTERVAL INTO INVOKER IS ISNULL ISOLATION INTERVAL INTO INVOKER IS ISNULL ISOLATION
...@@ -1994,20 +1994,27 @@ ConstraintAttr: ...@@ -1994,20 +1994,27 @@ ConstraintAttr:
* which is a part of SQL 200N * which is a part of SQL 200N
*/ */
TableLikeClause: TableLikeClause:
LIKE qualified_name like_including_defaults LIKE qualified_name TableLikeOptionList
{ {
InhRelation *n = makeNode(InhRelation); InhRelation *n = makeNode(InhRelation);
n->relation = $2; n->relation = $2;
n->including_defaults = $3; n->options = $3;
$$ = (Node *)n; $$ = (Node *)n;
} }
; ;
like_including_defaults: TableLikeOptionList:
INCLUDING DEFAULTS { $$ = true; } TableLikeOptionList TableLikeOption { $$ = lappend_int($1, $2); }
| EXCLUDING DEFAULTS { $$ = false; } | /* EMPTY */ { $$ = NIL; }
| /* EMPTY */ { $$ = false; } ;
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: ...@@ -8507,6 +8514,7 @@ unreserved_keyword:
| INCLUDING | INCLUDING
| INCREMENT | INCREMENT
| INDEX | INDEX
| INDEXES
| INHERIT | INHERIT
| INHERITS | INHERITS
| INPUT_P | INPUT_P
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * 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[] = { ...@@ -169,6 +169,7 @@ static const ScanKeyword ScanKeywords[] = {
{"including", INCLUDING}, {"including", INCLUDING},
{"increment", INCREMENT}, {"increment", INCREMENT},
{"index", INDEX}, {"index", INDEX},
{"indexes", INDEXES},
{"inherit", INHERIT}, {"inherit", INHERIT},
{"inherits", INHERITS}, {"inherits", INHERITS},
{"initially", INITIALLY}, {"initially", INITIALLY},
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* Portions Copyright (c) 1996-2006, PostgreSQL Global Development Group * Portions Copyright (c) 1996-2006, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* *
* $PostgreSQL: pgsql/src/include/commands/tablecmds.h,v 1.27 2006/03/05 15:58:55 momjian Exp $ * $PostgreSQL: pgsql/src/include/commands/tablecmds.h,v 1.28 2006/06/27 03:43:20 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
#include "nodes/parsenodes.h" #include "nodes/parsenodes.h"
#include "utils/rel.h" #include "utils/rel.h"
#include "access/tupdesc.h"
extern Oid DefineRelation(CreateStmt *stmt, char relkind); extern Oid DefineRelation(CreateStmt *stmt, char relkind);
...@@ -47,6 +48,10 @@ extern void renameatt(Oid myrelid, ...@@ -47,6 +48,10 @@ extern void renameatt(Oid myrelid,
extern void renamerel(Oid myrelid, extern void renamerel(Oid myrelid,
const char *newrelname); const char *newrelname);
extern AttrNumber * varattnos_map(TupleDesc old, TupleDesc new);
extern AttrNumber * varattnos_map_schema(TupleDesc old, List *schema);
extern void change_varattnos_of_a_node(Node *node, const AttrNumber *newattno);
extern void register_on_commit_action(Oid relid, OnCommitAction action); extern void register_on_commit_action(Oid relid, OnCommitAction action);
extern void remove_on_commit_action(Oid relid); extern void remove_on_commit_action(Oid relid);
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* Portions Copyright (c) 1996-2006, PostgreSQL Global Development Group * Portions Copyright (c) 1996-2006, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* *
* $PostgreSQL: pgsql/src/include/nodes/parsenodes.h,v 1.311 2006/06/16 20:23:45 adunstan Exp $ * $PostgreSQL: pgsql/src/include/nodes/parsenodes.h,v 1.312 2006/06/27 03:43:20 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -403,7 +403,7 @@ typedef struct InhRelation ...@@ -403,7 +403,7 @@ typedef struct InhRelation
{ {
NodeTag type; NodeTag type;
RangeVar *relation; RangeVar *relation;
bool including_defaults; List *options;
} InhRelation; } InhRelation;
/* /*
...@@ -1026,6 +1026,15 @@ typedef struct CreateStmt ...@@ -1026,6 +1026,15 @@ typedef struct CreateStmt
char *tablespacename; /* table space to use, or NULL */ char *tablespacename; /* table space to use, or NULL */
} CreateStmt; } CreateStmt;
typedef enum CreateStmtLikeOption {
CREATE_TABLE_LIKE_INCLUDING_DEFAULTS,
CREATE_TABLE_LIKE_EXCLUDING_DEFAULTS,
CREATE_TABLE_LIKE_INCLUDING_CONSTRAINTS,
CREATE_TABLE_LIKE_EXCLUDING_CONSTRAINTS,
CREATE_TABLE_LIKE_INCLUDING_INDEXES,
CREATE_TABLE_LIKE_EXCLUDING_INDEXES,
} CreateStmtLikeOption;
/* ---------- /* ----------
* Definitions for plain (non-FOREIGN KEY) constraints in CreateStmt * Definitions for plain (non-FOREIGN KEY) constraints in CreateStmt
* *
......
...@@ -606,7 +606,7 @@ SELECT * FROM a; /* Has ee entry */ ...@@ -606,7 +606,7 @@ SELECT * FROM a; /* Has ee entry */
CREATE TABLE inhf (LIKE inhx, LIKE inhx); /* Throw error */ CREATE TABLE inhf (LIKE inhx, LIKE inhx); /* Throw error */
ERROR: column "xx" duplicated ERROR: column "xx" duplicated
CREATE TABLE inhf (LIKE inhx INCLUDING DEFAULTS); CREATE TABLE inhf (LIKE inhx INCLUDING DEFAULTS INCLUDING CONSTRAINTS);
INSERT INTO inhf DEFAULT VALUES; INSERT INTO inhf DEFAULT VALUES;
SELECT * FROM inhf; /* Single entry with value 'text' */ SELECT * FROM inhf; /* Single entry with value 'text' */
xx xx
...@@ -614,6 +614,25 @@ SELECT * FROM inhf; /* Single entry with value 'text' */ ...@@ -614,6 +614,25 @@ SELECT * FROM inhf; /* Single entry with value 'text' */
text text
(1 row) (1 row)
ALTER TABLE inhx add constraint foo CHECK (xx = 'text');
ALTER TABLE inhx ADD PRIMARY KEY (xx);
NOTICE: ALTER TABLE / ADD PRIMARY KEY will create implicit index "inhx_pkey" for table "inhx"
CREATE TABLE inhg (LIKE inhx); /* Doesn't copy constraint */
INSERT INTO inhg VALUES ('foo');
DROP TABLE inhg;
CREATE TABLE inhg (x text, LIKE inhx INCLUDING CONSTRAINTS, y text); /* Copies constraints */
INSERT INTO inhg VALUES ('x', 'text', 'y'); /* Succeeds */
INSERT INTO inhg VALUES ('x', 'text', 'y'); /* Succeeds -- Unique constraints not copied */
INSERT INTO inhg VALUES ('x', 'foo', 'y'); /* fails due to constraint */
ERROR: new row for relation "inhg" violates check constraint "foo"
SELECT * FROM inhg; /* Two records with three columns in order x=x, xx=text, y=y */
x | xx | y
---+------+---
x | text | y
x | text | y
(2 rows)
DROP TABLE inhg;
-- Test changing the type of inherited columns -- Test changing the type of inherited columns
insert into d values('test','one','two','three'); insert into d values('test','one','two','three');
alter table a alter column aa type integer using bit_length(aa); alter table a alter column aa type integer using bit_length(aa);
......
...@@ -23,6 +23,7 @@ SELECT relname, relhasindex ...@@ -23,6 +23,7 @@ SELECT relname, relhasindex
hash_name_heap | t hash_name_heap | t
hash_txt_heap | t hash_txt_heap | t
ihighway | t ihighway | t
inhx | t
num_exp_add | t num_exp_add | t
num_exp_div | t num_exp_div | t
num_exp_ln | t num_exp_ln | t
...@@ -70,7 +71,7 @@ SELECT relname, relhasindex ...@@ -70,7 +71,7 @@ SELECT relname, relhasindex
shighway | t shighway | t
tenk1 | t tenk1 | t
tenk2 | t tenk2 | t
(60 rows) (61 rows)
-- --
-- another sanity check: every system catalog that has OIDs should have -- another sanity check: every system catalog that has OIDs should have
......
...@@ -140,10 +140,23 @@ SELECT * FROM a; /* Has ee entry */ ...@@ -140,10 +140,23 @@ SELECT * FROM a; /* Has ee entry */
CREATE TABLE inhf (LIKE inhx, LIKE inhx); /* Throw error */ CREATE TABLE inhf (LIKE inhx, LIKE inhx); /* Throw error */
CREATE TABLE inhf (LIKE inhx INCLUDING DEFAULTS); CREATE TABLE inhf (LIKE inhx INCLUDING DEFAULTS INCLUDING CONSTRAINTS);
INSERT INTO inhf DEFAULT VALUES; INSERT INTO inhf DEFAULT VALUES;
SELECT * FROM inhf; /* Single entry with value 'text' */ SELECT * FROM inhf; /* Single entry with value 'text' */
ALTER TABLE inhx add constraint foo CHECK (xx = 'text');
ALTER TABLE inhx ADD PRIMARY KEY (xx);
CREATE TABLE inhg (LIKE inhx); /* Doesn't copy constraint */
INSERT INTO inhg VALUES ('foo');
DROP TABLE inhg;
CREATE TABLE inhg (x text, LIKE inhx INCLUDING CONSTRAINTS, y text); /* Copies constraints */
INSERT INTO inhg VALUES ('x', 'text', 'y'); /* Succeeds */
INSERT INTO inhg VALUES ('x', 'text', 'y'); /* Succeeds -- Unique constraints not copied */
INSERT INTO inhg VALUES ('x', 'foo', 'y'); /* fails due to constraint */
SELECT * FROM inhg; /* Two records with three columns in order x=x, xx=text, y=y */
DROP TABLE inhg;
-- Test changing the type of inherited columns -- Test changing the type of inherited columns
insert into d values('test','one','two','three'); insert into d values('test','one','two','three');
alter table a alter column aa type integer using bit_length(aa); alter table a alter column aa type integer using bit_length(aa);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment