TABLEOID patch

Started by Chris Bitmeadover 25 years ago4 messages
#1Chris Bitmead
chris@bitmead.com
1 attachment(s)

Hi!

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

Thanks!

--
Chris Bitmead
mailto:chris@bitmead.com

Attachments:

tableoid.patchtext/plain; charset=us-ascii; name=tableoid.patchDownload
? 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/Gen_fmgrtab.sh
? 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/pl/tcl/mkMakefile.tcldefs.sh
? 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/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/01 05:30:22
***************
*** 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/01 05:30:27
***************
*** 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/01 05:30:35
***************
*** 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.134
diff -c -r1.134 heap.c
*** src/backend/catalog/heap.c	2000/06/28 03:31:22	1.134
--- src/backend/catalog/heap.c	2000/07/01 05:30:45
***************
*** 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, '\0', '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/optimizer/prep/preptlist.c
===================================================================
RCS file: /home/projects/pgsql/cvsroot/pgsql/src/backend/optimizer/prep/preptlist.c,v
retrieving revision 1.36
diff -c -r1.36 preptlist.c
*** src/backend/optimizer/prep/preptlist.c	2000/04/12 17:15:23	1.36
--- src/backend/optimizer/prep/preptlist.c	2000/07/01 05:30:48
***************
*** 15,21 ****
   * Portions Copyright (c) 1994, Regents of the University of California
   *
   * IDENTIFICATION
!  *	  $Header: /home/projects/pgsql/cvsroot/pgsql/src/backend/optimizer/prep/preptlist.c,v 1.36 2000/04/12 17:15:23 momjian Exp $
   *
   *-------------------------------------------------------------------------
   */
--- 15,21 ----
   * Portions Copyright (c) 1994, Regents of the University of California
   *
   * IDENTIFICATION
!  *	  $Header: /usr/local/cvsroot/pgsql/src/backend/optimizer/prep/preptlist.c,v 1.36 2000/04/12 17:15:23 momjian Exp $
   *
   *-------------------------------------------------------------------------
   */
