From c219d9b0a55bcdf81b00da6bad24ac2bf3e53d20 Mon Sep 17 00:00:00 2001 From: Alvaro Herrera Date: Thu, 30 Aug 2012 16:15:44 -0400 Subject: [PATCH] Split tuple struct defs from htup.h to htup_details.h This reduces unnecessary exposure of other headers through htup.h, which is very widely included by many files. I have chosen to move the function prototypes to the new file as well, because that means htup.h no longer needs to include tupdesc.h. In itself this doesn't have much effect in indirect inclusion of tupdesc.h throughout the tree, because it's also required by execnodes.h; but it's something to explore in the future, and it seemed best to do the htup.h change now while I'm busy with it. --- contrib/dblink/dblink.c | 4 +- contrib/file_fdw/file_fdw.c | 1 + contrib/hstore/hstore_io.c | 1 + contrib/hstore/hstore_op.c | 1 + contrib/ltree/ltree_op.c | 1 + contrib/pageinspect/heapfuncs.c | 1 + contrib/pageinspect/rawpage.c | 1 + contrib/pg_buffercache/pg_buffercache_pages.c | 1 + contrib/tablefunc/tablefunc.c | 1 + contrib/tcn/tcn.c | 1 + contrib/xml2/xpath.c | 1 + src/backend/access/common/reloptions.c | 1 + src/backend/access/common/tupconvert.c | 1 + src/backend/access/common/tupdesc.c | 1 + src/backend/access/heap/hio.c | 1 + src/backend/access/heap/pruneheap.c | 1 + src/backend/access/transam/twophase.c | 2 +- src/backend/access/transam/xlogfuncs.c | 1 + src/backend/bootstrap/bootstrap.c | 1 + src/backend/catalog/aclchk.c | 1 + src/backend/catalog/dependency.c | 1 + src/backend/catalog/heap.c | 1 + src/backend/catalog/indexing.c | 1 + src/backend/catalog/namespace.c | 1 + src/backend/catalog/objectaddress.c | 1 + src/backend/catalog/pg_aggregate.c | 1 + src/backend/catalog/pg_collation.c | 1 + src/backend/catalog/pg_constraint.c | 1 + src/backend/catalog/pg_conversion.c | 1 + src/backend/catalog/pg_db_role_setting.c | 1 + src/backend/catalog/pg_depend.c | 1 + src/backend/catalog/pg_enum.c | 1 + src/backend/catalog/pg_inherits.c | 1 + src/backend/catalog/pg_largeobject.c | 1 + src/backend/catalog/pg_namespace.c | 1 + src/backend/catalog/pg_operator.c | 1 + src/backend/catalog/pg_proc.c | 1 + src/backend/catalog/pg_range.c | 1 + src/backend/catalog/pg_shdepend.c | 1 + src/backend/catalog/pg_type.c | 1 + src/backend/commands/aggregatecmds.c | 1 + src/backend/commands/alter.c | 1 + src/backend/commands/collationcmds.c | 1 + src/backend/commands/comment.c | 1 + src/backend/commands/conversioncmds.c | 1 + src/backend/commands/copy.c | 1 + src/backend/commands/createas.c | 1 + src/backend/commands/dbcommands.c | 1 + src/backend/commands/dropcmds.c | 1 + src/backend/commands/event_trigger.c | 1 + src/backend/commands/extension.c | 1 + src/backend/commands/foreigncmds.c | 1 + src/backend/commands/functioncmds.c | 1 + src/backend/commands/indexcmds.c | 1 + src/backend/commands/opclasscmds.c | 1 + src/backend/commands/operatorcmds.c | 1 + src/backend/commands/proclang.c | 1 + src/backend/commands/schemacmds.c | 1 + src/backend/commands/seclabel.c | 1 + src/backend/commands/sequence.c | 1 + src/backend/commands/tablespace.c | 1 + src/backend/commands/trigger.c | 1 + src/backend/commands/tsearchcmds.c | 3 +- src/backend/commands/typecmds.c | 1 + src/backend/commands/user.c | 1 + src/backend/commands/vacuum.c | 1 + src/backend/commands/vacuumlazy.c | 1 + src/backend/commands/variable.c | 1 + src/backend/executor/execAmi.c | 1 + src/backend/executor/execMain.c | 1 + src/backend/executor/execQual.c | 1 + src/backend/executor/execTuples.c | 1 + src/backend/executor/functions.c | 1 + src/backend/executor/nodeAgg.c | 1 + src/backend/executor/nodeHash.c | 1 + src/backend/executor/nodeHashjoin.c | 1 + src/backend/executor/nodeLockRows.c | 1 + src/backend/executor/nodeModifyTable.c | 1 + src/backend/executor/nodeSetOp.c | 1 + src/backend/executor/nodeSubplan.c | 1 + src/backend/executor/nodeWindowAgg.c | 1 + src/backend/executor/spi.c | 1 + src/backend/foreign/foreign.c | 1 + src/backend/nodes/tidbitmap.c | 2 +- src/backend/optimizer/path/costsize.c | 1 + src/backend/optimizer/plan/planagg.c | 1 + src/backend/optimizer/plan/planner.c | 1 + src/backend/optimizer/plan/subselect.c | 1 + src/backend/optimizer/prep/prepunion.c | 1 + src/backend/optimizer/util/clauses.c | 1 + src/backend/optimizer/util/plancat.c | 1 + src/backend/parser/parse_coerce.c | 1 + src/backend/parser/parse_func.c | 1 + src/backend/parser/parse_node.c | 1 + src/backend/parser/parse_oper.c | 1 + src/backend/parser/parse_relation.c | 1 + src/backend/parser/parse_type.c | 1 + src/backend/parser/parse_utilcmd.c | 1 + src/backend/postmaster/autovacuum.c | 1 + src/backend/postmaster/pgstat.c | 1 + src/backend/rewrite/rewriteDefine.c | 1 + src/backend/rewrite/rewriteRemove.c | 1 + src/backend/rewrite/rewriteSupport.c | 1 + src/backend/storage/freespace/freespace.c | 2 +- src/backend/storage/lmgr/predicate.c | 1 + src/backend/storage/page/bufpage.c | 2 +- src/backend/tcop/fastpath.c | 1 + src/backend/tcop/utility.c | 1 + src/backend/tsearch/ts_selfuncs.c | 1 + src/backend/utils/adt/acl.c | 1 + src/backend/utils/adt/array_selfuncs.c | 1 + src/backend/utils/adt/arrayfuncs.c | 1 + src/backend/utils/adt/datetime.c | 1 + src/backend/utils/adt/dbsize.c | 1 + src/backend/utils/adt/enum.c | 1 + src/backend/utils/adt/format_type.c | 1 + src/backend/utils/adt/genfile.c | 1 + src/backend/utils/adt/json.c | 1 + src/backend/utils/adt/lockfuncs.c | 1 + src/backend/utils/adt/pg_locale.c | 1 + src/backend/utils/adt/pgstatfuncs.c | 1 + src/backend/utils/adt/rangetypes_selfuncs.c | 1 + src/backend/utils/adt/regproc.c | 1 + src/backend/utils/adt/ri_triggers.c | 3 +- src/backend/utils/adt/rowtypes.c | 1 + src/backend/utils/adt/ruleutils.c | 1 + src/backend/utils/adt/selfuncs.c | 1 + src/backend/utils/adt/trigfuncs.c | 1 + src/backend/utils/adt/varbit.c | 2 +- src/backend/utils/adt/xml.c | 1 + src/backend/utils/cache/evtcache.c | 1 + src/backend/utils/cache/inval.c | 1 + src/backend/utils/cache/lsyscache.c | 1 + src/backend/utils/cache/relcache.c | 1 + src/backend/utils/cache/syscache.c | 1 + src/backend/utils/cache/ts_cache.c | 1 + src/backend/utils/cache/typcache.c | 1 + src/backend/utils/fmgr/funcapi.c | 1 + src/backend/utils/init/miscinit.c | 1 + src/backend/utils/init/postinit.c | 1 + src/backend/utils/misc/superuser.c | 1 + src/backend/utils/sort/tuplesort.c | 1 + src/backend/utils/sort/tuplestore.c | 1 + src/backend/utils/time/combocid.c | 2 +- src/backend/utils/time/tqual.c | 1 + src/include/access/heapam.h | 1 + src/include/access/heapam_xlog.h | 1 + src/include/access/htup.h | 632 +---------------- src/include/access/htup_details.h | 657 ++++++++++++++++++ src/include/access/reloptions.h | 1 + src/include/access/relscan.h | 1 + src/include/access/tupconvert.h | 1 + src/include/access/tuptoaster.h | 2 +- src/include/executor/tuptable.h | 1 + src/include/utils/inval.h | 1 + src/include/utils/lsyscache.h | 2 + src/pl/plperl/plperl.c | 1 + src/pl/plpgsql/src/pl_comp.c | 1 + src/pl/plpgsql/src/pl_exec.c | 1 + src/pl/plpgsql/src/pl_handler.c | 1 + src/pl/plpython/plpy_exec.c | 1 + src/pl/plpython/plpy_main.c | 1 + src/pl/plpython/plpy_procedure.c | 1 + src/pl/plpython/plpy_spi.c | 1 + src/pl/plpython/plpy_typeio.c | 1 + src/pl/plpython/plpy_typeio.h | 1 + src/pl/tcl/pltcl.c | 1 + 167 files changed, 830 insertions(+), 639 deletions(-) create mode 100644 src/include/access/htup_details.h diff --git a/contrib/dblink/dblink.c b/contrib/dblink/dblink.c index 9dd0fc547b..9f1dac899e 100644 --- a/contrib/dblink/dblink.c +++ b/contrib/dblink/dblink.c @@ -35,12 +35,14 @@ #include #include "libpq-fe.h" -#include "funcapi.h" + +#include "access/htup_details.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" diff --git a/contrib/file_fdw/file_fdw.c b/contrib/file_fdw/file_fdw.c index 7c7fedfcdb..81fc4e2900 100644 --- a/contrib/file_fdw/file_fdw.c +++ b/contrib/file_fdw/file_fdw.c @@ -15,6 +15,7 @@ #include #include +#include "access/htup_details.h" #include "access/reloptions.h" #include "access/sysattr.h" #include "catalog/pg_foreign_table.h" diff --git a/contrib/hstore/hstore_io.c b/contrib/hstore/hstore_io.c index 7bdac3d94c..e84cdd6905 100644 --- a/contrib/hstore/hstore_io.c +++ b/contrib/hstore/hstore_io.c @@ -5,6 +5,7 @@ #include +#include "access/htup_details.h" #include "catalog/pg_type.h" #include "funcapi.h" #include "libpq/pqformat.h" diff --git a/contrib/hstore/hstore_op.c b/contrib/hstore/hstore_op.c index fee2c3c5ae..45edb048ce 100644 --- a/contrib/hstore/hstore_op.c +++ b/contrib/hstore/hstore_op.c @@ -4,6 +4,7 @@ #include "postgres.h" #include "access/hash.h" +#include "access/htup_details.h" #include "catalog/pg_type.h" #include "funcapi.h" #include "utils/builtins.h" diff --git a/contrib/ltree/ltree_op.c b/contrib/ltree/ltree_op.c index 4d8fb842c1..25b6db1b1a 100644 --- a/contrib/ltree/ltree_op.c +++ b/contrib/ltree/ltree_op.c @@ -7,6 +7,7 @@ #include +#include "access/htup_details.h" #include "catalog/pg_statistic.h" #include "utils/builtins.h" #include "utils/lsyscache.h" diff --git a/contrib/pageinspect/heapfuncs.c b/contrib/pageinspect/heapfuncs.c index 260ccffdc7..6f3af77674 100644 --- a/contrib/pageinspect/heapfuncs.c +++ b/contrib/pageinspect/heapfuncs.c @@ -25,6 +25,7 @@ #include "postgres.h" +#include "access/htup_details.h" #include "funcapi.h" #include "utils/builtins.h" #include "miscadmin.h" diff --git a/contrib/pageinspect/rawpage.c b/contrib/pageinspect/rawpage.c index e8a79401ad..52eb55267b 100644 --- a/contrib/pageinspect/rawpage.c +++ b/contrib/pageinspect/rawpage.c @@ -15,6 +15,7 @@ #include "postgres.h" +#include "access/htup_details.h" #include "catalog/catalog.h" #include "catalog/namespace.h" #include "funcapi.h" diff --git a/contrib/pg_buffercache/pg_buffercache_pages.c b/contrib/pg_buffercache/pg_buffercache_pages.c index 27e52b3b35..dbf8030f7c 100644 --- a/contrib/pg_buffercache/pg_buffercache_pages.c +++ b/contrib/pg_buffercache/pg_buffercache_pages.c @@ -8,6 +8,7 @@ */ #include "postgres.h" +#include "access/htup_details.h" #include "catalog/pg_type.h" #include "funcapi.h" #include "storage/buf_internals.h" diff --git a/contrib/tablefunc/tablefunc.c b/contrib/tablefunc/tablefunc.c index 963a88fa10..8be7ad4619 100644 --- a/contrib/tablefunc/tablefunc.c +++ b/contrib/tablefunc/tablefunc.c @@ -34,6 +34,7 @@ #include +#include "access/htup_details.h" #include "catalog/pg_type.h" #include "executor/spi.h" #include "funcapi.h" diff --git a/contrib/tcn/tcn.c b/contrib/tcn/tcn.c index 314632dd89..6a8a96f603 100644 --- a/contrib/tcn/tcn.c +++ b/contrib/tcn/tcn.c @@ -15,6 +15,7 @@ #include "postgres.h" +#include "access/htup_details.h" #include "executor/spi.h" #include "commands/async.h" #include "commands/trigger.h" diff --git a/contrib/xml2/xpath.c b/contrib/xml2/xpath.c index 660d25c349..41cb98d139 100644 --- a/contrib/xml2/xpath.c +++ b/contrib/xml2/xpath.c @@ -6,6 +6,7 @@ */ #include "postgres.h" +#include "access/htup_details.h" #include "executor/spi.h" #include "fmgr.h" #include "funcapi.h" diff --git a/src/backend/access/common/reloptions.c b/src/backend/access/common/reloptions.c index 1eeaadecff..bc6911e496 100644 --- a/src/backend/access/common/reloptions.c +++ b/src/backend/access/common/reloptions.c @@ -17,6 +17,7 @@ #include "access/gist_private.h" #include "access/hash.h" +#include "access/htup_details.h" #include "access/nbtree.h" #include "access/reloptions.h" #include "access/spgist.h" diff --git a/src/backend/access/common/tupconvert.c b/src/backend/access/common/tupconvert.c index f5a43d47b8..f813432c7d 100644 --- a/src/backend/access/common/tupconvert.c +++ b/src/backend/access/common/tupconvert.c @@ -20,6 +20,7 @@ */ #include "postgres.h" +#include "access/htup_details.h" #include "access/tupconvert.h" #include "utils/builtins.h" diff --git a/src/backend/access/common/tupdesc.c b/src/backend/access/common/tupdesc.c index 99d0d1802c..2f10910b82 100644 --- a/src/backend/access/common/tupdesc.c +++ b/src/backend/access/common/tupdesc.c @@ -19,6 +19,7 @@ #include "postgres.h" +#include "access/htup_details.h" #include "catalog/pg_type.h" #include "miscadmin.h" #include "parser/parse_type.h" diff --git a/src/backend/access/heap/hio.c b/src/backend/access/heap/hio.c index 19a34923c7..c08047e02b 100644 --- a/src/backend/access/heap/hio.c +++ b/src/backend/access/heap/hio.c @@ -17,6 +17,7 @@ #include "access/heapam.h" #include "access/hio.h" +#include "access/htup_details.h" #include "access/visibilitymap.h" #include "storage/bufmgr.h" #include "storage/freespace.h" diff --git a/src/backend/access/heap/pruneheap.c b/src/backend/access/heap/pruneheap.c index e0209c9aea..97a2868f19 100644 --- a/src/backend/access/heap/pruneheap.c +++ b/src/backend/access/heap/pruneheap.c @@ -17,6 +17,7 @@ #include "access/heapam.h" #include "access/heapam_xlog.h" #include "access/transam.h" +#include "access/htup_details.h" #include "miscadmin.h" #include "pgstat.h" #include "storage/bufmgr.h" diff --git a/src/backend/access/transam/twophase.c b/src/backend/access/transam/twophase.c index 2a60c62dd4..29a2ee6d39 100644 --- a/src/backend/access/transam/twophase.c +++ b/src/backend/access/transam/twophase.c @@ -41,7 +41,7 @@ #include #include -#include "access/htup.h" +#include "access/htup_details.h" #include "access/subtrans.h" #include "access/transam.h" #include "access/twophase.h" diff --git a/src/backend/access/transam/xlogfuncs.c b/src/backend/access/transam/xlogfuncs.c index 6a446e9688..d345761598 100644 --- a/src/backend/access/transam/xlogfuncs.c +++ b/src/backend/access/transam/xlogfuncs.c @@ -16,6 +16,7 @@ */ #include "postgres.h" +#include "access/htup_details.h" #include "access/xlog.h" #include "access/xlog_internal.h" #include "access/xlogutils.h" diff --git a/src/backend/bootstrap/bootstrap.c b/src/backend/bootstrap/bootstrap.c index b7428829f3..34ddebbc0b 100644 --- a/src/backend/bootstrap/bootstrap.c +++ b/src/backend/bootstrap/bootstrap.c @@ -21,6 +21,7 @@ #include #endif +#include "access/htup_details.h" #include "bootstrap/bootstrap.h" #include "catalog/index.h" #include "catalog/pg_collation.h" diff --git a/src/backend/catalog/aclchk.c b/src/backend/catalog/aclchk.c index b097813a06..4e4c7af4c4 100644 --- a/src/backend/catalog/aclchk.c +++ b/src/backend/catalog/aclchk.c @@ -19,6 +19,7 @@ #include "access/genam.h" #include "access/heapam.h" +#include "access/htup_details.h" #include "access/sysattr.h" #include "access/xact.h" #include "catalog/catalog.h" diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c index 7d07c56cd0..87d6f02421 100644 --- a/src/backend/catalog/dependency.c +++ b/src/backend/catalog/dependency.c @@ -14,6 +14,7 @@ */ #include "postgres.h" +#include "access/htup_details.h" #include "access/sysattr.h" #include "access/xact.h" #include "catalog/dependency.h" diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c index a08830121f..c80df418fa 100644 --- a/src/backend/catalog/heap.c +++ b/src/backend/catalog/heap.c @@ -29,6 +29,7 @@ */ #include "postgres.h" +#include "access/htup_details.h" #include "access/sysattr.h" #include "access/transam.h" #include "access/xact.h" diff --git a/src/backend/catalog/indexing.c b/src/backend/catalog/indexing.c index ee049857a2..ce367ac308 100644 --- a/src/backend/catalog/indexing.c +++ b/src/backend/catalog/indexing.c @@ -15,6 +15,7 @@ */ #include "postgres.h" +#include "access/htup_details.h" #include "catalog/index.h" #include "catalog/indexing.h" #include "executor/executor.h" diff --git a/src/backend/catalog/namespace.c b/src/backend/catalog/namespace.c index 10ad82b79e..b559f5533b 100644 --- a/src/backend/catalog/namespace.c +++ b/src/backend/catalog/namespace.c @@ -19,6 +19,7 @@ */ #include "postgres.h" +#include "access/htup_details.h" #include "access/xact.h" #include "catalog/dependency.h" #include "catalog/pg_authid.h" diff --git a/src/backend/catalog/objectaddress.c b/src/backend/catalog/objectaddress.c index 5b8140b0ae..c1e5e1db77 100644 --- a/src/backend/catalog/objectaddress.c +++ b/src/backend/catalog/objectaddress.c @@ -15,6 +15,7 @@ #include "postgres.h" +#include "access/htup_details.h" #include "access/sysattr.h" #include "catalog/catalog.h" #include "catalog/indexing.h" diff --git a/src/backend/catalog/pg_aggregate.c b/src/backend/catalog/pg_aggregate.c index 403c6f03a6..2e12c5a3d5 100644 --- a/src/backend/catalog/pg_aggregate.c +++ b/src/backend/catalog/pg_aggregate.c @@ -15,6 +15,7 @@ #include "postgres.h" #include "access/heapam.h" +#include "access/htup_details.h" #include "catalog/dependency.h" #include "catalog/indexing.h" #include "catalog/pg_aggregate.h" diff --git a/src/backend/catalog/pg_collation.c b/src/backend/catalog/pg_collation.c index 18c7acf0e8..6020d16c74 100644 --- a/src/backend/catalog/pg_collation.c +++ b/src/backend/catalog/pg_collation.c @@ -16,6 +16,7 @@ #include "access/genam.h" #include "access/heapam.h" +#include "access/htup_details.h" #include "access/sysattr.h" #include "catalog/dependency.h" #include "catalog/indexing.h" diff --git a/src/backend/catalog/pg_constraint.c b/src/backend/catalog/pg_constraint.c index 224859d76e..8df3f18e30 100644 --- a/src/backend/catalog/pg_constraint.c +++ b/src/backend/catalog/pg_constraint.c @@ -16,6 +16,7 @@ #include "access/genam.h" #include "access/heapam.h" +#include "access/htup_details.h" #include "catalog/dependency.h" #include "catalog/indexing.h" #include "catalog/objectaccess.h" diff --git a/src/backend/catalog/pg_conversion.c b/src/backend/catalog/pg_conversion.c index 358bd39bb0..68f1aa76e2 100644 --- a/src/backend/catalog/pg_conversion.c +++ b/src/backend/catalog/pg_conversion.c @@ -15,6 +15,7 @@ #include "postgres.h" #include "access/heapam.h" +#include "access/htup_details.h" #include "access/sysattr.h" #include "catalog/dependency.h" #include "catalog/indexing.h" diff --git a/src/backend/catalog/pg_db_role_setting.c b/src/backend/catalog/pg_db_role_setting.c index d865b6875d..616980ce89 100644 --- a/src/backend/catalog/pg_db_role_setting.c +++ b/src/backend/catalog/pg_db_role_setting.c @@ -12,6 +12,7 @@ #include "access/genam.h" #include "access/heapam.h" +#include "access/htup_details.h" #include "catalog/indexing.h" #include "catalog/pg_db_role_setting.h" #include "utils/fmgroids.h" diff --git a/src/backend/catalog/pg_depend.c b/src/backend/catalog/pg_depend.c index 8e58435606..9a5931692f 100644 --- a/src/backend/catalog/pg_depend.c +++ b/src/backend/catalog/pg_depend.c @@ -16,6 +16,7 @@ #include "access/genam.h" #include "access/heapam.h" +#include "access/htup_details.h" #include "catalog/dependency.h" #include "catalog/indexing.h" #include "catalog/pg_constraint.h" diff --git a/src/backend/catalog/pg_enum.c b/src/backend/catalog/pg_enum.c index 20e26c47ca..8ddb376bc1 100644 --- a/src/backend/catalog/pg_enum.c +++ b/src/backend/catalog/pg_enum.c @@ -15,6 +15,7 @@ #include "access/genam.h" #include "access/heapam.h" +#include "access/htup_details.h" #include "access/xact.h" #include "catalog/catalog.h" #include "catalog/indexing.h" diff --git a/src/backend/catalog/pg_inherits.c b/src/backend/catalog/pg_inherits.c index 146c845c94..d34fed85f8 100644 --- a/src/backend/catalog/pg_inherits.c +++ b/src/backend/catalog/pg_inherits.c @@ -21,6 +21,7 @@ #include "access/genam.h" #include "access/heapam.h" +#include "access/htup_details.h" #include "catalog/indexing.h" #include "catalog/pg_inherits.h" #include "catalog/pg_inherits_fn.h" diff --git a/src/backend/catalog/pg_largeobject.c b/src/backend/catalog/pg_largeobject.c index 1e5de6acad..3322034140 100644 --- a/src/backend/catalog/pg_largeobject.c +++ b/src/backend/catalog/pg_largeobject.c @@ -16,6 +16,7 @@ #include "access/genam.h" #include "access/heapam.h" +#include "access/htup_details.h" #include "access/sysattr.h" #include "catalog/dependency.h" #include "catalog/indexing.h" diff --git a/src/backend/catalog/pg_namespace.c b/src/backend/catalog/pg_namespace.c index de856760f0..098df224a8 100644 --- a/src/backend/catalog/pg_namespace.c +++ b/src/backend/catalog/pg_namespace.c @@ -15,6 +15,7 @@ #include "postgres.h" #include "access/heapam.h" +#include "access/htup_details.h" #include "catalog/dependency.h" #include "catalog/indexing.h" #include "catalog/objectaccess.h" diff --git a/src/backend/catalog/pg_operator.c b/src/backend/catalog/pg_operator.c index 4fd55ae570..88af345fab 100644 --- a/src/backend/catalog/pg_operator.c +++ b/src/backend/catalog/pg_operator.c @@ -18,6 +18,7 @@ #include "postgres.h" #include "access/heapam.h" +#include "access/htup_details.h" #include "access/xact.h" #include "catalog/dependency.h" #include "catalog/indexing.h" diff --git a/src/backend/catalog/pg_proc.c b/src/backend/catalog/pg_proc.c index ac53b09af6..ba73264c60 100644 --- a/src/backend/catalog/pg_proc.c +++ b/src/backend/catalog/pg_proc.c @@ -14,6 +14,7 @@ */ #include "postgres.h" +#include "access/htup_details.h" #include "access/xact.h" #include "catalog/dependency.h" #include "catalog/indexing.h" diff --git a/src/backend/catalog/pg_range.c b/src/backend/catalog/pg_range.c index 7e52d0d017..a24df23fbf 100644 --- a/src/backend/catalog/pg_range.c +++ b/src/backend/catalog/pg_range.c @@ -16,6 +16,7 @@ #include "access/genam.h" #include "access/heapam.h" +#include "access/htup_details.h" #include "catalog/dependency.h" #include "catalog/indexing.h" #include "catalog/pg_collation.h" diff --git a/src/backend/catalog/pg_shdepend.c b/src/backend/catalog/pg_shdepend.c index 23111eccc5..5a73b48ea7 100644 --- a/src/backend/catalog/pg_shdepend.c +++ b/src/backend/catalog/pg_shdepend.c @@ -16,6 +16,7 @@ #include "access/genam.h" #include "access/heapam.h" +#include "access/htup_details.h" #include "access/xact.h" #include "catalog/catalog.h" #include "catalog/dependency.h" diff --git a/src/backend/catalog/pg_type.c b/src/backend/catalog/pg_type.c index 6062926e60..49133eee8c 100644 --- a/src/backend/catalog/pg_type.c +++ b/src/backend/catalog/pg_type.c @@ -15,6 +15,7 @@ #include "postgres.h" #include "access/heapam.h" +#include "access/htup_details.h" #include "access/xact.h" #include "catalog/dependency.h" #include "catalog/indexing.h" diff --git a/src/backend/commands/aggregatecmds.c b/src/backend/commands/aggregatecmds.c index c0dcdf7ac5..57adfe8a9a 100644 --- a/src/backend/commands/aggregatecmds.c +++ b/src/backend/commands/aggregatecmds.c @@ -23,6 +23,7 @@ #include "postgres.h" #include "access/heapam.h" +#include "access/htup_details.h" #include "catalog/dependency.h" #include "catalog/indexing.h" #include "catalog/pg_aggregate.h" diff --git a/src/backend/commands/alter.c b/src/backend/commands/alter.c index 19f989549c..e5b813d19a 100644 --- a/src/backend/commands/alter.c +++ b/src/backend/commands/alter.c @@ -14,6 +14,7 @@ */ #include "postgres.h" +#include "access/htup_details.h" #include "catalog/dependency.h" #include "catalog/indexing.h" #include "catalog/namespace.h" diff --git a/src/backend/commands/collationcmds.c b/src/backend/commands/collationcmds.c index e574288c2c..ad7528828b 100644 --- a/src/backend/commands/collationcmds.c +++ b/src/backend/commands/collationcmds.c @@ -15,6 +15,7 @@ #include "postgres.h" #include "access/heapam.h" +#include "access/htup_details.h" #include "access/xact.h" #include "catalog/dependency.h" #include "catalog/indexing.h" diff --git a/src/backend/commands/comment.c b/src/backend/commands/comment.c index 7ea367571e..267694f5b9 100644 --- a/src/backend/commands/comment.c +++ b/src/backend/commands/comment.c @@ -16,6 +16,7 @@ #include "access/genam.h" #include "access/heapam.h" +#include "access/htup_details.h" #include "catalog/indexing.h" #include "catalog/objectaddress.h" #include "catalog/pg_description.h" diff --git a/src/backend/commands/conversioncmds.c b/src/backend/commands/conversioncmds.c index aad7e46261..e36c91ade1 100644 --- a/src/backend/commands/conversioncmds.c +++ b/src/backend/commands/conversioncmds.c @@ -15,6 +15,7 @@ #include "postgres.h" #include "access/heapam.h" +#include "access/htup_details.h" #include "catalog/dependency.h" #include "catalog/indexing.h" #include "catalog/pg_conversion.h" diff --git a/src/backend/commands/copy.c b/src/backend/commands/copy.c index e8a125b1a5..0567ab003d 100644 --- a/src/backend/commands/copy.c +++ b/src/backend/commands/copy.c @@ -21,6 +21,7 @@ #include #include "access/heapam.h" +#include "access/htup_details.h" #include "access/sysattr.h" #include "access/xact.h" #include "catalog/namespace.h" diff --git a/src/backend/commands/createas.c b/src/backend/commands/createas.c index dc0665e2a4..07ee6b3091 100644 --- a/src/backend/commands/createas.c +++ b/src/backend/commands/createas.c @@ -22,6 +22,7 @@ #include "postgres.h" #include "access/reloptions.h" +#include "access/htup_details.h" #include "access/sysattr.h" #include "access/xact.h" #include "catalog/toasting.h" diff --git a/src/backend/commands/dbcommands.c b/src/backend/commands/dbcommands.c index 2192573173..cdbce97c4f 100644 --- a/src/backend/commands/dbcommands.c +++ b/src/backend/commands/dbcommands.c @@ -26,6 +26,7 @@ #include "access/genam.h" #include "access/heapam.h" +#include "access/htup_details.h" #include "access/xact.h" #include "access/xlogutils.h" #include "catalog/catalog.h" diff --git a/src/backend/commands/dropcmds.c b/src/backend/commands/dropcmds.c index 8f5d7e0ed2..1a569d91ec 100644 --- a/src/backend/commands/dropcmds.c +++ b/src/backend/commands/dropcmds.c @@ -16,6 +16,7 @@ #include "postgres.h" #include "access/heapam.h" +#include "access/htup_details.h" #include "catalog/dependency.h" #include "catalog/namespace.h" #include "catalog/objectaddress.h" diff --git a/src/backend/commands/event_trigger.c b/src/backend/commands/event_trigger.c index d725360b86..cb4e658a58 100644 --- a/src/backend/commands/event_trigger.c +++ b/src/backend/commands/event_trigger.c @@ -13,6 +13,7 @@ */ #include "postgres.h" +#include "access/htup_details.h" #include "access/xact.h" #include "catalog/dependency.h" #include "catalog/indexing.h" diff --git a/src/backend/commands/extension.c b/src/backend/commands/extension.c index 0901601fb7..ec8aa17892 100644 --- a/src/backend/commands/extension.c +++ b/src/backend/commands/extension.c @@ -27,6 +27,7 @@ #include #include +#include "access/htup_details.h" #include "access/sysattr.h" #include "access/xact.h" #include "catalog/dependency.h" diff --git a/src/backend/commands/foreigncmds.c b/src/backend/commands/foreigncmds.c index 342ecc2931..f10cb5252d 100644 --- a/src/backend/commands/foreigncmds.c +++ b/src/backend/commands/foreigncmds.c @@ -14,6 +14,7 @@ #include "postgres.h" #include "access/heapam.h" +#include "access/htup_details.h" #include "access/xact.h" #include "access/reloptions.h" #include "catalog/dependency.h" diff --git a/src/backend/commands/functioncmds.c b/src/backend/commands/functioncmds.c index dcadb3dc84..bf040730fa 100644 --- a/src/backend/commands/functioncmds.c +++ b/src/backend/commands/functioncmds.c @@ -34,6 +34,7 @@ #include "access/genam.h" #include "access/heapam.h" +#include "access/htup_details.h" #include "access/sysattr.h" #include "catalog/dependency.h" #include "catalog/indexing.h" diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index f677268609..a58101ec6e 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -15,6 +15,7 @@ #include "postgres.h" +#include "access/htup_details.h" #include "access/reloptions.h" #include "access/xact.h" #include "catalog/catalog.h" diff --git a/src/backend/commands/opclasscmds.c b/src/backend/commands/opclasscmds.c index f5642447f1..7cf4db0511 100644 --- a/src/backend/commands/opclasscmds.c +++ b/src/backend/commands/opclasscmds.c @@ -20,6 +20,7 @@ #include "access/genam.h" #include "access/heapam.h" #include "access/nbtree.h" +#include "access/htup_details.h" #include "access/sysattr.h" #include "catalog/dependency.h" #include "catalog/indexing.h" diff --git a/src/backend/commands/operatorcmds.c b/src/backend/commands/operatorcmds.c index 410c708975..e0ac0e113b 100644 --- a/src/backend/commands/operatorcmds.c +++ b/src/backend/commands/operatorcmds.c @@ -35,6 +35,7 @@ #include "postgres.h" #include "access/heapam.h" +#include "access/htup_details.h" #include "catalog/dependency.h" #include "catalog/indexing.h" #include "catalog/pg_operator.h" diff --git a/src/backend/commands/proclang.c b/src/backend/commands/proclang.c index 354389c617..31139bdcb9 100644 --- a/src/backend/commands/proclang.c +++ b/src/backend/commands/proclang.c @@ -15,6 +15,7 @@ #include "access/genam.h" #include "access/heapam.h" +#include "access/htup_details.h" #include "catalog/dependency.h" #include "catalog/indexing.h" #include "catalog/objectaccess.h" diff --git a/src/backend/commands/schemacmds.c b/src/backend/commands/schemacmds.c index 4974025cc3..b11c38d0b8 100644 --- a/src/backend/commands/schemacmds.c +++ b/src/backend/commands/schemacmds.c @@ -14,6 +14,7 @@ */ #include "postgres.h" +#include "access/htup_details.h" #include "access/xact.h" #include "catalog/catalog.h" #include "catalog/dependency.h" diff --git a/src/backend/commands/seclabel.c b/src/backend/commands/seclabel.c index c09a96e9f6..91f41a1cd7 100644 --- a/src/backend/commands/seclabel.c +++ b/src/backend/commands/seclabel.c @@ -12,6 +12,7 @@ #include "access/genam.h" #include "access/heapam.h" +#include "access/htup_details.h" #include "catalog/catalog.h" #include "catalog/indexing.h" #include "catalog/pg_seclabel.h" diff --git a/src/backend/commands/sequence.c b/src/backend/commands/sequence.c index fbb6489915..4f55830ae4 100644 --- a/src/backend/commands/sequence.c +++ b/src/backend/commands/sequence.c @@ -15,6 +15,7 @@ #include "postgres.h" #include "access/transam.h" +#include "access/htup_details.h" #include "access/xlogutils.h" #include "catalog/dependency.h" #include "catalog/namespace.h" diff --git a/src/backend/commands/tablespace.c b/src/backend/commands/tablespace.c index da9cb2f30e..d1718c1513 100644 --- a/src/backend/commands/tablespace.c +++ b/src/backend/commands/tablespace.c @@ -53,6 +53,7 @@ #include "access/heapam.h" #include "access/reloptions.h" +#include "access/htup_details.h" #include "access/sysattr.h" #include "access/xact.h" #include "catalog/catalog.h" diff --git a/src/backend/commands/trigger.c b/src/backend/commands/trigger.c index e7576fc9ea..4d3ed9cb62 100644 --- a/src/backend/commands/trigger.c +++ b/src/backend/commands/trigger.c @@ -16,6 +16,7 @@ #include "access/genam.h" #include "access/heapam.h" #include "access/sysattr.h" +#include "access/htup_details.h" #include "access/xact.h" #include "catalog/catalog.h" #include "catalog/dependency.h" diff --git a/src/backend/commands/tsearchcmds.c b/src/backend/commands/tsearchcmds.c index 86cb8704da..487c7fb1a2 100644 --- a/src/backend/commands/tsearchcmds.c +++ b/src/backend/commands/tsearchcmds.c @@ -17,8 +17,9 @@ #include -#include "access/heapam.h" #include "access/genam.h" +#include "access/heapam.h" +#include "access/htup_details.h" #include "access/xact.h" #include "catalog/dependency.h" #include "catalog/indexing.h" diff --git a/src/backend/commands/typecmds.c b/src/backend/commands/typecmds.c index 7fc3ad7e73..88e4287492 100644 --- a/src/backend/commands/typecmds.c +++ b/src/backend/commands/typecmds.c @@ -33,6 +33,7 @@ #include "access/genam.h" #include "access/heapam.h" +#include "access/htup_details.h" #include "access/xact.h" #include "catalog/catalog.h" #include "catalog/dependency.h" diff --git a/src/backend/commands/user.c b/src/backend/commands/user.c index a22092c202..f178167d62 100644 --- a/src/backend/commands/user.c +++ b/src/backend/commands/user.c @@ -14,6 +14,7 @@ #include "access/genam.h" #include "access/heapam.h" +#include "access/htup_details.h" #include "access/xact.h" #include "catalog/dependency.h" #include "catalog/indexing.h" diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 710c2afc9f..14d1c08c97 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -25,6 +25,7 @@ #include "access/clog.h" #include "access/genam.h" #include "access/heapam.h" +#include "access/htup_details.h" #include "access/transam.h" #include "access/xact.h" #include "catalog/namespace.h" diff --git a/src/backend/commands/vacuumlazy.c b/src/backend/commands/vacuumlazy.c index 703b476bdf..c9253a9c47 100644 --- a/src/backend/commands/vacuumlazy.c +++ b/src/backend/commands/vacuumlazy.c @@ -40,6 +40,7 @@ #include "access/genam.h" #include "access/heapam.h" #include "access/heapam_xlog.h" +#include "access/htup_details.h" #include "access/transam.h" #include "access/visibilitymap.h" #include "catalog/storage.h" diff --git a/src/backend/commands/variable.c b/src/backend/commands/variable.c index 5d894ba77f..3b55e595af 100644 --- a/src/backend/commands/variable.c +++ b/src/backend/commands/variable.c @@ -18,6 +18,7 @@ #include +#include "access/htup_details.h" #include "access/xact.h" #include "catalog/pg_authid.h" #include "commands/variable.h" diff --git a/src/backend/executor/execAmi.c b/src/backend/executor/execAmi.c index e54d51e3d2..cf4943d8be 100644 --- a/src/backend/executor/execAmi.c +++ b/src/backend/executor/execAmi.c @@ -12,6 +12,7 @@ */ #include "postgres.h" +#include "access/htup_details.h" #include "executor/execdebug.h" #include "executor/nodeAgg.h" #include "executor/nodeAppend.h" diff --git a/src/backend/executor/execMain.c b/src/backend/executor/execMain.c index 440438b180..d966be543e 100644 --- a/src/backend/executor/execMain.c +++ b/src/backend/executor/execMain.c @@ -37,6 +37,7 @@ */ #include "postgres.h" +#include "access/htup_details.h" #include "access/sysattr.h" #include "access/transam.h" #include "access/xact.h" diff --git a/src/backend/executor/execQual.c b/src/backend/executor/execQual.c index 85c8d15560..56b106abda 100644 --- a/src/backend/executor/execQual.c +++ b/src/backend/executor/execQual.c @@ -36,6 +36,7 @@ #include "postgres.h" +#include "access/htup_details.h" #include "access/nbtree.h" #include "access/tupconvert.h" #include "catalog/pg_type.h" diff --git a/src/backend/executor/execTuples.c b/src/backend/executor/execTuples.c index e755e7c4f0..530ddff462 100644 --- a/src/backend/executor/execTuples.c +++ b/src/backend/executor/execTuples.c @@ -88,6 +88,7 @@ */ #include "postgres.h" +#include "access/htup_details.h" #include "funcapi.h" #include "catalog/pg_type.h" #include "nodes/nodeFuncs.h" diff --git a/src/backend/executor/functions.c b/src/backend/executor/functions.c index fc0bcb4bce..c90521246a 100644 --- a/src/backend/executor/functions.c +++ b/src/backend/executor/functions.c @@ -14,6 +14,7 @@ */ #include "postgres.h" +#include "access/htup_details.h" #include "access/xact.h" #include "catalog/pg_proc.h" #include "catalog/pg_type.h" diff --git a/src/backend/executor/nodeAgg.c b/src/backend/executor/nodeAgg.c index c9aa921103..38c71415fb 100644 --- a/src/backend/executor/nodeAgg.c +++ b/src/backend/executor/nodeAgg.c @@ -78,6 +78,7 @@ #include "postgres.h" +#include "access/htup_details.h" #include "catalog/pg_aggregate.h" #include "catalog/pg_proc.h" #include "catalog/pg_type.h" diff --git a/src/backend/executor/nodeHash.c b/src/backend/executor/nodeHash.c index cabe663a96..c90fe40b3c 100644 --- a/src/backend/executor/nodeHash.c +++ b/src/backend/executor/nodeHash.c @@ -24,6 +24,7 @@ #include #include +#include "access/htup_details.h" #include "catalog/pg_statistic.h" #include "commands/tablespace.h" #include "executor/execdebug.h" diff --git a/src/backend/executor/nodeHashjoin.c b/src/backend/executor/nodeHashjoin.c index 0ea490b578..5bcf5f1f8b 100644 --- a/src/backend/executor/nodeHashjoin.c +++ b/src/backend/executor/nodeHashjoin.c @@ -15,6 +15,7 @@ #include "postgres.h" +#include "access/htup_details.h" #include "executor/executor.h" #include "executor/hashjoin.h" #include "executor/nodeHash.h" diff --git a/src/backend/executor/nodeLockRows.c b/src/backend/executor/nodeLockRows.c index d2a33cb356..ec0825b460 100644 --- a/src/backend/executor/nodeLockRows.c +++ b/src/backend/executor/nodeLockRows.c @@ -21,6 +21,7 @@ #include "postgres.h" +#include "access/htup_details.h" #include "access/xact.h" #include "executor/executor.h" #include "executor/nodeLockRows.h" diff --git a/src/backend/executor/nodeModifyTable.c b/src/backend/executor/nodeModifyTable.c index a7bce75f0c..26a59d0121 100644 --- a/src/backend/executor/nodeModifyTable.c +++ b/src/backend/executor/nodeModifyTable.c @@ -37,6 +37,7 @@ #include "postgres.h" +#include "access/htup_details.h" #include "access/xact.h" #include "commands/trigger.h" #include "executor/executor.h" diff --git a/src/backend/executor/nodeSetOp.c b/src/backend/executor/nodeSetOp.c index 362f4466e4..cd3e4e277c 100644 --- a/src/backend/executor/nodeSetOp.c +++ b/src/backend/executor/nodeSetOp.c @@ -44,6 +44,7 @@ #include "postgres.h" +#include "access/htup_details.h" #include "executor/executor.h" #include "executor/nodeSetOp.h" #include "utils/memutils.h" diff --git a/src/backend/executor/nodeSubplan.c b/src/backend/executor/nodeSubplan.c index 474758140b..d615b78373 100644 --- a/src/backend/executor/nodeSubplan.c +++ b/src/backend/executor/nodeSubplan.c @@ -21,6 +21,7 @@ #include #include +#include "access/htup_details.h" #include "executor/executor.h" #include "executor/nodeSubplan.h" #include "nodes/makefuncs.h" diff --git a/src/backend/executor/nodeWindowAgg.c b/src/backend/executor/nodeWindowAgg.c index ce89ff2ebf..ade9b57d28 100644 --- a/src/backend/executor/nodeWindowAgg.c +++ b/src/backend/executor/nodeWindowAgg.c @@ -33,6 +33,7 @@ */ #include "postgres.h" +#include "access/htup_details.h" #include "catalog/pg_aggregate.h" #include "catalog/pg_proc.h" #include "catalog/pg_type.h" diff --git a/src/backend/executor/spi.c b/src/backend/executor/spi.c index 7c0da8873a..70d6004905 100644 --- a/src/backend/executor/spi.c +++ b/src/backend/executor/spi.c @@ -14,6 +14,7 @@ */ #include "postgres.h" +#include "access/htup_details.h" #include "access/printtup.h" #include "access/sysattr.h" #include "access/xact.h" diff --git a/src/backend/foreign/foreign.c b/src/backend/foreign/foreign.c index 6f9f77cc11..d8845aa897 100644 --- a/src/backend/foreign/foreign.c +++ b/src/backend/foreign/foreign.c @@ -12,6 +12,7 @@ */ #include "postgres.h" +#include "access/htup_details.h" #include "access/reloptions.h" #include "catalog/pg_foreign_data_wrapper.h" #include "catalog/pg_foreign_server.h" diff --git a/src/backend/nodes/tidbitmap.c b/src/backend/nodes/tidbitmap.c index 728619e75d..202eacf445 100644 --- a/src/backend/nodes/tidbitmap.c +++ b/src/backend/nodes/tidbitmap.c @@ -40,7 +40,7 @@ #include -#include "access/htup.h" +#include "access/htup_details.h" #include "nodes/bitmapset.h" #include "nodes/tidbitmap.h" #include "utils/hsearch.h" diff --git a/src/backend/optimizer/path/costsize.c b/src/backend/optimizer/path/costsize.c index 223a0616fa..3e99b230f5 100644 --- a/src/backend/optimizer/path/costsize.c +++ b/src/backend/optimizer/path/costsize.c @@ -70,6 +70,7 @@ #include +#include "access/htup_details.h" #include "executor/executor.h" #include "executor/nodeHash.h" #include "miscadmin.h" diff --git a/src/backend/optimizer/plan/planagg.c b/src/backend/optimizer/plan/planagg.c index 373f65b76f..55a5ed7b4c 100644 --- a/src/backend/optimizer/plan/planagg.c +++ b/src/backend/optimizer/plan/planagg.c @@ -28,6 +28,7 @@ */ #include "postgres.h" +#include "access/htup_details.h" #include "catalog/pg_aggregate.h" #include "catalog/pg_type.h" #include "nodes/makefuncs.h" diff --git a/src/backend/optimizer/plan/planner.c b/src/backend/optimizer/plan/planner.c index 6170d48892..0540afaced 100644 --- a/src/backend/optimizer/plan/planner.c +++ b/src/backend/optimizer/plan/planner.c @@ -17,6 +17,7 @@ #include +#include "access/htup_details.h" #include "executor/executor.h" #include "executor/nodeAgg.h" #include "miscadmin.h" diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c index 863c943f2a..4c2e821281 100644 --- a/src/backend/optimizer/plan/subselect.c +++ b/src/backend/optimizer/plan/subselect.c @@ -13,6 +13,7 @@ */ #include "postgres.h" +#include "access/htup_details.h" #include "catalog/pg_operator.h" #include "catalog/pg_type.h" #include "executor/executor.h" diff --git a/src/backend/optimizer/prep/prepunion.c b/src/backend/optimizer/prep/prepunion.c index 2e50cb7548..94373b087c 100644 --- a/src/backend/optimizer/prep/prepunion.c +++ b/src/backend/optimizer/prep/prepunion.c @@ -31,6 +31,7 @@ #include #include "access/heapam.h" +#include "access/htup_details.h" #include "access/sysattr.h" #include "catalog/pg_inherits_fn.h" #include "catalog/pg_type.h" diff --git a/src/backend/optimizer/util/clauses.c b/src/backend/optimizer/util/clauses.c index c339f13228..fa6817c914 100644 --- a/src/backend/optimizer/util/clauses.c +++ b/src/backend/optimizer/util/clauses.c @@ -19,6 +19,7 @@ #include "postgres.h" +#include "access/htup_details.h" #include "catalog/pg_aggregate.h" #include "catalog/pg_language.h" #include "catalog/pg_operator.h" diff --git a/src/backend/optimizer/util/plancat.c b/src/backend/optimizer/util/plancat.c index 71e1e73b0c..25f8785b63 100644 --- a/src/backend/optimizer/util/plancat.c +++ b/src/backend/optimizer/util/plancat.c @@ -19,6 +19,7 @@ #include "access/genam.h" #include "access/heapam.h" +#include "access/htup_details.h" #include "access/sysattr.h" #include "access/transam.h" #include "access/xlog.h" diff --git a/src/backend/parser/parse_coerce.c b/src/backend/parser/parse_coerce.c index a1caf74fc5..f477730ad5 100644 --- a/src/backend/parser/parse_coerce.c +++ b/src/backend/parser/parse_coerce.c @@ -14,6 +14,7 @@ */ #include "postgres.h" +#include "access/htup_details.h" #include "catalog/pg_cast.h" #include "catalog/pg_class.h" #include "catalog/pg_inherits_fn.h" diff --git a/src/backend/parser/parse_func.c b/src/backend/parser/parse_func.c index 2b1a13a693..8bd88b022f 100644 --- a/src/backend/parser/parse_func.c +++ b/src/backend/parser/parse_func.c @@ -14,6 +14,7 @@ */ #include "postgres.h" +#include "access/htup_details.h" #include "catalog/pg_proc.h" #include "catalog/pg_type.h" #include "funcapi.h" diff --git a/src/backend/parser/parse_node.c b/src/backend/parser/parse_node.c index 6aaeae76b0..2e9fad0f97 100644 --- a/src/backend/parser/parse_node.c +++ b/src/backend/parser/parse_node.c @@ -15,6 +15,7 @@ #include "postgres.h" #include "access/heapam.h" +#include "access/htup_details.h" #include "catalog/pg_type.h" #include "mb/pg_wchar.h" #include "nodes/makefuncs.h" diff --git a/src/backend/parser/parse_oper.c b/src/backend/parser/parse_oper.c index bb5f04031d..c92a976d24 100644 --- a/src/backend/parser/parse_oper.c +++ b/src/backend/parser/parse_oper.c @@ -15,6 +15,7 @@ #include "postgres.h" +#include "access/htup_details.h" #include "catalog/pg_operator.h" #include "catalog/pg_type.h" #include "lib/stringinfo.h" diff --git a/src/backend/parser/parse_relation.c b/src/backend/parser/parse_relation.c index d9c73ae5a7..36d95eb9ee 100644 --- a/src/backend/parser/parse_relation.c +++ b/src/backend/parser/parse_relation.c @@ -16,6 +16,7 @@ #include +#include "access/htup_details.h" #include "access/sysattr.h" #include "catalog/heap.h" #include "catalog/namespace.h" diff --git a/src/backend/parser/parse_type.c b/src/backend/parser/parse_type.c index cf2ff0cf70..978ec7c973 100644 --- a/src/backend/parser/parse_type.c +++ b/src/backend/parser/parse_type.c @@ -14,6 +14,7 @@ */ #include "postgres.h" +#include "access/htup_details.h" #include "catalog/namespace.h" #include "catalog/pg_type.h" #include "lib/stringinfo.h" diff --git a/src/backend/parser/parse_utilcmd.c b/src/backend/parser/parse_utilcmd.c index accda01f45..95c57e81b5 100644 --- a/src/backend/parser/parse_utilcmd.c +++ b/src/backend/parser/parse_utilcmd.c @@ -26,6 +26,7 @@ #include "postgres.h" +#include "access/htup_details.h" #include "access/reloptions.h" #include "catalog/dependency.h" #include "catalog/heap.h" diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index dd8690577c..74db821387 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -68,6 +68,7 @@ #include #include "access/heapam.h" +#include "access/htup_details.h" #include "access/reloptions.h" #include "access/transam.h" #include "access/xact.h" diff --git a/src/backend/postmaster/pgstat.c b/src/backend/postmaster/pgstat.c index 2371cd2ff9..8389d5c4ae 100644 --- a/src/backend/postmaster/pgstat.c +++ b/src/backend/postmaster/pgstat.c @@ -32,6 +32,7 @@ #include "pgstat.h" #include "access/heapam.h" +#include "access/htup_details.h" #include "access/transam.h" #include "access/twophase_rmgr.h" #include "access/xact.h" diff --git a/src/backend/rewrite/rewriteDefine.c b/src/backend/rewrite/rewriteDefine.c index 971d277b76..8efc9fc9d5 100644 --- a/src/backend/rewrite/rewriteDefine.c +++ b/src/backend/rewrite/rewriteDefine.c @@ -15,6 +15,7 @@ #include "postgres.h" #include "access/heapam.h" +#include "access/htup_details.h" #include "catalog/catalog.h" #include "catalog/dependency.h" #include "catalog/indexing.h" diff --git a/src/backend/rewrite/rewriteRemove.c b/src/backend/rewrite/rewriteRemove.c index 2c2e8fa08b..c77591ab07 100644 --- a/src/backend/rewrite/rewriteRemove.c +++ b/src/backend/rewrite/rewriteRemove.c @@ -16,6 +16,7 @@ #include "access/genam.h" #include "access/heapam.h" +#include "access/htup_details.h" #include "access/sysattr.h" #include "catalog/dependency.h" #include "catalog/indexing.h" diff --git a/src/backend/rewrite/rewriteSupport.c b/src/backend/rewrite/rewriteSupport.c index 3f9b5e6063..79b940fd21 100644 --- a/src/backend/rewrite/rewriteSupport.c +++ b/src/backend/rewrite/rewriteSupport.c @@ -15,6 +15,7 @@ #include "postgres.h" #include "access/heapam.h" +#include "access/htup_details.h" #include "catalog/indexing.h" #include "catalog/pg_rewrite.h" #include "rewrite/rewriteSupport.h" diff --git a/src/backend/storage/freespace/freespace.c b/src/backend/storage/freespace/freespace.c index 7840adb350..8889fe1ecb 100644 --- a/src/backend/storage/freespace/freespace.c +++ b/src/backend/storage/freespace/freespace.c @@ -23,7 +23,7 @@ */ #include "postgres.h" -#include "access/htup.h" +#include "access/htup_details.h" #include "access/xlogutils.h" #include "miscadmin.h" #include "storage/freespace.h" diff --git a/src/backend/storage/lmgr/predicate.c b/src/backend/storage/lmgr/predicate.c index 8b5a95ceaa..f164cfd3fe 100644 --- a/src/backend/storage/lmgr/predicate.c +++ b/src/backend/storage/lmgr/predicate.c @@ -183,6 +183,7 @@ #include "postgres.h" +#include "access/htup_details.h" #include "access/slru.h" #include "access/subtrans.h" #include "access/transam.h" diff --git a/src/backend/storage/page/bufpage.c b/src/backend/storage/page/bufpage.c index 90a731cc3a..7bcee9b2d1 100644 --- a/src/backend/storage/page/bufpage.c +++ b/src/backend/storage/page/bufpage.c @@ -14,7 +14,7 @@ */ #include "postgres.h" -#include "access/htup.h" +#include "access/htup_details.h" /* ---------------------------------------------------------------- diff --git a/src/backend/tcop/fastpath.c b/src/backend/tcop/fastpath.c index 5c0620689e..48a50630a1 100644 --- a/src/backend/tcop/fastpath.c +++ b/src/backend/tcop/fastpath.c @@ -20,6 +20,7 @@ #include #include +#include "access/htup_details.h" #include "access/xact.h" #include "catalog/pg_proc.h" #include "libpq/libpq.h" diff --git a/src/backend/tcop/utility.c b/src/backend/tcop/utility.c index ce50560dd6..ce8a8b1c16 100644 --- a/src/backend/tcop/utility.c +++ b/src/backend/tcop/utility.c @@ -16,6 +16,7 @@ */ #include "postgres.h" +#include "access/htup_details.h" #include "access/reloptions.h" #include "access/twophase.h" #include "access/xact.h" diff --git a/src/backend/tsearch/ts_selfuncs.c b/src/backend/tsearch/ts_selfuncs.c index a07d410005..8d47bbceb3 100644 --- a/src/backend/tsearch/ts_selfuncs.c +++ b/src/backend/tsearch/ts_selfuncs.c @@ -13,6 +13,7 @@ */ #include "postgres.h" +#include "access/htup_details.h" #include "catalog/pg_statistic.h" #include "catalog/pg_type.h" #include "miscadmin.h" diff --git a/src/backend/utils/adt/acl.c b/src/backend/utils/adt/acl.c index d5903b1f04..fc8e287203 100644 --- a/src/backend/utils/adt/acl.c +++ b/src/backend/utils/adt/acl.c @@ -16,6 +16,7 @@ #include +#include "access/htup_details.h" #include "catalog/namespace.h" #include "catalog/pg_authid.h" #include "catalog/pg_auth_members.h" diff --git a/src/backend/utils/adt/array_selfuncs.c b/src/backend/utils/adt/array_selfuncs.c index 1b7d46f858..622d6d13ce 100644 --- a/src/backend/utils/adt/array_selfuncs.c +++ b/src/backend/utils/adt/array_selfuncs.c @@ -16,6 +16,7 @@ #include +#include "access/htup_details.h" #include "catalog/pg_collation.h" #include "catalog/pg_operator.h" #include "catalog/pg_statistic.h" diff --git a/src/backend/utils/adt/arrayfuncs.c b/src/backend/utils/adt/arrayfuncs.c index e14906fd98..a4b6395192 100644 --- a/src/backend/utils/adt/arrayfuncs.c +++ b/src/backend/utils/adt/arrayfuncs.c @@ -16,6 +16,7 @@ #include +#include "access/htup_details.h" #include "funcapi.h" #include "libpq/pqformat.h" #include "utils/array.h" diff --git a/src/backend/utils/adt/datetime.c b/src/backend/utils/adt/datetime.c index c29b8e1019..d827d7d146 100644 --- a/src/backend/utils/adt/datetime.c +++ b/src/backend/utils/adt/datetime.c @@ -19,6 +19,7 @@ #include #include +#include "access/htup_details.h" #include "access/xact.h" #include "catalog/pg_type.h" #include "funcapi.h" diff --git a/src/backend/utils/adt/dbsize.c b/src/backend/utils/adt/dbsize.c index 2ccdc0cee6..cd23334a1a 100644 --- a/src/backend/utils/adt/dbsize.c +++ b/src/backend/utils/adt/dbsize.c @@ -15,6 +15,7 @@ #include #include "access/heapam.h" +#include "access/htup_details.h" #include "catalog/catalog.h" #include "catalog/namespace.h" #include "catalog/pg_tablespace.h" diff --git a/src/backend/utils/adt/enum.c b/src/backend/utils/adt/enum.c index de46f4c55f..9388f7848e 100644 --- a/src/backend/utils/adt/enum.c +++ b/src/backend/utils/adt/enum.c @@ -15,6 +15,7 @@ #include "access/genam.h" #include "access/heapam.h" +#include "access/htup_details.h" #include "catalog/indexing.h" #include "catalog/pg_enum.h" #include "libpq/pqformat.h" diff --git a/src/backend/utils/adt/format_type.c b/src/backend/utils/adt/format_type.c index 952f0a01c1..4e757166b5 100644 --- a/src/backend/utils/adt/format_type.c +++ b/src/backend/utils/adt/format_type.c @@ -17,6 +17,7 @@ #include +#include "access/htup_details.h" #include "catalog/namespace.h" #include "catalog/pg_type.h" #include "utils/builtins.h" diff --git a/src/backend/utils/adt/genfile.c b/src/backend/utils/adt/genfile.c index e50ff6393f..4450676802 100644 --- a/src/backend/utils/adt/genfile.c +++ b/src/backend/utils/adt/genfile.c @@ -20,6 +20,7 @@ #include #include +#include "access/htup_details.h" #include "catalog/pg_type.h" #include "funcapi.h" #include "mb/pg_wchar.h" diff --git a/src/backend/utils/adt/json.c b/src/backend/utils/adt/json.c index 0425ac6242..c700da4221 100644 --- a/src/backend/utils/adt/json.c +++ b/src/backend/utils/adt/json.c @@ -13,6 +13,7 @@ */ #include "postgres.h" +#include "access/htup_details.h" #include "catalog/pg_type.h" #include "executor/spi.h" #include "lib/stringinfo.h" diff --git a/src/backend/utils/adt/lockfuncs.c b/src/backend/utils/adt/lockfuncs.c index 33c5b64f50..dfa37a9576 100644 --- a/src/backend/utils/adt/lockfuncs.c +++ b/src/backend/utils/adt/lockfuncs.c @@ -12,6 +12,7 @@ */ #include "postgres.h" +#include "access/htup_details.h" #include "catalog/pg_type.h" #include "funcapi.h" #include "miscadmin.h" diff --git a/src/backend/utils/adt/pg_locale.c b/src/backend/utils/adt/pg_locale.c index de881bf634..92ea4413cc 100644 --- a/src/backend/utils/adt/pg_locale.c +++ b/src/backend/utils/adt/pg_locale.c @@ -54,6 +54,7 @@ #include #include +#include "access/htup_details.h" #include "catalog/pg_collation.h" #include "catalog/pg_control.h" #include "mb/pg_wchar.h" diff --git a/src/backend/utils/adt/pgstatfuncs.c b/src/backend/utils/adt/pgstatfuncs.c index 7c0705abcc..7d4059f1cb 100644 --- a/src/backend/utils/adt/pgstatfuncs.c +++ b/src/backend/utils/adt/pgstatfuncs.c @@ -14,6 +14,7 @@ */ #include "postgres.h" +#include "access/htup_details.h" #include "catalog/pg_type.h" #include "funcapi.h" #include "libpq/ip.h" diff --git a/src/backend/utils/adt/rangetypes_selfuncs.c b/src/backend/utils/adt/rangetypes_selfuncs.c index ab2c6d6964..7e20940ae7 100644 --- a/src/backend/utils/adt/rangetypes_selfuncs.c +++ b/src/backend/utils/adt/rangetypes_selfuncs.c @@ -17,6 +17,7 @@ */ #include "postgres.h" +#include "access/htup_details.h" #include "catalog/pg_operator.h" #include "catalog/pg_statistic.h" #include "utils/lsyscache.h" diff --git a/src/backend/utils/adt/regproc.c b/src/backend/utils/adt/regproc.c index 11b3f57193..a15f670f14 100644 --- a/src/backend/utils/adt/regproc.c +++ b/src/backend/utils/adt/regproc.c @@ -23,6 +23,7 @@ #include "access/genam.h" #include "access/heapam.h" +#include "access/htup_details.h" #include "catalog/indexing.h" #include "catalog/namespace.h" #include "catalog/pg_class.h" diff --git a/src/backend/utils/adt/ri_triggers.c b/src/backend/utils/adt/ri_triggers.c index 983f631234..97e68b1b6c 100644 --- a/src/backend/utils/adt/ri_triggers.c +++ b/src/backend/utils/adt/ri_triggers.c @@ -30,8 +30,9 @@ #include "postgres.h" -#include "access/xact.h" +#include "access/htup_details.h" #include "access/sysattr.h" +#include "access/xact.h" #include "catalog/pg_collation.h" #include "catalog/pg_constraint.h" #include "catalog/pg_operator.h" diff --git a/src/backend/utils/adt/rowtypes.c b/src/backend/utils/adt/rowtypes.c index ba7fde4313..13e574d4e8 100644 --- a/src/backend/utils/adt/rowtypes.c +++ b/src/backend/utils/adt/rowtypes.c @@ -16,6 +16,7 @@ #include +#include "access/htup_details.h" #include "catalog/pg_type.h" #include "libpq/pqformat.h" #include "utils/builtins.h" diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c index ae6278432f..0839643138 100644 --- a/src/backend/utils/adt/ruleutils.c +++ b/src/backend/utils/adt/ruleutils.c @@ -18,6 +18,7 @@ #include #include +#include "access/htup_details.h" #include "access/sysattr.h" #include "catalog/dependency.h" #include "catalog/indexing.h" diff --git a/src/backend/utils/adt/selfuncs.c b/src/backend/utils/adt/selfuncs.c index 40e1bebac1..2ab26dea29 100644 --- a/src/backend/utils/adt/selfuncs.c +++ b/src/backend/utils/adt/selfuncs.c @@ -101,6 +101,7 @@ #include #include "access/gin.h" +#include "access/htup_details.h" #include "access/sysattr.h" #include "catalog/index.h" #include "catalog/pg_collation.h" diff --git a/src/backend/utils/adt/trigfuncs.c b/src/backend/utils/adt/trigfuncs.c index a7e3ae9b0f..81c799d94f 100644 --- a/src/backend/utils/adt/trigfuncs.c +++ b/src/backend/utils/adt/trigfuncs.c @@ -13,6 +13,7 @@ */ #include "postgres.h" +#include "access/htup_details.h" #include "commands/trigger.h" #include "utils/builtins.h" #include "utils/rel.h" diff --git a/src/backend/utils/adt/varbit.c b/src/backend/utils/adt/varbit.c index 2bcf5b8aa8..2378d27324 100644 --- a/src/backend/utils/adt/varbit.c +++ b/src/backend/utils/adt/varbit.c @@ -16,7 +16,7 @@ #include "postgres.h" -#include "access/htup.h" +#include "access/htup_details.h" #include "libpq/pqformat.h" #include "nodes/nodeFuncs.h" #include "utils/array.h" diff --git a/src/backend/utils/adt/xml.c b/src/backend/utils/adt/xml.c index 2d945b9cdb..051d403681 100644 --- a/src/backend/utils/adt/xml.c +++ b/src/backend/utils/adt/xml.c @@ -67,6 +67,7 @@ #endif #endif /* USE_LIBXML */ +#include "access/htup_details.h" #include "catalog/namespace.h" #include "catalog/pg_type.h" #include "commands/dbcommands.h" diff --git a/src/backend/utils/cache/evtcache.c b/src/backend/utils/cache/evtcache.c index 6707ea1f82..0dd53110ce 100644 --- a/src/backend/utils/cache/evtcache.c +++ b/src/backend/utils/cache/evtcache.c @@ -15,6 +15,7 @@ #include "access/genam.h" #include "access/heapam.h" +#include "access/htup_details.h" #include "catalog/pg_event_trigger.h" #include "catalog/indexing.h" #include "catalog/pg_type.h" diff --git a/src/backend/utils/cache/inval.c b/src/backend/utils/cache/inval.c index 15b1711109..e26bf0bce4 100644 --- a/src/backend/utils/cache/inval.c +++ b/src/backend/utils/cache/inval.c @@ -95,6 +95,7 @@ */ #include "postgres.h" +#include "access/htup_details.h" #include "access/xact.h" #include "catalog/catalog.h" #include "miscadmin.h" diff --git a/src/backend/utils/cache/lsyscache.c b/src/backend/utils/cache/lsyscache.c index 0e479e80e1..b2ae365403 100644 --- a/src/backend/utils/cache/lsyscache.c +++ b/src/backend/utils/cache/lsyscache.c @@ -16,6 +16,7 @@ #include "postgres.h" #include "access/hash.h" +#include "access/htup_details.h" #include "access/nbtree.h" #include "bootstrap/bootstrap.h" #include "catalog/pg_amop.h" diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c index 0f26b34bc4..0cdd30d15b 100644 --- a/src/backend/utils/cache/relcache.c +++ b/src/backend/utils/cache/relcache.c @@ -33,6 +33,7 @@ #include "access/reloptions.h" #include "access/sysattr.h" #include "access/transam.h" +#include "access/htup_details.h" #include "access/xact.h" #include "catalog/catalog.h" #include "catalog/index.h" diff --git a/src/backend/utils/cache/syscache.c b/src/backend/utils/cache/syscache.c index 1967895873..ca22efd765 100644 --- a/src/backend/utils/cache/syscache.c +++ b/src/backend/utils/cache/syscache.c @@ -20,6 +20,7 @@ */ #include "postgres.h" +#include "access/htup_details.h" #include "access/sysattr.h" #include "catalog/indexing.h" #include "catalog/pg_aggregate.h" diff --git a/src/backend/utils/cache/ts_cache.c b/src/backend/utils/cache/ts_cache.c index b369790bde..c907c8fe69 100644 --- a/src/backend/utils/cache/ts_cache.c +++ b/src/backend/utils/cache/ts_cache.c @@ -28,6 +28,7 @@ #include "access/genam.h" #include "access/heapam.h" +#include "access/htup_details.h" #include "access/xact.h" #include "catalog/indexing.h" #include "catalog/namespace.h" diff --git a/src/backend/utils/cache/typcache.c b/src/backend/utils/cache/typcache.c index 9af5e86855..e3b8ca907f 100644 --- a/src/backend/utils/cache/typcache.c +++ b/src/backend/utils/cache/typcache.c @@ -47,6 +47,7 @@ #include "access/hash.h" #include "access/heapam.h" +#include "access/htup_details.h" #include "access/nbtree.h" #include "catalog/indexing.h" #include "catalog/pg_enum.h" diff --git a/src/backend/utils/fmgr/funcapi.c b/src/backend/utils/fmgr/funcapi.c index addf95bca9..e6cec7f13c 100644 --- a/src/backend/utils/fmgr/funcapi.c +++ b/src/backend/utils/fmgr/funcapi.c @@ -13,6 +13,7 @@ */ #include "postgres.h" +#include "access/htup_details.h" #include "catalog/namespace.h" #include "catalog/pg_proc.h" #include "catalog/pg_type.h" diff --git a/src/backend/utils/init/miscinit.c b/src/backend/utils/init/miscinit.c index 9a0f92c268..5288aa77ee 100644 --- a/src/backend/utils/init/miscinit.c +++ b/src/backend/utils/init/miscinit.c @@ -29,6 +29,7 @@ #include #endif +#include "access/htup_details.h" #include "catalog/pg_authid.h" #include "mb/pg_wchar.h" #include "miscadmin.h" diff --git a/src/backend/utils/init/postinit.c b/src/backend/utils/init/postinit.c index bef301a79c..757e76bd7a 100644 --- a/src/backend/utils/init/postinit.c +++ b/src/backend/utils/init/postinit.c @@ -20,6 +20,7 @@ #include #include "access/heapam.h" +#include "access/htup_details.h" #include "access/sysattr.h" #include "access/xact.h" #include "catalog/catalog.h" diff --git a/src/backend/utils/misc/superuser.c b/src/backend/utils/misc/superuser.c index 9accb9d56b..dc574daed1 100644 --- a/src/backend/utils/misc/superuser.c +++ b/src/backend/utils/misc/superuser.c @@ -20,6 +20,7 @@ */ #include "postgres.h" +#include "access/htup_details.h" #include "catalog/pg_authid.h" #include "utils/inval.h" #include "utils/syscache.h" diff --git a/src/backend/utils/sort/tuplesort.c b/src/backend/utils/sort/tuplesort.c index d5a2003e5b..ce27e404be 100644 --- a/src/backend/utils/sort/tuplesort.c +++ b/src/backend/utils/sort/tuplesort.c @@ -100,6 +100,7 @@ #include +#include "access/htup_details.h" #include "access/nbtree.h" #include "catalog/index.h" #include "commands/tablespace.h" diff --git a/src/backend/utils/sort/tuplestore.c b/src/backend/utils/sort/tuplestore.c index 8a7931b856..1b1cf35623 100644 --- a/src/backend/utils/sort/tuplestore.c +++ b/src/backend/utils/sort/tuplestore.c @@ -54,6 +54,7 @@ #include "postgres.h" +#include "access/htup_details.h" #include "commands/tablespace.h" #include "executor/executor.h" #include "storage/buffile.h" diff --git a/src/backend/utils/time/combocid.c b/src/backend/utils/time/combocid.c index 5429922d3f..f91e7faab5 100644 --- a/src/backend/utils/time/combocid.c +++ b/src/backend/utils/time/combocid.c @@ -41,7 +41,7 @@ #include "postgres.h" -#include "access/htup.h" +#include "access/htup_details.h" #include "access/xact.h" #include "utils/combocid.h" #include "utils/hsearch.h" diff --git a/src/backend/utils/time/tqual.c b/src/backend/utils/time/tqual.c index 4caef9ca25..b531db5087 100644 --- a/src/backend/utils/time/tqual.c +++ b/src/backend/utils/time/tqual.c @@ -57,6 +57,7 @@ #include "postgres.h" +#include "access/htup_details.h" #include "access/multixact.h" #include "access/subtrans.h" #include "access/transam.h" diff --git a/src/include/access/heapam.h b/src/include/access/heapam.h index 2d73ae8fb8..a4ab0627a0 100644 --- a/src/include/access/heapam.h +++ b/src/include/access/heapam.h @@ -17,6 +17,7 @@ #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" diff --git a/src/include/access/heapam_xlog.h b/src/include/access/heapam_xlog.h index 4ccea5ce4e..8ec710e85f 100644 --- a/src/include/access/heapam_xlog.h +++ b/src/include/access/heapam_xlog.h @@ -16,6 +16,7 @@ #include "access/htup.h" #include "access/xlog.h" +#include "storage/bufpage.h" #include "storage/relfilenode.h" #include "utils/relcache.h" diff --git a/src/include/access/htup.h b/src/include/access/htup.h index 74cad2bb2b..53b711046c 100644 --- a/src/include/access/htup.h +++ b/src/include/access/htup.h @@ -14,470 +14,15 @@ #ifndef HTUP_H #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 */ +/* typedefs and forward declarations for structs defined in htup.h */ -/* - * 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 struct HeapTupleHeaderData 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 struct MinimalTupleData MinimalTupleData; typedef MinimalTupleData *MinimalTuple; @@ -526,57 +71,11 @@ 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); @@ -584,129 +83,4 @@ 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. - * - * is the pointer to the heap tuple. is the attribute - * number of the column (field) caller wants. 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); -extern void heap_fill_tuple(TupleDesc tupleDesc, - Datum *values, bool *isnull, - char *data, Size data_size, - uint16 *infomask, bits8 *bit); -extern bool heap_attisnull(HeapTuple tup, int attnum); -extern Datum nocachegetattr(HeapTuple tup, int attnum, - TupleDesc att); -extern Datum heap_getsysattr(HeapTuple tup, int attnum, TupleDesc tupleDesc, - bool *isnull); -extern HeapTuple heap_copytuple(HeapTuple tuple); -extern void heap_copytuple_with_tuple(HeapTuple src, HeapTuple dest); -extern HeapTuple heap_form_tuple(TupleDesc tupleDescriptor, - Datum *values, bool *isnull); -extern HeapTuple heap_modify_tuple(HeapTuple tuple, - TupleDesc tupleDesc, - Datum *replValues, - bool *replIsnull, - bool *doReplace); -extern void heap_deform_tuple(HeapTuple tuple, TupleDesc tupleDesc, - Datum *values, bool *isnull); - -/* these three are deprecated versions of the three above: */ -extern HeapTuple heap_formtuple(TupleDesc tupleDescriptor, - Datum *values, char *nulls); -extern HeapTuple heap_modifytuple(HeapTuple tuple, - TupleDesc tupleDesc, - Datum *replValues, - char *replNulls, - char *replActions); -extern void heap_deformtuple(HeapTuple tuple, TupleDesc tupleDesc, - Datum *values, char *nulls); -extern void heap_freetuple(HeapTuple htup); -extern MinimalTuple heap_form_minimal_tuple(TupleDesc tupleDescriptor, - Datum *values, bool *isnull); -extern void heap_free_minimal_tuple(MinimalTuple mtup); -extern MinimalTuple heap_copy_minimal_tuple(MinimalTuple mtup); -extern HeapTuple heap_tuple_from_minimal_tuple(MinimalTuple mtup); -extern MinimalTuple minimal_tuple_from_heap_tuple(HeapTuple htup); - #endif /* HTUP_H */ diff --git a/src/include/access/htup_details.h b/src/include/access/htup_details.h new file mode 100644 index 0000000000..7abe3e655d --- /dev/null +++ b/src/include/access/htup_details.h @@ -0,0 +1,657 @@ +/*------------------------------------------------------------------------- + * + * htup_details.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/htup_details.h + * + *------------------------------------------------------------------------- + */ +#ifndef HTUP_DETAILS_H +#define HTUP_DETAILS_H + +#include "access/htup.h" +#include "access/tupdesc.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. + * + * is the pointer to the heap tuple. is the attribute + * number of the column (field) caller wants. 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); +extern void heap_fill_tuple(TupleDesc tupleDesc, + Datum *values, bool *isnull, + char *data, Size data_size, + uint16 *infomask, bits8 *bit); +extern bool heap_attisnull(HeapTuple tup, int attnum); +extern Datum nocachegetattr(HeapTuple tup, int attnum, + TupleDesc att); +extern Datum heap_getsysattr(HeapTuple tup, int attnum, TupleDesc tupleDesc, + bool *isnull); +extern HeapTuple heap_copytuple(HeapTuple tuple); +extern void heap_copytuple_with_tuple(HeapTuple src, HeapTuple dest); +extern HeapTuple heap_form_tuple(TupleDesc tupleDescriptor, + Datum *values, bool *isnull); +extern HeapTuple heap_modify_tuple(HeapTuple tuple, + TupleDesc tupleDesc, + Datum *replValues, + bool *replIsnull, + bool *doReplace); +extern void heap_deform_tuple(HeapTuple tuple, TupleDesc tupleDesc, + Datum *values, bool *isnull); + +/* these three are deprecated versions of the three above: */ +extern HeapTuple heap_formtuple(TupleDesc tupleDescriptor, + Datum *values, char *nulls); +extern HeapTuple heap_modifytuple(HeapTuple tuple, + TupleDesc tupleDesc, + Datum *replValues, + char *replNulls, + char *replActions); +extern void heap_deformtuple(HeapTuple tuple, TupleDesc tupleDesc, + Datum *values, char *nulls); +extern void heap_freetuple(HeapTuple htup); +extern MinimalTuple heap_form_minimal_tuple(TupleDesc tupleDescriptor, + Datum *values, bool *isnull); +extern void heap_free_minimal_tuple(MinimalTuple mtup); +extern MinimalTuple heap_copy_minimal_tuple(MinimalTuple mtup); +extern HeapTuple heap_tuple_from_minimal_tuple(MinimalTuple mtup); +extern MinimalTuple minimal_tuple_from_heap_tuple(HeapTuple htup); + +#endif /* HTUP_DETAILS_H */ diff --git a/src/include/access/reloptions.h b/src/include/access/reloptions.h index 42af4a9bbc..0572b25275 100644 --- a/src/include/access/reloptions.h +++ b/src/include/access/reloptions.h @@ -20,6 +20,7 @@ #define RELOPTIONS_H #include "access/htup.h" +#include "access/tupdesc.h" #include "nodes/pg_list.h" /* types supported by reloptions */ diff --git a/src/include/access/relscan.h b/src/include/access/relscan.h index 2e967e1d59..87acc8eb5b 100644 --- a/src/include/access/relscan.h +++ b/src/include/access/relscan.h @@ -16,6 +16,7 @@ #include "access/genam.h" #include "access/heapam.h" +#include "access/htup_details.h" #include "access/itup.h" #include "access/tupdesc.h" diff --git a/src/include/access/tupconvert.h b/src/include/access/tupconvert.h index 7511aa6405..342dbb4d25 100644 --- a/src/include/access/tupconvert.h +++ b/src/include/access/tupconvert.h @@ -15,6 +15,7 @@ #define TUPCONVERT_H #include "access/htup.h" +#include "access/tupdesc.h" typedef struct TupleConversionMap diff --git a/src/include/access/tuptoaster.h b/src/include/access/tuptoaster.h index e3dbde0def..0f29acb244 100644 --- a/src/include/access/tuptoaster.h +++ b/src/include/access/tuptoaster.h @@ -13,7 +13,7 @@ #ifndef TUPTOASTER_H #define TUPTOASTER_H -#include "access/htup.h" +#include "access/htup_details.h" #include "utils/relcache.h" /* diff --git a/src/include/executor/tuptable.h b/src/include/executor/tuptable.h index 4db8c878c0..19c83fe75b 100644 --- a/src/include/executor/tuptable.h +++ b/src/include/executor/tuptable.h @@ -15,6 +15,7 @@ #define TUPTABLE_H #include "access/htup.h" +#include "access/tupdesc.h" #include "storage/buf.h" /*---------- diff --git a/src/include/utils/inval.h b/src/include/utils/inval.h index c8815e52eb..c5549a6212 100644 --- a/src/include/utils/inval.h +++ b/src/include/utils/inval.h @@ -15,6 +15,7 @@ #define INVAL_H #include "access/htup.h" +#include "storage/relfilenode.h" #include "utils/relcache.h" diff --git a/src/include/utils/lsyscache.h b/src/include/utils/lsyscache.h index 4bf1029e10..e88aa1ac06 100644 --- a/src/include/utils/lsyscache.h +++ b/src/include/utils/lsyscache.h @@ -13,7 +13,9 @@ #ifndef LSYSCACHE_H #define LSYSCACHE_H +#include "access/attnum.h" #include "access/htup.h" +#include "nodes/pg_list.h" /* Result list element for get_op_btree_interpretation */ typedef struct OpBtreeInterpretation diff --git a/src/pl/plperl/plperl.c b/src/pl/plperl/plperl.c index 4415efafec..cf83cc6372 100644 --- a/src/pl/plperl/plperl.c +++ b/src/pl/plperl/plperl.c @@ -16,6 +16,7 @@ #include /* postgreSQL stuff */ +#include "access/htup_details.h" #include "access/xact.h" #include "catalog/pg_language.h" #include "catalog/pg_proc.h" diff --git a/src/pl/plpgsql/src/pl_comp.c b/src/pl/plpgsql/src/pl_comp.c index 0dc0e0b37e..35f5721371 100644 --- a/src/pl/plpgsql/src/pl_comp.c +++ b/src/pl/plpgsql/src/pl_comp.c @@ -17,6 +17,7 @@ #include +#include "access/htup_details.h" #include "catalog/namespace.h" #include "catalog/pg_proc.h" #include "catalog/pg_proc_fn.h" diff --git a/src/pl/plpgsql/src/pl_exec.c b/src/pl/plpgsql/src/pl_exec.c index 8b649a4e5d..3b5b3bbae2 100644 --- a/src/pl/plpgsql/src/pl_exec.c +++ b/src/pl/plpgsql/src/pl_exec.c @@ -17,6 +17,7 @@ #include +#include "access/htup_details.h" #include "access/transam.h" #include "access/tupconvert.h" #include "catalog/pg_proc.h" diff --git a/src/pl/plpgsql/src/pl_handler.c b/src/pl/plpgsql/src/pl_handler.c index 63c3abd9b0..fa74e7d7a5 100644 --- a/src/pl/plpgsql/src/pl_handler.c +++ b/src/pl/plpgsql/src/pl_handler.c @@ -15,6 +15,7 @@ #include "plpgsql.h" +#include "access/htup_details.h" #include "catalog/pg_proc.h" #include "catalog/pg_type.h" #include "funcapi.h" diff --git a/src/pl/plpython/plpy_exec.c b/src/pl/plpython/plpy_exec.c index 96ee26c35c..b2425edd6b 100644 --- a/src/pl/plpython/plpy_exec.c +++ b/src/pl/plpython/plpy_exec.c @@ -6,6 +6,7 @@ #include "postgres.h" +#include "access/htup_details.h" #include "access/xact.h" #include "catalog/pg_type.h" #include "commands/trigger.h" diff --git a/src/pl/plpython/plpy_main.c b/src/pl/plpython/plpy_main.c index 494ec37ea7..8b61f1a972 100644 --- a/src/pl/plpython/plpy_main.c +++ b/src/pl/plpython/plpy_main.c @@ -6,6 +6,7 @@ #include "postgres.h" +#include "access/htup_details.h" #include "catalog/pg_proc.h" #include "catalog/pg_type.h" #include "commands/trigger.h" diff --git a/src/pl/plpython/plpy_procedure.c b/src/pl/plpython/plpy_procedure.c index 7fb5f00e0f..a28cb9a41f 100644 --- a/src/pl/plpython/plpy_procedure.c +++ b/src/pl/plpython/plpy_procedure.c @@ -6,6 +6,7 @@ #include "postgres.h" +#include "access/htup_details.h" #include "access/transam.h" #include "funcapi.h" #include "catalog/pg_proc.h" diff --git a/src/pl/plpython/plpy_spi.c b/src/pl/plpython/plpy_spi.c index 00156e6658..a65af37e65 100644 --- a/src/pl/plpython/plpy_spi.c +++ b/src/pl/plpython/plpy_spi.c @@ -6,6 +6,7 @@ #include "postgres.h" +#include "access/htup_details.h" #include "access/xact.h" #include "catalog/pg_type.h" #include "executor/spi_priv.h" diff --git a/src/pl/plpython/plpy_typeio.c b/src/pl/plpython/plpy_typeio.c index 2cc7bbbd4d..2402c151a4 100644 --- a/src/pl/plpython/plpy_typeio.c +++ b/src/pl/plpython/plpy_typeio.c @@ -6,6 +6,7 @@ #include "postgres.h" +#include "access/htup_details.h" #include "access/transam.h" #include "catalog/pg_type.h" #include "funcapi.h" diff --git a/src/pl/plpython/plpy_typeio.h b/src/pl/plpython/plpy_typeio.h index d2dfa66e0b..82e472a312 100644 --- a/src/pl/plpython/plpy_typeio.h +++ b/src/pl/plpython/plpy_typeio.h @@ -6,6 +6,7 @@ #define PLPY_TYPEIO_H #include "access/htup.h" +#include "access/tupdesc.h" #include "fmgr.h" #include "storage/itemptr.h" diff --git a/src/pl/tcl/pltcl.c b/src/pl/tcl/pltcl.c index ecde90626b..d329e9def8 100644 --- a/src/pl/tcl/pltcl.c +++ b/src/pl/tcl/pltcl.c @@ -18,6 +18,7 @@ #define CONST84 #endif +#include "access/htup_details.h" #include "access/xact.h" #include "catalog/pg_proc.h" #include "catalog/pg_type.h"