*** a/contrib/dblink/dblink.c
--- b/contrib/dblink/dblink.c
***************
*** 35,46 ****
  #include <limits.h>
  
  #include "libpq-fe.h"
! #include "funcapi.h"
  #include "catalog/indexing.h"
  #include "catalog/namespace.h"
  #include "catalog/pg_type.h"
  #include "executor/spi.h"
  #include "foreign/foreign.h"
  #include "lib/stringinfo.h"
  #include "mb/pg_wchar.h"
  #include "miscadmin.h"
--- 35,48 ----
  #include <limits.h>
  
  #include "libpq-fe.h"
! 
! #include "access/tupheader.h"
  #include "catalog/indexing.h"
  #include "catalog/namespace.h"
  #include "catalog/pg_type.h"
  #include "executor/spi.h"
  #include "foreign/foreign.h"
+ #include "funcapi.h"
  #include "lib/stringinfo.h"
  #include "mb/pg_wchar.h"
  #include "miscadmin.h"
*** a/contrib/file_fdw/file_fdw.c
--- b/contrib/file_fdw/file_fdw.c
***************
*** 17,22 ****
--- 17,23 ----
  
  #include "access/reloptions.h"
  #include "access/sysattr.h"
+ #include "access/tupheader.h"
  #include "catalog/pg_foreign_table.h"
  #include "commands/copy.h"
  #include "commands/defrem.h"
*** a/contrib/hstore/hstore_io.c
--- b/contrib/hstore/hstore_io.c
***************
*** 5,10 ****
--- 5,11 ----
  
  #include <ctype.h>
  
+ #include "access/tupheader.h"
  #include "catalog/pg_type.h"
  #include "funcapi.h"
  #include "libpq/pqformat.h"
*** a/contrib/ltree/ltree_op.c
--- b/contrib/ltree/ltree_op.c
***************
*** 7,12 ****
--- 7,13 ----
  
  #include <ctype.h>
  
+ #include "access/tupheader.h"
  #include "catalog/pg_statistic.h"
  #include "utils/builtins.h"
  #include "utils/lsyscache.h"
*** a/contrib/pageinspect/heapfuncs.c
--- b/contrib/pageinspect/heapfuncs.c
***************
*** 25,30 ****
--- 25,31 ----
  
  #include "postgres.h"
  
+ #include "access/tupheader.h"
  #include "funcapi.h"
  #include "utils/builtins.h"
  #include "miscadmin.h"
*** a/contrib/tcn/tcn.c
--- b/contrib/tcn/tcn.c
***************
*** 15,20 ****
--- 15,21 ----
  
  #include "postgres.h"
  
+ #include "access/tupheader.h"
  #include "executor/spi.h"
  #include "commands/async.h"
  #include "commands/trigger.h"
*** a/src/backend/access/common/reloptions.c
--- b/src/backend/access/common/reloptions.c
***************
*** 20,25 ****
--- 20,26 ----
  #include "access/nbtree.h"
  #include "access/reloptions.h"
  #include "access/spgist.h"
+ #include "access/tupheader.h"
  #include "catalog/pg_type.h"
  #include "commands/defrem.h"
  #include "commands/tablespace.h"
*** a/src/backend/access/common/tupdesc.c
--- b/src/backend/access/common/tupdesc.c
***************
*** 19,24 ****
--- 19,25 ----
  
  #include "postgres.h"
  
+ #include "access/tupheader.h"
  #include "catalog/pg_type.h"
  #include "miscadmin.h"
  #include "parser/parse_type.h"
*** a/src/backend/access/heap/hio.c
--- b/src/backend/access/heap/hio.c
***************
*** 18,23 ****
--- 18,24 ----
  #include "access/heapam.h"
  #include "access/hio.h"
  #include "access/visibilitymap.h"
+ #include "access/tupheader.h"
  #include "storage/bufmgr.h"
  #include "storage/freespace.h"
  #include "storage/lmgr.h"
*** a/src/backend/access/heap/pruneheap.c
--- b/src/backend/access/heap/pruneheap.c
***************
*** 17,22 ****
--- 17,23 ----
  #include "access/heapam.h"
  #include "access/heapam_xlog.h"
  #include "access/transam.h"
+ #include "access/tupheader.h"
  #include "miscadmin.h"
  #include "pgstat.h"
  #include "storage/bufmgr.h"
*** a/src/backend/bootstrap/bootstrap.c
--- b/src/backend/bootstrap/bootstrap.c
***************
*** 21,26 ****
--- 21,27 ----
  #include <getopt.h>
  #endif
  
+ #include "access/tupheader.h"
  #include "bootstrap/bootstrap.h"
  #include "catalog/index.h"
  #include "catalog/pg_collation.h"
*** a/src/backend/catalog/aclchk.c
--- b/src/backend/catalog/aclchk.c
***************
*** 20,25 ****
--- 20,26 ----
  #include "access/genam.h"
  #include "access/heapam.h"
  #include "access/sysattr.h"
+ #include "access/tupheader.h"
  #include "access/xact.h"
  #include "catalog/catalog.h"
  #include "catalog/dependency.h"
*** a/src/backend/catalog/dependency.c
--- b/src/backend/catalog/dependency.c
***************
*** 15,20 ****
--- 15,21 ----
  #include "postgres.h"
  
  #include "access/sysattr.h"
+ #include "access/tupheader.h"
  #include "access/xact.h"
  #include "catalog/dependency.h"
  #include "catalog/heap.h"
*** a/src/backend/catalog/heap.c
--- b/src/backend/catalog/heap.c
***************
*** 31,36 ****
--- 31,37 ----
  
  #include "access/sysattr.h"
  #include "access/transam.h"
+ #include "access/tupheader.h"
  #include "access/xact.h"
  #include "catalog/catalog.h"
  #include "catalog/dependency.h"
*** a/src/backend/catalog/indexing.c
--- b/src/backend/catalog/indexing.c
***************
*** 15,20 ****
--- 15,21 ----
   */
  #include "postgres.h"
  
+ #include "access/tupheader.h"
  #include "catalog/index.h"
  #include "catalog/indexing.h"
  #include "executor/executor.h"
*** a/src/backend/catalog/namespace.c
--- b/src/backend/catalog/namespace.c
***************
*** 19,24 ****
--- 19,25 ----
   */
  #include "postgres.h"
  
+ #include "access/tupheader.h"
  #include "access/xact.h"
  #include "catalog/dependency.h"
  #include "catalog/pg_authid.h"
*** a/src/backend/catalog/objectaddress.c
--- b/src/backend/catalog/objectaddress.c
***************
*** 16,21 ****
--- 16,22 ----
  #include "postgres.h"
  
  #include "access/sysattr.h"
+ #include "access/tupheader.h"
  #include "catalog/catalog.h"
  #include "catalog/indexing.h"
  #include "catalog/objectaddress.h"
*** a/src/backend/catalog/pg_aggregate.c
--- b/src/backend/catalog/pg_aggregate.c
***************
*** 15,20 ****
--- 15,21 ----
  #include "postgres.h"
  
  #include "access/heapam.h"
+ #include "access/tupheader.h"
  #include "catalog/dependency.h"
  #include "catalog/indexing.h"
  #include "catalog/pg_aggregate.h"
*** a/src/backend/catalog/pg_collation.c
--- b/src/backend/catalog/pg_collation.c
***************
*** 17,22 ****
--- 17,23 ----
  #include "access/genam.h"
  #include "access/heapam.h"
  #include "access/sysattr.h"
+ #include "access/tupheader.h"
  #include "catalog/dependency.h"
  #include "catalog/indexing.h"
  #include "catalog/objectaccess.h"
*** a/src/backend/catalog/pg_constraint.c
--- b/src/backend/catalog/pg_constraint.c
***************
*** 16,21 ****
--- 16,22 ----
  
  #include "access/genam.h"
  #include "access/heapam.h"
+ #include "access/tupheader.h"
  #include "catalog/dependency.h"
  #include "catalog/indexing.h"
  #include "catalog/objectaccess.h"
*** a/src/backend/catalog/pg_conversion.c
--- b/src/backend/catalog/pg_conversion.c
***************
*** 16,21 ****
--- 16,22 ----
  
  #include "access/heapam.h"
  #include "access/sysattr.h"
+ #include "access/tupheader.h"
  #include "catalog/dependency.h"
  #include "catalog/indexing.h"
  #include "catalog/objectaccess.h"
*** a/src/backend/catalog/pg_db_role_setting.c
--- b/src/backend/catalog/pg_db_role_setting.c
***************
*** 12,17 ****
--- 12,18 ----
  
  #include "access/genam.h"
  #include "access/heapam.h"
+ #include "access/tupheader.h"
  #include "catalog/indexing.h"
  #include "catalog/pg_db_role_setting.h"
  #include "utils/fmgroids.h"
*** a/src/backend/catalog/pg_depend.c
--- b/src/backend/catalog/pg_depend.c
***************
*** 16,21 ****
--- 16,22 ----
  
  #include "access/genam.h"
  #include "access/heapam.h"
+ #include "access/tupheader.h"
  #include "catalog/dependency.h"
  #include "catalog/indexing.h"
  #include "catalog/pg_constraint.h"
*** a/src/backend/catalog/pg_enum.c
--- b/src/backend/catalog/pg_enum.c
***************
*** 15,20 ****
--- 15,21 ----
  
  #include "access/genam.h"
  #include "access/heapam.h"
+ #include "access/tupheader.h"
  #include "access/xact.h"
  #include "catalog/catalog.h"
  #include "catalog/indexing.h"
*** a/src/backend/catalog/pg_inherits.c
--- b/src/backend/catalog/pg_inherits.c
***************
*** 21,26 ****
--- 21,27 ----
  
  #include "access/genam.h"
  #include "access/heapam.h"
+ #include "access/tupheader.h"
  #include "catalog/indexing.h"
  #include "catalog/pg_inherits.h"
  #include "catalog/pg_inherits_fn.h"
*** a/src/backend/catalog/pg_largeobject.c
--- b/src/backend/catalog/pg_largeobject.c
***************
*** 17,22 ****
--- 17,23 ----
  #include "access/genam.h"
  #include "access/heapam.h"
  #include "access/sysattr.h"
+ #include "access/tupheader.h"
  #include "catalog/dependency.h"
  #include "catalog/indexing.h"
  #include "catalog/pg_largeobject.h"
*** a/src/backend/catalog/pg_operator.c
--- b/src/backend/catalog/pg_operator.c
***************
*** 18,23 ****
--- 18,24 ----
  #include "postgres.h"
  
  #include "access/heapam.h"
+ #include "access/tupheader.h"
  #include "access/xact.h"
  #include "catalog/dependency.h"
  #include "catalog/indexing.h"
*** a/src/backend/catalog/pg_proc.c
--- b/src/backend/catalog/pg_proc.c
***************
*** 14,19 ****
--- 14,20 ----
   */
  #include "postgres.h"
  
+ #include "access/tupheader.h"
  #include "access/xact.h"
  #include "catalog/dependency.h"
  #include "catalog/indexing.h"
*** a/src/backend/catalog/pg_shdepend.c
--- b/src/backend/catalog/pg_shdepend.c
***************
*** 16,21 ****
--- 16,22 ----
  
  #include "access/genam.h"
  #include "access/heapam.h"
+ #include "access/tupheader.h"
  #include "access/xact.h"
  #include "catalog/catalog.h"
  #include "catalog/dependency.h"
*** a/src/backend/catalog/pg_type.c
--- b/src/backend/catalog/pg_type.c
***************
*** 15,20 ****
--- 15,21 ----
  #include "postgres.h"
  
  #include "access/heapam.h"
+ #include "access/tupheader.h"
  #include "access/xact.h"
  #include "catalog/dependency.h"
  #include "catalog/indexing.h"
*** a/src/backend/commands/aggregatecmds.c
--- b/src/backend/commands/aggregatecmds.c
***************
*** 23,28 ****
--- 23,29 ----
  #include "postgres.h"
  
  #include "access/heapam.h"
+ #include "access/tupheader.h"
  #include "catalog/dependency.h"
  #include "catalog/indexing.h"
  #include "catalog/pg_aggregate.h"
*** a/src/backend/commands/alter.c
--- b/src/backend/commands/alter.c
***************
*** 14,19 ****
--- 14,20 ----
   */
  #include "postgres.h"
  
+ #include "access/tupheader.h"
  #include "catalog/dependency.h"
  #include "catalog/indexing.h"
  #include "catalog/namespace.h"
*** a/src/backend/commands/collationcmds.c
--- b/src/backend/commands/collationcmds.c
***************
*** 15,20 ****
--- 15,21 ----
  #include "postgres.h"
  
  #include "access/heapam.h"
+ #include "access/tupheader.h"
  #include "access/xact.h"
  #include "catalog/dependency.h"
  #include "catalog/indexing.h"
*** a/src/backend/commands/comment.c
--- b/src/backend/commands/comment.c
***************
*** 16,21 ****
--- 16,22 ----
  
  #include "access/genam.h"
  #include "access/heapam.h"
+ #include "access/tupheader.h"
  #include "catalog/indexing.h"
  #include "catalog/objectaddress.h"
  #include "catalog/pg_description.h"
*** a/src/backend/commands/conversioncmds.c
--- b/src/backend/commands/conversioncmds.c
***************
*** 15,20 ****
--- 15,21 ----
  #include "postgres.h"
  
  #include "access/heapam.h"
+ #include "access/tupheader.h"
  #include "catalog/dependency.h"
  #include "catalog/indexing.h"
  #include "catalog/pg_conversion.h"
*** a/src/backend/commands/copy.c
--- b/src/backend/commands/copy.c
***************
*** 22,27 ****
--- 22,28 ----
  
  #include "access/heapam.h"
  #include "access/sysattr.h"
+ #include "access/tupheader.h"
  #include "access/xact.h"
  #include "catalog/namespace.h"
  #include "catalog/pg_type.h"
