? GNUmakefile ? config.log ? config.status ? diff ? log ? contrib/spi/.deps ? src/Makefile.global ? src/backend/postgres ? src/backend/access/common/.deps ? src/backend/access/gist/.deps ? src/backend/access/hash/.deps ? src/backend/access/heap/.deps ? src/backend/access/index/.deps ? src/backend/access/nbtree/.deps ? src/backend/access/rtree/.deps ? src/backend/access/transam/.deps ? src/backend/bootstrap/.deps ? src/backend/catalog/.deps ? src/backend/catalog/postgres.bki ? src/backend/catalog/postgres.description ? src/backend/commands/.deps ? src/backend/executor/.deps ? src/backend/lib/.deps ? src/backend/libpq/.deps ? src/backend/main/.deps ? src/backend/nodes/.deps ? src/backend/optimizer/geqo/.deps ? src/backend/optimizer/path/.deps ? src/backend/optimizer/plan/.deps ? src/backend/optimizer/prep/.deps ? src/backend/optimizer/util/.deps ? src/backend/parser/.deps ? src/backend/port/.deps ? src/backend/postmaster/.deps ? src/backend/regex/.deps ? src/backend/rewrite/.deps ? src/backend/storage/buffer/.deps ? src/backend/storage/file/.deps ? src/backend/storage/freespace/.deps ? src/backend/storage/ipc/.deps ? src/backend/storage/large_object/.deps ? src/backend/storage/lmgr/.deps ? src/backend/storage/page/.deps ? src/backend/storage/smgr/.deps ? src/backend/tcop/.deps ? src/backend/utils/.deps ? src/backend/utils/adt/.deps ? src/backend/utils/cache/.deps ? src/backend/utils/error/.deps ? src/backend/utils/fmgr/.deps ? src/backend/utils/hash/.deps ? src/backend/utils/init/.deps ? src/backend/utils/mb/.deps ? src/backend/utils/mb/conversion_procs/conversion_create.sql ? src/backend/utils/mb/conversion_procs/ascii_and_mic/.deps ? src/backend/utils/mb/conversion_procs/ascii_and_mic/libascii_and_mic.so.0 ? src/backend/utils/mb/conversion_procs/cyrillic_and_mic/.deps ? src/backend/utils/mb/conversion_procs/cyrillic_and_mic/libcyrillic_and_mic.so.0 ? src/backend/utils/mb/conversion_procs/euc_cn_and_mic/.deps ? src/backend/utils/mb/conversion_procs/euc_cn_and_mic/libeuc_cn_and_mic.so.0 ? src/backend/utils/mb/conversion_procs/euc_jp_and_sjis/.deps ? src/backend/utils/mb/conversion_procs/euc_jp_and_sjis/libeuc_jp_and_sjis.so.0 ? src/backend/utils/mb/conversion_procs/euc_kr_and_mic/.deps ? src/backend/utils/mb/conversion_procs/euc_kr_and_mic/libeuc_kr_and_mic.so.0 ? src/backend/utils/mb/conversion_procs/euc_tw_and_big5/.deps ? src/backend/utils/mb/conversion_procs/euc_tw_and_big5/libeuc_tw_and_big5.so.0 ? src/backend/utils/mb/conversion_procs/latin2_and_win1250/.deps ? src/backend/utils/mb/conversion_procs/latin2_and_win1250/liblatin2_and_win1250.so.0 ? src/backend/utils/mb/conversion_procs/latin_and_mic/.deps ? src/backend/utils/mb/conversion_procs/latin_and_mic/liblatin_and_mic.so.0 ? src/backend/utils/mb/conversion_procs/utf8_and_ascii/.deps ? src/backend/utils/mb/conversion_procs/utf8_and_ascii/libutf8_and_ascii.so.0 ? src/backend/utils/mb/conversion_procs/utf8_and_big5/.deps ? src/backend/utils/mb/conversion_procs/utf8_and_big5/libutf8_and_big5.so.0 ? src/backend/utils/mb/conversion_procs/utf8_and_cyrillic/.deps ? src/backend/utils/mb/conversion_procs/utf8_and_cyrillic/libutf8_and_cyrillic.so.0 ? src/backend/utils/mb/conversion_procs/utf8_and_euc_cn/.deps ? src/backend/utils/mb/conversion_procs/utf8_and_euc_cn/libutf8_and_euc_cn.so.0 ? src/backend/utils/mb/conversion_procs/utf8_and_euc_jp/.deps ? src/backend/utils/mb/conversion_procs/utf8_and_euc_jp/libutf8_and_euc_jp.so.0 ? src/backend/utils/mb/conversion_procs/utf8_and_euc_kr/.deps ? src/backend/utils/mb/conversion_procs/utf8_and_euc_kr/libutf8_and_euc_kr.so.0 ? src/backend/utils/mb/conversion_procs/utf8_and_euc_tw/.deps ? src/backend/utils/mb/conversion_procs/utf8_and_euc_tw/libutf8_and_euc_tw.so.0 ? src/backend/utils/mb/conversion_procs/utf8_and_gb18030/.deps ? src/backend/utils/mb/conversion_procs/utf8_and_gb18030/libutf8_and_gb18030.so.0 ? src/backend/utils/mb/conversion_procs/utf8_and_gbk/.deps ? src/backend/utils/mb/conversion_procs/utf8_and_gbk/libutf8_and_gbk.so.0 ? src/backend/utils/mb/conversion_procs/utf8_and_iso8859/.deps ? src/backend/utils/mb/conversion_procs/utf8_and_iso8859/libutf8_and_iso8859.so.0 ? src/backend/utils/mb/conversion_procs/utf8_and_iso8859_1/.deps ? src/backend/utils/mb/conversion_procs/utf8_and_iso8859_1/libutf8_and_iso8859_1.so.0 ? src/backend/utils/mb/conversion_procs/utf8_and_johab/.deps ? src/backend/utils/mb/conversion_procs/utf8_and_johab/libutf8_and_johab.so.0 ? src/backend/utils/mb/conversion_procs/utf8_and_sjis/.deps ? src/backend/utils/mb/conversion_procs/utf8_and_sjis/libutf8_and_sjis.so.0 ? src/backend/utils/mb/conversion_procs/utf8_and_tcvn/.deps ? src/backend/utils/mb/conversion_procs/utf8_and_tcvn/libutf8_and_tcvn.so.0 ? src/backend/utils/mb/conversion_procs/utf8_and_uhc/.deps ? src/backend/utils/mb/conversion_procs/utf8_and_uhc/libutf8_and_uhc.so.0 ? src/backend/utils/mb/conversion_procs/utf8_and_win1250/.deps ? src/backend/utils/mb/conversion_procs/utf8_and_win1250/libutf8_and_win1250.so.0 ? src/backend/utils/mb/conversion_procs/utf8_and_win1256/.deps ? src/backend/utils/mb/conversion_procs/utf8_and_win1256/libutf8_and_win1256.so.0 ? src/backend/utils/mb/conversion_procs/utf8_and_win874/.deps ? src/backend/utils/mb/conversion_procs/utf8_and_win874/libutf8_and_win874.so.0 ? src/backend/utils/misc/.deps ? src/backend/utils/mmgr/.deps ? src/backend/utils/sort/.deps ? src/backend/utils/time/.deps ? src/bin/initdb/initdb ? src/bin/initlocation/initlocation ? src/bin/ipcclean/ipcclean ? src/bin/pg_config/pg_config ? src/bin/pg_controldata/.deps ? src/bin/pg_controldata/pg_controldata ? src/bin/pg_ctl/pg_ctl ? src/bin/pg_dump/.deps ? src/bin/pg_dump/pg_dump ? src/bin/pg_dump/pg_dumpall ? src/bin/pg_dump/pg_restore ? src/bin/pg_encoding/.deps ? src/bin/pg_encoding/pg_encoding ? src/bin/pg_id/.deps ? src/bin/pg_id/pg_id ? src/bin/pg_resetxlog/.deps ? src/bin/pg_resetxlog/pg_resetxlog ? src/bin/psql/.deps ? src/bin/psql/psql ? src/bin/scripts/.deps ? src/bin/scripts/createdb ? src/bin/scripts/createlang ? src/bin/scripts/createuser ? src/bin/scripts/dropdb ? src/bin/scripts/droplang ? src/bin/scripts/dropuser ? src/include/pg_config.h ? src/include/stamp-h ? src/interfaces/ecpg/compatlib/.deps ? src/interfaces/ecpg/compatlib/libecpg_compat.so.1 ? src/interfaces/ecpg/ecpglib/.deps ? src/interfaces/ecpg/ecpglib/libecpg.so.3 ? src/interfaces/ecpg/pgtypeslib/.deps ? src/interfaces/ecpg/pgtypeslib/libpgtypes.so.1 ? src/interfaces/ecpg/preproc/.deps ? src/interfaces/ecpg/preproc/ecpg ? src/interfaces/libpq/.deps ? src/interfaces/libpq/libpq.so.3 ? src/pl/plpgsql/src/.deps ? src/pl/plpgsql/src/libplpgsql.so.1 ? src/port/.deps ? src/test/regress/.deps ? src/test/regress/.regression.diffs.swp ? src/test/regress/log ? src/test/regress/pg_regress ? src/test/regress/results ? src/test/regress/tmp_check ? src/test/regress/expected/constraints.out ? src/test/regress/expected/copy.out ? src/test/regress/expected/create_function_1.out ? src/test/regress/expected/create_function_2.out ? src/test/regress/expected/misc.out ? src/test/regress/sql/constraints.sql ? src/test/regress/sql/copy.sql ? src/test/regress/sql/create_function_1.sql ? src/test/regress/sql/create_function_2.sql ? src/test/regress/sql/misc.sql Index: contrib/Makefile =================================================================== RCS file: /projects/cvsroot/pgsql-server/contrib/Makefile,v retrieving revision 1.41 diff -c -r1.41 Makefile *** contrib/Makefile 20 Mar 2003 18:14:46 -0000 1.41 --- contrib/Makefile 12 Jun 2003 20:17:01 -0000 *************** *** 13,19 **** dblink \ dbmirror \ dbsize \ - earthdistance \ findoidjoins \ fulltextindex \ fuzzystrmatch \ --- 13,18 ---- Index: src/backend/catalog/sql_features.txt =================================================================== RCS file: /projects/cvsroot/pgsql-server/src/backend/catalog/sql_features.txt,v retrieving revision 1.5 diff -c -r1.5 sql_features.txt *** src/backend/catalog/sql_features.txt 5 Jun 2003 16:08:47 -0000 1.5 --- src/backend/catalog/sql_features.txt 12 Jun 2003 20:17:02 -0000 *************** *** 308,314 **** T131 Recursive query NO T141 SIMILAR predicate YES T151 DISTINCT predicate YES ! T171 LIKE clause in table definition NO T191 Referential action RESTRICT YES T201 Comparable data types for referential constraints YES T211 Basic trigger capability NO --- 308,314 ---- T131 Recursive query NO T141 SIMILAR predicate YES T151 DISTINCT predicate YES ! T171 LIKE clause in table definition YES T191 Referential action RESTRICT YES T201 Comparable data types for referential constraints YES T211 Basic trigger capability NO Index: src/backend/commands/copy.c =================================================================== RCS file: /projects/cvsroot/pgsql-server/src/backend/commands/copy.c,v retrieving revision 1.201 diff -c -r1.201 copy.c *** src/backend/commands/copy.c 16 May 2003 02:40:19 -0000 1.201 --- src/backend/commands/copy.c 12 Jun 2003 20:17:02 -0000 *************** *** 8,14 **** * * * IDENTIFICATION ! * $Header: /projects/cvsroot/pgsql-server/src/backend/commands/copy.c,v 1.201 2003/05/16 02:40:19 momjian Exp $ * *------------------------------------------------------------------------- */ --- 8,14 ---- * * * IDENTIFICATION ! * $Header: /projects/cvsroot/pgsql-server/src/backend/commands/copy.c,v 1.200 2003/05/09 21:19:48 tgl Exp $ * *------------------------------------------------------------------------- */ Index: src/backend/nodes/copyfuncs.c =================================================================== RCS file: /projects/cvsroot/pgsql-server/src/backend/nodes/copyfuncs.c,v retrieving revision 1.252 diff -c -r1.252 copyfuncs.c *** src/backend/nodes/copyfuncs.c 6 Jun 2003 15:04:02 -0000 1.252 --- src/backend/nodes/copyfuncs.c 12 Jun 2003 20:17:02 -0000 *************** *** 1723,1728 **** --- 1723,1739 ---- return newnode; } + static InhRelation * + _copyInhRelation(InhRelation *from) + { + InhRelation *newnode = makeNode(InhRelation); + + COPY_NODE_FIELD(relation); + COPY_SCALAR_FIELD(including_defaults); + + return newnode; + } + static DefineStmt * _copyDefineStmt(DefineStmt *from) { *************** *** 2684,2689 **** --- 2695,2703 ---- break; case T_CreateStmt: retval = _copyCreateStmt(from); + break; + case T_InhRelation: + retval = _copyInhRelation(from); break; case T_DefineStmt: retval = _copyDefineStmt(from); Index: src/backend/nodes/equalfuncs.c =================================================================== RCS file: /projects/cvsroot/pgsql-server/src/backend/nodes/equalfuncs.c,v retrieving revision 1.195 diff -c -r1.195 equalfuncs.c *** src/backend/nodes/equalfuncs.c 6 Jun 2003 15:04:02 -0000 1.195 --- src/backend/nodes/equalfuncs.c 12 Jun 2003 20:17:03 -0000 *************** *** 778,783 **** --- 778,792 ---- } static bool + _equalInhRelation(InhRelation *a, InhRelation *b) + { + COMPARE_NODE_FIELD(relation); + COMPARE_SCALAR_FIELD(including_defaults); + + return true; + } + + static bool _equalDefineStmt(DefineStmt *a, DefineStmt *b) { COMPARE_SCALAR_FIELD(kind); *************** *** 1798,1803 **** --- 1807,1815 ---- break; case T_CreateStmt: retval = _equalCreateStmt(a, b); + break; + case T_InhRelation: + retval = _equalInhRelation(a,b); break; case T_DefineStmt: retval = _equalDefineStmt(a, b); Index: src/backend/parser/analyze.c =================================================================== RCS file: /projects/cvsroot/pgsql-server/src/backend/parser/analyze.c,v retrieving revision 1.273 diff -c -r1.273 analyze.c *** src/backend/parser/analyze.c 6 Jun 2003 15:04:02 -0000 1.273 --- src/backend/parser/analyze.c 12 Jun 2003 20:17:03 -0000 *************** *** 21,26 **** --- 21,27 ---- #include "catalog/pg_index.h" #include "catalog/pg_type.h" #include "commands/prepare.h" + #include "miscadmin.h" #include "nodes/makefuncs.h" #include "optimizer/clauses.h" #include "optimizer/var.h" *************** *** 37,42 **** --- 38,44 ---- #include "parser/parse_type.h" #include "parser/parse_expr.h" #include "rewrite/rewriteManip.h" + #include "utils/acl.h" #include "utils/builtins.h" #include "utils/fmgroids.h" #include "utils/lsyscache.h" *************** *** 112,124 **** static Query *transformAlterTableStmt(ParseState *pstate, AlterTableStmt *stmt, List **extras_before, List **extras_after); static void transformColumnDefinition(ParseState *pstate, ! CreateStmtContext *cxt, ! ColumnDef *column); static void transformTableConstraint(ParseState *pstate, ! CreateStmtContext *cxt, ! Constraint *constraint); static void transformIndexConstraints(ParseState *pstate, ! CreateStmtContext *cxt); static void transformFKConstraints(ParseState *pstate, CreateStmtContext *cxt, bool isAddConstraint); --- 114,128 ---- static Query *transformAlterTableStmt(ParseState *pstate, AlterTableStmt *stmt, List **extras_before, List **extras_after); static void transformColumnDefinition(ParseState *pstate, ! CreateStmtContext *cxt, ! ColumnDef *column); static void transformTableConstraint(ParseState *pstate, ! CreateStmtContext *cxt, ! Constraint *constraint); ! static void transformInhRelation(ParseState *pstate, CreateStmtContext *cxt, ! InhRelation *inhrelation); static void transformIndexConstraints(ParseState *pstate, ! CreateStmtContext *cxt); static void transformFKConstraints(ParseState *pstate, CreateStmtContext *cxt, bool isAddConstraint); *************** *** 880,885 **** --- 884,894 ---- cxt.fkconstraints = lappend(cxt.fkconstraints, element); break; + case T_InhRelation: + transformInhRelation(pstate, &cxt, + (InhRelation *) element); + break; + default: elog(ERROR, "parser: unrecognized node (internal error)"); } *************** *** 1144,1149 **** --- 1153,1275 ---- elog(ERROR, "parser: unrecognized constraint (internal error)"); break; } + } + + /* + * transformInhRelation + * + * Change the LIKE portion of a CREATE TABLE statement into the + * column definitions which recreate the user defined column portions of . + */ + static void + transformInhRelation(ParseState *pstate, CreateStmtContext *cxt, + InhRelation *inhRelation) + { + AttrNumber parent_attno; + + Relation relation; + TupleDesc tupleDesc; + TupleConstr *constr; + AclResult aclresult; + + relation = heap_openrv(inhRelation->relation, AccessShareLock); + + if (relation->rd_rel->relkind != RELKIND_RELATION) + elog(ERROR, "CREATE TABLE: inherited relation \"%s\" is not a table", + inhRelation->relation->relname); + + /* + * Check for SELECT privilages + */ + aclresult = pg_class_aclcheck(RelationGetRelid(relation), GetUserId(), + ACL_SELECT); + if (aclresult != ACLCHECK_OK) + aclcheck_error(aclresult, RelationGetRelationName(relation)); + + tupleDesc = RelationGetDescr(relation); + constr = tupleDesc->constr; + + /* + * Insert the inherited attributes into the cxt for the + * new table definition. + */ + for (parent_attno = 1; parent_attno <= tupleDesc->natts; + parent_attno++) + { + Form_pg_attribute attribute = tupleDesc->attrs[parent_attno - 1]; + char *attributeName = NameStr(attribute->attname); + ColumnDef *def; + TypeName *typename; + + /* + * Ignore dropped columns in the parent. + */ + if (attribute->attisdropped) + continue; + + /* + * Create a new inherited column. + * + * For constraints, ONLY the NOT NULL constraint is inherited + * by the new column definition per SQL99. + */ + def = makeNode(ColumnDef); + def->colname = pstrdup(attributeName); + typename = makeNode(TypeName); + typename->typeid = attribute->atttypid; + typename->typmod = attribute->atttypmod; + def->typename = typename; + def->inhcount = 0; + def->is_local = false; + def->is_not_null = attribute->attnotnull; + def->raw_default = NULL; + def->cooked_default = NULL; + def->constraints = NIL; + def->support = NULL; + + /* + * Add to column list + */ + cxt->columns = lappend(cxt->columns, def); + + /* + * Copy default if any, and the default has been requested + */ + if (attribute->atthasdef && inhRelation->including_defaults) + { + char *this_default = NULL; + AttrDefault *attrdef; + int i; + + /* Find default in constraint structure */ + Assert(constr != NULL); + attrdef = constr->defval; + for (i = 0; i < constr->num_defval; i++) + { + if (attrdef[i].adnum == parent_attno) + { + this_default = attrdef[i].adbin; + break; + } + } + Assert(this_default != NULL); + + /* + * If default expr could contain any vars, we'd need to + * fix 'em, but it can't; so default is ready to apply to + * child. + */ + + def->cooked_default = pstrdup(this_default); + } + } + + /* + * Close the parent rel, but keep our AccessShareLock on it until + * xact commit. That will prevent someone else from deleting or + * ALTERing the parent before the child is committed. + */ + heap_close(relation, NoLock); } static void Index: src/backend/parser/gram.y =================================================================== RCS file: /projects/cvsroot/pgsql-server/src/backend/parser/gram.y,v retrieving revision 2.416 diff -c -r2.416 gram.y *** src/backend/parser/gram.y 29 May 2003 20:40:36 -0000 2.416 --- src/backend/parser/gram.y 12 Jun 2003 20:17:05 -0000 *************** *** 165,170 **** --- 165,172 ---- %type opt_force opt_or_replace transaction_access_mode opt_grant_grant_option opt_revoke_grant_option + %type like_including_defaults + %type user_list %type OptGroupList *************** *** 336,346 **** CREATEUSER CROSS CURRENT_DATE CURRENT_TIME CURRENT_TIMESTAMP CURRENT_USER CURSOR CYCLE ! DATABASE DAY_P DEALLOCATE DEC DECIMAL_P DECLARE DEFAULT DEFERRABLE DEFERRED DEFINER DELETE_P DELIMITER DELIMITERS DESC DISTINCT DO DOMAIN_P DOUBLE_P DROP ! EACH ELSE ENCODING ENCRYPTED END_P ESCAPE EXCEPT EXCLUSIVE EXECUTE EXISTS EXPLAIN EXTERNAL EXTRACT FALSE_P FETCH FIRST_P FLOAT_P FOR FORCE FOREIGN FORWARD --- 338,348 ---- CREATEUSER CROSS CURRENT_DATE CURRENT_TIME CURRENT_TIMESTAMP CURRENT_USER CURSOR CYCLE ! DATABASE DAY_P DEALLOCATE DEC DECIMAL_P DECLARE DEFAULT DEFAULTS DEFERRABLE DEFERRED DEFINER DELETE_P DELIMITER DELIMITERS DESC DISTINCT DO DOMAIN_P DOUBLE_P DROP ! EACH ELSE ENCODING ENCRYPTED END_P ESCAPE EXCEPT EXCLUDING EXCLUSIVE EXECUTE EXISTS EXPLAIN EXTERNAL EXTRACT FALSE_P FETCH FIRST_P FLOAT_P FOR FORCE FOREIGN FORWARD *************** *** 350,356 **** HANDLER HAVING HOLD HOUR_P ! ILIKE IMMEDIATE IMMUTABLE IMPLICIT_P IN_P INCREMENT INDEX INHERITS INITIALLY INNER_P INOUT INPUT_P INSENSITIVE INSERT INSTEAD INT_P INTEGER INTERSECT INTERVAL INTO INVOKER IS ISNULL ISOLATION --- 352,358 ---- HANDLER HAVING HOLD HOUR_P ! ILIKE IMMEDIATE IMMUTABLE IMPLICIT_P IN_P INCLUDING INCREMENT INDEX INHERITS INITIALLY INNER_P INOUT INPUT_P INSENSITIVE INSERT INSTEAD INT_P INTEGER INTERSECT INTERVAL INTO INVOKER IS ISNULL ISOLATION *************** *** 1642,1659 **** ; ! /* SQL99 supports wholesale borrowing of a table definition via the LIKE clause. * This seems to be a poor man's inheritance capability, with the resulting * tables completely decoupled except for the original commonality in definitions. ! * Seems to have much in common with CREATE TABLE AS. - thomas 2002-06-19 */ ! TableLikeClause: LIKE any_name { ! elog(ERROR, "LIKE in table definitions not yet supported"); ! $$ = NULL; } ; /* ConstraintElem specifies constraint syntax which is not embedded into * a column definition. ColConstraintElem specifies the embedded form. --- 1644,1674 ---- ; ! /* ! * SQL99 supports wholesale borrowing of a table definition via the LIKE clause. * This seems to be a poor man's inheritance capability, with the resulting * tables completely decoupled except for the original commonality in definitions. ! * ! * This is very similar to CREATE TABLE AS except for the INCLUDING DEFAULTS extension ! * which is a part of SQL 200N */ ! TableLikeClause: ! LIKE qualified_name like_including_defaults { ! InhRelation *n = makeNode(InhRelation); ! n->relation = $2; ! n->including_defaults = $3; ! ! $$ = (Node *)n; } ; + like_including_defaults: + INCLUDING DEFAULTS { $$ = true; } + | EXCLUDING DEFAULTS { $$ = false; } + | /* EMPTY */ { $$ = false; } + ; + /* ConstraintElem specifies constraint syntax which is not embedded into * a column definition. ColConstraintElem specifies the embedded form. *************** *** 7193,7198 **** --- 7208,7214 ---- | DAY_P | DEALLOCATE | DECLARE + | DEFAULTS | DEFERRED | DEFINER | DELETE_P *************** *** 7205,7210 **** --- 7221,7227 ---- | ENCODING | ENCRYPTED | ESCAPE + | EXCLUDING | EXCLUSIVE | EXECUTE | EXPLAIN *************** *** 7221,7226 **** --- 7238,7244 ---- | IMMEDIATE | IMMUTABLE | IMPLICIT_P + | INCLUDING | INCREMENT | INDEX | INHERITS Index: src/backend/parser/keywords.c =================================================================== RCS file: /projects/cvsroot/pgsql-server/src/backend/parser/keywords.c,v retrieving revision 1.139 diff -c -r1.139 keywords.c *** src/backend/parser/keywords.c 15 May 2003 16:35:28 -0000 1.139 --- src/backend/parser/keywords.c 12 Jun 2003 20:17:05 -0000 *************** *** 8,14 **** * * * IDENTIFICATION ! * $Header: /projects/cvsroot/pgsql-server/src/backend/parser/keywords.c,v 1.139 2003/05/15 16:35:28 momjian Exp $ * *------------------------------------------------------------------------- */ --- 8,14 ---- * * * IDENTIFICATION ! * $Header: /home/rbt/work/postgresql/cvs//pgsql-server/src/backend/parser/keywords.c,v 1.139 2003/05/15 16:35:28 momjian Exp $ * *------------------------------------------------------------------------- */ *************** *** 102,107 **** --- 102,108 ---- {"decimal", DECIMAL_P}, {"declare", DECLARE}, {"default", DEFAULT}, + {"defaults", DEFAULTS}, {"deferrable", DEFERRABLE}, {"deferred", DEFERRED}, {"definer", DEFINER}, *************** *** 121,126 **** --- 122,128 ---- {"end", END_P}, {"escape", ESCAPE}, {"except", EXCEPT}, + {"excluding", EXCLUDING}, {"exclusive", EXCLUSIVE}, {"execute", EXECUTE}, {"exists", EXISTS}, *************** *** 151,156 **** --- 153,159 ---- {"immutable", IMMUTABLE}, {"implicit", IMPLICIT_P}, {"in", IN_P}, + {"including", INCLUDING}, {"increment", INCREMENT}, {"index", INDEX}, {"inherits", INHERITS}, Index: src/include/nodes/nodes.h =================================================================== RCS file: /projects/cvsroot/pgsql-server/src/include/nodes/nodes.h,v retrieving revision 1.140 diff -c -r1.140 nodes.h *** src/include/nodes/nodes.h 8 Apr 2003 23:20:04 -0000 1.140 --- src/include/nodes/nodes.h 12 Jun 2003 20:17:08 -0000 *************** *** 280,285 **** --- 280,286 ---- T_InsertDefault, T_CreateOpClassItem, T_CompositeTypeStmt, + T_InhRelation, /* * TAGS FOR FUNCTION-CALL CONTEXT AND RESULTINFO NODES (see fmgr.h) Index: src/include/nodes/parsenodes.h =================================================================== RCS file: /projects/cvsroot/pgsql-server/src/include/nodes/parsenodes.h,v retrieving revision 1.238 diff -c -r1.238 parsenodes.h *** src/include/nodes/parsenodes.h 28 May 2003 16:04:02 -0000 1.238 --- src/include/nodes/parsenodes.h 12 Jun 2003 20:17:09 -0000 *************** *** 351,356 **** --- 351,366 ---- } ColumnDef; /* + * inhRelation - Relations a CREATE TABLE is to inherit attributes of + */ + typedef struct InhRelation + { + NodeTag type; + RangeVar *relation; + bool including_defaults; + } InhRelation; + + /* * IndexElem - index parameters (used in CREATE INDEX) * * For a plain index attribute, 'name' is the name of the table column to *************** *** 851,857 **** NodeTag type; RangeVar *relation; /* relation to create */ List *tableElts; /* column definitions (list of ColumnDef) */ ! List *inhRelations; /* relations to inherit from */ List *constraints; /* constraints (list of Constraint nodes) */ bool hasoids; /* should it have OIDs? */ OnCommitAction oncommit; /* what do we do at COMMIT? */ --- 861,867 ---- NodeTag type; RangeVar *relation; /* relation to create */ List *tableElts; /* column definitions (list of ColumnDef) */ ! List *inhRelations; /* relations to inherit from (list of inhRelation) */ List *constraints; /* constraints (list of Constraint nodes) */ bool hasoids; /* should it have OIDs? */ OnCommitAction oncommit; /* what do we do at COMMIT? */ Index: src/test/regress/expected/inherit.out =================================================================== RCS file: /projects/cvsroot/pgsql-server/src/test/regress/expected/inherit.out,v retrieving revision 1.8 diff -c -r1.8 inherit.out *** src/test/regress/expected/inherit.out 5 Mar 2003 20:01:04 -0000 1.8 --- src/test/regress/expected/inherit.out 12 Jun 2003 20:17:10 -0000 *************** *** 570,572 **** --- 570,615 ---- bar2 | 3 | 103 (8 rows) + /* Test inheritance of structure (LIKE) */ + CREATE TABLE inhx (xx text DEFAULT 'text'); + /* + * Test double inheritance + * + * Ensure that defaults are NOT included unless + * INCLUDING DEFAULTS is specified + */ + CREATE TABLE inhe (ee text, LIKE inhx) inherits (b); + INSERT INTO inhe VALUES ('ee-col1', 'ee-col2', DEFAULT, 'ee-col4'); + SELECT * FROM inhe; /* Columns aa, bb, xx value NULL, ee */ + aa | bb | ee | xx + ---------+---------+----+--------- + ee-col1 | ee-col2 | | ee-col4 + (1 row) + + SELECT * FROM inhx; /* Empty set since LIKE inherits structure only */ + xx + ---- + (0 rows) + + SELECT * FROM b; /* Has ee entry */ + aa | bb + ---------+--------- + ee-col1 | ee-col2 + (1 row) + + SELECT * FROM a; /* Has ee entry */ + aa + --------- + ee-col1 + (1 row) + + CREATE TABLE inhf (LIKE inhx, LIKE inhx); /* Throw error */ + ERROR: CREATE TABLE: attribute "xx" duplicated + CREATE TABLE inhf (LIKE inhx INCLUDING DEFAULTS); + INSERT INTO inhf DEFAULT VALUES; + SELECT * FROM inhf; /* Single entry with value 'text' */ + xx + ------ + text + (1 row) + Index: src/test/regress/sql/inherit.sql =================================================================== RCS file: /projects/cvsroot/pgsql-server/src/test/regress/sql/inherit.sql,v retrieving revision 1.5 diff -c -r1.5 inherit.sql *** src/test/regress/sql/inherit.sql 5 Mar 2003 20:01:04 -0000 1.5 --- src/test/regress/sql/inherit.sql 12 Jun 2003 20:17:10 -0000 *************** *** 119,121 **** --- 119,144 ---- update bar set f2 = f2 + 100 where f1 in (select f1 from foo); SELECT relname, bar.* FROM bar, pg_class where bar.tableoid = pg_class.oid; + + + /* Test inheritance of structure (LIKE) */ + CREATE TABLE inhx (xx text DEFAULT 'text'); + + /* + * Test double inheritance + * + * Ensure that defaults are NOT included unless + * INCLUDING DEFAULTS is specified + */ + CREATE TABLE inhe (ee text, LIKE inhx) inherits (b); + INSERT INTO inhe VALUES ('ee-col1', 'ee-col2', DEFAULT, 'ee-col4'); + SELECT * FROM inhe; /* Columns aa, bb, xx value NULL, ee */ + SELECT * FROM inhx; /* Empty set since LIKE inherits structure only */ + SELECT * FROM b; /* Has ee entry */ + SELECT * FROM a; /* Has ee entry */ + + CREATE TABLE inhf (LIKE inhx, LIKE inhx); /* Throw error */ + + CREATE TABLE inhf (LIKE inhx INCLUDING DEFAULTS); + INSERT INTO inhf DEFAULT VALUES; + SELECT * FROM inhf; /* Single entry with value 'text' */