***************
*** 66,72 ****
  	if (command_type == CMD_UPDATE || command_type == CMD_DELETE)
  	{
  		Resdom	   *resdom;
! 		Var		   *var;
  
  		resdom = makeResdom(length(tlist) + 1,
  							TIDOID,
--- 66,72 ----
  	if (command_type == CMD_UPDATE || command_type == CMD_DELETE)
  	{
  		Resdom	   *resdom;
! 		Var		   *var1, *var2;
  
  		resdom = makeResdom(length(tlist) + 1,
  							TIDOID,
***************
*** 76,83 ****
  							0,
  							true);
  
! 		var = makeVar(result_relation, SelfItemPointerAttributeNumber,
  					  TIDOID, -1, 0);
  
  		/*
  		 * For an UPDATE, expand_targetlist already created a fresh tlist.
--- 76,85 ----
  							0,
  							true);
  
! 		var1 = makeVar(result_relation, SelfItemPointerAttributeNumber,
  					  TIDOID, -1, 0);
+ 		var2 = makeVar(result_relation, TableOidAttributeNumber,
+ 					  OIDOID, -1, 0);
  
  		/*
  		 * For an UPDATE, expand_targetlist already created a fresh tlist.
***************
*** 87,93 ****
  		if (command_type == CMD_DELETE)
  			tlist = listCopy(tlist);
  
! 		tlist = lappend(tlist, makeTargetEntry(resdom, (Node *) var));
  	}
  
  	return tlist;
--- 89,96 ----
  		if (command_type == CMD_DELETE)
  			tlist = listCopy(tlist);
  
! 		tlist = lappend(tlist, makeTargetEntry(resdom, (Node *) var1));
! 		tlist = lappend(tlist, makeTargetEntry(resdom, (Node *) var2));
  	}
  
  	return tlist;
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/01 05:30:49
***************
*** 40,45 ****
--- 40,48 ----
  
  {
  	{
+ 		"tableoid", TableOidAttributeNumber, OIDOID
+ 	},
+ 	{
  		"ctid", SelfItemPointerAttributeNumber, TIDOID
  	},
  	{
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/01 05:30:51
***************
*** 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/01 05:30:53
***************
*** 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/01 05:30:54
***************
*** 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/01 05:30:57
***************
*** 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/01 05:31:02
***************
*** 29,534 ****
  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';
! UPDATE ONLY a SET aa='zzzzz' WHERE aa='aaaaa';
! 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)
! 
--- 29,154 ----
  INSERT INTO d(aa) VALUES('dddddd');
  INSERT INTO d(aa) VALUES('ddddddd');
  INSERT INTO d(aa) VALUES('dddddddd');
! SELECT tableoid, * FROM a;
!  tableoid |    aa    
! ----------+----------
!     34880 | aaa
!     34880 | aaaa
!     34880 | aaaaa
!     34880 | aaaaaa
!     34880 | aaaaaaa
!     34880 | aaaaaaaa
!     34890 | bbb
!     34890 | bbbb
!     34890 | bbbbb
!     34890 | bbbbbb
!     34890 | bbbbbbb
!     34890 | bbbbbbbb
!     34903 | ccc
!     34903 | cccc
!     34903 | ccccc
!     34903 | cccccc
!     34903 | ccccccc
!     34903 | cccccccc
!     34916 | ddd
!     34916 | dddd
!     34916 | ddddd
!     34916 | dddddd
!     34916 | ddddddd
!     34916 | dddddddd
  (24 rows)
  
! SELECT tableoid, * FROM b;
!  tableoid |    aa    | bb 
! ----------+----------+----
!     34890 | bbb      | 
!     34890 | bbbb     | 
!     34890 | bbbbb    | 
!     34890 | bbbbbb   | 
!     34890 | bbbbbbb  | 
!     34890 | bbbbbbbb | 
!     34916 | ddd      | 
!     34916 | dddd     | 
!     34916 | ddddd    | 
!     34916 | dddddd   | 
!     34916 | ddddddd  | 
!     34916 | dddddddd | 
! (12 rows)
! 
! SELECT tableoid, * FROM c;
!  tableoid |    aa    | cc 
! ----------+----------+----
!     34903 | ccc      | 
!     34903 | cccc     | 
!     34903 | ccccc    | 
!     34903 | cccccc   | 
!     34903 | ccccccc  | 
!     34903 | cccccccc | 
!     34916 | ddd      | 
!     34916 | dddd     | 
!     34916 | ddddd    | 
!     34916 | dddddd   | 
!     34916 | ddddddd  | 
!     34916 | dddddddd | 
! (12 rows)
! 
! SELECT tableoid, * FROM d;
!  tableoid |    aa    | bb | cc | dd 
! ----------+----------+----+----+----
!     34916 | ddd      |    |    | 
!     34916 | dddd     |    |    | 
!     34916 | ddddd    |    |    | 
!     34916 | dddddd   |    |    | 
!     34916 | ddddddd  |    |    | 
!     34916 | dddddddd |    |    | 
! (6 rows)
! 
! SELECT tableoid, * FROM ONLY a;
!  tableoid |    aa    
! ----------+----------
!     34880 | aaa
!     34880 | aaaa
!     34880 | aaaaa
!     34880 | aaaaaa
!     34880 | aaaaaaa
!     34880 | aaaaaaaa
! (6 rows)
! 
! SELECT tableoid, * FROM ONLY b;
!  tableoid |    aa    | bb 
! ----------+----------+----
!     34890 | bbb      | 
!     34890 | bbbb     | 
!     34890 | bbbbb    | 
!     34890 | bbbbbb   | 
!     34890 | bbbbbbb  | 
!     34890 | bbbbbbbb | 
! (6 rows)
! 
! SELECT tableoid, * FROM ONLY c;
!  tableoid |    aa    | cc 
! ----------+----------+----
!     34903 | ccc      | 
!     34903 | cccc     | 
!     34903 | ccccc    | 
!     34903 | cccccc   | 
!     34903 | ccccccc  | 
!     34903 | cccccccc | 
! (6 rows)
! 
! SELECT tableoid, * FROM ONLY d;
!  tableoid |    aa    | bb | cc | dd 
! ----------+----------+----+----+----
!     34916 | ddd      |    |    | 
!     34916 | dddd     |    |    | 
!     34916 | ddddd    |    |    | 
!     34916 | dddddd   |    |    | 
!     34916 | ddddddd  |    |    | 
!     34916 | dddddddd |    |    | 
  (6 rows)
  
  UPDATE a SET aa='zzzz' WHERE aa='aaaa';
! pqReadData() -- backend closed the channel unexpectedly.
! 	This probably means the backend terminated abnormally
! 	before or while processing the request.
! connection to server was lost
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/01 05:31:03
***************
*** 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 tableoid, * FROM a;
! SELECT tableoid, * FROM b;
! SELECT tableoid, * FROM c;
! SELECT tableoid, * FROM d;
! SELECT tableoid, * FROM ONLY a;
! SELECT tableoid, * FROM ONLY b;
! SELECT tableoid, * FROM ONLY c;
! SELECT tableoid, * FROM ONLY d;
  
  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 tableoid, * FROM a;
! SELECT tableoid, * FROM b;
! SELECT tableoid, * FROM c;
! SELECT tableoid, * FROM d;
! SELECT tableoid, * FROM ONLY a;
! SELECT tableoid, * FROM ONLY b;
! SELECT tableoid, * FROM ONLY c;
! SELECT tableoid, * FROM ONLY d;
  
  UPDATE b SET aa='new';
  
! SELECT tableoid, * FROM a;
! SELECT tableoid, * FROM b;
! SELECT tableoid, * FROM c;
! SELECT tableoid, * FROM d;
! SELECT tableoid, * FROM ONLY a;
! SELECT tableoid, * FROM ONLY b;
! SELECT tableoid, * FROM ONLY c;
! SELECT tableoid, * FROM ONLY d;
  
  UPDATE a SET aa='new';
  
  DELETE FROM ONLY c WHERE aa='new';
  
! SELECT tableoid, * FROM a;
! SELECT tableoid, * FROM b;
! SELECT tableoid, * FROM c;
! SELECT tableoid, * FROM d;
! SELECT tableoid, * FROM ONLY a;
! SELECT tableoid, * FROM ONLY b;
! SELECT tableoid, * FROM ONLY c;
! SELECT tableoid, * FROM ONLY d;
  
  DELETE FROM a;
  
! SELECT tableoid, * FROM a;
! SELECT tableoid, * FROM b;
! SELECT tableoid, * FROM c;
! SELECT tableoid, * FROM d;
! SELECT tableoid, * FROM ONLY a;
! SELECT tableoid, * FROM ONLY b;
! SELECT tableoid, * FROM ONLY c;
! SELECT tableoid, * FROM ONLY d;
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/01 05:31:03
***************
*** 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
#2Tom Lane
tgl@sss.pgh.pa.us
In reply to: Chris Bitmead (#1)
Re: [PATCHES] 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

#3Chris Bitmead
chris@bitmead.com
In reply to: Chris Bitmead (#1)
1 attachment(s)
Re: [PATCHES] TABLEOID patch

Attached is a new patch which addresses this problem.

--
Chris Bitmead
mailto:chris@bitmead.com

Attachments:

tableoid.patchtext/plain; charset=us-ascii; name=tableoid.patchDownload
? 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
#4Bruce Momjian
pgman@candle.pha.pa.us
In reply to: Chris Bitmead (#3)
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