*** a/src/backend/commands/createas.c
--- b/src/backend/commands/createas.c
***************
*** 23,28 ****
--- 23,29 ----
  
  #include "access/reloptions.h"
  #include "access/sysattr.h"
+ #include "access/tupheader.h"
  #include "access/xact.h"
  #include "catalog/toasting.h"
  #include "commands/createas.h"
*** a/src/backend/commands/dbcommands.c
--- b/src/backend/commands/dbcommands.c
***************
*** 26,31 ****
--- 26,32 ----
  
  #include "access/genam.h"
  #include "access/heapam.h"
+ #include "access/tupheader.h"
  #include "access/xact.h"
  #include "access/xlogutils.h"
  #include "catalog/catalog.h"
*** a/src/backend/commands/dropcmds.c
--- b/src/backend/commands/dropcmds.c
***************
*** 16,21 ****
--- 16,22 ----
  #include "postgres.h"
  
  #include "access/heapam.h"
+ #include "access/tupheader.h"
  #include "catalog/dependency.h"
  #include "catalog/namespace.h"
  #include "catalog/objectaddress.h"
*** a/src/backend/commands/event_trigger.c
--- b/src/backend/commands/event_trigger.c
***************
*** 13,18 ****
--- 13,19 ----
   */
  #include "postgres.h"
  
+ #include "access/tupheader.h"
  #include "access/xact.h"
  #include "catalog/dependency.h"
  #include "catalog/indexing.h"
*** a/src/backend/commands/extension.c
--- b/src/backend/commands/extension.c
***************
*** 28,33 ****
--- 28,34 ----
  #include <unistd.h>
  
  #include "access/sysattr.h"
+ #include "access/tupheader.h"
  #include "access/xact.h"
  #include "catalog/dependency.h"
  #include "catalog/indexing.h"
*** a/src/backend/commands/foreigncmds.c
--- b/src/backend/commands/foreigncmds.c
***************
*** 14,19 ****
--- 14,20 ----
  #include "postgres.h"
  
  #include "access/heapam.h"
+ #include "access/tupheader.h"
  #include "access/xact.h"
  #include "access/reloptions.h"
  #include "catalog/dependency.h"
*** a/src/backend/commands/functioncmds.c
--- b/src/backend/commands/functioncmds.c
***************
*** 35,40 ****
--- 35,41 ----
  #include "access/genam.h"
  #include "access/heapam.h"
  #include "access/sysattr.h"
+ #include "access/tupheader.h"
  #include "catalog/dependency.h"
  #include "catalog/indexing.h"
  #include "catalog/objectaccess.h"
*** a/src/backend/commands/indexcmds.c
--- b/src/backend/commands/indexcmds.c
***************
*** 16,21 ****
--- 16,22 ----
  #include "postgres.h"
  
  #include "access/reloptions.h"
+ #include "access/tupheader.h"
  #include "access/xact.h"
  #include "catalog/catalog.h"
  #include "catalog/index.h"
*** a/src/backend/commands/opclasscmds.c
--- b/src/backend/commands/opclasscmds.c
***************
*** 21,26 ****
--- 21,27 ----
  #include "access/heapam.h"
  #include "access/nbtree.h"
  #include "access/sysattr.h"
+ #include "access/tupheader.h"
  #include "catalog/dependency.h"
  #include "catalog/indexing.h"
  #include "catalog/objectaccess.h"
*** a/src/backend/commands/operatorcmds.c
--- b/src/backend/commands/operatorcmds.c
***************
*** 35,40 ****
--- 35,41 ----
  #include "postgres.h"
  
  #include "access/heapam.h"
+ #include "access/tupheader.h"
  #include "catalog/dependency.h"
  #include "catalog/indexing.h"
  #include "catalog/pg_operator.h"
*** a/src/backend/commands/proclang.c
--- b/src/backend/commands/proclang.c
***************
*** 15,20 ****
--- 15,21 ----
  
  #include "access/genam.h"
  #include "access/heapam.h"
+ #include "access/tupheader.h"
  #include "catalog/dependency.h"
  #include "catalog/indexing.h"
  #include "catalog/objectaccess.h"
*** a/src/backend/commands/schemacmds.c
--- b/src/backend/commands/schemacmds.c
***************
*** 14,19 ****
--- 14,20 ----
   */
  #include "postgres.h"
  
+ #include "access/tupheader.h"
  #include "access/xact.h"
  #include "catalog/catalog.h"
  #include "catalog/dependency.h"
*** a/src/backend/commands/seclabel.c
--- b/src/backend/commands/seclabel.c
***************
*** 12,17 ****
--- 12,18 ----
  
  #include "access/genam.h"
  #include "access/heapam.h"
+ #include "access/tupheader.h"
  #include "catalog/catalog.h"
  #include "catalog/indexing.h"
  #include "catalog/pg_seclabel.h"
*** a/src/backend/commands/sequence.c
--- b/src/backend/commands/sequence.c
***************
*** 15,20 ****
--- 15,21 ----
  #include "postgres.h"
  
  #include "access/transam.h"
+ #include "access/tupheader.h"
  #include "access/xlogutils.h"
  #include "catalog/dependency.h"
  #include "catalog/namespace.h"
*** a/src/backend/commands/tablespace.c
--- b/src/backend/commands/tablespace.c
***************
*** 54,59 ****
--- 54,60 ----
  #include "access/heapam.h"
  #include "access/reloptions.h"
  #include "access/sysattr.h"
+ #include "access/tupheader.h"
  #include "access/xact.h"
  #include "catalog/catalog.h"
  #include "catalog/dependency.h"
*** a/src/backend/commands/trigger.c
--- b/src/backend/commands/trigger.c
***************
*** 16,21 ****
--- 16,22 ----
  #include "access/genam.h"
  #include "access/heapam.h"
  #include "access/sysattr.h"
+ #include "access/tupheader.h"
  #include "access/xact.h"
  #include "catalog/catalog.h"
  #include "catalog/dependency.h"
*** a/src/backend/commands/tsearchcmds.c
--- b/src/backend/commands/tsearchcmds.c
***************
*** 17,24 ****
  
  #include <ctype.h>
  
- #include "access/heapam.h"
  #include "access/genam.h"
  #include "access/xact.h"
  #include "catalog/dependency.h"
  #include "catalog/indexing.h"
--- 17,25 ----
  
  #include <ctype.h>
  
  #include "access/genam.h"
+ #include "access/heapam.h"
+ #include "access/tupheader.h"
  #include "access/xact.h"
  #include "catalog/dependency.h"
  #include "catalog/indexing.h"
*** a/src/backend/commands/typecmds.c
--- b/src/backend/commands/typecmds.c
***************
*** 33,38 ****
--- 33,39 ----
  
  #include "access/genam.h"
  #include "access/heapam.h"
+ #include "access/tupheader.h"
  #include "access/xact.h"
  #include "catalog/catalog.h"
  #include "catalog/dependency.h"
*** a/src/backend/commands/user.c
--- b/src/backend/commands/user.c
***************
*** 14,19 ****
--- 14,20 ----
  
  #include "access/genam.h"
  #include "access/heapam.h"
+ #include "access/tupheader.h"
  #include "access/xact.h"
  #include "catalog/dependency.h"
  #include "catalog/indexing.h"
*** a/src/backend/commands/vacuum.c
--- b/src/backend/commands/vacuum.c
***************
*** 26,31 ****
--- 26,32 ----
  #include "access/genam.h"
  #include "access/heapam.h"
  #include "access/transam.h"
+ #include "access/tupheader.h"
  #include "access/xact.h"
  #include "catalog/namespace.h"
  #include "catalog/pg_database.h"
*** a/src/backend/commands/vacuumlazy.c
--- b/src/backend/commands/vacuumlazy.c
***************
*** 41,46 ****
--- 41,47 ----
  #include "access/heapam.h"
  #include "access/heapam_xlog.h"
  #include "access/transam.h"
+ #include "access/tupheader.h"
  #include "access/visibilitymap.h"
  #include "catalog/storage.h"
  #include "commands/dbcommands.h"
*** a/src/backend/commands/variable.c
--- b/src/backend/commands/variable.c
***************
*** 18,23 ****
--- 18,24 ----
  
  #include <ctype.h>
  
+ #include "access/tupheader.h"
  #include "access/xact.h"
  #include "catalog/pg_authid.h"
  #include "commands/variable.h"
*** a/src/backend/executor/execAmi.c
--- b/src/backend/executor/execAmi.c
***************
*** 12,17 ****
--- 12,18 ----
   */
  #include "postgres.h"
  
+ #include "access/tupheader.h"
  #include "executor/execdebug.h"
  #include "executor/nodeAgg.h"
  #include "executor/nodeAppend.h"
*** a/src/backend/executor/execMain.c
--- b/src/backend/executor/execMain.c
***************
*** 39,44 ****
--- 39,45 ----
  
  #include "access/sysattr.h"
  #include "access/transam.h"
+ #include "access/tupheader.h"
  #include "access/xact.h"
  #include "catalog/namespace.h"
  #include "commands/trigger.h"
*** a/src/backend/executor/execQual.c
--- b/src/backend/executor/execQual.c
***************
*** 38,43 ****
--- 38,44 ----
  
  #include "access/nbtree.h"
  #include "access/tupconvert.h"
+ #include "access/tupheader.h"
  #include "catalog/pg_type.h"
  #include "commands/typecmds.h"
  #include "executor/execdebug.h"
*** a/src/backend/executor/execTuples.c
--- b/src/backend/executor/execTuples.c
***************
*** 88,93 ****
--- 88,94 ----
   */
  #include "postgres.h"
  
+ #include "access/tupheader.h"
  #include "funcapi.h"
  #include "catalog/pg_type.h"
  #include "nodes/nodeFuncs.h"
*** a/src/backend/executor/functions.c
--- b/src/backend/executor/functions.c
***************
*** 14,19 ****
--- 14,20 ----
   */
  #include "postgres.h"
  
+ #include "access/tupheader.h"
  #include "access/xact.h"
  #include "catalog/pg_proc.h"
  #include "catalog/pg_type.h"
*** a/src/backend/executor/nodeAgg.c
--- b/src/backend/executor/nodeAgg.c
***************
*** 78,83 ****
--- 78,84 ----
  
  #include "postgres.h"
  
+ #include "access/tupheader.h"
  #include "catalog/pg_aggregate.h"
  #include "catalog/pg_proc.h"
  #include "catalog/pg_type.h"
*** a/src/backend/executor/nodeHash.c
--- b/src/backend/executor/nodeHash.c
***************
*** 24,29 ****
--- 24,30 ----
  #include <math.h>
  #include <limits.h>
  
+ #include "access/tupheader.h"
  #include "catalog/pg_statistic.h"
  #include "commands/tablespace.h"
  #include "executor/execdebug.h"
*** a/src/backend/executor/nodeHashjoin.c
--- b/src/backend/executor/nodeHashjoin.c
***************
*** 15,20 ****
--- 15,21 ----
  
  #include "postgres.h"
  
+ #include "access/tupheader.h"
  #include "executor/executor.h"
  #include "executor/hashjoin.h"
  #include "executor/nodeHash.h"
*** a/src/backend/executor/nodeModifyTable.c
--- b/src/backend/executor/nodeModifyTable.c
***************
*** 37,42 ****
--- 37,43 ----
  
  #include "postgres.h"
  
+ #include "access/tupheader.h"
  #include "access/xact.h"
  #include "commands/trigger.h"
  #include "executor/executor.h"
*** a/src/backend/executor/nodeSubplan.c
--- b/src/backend/executor/nodeSubplan.c
***************
*** 21,26 ****
--- 21,27 ----
  #include <limits.h>
  #include <math.h>
  
+ #include "access/tupheader.h"
  #include "executor/executor.h"
  #include "executor/nodeSubplan.h"
  #include "nodes/makefuncs.h"
*** a/src/backend/executor/nodeWindowAgg.c
--- b/src/backend/executor/nodeWindowAgg.c
***************
*** 33,38 ****
--- 33,39 ----
   */
  #include "postgres.h"
  
+ #include "access/tupheader.h"
  #include "catalog/pg_aggregate.h"
  #include "catalog/pg_proc.h"
  #include "catalog/pg_type.h"
*** a/src/backend/executor/spi.c
--- b/src/backend/executor/spi.c
***************
*** 16,21 ****
--- 16,22 ----
  
  #include "access/printtup.h"
  #include "access/sysattr.h"
+ #include "access/tupheader.h"
  #include "access/xact.h"
  #include "catalog/heap.h"
  #include "catalog/pg_type.h"
*** a/src/backend/foreign/foreign.c
--- b/src/backend/foreign/foreign.c
***************
*** 13,18 ****
--- 13,19 ----
  #include "postgres.h"
  
  #include "access/reloptions.h"
+ #include "access/tupheader.h"
  #include "catalog/pg_foreign_data_wrapper.h"
  #include "catalog/pg_foreign_server.h"
  #include "catalog/pg_foreign_table.h"
*** a/src/backend/nodes/tidbitmap.c
--- b/src/backend/nodes/tidbitmap.c
***************
*** 40,46 ****
  
  #include <limits.h>
  
! #include "access/htup.h"
  #include "nodes/bitmapset.h"
  #include "nodes/tidbitmap.h"
  #include "utils/hsearch.h"
--- 40,46 ----
  
  #include <limits.h>
  
! #include "access/tupheader.h"
  #include "nodes/bitmapset.h"
  #include "nodes/tidbitmap.h"
  #include "utils/hsearch.h"
*** a/src/backend/optimizer/path/costsize.c
--- b/src/backend/optimizer/path/costsize.c
***************
*** 70,75 ****
--- 70,76 ----
  
  #include <math.h>
  
+ #include "access/tupheader.h"
  #include "executor/executor.h"
  #include "executor/nodeHash.h"
  #include "miscadmin.h"
*** a/src/backend/optimizer/plan/planagg.c
--- b/src/backend/optimizer/plan/planagg.c
***************
*** 28,33 ****
--- 28,34 ----
   */
  #include "postgres.h"
  
