Hi!

Attached is the tableoid patch. If there are no objections can I have
this applied?

Thanks!

-- 
Chris Bitmead
mailto:chris@bitmead.com
Sat, 01 Jul 2000 15:41:22 +1000
Chris Bitmead <chris@bitmead.com>
TABLEOID patch
Chris Bitmead <chris@bitmead.com> writes:
> Attached is the tableoid patch. If there are no objections can I have
> this applied?

I definitely object to the tests of tableoid that you have attached to
the inherit regress test.  Don't you realize that anything that depends
on another installation matching the exact same OIDs you have is pretty
much guaranteed to fail?

			regards, tom lane

Sat, 01 Jul 2000 13:55:56 -0400
Tom Lane <tgl@sss.pgh.pa.us>
Re: [PATCHES] TABLEOID patch 
Attached is a new patch which addresses this problem.

-- 
Chris Bitmead
mailto:chris@bitmead.com
Sun, 02 Jul 2000 19:32:59 +1000
Chris Bitmead <chris@bitmead.com>
Re: [PATCHES] TABLEOID patch
Applied.  Thanks.

> 
> Attached is a new patch which addresses this problem.
> 
> -- 
> Chris Bitmead
> mailto:chris@bitmead.com

> ? config.log
> ? config.cache
> ? config.status
> ? nohup.out
> ? GNUmakefile
> ? src/GNUmakefile
> ? src/Makefile.global
> ? src/ID
> ? src/nohup.out
> ? src/backend/postgres
> ? src/backend/fmgr.h
> ? src/backend/parse.h
> ? src/backend/global1.bki.source
> ? src/backend/local1_template1.bki.source
> ? src/backend/global1.description
> ? src/backend/local1_template1.description
> ? src/backend/1
> ? src/backend/catalog/genbki.sh
> ? src/backend/catalog/global1.bki.source
> ? src/backend/catalog/global1.description
> ? src/backend/catalog/local1_template1.bki.source
> ? src/backend/catalog/local1_template1.description
> ? src/backend/parser/y.output
> ? src/backend/parser/y.output.gz
> ? src/backend/parser/gram.y.works
> ? src/backend/parser/gram.y.works.try
> ? src/backend/parser/y.output.noerror
> ? src/backend/parser/gram.y.gz
> ? src/backend/port/Makefile
> ? src/backend/utils/fmgr.h
> ? src/backend/utils/fmgrstamp-h
> ? src/bin/initdb/initdb
> ? src/bin/initlocation/initlocation
> ? src/bin/ipcclean/ipcclean
> ? src/bin/pg_ctl/pg_ctl
> ? src/bin/pg_dump/pg_dump
> ? src/bin/pg_id/pg_id
> ? src/bin/pg_passwd/pg_passwd
> ? src/bin/pg_version/pg_version
> ? src/bin/pgtclsh/mkMakefile.tkdefs.sh
> ? src/bin/pgtclsh/mkMakefile.tcldefs.sh
> ? src/bin/psql/psql
> ? src/bin/scripts/createlang
> ? src/include/version.h
> ? src/include/config.h
> ? src/include/parser/parse.h
> ? src/include/utils/fmgroids.h
> ? src/interfaces/ecpg/lib/libecpg.so.3.1.1
> ? src/interfaces/ecpg/preproc/ecpg
> ? src/interfaces/jdbc/postgresql.jar
> ? src/interfaces/jdbc/example/psql.class
> ? src/interfaces/jdbc/postgresql/DriverClass.java
> ? src/interfaces/jdbc/postgresql/DriverClass.class
> ? src/interfaces/jdbc/postgresql/Connection.class
> ? src/interfaces/jdbc/postgresql/Field.class
> ? src/interfaces/jdbc/postgresql/PG_Stream.class
> ? src/interfaces/jdbc/postgresql/Driver.class
> ? src/interfaces/jdbc/postgresql/ResultSet.class
> ? src/interfaces/jdbc/postgresql/fastpath/Fastpath.class
> ? src/interfaces/jdbc/postgresql/fastpath/FastpathArg.class
> ? src/interfaces/jdbc/postgresql/geometric/PGbox.class
> ? src/interfaces/jdbc/postgresql/geometric/PGpoint.class
> ? src/interfaces/jdbc/postgresql/geometric/PGcircle.class
> ? src/interfaces/jdbc/postgresql/geometric/PGline.class
> ? src/interfaces/jdbc/postgresql/geometric/PGlseg.class
> ? src/interfaces/jdbc/postgresql/geometric/PGpath.class
> ? src/interfaces/jdbc/postgresql/geometric/PGpolygon.class
> ? src/interfaces/jdbc/postgresql/jdbc2/ResultSet.class
> ? src/interfaces/jdbc/postgresql/jdbc2/Connection.class
> ? src/interfaces/jdbc/postgresql/jdbc2/ResultSetMetaData.class
> ? src/interfaces/jdbc/postgresql/jdbc2/DatabaseMetaData.class
> ? src/interfaces/jdbc/postgresql/jdbc2/Statement.class
> ? src/interfaces/jdbc/postgresql/jdbc2/PreparedStatement.class
> ? src/interfaces/jdbc/postgresql/jdbc2/CallableStatement.class
> ? src/interfaces/jdbc/postgresql/largeobject/LargeObjectManager.class
> ? src/interfaces/jdbc/postgresql/largeobject/LargeObject.class
> ? src/interfaces/jdbc/postgresql/util/PSQLException.class
> ? src/interfaces/jdbc/postgresql/util/UnixCrypt.class
> ? src/interfaces/jdbc/postgresql/util/Serialize.class
> ? src/interfaces/jdbc/postgresql/util/PGobject.class
> ? src/interfaces/jdbc/postgresql/util/PGtokenizer.class
> ? src/interfaces/jdbc/postgresql/util/PGmoney.class
> ? src/interfaces/libpgeasy/libpgeasy.so.2.1
> ? src/interfaces/libpgtcl/mkMakefile.tcldefs.sh
> ? src/interfaces/libpgtcl/mkMakefile.tkdefs.sh
> ? src/interfaces/libpq/libpq.so.2.1
> ? src/interfaces/libpq++/libpq++.so.3.1
> ? src/interfaces/odbc/Makefile.global
> ? src/pl/plpgsql/src/libplpgsql.so.1.0
> ? src/test/regress/GNUmakefile
> ? src/test/regress/regress.out
> ? src/test/regress/x.x
> ? src/test/regress/nohup.out
> ? src/test/regress/regression.diffs
> ? src/test/regress/expected/copy.out
> ? src/test/regress/expected/misc.out
> ? src/test/regress/expected/create_function_1.out
> ? src/test/regress/expected/create_function_2.out
> ? src/test/regress/expected/constraints.out
> ? src/test/regress/results/boolean.out
> ? src/test/regress/results/char.out
> ? src/test/regress/results/name.out
> ? src/test/regress/results/varchar.out
> ? src/test/regress/results/text.out
> ? src/test/regress/results/int2.out
> ? src/test/regress/results/int4.out
> ? src/test/regress/results/int8.out
> ? src/test/regress/results/oid.out
> ? src/test/regress/results/float4.out
> ? src/test/regress/results/float8.out
> ? src/test/regress/results/numeric.out
> ? src/test/regress/results/strings.out
> ? src/test/regress/results/numerology.out
> ? src/test/regress/results/point.out
> ? src/test/regress/results/lseg.out
> ? src/test/regress/results/box.out
> ? src/test/regress/results/path.out
> ? src/test/regress/results/polygon.out
> ? src/test/regress/results/circle.out
> ? src/test/regress/results/interval.out
> ? src/test/regress/results/timestamp.out
> ? src/test/regress/results/reltime.out
> ? src/test/regress/results/tinterval.out
> ? src/test/regress/results/inet.out
> ? src/test/regress/results/comments.out
> ? src/test/regress/results/oidjoins.out
> ? src/test/regress/results/type_sanity.out
> ? src/test/regress/results/opr_sanity.out
> ? src/test/regress/results/abstime.out
> ? src/test/regress/results/geometry.out
> ? src/test/regress/results/horology.out
> ? src/test/regress/results/create_function_1.out
> ? src/test/regress/results/create_type.out
> ? src/test/regress/results/create_table.out
> ? src/test/regress/results/create_function_2.out
> ? src/test/regress/results/copy.out
> ? src/test/regress/results/onek.data
> ? src/test/regress/results/constraints.out
> ? src/test/regress/results/triggers.out
> ? src/test/regress/results/create_misc.out
> ? src/test/regress/results/create_aggregate.out
> ? src/test/regress/results/create_operator.out
> ? src/test/regress/results/create_index.out
> ? src/test/regress/results/inherit.out
> ? src/test/regress/results/create_view.out
> ? src/test/regress/results/sanity_check.out
> ? src/test/regress/results/errors.out
> ? src/test/regress/results/select.out
> ? src/test/regress/results/select_into.out
> ? src/test/regress/results/select_distinct.out
> ? src/test/regress/results/select_distinct_on.out
> ? src/test/regress/results/select_implicit.out
> ? src/test/regress/results/select_having.out
> ? src/test/regress/results/subselect.out
> ? src/test/regress/results/union.out
> ? src/test/regress/results/case.out
> ? src/test/regress/results/join.out
> ? src/test/regress/results/aggregates.out
> ? src/test/regress/results/transactions.out
> ? src/test/regress/results/random.out
> ? src/test/regress/results/portals.out
> ? src/test/regress/results/arrays.out
> ? src/test/regress/results/btree_index.out
> ? src/test/regress/results/hash_index.out
> ? src/test/regress/results/misc.out
> ? src/test/regress/results/select_views.out
> ? src/test/regress/results/alter_table.out
> ? src/test/regress/results/portals_p2.out
> ? src/test/regress/results/rules.out
> ? src/test/regress/results/foreign_key.out
> ? src/test/regress/results/limit.out
> ? src/test/regress/results/plpgsql.out
> ? src/test/regress/results/temp.out
> ? src/test/regress/results/stud_emp.data
> ? src/test/regress/sql/copy.sql
> ? src/test/regress/sql/misc.sql
> ? src/test/regress/sql/create_function_1.sql
> ? src/test/regress/sql/create_function_2.sql
> ? src/test/regress/sql/constraints.sql
> Index: doc/src/sgml/inherit.sgml
> ===================================================================
> RCS file: /home/projects/pgsql/cvsroot/pgsql/doc/src/sgml/inherit.sgml,v
> retrieving revision 1.10
> diff -c -r1.10 inherit.sgml
> *** doc/src/sgml/inherit.sgml	2000/06/22 22:31:15	1.10
> --- doc/src/sgml/inherit.sgml	2000/07/02 09:29:43
> ***************
> *** 96,101 ****
> --- 96,152 ----
>      <command>UPDATE</command> and <command>DELETE</command> --
>      support this <quote>ONLY</quote> notation.
>     </para>
> + 
> +   <para>
> +   In some cases you may wish to know which table a particular tuple
> +   originated from. There is a system attribute called
> +   <quote>TABLEOID</quote> in each table which can tell you the
> +   originating table:
> + 
> +    <programlisting>
> +     SELECT c.tableoid, c.name, c.altitude
> +     FROM cities c
> +     WHERE c.altitude > 500;
> +    </programlisting>
> + 
> +    which returns:
> + 
> +    <programlisting>
> + +---------+----------+----------+
> + |tableoid |name      | altitude |
> + +---------+----------+----------+
> + |37292    |Las Vegas | 2174     |
> + +---------+----------+----------+
> + |37280    |Mariposa  | 1953     |
> + +---------+----------+----------+
> + |37280    |Madison   | 845      |
> + +---------+----------+----------+
> +    </programlisting>
> + 
> +    If you do a join with pg_class you can see the actual table name:
> + 
> +    <programlisting>
> +     SELECT p.relname, c.name, c.altitude
> +     FROM cities c, pg_class p
> +     WHERE c.altitude > 500 and c.tableoid = p.oid;
> +    </programlisting>
> + 
> +    which returns:
> + 
> +    <programlisting>
> + +---------+----------+----------+
> + |relname  |name      | altitude |
> + +---------+----------+----------+
> + |capitals |Las Vegas | 2174     |
> + +---------+----------+----------+
> + |cities   |Mariposa  | 1953     |
> + +---------+----------+----------+
> + |cities   |Madison   | 845      |
> + +---------+----------+----------+
> +    </programlisting>
> +    
> +   </para>
> + 
>     <note>
>      <title>Deprecated</title> 
>      <para>
> Index: src/backend/access/common/heaptuple.c
> ===================================================================
> RCS file: /home/projects/pgsql/cvsroot/pgsql/src/backend/access/common/heaptuple.c,v
> retrieving revision 1.62
> diff -c -r1.62 heaptuple.c
> *** src/backend/access/common/heaptuple.c	2000/04/12 17:14:36	1.62
> --- src/backend/access/common/heaptuple.c	2000/07/02 09:29:46
> ***************
> *** 9,15 ****
>    *
>    *
>    * IDENTIFICATION
> !  *	  $Header: /home/projects/pgsql/cvsroot/pgsql/src/backend/access/common/heaptuple.c,v 1.62 2000/04/12 17:14:36 momjian Exp $
>    *
>    * NOTES
>    *	  The old interface functions have been converted to macros
> --- 9,15 ----
>    *
>    *
>    * IDENTIFICATION
> !  *	  $Header: /usr/local/cvsroot/pgsql/src/backend/access/common/heaptuple.c,v 1.62 2000/04/12 17:14:36 momjian Exp $
>    *
>    * NOTES
>    *	  The old interface functions have been converted to macros
> ***************
> *** 169,174 ****
> --- 169,175 ----
>   	else
>   		switch (attnum)
>   		{
> + 			case TableOidAttributeNumber:
>   			case SelfItemPointerAttributeNumber:
>   			case ObjectIdAttributeNumber:
>   			case MinTransactionIdAttributeNumber:
> ***************
> *** 205,210 ****
> --- 206,213 ----
>   
>   	switch (attno)
>   	{
> + 		case TableOidAttributeNumber:
> + 			return sizeof f->t_oid;
>   		case SelfItemPointerAttributeNumber:
>   			return sizeof f->t_ctid;
>   		case ObjectIdAttributeNumber:
> ***************
> *** 237,242 ****
> --- 240,248 ----
>   
>   	switch (attno)
>   	{
> + 		case TableOidAttributeNumber:
> + 			byval = true;
> + 			break;
>   		case SelfItemPointerAttributeNumber:
>   			byval = false;
>   			break;
> ***************
> *** 275,281 ****
>   {
>   	switch (attnum)
>   	{
> ! 			case SelfItemPointerAttributeNumber:
>   			return (Datum) &tup->t_ctid;
>   		case ObjectIdAttributeNumber:
>   			return (Datum) (long) tup->t_oid;
> --- 281,289 ----
>   {
>   	switch (attnum)
>   	{
> ! 		case TableOidAttributeNumber:
> ! 			return (Datum) &tup->t_tableoid;
> ! 		case SelfItemPointerAttributeNumber:
>   			return (Datum) &tup->t_ctid;
>   		case ObjectIdAttributeNumber:
>   			return (Datum) (long) tup->t_oid;
> Index: src/backend/access/heap/heapam.c
> ===================================================================
> RCS file: /home/projects/pgsql/cvsroot/pgsql/src/backend/access/heap/heapam.c,v
> retrieving revision 1.73
> diff -c -r1.73 heapam.c
> *** src/backend/access/heap/heapam.c	2000/06/30 16:10:40	1.73
> --- src/backend/access/heap/heapam.c	2000/07/02 09:29:49
> ***************
> *** 235,240 ****
> --- 235,242 ----
>   	int			linesleft;
>   	ItemPointer tid = (tuple->t_data == NULL) ?
>   	(ItemPointer) NULL : &(tuple->t_self);
> +     
> + 	tuple->tableOid = relation->rd_id;
>   
>   	/* ----------------
>   	 *	increment access statistics
> ***************
> *** 621,626 ****
> --- 623,629 ----
>   
>   	Assert(lockmode >= NoLock && lockmode < MAX_LOCKMODES);
>   
> + 
>   	/* ----------------
>   	 *	increment access statistics
>   	 * ----------------
> ***************
> *** 1084,1089 ****
> --- 1087,1093 ----
>   	ItemPointer tid = &(tuple->t_self);
>   	OffsetNumber offnum;
>   
> + 	tuple->tableOid = relation->rd_id;
>   	/* ----------------
>   	 *	increment access statistics
>   	 * ----------------
> ***************
> *** 1178,1183 ****
> --- 1182,1188 ----
>   	bool		invalidBlock,
>   				linkend;
>   
> + 	tp.tableOid = relation->rd_id;
>   	/* ----------------
>   	 *	get the buffer from the relation descriptor
>   	 *	Note that this does a buffer pin.
> ***************
> *** 1270,1275 ****
> --- 1275,1281 ----
>   	 *	increment access statistics
>   	 * ----------------
>   	 */
> + 	tup->tableOid = relation->rd_id;
>   	IncrHeapAccessStat(local_insert);
>   	IncrHeapAccessStat(global_insert);
>   
> ***************
> *** 1335,1340 ****
> --- 1341,1347 ----
>   	Buffer		buffer;
>   	int			result;
>   
> + 	tp.tableOid = relation->rd_id;
>   	/* increment access statistics */
>   	IncrHeapAccessStat(local_delete);
>   	IncrHeapAccessStat(global_delete);
> ***************
> *** 1447,1452 ****
> --- 1454,1460 ----
>   	Buffer		buffer;
>   	int			result;
>   
> + 	newtup->tableOid = relation->rd_id;
>   	/* increment access statistics */
>   	IncrHeapAccessStat(local_replace);
>   	IncrHeapAccessStat(global_replace);
> ***************
> *** 1575,1580 ****
> --- 1583,1589 ----
>   	PageHeader	dp;
>   	int			result;
>   
> + 	tuple->tableOid = relation->rd_id;
>   	/* increment access statistics */
>   	IncrHeapAccessStat(local_mark4update);
>   	IncrHeapAccessStat(global_mark4update);
> Index: src/backend/catalog/heap.c
> ===================================================================
> RCS file: /home/projects/pgsql/cvsroot/pgsql/src/backend/catalog/heap.c,v
> retrieving revision 1.135
> diff -c -r1.135 heap.c
> *** src/backend/catalog/heap.c	2000/07/02 04:46:09	1.135
> --- src/backend/catalog/heap.c	2000/07/02 09:29:55
> ***************
> *** 131,142 ****
>   	MaxCommandIdAttributeNumber, 0, -1, -1, '\001', 'p', '\0', 'i', '\0', '\0'
>   };
>   
> ! static Form_pg_attribute HeapAtt[] = {&a1, &a2, &a3, &a4, &a5, &a6};
>   
>   /* ----------------------------------------------------------------
>    *				XXX END OF UGLY HARD CODED BADNESS XXX
> !  * ----------------------------------------------------------------
> !  */
>   
>   
>   /* ----------------------------------------------------------------
> --- 131,152 ----
>   	MaxCommandIdAttributeNumber, 0, -1, -1, '\001', 'p', '\0', 'i', '\0', '\0'
>   };
>   
> ! /* 
> !    We decide to call this attribute "tableoid" rather than say
> ! "classoid" on the basis that in the future there may be more than one
> ! table of a particular class/type. In any case table is still the word
> ! used in SQL. 
> ! */
> ! static FormData_pg_attribute a7 = {
> ! 	0xffffffff, {"tableoid"}, OIDOID, 0, sizeof(Oid),
> ! 	TableOidAttributeNumber, 0, -1, -1, '\001', 'p', '\0', 'i', '\0', '\0'
> ! };
>   
> + static Form_pg_attribute HeapAtt[] = {&a1, &a2, &a3, &a4, &a5, &a6, &a7};
> + 
>   /* ----------------------------------------------------------------
>    *				XXX END OF UGLY HARD CODED BADNESS XXX
> !  * ---------------------------------------------------------------- */
>   
>   
>   /* ----------------------------------------------------------------
> Index: src/backend/parser/parse_relation.c
> ===================================================================
> RCS file: /home/projects/pgsql/cvsroot/pgsql/src/backend/parser/parse_relation.c,v
> retrieving revision 1.44
> diff -c -r1.44 parse_relation.c
> *** src/backend/parser/parse_relation.c	2000/06/20 01:41:21	1.44
> --- src/backend/parser/parse_relation.c	2000/07/02 09:29:56
> ***************
> *** 57,62 ****
> --- 57,65 ----
>   	{
>   		"cmax", MaxCommandIdAttributeNumber, CIDOID
>   	},
> + 	{
> + 		"tableoid", TableOidAttributeNumber, OIDOID
> + 	}
>   };
>   
>   #define SPECIALS ((int) (sizeof(special_attr)/sizeof(special_attr[0])))
> Index: src/backend/utils/cache/lsyscache.c
> ===================================================================
> RCS file: /home/projects/pgsql/cvsroot/pgsql/src/backend/utils/cache/lsyscache.c,v
> retrieving revision 1.42
> diff -c -r1.42 lsyscache.c
> *** src/backend/utils/cache/lsyscache.c	2000/06/08 22:37:30	1.42
> --- src/backend/utils/cache/lsyscache.c	2000/07/02 09:29:58
> ***************
> *** 249,254 ****
> --- 249,256 ----
>   	if (attnum == ObjectIdAttributeNumber ||
>   		attnum == SelfItemPointerAttributeNumber)
>   		return 1.0 / (double) ntuples;
> + 	if (attnum == TableOidAttributeNumber)
> + 		return 1.0;
>   
>   	/*
>   	 * VACUUM ANALYZE has not been run for this table. Produce an estimate
> Index: src/include/access/heapam.h
> ===================================================================
> RCS file: /home/projects/pgsql/cvsroot/pgsql/src/include/access/heapam.h,v
> retrieving revision 1.54
> diff -c -r1.54 heapam.h
> *** src/include/access/heapam.h	2000/06/30 16:10:49	1.54
> --- src/include/access/heapam.h	2000/07/02 09:30:00
> ***************
> *** 165,200 ****
>    *
>    * ----------------
>    */
> ! #define heap_getattr(tup, attnum, tupleDesc, isnull)						\
> ! (																			\
> ! 	AssertMacro((tup) != NULL &&											\
> ! 		(attnum) > FirstLowInvalidHeapAttributeNumber &&					\
> ! 		(attnum) != 0),														\
> ! 	((attnum) > (int) (tup)->t_data->t_natts) ?								\
> ! 	(																		\
> ! 		((isnull) ? (*(isnull) = true) : (dummyret)NULL),					\
> ! 		(Datum)NULL															\
> ! 	)																		\
> ! 	:																		\
> ! 	(																		\
> ! 		((attnum) > 0) ?													\
> ! 		(																	\
> ! 			fastgetattr((tup), (attnum), (tupleDesc), (isnull))				\
> ! 		)																	\
> ! 		:																	\
> ! 		(																	\
> ! 			((isnull) ? (*(isnull) = false) : (dummyret)NULL),				\
> ! 			((attnum) == SelfItemPointerAttributeNumber) ?					\
> ! 			(																\
> ! 				(Datum)((char *)&((tup)->t_self))							\
> ! 			)																\
> ! 			:																\
> ! 			(																\
> ! 				(Datum)*(unsigned int *)									\
> ! 					((char *)(tup)->t_data + heap_sysoffset[-(attnum)-1])	\
> ! 			)																\
> ! 		)																	\
> ! 	)																		\
>   )
>   
>   extern HeapAccessStatistics heap_access_stats;	/* in stats.c */
> --- 165,205 ----
>    *
>    * ----------------
>    */
> ! #define heap_getattr(tup, attnum, tupleDesc, isnull) \
> ! ( \
> ! 	AssertMacro((tup) != NULL && \
> ! 		(attnum) > FirstLowInvalidHeapAttributeNumber && \
> ! 		(attnum) != 0), \
> ! 	((attnum) > (int) (tup)->t_data->t_natts) ? \
> ! 	( \
> ! 		((isnull) ? (*(isnull) = true) : (dummyret)NULL), \
> ! 		(Datum)NULL \
> ! 	) \
> ! 	: \
> ! 	( \
> ! 		((attnum) > 0) ? \
> ! 		( \
> ! 			fastgetattr((tup), (attnum), (tupleDesc), (isnull)) \
> ! 		) \
> ! 		: \
> ! 		( \
> ! 			((isnull) ? (*(isnull) = false) : (dummyret)NULL), \
> ! 			((attnum) == SelfItemPointerAttributeNumber) ? \
> ! 			( \
> ! 				(Datum)((char *)&((tup)->t_self)) \
> ! 			) \
> ! 			: \
> ! 			(((attnum) == TableOidAttributeNumber) ? \
> ! 			( \
> ! 				(Datum)((tup)->tableOid) \
> ! 			) \
> !             : \
> ! 			( \
> ! 				(Datum)*(unsigned int *) \
> ! 					((char *)(tup)->t_data + heap_sysoffset[-(attnum)-1]) \
> ! 			)) \
> ! 		) \
> ! 	) \
>   )
>   
>   extern HeapAccessStatistics heap_access_stats;	/* in stats.c */
> Index: src/include/access/htup.h
> ===================================================================
> RCS file: /home/projects/pgsql/cvsroot/pgsql/src/include/access/htup.h,v
> retrieving revision 1.30
> diff -c -r1.30 htup.h
> *** src/include/access/htup.h	2000/06/02 10:20:26	1.30
> --- src/include/access/htup.h	2000/07/02 09:30:01
> ***************
> *** 133,139 ****
>   #define MinCommandIdAttributeNumber				(-4)
>   #define MaxTransactionIdAttributeNumber			(-5)
>   #define MaxCommandIdAttributeNumber				(-6)
> ! #define FirstLowInvalidHeapAttributeNumber		(-7)
>   
>   /* If you make any changes above, the order off offsets in this must change */
>   extern long heap_sysoffset[];
> --- 133,140 ----
>   #define MinCommandIdAttributeNumber				(-4)
>   #define MaxTransactionIdAttributeNumber			(-5)
>   #define MaxCommandIdAttributeNumber				(-6)
> ! #define TableOidAttributeNumber			        (-7)
> ! #define FirstLowInvalidHeapAttributeNumber		(-8)
>   
>   /* If you make any changes above, the order off offsets in this must change */
>   extern long heap_sysoffset[];
> ***************
> *** 156,161 ****
> --- 157,163 ----
>   {
>   	uint32		t_len;			/* length of *t_data */
>   	ItemPointerData t_self;		/* SelfItemPointer */
> + 	Oid tableOid;                    /* */
>   	MemoryContext t_datamcxt;	/* */
>   	HeapTupleHeader t_data;		/* */
>   } HeapTupleData;
> Index: src/include/catalog/pg_attribute.h
> ===================================================================
> RCS file: /home/projects/pgsql/cvsroot/pgsql/src/include/catalog/pg_attribute.h,v
> retrieving revision 1.59
> diff -c -r1.59 pg_attribute.h
> *** src/include/catalog/pg_attribute.h	2000/06/12 03:40:52	1.59
> --- src/include/catalog/pg_attribute.h	2000/07/02 09:30:03
> ***************
> *** 267,272 ****
> --- 267,273 ----
>   DATA(insert OID = 0 ( 1247 cmin				29 0  4  -4 0 -1 -1 t p f i f f));
>   DATA(insert OID = 0 ( 1247 xmax				28 0  4  -5 0 -1 -1 t p f i f f));
>   DATA(insert OID = 0 ( 1247 cmax				29 0  4  -6 0 -1 -1 t p f i f f));
> + DATA(insert OID = 0 ( 1247 tableoid			26 0  4  -7 0 -1 -1 t p f i f f));
>   
>   /* ----------------
>    *		pg_database
> ***************
> *** 282,287 ****
> --- 283,289 ----
>   DATA(insert OID = 0 ( 1262 cmin				29 0  4  -4 0 -1 -1 t p f i f f));
>   DATA(insert OID = 0 ( 1262 xmax				28 0  4  -5 0 -1 -1 t p f i f f));
>   DATA(insert OID = 0 ( 1262 cmax				29 0  4  -6 0 -1 -1 t p f i f f));
> + DATA(insert OID = 0 ( 1262 tableoid			26 0  4  -7 0 -1 -1 t p f i f f));
>   
>   /* ----------------
>    *		pg_proc
> ***************
> *** 329,334 ****
> --- 331,337 ----
>   DATA(insert OID = 0 ( 1255 cmin				29 0  4  -4 0 -1 -1 t p f i f f));
>   DATA(insert OID = 0 ( 1255 xmax				28 0  4  -5 0 -1 -1 t p f i f f));
>   DATA(insert OID = 0 ( 1255 cmax				29 0  4  -6 0 -1 -1 t p f i f f));
> + DATA(insert OID = 0 ( 1255 tableoid			26 0  4  -7 0 -1 -1 t p f i f f));
>   
>   /* ----------------
>    *		pg_shadow
> ***************
> *** 348,353 ****
> --- 351,357 ----
>   DATA(insert OID = 0 ( 1260 cmin				29 0  4  -4 0 -1 -1 t p f i f f));
>   DATA(insert OID = 0 ( 1260 xmax				28 0  4  -5 0 -1 -1 t p f i f f));
>   DATA(insert OID = 0 ( 1260 cmax				29 0  4  -6 0 -1 -1 t p f i f f));
> + DATA(insert OID = 0 ( 1260 tableoid			26 0  4  -7 0 -1 -1 t p f i f f));
>   
>   /* ----------------
>    *		pg_group
> ***************
> *** 362,367 ****
> --- 366,372 ----
>   DATA(insert OID = 0 ( 1261 cmin				29 0  4  -4 0 -1 -1 t p f i f f));
>   DATA(insert OID = 0 ( 1261 xmax				28 0  4  -5 0 -1 -1 t p f i f f));
>   DATA(insert OID = 0 ( 1261 cmax				29 0  4  -6 0 -1 -1 t p f i f f));
> + DATA(insert OID = 0 ( 1261 tableoid			26 0  4  -7 0 -1 -1 t p f i f f));
>   
>   /* ----------------
>    *		pg_attribute
> ***************
> *** 405,410 ****
> --- 410,416 ----
>   DATA(insert OID = 0 ( 1249 cmin				29 0  4  -4 0 -1 -1 t p f i f f));
>   DATA(insert OID = 0 ( 1249 xmax				28 0  4  -5 0 -1 -1 t p f i f f));
>   DATA(insert OID = 0 ( 1249 cmax				29 0  4  -6 0 -1 -1 t p f i f f));
> + DATA(insert OID = 0 ( 1249 tableoid			26 0  4  -7 0 -1 -1 t p f i f f));
>   
>   /* ----------------
>    *		pg_class
> ***************
> *** 458,463 ****
> --- 464,470 ----
>   DATA(insert OID = 0 ( 1259 cmin				29 0  4  -4 0 -1 -1 t p f i f f));
>   DATA(insert OID = 0 ( 1259 xmax				28 0  4  -5 0 -1 -1 t p f i f f));
>   DATA(insert OID = 0 ( 1259 cmax				29 0  4  -6 0 -1 -1 t p f i f f));
> + DATA(insert OID = 0 ( 1259 tableoid			26 0  4  -7 0 -1 -1 t p f i f f));
>   
>   /* ----------------
>    *		pg_attrdef
> ***************
> *** 473,478 ****
> --- 480,486 ----
>   DATA(insert OID = 0 ( 1215 cmin				29 0  4  -4 0 -1 -1 t p f i f f));
>   DATA(insert OID = 0 ( 1215 xmax				28 0  4  -5 0 -1 -1 t p f i f f));
>   DATA(insert OID = 0 ( 1215 cmax				29 0  4  -6 0 -1 -1 t p f i f f));
> + DATA(insert OID = 0 ( 1215 tableoid			26 0  4  -7 0 -1 -1 t p f i f f));
>   
>   /* ----------------
>    *		pg_relcheck
> ***************
> *** 488,493 ****
> --- 496,502 ----
>   DATA(insert OID = 0 ( 1216 cmin				29 0  4  -4 0 -1 -1 t p f i f f));
>   DATA(insert OID = 0 ( 1216 xmax				28 0  4  -5 0 -1 -1 t p f i f f));
>   DATA(insert OID = 0 ( 1216 cmax				29 0  4  -6 0 -1 -1 t p f i f f));
> + DATA(insert OID = 0 ( 1216 tableoid			26 0  4  -7 0 -1 -1 t p f i f f));
>   
>   /* ----------------
>    *		pg_trigger
> ***************
> *** 513,518 ****
> --- 522,528 ----
>   DATA(insert OID = 0 ( 1219 cmin				29 0  4  -4 0 -1 -1 t p f i f f));
>   DATA(insert OID = 0 ( 1219 xmax				28 0  4  -5 0 -1 -1 t p f i f f));
>   DATA(insert OID = 0 ( 1219 cmax				29 0  4  -6 0 -1 -1 t p f i f f));
> + DATA(insert OID = 0 ( 1219 tableoid			26 0  4  -7 0 -1 -1 t p f i f f));
>   
>   /* ----------------
>    *		pg_variable - this relation is modified by special purpose access
> Index: src/test/regress/expected/inherit.out
> ===================================================================
> RCS file: /home/projects/pgsql/cvsroot/pgsql/src/test/regress/expected/inherit.out,v
> retrieving revision 1.1
> diff -c -r1.1 inherit.out
> *** src/test/regress/expected/inherit.out	2000/06/09 11:12:37	1.1
> --- src/test/regress/expected/inherit.out	2000/07/02 09:30:08
> ***************
> *** 29,150 ****
>   INSERT INTO d(aa) VALUES('dddddd');
>   INSERT INTO d(aa) VALUES('ddddddd');
>   INSERT INTO d(aa) VALUES('dddddddd');
> ! SELECT * FROM a;
> !     aa    
> ! ----------
> !  aaa
> !  aaaa
> !  aaaaa
> !  aaaaaa
> !  aaaaaaa
> !  aaaaaaaa
> !  bbb
> !  bbbb
> !  bbbbb
> !  bbbbbb
> !  bbbbbbb
> !  bbbbbbbb
> !  ccc
> !  cccc
> !  ccccc
> !  cccccc
> !  ccccccc
> !  cccccccc
> !  ddd
> !  dddd
> !  ddddd
> !  dddddd
> !  ddddddd
> !  dddddddd
>   (24 rows)
>   
> ! SELECT * FROM b;
> !     aa    | bb 
> ! ----------+----
> !  bbb      | 
> !  bbbb     | 
> !  bbbbb    | 
> !  bbbbbb   | 
> !  bbbbbbb  | 
> !  bbbbbbbb | 
> !  ddd      | 
> !  dddd     | 
> !  ddddd    | 
> !  dddddd   | 
> !  ddddddd  | 
> !  dddddddd | 
>   (12 rows)
>   
> ! SELECT * FROM c;
> !     aa    | cc 
> ! ----------+----
> !  ccc      | 
> !  cccc     | 
> !  ccccc    | 
> !  cccccc   | 
> !  ccccccc  | 
> !  cccccccc | 
> !  ddd      | 
> !  dddd     | 
> !  ddddd    | 
> !  dddddd   | 
> !  ddddddd  | 
> !  dddddddd | 
>   (12 rows)
>   
> ! SELECT * FROM d;
> !     aa    | bb | cc | dd 
> ! ----------+----+----+----
> !  ddd      |    |    | 
> !  dddd     |    |    | 
> !  ddddd    |    |    | 
> !  dddddd   |    |    | 
> !  ddddddd  |    |    | 
> !  dddddddd |    |    | 
> ! (6 rows)
> ! 
> ! SELECT * FROM ONLY a;
> !     aa    
> ! ----------
> !  aaa
> !  aaaa
> !  aaaaa
> !  aaaaaa
> !  aaaaaaa
> !  aaaaaaaa
> ! (6 rows)
> ! 
> ! SELECT * FROM ONLY b;
> !     aa    | bb 
> ! ----------+----
> !  bbb      | 
> !  bbbb     | 
> !  bbbbb    | 
> !  bbbbbb   | 
> !  bbbbbbb  | 
> !  bbbbbbbb | 
> ! (6 rows)
> ! 
> ! SELECT * FROM ONLY c;
> !     aa    | cc 
> ! ----------+----
> !  ccc      | 
> !  cccc     | 
> !  ccccc    | 
> !  cccccc   | 
> !  ccccccc  | 
> !  cccccccc | 
> ! (6 rows)
> ! 
> ! SELECT * FROM ONLY d;
> !     aa    | bb | cc | dd 
> ! ----------+----+----+----
> !  ddd      |    |    | 
> !  dddd     |    |    | 
> !  ddddd    |    |    | 
> !  dddddd   |    |    | 
> !  ddddddd  |    |    | 
> !  dddddddd |    |    | 
>   (6 rows)
>   
>   UPDATE a SET aa='zzzz' WHERE aa='aaaa';
> --- 29,150 ----
>   INSERT INTO d(aa) VALUES('dddddd');
>   INSERT INTO d(aa) VALUES('ddddddd');
>   INSERT INTO d(aa) VALUES('dddddddd');
> ! SELECT relname, a.* FROM a, pg_class where a.tableoid = pg_class.oid;
> !  relname |    aa    
> ! ---------+----------
> !  a       | aaa
> !  a       | aaaa
> !  a       | aaaaa
> !  a       | aaaaaa
> !  a       | aaaaaaa
> !  a       | aaaaaaaa
> !  b       | bbb
> !  b       | bbbb
> !  b       | bbbbb
> !  b       | bbbbbb
> !  b       | bbbbbbb
> !  b       | bbbbbbbb
> !  c       | ccc
> !  c       | cccc
> !  c       | ccccc
> !  c       | cccccc
> !  c       | ccccccc
> !  c       | cccccccc
> !  d       | ddd
> !  d       | dddd
> !  d       | ddddd
> !  d       | dddddd
> !  d       | ddddddd
> !  d       | dddddddd
>   (24 rows)
>   
> ! SELECT relname, b.* FROM b, pg_class where b.tableoid = pg_class.oid;
> !  relname |    aa    | bb 
> ! ---------+----------+----
> !  b       | bbb      | 
> !  b       | bbbb     | 
> !  b       | bbbbb    | 
> !  b       | bbbbbb   | 
> !  b       | bbbbbbb  | 
> !  b       | bbbbbbbb | 
> !  d       | ddd      | 
> !  d       | dddd     | 
> !  d       | ddddd    | 
> !  d       | dddddd   | 
> !  d       | ddddddd  | 
> !  d       | dddddddd | 
>   (12 rows)
>   
> ! SELECT relname, c.* FROM c, pg_class where c.tableoid = pg_class.oid;
> !  relname |    aa    | cc 
> ! ---------+----------+----
> !  c       | ccc      | 
> !  c       | cccc     | 
> !  c       | ccccc    | 
> !  c       | cccccc   | 
> !  c       | ccccccc  | 
> !  c       | cccccccc | 
> !  d       | ddd      | 
> !  d       | dddd     | 
> !  d       | ddddd    | 
> !  d       | dddddd   | 
> !  d       | ddddddd  | 
> !  d       | dddddddd | 
>   (12 rows)
>   
> ! SELECT relname, d.* FROM d, pg_class where d.tableoid = pg_class.oid;
> !  relname |    aa    | bb | cc | dd 
> ! ---------+----------+----+----+----
> !  d       | ddd      |    |    | 
> !  d       | dddd     |    |    | 
> !  d       | ddddd    |    |    | 
> !  d       | dddddd   |    |    | 
> !  d       | ddddddd  |    |    | 
> !  d       | dddddddd |    |    | 
> ! (6 rows)
> ! 
> ! SELECT relname, a.* FROM ONLY a, pg_class where a.tableoid = pg_class.oid;
> !  relname |    aa    
> ! ---------+----------
> !  a       | aaa
> !  a       | aaaa
> !  a       | aaaaa
> !  a       | aaaaaa
> !  a       | aaaaaaa
> !  a       | aaaaaaaa
> ! (6 rows)
> ! 
> ! SELECT relname, b.* FROM ONLY b, pg_class where b.tableoid = pg_class.oid;
> !  relname |    aa    | bb 
> ! ---------+----------+----
> !  b       | bbb      | 
> !  b       | bbbb     | 
> !  b       | bbbbb    | 
> !  b       | bbbbbb   | 
> !  b       | bbbbbbb  | 
> !  b       | bbbbbbbb | 
> ! (6 rows)
> ! 
> ! SELECT relname, c.* FROM ONLY c, pg_class where c.tableoid = pg_class.oid;
> !  relname |    aa    | cc 
> ! ---------+----------+----
> !  c       | ccc      | 
> !  c       | cccc     | 
> !  c       | ccccc    | 
> !  c       | cccccc   | 
> !  c       | ccccccc  | 
> !  c       | cccccccc | 
> ! (6 rows)
> ! 
> ! SELECT relname, d.* FROM ONLY d, pg_class where d.tableoid = pg_class.oid;
> !  relname |    aa    | bb | cc | dd 
> ! ---------+----------+----+----+----
> !  d       | ddd      |    |    | 
> !  d       | dddd     |    |    | 
> !  d       | ddddd    |    |    | 
> !  d       | dddddd   |    |    | 
> !  d       | ddddddd  |    |    | 
> !  d       | dddddddd |    |    | 
>   (6 rows)
>   
>   UPDATE a SET aa='zzzz' WHERE aa='aaaa';
> ***************
> *** 152,534 ****
>   UPDATE b SET aa='zzz' WHERE aa='aaa';
>   UPDATE ONLY b SET aa='zzz' WHERE aa='aaa';
>   UPDATE a SET aa='zzzzzz' WHERE aa LIKE 'aaa%';
> ! SELECT * FROM a;
> !     aa    
> ! ----------
> !  zzzz
> !  zzzzz
> !  zzzzzz
> !  zzzzzz
> !  zzzzzz
> !  zzzzzz
> !  bbb
> !  bbbb
> !  bbbbb
> !  bbbbbb
> !  bbbbbbb
> !  bbbbbbbb
> !  ccc
> !  cccc
> !  ccccc
> !  cccccc
> !  ccccccc
> !  cccccccc
> !  ddd
> !  dddd
> !  ddddd
> !  dddddd
> !  ddddddd
> !  dddddddd
>   (24 rows)
>   
> ! SELECT * FROM b;
> !     aa    | bb 
> ! ----------+----
> !  bbb      | 
> !  bbbb     | 
> !  bbbbb    | 
> !  bbbbbb   | 
> !  bbbbbbb  | 
> !  bbbbbbbb | 
> !  ddd      | 
> !  dddd     | 
> !  ddddd    | 
> !  dddddd   | 
> !  ddddddd  | 
> !  dddddddd | 
>   (12 rows)
>   
> ! SELECT * FROM c;
> !     aa    | cc 
> ! ----------+----
> !  ccc      | 
> !  cccc     | 
> !  ccccc    | 
> !  cccccc   | 
> !  ccccccc  | 
> !  cccccccc | 
> !  ddd      | 
> !  dddd     | 
> !  ddddd    | 
> !  dddddd   | 
> !  ddddddd  | 
> !  dddddddd | 
>   (12 rows)
>   
> ! SELECT * FROM d;
> !     aa    | bb | cc | dd 
> ! ----------+----+----+----
> !  ddd      |    |    | 
> !  dddd     |    |    | 
> !  ddddd    |    |    | 
> !  dddddd   |    |    | 
> !  ddddddd  |    |    | 
> !  dddddddd |    |    | 
> ! (6 rows)
> ! 
> ! SELECT * FROM ONLY a;
> !    aa   
> ! --------
> !  zzzz
> !  zzzzz
> !  zzzzzz
> !  zzzzzz
> !  zzzzzz
> !  zzzzzz
> ! (6 rows)
> ! 
> ! SELECT * FROM ONLY b;
> !     aa    | bb 
> ! ----------+----
> !  bbb      | 
> !  bbbb     | 
> !  bbbbb    | 
> !  bbbbbb   | 
> !  bbbbbbb  | 
> !  bbbbbbbb | 
> ! (6 rows)
> ! 
> ! SELECT * FROM ONLY c;
> !     aa    | cc 
> ! ----------+----
> !  ccc      | 
> !  cccc     | 
> !  ccccc    | 
> !  cccccc   | 
> !  ccccccc  | 
> !  cccccccc | 
> ! (6 rows)
> ! 
> ! SELECT * FROM ONLY d;
> !     aa    | bb | cc | dd 
> ! ----------+----+----+----
> !  ddd      |    |    | 
> !  dddd     |    |    | 
> !  ddddd    |    |    | 
> !  dddddd   |    |    | 
> !  ddddddd  |    |    | 
> !  dddddddd |    |    | 
>   (6 rows)
>   
>   UPDATE b SET aa='new';
> ! SELECT * FROM a;
> !     aa    
> ! ----------
> !  zzzz
> !  zzzzz
> !  zzzzzz
> !  zzzzzz
> !  zzzzzz
> !  zzzzzz
> !  new
> !  new
> !  new
> !  new
> !  new
> !  new
> !  ccc
> !  cccc
> !  ccccc
> !  cccccc
> !  ccccccc
> !  cccccccc
> !  new
> !  new
> !  new
> !  new
> !  new
> !  new
>   (24 rows)
>   
> ! SELECT * FROM b;
> !  aa  | bb 
> ! -----+----
> !  new | 
> !  new | 
> !  new | 
> !  new | 
> !  new | 
> !  new | 
> !  new | 
> !  new | 
> !  new | 
> !  new | 
> !  new | 
> !  new | 
>   (12 rows)
>   
> ! SELECT * FROM c;
> !     aa    | cc 
> ! ----------+----
> !  ccc      | 
> !  cccc     | 
> !  ccccc    | 
> !  cccccc   | 
> !  ccccccc  | 
> !  cccccccc | 
> !  new      | 
> !  new      | 
> !  new      | 
> !  new      | 
> !  new      | 
> !  new      | 
>   (12 rows)
>   
> ! SELECT * FROM d;
> !  aa  | bb | cc | dd 
> ! -----+----+----+----
> !  new |    |    | 
> !  new |    |    | 
> !  new |    |    | 
> !  new |    |    | 
> !  new |    |    | 
> !  new |    |    | 
> ! (6 rows)
> ! 
> ! SELECT * FROM ONLY a;
> !    aa   
> ! --------
> !  zzzz
> !  zzzzz
> !  zzzzzz
> !  zzzzzz
> !  zzzzzz
> !  zzzzzz
> ! (6 rows)
> ! 
> ! SELECT * FROM ONLY b;
> !  aa  | bb 
> ! -----+----
> !  new | 
> !  new | 
> !  new | 
> !  new | 
> !  new | 
> !  new | 
> ! (6 rows)
> ! 
> ! SELECT * FROM ONLY c;
> !     aa    | cc 
> ! ----------+----
> !  ccc      | 
> !  cccc     | 
> !  ccccc    | 
> !  cccccc   | 
> !  ccccccc  | 
> !  cccccccc | 
> ! (6 rows)
> ! 
> ! SELECT * FROM ONLY d;
> !  aa  | bb | cc | dd 
> ! -----+----+----+----
> !  new |    |    | 
> !  new |    |    | 
> !  new |    |    | 
> !  new |    |    | 
> !  new |    |    | 
> !  new |    |    | 
>   (6 rows)
>   
>   UPDATE a SET aa='new';
>   DELETE FROM ONLY c WHERE aa='new';
> ! SELECT * FROM a;
> !  aa  
> ! -----
> !  new
> !  new
> !  new
> !  new
> !  new
> !  new
> !  new
> !  new
> !  new
> !  new
> !  new
> !  new
> !  new
> !  new
> !  new
> !  new
> !  new
> !  new
>   (18 rows)
>   
> ! SELECT * FROM b;
> !  aa  | bb 
> ! -----+----
> !  new | 
> !  new | 
> !  new | 
> !  new | 
> !  new | 
> !  new | 
> !  new | 
> !  new | 
> !  new | 
> !  new | 
> !  new | 
> !  new | 
>   (12 rows)
>   
> ! SELECT * FROM c;
> !  aa  | cc 
> ! -----+----
> !  new | 
> !  new | 
> !  new | 
> !  new | 
> !  new | 
> !  new | 
> ! (6 rows)
> ! 
> ! SELECT * FROM d;
> !  aa  | bb | cc | dd 
> ! -----+----+----+----
> !  new |    |    | 
> !  new |    |    | 
> !  new |    |    | 
> !  new |    |    | 
> !  new |    |    | 
> !  new |    |    | 
> ! (6 rows)
> ! 
> ! SELECT * FROM ONLY a;
> !  aa  
> ! -----
> !  new
> !  new
> !  new
> !  new
> !  new
> !  new
> ! (6 rows)
> ! 
> ! SELECT * FROM ONLY b;
> !  aa  | bb 
> ! -----+----
> !  new | 
> !  new | 
> !  new | 
> !  new | 
> !  new | 
> !  new | 
> ! (6 rows)
> ! 
> ! SELECT * FROM ONLY c;
> !  aa | cc 
> ! ----+----
>   (0 rows)
>   
> ! SELECT * FROM ONLY d;
> !  aa  | bb | cc | dd 
> ! -----+----+----+----
> !  new |    |    | 
> !  new |    |    | 
> !  new |    |    | 
> !  new |    |    | 
> !  new |    |    | 
> !  new |    |    | 
>   (6 rows)
>   
>   DELETE FROM a;
> ! SELECT * FROM a;
> !  aa 
> ! ----
>   (0 rows)
>   
> ! SELECT * FROM b;
> !  aa | bb 
> ! ----+----
>   (0 rows)
>   
> ! SELECT * FROM c;
> !  aa | cc 
> ! ----+----
>   (0 rows)
>   
> ! SELECT * FROM d;
> !  aa | bb | cc | dd 
> ! ----+----+----+----
>   (0 rows)
>   
> ! SELECT * FROM ONLY a;
> !  aa 
> ! ----
>   (0 rows)
>   
> ! SELECT * FROM ONLY b;
> !  aa | bb 
> ! ----+----
>   (0 rows)
>   
> ! SELECT * FROM ONLY c;
> !  aa | cc 
> ! ----+----
>   (0 rows)
>   
> ! SELECT * FROM ONLY d;
> !  aa | bb | cc | dd 
> ! ----+----+----+----
>   (0 rows)
>   
> --- 152,534 ----
>   UPDATE b SET aa='zzz' WHERE aa='aaa';
>   UPDATE ONLY b SET aa='zzz' WHERE aa='aaa';
>   UPDATE a SET aa='zzzzzz' WHERE aa LIKE 'aaa%';
> ! SELECT relname, a.* FROM a, pg_class where a.tableoid = pg_class.oid;
> !  relname |    aa    
> ! ---------+----------
> !  a       | zzzz
> !  a       | zzzzz
> !  a       | zzzzzz
> !  a       | zzzzzz
> !  a       | zzzzzz
> !  a       | zzzzzz
> !  b       | bbb
> !  b       | bbbb
> !  b       | bbbbb
> !  b       | bbbbbb
> !  b       | bbbbbbb
> !  b       | bbbbbbbb
> !  c       | ccc
> !  c       | cccc
> !  c       | ccccc
> !  c       | cccccc
> !  c       | ccccccc
> !  c       | cccccccc
> !  d       | ddd
> !  d       | dddd
> !  d       | ddddd
> !  d       | dddddd
> !  d       | ddddddd
> !  d       | dddddddd
>   (24 rows)
>   
> ! SELECT relname, b.* FROM b, pg_class where b.tableoid = pg_class.oid;
> !  relname |    aa    | bb 
> ! ---------+----------+----
> !  b       | bbb      | 
> !  b       | bbbb     | 
> !  b       | bbbbb    | 
> !  b       | bbbbbb   | 
> !  b       | bbbbbbb  | 
> !  b       | bbbbbbbb | 
> !  d       | ddd      | 
> !  d       | dddd     | 
> !  d       | ddddd    | 
> !  d       | dddddd   | 
> !  d       | ddddddd  | 
> !  d       | dddddddd | 
>   (12 rows)
>   
> ! SELECT relname, c.* FROM c, pg_class where c.tableoid = pg_class.oid;
> !  relname |    aa    | cc 
> ! ---------+----------+----
> !  c       | ccc      | 
> !  c       | cccc     | 
> !  c       | ccccc    | 
> !  c       | cccccc   | 
> !  c       | ccccccc  | 
> !  c       | cccccccc | 
> !  d       | ddd      | 
> !  d       | dddd     | 
> !  d       | ddddd    | 
> !  d       | dddddd   | 
> !  d       | ddddddd  | 
> !  d       | dddddddd | 
>   (12 rows)
>   
> ! SELECT relname, d.* FROM d, pg_class where d.tableoid = pg_class.oid;
> !  relname |    aa    | bb | cc | dd 
> ! ---------+----------+----+----+----
> !  d       | ddd      |    |    | 
> !  d       | dddd     |    |    | 
> !  d       | ddddd    |    |    | 
> !  d       | dddddd   |    |    | 
> !  d       | ddddddd  |    |    | 
> !  d       | dddddddd |    |    | 
> ! (6 rows)
> ! 
> ! SELECT relname, a.* FROM ONLY a, pg_class where a.tableoid = pg_class.oid;
> !  relname |   aa   
> ! ---------+--------
> !  a       | zzzz
> !  a       | zzzzz
> !  a       | zzzzzz
> !  a       | zzzzzz
> !  a       | zzzzzz
> !  a       | zzzzzz
> ! (6 rows)
> ! 
> ! SELECT relname, b.* FROM ONLY b, pg_class where b.tableoid = pg_class.oid;
> !  relname |    aa    | bb 
> ! ---------+----------+----
> !  b       | bbb      | 
> !  b       | bbbb     | 
> !  b       | bbbbb    | 
> !  b       | bbbbbb   | 
> !  b       | bbbbbbb  | 
> !  b       | bbbbbbbb | 
> ! (6 rows)
> ! 
> ! SELECT relname, c.* FROM ONLY c, pg_class where c.tableoid = pg_class.oid;
> !  relname |    aa    | cc 
> ! ---------+----------+----
> !  c       | ccc      | 
> !  c       | cccc     | 
> !  c       | ccccc    | 
> !  c       | cccccc   | 
> !  c       | ccccccc  | 
> !  c       | cccccccc | 
> ! (6 rows)
> ! 
> ! SELECT relname, d.* FROM ONLY d, pg_class where d.tableoid = pg_class.oid;
> !  relname |    aa    | bb | cc | dd 
> ! ---------+----------+----+----+----
> !  d       | ddd      |    |    | 
> !  d       | dddd     |    |    | 
> !  d       | ddddd    |    |    | 
> !  d       | dddddd   |    |    | 
> !  d       | ddddddd  |    |    | 
> !  d       | dddddddd |    |    | 
>   (6 rows)
>   
>   UPDATE b SET aa='new';
> ! SELECT relname, a.* FROM a, pg_class where a.tableoid = pg_class.oid;
> !  relname |    aa    
> ! ---------+----------
> !  a       | zzzz
> !  a       | zzzzz
> !  a       | zzzzzz
> !  a       | zzzzzz
> !  a       | zzzzzz
> !  a       | zzzzzz
> !  b       | new
> !  b       | new
> !  b       | new
> !  b       | new
> !  b       | new
> !  b       | new
> !  c       | ccc
> !  c       | cccc
> !  c       | ccccc
> !  c       | cccccc
> !  c       | ccccccc
> !  c       | cccccccc
> !  d       | new
> !  d       | new
> !  d       | new
> !  d       | new
> !  d       | new
> !  d       | new
>   (24 rows)
>   
> ! SELECT relname, b.* FROM b, pg_class where b.tableoid = pg_class.oid;
> !  relname | aa  | bb 
> ! ---------+-----+----
> !  b       | new | 
> !  b       | new | 
> !  b       | new | 
> !  b       | new | 
> !  b       | new | 
> !  b       | new | 
> !  d       | new | 
> !  d       | new | 
> !  d       | new | 
> !  d       | new | 
> !  d       | new | 
> !  d       | new | 
>   (12 rows)
>   
> ! SELECT relname, c.* FROM c, pg_class where c.tableoid = pg_class.oid;
> !  relname |    aa    | cc 
> ! ---------+----------+----
> !  c       | ccc      | 
> !  c       | cccc     | 
> !  c       | ccccc    | 
> !  c       | cccccc   | 
> !  c       | ccccccc  | 
> !  c       | cccccccc | 
> !  d       | new      | 
> !  d       | new      | 
> !  d       | new      | 
> !  d       | new      | 
> !  d       | new      | 
> !  d       | new      | 
>   (12 rows)
>   
> ! SELECT relname, d.* FROM d, pg_class where d.tableoid = pg_class.oid;
> !  relname | aa  | bb | cc | dd 
> ! ---------+-----+----+----+----
> !  d       | new |    |    | 
> !  d       | new |    |    | 
> !  d       | new |    |    | 
> !  d       | new |    |    | 
> !  d       | new |    |    | 
> !  d       | new |    |    | 
> ! (6 rows)
> ! 
> ! SELECT relname, a.* FROM ONLY a, pg_class where a.tableoid = pg_class.oid;
> !  relname |   aa   
> ! ---------+--------
> !  a       | zzzz
> !  a       | zzzzz
> !  a       | zzzzzz
> !  a       | zzzzzz
> !  a       | zzzzzz
> !  a       | zzzzzz
> ! (6 rows)
> ! 
> ! SELECT relname, b.* FROM ONLY b, pg_class where b.tableoid = pg_class.oid;
> !  relname | aa  | bb 
> ! ---------+-----+----
> !  b       | new | 
> !  b       | new | 
> !  b       | new | 
> !  b       | new | 
> !  b       | new | 
> !  b       | new | 
> ! (6 rows)
> ! 
> ! SELECT relname, c.* FROM ONLY c, pg_class where c.tableoid = pg_class.oid;
> !  relname |    aa    | cc 
> ! ---------+----------+----
> !  c       | ccc      | 
> !  c       | cccc     | 
> !  c       | ccccc    | 
> !  c       | cccccc   | 
> !  c       | ccccccc  | 
> !  c       | cccccccc | 
> ! (6 rows)
> ! 
> ! SELECT relname, d.* FROM ONLY d, pg_class where d.tableoid = pg_class.oid;
> !  relname | aa  | bb | cc | dd 
> ! ---------+-----+----+----+----
> !  d       | new |    |    | 
> !  d       | new |    |    | 
> !  d       | new |    |    | 
> !  d       | new |    |    | 
> !  d       | new |    |    | 
> !  d       | new |    |    | 
>   (6 rows)
>   
>   UPDATE a SET aa='new';
>   DELETE FROM ONLY c WHERE aa='new';
> ! SELECT relname, a.* FROM a, pg_class where a.tableoid = pg_class.oid;
> !  relname | aa  
> ! ---------+-----
> !  a       | new
> !  a       | new
> !  a       | new
> !  a       | new
> !  a       | new
> !  a       | new
> !  b       | new
> !  b       | new
> !  b       | new
> !  b       | new
> !  b       | new
> !  b       | new
> !  d       | new
> !  d       | new
> !  d       | new
> !  d       | new
> !  d       | new
> !  d       | new
>   (18 rows)
>   
> ! SELECT relname, b.* FROM b, pg_class where b.tableoid = pg_class.oid;
> !  relname | aa  | bb 
> ! ---------+-----+----
> !  b       | new | 
> !  b       | new | 
> !  b       | new | 
> !  b       | new | 
> !  b       | new | 
> !  b       | new | 
> !  d       | new | 
> !  d       | new | 
> !  d       | new | 
> !  d       | new | 
> !  d       | new | 
> !  d       | new | 
>   (12 rows)
>   
> ! SELECT relname, c.* FROM c, pg_class where c.tableoid = pg_class.oid;
> !  relname | aa  | cc 
> ! ---------+-----+----
> !  d       | new | 
> !  d       | new | 
> !  d       | new | 
> !  d       | new | 
> !  d       | new | 
> !  d       | new | 
> ! (6 rows)
> ! 
> ! SELECT relname, d.* FROM d, pg_class where d.tableoid = pg_class.oid;
> !  relname | aa  | bb | cc | dd 
> ! ---------+-----+----+----+----
> !  d       | new |    |    | 
> !  d       | new |    |    | 
> !  d       | new |    |    | 
> !  d       | new |    |    | 
> !  d       | new |    |    | 
> !  d       | new |    |    | 
> ! (6 rows)
> ! 
> ! SELECT relname, a.* FROM ONLY a, pg_class where a.tableoid = pg_class.oid;
> !  relname | aa  
> ! ---------+-----
> !  a       | new
> !  a       | new
> !  a       | new
> !  a       | new
> !  a       | new
> !  a       | new
> ! (6 rows)
> ! 
> ! SELECT relname, b.* FROM ONLY b, pg_class where b.tableoid = pg_class.oid;
> !  relname | aa  | bb 
> ! ---------+-----+----
> !  b       | new | 
> !  b       | new | 
> !  b       | new | 
> !  b       | new | 
> !  b       | new | 
> !  b       | new | 
> ! (6 rows)
> ! 
> ! SELECT relname, c.* FROM ONLY c, pg_class where c.tableoid = pg_class.oid;
> !  relname | aa | cc 
> ! ---------+----+----
>   (0 rows)
>   
> ! SELECT relname, d.* FROM ONLY d, pg_class where d.tableoid = pg_class.oid;
> !  relname | aa  | bb | cc | dd 
> ! ---------+-----+----+----+----
> !  d       | new |    |    | 
> !  d       | new |    |    | 
> !  d       | new |    |    | 
> !  d       | new |    |    | 
> !  d       | new |    |    | 
> !  d       | new |    |    | 
>   (6 rows)
>   
>   DELETE FROM a;
> ! SELECT relname, a.* FROM a, pg_class where a.tableoid = pg_class.oid;
> !  relname | aa 
> ! ---------+----
>   (0 rows)
>   
> ! SELECT relname, b.* FROM b, pg_class where b.tableoid = pg_class.oid;
> !  relname | aa | bb 
> ! ---------+----+----
>   (0 rows)
>   
> ! SELECT relname, c.* FROM c, pg_class where c.tableoid = pg_class.oid;
> !  relname | aa | cc 
> ! ---------+----+----
>   (0 rows)
>   
> ! SELECT relname, d.* FROM d, pg_class where d.tableoid = pg_class.oid;
> !  relname | aa | bb | cc | dd 
> ! ---------+----+----+----+----
>   (0 rows)
>   
> ! SELECT relname, a.* FROM ONLY a, pg_class where a.tableoid = pg_class.oid;
> !  relname | aa 
> ! ---------+----
>   (0 rows)
>   
> ! SELECT relname, b.* FROM ONLY b, pg_class where b.tableoid = pg_class.oid;
> !  relname | aa | bb 
> ! ---------+----+----
>   (0 rows)
>   
> ! SELECT relname, c.* FROM ONLY c, pg_class where c.tableoid = pg_class.oid;
> !  relname | aa | cc 
> ! ---------+----+----
>   (0 rows)
>   
> ! SELECT relname, d.* FROM ONLY d, pg_class where d.tableoid = pg_class.oid;
> !  relname | aa | bb | cc | dd 
> ! ---------+----+----+----+----
>   (0 rows)
>   
> Index: src/test/regress/sql/inherit.sql
> ===================================================================
> RCS file: /home/projects/pgsql/cvsroot/pgsql/src/test/regress/sql/inherit.sql,v
> retrieving revision 1.1
> diff -c -r1.1 inherit.sql
> *** src/test/regress/sql/inherit.sql	2000/06/09 11:12:38	1.1
> --- src/test/regress/sql/inherit.sql	2000/07/02 09:30:08
> ***************
> *** 34,47 ****
>   INSERT INTO d(aa) VALUES('ddddddd');
>   INSERT INTO d(aa) VALUES('dddddddd');
>   
> ! SELECT * FROM a;
> ! SELECT * FROM b;
> ! SELECT * FROM c;
> ! SELECT * FROM d;
> ! SELECT * FROM ONLY a;
> ! SELECT * FROM ONLY b;
> ! SELECT * FROM ONLY c;
> ! SELECT * FROM ONLY d;
>   
>   UPDATE a SET aa='zzzz' WHERE aa='aaaa';
>   UPDATE ONLY a SET aa='zzzzz' WHERE aa='aaaaa';
> --- 34,47 ----
>   INSERT INTO d(aa) VALUES('ddddddd');
>   INSERT INTO d(aa) VALUES('dddddddd');
>   
> ! SELECT relname, a.* FROM a, pg_class where a.tableoid = pg_class.oid;
> ! SELECT relname, b.* FROM b, pg_class where b.tableoid = pg_class.oid;
> ! SELECT relname, c.* FROM c, pg_class where c.tableoid = pg_class.oid;
> ! SELECT relname, d.* FROM d, pg_class where d.tableoid = pg_class.oid;
> ! SELECT relname, a.* FROM ONLY a, pg_class where a.tableoid = pg_class.oid;
> ! SELECT relname, b.* FROM ONLY b, pg_class where b.tableoid = pg_class.oid;
> ! SELECT relname, c.* FROM ONLY c, pg_class where c.tableoid = pg_class.oid;
> ! SELECT relname, d.* FROM ONLY d, pg_class where d.tableoid = pg_class.oid;
>   
>   UPDATE a SET aa='zzzz' WHERE aa='aaaa';
>   UPDATE ONLY a SET aa='zzzzz' WHERE aa='aaaaa';
> ***************
> *** 49,94 ****
>   UPDATE ONLY b SET aa='zzz' WHERE aa='aaa';
>   UPDATE a SET aa='zzzzzz' WHERE aa LIKE 'aaa%';
>   
> ! SELECT * FROM a;
> ! SELECT * FROM b;
> ! SELECT * FROM c;
> ! SELECT * FROM d;
> ! SELECT * FROM ONLY a;
> ! SELECT * FROM ONLY b;
> ! SELECT * FROM ONLY c;
> ! SELECT * FROM ONLY d;
>   
>   UPDATE b SET aa='new';
>   
> ! SELECT * FROM a;
> ! SELECT * FROM b;
> ! SELECT * FROM c;
> ! SELECT * FROM d;
> ! SELECT * FROM ONLY a;
> ! SELECT * FROM ONLY b;
> ! SELECT * FROM ONLY c;
> ! SELECT * FROM ONLY d;
>   
>   UPDATE a SET aa='new';
>   
>   DELETE FROM ONLY c WHERE aa='new';
>   
> ! SELECT * FROM a;
> ! SELECT * FROM b;
> ! SELECT * FROM c;
> ! SELECT * FROM d;
> ! SELECT * FROM ONLY a;
> ! SELECT * FROM ONLY b;
> ! SELECT * FROM ONLY c;
> ! SELECT * FROM ONLY d;
>   
>   DELETE FROM a;
>   
> ! SELECT * FROM a;
> ! SELECT * FROM b;
> ! SELECT * FROM c;
> ! SELECT * FROM d;
> ! SELECT * FROM ONLY a;
> ! SELECT * FROM ONLY b;
> ! SELECT * FROM ONLY c;
> ! SELECT * FROM ONLY d;
> --- 49,94 ----
>   UPDATE ONLY b SET aa='zzz' WHERE aa='aaa';
>   UPDATE a SET aa='zzzzzz' WHERE aa LIKE 'aaa%';
>   
> ! SELECT relname, a.* FROM a, pg_class where a.tableoid = pg_class.oid;
> ! SELECT relname, b.* FROM b, pg_class where b.tableoid = pg_class.oid;
> ! SELECT relname, c.* FROM c, pg_class where c.tableoid = pg_class.oid;
> ! SELECT relname, d.* FROM d, pg_class where d.tableoid = pg_class.oid;
> ! SELECT relname, a.* FROM ONLY a, pg_class where a.tableoid = pg_class.oid;
> ! SELECT relname, b.* FROM ONLY b, pg_class where b.tableoid = pg_class.oid;
> ! SELECT relname, c.* FROM ONLY c, pg_class where c.tableoid = pg_class.oid;
> ! SELECT relname, d.* FROM ONLY d, pg_class where d.tableoid = pg_class.oid;
>   
>   UPDATE b SET aa='new';
>   
> ! SELECT relname, a.* FROM a, pg_class where a.tableoid = pg_class.oid;
> ! SELECT relname, b.* FROM b, pg_class where b.tableoid = pg_class.oid;
> ! SELECT relname, c.* FROM c, pg_class where c.tableoid = pg_class.oid;
> ! SELECT relname, d.* FROM d, pg_class where d.tableoid = pg_class.oid;
> ! SELECT relname, a.* FROM ONLY a, pg_class where a.tableoid = pg_class.oid;
> ! SELECT relname, b.* FROM ONLY b, pg_class where b.tableoid = pg_class.oid;
> ! SELECT relname, c.* FROM ONLY c, pg_class where c.tableoid = pg_class.oid;
> ! SELECT relname, d.* FROM ONLY d, pg_class where d.tableoid = pg_class.oid;
>   
>   UPDATE a SET aa='new';
>   
>   DELETE FROM ONLY c WHERE aa='new';
>   
> ! SELECT relname, a.* FROM a, pg_class where a.tableoid = pg_class.oid;
> ! SELECT relname, b.* FROM b, pg_class where b.tableoid = pg_class.oid;
> ! SELECT relname, c.* FROM c, pg_class where c.tableoid = pg_class.oid;
> ! SELECT relname, d.* FROM d, pg_class where d.tableoid = pg_class.oid;
> ! SELECT relname, a.* FROM ONLY a, pg_class where a.tableoid = pg_class.oid;
> ! SELECT relname, b.* FROM ONLY b, pg_class where b.tableoid = pg_class.oid;
> ! SELECT relname, c.* FROM ONLY c, pg_class where c.tableoid = pg_class.oid;
> ! SELECT relname, d.* FROM ONLY d, pg_class where d.tableoid = pg_class.oid;
>   
>   DELETE FROM a;
>   
> ! SELECT relname, a.* FROM a, pg_class where a.tableoid = pg_class.oid;
> ! SELECT relname, b.* FROM b, pg_class where b.tableoid = pg_class.oid;
> ! SELECT relname, c.* FROM c, pg_class where c.tableoid = pg_class.oid;
> ! SELECT relname, d.* FROM d, pg_class where d.tableoid = pg_class.oid;
> ! SELECT relname, a.* FROM ONLY a, pg_class where a.tableoid = pg_class.oid;
> ! SELECT relname, b.* FROM ONLY b, pg_class where b.tableoid = pg_class.oid;
> ! SELECT relname, c.* FROM ONLY c, pg_class where c.tableoid = pg_class.oid;
> ! SELECT relname, d.* FROM ONLY d, pg_class where d.tableoid = pg_class.oid;
> Index: src/tools/make_mkid
> ===================================================================
> RCS file: /home/projects/pgsql/cvsroot/pgsql/src/tools/make_mkid,v
> retrieving revision 1.4
> diff -c -r1.4 make_mkid
> *** src/tools/make_mkid	2000/03/31 01:41:27	1.4
> --- src/tools/make_mkid	2000/07/02 09:30:08
> ***************
> *** 1,6 ****
>   #!/bin/sh
>   find `pwd`/ \( -name _deadcode -a -prune \) -o \
> ! 	-type f -name '*.[chyl]' -print|sed 's;//;/;g' | mkid
>   
>   find . -name  'CVS' -prune -o -type d -print  |while read DIR
>   do
> --- 1,6 ----
>   #!/bin/sh
>   find `pwd`/ \( -name _deadcode -a -prune \) -o \
> ! 	-type f -name '*.[chyl]' -print|sed 's;//;/;g' | mkid -
>   
>   find . -name  'CVS' -prune -o -type d -print  |while read DIR
>   do


-- 
  Bruce Momjian                        |  http://www.op.net/~candle
  pgman@candle.pha.pa.us               |  (610) 853-3000
  +  If your life is a hard drive,     |  830 Blythe Avenue
  +  Christ can be your backup.        |  Drexel Hill, Pennsylvania 19026

Sun, 2 Jul 2000 17:58:19 -0400 (EDT)
Bruce Momjian <pgman@candle.pha.pa.us>
Re: [PATCHES] TABLEOID patch