tupbasics-4.patch
application/octet-stream
Patch
Same data as JSON:
GET /api/v1/attachments/:id/patch
the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes.
API reference →
Format: context
| File | + | − |
|---|---|---|
| contrib/dblink/dblink.c | 3 | 1 |
| contrib/file_fdw/file_fdw.c | 1 | 0 |
| contrib/hstore/hstore_io.c | 1 | 0 |
| contrib/ltree/ltree_op.c | 1 | 0 |
| contrib/pageinspect/heapfuncs.c | 1 | 0 |
| contrib/tcn/tcn.c | 1 | 0 |
| src/backend/access/common/reloptions.c | 1 | 0 |
| src/backend/access/common/tupdesc.c | 1 | 0 |
| src/backend/access/heap/hio.c | 1 | 0 |
| src/backend/access/heap/pruneheap.c | 1 | 0 |
| src/backend/bootstrap/bootstrap.c | 1 | 0 |
| src/backend/catalog/aclchk.c | 1 | 0 |
| src/backend/catalog/dependency.c | 1 | 0 |
| src/backend/catalog/heap.c | 1 | 0 |
| src/backend/catalog/indexing.c | 1 | 0 |
| src/backend/catalog/namespace.c | 1 | 0 |
| src/backend/catalog/objectaddress.c | 1 | 0 |
| src/backend/catalog/pg_aggregate.c | 1 | 0 |
| src/backend/catalog/pg_collation.c | 1 | 0 |
| src/backend/catalog/pg_constraint.c | 1 | 0 |
| src/backend/catalog/pg_conversion.c | 1 | 0 |
| src/backend/catalog/pg_db_role_setting.c | 1 | 0 |
| src/backend/catalog/pg_depend.c | 1 | 0 |
| src/backend/catalog/pg_enum.c | 1 | 0 |
| src/backend/catalog/pg_inherits.c | 1 | 0 |
| src/backend/catalog/pg_largeobject.c | 1 | 0 |
| src/backend/catalog/pg_operator.c | 1 | 0 |
| src/backend/catalog/pg_proc.c | 1 | 0 |
| src/backend/catalog/pg_shdepend.c | 1 | 0 |
| src/backend/catalog/pg_type.c | 1 | 0 |
| src/backend/commands/aggregatecmds.c | 1 | 0 |
| src/backend/commands/alter.c | 1 | 0 |
| src/backend/commands/collationcmds.c | 1 | 0 |
| src/backend/commands/comment.c | 1 | 0 |
| src/backend/commands/conversioncmds.c | 1 | 0 |
| src/backend/commands/copy.c | 1 | 0 |
| src/backend/commands/createas.c | 1 | 0 |
| src/backend/commands/dbcommands.c | 1 | 0 |
| src/backend/commands/dropcmds.c | 1 | 0 |
| src/backend/commands/event_trigger.c | 1 | 0 |
| src/backend/commands/extension.c | 1 | 0 |
| src/backend/commands/foreigncmds.c | 1 | 0 |
| src/backend/commands/functioncmds.c | 1 | 0 |
| src/backend/commands/indexcmds.c | 1 | 0 |
| src/backend/commands/opclasscmds.c | 1 | 0 |
| src/backend/commands/operatorcmds.c | 1 | 0 |
| src/backend/commands/proclang.c | 1 | 0 |
| src/backend/commands/schemacmds.c | 1 | 0 |
| src/backend/commands/seclabel.c | 1 | 0 |
| src/backend/commands/sequence.c | 1 | 0 |
| src/backend/commands/tablespace.c | 1 | 0 |
| src/backend/commands/trigger.c | 1 | 0 |
| src/backend/commands/tsearchcmds.c | 2 | 1 |
| src/backend/commands/typecmds.c | 1 | 0 |
| src/backend/commands/user.c | 1 | 0 |
| src/backend/commands/vacuum.c | 1 | 0 |
| src/backend/commands/vacuumlazy.c | 1 | 0 |
| src/backend/commands/variable.c | 1 | 0 |
| src/backend/executor/execAmi.c | 1 | 0 |
| src/backend/executor/execMain.c | 1 | 0 |
| src/backend/executor/execQual.c | 1 | 0 |
| src/backend/executor/execTuples.c | 1 | 0 |
| src/backend/executor/functions.c | 1 | 0 |
| src/backend/executor/nodeAgg.c | 1 | 0 |
| src/backend/executor/nodeHash.c | 1 | 0 |
| src/backend/executor/nodeHashjoin.c | 1 | 0 |
| src/backend/executor/nodeModifyTable.c | 1 | 0 |
| src/backend/executor/nodeSubplan.c | 1 | 0 |
| src/backend/executor/nodeWindowAgg.c | 1 | 0 |
| src/backend/executor/spi.c | 1 | 0 |
| src/backend/foreign/foreign.c | 1 | 0 |
| src/backend/nodes/tidbitmap.c | 1 | 1 |
| src/backend/optimizer/path/costsize.c | 1 | 0 |
| src/backend/optimizer/plan/planagg.c | 1 | 0 |
| src/backend/optimizer/plan/planner.c | 1 | 0 |
| src/backend/optimizer/plan/subselect.c | 1 | 0 |
| src/backend/optimizer/prep/prepunion.c | 1 | 0 |
| src/backend/optimizer/util/clauses.c | 1 | 0 |
| src/backend/optimizer/util/plancat.c | 1 | 0 |
| src/backend/parser/parse_coerce.c | 1 | 0 |
| src/backend/parser/parse_func.c | 1 | 0 |
| src/backend/parser/parse_node.c | 1 | 0 |
| src/backend/parser/parse_oper.c | 1 | 0 |
| src/backend/parser/parse_relation.c | 1 | 0 |
| src/backend/parser/parse_type.c | 1 | 0 |
| src/backend/parser/parse_utilcmd.c | 1 | 0 |
| src/backend/postmaster/autovacuum.c | 1 | 0 |
| src/backend/postmaster/pgstat.c | 1 | 0 |
| src/backend/rewrite/rewriteDefine.c | 1 | 0 |
| src/backend/rewrite/rewriteRemove.c | 1 | 0 |
| src/backend/rewrite/rewriteSupport.c | 1 | 0 |
| src/backend/storage/freespace/freespace.c | 1 | 1 |
| src/backend/storage/lmgr/predicate.c | 1 | 0 |
| src/backend/storage/page/bufpage.c | 1 | 1 |
| src/backend/tcop/fastpath.c | 1 | 0 |
| src/backend/tcop/utility.c | 1 | 0 |
| src/backend/tsearch/ts_selfuncs.c | 1 | 0 |
| src/backend/utils/adt/acl.c | 1 | 0 |
| src/backend/utils/adt/arrayfuncs.c | 1 | 0 |
| src/backend/utils/adt/array_selfuncs.c | 1 | 0 |
| src/backend/utils/adt/dbsize.c | 1 | 0 |
| src/backend/utils/adt/enum.c | 1 | 0 |
| src/backend/utils/adt/format_type.c | 1 | 0 |
| src/backend/utils/adt/json.c | 1 | 0 |
| src/backend/utils/adt/pg_locale.c | 1 | 0 |
| src/backend/utils/adt/rangetypes_selfuncs.c | 1 | 0 |
| src/backend/utils/adt/regproc.c | 1 | 0 |
| src/backend/utils/adt/ri_triggers.c | 1 | 0 |
| src/backend/utils/adt/rowtypes.c | 1 | 0 |
| src/backend/utils/adt/ruleutils.c | 1 | 0 |
| src/backend/utils/adt/selfuncs.c | 1 | 0 |
| src/backend/utils/adt/trigfuncs.c | 1 | 0 |
| src/backend/utils/adt/varbit.c | 1 | 1 |
| src/backend/utils/adt/xml.c | 1 | 0 |
| src/backend/utils/cache/evtcache.c | 1 | 0 |
| src/backend/utils/cache/inval.c | 1 | 0 |
| src/backend/utils/cache/lsyscache.c | 1 | 0 |
| src/backend/utils/cache/relcache.c | 1 | 0 |
| src/backend/utils/cache/syscache.c | 1 | 0 |
| src/backend/utils/cache/ts_cache.c | 1 | 0 |
| src/backend/utils/cache/typcache.c | 1 | 0 |
| src/backend/utils/fmgr/funcapi.c | 1 | 0 |
| src/backend/utils/init/miscinit.c | 1 | 0 |
| src/backend/utils/init/postinit.c | 1 | 0 |
| src/backend/utils/misc/superuser.c | 1 | 0 |
| src/backend/utils/sort/tuplesort.c | 1 | 0 |
| src/backend/utils/sort/tuplestore.c | 1 | 0 |
| src/backend/utils/time/combocid.c | 1 | 1 |
| src/backend/utils/time/tqual.c | 1 | 0 |
| src/include/access/heapam.h | 1 | 0 |
| src/include/access/heapam_xlog.h | 1 | 0 |
| src/include/access/htup.h | 3 | 457 |
| src/include/access/relscan.h | 1 | 0 |
| src/include/access/tupheader.h | 614 | 0 |
| src/include/access/tuptoaster.h | 1 | 1 |
| src/include/utils/inval.h | 1 | 0 |
| src/pl/plperl/plperl.c | 1 | 0 |
| src/pl/plpgsql/src/pl_comp.c | 1 | 0 |
| src/pl/plpgsql/src/pl_exec.c | 1 | 0 |
| src/pl/plpgsql/src/pl_handler.c | 1 | 0 |
| src/pl/plpython/plpy_exec.c | 1 | 0 |
| src/pl/plpython/plpy_main.c | 1 | 0 |
| src/pl/plpython/plpy_procedure.c | 1 | 0 |
| src/pl/plpython/plpy_spi.c | 1 | 0 |
| src/pl/plpython/plpy_typeio.c | 1 | 0 |
| src/pl/tcl/pltcl.c | 1 | 0 |
*** 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"