+ #include "access/tupheader.h"
  #include "catalog/pg_aggregate.h"
  #include "catalog/pg_type.h"
  #include "nodes/makefuncs.h"
*** a/src/backend/optimizer/plan/planner.c
--- b/src/backend/optimizer/plan/planner.c
***************
*** 17,22 ****
--- 17,23 ----
  
  #include <limits.h>
  
+ #include "access/tupheader.h"
  #include "executor/executor.h"
  #include "executor/nodeAgg.h"
  #include "miscadmin.h"
*** a/src/backend/optimizer/plan/subselect.c
--- b/src/backend/optimizer/plan/subselect.c
***************
*** 13,18 ****
--- 13,19 ----
   */
  #include "postgres.h"
  
+ #include "access/tupheader.h"
  #include "catalog/pg_operator.h"
  #include "catalog/pg_type.h"
  #include "executor/executor.h"
*** a/src/backend/optimizer/prep/prepunion.c
--- b/src/backend/optimizer/prep/prepunion.c
***************
*** 32,37 ****
--- 32,38 ----
  
  #include "access/heapam.h"
  #include "access/sysattr.h"
+ #include "access/tupheader.h"
  #include "catalog/pg_inherits_fn.h"
  #include "catalog/pg_type.h"
  #include "miscadmin.h"
*** a/src/backend/optimizer/util/clauses.c
--- b/src/backend/optimizer/util/clauses.c
***************
*** 19,24 ****
--- 19,25 ----
  
  #include "postgres.h"
  
+ #include "access/tupheader.h"
  #include "catalog/pg_aggregate.h"
  #include "catalog/pg_language.h"
  #include "catalog/pg_operator.h"
*** a/src/backend/optimizer/util/plancat.c
--- b/src/backend/optimizer/util/plancat.c
***************
*** 21,26 ****
--- 21,27 ----
  #include "access/heapam.h"
  #include "access/sysattr.h"
  #include "access/transam.h"
+ #include "access/tupheader.h"
  #include "access/xlog.h"
  #include "catalog/catalog.h"
  #include "catalog/heap.h"
*** a/src/backend/parser/parse_coerce.c
--- b/src/backend/parser/parse_coerce.c
***************
*** 14,19 ****
--- 14,20 ----
   */
  #include "postgres.h"
  
+ #include "access/tupheader.h"
  #include "catalog/pg_cast.h"
  #include "catalog/pg_class.h"
  #include "catalog/pg_inherits_fn.h"
*** a/src/backend/parser/parse_func.c
--- b/src/backend/parser/parse_func.c
***************
*** 14,19 ****
--- 14,20 ----
   */
  #include "postgres.h"
  
+ #include "access/tupheader.h"
  #include "catalog/pg_proc.h"
  #include "catalog/pg_type.h"
  #include "funcapi.h"
*** a/src/backend/parser/parse_node.c
--- b/src/backend/parser/parse_node.c
***************
*** 15,20 ****
--- 15,21 ----
  #include "postgres.h"
  
  #include "access/heapam.h"
+ #include "access/tupheader.h"
  #include "catalog/pg_type.h"
  #include "mb/pg_wchar.h"
  #include "nodes/makefuncs.h"
*** a/src/backend/parser/parse_oper.c
--- b/src/backend/parser/parse_oper.c
***************
*** 15,20 ****
--- 15,21 ----
  
  #include "postgres.h"
  
+ #include "access/tupheader.h"
  #include "catalog/pg_operator.h"
  #include "catalog/pg_type.h"
  #include "lib/stringinfo.h"
*** a/src/backend/parser/parse_relation.c
--- b/src/backend/parser/parse_relation.c
***************
*** 17,22 ****
--- 17,23 ----
  #include <ctype.h>
  
  #include "access/sysattr.h"
+ #include "access/tupheader.h"
  #include "catalog/heap.h"
  #include "catalog/namespace.h"
  #include "catalog/pg_type.h"
*** a/src/backend/parser/parse_type.c
--- b/src/backend/parser/parse_type.c
***************
*** 14,19 ****
--- 14,20 ----
   */
  #include "postgres.h"
  
+ #include "access/tupheader.h"
  #include "catalog/namespace.h"
  #include "catalog/pg_type.h"
  #include "lib/stringinfo.h"
*** a/src/backend/parser/parse_utilcmd.c
--- b/src/backend/parser/parse_utilcmd.c
***************
*** 27,32 ****
--- 27,33 ----
  #include "postgres.h"
  
  #include "access/reloptions.h"
+ #include "access/tupheader.h"
  #include "catalog/dependency.h"
  #include "catalog/heap.h"
  #include "catalog/index.h"
*** a/src/backend/postmaster/autovacuum.c
--- b/src/backend/postmaster/autovacuum.c
***************
*** 70,75 ****
--- 70,76 ----
  #include "access/heapam.h"
  #include "access/reloptions.h"
  #include "access/transam.h"
+ #include "access/tupheader.h"
  #include "access/xact.h"
  #include "catalog/dependency.h"
  #include "catalog/namespace.h"
*** a/src/backend/postmaster/pgstat.c
--- b/src/backend/postmaster/pgstat.c
***************
*** 33,38 ****
--- 33,39 ----
  
  #include "access/heapam.h"
  #include "access/transam.h"
+ #include "access/tupheader.h"
  #include "access/twophase_rmgr.h"
  #include "access/xact.h"
  #include "catalog/pg_database.h"
*** a/src/backend/rewrite/rewriteDefine.c
--- b/src/backend/rewrite/rewriteDefine.c
***************
*** 15,20 ****
--- 15,21 ----
  #include "postgres.h"
  
  #include "access/heapam.h"
+ #include "access/tupheader.h"
  #include "catalog/catalog.h"
  #include "catalog/dependency.h"
  #include "catalog/indexing.h"
*** a/src/backend/rewrite/rewriteRemove.c
--- b/src/backend/rewrite/rewriteRemove.c
***************
*** 17,22 ****
--- 17,23 ----
  #include "access/genam.h"
  #include "access/heapam.h"
  #include "access/sysattr.h"
+ #include "access/tupheader.h"
  #include "catalog/dependency.h"
  #include "catalog/indexing.h"
  #include "catalog/namespace.h"
*** a/src/backend/rewrite/rewriteSupport.c
--- b/src/backend/rewrite/rewriteSupport.c
***************
*** 15,20 ****
--- 15,21 ----
  #include "postgres.h"
  
  #include "access/heapam.h"
+ #include "access/tupheader.h"
  #include "catalog/indexing.h"
  #include "catalog/pg_rewrite.h"
  #include "rewrite/rewriteSupport.h"
*** a/src/backend/storage/freespace/freespace.c
--- b/src/backend/storage/freespace/freespace.c
***************
*** 23,29 ****
   */
  #include "postgres.h"
  
! #include "access/htup.h"
  #include "access/xlogutils.h"
  #include "miscadmin.h"
  #include "storage/freespace.h"
--- 23,29 ----
   */
  #include "postgres.h"
  
! #include "access/tupheader.h"
  #include "access/xlogutils.h"
  #include "miscadmin.h"
  #include "storage/freespace.h"
*** a/src/backend/storage/lmgr/predicate.c
--- b/src/backend/storage/lmgr/predicate.c
***************
*** 186,191 ****
--- 186,192 ----
  #include "access/slru.h"
  #include "access/subtrans.h"
  #include "access/transam.h"
+ #include "access/tupheader.h"
  #include "access/twophase.h"
  #include "access/twophase_rmgr.h"
  #include "access/xact.h"
*** a/src/backend/storage/page/bufpage.c
--- b/src/backend/storage/page/bufpage.c
***************
*** 14,20 ****
   */
  #include "postgres.h"
  
! #include "access/htup.h"
  
  
  /* ----------------------------------------------------------------
--- 14,20 ----
   */
  #include "postgres.h"
  
! #include "access/tupheader.h"
  
  
  /* ----------------------------------------------------------------
*** a/src/backend/tcop/fastpath.c
--- b/src/backend/tcop/fastpath.c
***************
*** 20,25 ****
--- 20,26 ----
  #include <netinet/in.h>
  #include <arpa/inet.h>
  
+ #include "access/tupheader.h"
  #include "access/xact.h"
  #include "catalog/pg_proc.h"
  #include "libpq/libpq.h"
*** a/src/backend/tcop/utility.c
--- b/src/backend/tcop/utility.c
***************
*** 17,22 ****
--- 17,23 ----
  #include "postgres.h"
  
  #include "access/reloptions.h"
+ #include "access/tupheader.h"
  #include "access/twophase.h"
  #include "access/xact.h"
  #include "catalog/catalog.h"
*** a/src/backend/tsearch/ts_selfuncs.c
--- b/src/backend/tsearch/ts_selfuncs.c
***************
*** 13,18 ****
--- 13,19 ----
   */
  #include "postgres.h"
  
+ #include "access/tupheader.h"
  #include "catalog/pg_statistic.h"
  #include "catalog/pg_type.h"
  #include "miscadmin.h"
*** a/src/backend/utils/adt/acl.c
--- b/src/backend/utils/adt/acl.c
***************
*** 16,21 ****
--- 16,22 ----
  
  #include <ctype.h>
  
+ #include "access/tupheader.h"
  #include "catalog/namespace.h"
  #include "catalog/pg_authid.h"
  #include "catalog/pg_auth_members.h"
*** a/src/backend/utils/adt/array_selfuncs.c
--- b/src/backend/utils/adt/array_selfuncs.c
***************
*** 16,21 ****
--- 16,22 ----
  
  #include <math.h>
  
+ #include "access/tupheader.h"
  #include "catalog/pg_collation.h"
  #include "catalog/pg_operator.h"
  #include "catalog/pg_statistic.h"
*** a/src/backend/utils/adt/arrayfuncs.c
--- b/src/backend/utils/adt/arrayfuncs.c
***************
*** 16,21 ****
--- 16,22 ----
  
  #include <ctype.h>
  
+ #include "access/tupheader.h"
  #include "funcapi.h"
  #include "libpq/pqformat.h"
  #include "utils/array.h"
*** a/src/backend/utils/adt/dbsize.c
--- b/src/backend/utils/adt/dbsize.c
***************
*** 15,20 ****
--- 15,21 ----
  #include <sys/stat.h>
  
  #include "access/heapam.h"
+ #include "access/tupheader.h"
  #include "catalog/catalog.h"
  #include "catalog/namespace.h"
  #include "catalog/pg_tablespace.h"
*** a/src/backend/utils/adt/enum.c
--- b/src/backend/utils/adt/enum.c
***************
*** 15,20 ****
--- 15,21 ----
  
  #include "access/genam.h"
  #include "access/heapam.h"
+ #include "access/tupheader.h"
  #include "catalog/indexing.h"
  #include "catalog/pg_enum.h"
  #include "libpq/pqformat.h"
*** a/src/backend/utils/adt/format_type.c
--- b/src/backend/utils/adt/format_type.c
***************
*** 17,22 ****
--- 17,23 ----
  
  #include <ctype.h>
  
+ #include "access/tupheader.h"
  #include "catalog/namespace.h"
  #include "catalog/pg_type.h"
  #include "utils/builtins.h"
*** a/src/backend/utils/adt/json.c
--- b/src/backend/utils/adt/json.c
***************
*** 13,18 ****
--- 13,19 ----
   */
  #include "postgres.h"
  
+ #include "access/tupheader.h"
  #include "catalog/pg_type.h"
  #include "executor/spi.h"
  #include "lib/stringinfo.h"
*** a/src/backend/utils/adt/pg_locale.c
--- b/src/backend/utils/adt/pg_locale.c
***************
*** 54,59 ****
--- 54,60 ----
  #include <locale.h>
  #include <time.h>
  
+ #include "access/tupheader.h"
  #include "catalog/pg_collation.h"
  #include "catalog/pg_control.h"
  #include "mb/pg_wchar.h"
*** a/src/backend/utils/adt/rangetypes_selfuncs.c
--- b/src/backend/utils/adt/rangetypes_selfuncs.c
***************
*** 17,22 ****
--- 17,23 ----
   */
  #include "postgres.h"
  
+ #include "access/tupheader.h"
  #include "catalog/pg_operator.h"
  #include "catalog/pg_statistic.h"
  #include "utils/lsyscache.h"
*** a/src/backend/utils/adt/regproc.c
--- b/src/backend/utils/adt/regproc.c
***************
*** 23,28 ****
--- 23,29 ----
  
  #include "access/genam.h"
  #include "access/heapam.h"
+ #include "access/tupheader.h"
  #include "catalog/indexing.h"
  #include "catalog/namespace.h"
  #include "catalog/pg_class.h"
*** a/src/backend/utils/adt/ri_triggers.c
--- b/src/backend/utils/adt/ri_triggers.c
***************
*** 32,37 ****
--- 32,38 ----
  
  #include "access/xact.h"
  #include "access/sysattr.h"
+ #include "access/tupheader.h"
  #include "catalog/pg_collation.h"
  #include "catalog/pg_constraint.h"
  #include "catalog/pg_operator.h"
*** a/src/backend/utils/adt/rowtypes.c
--- b/src/backend/utils/adt/rowtypes.c
***************
*** 16,21 ****
--- 16,22 ----
  
  #include <ctype.h>
  
+ #include "access/tupheader.h"
  #include "catalog/pg_type.h"
  #include "libpq/pqformat.h"
  #include "utils/builtins.h"
*** a/src/backend/utils/adt/ruleutils.c
--- b/src/backend/utils/adt/ruleutils.c
***************
*** 19,24 ****
--- 19,25 ----
  #include <fcntl.h>
  
  #include "access/sysattr.h"
+ #include "access/tupheader.h"
  #include "catalog/dependency.h"
  #include "catalog/indexing.h"
  #include "catalog/pg_authid.h"
*** a/src/backend/utils/adt/selfuncs.c
--- b/src/backend/utils/adt/selfuncs.c
***************
*** 102,107 ****
--- 102,108 ----
  
  #include "access/gin.h"
  #include "access/sysattr.h"
