? src/backend/1 Index: src/backend/commands/creatinh.c =================================================================== RCS file: /usr/local/cvsroot/pgsql/src/backend/commands/creatinh.c,v retrieving revision 1.56 diff -c -r1.56 creatinh.c *** src/backend/commands/creatinh.c 2000/01/29 16:58:34 1.56 --- src/backend/commands/creatinh.c 2000/02/05 03:13:17 *************** *** 35,40 **** --- 35,43 ---- const char *attributeType, List *schema); static List *MergeAttributes(List *schema, List *supers, List **supconstr); static void StoreCatalogInheritance(Oid relationId, List *supers); + static void + setRelhassubclassInRelation(Oid relationId, bool relhassubclass); + /* ---------------------------------------------------------------- * DefineRelation *************** *** 323,328 **** --- 326,332 ---- TupleConstr *constr; relation = heap_openr(name, AccessShareLock); + setRelhassubclassInRelation(relation->rd_id, true); tupleDesc = RelationGetDescr(relation); constr = tupleDesc->constr; *************** *** 655,657 **** --- 659,698 ---- } return false; } + + + static void + setRelhassubclassInRelation(Oid relationId, bool relhassubclass) + { + Relation relationRelation; + HeapTuple tuple; + Relation idescs[Num_pg_class_indices]; + + /* + * Lock a relation given its Oid. Go to the RelationRelation (i.e. + * pg_relation), find the appropriate tuple, and add the specified + * lock to it. + */ + relationRelation = heap_openr(RelationRelationName, RowExclusiveLock); + tuple = SearchSysCacheTupleCopy(RELOID, + ObjectIdGetDatum(relationId), + 0, 0, 0) + ; + Assert(HeapTupleIsValid(tuple)); + + ((Form_pg_class) GETSTRUCT(tuple))->relhassubclass = relhassubclass; + heap_update(relationRelation, &tuple->t_self, tuple, NULL); + + /* keep the catalog indices up to date */ + CatalogOpenIndices(Num_pg_class_indices, Name_pg_class_indices, idescs); + CatalogIndexInsert(idescs, Num_pg_class_indices, relationRelation, tuple + ); + CatalogCloseIndices(Num_pg_class_indices, idescs); + + heap_freetuple(tuple); + heap_close(relationRelation, RowExclusiveLock); + } + + + + Index: src/backend/commands/variable.c =================================================================== RCS file: /usr/local/cvsroot/pgsql/src/backend/commands/variable.c,v retrieving revision 1.28 diff -c -r1.28 variable.c *** src/backend/commands/variable.c 2000/01/22 23:50:10 1.28 --- src/backend/commands/variable.c 2000/02/05 03:13:18 *************** *** 48,53 **** --- 48,56 ---- extern bool _use_keyset_query_optimizer; + #define examine_subclass_default true + bool examine_subclass = examine_subclass_default; + /* * * Get_Token *************** *** 228,233 **** --- 231,274 ---- geqo_rels = GEQO_RELS; return TRUE; } + /* + * + * EXAMINE_SUBCLASS + * + */ + #define EXAMINE_SUBCLASS "EXAMINE_SUBCLASS" + + static bool + parse_examine_subclass(const char *value) + { + if (strcasecmp(value, "on") == 0) + examine_subclass = true; + else if (strcasecmp(value, "off") == 0) + examine_subclass = false; + else if (strcasecmp(value, "default") == 0) + examine_subclass = examine_subclass_default; + else + elog(ERROR, "Bad value for %s (%s)", EXAMINE_SUBCLASS, value); + return TRUE; + } + + static bool + show_examine_subclass() + { + + if (examine_subclass) + elog(NOTICE, "%s is ON", EXAMINE_SUBCLASS); + else + elog(NOTICE, "%s is OFF", EXAMINE_SUBCLASS); + return TRUE; + } + + static bool + reset_examine_subclass(void) + { + examine_subclass = examine_subclass_default; + return TRUE; + } /* * *************** *** 600,605 **** --- 641,649 ---- { "pg_options", parse_pg_options, show_pg_options, reset_pg_options }, + { + EXAMINE_SUBCLASS, parse_examine_subclass, show_examine_subclass, reset_examine_subclass + }, { NULL, NULL, NULL, NULL } Index: src/backend/optimizer/plan/planner.c =================================================================== RCS file: /usr/local/cvsroot/pgsql/src/backend/optimizer/plan/planner.c,v retrieving revision 1.74 diff -c -r1.74 planner.c *** src/backend/optimizer/plan/planner.c 2000/01/27 18:11:31 1.74 --- src/backend/optimizer/plan/planner.c 2000/02/05 03:13:21 *************** *** 35,40 **** --- 35,41 ---- #include "utils/builtins.h" #include "utils/lsyscache.h" #include "utils/syscache.h" + #include "parser/parsetree.h" static List *make_subplanTargetList(Query *parse, List *tlist, AttrNumber **groupColIdx); *************** *** 140,146 **** * to change interface to plan_union_queries to pass that info back! */ } ! else if ((rt_index = first_inherit_rt_entry(rangetable)) != -1) { List *sub_tlist; --- 141,147 ---- * to change interface to plan_union_queries to pass that info back! */ } ! else if ((rt_index = first_inherit_rt_entry(rangetable)) != -1 && has_inheritors(rt_fetch(rt_index, parse->rtable)->relid)) { List *sub_tlist; Index: src/backend/optimizer/prep/prepunion.c =================================================================== RCS file: /usr/local/cvsroot/pgsql/src/backend/optimizer/prep/prepunion.c,v retrieving revision 1.43 diff -c -r1.43 prepunion.c *** src/backend/optimizer/prep/prepunion.c 2000/02/03 06:12:19 1.43 --- src/backend/optimizer/prep/prepunion.c 2000/02/05 03:13:23 *************** *** 25,30 **** --- 25,33 ---- #include "parser/parse_clause.h" #include "parser/parsetree.h" #include "utils/lsyscache.h" + #include "access/heapam.h" + #include "catalog/catname.h" + #include "utils/syscache.h" typedef struct { Index rt_index; *************** *** 45,50 **** --- 48,54 ---- static Append *make_append(List *appendplans, List *unionrtables, Index rt_index, List *inheritrtable, List *tlist); + bool has_inheritors(Oid relationId); /* *************** *** 352,357 **** --- 356,386 ---- *union_rtentriesPtr = union_rtentries; return union_plans; + } + + bool has_inheritors(Oid relationId) + { + bool rtn; + Relation relationRelation; + HeapTuple tuple; + + /* + * Lock a relation given its Oid. Go to the RelationRelation (i.e. + * pg_relation), find the appropriate tuple, and add the specified + * lock to it. + */ + relationRelation = heap_openr(RelationRelationName, NoLock); + tuple = SearchSysCacheTupleCopy(RELOID, + ObjectIdGetDatum(relationId), + 0, 0, 0) + ; + /* Assert(HeapTupleIsValid(tuple)); */ + + rtn = ((Form_pg_class) GETSTRUCT(tuple))->relhassubclass; + + heap_freetuple(tuple); + heap_close(relationRelation, NoLock); + return rtn; } /* Index: src/backend/parser/gram.y =================================================================== RCS file: /usr/local/cvsroot/pgsql/src/backend/parser/gram.y,v retrieving revision 2.139 diff -c -r2.139 gram.y *** src/backend/parser/gram.y 2000/02/04 18:49:33 2.139 --- src/backend/parser/gram.y 2000/02/05 03:13:39 *************** *** 3553,3562 **** relation_expr: relation_name { ! /* normal relations */ $$ = makeNode(RelExpr); $$->relname = $1; ! $$->inh = FALSE; } | relation_name '*' %prec '=' { --- 3553,3563 ---- relation_expr: relation_name { ! /* default inheritance */ ! extern bool examine_subclass; $$ = makeNode(RelExpr); $$->relname = $1; ! $$->inh = examine_subclass; } | relation_name '*' %prec '=' { *************** *** 3565,3570 **** --- 3566,3578 ---- $$->relname = $1; $$->inh = TRUE; } + | ONLY relation_name + { + /* no inheritance */ + $$ = makeNode(RelExpr); + $$->relname = $2; + $$->inh = FALSE; + } opt_array_bounds: '[' ']' opt_array_bounds { $$ = lcons(makeInteger(-1), $3); } Index: src/include/catalog/pg_attribute.h =================================================================== RCS file: /usr/local/cvsroot/pgsql/src/include/catalog/pg_attribute.h,v retrieving revision 1.53 diff -c -r1.53 pg_attribute.h *** src/include/catalog/pg_attribute.h 2000/01/26 05:57:57 1.53 --- src/include/catalog/pg_attribute.h 2000/02/05 03:13:39 *************** *** 402,408 **** { 1259, {"relrefs"}, 21, 0, 2, 16, 0, -1, -1, '\001', 'p', '\0', 's', '\0', '\0' }, \ { 1259, {"relhaspkey"}, 16, 0, 1, 17, 0, -1, -1, '\001', 'p', '\0', 'c', '\0', '\0' }, \ { 1259, {"relhasrules"}, 16, 0, 1, 18, 0, -1, -1, '\001', 'p', '\0', 'c', '\0', '\0' }, \ ! { 1259, {"relacl"}, 1034, 0, -1, 19, 0, -1, -1, '\0', 'p', '\0', 'i', '\0', '\0' } DATA(insert OID = 0 ( 1259 relname 19 0 NAMEDATALEN 1 0 -1 -1 f p f i f f)); DATA(insert OID = 0 ( 1259 reltype 26 0 4 2 0 -1 -1 t p f i f f)); --- 402,409 ---- { 1259, {"relrefs"}, 21, 0, 2, 16, 0, -1, -1, '\001', 'p', '\0', 's', '\0', '\0' }, \ { 1259, {"relhaspkey"}, 16, 0, 1, 17, 0, -1, -1, '\001', 'p', '\0', 'c', '\0', '\0' }, \ { 1259, {"relhasrules"}, 16, 0, 1, 18, 0, -1, -1, '\001', 'p', '\0', 'c', '\0', '\0' }, \ ! { 1259, {"relhassubclass"},16, 0, 1, 19, 0, -1, -1, '\001', 'p', '\0', 'c', '\0', '\0' }, \ ! { 1259, {"relacl"}, 1034, 0, -1, 20, 0, -1, -1, '\0', 'p', '\0', 'i', '\0', '\0' } DATA(insert OID = 0 ( 1259 relname 19 0 NAMEDATALEN 1 0 -1 -1 f p f i f f)); DATA(insert OID = 0 ( 1259 reltype 26 0 4 2 0 -1 -1 t p f i f f)); *************** *** 422,428 **** DATA(insert OID = 0 ( 1259 relrefs 21 0 2 16 0 -1 -1 t p f s f f)); DATA(insert OID = 0 ( 1259 relhaspkey 16 0 1 17 0 -1 -1 t p f c f f)); DATA(insert OID = 0 ( 1259 relhasrules 16 0 1 18 0 -1 -1 t p f c f f)); ! DATA(insert OID = 0 ( 1259 relacl 1034 0 -1 19 0 -1 -1 f p f i f f)); DATA(insert OID = 0 ( 1259 ctid 27 0 6 -1 0 -1 -1 f p f i f f)); DATA(insert OID = 0 ( 1259 oid 26 0 4 -2 0 -1 -1 t p f i f f)); DATA(insert OID = 0 ( 1259 xmin 28 0 4 -3 0 -1 -1 t p f i f f)); --- 423,430 ---- DATA(insert OID = 0 ( 1259 relrefs 21 0 2 16 0 -1 -1 t p f s f f)); DATA(insert OID = 0 ( 1259 relhaspkey 16 0 1 17 0 -1 -1 t p f c f f)); DATA(insert OID = 0 ( 1259 relhasrules 16 0 1 18 0 -1 -1 t p f c f f)); ! DATA(insert OID = 0 ( 1259 relhassubclass 16 0 1 19 0 -1 -1 t p f c f f)); ! DATA(insert OID = 0 ( 1259 relacl 1034 0 -1 20 0 -1 -1 f p f i f f)); DATA(insert OID = 0 ( 1259 ctid 27 0 6 -1 0 -1 -1 f p f i f f)); DATA(insert OID = 0 ( 1259 oid 26 0 4 -2 0 -1 -1 t p f i f f)); DATA(insert OID = 0 ( 1259 xmin 28 0 4 -3 0 -1 -1 t p f i f f)); Index: src/include/catalog/pg_class.h =================================================================== RCS file: /usr/local/cvsroot/pgsql/src/include/catalog/pg_class.h,v retrieving revision 1.33 diff -c -r1.33 pg_class.h *** src/include/catalog/pg_class.h 2000/01/26 05:57:57 1.33 --- src/include/catalog/pg_class.h 2000/02/05 03:13:40 *************** *** 78,88 **** int2 relrefs; /* # of references to this relation */ bool relhaspkey; /* has PRIMARY KEY */ bool relhasrules; aclitem relacl[1]; /* this is here for the catalog */ } FormData_pg_class; #define CLASS_TUPLE_SIZE \ ! (offsetof(FormData_pg_class,relhasrules) + sizeof(bool)) /* ---------------- * Form_pg_class corresponds to a pointer to a tuple with --- 78,89 ---- int2 relrefs; /* # of references to this relation */ bool relhaspkey; /* has PRIMARY KEY */ bool relhasrules; + bool relhassubclass; aclitem relacl[1]; /* this is here for the catalog */ } FormData_pg_class; #define CLASS_TUPLE_SIZE \ ! (offsetof(FormData_pg_class,relhassubclass) + sizeof(bool)) /* ---------------- * Form_pg_class corresponds to a pointer to a tuple with *************** *** 102,109 **** * relacl field. * ---------------- */ ! #define Natts_pg_class_fixed 18 ! #define Natts_pg_class 19 #define Anum_pg_class_relname 1 #define Anum_pg_class_reltype 2 #define Anum_pg_class_relowner 3 --- 103,110 ---- * relacl field. * ---------------- */ ! #define Natts_pg_class_fixed 19 ! #define Natts_pg_class 20 #define Anum_pg_class_relname 1 #define Anum_pg_class_reltype 2 #define Anum_pg_class_relowner 3 *************** *** 122,128 **** #define Anum_pg_class_relrefs 16 #define Anum_pg_class_relhaspkey 17 #define Anum_pg_class_relhasrules 18 ! #define Anum_pg_class_relacl 19 /* ---------------- * initial contents of pg_class --- 123,130 ---- #define Anum_pg_class_relrefs 16 #define Anum_pg_class_relhaspkey 17 #define Anum_pg_class_relhasrules 18 ! #define Anum_pg_class_relhassubclass 19 ! #define Anum_pg_class_relacl 20 /* ---------------- * initial contents of pg_class *************** *** 135,141 **** DESCR(""); DATA(insert OID = 1255 ( pg_proc 81 PGUID 0 0 0 0 f f r 16 0 0 0 0 0 f f _null_ )); DESCR(""); ! DATA(insert OID = 1259 ( pg_class 83 PGUID 0 0 0 0 f f r 19 0 0 0 0 0 f f _null_ )); DESCR(""); DATA(insert OID = 1260 ( pg_shadow 86 PGUID 0 0 0 0 f t r 8 0 0 0 0 0 f f _null_ )); DESCR(""); --- 137,143 ---- DESCR(""); DATA(insert OID = 1255 ( pg_proc 81 PGUID 0 0 0 0 f f r 16 0 0 0 0 0 f f _null_ )); DESCR(""); ! DATA(insert OID = 1259 ( pg_class 83 PGUID 0 0 0 0 f f r 20 0 0 0 0 0 f f _null_ )); DESCR(""); DATA(insert OID = 1260 ( pg_shadow 86 PGUID 0 0 0 0 f t r 8 0 0 0 0 0 f f _null_ )); DESCR("");