+ #include "access/tupheader.h"
  #include "catalog/index.h"
  #include "catalog/pg_collation.h"
  #include "catalog/pg_opfamily.h"
*** a/src/backend/utils/adt/trigfuncs.c
--- b/src/backend/utils/adt/trigfuncs.c
***************
*** 13,18 ****
--- 13,19 ----
   */
  #include "postgres.h"
  
+ #include "access/tupheader.h"
  #include "commands/trigger.h"
  #include "utils/builtins.h"
  #include "utils/rel.h"
*** a/src/backend/utils/adt/varbit.c
--- b/src/backend/utils/adt/varbit.c
***************
*** 16,22 ****
  
  #include "postgres.h"
  
! #include "access/htup.h"
  #include "libpq/pqformat.h"
  #include "nodes/nodeFuncs.h"
  #include "utils/array.h"
--- 16,22 ----
  
  #include "postgres.h"
  
! #include "access/tupheader.h"
  #include "libpq/pqformat.h"
  #include "nodes/nodeFuncs.h"
  #include "utils/array.h"
*** a/src/backend/utils/adt/xml.c
--- b/src/backend/utils/adt/xml.c
***************
*** 67,72 ****
--- 67,73 ----
  #endif
  #endif   /* USE_LIBXML */
  
+ #include "access/tupheader.h"
  #include "catalog/namespace.h"
  #include "catalog/pg_type.h"
  #include "commands/dbcommands.h"
*** a/src/backend/utils/cache/evtcache.c
--- b/src/backend/utils/cache/evtcache.c
***************
*** 15,20 ****
--- 15,21 ----
  
  #include "access/genam.h"
  #include "access/heapam.h"
+ #include "access/tupheader.h"
  #include "catalog/pg_event_trigger.h"
  #include "catalog/indexing.h"
  #include "catalog/pg_type.h"
*** a/src/backend/utils/cache/inval.c
--- b/src/backend/utils/cache/inval.c
***************
*** 95,100 ****
--- 95,101 ----
   */
  #include "postgres.h"
  
+ #include "access/tupheader.h"
  #include "access/xact.h"
  #include "catalog/catalog.h"
  #include "miscadmin.h"
*** a/src/backend/utils/cache/lsyscache.c
--- b/src/backend/utils/cache/lsyscache.c
***************
*** 17,22 ****
--- 17,23 ----
  
  #include "access/hash.h"
  #include "access/nbtree.h"
+ #include "access/tupheader.h"
  #include "bootstrap/bootstrap.h"
  #include "catalog/pg_amop.h"
  #include "catalog/pg_amproc.h"
*** a/src/backend/utils/cache/relcache.c
--- b/src/backend/utils/cache/relcache.c
***************
*** 33,38 ****
--- 33,39 ----
  #include "access/reloptions.h"
  #include "access/sysattr.h"
  #include "access/transam.h"
+ #include "access/tupheader.h"
  #include "access/xact.h"
  #include "catalog/catalog.h"
  #include "catalog/index.h"
*** a/src/backend/utils/cache/syscache.c
--- b/src/backend/utils/cache/syscache.c
***************
*** 21,26 ****
--- 21,27 ----
  #include "postgres.h"
  
  #include "access/sysattr.h"
+ #include "access/tupheader.h"
  #include "catalog/indexing.h"
  #include "catalog/pg_aggregate.h"
  #include "catalog/pg_amop.h"
*** a/src/backend/utils/cache/ts_cache.c
--- b/src/backend/utils/cache/ts_cache.c
***************
*** 28,33 ****
--- 28,34 ----
  
  #include "access/genam.h"
  #include "access/heapam.h"
+ #include "access/tupheader.h"
  #include "access/xact.h"
  #include "catalog/indexing.h"
  #include "catalog/namespace.h"
*** a/src/backend/utils/cache/typcache.c
--- b/src/backend/utils/cache/typcache.c
***************
*** 48,53 ****
--- 48,54 ----
  #include "access/hash.h"
  #include "access/heapam.h"
  #include "access/nbtree.h"
+ #include "access/tupheader.h"
  #include "catalog/indexing.h"
  #include "catalog/pg_enum.h"
  #include "catalog/pg_operator.h"
*** a/src/backend/utils/fmgr/funcapi.c
--- b/src/backend/utils/fmgr/funcapi.c
***************
*** 13,18 ****
--- 13,19 ----
   */
  #include "postgres.h"
  
+ #include "access/tupheader.h"
  #include "catalog/namespace.h"
  #include "catalog/pg_proc.h"
  #include "catalog/pg_type.h"
*** a/src/backend/utils/init/miscinit.c
--- b/src/backend/utils/init/miscinit.c
***************
*** 29,34 ****
--- 29,35 ----
  #include <utime.h>
  #endif
  
+ #include "access/tupheader.h"
  #include "catalog/pg_authid.h"
  #include "mb/pg_wchar.h"
  #include "miscadmin.h"
*** a/src/backend/utils/init/postinit.c
--- b/src/backend/utils/init/postinit.c
***************
*** 21,26 ****
--- 21,27 ----
  
  #include "access/heapam.h"
  #include "access/sysattr.h"
+ #include "access/tupheader.h"
  #include "access/xact.h"
  #include "catalog/catalog.h"
  #include "catalog/indexing.h"
*** a/src/backend/utils/misc/superuser.c
--- b/src/backend/utils/misc/superuser.c
***************
*** 20,25 ****
--- 20,26 ----
   */
  #include "postgres.h"
  
+ #include "access/tupheader.h"
  #include "catalog/pg_authid.h"
  #include "utils/inval.h"
  #include "utils/syscache.h"
*** a/src/backend/utils/sort/tuplesort.c
--- b/src/backend/utils/sort/tuplesort.c
***************
*** 101,106 ****
--- 101,107 ----
  #include <limits.h>
  
  #include "access/nbtree.h"
+ #include "access/tupheader.h"
  #include "catalog/index.h"
  #include "commands/tablespace.h"
  #include "executor/executor.h"
*** a/src/backend/utils/sort/tuplestore.c
--- b/src/backend/utils/sort/tuplestore.c
***************
*** 54,59 ****
--- 54,60 ----
  
  #include "postgres.h"
  
+ #include "access/tupheader.h"
  #include "commands/tablespace.h"
  #include "executor/executor.h"
  #include "storage/buffile.h"
*** a/src/backend/utils/time/combocid.c
--- b/src/backend/utils/time/combocid.c
***************
*** 41,47 ****
  
  #include "postgres.h"
  
! #include "access/htup.h"
  #include "access/xact.h"
  #include "utils/combocid.h"
  #include "utils/hsearch.h"
--- 41,47 ----
  
  #include "postgres.h"
  
! #include "access/tupheader.h"
  #include "access/xact.h"
  #include "utils/combocid.h"
  #include "utils/hsearch.h"
*** a/src/backend/utils/time/tqual.c
--- b/src/backend/utils/time/tqual.c
***************
*** 60,65 ****
--- 60,66 ----
  #include "access/multixact.h"
  #include "access/subtrans.h"
  #include "access/transam.h"
+ #include "access/tupheader.h"
  #include "access/xact.h"
  #include "storage/bufmgr.h"
  #include "storage/procarray.h"
*** a/src/include/access/heapam.h
--- b/src/include/access/heapam.h
***************
*** 17,22 ****
--- 17,23 ----
  #include "access/sdir.h"
  #include "access/skey.h"
  #include "nodes/primnodes.h"
+ #include "storage/bufpage.h"
  #include "storage/lock.h"
  #include "utils/relcache.h"
  #include "utils/snapshot.h"
*** a/src/include/access/heapam_xlog.h
--- b/src/include/access/heapam_xlog.h
***************
*** 16,21 ****
--- 16,22 ----
  
  #include "access/htup.h"
  #include "access/xlog.h"
+ #include "storage/bufpage.h"
  #include "storage/relfilenode.h"
  #include "utils/relcache.h"
  
*** a/src/include/access/htup.h
--- b/src/include/access/htup.h
***************
*** 15,483 ****
  #define HTUP_H
  
  #include "access/tupdesc.h"
- #include "access/tupmacs.h"
- #include "storage/bufpage.h"
  #include "storage/itemptr.h"
- #include "storage/relfilenode.h"
  
! /*
!  * MaxTupleAttributeNumber limits the number of (user) columns in a tuple.
!  * The key limit on this value is that the size of the fixed overhead for
!  * a tuple, plus the size of the null-values bitmap (at 1 bit per column),
!  * plus MAXALIGN alignment, must fit into t_hoff which is uint8.  On most
!  * machines the upper limit without making t_hoff wider would be a little
!  * over 1700.  We use round numbers here and for MaxHeapAttributeNumber
!  * so that alterations in HeapTupleHeaderData layout won't change the
!  * supported max number of columns.
!  */
! #define MaxTupleAttributeNumber 1664	/* 8 * 208 */
! 
! /*
!  * MaxHeapAttributeNumber limits the number of (user) columns in a table.
!  * This should be somewhat less than MaxTupleAttributeNumber.  It must be
!  * at least one less, else we will fail to do UPDATEs on a maximal-width
!  * table (because UPDATE has to form working tuples that include CTID).
!  * In practice we want some additional daylight so that we can gracefully
!  * support operations that add hidden "resjunk" columns, for example
!  * SELECT * FROM wide_table ORDER BY foo, bar, baz.
!  * In any case, depending on column data types you will likely be running
!  * into the disk-block-based limit on overall tuple size if you have more
!  * than a thousand or so columns.  TOAST won't help.
!  */
! #define MaxHeapAttributeNumber	1600	/* 8 * 200 */
! 
! /*
!  * Heap tuple header.  To avoid wasting space, the fields should be
!  * laid out in such a way as to avoid structure padding.
!  *
!  * Datums of composite types (row types) share the same general structure
!  * as on-disk tuples, so that the same routines can be used to build and
!  * examine them.  However the requirements are slightly different: a Datum
!  * does not need any transaction visibility information, and it does need
!  * a length word and some embedded type information.  We can achieve this
!  * by overlaying the xmin/cmin/xmax/cmax/xvac fields of a heap tuple
!  * with the fields needed in the Datum case.  Typically, all tuples built
!  * in-memory will be initialized with the Datum fields; but when a tuple is
!  * about to be inserted in a table, the transaction fields will be filled,
!  * overwriting the datum fields.
!  *
!  * The overall structure of a heap tuple looks like:
!  *			fixed fields (HeapTupleHeaderData struct)
!  *			nulls bitmap (if HEAP_HASNULL is set in t_infomask)
!  *			alignment padding (as needed to make user data MAXALIGN'd)
!  *			object ID (if HEAP_HASOID is set in t_infomask)
!  *			user data fields
!  *
!  * We store five "virtual" fields Xmin, Cmin, Xmax, Cmax, and Xvac in three
!  * physical fields.  Xmin and Xmax are always really stored, but Cmin, Cmax
!  * and Xvac share a field.	This works because we know that Cmin and Cmax
!  * are only interesting for the lifetime of the inserting and deleting
!  * transaction respectively.  If a tuple is inserted and deleted in the same
!  * transaction, we store a "combo" command id that can be mapped to the real
!  * cmin and cmax, but only by use of local state within the originating
!  * backend.  See combocid.c for more details.  Meanwhile, Xvac is only set by
!  * old-style VACUUM FULL, which does not have any command sub-structure and so
!  * does not need either Cmin or Cmax.  (This requires that old-style VACUUM
!  * FULL never try to move a tuple whose Cmin or Cmax is still interesting,
!  * ie, an insert-in-progress or delete-in-progress tuple.)
!  *
!  * A word about t_ctid: whenever a new tuple is stored on disk, its t_ctid
!  * is initialized with its own TID (location).	If the tuple is ever updated,
!  * its t_ctid is changed to point to the replacement version of the tuple.
!  * Thus, a tuple is the latest version of its row iff XMAX is invalid or
!  * t_ctid points to itself (in which case, if XMAX is valid, the tuple is
!  * either locked or deleted).  One can follow the chain of t_ctid links
!  * to find the newest version of the row.  Beware however that VACUUM might
!  * erase the pointed-to (newer) tuple before erasing the pointing (older)
!  * tuple.  Hence, when following a t_ctid link, it is necessary to check
!  * to see if the referenced slot is empty or contains an unrelated tuple.
!  * Check that the referenced tuple has XMIN equal to the referencing tuple's
!  * XMAX to verify that it is actually the descendant version and not an
!  * unrelated tuple stored into a slot recently freed by VACUUM.  If either
!  * check fails, one may assume that there is no live descendant version.
!  *
!  * Following the fixed header fields, the nulls bitmap is stored (beginning
!  * at t_bits).	The bitmap is *not* stored if t_infomask shows that there
!  * are no nulls in the tuple.  If an OID field is present (as indicated by
!  * t_infomask), then it is stored just before the user data, which begins at
!  * the offset shown by t_hoff.	Note that t_hoff must be a multiple of
!  * MAXALIGN.
!  */
! 
! typedef struct HeapTupleFields
! {
! 	TransactionId t_xmin;		/* inserting xact ID */
! 	TransactionId t_xmax;		/* deleting or locking xact ID */
! 
! 	union
! 	{
! 		CommandId	t_cid;		/* inserting or deleting command ID, or both */
! 		TransactionId t_xvac;	/* old-style VACUUM FULL xact ID */
! 	}			t_field3;
! } HeapTupleFields;
! 
! typedef struct DatumTupleFields
! {
! 	int32		datum_len_;		/* varlena header (do not touch directly!) */
  
! 	int32		datum_typmod;	/* -1, or identifier of a record type */
! 
! 	Oid			datum_typeid;	/* composite type OID, or RECORDOID */
! 
! 	/*
! 	 * Note: field ordering is chosen with thought that Oid might someday
! 	 * widen to 64 bits.
! 	 */
! } DatumTupleFields;
! 
! typedef struct HeapTupleHeaderData
! {
! 	union
! 	{
! 		HeapTupleFields t_heap;
! 		DatumTupleFields t_datum;
! 	}			t_choice;
! 
! 	ItemPointerData t_ctid;		/* current TID of this or newer tuple */
! 
! 	/* Fields below here must match MinimalTupleData! */
! 
! 	uint16		t_infomask2;	/* number of attributes + various flags */
! 
! 	uint16		t_infomask;		/* various flag bits, see below */
! 
! 	uint8		t_hoff;			/* sizeof header incl. bitmap, padding */
! 
! 	/* ^ - 23 bytes - ^ */
! 
! 	bits8		t_bits[1];		/* bitmap of NULLs -- VARIABLE LENGTH */
! 
! 	/* MORE DATA FOLLOWS AT END OF STRUCT */
! } HeapTupleHeaderData;
  
  typedef HeapTupleHeaderData *HeapTupleHeader;
  
! /*
!  * information stored in t_infomask:
!  */
! #define HEAP_HASNULL			0x0001	/* has null attribute(s) */
! #define HEAP_HASVARWIDTH		0x0002	/* has variable-width attribute(s) */
! #define HEAP_HASEXTERNAL		0x0004	/* has external stored attribute(s) */
! #define HEAP_HASOID				0x0008	/* has an object-id field */
! /* bit 0x0010 is available */
! #define HEAP_COMBOCID			0x0020	/* t_cid is a combo cid */
! #define HEAP_XMAX_EXCL_LOCK		0x0040	/* xmax is exclusive locker */
! #define HEAP_XMAX_SHARED_LOCK	0x0080	/* xmax is shared locker */
! /* if either LOCK bit is set, xmax hasn't deleted the tuple, only locked it */
! #define HEAP_IS_LOCKED	(HEAP_XMAX_EXCL_LOCK | HEAP_XMAX_SHARED_LOCK)
! #define HEAP_XMIN_COMMITTED		0x0100	/* t_xmin committed */
! #define HEAP_XMIN_INVALID		0x0200	/* t_xmin invalid/aborted */
! #define HEAP_XMAX_COMMITTED		0x0400	/* t_xmax committed */
! #define HEAP_XMAX_INVALID		0x0800	/* t_xmax invalid/aborted */
! #define HEAP_XMAX_IS_MULTI		0x1000	/* t_xmax is a MultiXactId */
! #define HEAP_UPDATED			0x2000	/* this is UPDATEd version of row */
! #define HEAP_MOVED_OFF			0x4000	/* moved to another place by pre-9.0
! 										 * VACUUM FULL; kept for binary
! 										 * upgrade support */
! #define HEAP_MOVED_IN			0x8000	/* moved from another place by pre-9.0
! 										 * VACUUM FULL; kept for binary
! 										 * upgrade support */
! #define HEAP_MOVED (HEAP_MOVED_OFF | HEAP_MOVED_IN)
! 
! #define HEAP_XACT_MASK			0xFFE0	/* visibility-related bits */
! 
! /*
!  * information stored in t_infomask2:
!  */
! #define HEAP_NATTS_MASK			0x07FF	/* 11 bits for number of attributes */
! /* bits 0x3800 are available */
! #define HEAP_HOT_UPDATED		0x4000	/* tuple was HOT-updated */
! #define HEAP_ONLY_TUPLE			0x8000	/* this is heap-only tuple */
! 
! #define HEAP2_XACT_MASK			0xC000	/* visibility-related bits */
! 
! /*
!  * HEAP_TUPLE_HAS_MATCH is a temporary flag used during hash joins.  It is
!  * only used in tuples that are in the hash table, and those don't need
!  * any visibility information, so we can overlay it on a visibility flag
!  * instead of using up a dedicated bit.
!  */
! #define HEAP_TUPLE_HAS_MATCH	HEAP_ONLY_TUPLE /* tuple has a join match */
! 
! /*
!  * HeapTupleHeader accessor macros
!  *
!  * Note: beware of multiple evaluations of "tup" argument.	But the Set
!  * macros evaluate their other argument only once.
!  */
! 
! #define HeapTupleHeaderGetXmin(tup) \
! ( \
! 	(tup)->t_choice.t_heap.t_xmin \
! )
! 
! #define HeapTupleHeaderSetXmin(tup, xid) \
! ( \
! 	(tup)->t_choice.t_heap.t_xmin = (xid) \
! )
! 
! #define HeapTupleHeaderGetXmax(tup) \
! ( \
! 	(tup)->t_choice.t_heap.t_xmax \
! )
! 
! #define HeapTupleHeaderSetXmax(tup, xid) \
! ( \
! 	(tup)->t_choice.t_heap.t_xmax = (xid) \
! )
! 
! /*
!  * HeapTupleHeaderGetRawCommandId will give you what's in the header whether
!  * it is useful or not.  Most code should use HeapTupleHeaderGetCmin or
!  * HeapTupleHeaderGetCmax instead, but note that those Assert that you can
!  * get a legitimate result, ie you are in the originating transaction!
!  */
! #define HeapTupleHeaderGetRawCommandId(tup) \
! ( \
! 	(tup)->t_choice.t_heap.t_field3.t_cid \
! )
! 
! /* SetCmin is reasonably simple since we never need a combo CID */
! #define HeapTupleHeaderSetCmin(tup, cid) \
! do { \
! 	Assert(!((tup)->t_infomask & HEAP_MOVED)); \
! 	(tup)->t_choice.t_heap.t_field3.t_cid = (cid); \
! 	(tup)->t_infomask &= ~HEAP_COMBOCID; \
! } while (0)
! 
! /* SetCmax must be used after HeapTupleHeaderAdjustCmax; see combocid.c */
! #define HeapTupleHeaderSetCmax(tup, cid, iscombo) \
! do { \
! 	Assert(!((tup)->t_infomask & HEAP_MOVED)); \
! 	(tup)->t_choice.t_heap.t_field3.t_cid = (cid); \
! 	if (iscombo) \
! 		(tup)->t_infomask |= HEAP_COMBOCID; \
! 	else \
! 		(tup)->t_infomask &= ~HEAP_COMBOCID; \
! } while (0)
! 
! #define HeapTupleHeaderGetXvac(tup) \
! ( \
! 	((tup)->t_infomask & HEAP_MOVED) ? \
! 		(tup)->t_choice.t_heap.t_field3.t_xvac \
! 	: \
! 		InvalidTransactionId \
! )
! 
! #define HeapTupleHeaderSetXvac(tup, xid) \
! do { \
! 	Assert((tup)->t_infomask & HEAP_MOVED); \
! 	(tup)->t_choice.t_heap.t_field3.t_xvac = (xid); \
! } while (0)
! 
! #define HeapTupleHeaderGetDatumLength(tup) \
! 	VARSIZE(tup)
! 
! #define HeapTupleHeaderSetDatumLength(tup, len) \
! 	SET_VARSIZE(tup, len)
! 
! #define HeapTupleHeaderGetTypeId(tup) \
! ( \
! 	(tup)->t_choice.t_datum.datum_typeid \
! )
! 
! #define HeapTupleHeaderSetTypeId(tup, typeid) \
! ( \
! 	(tup)->t_choice.t_datum.datum_typeid = (typeid) \
! )
! 
! #define HeapTupleHeaderGetTypMod(tup) \
! ( \
! 	(tup)->t_choice.t_datum.datum_typmod \
! )
! 
! #define HeapTupleHeaderSetTypMod(tup, typmod) \
! ( \
! 	(tup)->t_choice.t_datum.datum_typmod = (typmod) \
! )
! 
! #define HeapTupleHeaderGetOid(tup) \
! ( \
! 	((tup)->t_infomask & HEAP_HASOID) ? \
! 		*((Oid *) ((char *)(tup) + (tup)->t_hoff - sizeof(Oid))) \
! 	: \
! 		InvalidOid \
! )
! 
! #define HeapTupleHeaderSetOid(tup, oid) \
! do { \
! 	Assert((tup)->t_infomask & HEAP_HASOID); \
! 	*((Oid *) ((char *)(tup) + (tup)->t_hoff - sizeof(Oid))) = (oid); \
! } while (0)
! 
! /*
!  * Note that we stop considering a tuple HOT-updated as soon as it is known
!  * aborted or the would-be updating transaction is known aborted.  For best
!  * efficiency, check tuple visibility before using this macro, so that the
!  * INVALID bits will be as up to date as possible.
!  */
! #define HeapTupleHeaderIsHotUpdated(tup) \
! ( \
! 	((tup)->t_infomask2 & HEAP_HOT_UPDATED) != 0 && \
! 	((tup)->t_infomask & (HEAP_XMIN_INVALID | HEAP_XMAX_INVALID)) == 0 \
! )
! 
! #define HeapTupleHeaderSetHotUpdated(tup) \
! ( \
! 	(tup)->t_infomask2 |= HEAP_HOT_UPDATED \
! )
! 
! #define HeapTupleHeaderClearHotUpdated(tup) \
! ( \
! 	(tup)->t_infomask2 &= ~HEAP_HOT_UPDATED \
! )
! 
! #define HeapTupleHeaderIsHeapOnly(tup) \
! ( \
!   (tup)->t_infomask2 & HEAP_ONLY_TUPLE \
! )
! 
! #define HeapTupleHeaderSetHeapOnly(tup) \
! ( \
!   (tup)->t_infomask2 |= HEAP_ONLY_TUPLE \
! )
! 
! #define HeapTupleHeaderClearHeapOnly(tup) \
! ( \
!   (tup)->t_infomask2 &= ~HEAP_ONLY_TUPLE \
! )
! 
! #define HeapTupleHeaderHasMatch(tup) \
! ( \
!   (tup)->t_infomask2 & HEAP_TUPLE_HAS_MATCH \
! )
! 
! #define HeapTupleHeaderSetMatch(tup) \
! ( \
!   (tup)->t_infomask2 |= HEAP_TUPLE_HAS_MATCH \
! )
! 
! #define HeapTupleHeaderClearMatch(tup) \
! ( \
!   (tup)->t_infomask2 &= ~HEAP_TUPLE_HAS_MATCH \
! )
! 
! #define HeapTupleHeaderGetNatts(tup) \
! 	((tup)->t_infomask2 & HEAP_NATTS_MASK)
! 
! #define HeapTupleHeaderSetNatts(tup, natts) \
! ( \
! 	(tup)->t_infomask2 = ((tup)->t_infomask2 & ~HEAP_NATTS_MASK) | (natts) \
! )
! 
! 
! /*
!  * BITMAPLEN(NATTS) -
!  *		Computes size of null bitmap given number of data columns.
!  */
! #define BITMAPLEN(NATTS)	(((int)(NATTS) + 7) / 8)
! 
! /*
!  * MaxHeapTupleSize is the maximum allowed size of a heap tuple, including
!  * header and MAXALIGN alignment padding.  Basically it's BLCKSZ minus the
!  * other stuff that has to be on a disk page.  Since heap pages use no
!  * "special space", there's no deduction for that.
!  *
!  * NOTE: we allow for the ItemId that must point to the tuple, ensuring that
!  * an otherwise-empty page can indeed hold a tuple of this size.  Because
!  * ItemIds and tuples have different alignment requirements, don't assume that
!  * you can, say, fit 2 tuples of size MaxHeapTupleSize/2 on the same page.
!  */
! #define MaxHeapTupleSize  (BLCKSZ - MAXALIGN(SizeOfPageHeaderData + sizeof(ItemIdData)))
! 
! /*
!  * MaxHeapTuplesPerPage is an upper bound on the number of tuples that can
!  * fit on one heap page.  (Note that indexes could have more, because they
!  * use a smaller tuple header.)  We arrive at the divisor because each tuple
!  * must be maxaligned, and it must have an associated item pointer.
!  *
!  * Note: with HOT, there could theoretically be more line pointers (not actual
!  * tuples) than this on a heap page.  However we constrain the number of line
!  * pointers to this anyway, to avoid excessive line-pointer bloat and not
!  * require increases in the size of work arrays.
!  */
! #define MaxHeapTuplesPerPage	\
! 	((int) ((BLCKSZ - SizeOfPageHeaderData) / \
! 			(MAXALIGN(offsetof(HeapTupleHeaderData, t_bits)) + sizeof(ItemIdData))))
! 
! /*
!  * MaxAttrSize is a somewhat arbitrary upper limit on the declared size of
!  * data fields of char(n) and similar types.  It need not have anything
!  * directly to do with the *actual* upper limit of varlena values, which
!  * is currently 1Gb (see TOAST structures in postgres.h).  I've set it
!  * at 10Mb which seems like a reasonable number --- tgl 8/6/00.
!  */
! #define MaxAttrSize		(10 * 1024 * 1024)
! 
! 
! /*
!  * MinimalTuple is an alternative representation that is used for transient
!  * tuples inside the executor, in places where transaction status information
!  * is not required, the tuple rowtype is known, and shaving off a few bytes
!  * is worthwhile because we need to store many tuples.	The representation
!  * is chosen so that tuple access routines can work with either full or
!  * minimal tuples via a HeapTupleData pointer structure.  The access routines
!  * see no difference, except that they must not access the transaction status
!  * or t_ctid fields because those aren't there.
!  *
!  * For the most part, MinimalTuples should be accessed via TupleTableSlot
!  * routines.  These routines will prevent access to the "system columns"
!  * and thereby prevent accidental use of the nonexistent fields.
!  *
!  * MinimalTupleData contains a length word, some padding, and fields matching
!  * HeapTupleHeaderData beginning with t_infomask2. The padding is chosen so
!  * that offsetof(t_infomask2) is the same modulo MAXIMUM_ALIGNOF in both
!  * structs.   This makes data alignment rules equivalent in both cases.
!  *
!  * When a minimal tuple is accessed via a HeapTupleData pointer, t_data is
!  * set to point MINIMAL_TUPLE_OFFSET bytes before the actual start of the
!  * minimal tuple --- that is, where a full tuple matching the minimal tuple's
!  * data would start.  This trick is what makes the structs seem equivalent.
!  *
!  * Note that t_hoff is computed the same as in a full tuple, hence it includes
!  * the MINIMAL_TUPLE_OFFSET distance.  t_len does not include that, however.
!  *
!  * MINIMAL_TUPLE_DATA_OFFSET is the offset to the first useful (non-pad) data
!  * other than the length word.	tuplesort.c and tuplestore.c use this to avoid
!  * writing the padding to disk.
!  */
! #define MINIMAL_TUPLE_OFFSET \
! 	((offsetof(HeapTupleHeaderData, t_infomask2) - sizeof(uint32)) / MAXIMUM_ALIGNOF * MAXIMUM_ALIGNOF)
! #define MINIMAL_TUPLE_PADDING \
! 	((offsetof(HeapTupleHeaderData, t_infomask2) - sizeof(uint32)) % MAXIMUM_ALIGNOF)
! #define MINIMAL_TUPLE_DATA_OFFSET \
! 	offsetof(MinimalTupleData, t_infomask2)
! 
! typedef struct MinimalTupleData
! {
! 	uint32		t_len;			/* actual length of minimal tuple */
! 
! 	char		mt_padding[MINIMAL_TUPLE_PADDING];
! 
! 	/* Fields below here must match HeapTupleHeaderData! */
! 
! 	uint16		t_infomask2;	/* number of attributes + various flags */
! 
! 	uint16		t_infomask;		/* various flag bits, see below */
! 
! 	uint8		t_hoff;			/* sizeof header incl. bitmap, padding */
! 
! 	/* ^ - 23 bytes - ^ */
! 
! 	bits8		t_bits[1];		/* bitmap of NULLs -- VARIABLE LENGTH */
! 
! 	/* MORE DATA FOLLOWS AT END OF STRUCT */
! } MinimalTupleData;
  
  typedef MinimalTupleData *MinimalTuple;
  
--- 15,29 ----
  #define HTUP_H
  
  #include "access/tupdesc.h"
  #include "storage/itemptr.h"
  
! /* typedefs and forward declarations for structs defined in htup.h */
  
! typedef struct HeapTupleHeaderData HeapTupleHeaderData;
  
  typedef HeapTupleHeaderData *HeapTupleHeader;
  
! typedef struct MinimalTupleData MinimalTupleData;
  
  typedef MinimalTupleData *MinimalTuple;
  
***************
*** 527,582 **** typedef HeapTupleData *HeapTuple;
  #define HEAPTUPLESIZE	MAXALIGN(sizeof(HeapTupleData))
  
  /*
-  * GETSTRUCT - given a HeapTuple pointer, return address of the user data
-  */
- #define GETSTRUCT(TUP) ((char *) ((TUP)->t_data) + (TUP)->t_data->t_hoff)
- 
- /*
   * Accessor macros to be used with HeapTuple pointers.
   */
  #define HeapTupleIsValid(tuple) PointerIsValid(tuple)
  
- #define HeapTupleHasNulls(tuple) \
- 		(((tuple)->t_data->t_infomask & HEAP_HASNULL) != 0)
- 
- #define HeapTupleNoNulls(tuple) \
- 		(!((tuple)->t_data->t_infomask & HEAP_HASNULL))
- 
- #define HeapTupleHasVarWidth(tuple) \
- 		(((tuple)->t_data->t_infomask & HEAP_HASVARWIDTH) != 0)
- 
- #define HeapTupleAllFixed(tuple) \
- 		(!((tuple)->t_data->t_infomask & HEAP_HASVARWIDTH))
- 
- #define HeapTupleHasExternal(tuple) \
- 		(((tuple)->t_data->t_infomask & HEAP_HASEXTERNAL) != 0)
- 
- #define HeapTupleIsHotUpdated(tuple) \
- 		HeapTupleHeaderIsHotUpdated((tuple)->t_data)
- 
- #define HeapTupleSetHotUpdated(tuple) \
- 		HeapTupleHeaderSetHotUpdated((tuple)->t_data)
- 
- #define HeapTupleClearHotUpdated(tuple) \
- 		HeapTupleHeaderClearHotUpdated((tuple)->t_data)
- 
- #define HeapTupleIsHeapOnly(tuple) \
- 		HeapTupleHeaderIsHeapOnly((tuple)->t_data)
- 
- #define HeapTupleSetHeapOnly(tuple) \
- 		HeapTupleHeaderSetHeapOnly((tuple)->t_data)
- 
- #define HeapTupleClearHeapOnly(tuple) \
- 		HeapTupleHeaderClearHeapOnly((tuple)->t_data)
- 
- #define HeapTupleGetOid(tuple) \
- 		HeapTupleHeaderGetOid((tuple)->t_data)
- 
- #define HeapTupleSetOid(tuple, oid) \
- 		HeapTupleHeaderSetOid((tuple)->t_data, (oid))
- 
- 
- 
  /* HeapTupleHeader functions implemented in utils/time/combocid.c */
  extern CommandId HeapTupleHeaderGetCmin(HeapTupleHeader tup);
  extern CommandId HeapTupleHeaderGetCmax(HeapTupleHeader tup);
--- 73,82 ----
***************
*** 584,672 **** extern void HeapTupleHeaderAdjustCmax(HeapTupleHeader tup,
  						  CommandId *cmax,
  						  bool *iscombo);
  
- /* ----------------
-  *		fastgetattr
-  *
-  *		Fetch a user attribute's value as a Datum (might be either a
-  *		value, or a pointer into the data area of the tuple).
-  *
-  *		This must not be used when a system attribute might be requested.
-  *		Furthermore, the passed attnum MUST be valid.  Use heap_getattr()
-  *		instead, if in doubt.
-  *
-  *		This gets called many times, so we macro the cacheable and NULL
-  *		lookups, and call nocachegetattr() for the rest.
-  * ----------------
-  */
- 
- #if !defined(DISABLE_COMPLEX_MACRO)
- 
- #define fastgetattr(tup, attnum, tupleDesc, isnull)					\
- (																	\
- 	AssertMacro((attnum) > 0),										\
- 	(*(isnull) = false),											\
- 	HeapTupleNoNulls(tup) ?											\
- 	(																\
- 		(tupleDesc)->attrs[(attnum)-1]->attcacheoff >= 0 ?			\
- 		(															\
- 			fetchatt((tupleDesc)->attrs[(attnum)-1],				\
- 				(char *) (tup)->t_data + (tup)->t_data->t_hoff +	\
- 					(tupleDesc)->attrs[(attnum)-1]->attcacheoff)	\
- 		)															\
- 		:															\
- 			nocachegetattr((tup), (attnum), (tupleDesc))			\
- 	)																\
- 	:																\
- 	(																\
- 		att_isnull((attnum)-1, (tup)->t_data->t_bits) ?				\
- 		(															\
- 			(*(isnull) = true),										\
- 			(Datum)NULL												\
- 		)															\
- 		:															\
- 		(															\
- 			nocachegetattr((tup), (attnum), (tupleDesc))			\
- 		)															\
- 	)																\
- )
- #else							/* defined(DISABLE_COMPLEX_MACRO) */
- 
- extern Datum fastgetattr(HeapTuple tup, int attnum, TupleDesc tupleDesc,
- 			bool *isnull);
- #endif   /* defined(DISABLE_COMPLEX_MACRO) */
- 
- 
- /* ----------------
-  *		heap_getattr
-  *
-  *		Extract an attribute of a heap tuple and return it as a Datum.
-  *		This works for either system or user attributes.  The given attnum
-  *		is properly range-checked.
-  *
-  *		If the field in question has a NULL value, we return a zero Datum
-  *		and set *isnull == true.  Otherwise, we set *isnull == false.
-  *
-  *		<tup> is the pointer to the heap tuple.  <attnum> is the attribute
-  *		number of the column (field) caller wants.	<tupleDesc> is a
-  *		pointer to the structure describing the row and all its fields.
-  * ----------------
-  */
- #define heap_getattr(tup, attnum, tupleDesc, isnull) \
- 	( \
- 		((attnum) > 0) ? \
- 		( \
- 			((attnum) > (int) HeapTupleHeaderGetNatts((tup)->t_data)) ? \
- 			( \
- 				(*(isnull) = true), \
- 				(Datum)NULL \
- 			) \
- 			: \
- 				fastgetattr((tup), (attnum), (tupleDesc), (isnull)) \
- 		) \
- 		: \
- 			heap_getsysattr((tup), (attnum), (tupleDesc), (isnull)) \
- 	)
- 
  /* prototypes for functions in common/heaptuple.c */
  extern Size heap_compute_data_size(TupleDesc tupleDesc,
  					   Datum *values, bool *isnull);
--- 84,89 ----
*** a/src/include/access/relscan.h
--- b/src/include/access/relscan.h
***************
*** 18,23 ****
--- 18,24 ----
  #include "access/heapam.h"
  #include "access/itup.h"
  #include "access/tupdesc.h"
+ #include "access/tupheader.h"
  
  
  typedef struct HeapScanDescData
*** /dev/null
--- b/src/include/access/tupheader.h
***************
*** 0 ****
--- 1,614 ----
+ /*-------------------------------------------------------------------------
+  *
+  * tupheader.h
+  *	  POSTGRES heap tuple header definitions.
+  *
+  *
+  * Portions Copyright (c) 1996-2012, PostgreSQL Global Development Group
+  * Portions Copyright (c) 1994, Regents of the University of California
+  *
+  * src/include/access/tupheader.h
+  *
+  *-------------------------------------------------------------------------
+  */
+ #ifndef TUPHEADER_H
+ #define TUPHEADER_H
+ 
+ #include "access/htup.h"
+ #include "access/tupmacs.h"
+ #include "storage/bufpage.h"
+ 
+ /*
+  * MaxTupleAttributeNumber limits the number of (user) columns in a tuple.
+  * The key limit on this value is that the size of the fixed overhead for
+  * a tuple, plus the size of the null-values bitmap (at 1 bit per column),
+  * plus MAXALIGN alignment, must fit into t_hoff which is uint8.  On most
+  * machines the upper limit without making t_hoff wider would be a little
+  * over 1700.  We use round numbers here and for MaxHeapAttributeNumber
+  * so that alterations in HeapTupleHeaderData layout won't change the
+  * supported max number of columns.
+  */
+ #define MaxTupleAttributeNumber 1664	/* 8 * 208 */
+ 
+ /*
+  * MaxHeapAttributeNumber limits the number of (user) columns in a table.
+  * This should be somewhat less than MaxTupleAttributeNumber.  It must be
+  * at least one less, else we will fail to do UPDATEs on a maximal-width
+  * table (because UPDATE has to form working tuples that include CTID).
+  * In practice we want some additional daylight so that we can gracefully
+  * support operations that add hidden "resjunk" columns, for example
+  * SELECT * FROM wide_table ORDER BY foo, bar, baz.
+  * In any case, depending on column data types you will likely be running
+  * into the disk-block-based limit on overall tuple size if you have more
+  * than a thousand or so columns.  TOAST won't help.
+  */
+ #define MaxHeapAttributeNumber	1600	/* 8 * 200 */
+ 
+ /*
+  * Heap tuple header.  To avoid wasting space, the fields should be
+  * laid out in such a way as to avoid structure padding.
+  *
+  * Datums of composite types (row types) share the same general structure
+  * as on-disk tuples, so that the same routines can be used to build and
+  * examine them.  However the requirements are slightly different: a Datum
+  * does not need any transaction visibility information, and it does need
+  * a length word and some embedded type information.  We can achieve this
+  * by overlaying the xmin/cmin/xmax/cmax/xvac fields of a heap tuple
+  * with the fields needed in the Datum case.  Typically, all tuples built
+  * in-memory will be initialized with the Datum fields; but when a tuple is
+  * about to be inserted in a table, the transaction fields will be filled,
+  * overwriting the datum fields.
+  *
+  * The overall structure of a heap tuple looks like:
+  *			fixed fields (HeapTupleHeaderData struct)
+  *			nulls bitmap (if HEAP_HASNULL is set in t_infomask)
+  *			alignment padding (as needed to make user data MAXALIGN'd)
+  *			object ID (if HEAP_HASOID is set in t_infomask)
+  *			user data fields
+  *
+  * We store five "virtual" fields Xmin, Cmin, Xmax, Cmax, and Xvac in three
+  * physical fields.  Xmin and Xmax are always really stored, but Cmin, Cmax
+  * and Xvac share a field.	This works because we know that Cmin and Cmax
+  * are only interesting for the lifetime of the inserting and deleting
+  * transaction respectively.  If a tuple is inserted and deleted in the same
+  * transaction, we store a "combo" command id that can be mapped to the real
+  * cmin and cmax, but only by use of local state within the originating
+  * backend.  See combocid.c for more details.  Meanwhile, Xvac is only set by
+  * old-style VACUUM FULL, which does not have any command sub-structure and so
+  * does not need either Cmin or Cmax.  (This requires that old-style VACUUM
+  * FULL never try to move a tuple whose Cmin or Cmax is still interesting,
+  * ie, an insert-in-progress or delete-in-progress tuple.)
+  *
+  * A word about t_ctid: whenever a new tuple is stored on disk, its t_ctid
+  * is initialized with its own TID (location).	If the tuple is ever updated,
+  * its t_ctid is changed to point to the replacement version of the tuple.
+  * Thus, a tuple is the latest version of its row iff XMAX is invalid or
+  * t_ctid points to itself (in which case, if XMAX is valid, the tuple is
+  * either locked or deleted).  One can follow the chain of t_ctid links
+  * to find the newest version of the row.  Beware however that VACUUM might
+  * erase the pointed-to (newer) tuple before erasing the pointing (older)
+  * tuple.  Hence, when following a t_ctid link, it is necessary to check
+  * to see if the referenced slot is empty or contains an unrelated tuple.
+  * Check that the referenced tuple has XMIN equal to the referencing tuple's
+  * XMAX to verify that it is actually the descendant version and not an
+  * unrelated tuple stored into a slot recently freed by VACUUM.  If either
+  * check fails, one may assume that there is no live descendant version.
+  *
+  * Following the fixed header fields, the nulls bitmap is stored (beginning
+  * at t_bits).	The bitmap is *not* stored if t_infomask shows that there
+  * are no nulls in the tuple.  If an OID field is present (as indicated by
+  * t_infomask), then it is stored just before the user data, which begins at
+  * the offset shown by t_hoff.	Note that t_hoff must be a multiple of
+  * MAXALIGN.
+  */
+ 
+ typedef struct HeapTupleFields
+ {
+ 	TransactionId t_xmin;		/* inserting xact ID */
+ 	TransactionId t_xmax;		/* deleting or locking xact ID */
+ 
+ 	union
+ 	{
+ 		CommandId	t_cid;		/* inserting or deleting command ID, or both */
+ 		TransactionId t_xvac;	/* old-style VACUUM FULL xact ID */
+ 	}			t_field3;
+ } HeapTupleFields;
+ 
+ typedef struct DatumTupleFields
+ {
+ 	int32		datum_len_;		/* varlena header (do not touch directly!) */
+ 
+ 	int32		datum_typmod;	/* -1, or identifier of a record type */
+ 
+ 	Oid			datum_typeid;	/* composite type OID, or RECORDOID */
+ 
+ 	/*
+ 	 * Note: field ordering is chosen with thought that Oid might someday
+ 	 * widen to 64 bits.
+ 	 */
+ } DatumTupleFields;
+ 
+ struct HeapTupleHeaderData
+ {
+ 	union
+ 	{
+ 		HeapTupleFields t_heap;
+ 		DatumTupleFields t_datum;
+ 	}			t_choice;
+ 
+ 	ItemPointerData t_ctid;		/* current TID of this or newer tuple */
+ 
+ 	/* Fields below here must match MinimalTupleData! */
+ 
+ 	uint16		t_infomask2;	/* number of attributes + various flags */
+ 
+ 	uint16		t_infomask;		/* various flag bits, see below */
+ 
+ 	uint8		t_hoff;			/* sizeof header incl. bitmap, padding */
+ 
+ 	/* ^ - 23 bytes - ^ */
+ 
+ 	bits8		t_bits[1];		/* bitmap of NULLs -- VARIABLE LENGTH */
+ 
+ 	/* MORE DATA FOLLOWS AT END OF STRUCT */
+ };
+ /* typedef appears in tupbasics.h */
+ 
+ /*
+  * information stored in t_infomask:
+  */
+ #define HEAP_HASNULL			0x0001	/* has null attribute(s) */
+ #define HEAP_HASVARWIDTH		0x0002	/* has variable-width attribute(s) */
+ #define HEAP_HASEXTERNAL		0x0004	/* has external stored attribute(s) */
+ #define HEAP_HASOID				0x0008	/* has an object-id field */
+ /* bit 0x0010 is available */
+ #define HEAP_COMBOCID			0x0020	/* t_cid is a combo cid */
+ #define HEAP_XMAX_EXCL_LOCK		0x0040	/* xmax is exclusive locker */
+ #define HEAP_XMAX_SHARED_LOCK	0x0080	/* xmax is shared locker */
+ /* if either LOCK bit is set, xmax hasn't deleted the tuple, only locked it */
+ #define HEAP_IS_LOCKED	(HEAP_XMAX_EXCL_LOCK | HEAP_XMAX_SHARED_LOCK)
+ #define HEAP_XMIN_COMMITTED		0x0100	/* t_xmin committed */
+ #define HEAP_XMIN_INVALID		0x0200	/* t_xmin invalid/aborted */
+ #define HEAP_XMAX_COMMITTED		0x0400	/* t_xmax committed */
+ #define HEAP_XMAX_INVALID		0x0800	/* t_xmax invalid/aborted */
+ #define HEAP_XMAX_IS_MULTI		0x1000	/* t_xmax is a MultiXactId */
+ #define HEAP_UPDATED			0x2000	/* this is UPDATEd version of row */
+ #define HEAP_MOVED_OFF			0x4000	/* moved to another place by pre-9.0
+ 										 * VACUUM FULL; kept for binary
+ 										 * upgrade support */
+ #define HEAP_MOVED_IN			0x8000	/* moved from another place by pre-9.0
+ 										 * VACUUM FULL; kept for binary
+ 										 * upgrade support */
+ #define HEAP_MOVED (HEAP_MOVED_OFF | HEAP_MOVED_IN)
+ 
+ #define HEAP_XACT_MASK			0xFFE0	/* visibility-related bits */
+ 
+ /*
+  * information stored in t_infomask2:
+  */
+ #define HEAP_NATTS_MASK			0x07FF	/* 11 bits for number of attributes */
+ /* bits 0x3800 are available */
+ #define HEAP_HOT_UPDATED		0x4000	/* tuple was HOT-updated */
+ #define HEAP_ONLY_TUPLE			0x8000	/* this is heap-only tuple */
+ 
+ #define HEAP2_XACT_MASK			0xC000	/* visibility-related bits */
+ 
+ /*
+  * HEAP_TUPLE_HAS_MATCH is a temporary flag used during hash joins.  It is
+  * only used in tuples that are in the hash table, and those don't need
+  * any visibility information, so we can overlay it on a visibility flag
+  * instead of using up a dedicated bit.
+  */
+ #define HEAP_TUPLE_HAS_MATCH	HEAP_ONLY_TUPLE /* tuple has a join match */
+ 
+ /*
+  * HeapTupleHeader accessor macros
+  *
+  * Note: beware of multiple evaluations of "tup" argument.	But the Set
+  * macros evaluate their other argument only once.
+  */
+ 
+ #define HeapTupleHeaderGetXmin(tup) \
+ ( \
+ 	(tup)->t_choice.t_heap.t_xmin \
+ )
+ 
+ #define HeapTupleHeaderSetXmin(tup, xid) \
+ ( \
+ 	(tup)->t_choice.t_heap.t_xmin = (xid) \
+ )
+ 
+ #define HeapTupleHeaderGetXmax(tup) \
+ ( \
+ 	(tup)->t_choice.t_heap.t_xmax \
+ )
+ 
+ #define HeapTupleHeaderSetXmax(tup, xid) \
+ ( \
+ 	(tup)->t_choice.t_heap.t_xmax = (xid) \
+ )
+ 
+ /*
+  * HeapTupleHeaderGetRawCommandId will give you what's in the header whether
+  * it is useful or not.  Most code should use HeapTupleHeaderGetCmin or
+  * HeapTupleHeaderGetCmax instead, but note that those Assert that you can
+  * get a legitimate result, ie you are in the originating transaction!
+  */
+ #define HeapTupleHeaderGetRawCommandId(tup) \
+ ( \
+ 	(tup)->t_choice.t_heap.t_field3.t_cid \
+ )
+ 
+ /* SetCmin is reasonably simple since we never need a combo CID */
+ #define HeapTupleHeaderSetCmin(tup, cid) \
+ do { \
+ 	Assert(!((tup)->t_infomask & HEAP_MOVED)); \
+ 	(tup)->t_choice.t_heap.t_field3.t_cid = (cid); \
+ 	(tup)->t_infomask &= ~HEAP_COMBOCID; \
+ } while (0)
+ 
+ /* SetCmax must be used after HeapTupleHeaderAdjustCmax; see combocid.c */
+ #define HeapTupleHeaderSetCmax(tup, cid, iscombo) \
+ do { \
+ 	Assert(!((tup)->t_infomask & HEAP_MOVED)); \
+ 	(tup)->t_choice.t_heap.t_field3.t_cid = (cid); \
+ 	if (iscombo) \
+ 		(tup)->t_infomask |= HEAP_COMBOCID; \
+ 	else \
+ 		(tup)->t_infomask &= ~HEAP_COMBOCID; \
+ } while (0)
+ 
+ #define HeapTupleHeaderGetXvac(tup) \
+ ( \
+ 	((tup)->t_infomask & HEAP_MOVED) ? \
+ 		(tup)->t_choice.t_heap.t_field3.t_xvac \
+ 	: \
+ 		InvalidTransactionId \
+ )
+ 
+ #define HeapTupleHeaderSetXvac(tup, xid) \
+ do { \
+ 	Assert((tup)->t_infomask & HEAP_MOVED); \
+ 	(tup)->t_choice.t_heap.t_field3.t_xvac = (xid); \
+ } while (0)
+ 
+ #define HeapTupleHeaderGetDatumLength(tup) \
+ 	VARSIZE(tup)
+ 
+ #define HeapTupleHeaderSetDatumLength(tup, len) \
+ 	SET_VARSIZE(tup, len)
+ 
+ #define HeapTupleHeaderGetTypeId(tup) \
+ ( \
+ 	(tup)->t_choice.t_datum.datum_typeid \
+ )
+ 
+ #define HeapTupleHeaderSetTypeId(tup, typeid) \
+ ( \
+ 	(tup)->t_choice.t_datum.datum_typeid = (typeid) \
+ )
+ 
+ #define HeapTupleHeaderGetTypMod(tup) \
+ ( \
+ 	(tup)->t_choice.t_datum.datum_typmod \
+ )
+ 
+ #define HeapTupleHeaderSetTypMod(tup, typmod) \
+ ( \
+ 	(tup)->t_choice.t_datum.datum_typmod = (typmod) \
+ )
+ 
+ #define HeapTupleHeaderGetOid(tup) \
+ ( \
+ 	((tup)->t_infomask & HEAP_HASOID) ? \
+ 		*((Oid *) ((char *)(tup) + (tup)->t_hoff - sizeof(Oid))) \
+ 	: \
+ 		InvalidOid \
+ )
+ 
+ #define HeapTupleHeaderSetOid(tup, oid) \
+ do { \
+ 	Assert((tup)->t_infomask & HEAP_HASOID); \
+ 	*((Oid *) ((char *)(tup) + (tup)->t_hoff - sizeof(Oid))) = (oid); \
+ } while (0)
+ 
+ /*
+  * Note that we stop considering a tuple HOT-updated as soon as it is known
+  * aborted or the would-be updating transaction is known aborted.  For best
+  * efficiency, check tuple visibility before using this macro, so that the
+  * INVALID bits will be as up to date as possible.
+  */
+ #define HeapTupleHeaderIsHotUpdated(tup) \
+ ( \
+ 	((tup)->t_infomask2 & HEAP_HOT_UPDATED) != 0 && \
+ 	((tup)->t_infomask & (HEAP_XMIN_INVALID | HEAP_XMAX_INVALID)) == 0 \
+ )
+ 
+ #define HeapTupleHeaderSetHotUpdated(tup) \
+ ( \
+ 	(tup)->t_infomask2 |= HEAP_HOT_UPDATED \
+ )
+ 
+ #define HeapTupleHeaderClearHotUpdated(tup) \
+ ( \
+ 	(tup)->t_infomask2 &= ~HEAP_HOT_UPDATED \
+ )
+ 
+ #define HeapTupleHeaderIsHeapOnly(tup) \
+ ( \
+   (tup)->t_infomask2 & HEAP_ONLY_TUPLE \
+ )
+ 
+ #define HeapTupleHeaderSetHeapOnly(tup) \
+ ( \
+   (tup)->t_infomask2 |= HEAP_ONLY_TUPLE \
+ )
+ 
+ #define HeapTupleHeaderClearHeapOnly(tup) \
+ ( \
+   (tup)->t_infomask2 &= ~HEAP_ONLY_TUPLE \
+ )
+ 
+ #define HeapTupleHeaderHasMatch(tup) \
+ ( \
+   (tup)->t_infomask2 & HEAP_TUPLE_HAS_MATCH \
+ )
+ 
+ #define HeapTupleHeaderSetMatch(tup) \
+ ( \
+   (tup)->t_infomask2 |= HEAP_TUPLE_HAS_MATCH \
+ )
+ 
+ #define HeapTupleHeaderClearMatch(tup) \
+ ( \
+   (tup)->t_infomask2 &= ~HEAP_TUPLE_HAS_MATCH \
+ )
+ 
+ #define HeapTupleHeaderGetNatts(tup) \
+ 	((tup)->t_infomask2 & HEAP_NATTS_MASK)
+ 
+ #define HeapTupleHeaderSetNatts(tup, natts) \
+ ( \
+ 	(tup)->t_infomask2 = ((tup)->t_infomask2 & ~HEAP_NATTS_MASK) | (natts) \
+ )
+ 
+ 
+ /*
+  * BITMAPLEN(NATTS) -
+  *		Computes size of null bitmap given number of data columns.
+  */
+ #define BITMAPLEN(NATTS)	(((int)(NATTS) + 7) / 8)
+ 
+ /*
+  * MaxHeapTupleSize is the maximum allowed size of a heap tuple, including
+  * header and MAXALIGN alignment padding.  Basically it's BLCKSZ minus the
+  * other stuff that has to be on a disk page.  Since heap pages use no
+  * "special space", there's no deduction for that.
+  *
+  * NOTE: we allow for the ItemId that must point to the tuple, ensuring that
+  * an otherwise-empty page can indeed hold a tuple of this size.  Because
+  * ItemIds and tuples have different alignment requirements, don't assume that
+  * you can, say, fit 2 tuples of size MaxHeapTupleSize/2 on the same page.
+  */
+ #define MaxHeapTupleSize  (BLCKSZ - MAXALIGN(SizeOfPageHeaderData + sizeof(ItemIdData)))
+ 
+ /*
+  * MaxHeapTuplesPerPage is an upper bound on the number of tuples that can
+  * fit on one heap page.  (Note that indexes could have more, because they
+  * use a smaller tuple header.)  We arrive at the divisor because each tuple
+  * must be maxaligned, and it must have an associated item pointer.
+  *
+  * Note: with HOT, there could theoretically be more line pointers (not actual
+  * tuples) than this on a heap page.  However we constrain the number of line
+  * pointers to this anyway, to avoid excessive line-pointer bloat and not
+  * require increases in the size of work arrays.
+  */
+ #define MaxHeapTuplesPerPage	\
+ 	((int) ((BLCKSZ - SizeOfPageHeaderData) / \
+ 			(MAXALIGN(offsetof(HeapTupleHeaderData, t_bits)) + sizeof(ItemIdData))))
+ 
+ /*
+  * MaxAttrSize is a somewhat arbitrary upper limit on the declared size of
+  * data fields of char(n) and similar types.  It need not have anything
+  * directly to do with the *actual* upper limit of varlena values, which
+  * is currently 1Gb (see TOAST structures in postgres.h).  I've set it
+  * at 10Mb which seems like a reasonable number --- tgl 8/6/00.
+  */
+ #define MaxAttrSize		(10 * 1024 * 1024)
+ 
+ 
+ /*
+  * MinimalTuple is an alternative representation that is used for transient
+  * tuples inside the executor, in places where transaction status information
+  * is not required, the tuple rowtype is known, and shaving off a few bytes
+  * is worthwhile because we need to store many tuples.	The representation
+  * is chosen so that tuple access routines can work with either full or
+  * minimal tuples via a HeapTupleData pointer structure.  The access routines
+  * see no difference, except that they must not access the transaction status
+  * or t_ctid fields because those aren't there.
+  *
+  * For the most part, MinimalTuples should be accessed via TupleTableSlot
+  * routines.  These routines will prevent access to the "system columns"
+  * and thereby prevent accidental use of the nonexistent fields.
+  *
+  * MinimalTupleData contains a length word, some padding, and fields matching
+  * HeapTupleHeaderData beginning with t_infomask2. The padding is chosen so
+  * that offsetof(t_infomask2) is the same modulo MAXIMUM_ALIGNOF in both
+  * structs.   This makes data alignment rules equivalent in both cases.
+  *
+  * When a minimal tuple is accessed via a HeapTupleData pointer, t_data is
+  * set to point MINIMAL_TUPLE_OFFSET bytes before the actual start of the
+  * minimal tuple --- that is, where a full tuple matching the minimal tuple's
+  * data would start.  This trick is what makes the structs seem equivalent.
+  *
+  * Note that t_hoff is computed the same as in a full tuple, hence it includes
+  * the MINIMAL_TUPLE_OFFSET distance.  t_len does not include that, however.
+  *
+  * MINIMAL_TUPLE_DATA_OFFSET is the offset to the first useful (non-pad) data
+  * other than the length word.	tuplesort.c and tuplestore.c use this to avoid
+  * writing the padding to disk.
+  */
+ #define MINIMAL_TUPLE_OFFSET \
+ 	((offsetof(HeapTupleHeaderData, t_infomask2) - sizeof(uint32)) / MAXIMUM_ALIGNOF * MAXIMUM_ALIGNOF)
+ #define MINIMAL_TUPLE_PADDING \
+ 	((offsetof(HeapTupleHeaderData, t_infomask2) - sizeof(uint32)) % MAXIMUM_ALIGNOF)
+ #define MINIMAL_TUPLE_DATA_OFFSET \
+ 	offsetof(MinimalTupleData, t_infomask2)
+ 
+ struct MinimalTupleData
+ {
+ 	uint32		t_len;			/* actual length of minimal tuple */
+ 
+ 	char		mt_padding[MINIMAL_TUPLE_PADDING];
+ 
+ 	/* Fields below here must match HeapTupleHeaderData! */
+ 
+ 	uint16		t_infomask2;	/* number of attributes + various flags */
+ 
+ 	uint16		t_infomask;		/* various flag bits, see below */
+ 
+ 	uint8		t_hoff;			/* sizeof header incl. bitmap, padding */
+ 
+ 	/* ^ - 23 bytes - ^ */
+ 
+ 	bits8		t_bits[1];		/* bitmap of NULLs -- VARIABLE LENGTH */
+ 
+ 	/* MORE DATA FOLLOWS AT END OF STRUCT */
+ };
+ /* typedef appears in htup.h */
+ 
+ 
+ /*
+  * GETSTRUCT - given a HeapTuple pointer, return address of the user data
+  */
+ #define GETSTRUCT(TUP) ((char *) ((TUP)->t_data) + (TUP)->t_data->t_hoff)
+ 
+ /*
+  * Accessor macros to be used with HeapTuple pointers.
+  */
+ 
+ #define HeapTupleHasNulls(tuple) \
+ 		(((tuple)->t_data->t_infomask & HEAP_HASNULL) != 0)
+ 
+ #define HeapTupleNoNulls(tuple) \
+ 		(!((tuple)->t_data->t_infomask & HEAP_HASNULL))
+ 
+ #define HeapTupleHasVarWidth(tuple) \
+ 		(((tuple)->t_data->t_infomask & HEAP_HASVARWIDTH) != 0)
+ 
+ #define HeapTupleAllFixed(tuple) \
+ 		(!((tuple)->t_data->t_infomask & HEAP_HASVARWIDTH))
+ 
+ #define HeapTupleHasExternal(tuple) \
+ 		(((tuple)->t_data->t_infomask & HEAP_HASEXTERNAL) != 0)
+ 
+ #define HeapTupleIsHotUpdated(tuple) \
+ 		HeapTupleHeaderIsHotUpdated((tuple)->t_data)
+ 
+ #define HeapTupleSetHotUpdated(tuple) \
+ 		HeapTupleHeaderSetHotUpdated((tuple)->t_data)
+ 
+ #define HeapTupleClearHotUpdated(tuple) \
+ 		HeapTupleHeaderClearHotUpdated((tuple)->t_data)
+ 
+ #define HeapTupleIsHeapOnly(tuple) \
+ 		HeapTupleHeaderIsHeapOnly((tuple)->t_data)
+ 
+ #define HeapTupleSetHeapOnly(tuple) \
+ 		HeapTupleHeaderSetHeapOnly((tuple)->t_data)
+ 
+ #define HeapTupleClearHeapOnly(tuple) \
+ 		HeapTupleHeaderClearHeapOnly((tuple)->t_data)
+ 
+ #define HeapTupleGetOid(tuple) \
+ 		HeapTupleHeaderGetOid((tuple)->t_data)
+ 
+ #define HeapTupleSetOid(tuple, oid) \
+ 		HeapTupleHeaderSetOid((tuple)->t_data, (oid))
+ 
+ 
+ /* ----------------
+  *		fastgetattr
+  *
+  *		Fetch a user attribute's value as a Datum (might be either a
+  *		value, or a pointer into the data area of the tuple).
+  *
+  *		This must not be used when a system attribute might be requested.
+  *		Furthermore, the passed attnum MUST be valid.  Use heap_getattr()
+  *		instead, if in doubt.
+  *
+  *		This gets called many times, so we macro the cacheable and NULL
+  *		lookups, and call nocachegetattr() for the rest.
+  * ----------------
+  */
+ 
+ #if !defined(DISABLE_COMPLEX_MACRO)
+ 
+ #define fastgetattr(tup, attnum, tupleDesc, isnull)					\
+ (																	\
+ 	AssertMacro((attnum) > 0),										\
+ 	(*(isnull) = false),											\
+ 	HeapTupleNoNulls(tup) ?											\
+ 	(																\
+ 		(tupleDesc)->attrs[(attnum)-1]->attcacheoff >= 0 ?			\
+ 		(															\
+ 			fetchatt((tupleDesc)->attrs[(attnum)-1],				\
+ 				(char *) (tup)->t_data + (tup)->t_data->t_hoff +	\
+ 					(tupleDesc)->attrs[(attnum)-1]->attcacheoff)	\
+ 		)															\
+ 		:															\
+ 			nocachegetattr((tup), (attnum), (tupleDesc))			\
+ 	)																\
+ 	:																\
+ 	(																\
+ 		att_isnull((attnum)-1, (tup)->t_data->t_bits) ?				\
+ 		(															\
+ 			(*(isnull) = true),										\
+ 			(Datum)NULL												\
+ 		)															\
+ 		:															\
+ 		(															\
+ 			nocachegetattr((tup), (attnum), (tupleDesc))			\
+ 		)															\
+ 	)																\
+ )
+ #else							/* defined(DISABLE_COMPLEX_MACRO) */
+ 
+ extern Datum fastgetattr(HeapTuple tup, int attnum, TupleDesc tupleDesc,
+ 			bool *isnull);
+ #endif   /* defined(DISABLE_COMPLEX_MACRO) */
+ 
+ 
+ /* ----------------
+  *		heap_getattr
+  *
+  *		Extract an attribute of a heap tuple and return it as a Datum.
+  *		This works for either system or user attributes.  The given attnum
+  *		is properly range-checked.
+  *
+  *		If the field in question has a NULL value, we return a zero Datum
+  *		and set *isnull == true.  Otherwise, we set *isnull == false.
+  *
+  *		<tup> is the pointer to the heap tuple.  <attnum> is the attribute
+  *		number of the column (field) caller wants.	<tupleDesc> is a
+  *		pointer to the structure describing the row and all its fields.
+  * ----------------
+  */
+ #define heap_getattr(tup, attnum, tupleDesc, isnull) \
+ 	( \
+ 		((attnum) > 0) ? \
+ 		( \
+ 			((attnum) > (int) HeapTupleHeaderGetNatts((tup)->t_data)) ? \
+ 			( \
+ 				(*(isnull) = true), \
+ 				(Datum)NULL \
+ 			) \
+ 			: \
+ 				fastgetattr((tup), (attnum), (tupleDesc), (isnull)) \
+ 		) \
+ 		: \
+ 			heap_getsysattr((tup), (attnum), (tupleDesc), (isnull)) \
+ 	)
+ 
+ 
+ #endif   /* TUPHEADER_H */
*** a/src/include/access/tuptoaster.h
--- b/src/include/access/tuptoaster.h
***************
*** 13,19 ****
  #ifndef TUPTOASTER_H
  #define TUPTOASTER_H
  
! #include "access/htup.h"
  #include "utils/relcache.h"
  
  /*
--- 13,19 ----
  #ifndef TUPTOASTER_H
  #define TUPTOASTER_H
  
! #include "access/tupheader.h"
  #include "utils/relcache.h"
  
  /*
*** a/src/include/utils/inval.h
--- b/src/include/utils/inval.h
***************
*** 15,20 ****
--- 15,21 ----
  #define INVAL_H
  
  #include "access/htup.h"
+ #include "storage/relfilenode.h"
  #include "utils/relcache.h"
  
  
*** a/src/pl/plperl/plperl.c
--- b/src/pl/plperl/plperl.c
***************
*** 16,21 ****
--- 16,22 ----
  #include <locale.h>
  
  /* postgreSQL stuff */
+ #include "access/tupheader.h"
  #include "access/xact.h"
  #include "catalog/pg_language.h"
  #include "catalog/pg_proc.h"
*** a/src/pl/plpgsql/src/pl_comp.c
--- b/src/pl/plpgsql/src/pl_comp.c
***************
*** 17,22 ****
--- 17,23 ----
  
  #include <ctype.h>
  
+ #include "access/tupheader.h"
  #include "catalog/namespace.h"
  #include "catalog/pg_proc.h"
  #include "catalog/pg_proc_fn.h"
*** a/src/pl/plpgsql/src/pl_exec.c
--- b/src/pl/plpgsql/src/pl_exec.c
***************
*** 19,24 ****
--- 19,25 ----
  
  #include "access/transam.h"
  #include "access/tupconvert.h"
+ #include "access/tupheader.h"
  #include "catalog/pg_proc.h"
  #include "catalog/pg_type.h"
  #include "executor/spi_priv.h"
*** a/src/pl/plpgsql/src/pl_handler.c
--- b/src/pl/plpgsql/src/pl_handler.c
***************
*** 15,20 ****
--- 15,21 ----
  
  #include "plpgsql.h"
  
+ #include "access/tupheader.h"
  #include "catalog/pg_proc.h"
  #include "catalog/pg_type.h"
  #include "funcapi.h"
*** a/src/pl/plpython/plpy_exec.c
--- b/src/pl/plpython/plpy_exec.c
***************
*** 6,11 ****
--- 6,12 ----
  
  #include "postgres.h"
  
+ #include "access/tupheader.h"
  #include "access/xact.h"
  #include "catalog/pg_type.h"
  #include "commands/trigger.h"
*** a/src/pl/plpython/plpy_main.c
--- b/src/pl/plpython/plpy_main.c
***************
*** 6,11 ****
--- 6,12 ----
  
  #include "postgres.h"
  
+ #include "access/tupheader.h"
  #include "catalog/pg_proc.h"
  #include "catalog/pg_type.h"
  #include "commands/trigger.h"
*** a/src/pl/plpython/plpy_procedure.c
--- b/src/pl/plpython/plpy_procedure.c
***************
*** 7,12 ****
--- 7,13 ----
  #include "postgres.h"
  
  #include "access/transam.h"
+ #include "access/tupheader.h"
  #include "funcapi.h"
  #include "catalog/pg_proc.h"
  #include "catalog/pg_type.h"
*** a/src/pl/plpython/plpy_spi.c
--- b/src/pl/plpython/plpy_spi.c
***************
*** 6,11 ****
--- 6,12 ----
  
  #include "postgres.h"
  
+ #include "access/tupheader.h"
  #include "access/xact.h"
  #include "catalog/pg_type.h"
  #include "executor/spi_priv.h"
*** a/src/pl/plpython/plpy_typeio.c
--- b/src/pl/plpython/plpy_typeio.c
***************
*** 7,12 ****
--- 7,13 ----
  #include "postgres.h"
  
  #include "access/transam.h"
+ #include "access/tupheader.h"
  #include "catalog/pg_type.h"
  #include "funcapi.h"
  #include "mb/pg_wchar.h"
*** a/src/pl/tcl/pltcl.c
--- b/src/pl/tcl/pltcl.c
***************
*** 18,23 ****
--- 18,24 ----
  #define CONST84
  #endif
  
+ #include "access/tupheader.h"
  #include "access/xact.h"
  #include "catalog/pg_proc.h"
  #include "catalog/pg_type.h"
