PostgreSQL Source Code  git master
htup_details.h File Reference
#include "access/htup.h"
#include "access/tupdesc.h"
#include "access/tupmacs.h"
#include "access/transam.h"
#include "storage/bufpage.h"
Include dependency graph for htup_details.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Data Structures

struct  HeapTupleFields
 
struct  DatumTupleFields
 
struct  HeapTupleHeaderData
 
struct  MinimalTupleData
 

Macros

#define MaxTupleAttributeNumber   1664 /* 8 * 208 */
 
#define MaxHeapAttributeNumber   1600 /* 8 * 200 */
 
#define FIELDNO_HEAPTUPLEHEADERDATA_INFOMASK2   2
 
#define FIELDNO_HEAPTUPLEHEADERDATA_INFOMASK   3
 
#define FIELDNO_HEAPTUPLEHEADERDATA_HOFF   4
 
#define FIELDNO_HEAPTUPLEHEADERDATA_BITS   5
 
#define SizeofHeapTupleHeader   offsetof(HeapTupleHeaderData, t_bits)
 
#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 */
 
#define HEAP_XMAX_KEYSHR_LOCK   0x0010 /* xmax is a key-shared locker */
 
#define HEAP_COMBOCID   0x0020 /* t_cid is a combo cid */
 
#define HEAP_XMAX_EXCL_LOCK   0x0040 /* xmax is exclusive locker */
 
#define HEAP_XMAX_LOCK_ONLY   0x0080 /* xmax, if valid, is only a locker */
 
#define HEAP_XMAX_SHR_LOCK   (HEAP_XMAX_EXCL_LOCK | HEAP_XMAX_KEYSHR_LOCK)
 
#define HEAP_LOCK_MASK
 
#define HEAP_XMIN_COMMITTED   0x0100 /* t_xmin committed */
 
#define HEAP_XMIN_INVALID   0x0200 /* t_xmin invalid/aborted */
 
#define HEAP_XMIN_FROZEN   (HEAP_XMIN_COMMITTED|HEAP_XMIN_INVALID)
 
#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
 
#define HEAP_MOVED_IN
 
#define HEAP_MOVED   (HEAP_MOVED_OFF | HEAP_MOVED_IN)
 
#define HEAP_XACT_MASK   0xFFF0 /* visibility-related bits */
 
#define HEAP_XMAX_IS_LOCKED_ONLY(infomask)
 
#define HEAP_LOCKED_UPGRADED(infomask)
 
#define HEAP_XMAX_IS_SHR_LOCKED(infomask)   (((infomask) & HEAP_LOCK_MASK) == HEAP_XMAX_SHR_LOCK)
 
#define HEAP_XMAX_IS_EXCL_LOCKED(infomask)   (((infomask) & HEAP_LOCK_MASK) == HEAP_XMAX_EXCL_LOCK)
 
#define HEAP_XMAX_IS_KEYSHR_LOCKED(infomask)   (((infomask) & HEAP_LOCK_MASK) == HEAP_XMAX_KEYSHR_LOCK)
 
#define HEAP_XMAX_BITS
 
#define HEAP_NATTS_MASK   0x07FF /* 11 bits for number of attributes */
 
#define HEAP_KEYS_UPDATED
 
#define HEAP_HOT_UPDATED   0x4000 /* tuple was HOT-updated */
 
#define HEAP_ONLY_TUPLE   0x8000 /* this is heap-only tuple */
 
#define HEAP2_XACT_MASK   0xE000 /* visibility-related bits */
 
#define HEAP_TUPLE_HAS_MATCH   HEAP_ONLY_TUPLE /* tuple has a join match */
 
#define HeapTupleHeaderGetRawXmin(tup)
 
#define HeapTupleHeaderGetXmin(tup)
 
#define HeapTupleHeaderSetXmin(tup, xid)
 
#define HeapTupleHeaderXminCommitted(tup)
 
#define HeapTupleHeaderXminInvalid(tup)
 
#define HeapTupleHeaderXminFrozen(tup)
 
#define HeapTupleHeaderSetXminCommitted(tup)
 
#define HeapTupleHeaderSetXminInvalid(tup)
 
#define HeapTupleHeaderSetXminFrozen(tup)
 
#define HeapTupleHeaderGetUpdateXid(tup)
 
#define HeapTupleHeaderGetRawXmax(tup)
 
#define HeapTupleHeaderSetXmax(tup, xid)
 
#define HeapTupleHeaderGetRawCommandId(tup)
 
#define HeapTupleHeaderSetCmin(tup, cid)
 
#define HeapTupleHeaderSetCmax(tup, cid, iscombo)
 
#define HeapTupleHeaderGetXvac(tup)
 
#define HeapTupleHeaderSetXvac(tup, xid)
 
#define HeapTupleHeaderIsSpeculative(tup)
 
#define HeapTupleHeaderGetSpeculativeToken(tup)
 
#define HeapTupleHeaderSetSpeculativeToken(tup, token)
 
#define HeapTupleHeaderIndicatesMovedPartitions(tup)
 
#define HeapTupleHeaderSetMovedPartitions(tup)   ItemPointerSet(&(tup)->t_ctid, MovedPartitionsBlockNumber, MovedPartitionsOffsetNumber)
 
#define HeapTupleHeaderGetDatumLength(tup)   VARSIZE(tup)
 
#define HeapTupleHeaderSetDatumLength(tup, len)   SET_VARSIZE(tup, len)
 
#define HeapTupleHeaderGetTypeId(tup)
 
#define HeapTupleHeaderSetTypeId(tup, typeid)
 
#define HeapTupleHeaderGetTypMod(tup)
 
#define HeapTupleHeaderSetTypMod(tup, typmod)
 
#define HeapTupleHeaderGetOid(tup)
 
#define HeapTupleHeaderSetOid(tup, oid)
 
#define HeapTupleHeaderIsHotUpdated(tup)
 
#define HeapTupleHeaderSetHotUpdated(tup)
 
#define HeapTupleHeaderClearHotUpdated(tup)
 
#define HeapTupleHeaderIsHeapOnly(tup)
 
#define HeapTupleHeaderSetHeapOnly(tup)
 
#define HeapTupleHeaderClearHeapOnly(tup)
 
#define HeapTupleHeaderHasMatch(tup)
 
#define HeapTupleHeaderSetMatch(tup)
 
#define HeapTupleHeaderClearMatch(tup)
 
#define HeapTupleHeaderGetNatts(tup)   ((tup)->t_infomask2 & HEAP_NATTS_MASK)
 
#define HeapTupleHeaderSetNatts(tup, natts)
 
#define HeapTupleHeaderHasExternal(tup)   (((tup)->t_infomask & HEAP_HASEXTERNAL) != 0)
 
#define BITMAPLEN(NATTS)   (((int)(NATTS) + 7) / 8)
 
#define MaxHeapTupleSize   (BLCKSZ - MAXALIGN(SizeOfPageHeaderData + sizeof(ItemIdData)))
 
#define MinHeapTupleSize   MAXALIGN(SizeofHeapTupleHeader)
 
#define MaxHeapTuplesPerPage
 
#define MaxAttrSize   (10 * 1024 * 1024)
 
#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)
 
#define SizeofMinimalTupleHeader   offsetof(MinimalTupleData, t_bits)
 
#define GETSTRUCT(TUP)   ((char *) ((TUP)->t_data) + (TUP)->t_data->t_hoff)
 
#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))
 
#define fastgetattr(tup, attnum, tupleDesc, isnull)
 
#define heap_getattr(tup, attnum, tupleDesc, isnull)
 

Typedefs

typedef struct HeapTupleFields HeapTupleFields
 
typedef struct DatumTupleFields DatumTupleFields
 

Functions

Size heap_compute_data_size (TupleDesc tupleDesc, Datum *values, bool *isnull)
 
void heap_fill_tuple (TupleDesc tupleDesc, Datum *values, bool *isnull, char *data, Size data_size, uint16 *infomask, bits8 *bit)
 
bool heap_attisnull (HeapTuple tup, int attnum, TupleDesc tupleDesc)
 
Datum nocachegetattr (HeapTuple tup, int attnum, TupleDesc att)
 
Datum heap_getsysattr (HeapTuple tup, int attnum, TupleDesc tupleDesc, bool *isnull)
 
HeapTuple heap_copytuple (HeapTuple tuple)
 
void heap_copytuple_with_tuple (HeapTuple src, HeapTuple dest)
 
Datum heap_copy_tuple_as_datum (HeapTuple tuple, TupleDesc tupleDesc)
 
HeapTuple heap_form_tuple (TupleDesc tupleDescriptor, Datum *values, bool *isnull)
 
HeapTuple heap_modify_tuple (HeapTuple tuple, TupleDesc tupleDesc, Datum *replValues, bool *replIsnull, bool *doReplace)
 
HeapTuple heap_modify_tuple_by_cols (HeapTuple tuple, TupleDesc tupleDesc, int nCols, int *replCols, Datum *replValues, bool *replIsnull)
 
void heap_deform_tuple (HeapTuple tuple, TupleDesc tupleDesc, Datum *values, bool *isnull)
 
void heap_freetuple (HeapTuple htup)
 
MinimalTuple heap_form_minimal_tuple (TupleDesc tupleDescriptor, Datum *values, bool *isnull)
 
void heap_free_minimal_tuple (MinimalTuple mtup)
 
MinimalTuple heap_copy_minimal_tuple (MinimalTuple mtup)
 
HeapTuple heap_tuple_from_minimal_tuple (MinimalTuple mtup)
 
MinimalTuple minimal_tuple_from_heap_tuple (HeapTuple htup)
 
size_t varsize_any (void *p)
 
HeapTuple heap_expand_tuple (HeapTuple sourceTuple, TupleDesc tupleDesc)
 
MinimalTuple minimal_expand_tuple (HeapTuple sourceTuple, TupleDesc tupleDesc)
 

Macro Definition Documentation

◆ BITMAPLEN

◆ fastgetattr

#define fastgetattr (   tup,
  attnum,
  tupleDesc,
  isnull 
)
Value:
( \
AssertMacro((attnum) > 0), \
(*(isnull) = false), \
HeapTupleNoNulls(tup) ? \
( \
TupleDescAttr((tupleDesc), (attnum)-1)->attcacheoff >= 0 ? \
( \
fetchatt(TupleDescAttr((tupleDesc), (attnum)-1), \
(char *) (tup)->t_data + (tup)->t_data->t_hoff + \
TupleDescAttr((tupleDesc), (attnum)-1)->attcacheoff)\
) \
: \
) \
: \
( \
att_isnull((attnum)-1, (tup)->t_data->t_bits) ? \
( \
(*(isnull) = true), \
(Datum)NULL \
) \
: \
( \
nocachegetattr((tup), (attnum), (tupleDesc)) \
) \
) \
)
#define TupleDescAttr(tupdesc, i)
Definition: tupdesc.h:93
uintptr_t Datum
Definition: postgres.h:367
int16 attnum
Definition: pg_attribute.h:79
Datum nocachegetattr(HeapTuple tup, int attnum, TupleDesc att)
Definition: heaptuple.c:462

Definition at line 731 of file htup_details.h.

Referenced by AttrDefaultFetch(), CatalogCacheComputeTupleHashValue(), CheckConstraintFetch(), CloneForeignKeyConstraints(), extractRelOptions(), heapgettup_pagemode(), load_domaintype_info(), MergeWithExistingConstraint(), pg_get_triggerdef_worker(), RelationBuildTriggers(), RelationGetExclusionInfo(), RelationGetFKeyList(), RelationInitIndexAccessInfo(), RelidByRelfilenode(), ReorderBufferToastAppendChunk(), ReorderBufferToastReplace(), toast_fetch_datum(), and toast_fetch_datum_slice().

◆ FIELDNO_HEAPTUPLEHEADERDATA_BITS

#define FIELDNO_HEAPTUPLEHEADERDATA_BITS   5

Definition at line 175 of file htup_details.h.

Referenced by slot_compile_deform().

◆ FIELDNO_HEAPTUPLEHEADERDATA_HOFF

#define FIELDNO_HEAPTUPLEHEADERDATA_HOFF   4

Definition at line 170 of file htup_details.h.

Referenced by slot_compile_deform().

◆ FIELDNO_HEAPTUPLEHEADERDATA_INFOMASK

#define FIELDNO_HEAPTUPLEHEADERDATA_INFOMASK   3

Definition at line 167 of file htup_details.h.

Referenced by slot_compile_deform().

◆ FIELDNO_HEAPTUPLEHEADERDATA_INFOMASK2

#define FIELDNO_HEAPTUPLEHEADERDATA_INFOMASK2   2

Definition at line 164 of file htup_details.h.

Referenced by slot_compile_deform().

◆ GETSTRUCT

#define GETSTRUCT (   TUP)    ((char *) ((TUP)->t_data) + (TUP)->t_data->t_hoff)

Definition at line 668 of file htup_details.h.

Referenced by _int_matchsel(), aclitemout(), add_cast_to(), add_function_defaults(), AddEnumLabel(), AddRoleMems(), AfterTriggerSetState(), AggregateCreate(), AlterCollation(), AlterConstraintNamespaces(), AlterDatabaseOwner(), AlterDomainAddConstraint(), AlterDomainDefault(), AlterDomainDropConstraint(), AlterDomainNotNull(), AlterDomainValidateConstraint(), AlterEventTrigger(), AlterEventTriggerOwner_internal(), AlterExtensionNamespace(), AlterForeignDataWrapper(), AlterForeignDataWrapperOwner_internal(), AlterForeignServer(), AlterForeignServerOwner_internal(), AlterFunction(), AlterObjectNamespace_internal(), AlterObjectRename_internal(), AlterOperator(), AlterPublicationOptions(), AlterPublicationOwner_internal(), AlterPublicationTables(), AlterRelationNamespaceInternal(), AlterRole(), AlterRoleSet(), AlterSchemaOwner_internal(), AlterSeqNamespaces(), AlterSequence(), AlterSubscriptionOwner_internal(), AlterTableMoveAll(), AlterTSDictionary(), AlterTypeNamespaceInternal(), AlterTypeOwner(), AlterTypeOwner_oid(), AlterTypeOwnerInternal(), amvalidate(), appendAggOrderBy(), appendFunctionName(), ApplyExtensionUpdates(), assignOperTypes(), assignProcTypes(), ATAddForeignKeyConstraint(), ATExecAddColumn(), ATExecAddIdentity(), ATExecAddOf(), ATExecAlterColumnGenericOptions(), ATExecAlterColumnType(), ATExecAlterConstraint(), ATExecChangeOwner(), ATExecDetachPartition(), ATExecDisableRowSecurity(), ATExecDropColumn(), ATExecDropConstraint(), ATExecDropIdentity(), ATExecDropNotNull(), ATExecDropOf(), ATExecEnableRowSecurity(), ATExecForceNoForceRowSecurity(), ATExecGenericOptions(), ATExecSetIdentity(), ATExecSetNotNull(), ATExecSetOptions(), ATExecSetStatistics(), ATExecSetStorage(), ATExecSetTableSpace(), ATExecValidateConstraint(), ATPostAlterTypeCleanup(), ATPrepAlterColumnType(), ATPrepChangePersistence(), AttrDefaultFetch(), blvalidate(), booltestsel(), boot_openrel(), brinvalidate(), btvalidate(), build_coercion_expression(), build_datatype(), build_function_result_tupdesc_t(), BuildEventTriggerCache(), BuildIndexValueDescription(), CacheInvalidateHeapTuple(), CacheInvalidateRelcacheByTuple(), calc_arraycontsel(), calc_rangesel(), call_pltcl_start_proc(), change_owner_fix_column_acls(), change_owner_recurse_to_sequences(), changeDependencyFor(), check_amop_signature(), check_amproc_signature(), check_enable_rls(), check_for_column_name_collision(), check_hash_func_signature(), check_of_type(), check_role(), check_session_authorization(), check_TSCurrentConfig(), CheckConstraintFetch(), checkDomainOwner(), checkEnumOwner(), CheckFunctionValidatorAccess(), CheckIndexCompatible(), CheckMyDatabase(), checkSharedDependencies(), CloneForeignKeyConstraints(), CloneRowTriggersToPartition(), cluster(), cluster_rel(), CollationIsVisible(), column_privilege_check(), compatible_oper(), compile_plperl_function(), compile_pltcl_function(), compute_return_type(), ComputeIndexAttrs(), ComputePartitionAttrs(), ConstraintNameIsUsed(), constraints_equivalent(), ConstraintSetParentConstraint(), ConstructTupleDescriptor(), ConversionIsVisible(), copy_heap_data(), create_toast_table(), CreateCast(), CreateFunction(), CreateInheritance(), CreateRole(), CreateSchemaCommand(), CreateStatistics(), CreateTransform(), CreateTrigger(), decompile_conbin(), DefineCollation(), DefineDomain(), DefineIndex(), DefineOpClass(), DefineQueryRewrite(), DefineTSConfiguration(), DefineType(), deleteDependencyRecordsFor(), deleteDependencyRecordsForClass(), DeleteInheritsTuple(), deparseOpExpr(), deparseScalarArrayOpExpr(), do_autovacuum(), do_compile(), do_setval(), drop_parent_dependency(), DropConfigurationMapping(), DropRole(), EnableDisableRule(), EnableDisableTrigger(), enum_cmp_internal(), enum_out(), enum_send(), eqjoinsel_inner(), eqjoinsel_semi(), equality_ops_are_compatible(), errdatatype(), estimate_hash_bucket_stats(), evaluate_function(), examine_attribute(), exec_object_restorecon(), ExecGrant_Attribute(), ExecGrant_Database(), ExecGrant_Fdw(), ExecGrant_ForeignServer(), ExecGrant_Function(), ExecGrant_Language(), ExecGrant_Largeobject(), ExecGrant_Namespace(), ExecGrant_Relation(), ExecGrant_Tablespace(), ExecGrant_Type(), ExecInitAgg(), ExecuteDoStmt(), expand_all_col_privileges(), expand_function_arguments(), expand_vacuum_rel(), extract_autovac_opts(), extractRelOptions(), fetch_agg_sort_op(), fetch_fp_info(), fetch_statentries_for_relation(), find_coercion_pathway(), find_composite_type_dependencies(), find_inheritance_children(), find_language_template(), find_typmod_coercion_function(), FindDefaultConversion(), findDependentObjects(), finish_heap_swap(), fixup_whole_row_references(), fmgr_info_cxt_security(), fmgr_info_other_lang(), fmgr_security_definer(), fmgr_sql_validator(), fmgr_symbol(), format_operator_internal(), format_operator_parts(), format_procedure_internal(), format_procedure_parts(), format_type_extended(), func_get_detail(), func_parallel(), func_strict(), func_volatile(), FuncNameAsType(), FuncnameGetCandidates(), FunctionIsVisible(), generate_collation_name(), generate_function_name(), generate_operator_clause(), generate_operator_name(), generate_qualified_relation_name(), generate_qualified_type_name(), generate_relation_name(), generateClonedExtStatsStmt(), generateClonedIndexStmt(), get_agg_clause_costs_walker(), get_all_vacuum_rels(), get_am_name(), get_am_type_oid(), get_array_type(), get_attavgwidth(), get_attidentity(), get_attname(), get_attnum(), get_attstatsslot(), get_atttype(), get_atttypetypmodcoll(), get_atttypmod(), get_base_element_type(), get_collation(), get_collation_name(), get_commutator(), get_compatible_hash_operators(), get_constraint_index(), get_constraint_name(), get_database_list(), get_database_name(), get_db_info(), get_default_partition_oid(), get_domain_constraint_oid(), get_element_type(), get_extension_name(), get_extension_schema(), get_func_arg_info(), get_func_cost(), get_func_leakproof(), get_func_name(), get_func_namespace(), get_func_nargs(), get_func_prokind(), get_func_retset(), get_func_rettype(), get_func_rows(), get_func_signature(), get_func_trftypes(), get_func_variadictype(), get_index_constraint(), get_language_name(), get_mergejoin_opfamilies(), get_namespace_name(), get_negator(), get_object_address_type(), get_op_btree_interpretation(), get_op_hash_functions(), get_op_opfamily_properties(), get_op_opfamily_sortfamily(), get_op_opfamily_strategy(), get_op_rettype(), get_opclass(), get_opclass_family(), get_opclass_input_type(), get_opclass_name(), get_opcode(), get_oper_expr(), get_opfamily_member(), get_opfamily_proc(), get_opname(), get_oprjoin(), get_oprrest(), get_ordering_op_for_equality_op(), get_ordering_op_properties(), get_partition_parent_worker(), get_pkey_attnames(), get_primary_key_attnos(), get_publication_name(), get_range_subtype(), get_rel_name(), get_rel_namespace(), get_rel_persistence(), get_rel_relkind(), get_rel_tablespace(), get_rel_type_id(), get_relation_constraint_attnos(), get_relation_constraint_oid(), get_relation_idx_constraint_oid(), get_relation_statistics(), get_relname_relid(), get_rels_with_domain(), get_rewrite_oid(), get_rolespec_name(), get_rte_attribute_is_dropped(), get_rte_attribute_type(), get_subscription_list(), get_subscription_name(), get_tables_to_cluster(), get_tablespace_name(), get_transform_fromsql(), get_transform_tosql(), get_typ_typrelid(), get_typbyval(), get_typcollation(), get_typdefault(), get_type_category_preferred(), get_type_io_data(), get_typisdefined(), get_typlen(), get_typlenbyval(), get_typlenbyvalalign(), get_typmodin(), get_typstorage(), get_typtype(), get_variable_numdistinct(), GetAllTablesPublicationRelations(), getBaseTypeAndTypmod(), getConstraintTypeDescription(), GetDefaultOpClass(), getExtensionOfObject(), GetFdwRoutineByServerId(), GetForeignDataWrapper(), GetForeignServer(), GetForeignServerIdByRelId(), GetForeignTable(), GetIndexAmRoutineByAmId(), getObjectDescription(), getObjectIdentityParts(), getOpFamilyDescription(), getOpFamilyIdentity(), getOwnedSequences(), getProcedureTypeDescription(), GetPublication(), GetPublicationRelations(), getRelationDescription(), getRelationIdentity(), GetRelationPublicationActions(), GetRelationPublications(), getRelationTypeDescription(), GetSubscription(), GetSubscriptionNotReadyRelations(), GetSubscriptionRelations(), gettype(), getTypeBinaryInputInfo(), getTypeBinaryOutputInfo(), getTypeInputInfo(), getTypeIOParam(), getTypeOutputInfo(), GetUserNameFromId(), ginvalidate(), gistproperty(), gistvalidate(), has_bypassrls_privilege(), has_createrole_privilege(), has_rolinherit(), has_rolreplication(), has_subclass(), hash_ok_operator(), hashvalidate(), have_createdb_privilege(), heap_drop_with_catalog(), heap_truncate_find_FKs(), identify_opfamily_groups(), index_build(), index_check_primary_key(), index_constraint_create(), index_set_state_flags(), index_update_stats(), indexam_property(), IndexGetRelation(), IndexSetParentIndex(), IndexSupportsBackwardScan(), init_sql_fcache(), initialize_peragg(), InitializeSessionUserId(), InitPostgres(), inline_function(), inline_set_returning_function(), internal_get_result_type(), interpret_function_parameter_list(), inv_getsize(), inv_read(), inv_truncate(), inv_write(), is_admin_of_role(), IsBinaryCoercible(), isObjectPinned(), isSharedObjectPinned(), load_domaintype_info(), load_enum_cache_data(), load_rangetype_info(), load_relcache_init_file(), logicalrep_write_tuple(), logicalrep_write_typ(), lookup_collation(), lookup_collation_cache(), lookup_ts_config_cache(), lookup_ts_dictionary_cache(), lookup_ts_parser_cache(), lookup_type_cache(), LookupOpclassInfo(), ltreeparentsel(), make_op(), make_scalar_array_op(), makeConfigurationDependencies(), MakeConfigurationMapping(), makeDictionaryDependencies(), makeOperatorDependencies(), makeParserDependencies(), makeTSTemplateDependencies(), map_sql_table_to_xmlschema(), map_sql_type_to_xml_name(), mark_index_clustered(), MatchNamedCall(), MergeAttributesIntoExisting(), MergeConstraintsIntoExisting(), mergejoinscansel(), MergeWithExistingConstraint(), neqjoinsel(), networkjoinsel_inner(), networkjoinsel_semi(), networksel(), nextval_internal(), nulltestsel(), op_hashjoinable(), op_input_types(), op_mergejoinable(), OpClassCacheLookup(), OpclassIsVisible(), OperatorGet(), OperatorIsVisible(), OperatorUpd(), OpernameGetCandidates(), OpernameGetOprid(), opfamily_can_sort_type(), OpFamilyCacheLookup(), OpfamilyIsVisible(), oprfuncid(), ParseFuncOrColumn(), parseTypeString(), patternsel(), pg_attribute_aclcheck_all(), pg_attribute_aclmask(), pg_class_aclmask(), pg_class_ownercheck(), pg_collation_actual_version(), pg_collation_ownercheck(), pg_conversion_ownercheck(), pg_database_aclmask(), pg_database_ownercheck(), pg_event_trigger_ownercheck(), pg_extension_ownercheck(), pg_foreign_data_wrapper_aclmask(), pg_foreign_data_wrapper_ownercheck(), pg_foreign_server_aclmask(), pg_foreign_server_ownercheck(), pg_get_constraintdef_worker(), pg_get_function_arg_default(), pg_get_function_result(), pg_get_functiondef(), pg_get_indexdef_worker(), pg_get_partkeydef_worker(), pg_get_serial_sequence(), pg_get_statisticsobj_worker(), pg_get_triggerdef_worker(), pg_get_userbyid(), pg_language_aclmask(), pg_language_ownercheck(), pg_largeobject_aclmask_snapshot(), pg_largeobject_ownercheck(), pg_namespace_aclmask(), pg_namespace_ownercheck(), pg_newlocale_from_collation(), pg_opclass_ownercheck(), pg_oper_ownercheck(), pg_opfamily_ownercheck(), pg_proc_aclmask(), pg_proc_ownercheck(), pg_publication_ownercheck(), pg_relation_filenode(), pg_relation_filepath(), pg_relation_is_publishable(), pg_sequence_parameters(), pg_statistics_object_ownercheck(), pg_subscription_ownercheck(), pg_tablespace_aclmask(), pg_tablespace_ownercheck(), pg_ts_config_ownercheck(), pg_ts_dict_ownercheck(), pg_type_aclmask(), pg_type_ownercheck(), pgfdw_reject_incomplete_xact_state_change(), plperl_validator(), plpgsql_compile(), plpgsql_parse_cwordtype(), plpgsql_parse_wordtype(), plpgsql_validator(), plpython_validator(), PLy_procedure_create(), prepare_column_cache(), prepare_sql_fn_parse_info(), print_function_arguments(), print_function_rettype(), ProcedureCreate(), RangeVarCallbackForAlterRelation(), RangeVarCallbackForAttachIndex(), RangeVarCallbackForDropRelation(), RangeVarCallbackForPolicy(), RangeVarCallbackForRenameAttribute(), RangeVarCallbackForRenameRule(), RangeVarCallbackForRenameTrigger(), RangeVarCallbackOwnsRelation(), read_seq_tuple(), recheck_cast_function_args(), recomputeNamespacePath(), recordExtObjInitPriv(), refresh_by_match_merge(), refuseDupeIndexAttach(), regclassout(), regconfigout(), regdictionaryout(), regoperout(), regprocout(), regtypeout(), reindex_index(), ReindexMultipleTables(), relation_mark_replica_identity(), RelationBuildDesc(), RelationBuildPartitionDesc(), RelationBuildPartitionKey(), RelationBuildRuleLock(), RelationBuildTriggers(), RelationBuildTupleDesc(), RelationCacheInitializePhase3(), RelationClearMissing(), RelationGetExclusionInfo(), RelationGetFKeyList(), RelationGetIndexList(), relationHasPrimaryKey(), RelationHasUnloggedIndex(), RelationInitIndexAccessInfo(), RelationInitPhysicalAddr(), RelationIsVisible(), RelationReloadIndexInfo(), RelationReloadNailed(), RelationSetNewRelfilenode(), RemoveAttrDefaultById(), RemoveAttributeById(), RemoveConstraintById(), removeExtObjInitPriv(), RemoveFunctionById(), RemoveInheritance(), RemoveOperatorById(), RemovePolicyById(), RemovePublicationRelById(), RemoveRewriteRuleById(), RemoveRoleFromObjectACL(), RemoveRoleFromObjectPolicy(), RemoveStatisticsById(), RemoveTriggerById(), RemoveTypeById(), rename_constraint_internal(), rename_policy(), renameatt_internal(), RenameConstraintById(), RenameDatabase(), RenameEnumLabel(), RenameRelationInternal(), RenameRewriteRule(), RenameRole(), RenameSchema(), RenameTableSpace(), renametrig(), RenameType(), RenameTypeInternal(), RenumberEnumType(), reorder_function_arguments(), replorigin_by_name(), replorigin_by_oid(), ResetSequence(), ResolveOpClass(), ri_GenerateQualCollation(), ri_LoadConstraintInfo(), roles_has_privs_of(), roles_is_member_of(), scalararraysel_containment(), scalarineqsel(), SearchSysCacheAttName(), SearchSysCacheAttNum(), sepgsql_attribute_post_create(), sepgsql_database_post_create(), sepgsql_proc_post_create(), sepgsql_proc_setattr(), sepgsql_relation_drop(), sepgsql_relation_post_create(), sepgsql_relation_setattr(), sepgsql_schema_post_create(), sequence_options(), sequenceIsOwned(), SetAttrMissing(), SetFunctionArgType(), SetFunctionReturnType(), SetMatViewPopulatedState(), SetRelationHasSubclass(), SetRelationNumChecks(), SetRelationRuleStatus(), shdepChangeDep(), shdepDropDependency(), shdepDropOwned(), shdepReassignOwned(), simplify_function(), sort_order_cmp(), spgvalidate(), SPI_gettype(), StatisticsObjIsVisible(), StoreAttrDefault(), StorePartitionBound(), stringTypeDatum(), superuser_arg(), swap_relation_files(), table_recheck_autovac(), transformArrayType(), transformColumnNameList(), transformColumnType(), transformFkeyCheckAttrs(), transformFkeyGetPrimaryKey(), transformFrameOffset(), triggered_change_notification(), TSConfigIsVisible(), TSDictionaryIsVisible(), TSParserIsVisible(), tsquerysel(), TSTemplateIsVisible(), TupleDescInitEntry(), typeByVal(), TypeCreate(), typeidTypeRelid(), typeInheritsFrom(), typeIsOfTypedTable(), TypeIsVisible(), typeLen(), typenameType(), typenameTypeMod(), typeOrDomainTypeRelid(), typeTypeCollation(), typeTypeName(), typeTypeRelid(), update_default_partition_oid(), update_relispartition(), vac_truncate_clog(), vac_update_datfrozenxid(), vac_update_relstats(), validateCheckConstraint(), validatePartitionedIndex(), var_eq_const(), var_eq_non_const(), and verify_dictoptions().

◆ HEAP2_XACT_MASK

#define HEAP2_XACT_MASK   0xE000 /* visibility-related bits */

◆ HEAP_COMBOCID

#define HEAP_COMBOCID   0x0020 /* t_cid is a combo cid */

◆ heap_getattr

#define heap_getattr (   tup,
  attnum,
  tupleDesc,
  isnull 
)
Value:
( \
((attnum) > 0) ? \
( \
((attnum) > (int) HeapTupleHeaderGetNatts((tup)->t_data)) ? \
( \
(*(isnull) = true), \
(Datum)NULL \
) \
: \
fastgetattr((tup), (attnum), (tupleDesc), (isnull)) \
) \
: \
heap_getsysattr((tup), (attnum), (tupleDesc), (isnull)) \
)
Datum heap_getsysattr(HeapTuple tup, int attnum, TupleDesc tupleDesc, bool *isnull)
Definition: heaptuple.c:666
#define HeapTupleHeaderGetNatts(tup)
Definition: htup_details.h:544
uintptr_t Datum
Definition: postgres.h:367
int16 attnum
Definition: pg_attribute.h:79

Definition at line 781 of file htup_details.h.

Referenced by AlterDatabaseOwner(), AlterForeignDataWrapperOwner_internal(), AlterForeignServerOwner_internal(), AlterObjectNamespace_internal(), AlterObjectOwner_internal(), AlterObjectRename_internal(), AlterPolicy(), AlterSetting(), AlterTableSpaceOptions(), AlterTypeOwnerInternal(), ApplySetting(), BuildEventTriggerCache(), CatalogCacheCreateEntry(), change_owner_fix_column_acls(), CloneRowTriggersToPartition(), comparetup_cluster(), comparetup_heap(), composite_to_json(), composite_to_jsonb(), copytup_cluster(), copytup_heap(), decompile_conbin(), dependency_degree(), EventTriggerSQLDropAddObject(), ExecAlterExtensionStmt(), ExecEvalFieldSelect(), ExecGrant_Database(), ExecGrant_Largeobject(), ExecGrant_Tablespace(), ExecGrant_Type(), ExecScanSubPlan(), ExecSetParamPlan(), extension_config_remove(), find_language_template(), get_primary_key_attnos(), get_relation_constraint_attnos(), GetAttributeByName(), GetAttributeByNum(), GetComment(), GetSecurityLabel(), GetSharedSecurityLabel(), heap_tuple_attr_equals(), ndistinct_for_combination(), pg_event_trigger_ddl_commands(), pg_extension_config_dump(), pg_identify_object(), pg_largeobject_aclmask_snapshot(), plperl_hash_from_tuple(), pltcl_build_tuple_argument(), pltcl_set_tuple_values(), PLyDict_FromTuple(), readtup_cluster(), readtup_heap(), recordExtObjInitPriv(), RelationBuildRowSecurity(), RelationBuildRuleLock(), RelationBuildTupleDesc(), RelationGetIndexExpressions(), RelationGetIndexList(), RelationGetIndexPredicate(), RemoveRoleFromObjectPolicy(), RenameRole(), ri_ExtractValues(), ri_KeysEqual(), sepgsql_relation_setattr_extra(), SPI_getbinval(), SPI_getvalue(), std_fetch_func(), SysCacheGetAttr(), tuple_to_stringinfo(), and validateDomainConstraint().

◆ HEAP_HASEXTERNAL

#define HEAP_HASEXTERNAL   0x0004 /* has external stored attribute(s) */

Definition at line 190 of file htup_details.h.

Referenced by fill_val(), heap_fill_tuple(), and index_form_tuple().

◆ HEAP_HASNULL

#define HEAP_HASNULL   0x0001 /* has null attribute(s) */

◆ HEAP_HASOID

#define HEAP_HASOID   0x0008 /* has an object-id field */

◆ HEAP_HASVARWIDTH

#define HEAP_HASVARWIDTH   0x0002 /* has variable-width attribute(s) */

Definition at line 189 of file htup_details.h.

Referenced by fill_val(), heap_fill_tuple(), and index_form_tuple().

◆ HEAP_HOT_UPDATED

#define HEAP_HOT_UPDATED   0x4000 /* tuple was HOT-updated */

Definition at line 279 of file htup_details.h.

Referenced by heap_prepare_freeze_tuple().

◆ HEAP_KEYS_UPDATED

◆ HEAP_LOCK_MASK

#define HEAP_LOCK_MASK
Value:
HEAP_XMAX_KEYSHR_LOCK)
#define HEAP_XMAX_SHR_LOCK
Definition: htup_details.h:198
#define HEAP_XMAX_EXCL_LOCK
Definition: htup_details.h:194

Definition at line 200 of file htup_details.h.

Referenced by xmax_infomask_changed().

◆ HEAP_LOCKED_UPGRADED

#define HEAP_LOCKED_UPGRADED (   infomask)
Value:
( \
((infomask) & HEAP_XMAX_IS_MULTI) != 0 && \
((infomask) & HEAP_XMAX_LOCK_ONLY) != 0 && \
(((infomask) & (HEAP_XMAX_EXCL_LOCK | HEAP_XMAX_KEYSHR_LOCK)) == 0) \
)
#define HEAP_XMAX_KEYSHR_LOCK
Definition: htup_details.h:192
#define HEAP_XMAX_LOCK_ONLY
Definition: htup_details.h:195
#define HEAP_XMAX_EXCL_LOCK
Definition: htup_details.h:194
#define HEAP_XMAX_IS_MULTI
Definition: htup_details.h:207

Definition at line 251 of file htup_details.h.

Referenced by compute_new_xmax_infomask(), Do_MultiXactIdWait(), DoesMultiXactIdConflict(), FreezeMultiXactId(), heap_lock_updated_tuple_rec(), heap_tuple_needs_freeze(), heap_update(), HeapTupleSatisfiesUpdate(), HeapTupleSatisfiesVacuum(), and pgrowlocks().

◆ HEAP_MOVED

◆ HEAP_MOVED_IN

#define HEAP_MOVED_IN
Value:
0x8000 /* moved from another place by pre-9.0
* VACUUM FULL; kept for binary
* upgrade support */

Definition at line 212 of file htup_details.h.

Referenced by HeapTupleSatisfiesDirty(), HeapTupleSatisfiesMVCC(), HeapTupleSatisfiesSelf(), HeapTupleSatisfiesToast(), HeapTupleSatisfiesUpdate(), and HeapTupleSatisfiesVacuum().

◆ HEAP_MOVED_OFF

#define HEAP_MOVED_OFF
Value:
0x4000 /* moved to another place by pre-9.0
* VACUUM FULL; kept for binary
* upgrade support */

Definition at line 209 of file htup_details.h.

Referenced by heap_prepare_freeze_tuple(), HeapTupleSatisfiesDirty(), HeapTupleSatisfiesMVCC(), HeapTupleSatisfiesSelf(), HeapTupleSatisfiesToast(), HeapTupleSatisfiesUpdate(), and HeapTupleSatisfiesVacuum().

◆ HEAP_NATTS_MASK

#define HEAP_NATTS_MASK   0x07FF /* 11 bits for number of attributes */

◆ HEAP_ONLY_TUPLE

#define HEAP_ONLY_TUPLE   0x8000 /* this is heap-only tuple */

Definition at line 280 of file htup_details.h.

◆ HEAP_TUPLE_HAS_MATCH

#define HEAP_TUPLE_HAS_MATCH   HEAP_ONLY_TUPLE /* tuple has a join match */

Definition at line 290 of file htup_details.h.

◆ HEAP_UPDATED

#define HEAP_UPDATED   0x2000 /* this is UPDATEd version of row */

Definition at line 208 of file htup_details.h.

Referenced by AlterEnum(), heap_update(), and rewrite_heap_tuple().

◆ HEAP_XACT_MASK

#define HEAP_XACT_MASK   0xFFF0 /* visibility-related bits */

◆ HEAP_XMAX_BITS

#define HEAP_XMAX_BITS

◆ HEAP_XMAX_COMMITTED

◆ HEAP_XMAX_EXCL_LOCK

#define HEAP_XMAX_EXCL_LOCK   0x0040 /* xmax is exclusive locker */

◆ HEAP_XMAX_INVALID

◆ HEAP_XMAX_IS_EXCL_LOCKED

#define HEAP_XMAX_IS_EXCL_LOCKED (   infomask)    (((infomask) & HEAP_LOCK_MASK) == HEAP_XMAX_EXCL_LOCK)

◆ HEAP_XMAX_IS_KEYSHR_LOCKED

#define HEAP_XMAX_IS_KEYSHR_LOCKED (   infomask)    (((infomask) & HEAP_LOCK_MASK) == HEAP_XMAX_KEYSHR_LOCK)

◆ HEAP_XMAX_IS_LOCKED_ONLY

◆ HEAP_XMAX_IS_MULTI

◆ HEAP_XMAX_IS_SHR_LOCKED

#define HEAP_XMAX_IS_SHR_LOCKED (   infomask)    (((infomask) & HEAP_LOCK_MASK) == HEAP_XMAX_SHR_LOCK)

◆ HEAP_XMAX_KEYSHR_LOCK

#define HEAP_XMAX_KEYSHR_LOCK   0x0010 /* xmax is a key-shared locker */

◆ HEAP_XMAX_LOCK_ONLY

#define HEAP_XMAX_LOCK_ONLY   0x0080 /* xmax, if valid, is only a locker */

◆ HEAP_XMAX_SHR_LOCK

#define HEAP_XMAX_SHR_LOCK   (HEAP_XMAX_EXCL_LOCK | HEAP_XMAX_KEYSHR_LOCK)

Definition at line 198 of file htup_details.h.

Referenced by compute_new_xmax_infomask(), and GetMultiXactIdHintBits().

◆ HEAP_XMIN_COMMITTED

◆ HEAP_XMIN_FROZEN

#define HEAP_XMIN_FROZEN   (HEAP_XMIN_COMMITTED|HEAP_XMIN_INVALID)

Definition at line 204 of file htup_details.h.

Referenced by heap_prepare_freeze_tuple().

◆ HEAP_XMIN_INVALID

#define HEAP_XMIN_INVALID   0x0200 /* t_xmin invalid/aborted */

◆ HeapTupleAllFixed

#define HeapTupleAllFixed (   tuple)    (!((tuple)->t_data->t_infomask & HEAP_HASVARWIDTH))

Definition at line 683 of file htup_details.h.

◆ HeapTupleClearHeapOnly

#define HeapTupleClearHeapOnly (   tuple)    HeapTupleHeaderClearHeapOnly((tuple)->t_data)

Definition at line 704 of file htup_details.h.

Referenced by heap_update().

◆ HeapTupleClearHotUpdated

#define HeapTupleClearHotUpdated (   tuple)    HeapTupleHeaderClearHotUpdated((tuple)->t_data)

Definition at line 695 of file htup_details.h.

Referenced by heap_update().

◆ HeapTupleGetOid

#define HeapTupleGetOid (   tuple)    HeapTupleHeaderGetOid((tuple)->t_data)

Definition at line 707 of file htup_details.h.

Referenced by AddEnumLabel(), AfterTriggerSetState(), AlterConstraintNamespaces(), AlterDatabase(), AlterDatabaseOwner(), AlterDomainDropConstraint(), AlterDomainValidateConstraint(), AlterEventTrigger(), AlterEventTriggerOwner(), AlterEventTriggerOwner_internal(), AlterForeignDataWrapper(), AlterForeignDataWrapperOwner(), AlterForeignDataWrapperOwner_internal(), AlterForeignServer(), AlterForeignServerOwner(), AlterForeignServerOwner_internal(), AlterObjectOwner_internal(), AlterOpFamily(), AlterPolicy(), AlterPublication(), AlterPublicationOptions(), AlterPublicationOwner(), AlterPublicationOwner_internal(), AlterPublicationTables(), AlterRole(), AlterRoleSet(), AlterSchemaOwner(), AlterSchemaOwner_internal(), AlterSubscription(), AlterSubscriptionOwner(), AlterSubscriptionOwner_internal(), AlterTableMoveAll(), AlterTableSpaceOptions(), AlterTSConfiguration(), AlterTypeOwner(), ATExecAddColumn(), ATExecAddOf(), ATExecAlterColumnType(), ATExecAlterConstraint(), ATExecDropConstraint(), ATExecValidateConstraint(), ATRewriteTable(), boot_openrel(), build_datatype(), CacheInvalidateHeapTuple(), CacheInvalidateRelcacheByTuple(), CatalogCacheComputeTupleHashValue(), check_db_file_conflict(), check_of_type(), check_role(), check_session_authorization(), checkDomainOwner(), checkEnumOwner(), CheckIndexCompatible(), CloneForeignKeyConstraints(), CloneRowTriggersToPartition(), CollationCreate(), compile_plperl_function(), ConversionCreate(), CopyTo(), create_proc_lang(), createdb(), CreateFunction(), CreateRole(), CreateTransform(), decompile_conbin(), DefineDomain(), DefineIndex(), DefineOpClass(), do_autovacuum(), DropConfigurationMapping(), DropRole(), DropSubscription(), DropTableSpace(), EnableDisableRule(), EnableDisableTrigger(), enum_endpoint(), enum_in(), enum_range_internal(), enum_recv(), exec_object_restorecon(), ExecAlterExtensionStmt(), ExecGrant_Database(), ExecGrant_Fdw(), ExecGrant_ForeignServer(), ExecGrant_Language(), ExecGrant_Largeobject(), ExecGrant_Namespace(), ExecuteDoStmt(), ExtractReplicaIdentity(), fetch_statentries_for_relation(), find_typed_table_dependencies(), FuncnameGetCandidates(), get_all_vacuum_rels(), get_am_type_oid(), get_database_list(), get_database_oid(), get_db_info(), get_domain_constraint_oid(), get_extension_oid(), get_object_address_attrdef(), get_object_address_defacl(), get_object_address_opf_member(), get_object_address_usermapping(), get_opclass_oid(), get_opfamily_oid(), get_primary_key_attnos(), get_relation_constraint_attnos(), get_relation_constraint_oid(), get_relation_idx_constraint_oid(), get_relation_policy_oid(), get_rewrite_oid(), get_subscription_list(), get_tablespace_oid(), get_trigger_oid(), GetAllTablesPublicationRelations(), GetAllTablesPublications(), getConstraintTypeDescription(), GetDefaultOpClass(), getRelationsInNamespace(), GetSysCacheOid(), gettype(), getTypeIOParam(), GetUserMapping(), heap_getsysattr(), heap_insert(), heap_modify_tuple(), heap_modify_tuple_by_cols(), heap_prepare_insert(), heap_update(), InitializeSessionUserId(), InitPostgres(), InsertRule(), lazy_scan_heap(), load_enum_cache_data(), lookup_C_func(), lookup_collation(), LookupTypeNameOid(), makeConfigurationDependencies(), MakeConfigurationMapping(), makeDictionaryDependencies(), makeOperatorDependencies(), makeParserDependencies(), makeTSTemplateDependencies(), movedb(), objectsInSchemaToOids(), OperatorGet(), OpernameGetCandidates(), OpernameGetOprid(), oprid(), parseTypeString(), pgstat_collect_oids(), print_function_arguments(), ProcedureCreate(), record_C_func(), reform_and_rewrite_tuple(), ReindexMultipleTables(), RelationBuildDesc(), RelationBuildRuleLock(), RelationBuildTriggers(), RelationGetStatExtList(), RelidByRelfilenode(), remove_dbtablespaces(), RemoveAttrDefault(), rename_policy(), RenameRewriteRule(), RenameRole(), RenameSchema(), RenameTableSpace(), renametrig(), ResolveOpClass(), SetDefaultACL(), SPI_modifytuple(), toast_flatten_tuple(), transformColumnDefinition(), transformColumnType(), transformOfType(), TypeCreate(), typenameTypeId(), typenameTypeIdAndMod(), typeTypeId(), UpdateSubscriptionRelState(), vac_truncate_clog(), and validateCheckConstraint().

◆ HeapTupleHasExternal

◆ HeapTupleHasNulls

#define HeapTupleHasNulls (   tuple)    (((tuple)->t_data->t_infomask & HEAP_HASNULL) != 0)

◆ HeapTupleHasVarWidth

#define HeapTupleHasVarWidth (   tuple)    (((tuple)->t_data->t_infomask & HEAP_HASVARWIDTH) != 0)

Definition at line 680 of file htup_details.h.

Referenced by nocachegetattr().

◆ HeapTupleHeaderClearHeapOnly

#define HeapTupleHeaderClearHeapOnly (   tup)
Value:
( \
(tup)->t_infomask2 &= ~HEAP_ONLY_TUPLE \
)
#define HEAP_ONLY_TUPLE
Definition: htup_details.h:280

Definition at line 524 of file htup_details.h.

◆ HeapTupleHeaderClearHotUpdated

#define HeapTupleHeaderClearHotUpdated (   tup)
Value:
( \
(tup)->t_infomask2 &= ~HEAP_HOT_UPDATED \
)
#define HEAP_HOT_UPDATED
Definition: htup_details.h:279

Definition at line 509 of file htup_details.h.

Referenced by heap_delete(), heap_lock_tuple(), heap_xlog_delete(), heap_xlog_lock(), and heap_xlog_update().

◆ HeapTupleHeaderClearMatch

#define HeapTupleHeaderClearMatch (   tup)
Value:
( \
(tup)->t_infomask2 &= ~HEAP_TUPLE_HAS_MATCH \
)
#define HEAP_TUPLE_HAS_MATCH
Definition: htup_details.h:290

Definition at line 539 of file htup_details.h.

Referenced by ExecHashSkewTableInsert(), ExecHashTableInsert(), ExecHashTableResetMatchFlags(), and ExecParallelHashTableInsertCurrentBatch().

◆ HeapTupleHeaderGetDatumLength

◆ HeapTupleHeaderGetNatts

◆ HeapTupleHeaderGetOid

#define HeapTupleHeaderGetOid (   tup)
Value:
( \
((tup)->t_infomask & HEAP_HASOID) ? \
*((Oid *) ((char *)(tup) + (tup)->t_hoff - sizeof(Oid))) \
: \
)
unsigned int Oid
Definition: postgres_ext.h:31
#define InvalidOid
Definition: postgres_ext.h:36
#define HEAP_HASOID
Definition: htup_details.h:191

Definition at line 477 of file htup_details.h.

Referenced by heap_page_items(), suppress_redundant_updates_trigger(), toast_flatten_tuple_to_datum(), toast_insert_or_update(), and tuple_to_stringinfo().

◆ HeapTupleHeaderGetRawCommandId

#define HeapTupleHeaderGetRawCommandId (   tup)
Value:
( \
(tup)->t_choice.t_heap.t_field3.t_cid \
)

Definition at line 390 of file htup_details.h.

Referenced by heap_getsysattr(), heap_page_items(), HeapTupleHeaderGetCmax(), HeapTupleHeaderGetCmin(), HeapTupleSatisfiesHistoricMVCC(), and log_heap_new_cid().

◆ HeapTupleHeaderGetRawXmax

◆ HeapTupleHeaderGetRawXmin

◆ HeapTupleHeaderGetSpeculativeToken

#define HeapTupleHeaderGetSpeculativeToken (   tup)
Value:
( \
AssertMacro(HeapTupleHeaderIsSpeculative(tup)), \
ItemPointerGetBlockNumber(&(tup)->t_ctid) \
)
#define HeapTupleHeaderIsSpeculative(tup)
Definition: htup_details.h:428

Definition at line 433 of file htup_details.h.

Referenced by HeapTupleSatisfiesDirty().

◆ HeapTupleHeaderGetTypeId

◆ HeapTupleHeaderGetTypMod

◆ HeapTupleHeaderGetUpdateXid

#define HeapTupleHeaderGetUpdateXid (   tup)

◆ HeapTupleHeaderGetXmin

◆ HeapTupleHeaderGetXvac

#define HeapTupleHeaderGetXvac (   tup)

◆ HeapTupleHeaderHasExternal

#define HeapTupleHeaderHasExternal (   tup)    (((tup)->t_infomask & HEAP_HASEXTERNAL) != 0)

Definition at line 552 of file htup_details.h.

Referenced by HeapTupleHeaderGetDatum(), and make_expanded_record_from_datum().

◆ HeapTupleHeaderHasMatch

#define HeapTupleHeaderHasMatch (   tup)
Value:
( \
((tup)->t_infomask2 & HEAP_TUPLE_HAS_MATCH) != 0 \
)
#define HEAP_TUPLE_HAS_MATCH
Definition: htup_details.h:290

Definition at line 529 of file htup_details.h.

Referenced by ExecScanHashTableForUnmatched().

◆ HeapTupleHeaderIndicatesMovedPartitions

#define HeapTupleHeaderIndicatesMovedPartitions (   tup)
Value:
ItemPointerGetBlockNumberNoCheck(&(tup)->t_ctid) == MovedPartitionsBlockNumber)
#define MovedPartitionsOffsetNumber
Definition: itemptr.h:69
#define ItemPointerGetOffsetNumber(pointer)
Definition: itemptr.h:117
#define MovedPartitionsBlockNumber
Definition: itemptr.h:70

Definition at line 444 of file htup_details.h.

Referenced by EvalPlanQualFetch(), heap_get_latest_tid(), heap_get_root_tuples(), heap_lock_updated_tuple(), heap_lock_updated_tuple_rec(), heap_prune_chain(), and rewrite_heap_tuple().

◆ HeapTupleHeaderIsHeapOnly

#define HeapTupleHeaderIsHeapOnly (   tup)
Value:
( \
((tup)->t_infomask2 & HEAP_ONLY_TUPLE) != 0 \
)
#define HEAP_ONLY_TUPLE
Definition: htup_details.h:280

Definition at line 514 of file htup_details.h.

Referenced by heap_abort_speculative(), heap_get_root_tuples(), and heap_prune_chain().

◆ HeapTupleHeaderIsHotUpdated

#define HeapTupleHeaderIsHotUpdated (   tup)
Value:
( \
((tup)->t_infomask2 & HEAP_HOT_UPDATED) != 0 && \
((tup)->t_infomask & HEAP_XMAX_INVALID) == 0 && \
)
#define HeapTupleHeaderXminInvalid(tup)
Definition: htup_details.h:328
#define HEAP_XMAX_INVALID
Definition: htup_details.h:206
#define HEAP_HOT_UPDATED
Definition: htup_details.h:279

Definition at line 497 of file htup_details.h.

Referenced by heap_get_root_tuples(), and heap_prune_chain().

◆ HeapTupleHeaderIsSpeculative

#define HeapTupleHeaderIsSpeculative (   tup)
Value:
( \
)
#define ItemPointerGetOffsetNumberNoCheck(pointer)
Definition: itemptr.h:108
#define SpecTokenOffsetNumber
Definition: itemptr.h:63

Definition at line 428 of file htup_details.h.

Referenced by EvalPlanQualFetch(), heap_abort_speculative(), heap_finish_speculative(), heap_mask(), HeapTupleSatisfiesDirty(), and RelationPutHeapTuple().

◆ HeapTupleHeaderSetCmax

#define HeapTupleHeaderSetCmax (   tup,
  cid,
  iscombo 
)
Value:
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 HEAP_MOVED
Definition: htup_details.h:215
#define HEAP_COMBOCID
Definition: htup_details.h:193

Definition at line 404 of file htup_details.h.

Referenced by heap_delete(), heap_update(), heap_xlog_delete(), heap_xlog_lock(), and heap_xlog_update().

◆ HeapTupleHeaderSetCmin

#define HeapTupleHeaderSetCmin (   tup,
  cid 
)
Value:
do { \
Assert(!((tup)->t_infomask & HEAP_MOVED)); \
(tup)->t_choice.t_heap.t_field3.t_cid = (cid); \
(tup)->t_infomask &= ~HEAP_COMBOCID; \
} while (0)
#define HEAP_MOVED
Definition: htup_details.h:215
#define HEAP_COMBOCID
Definition: htup_details.h:193

Definition at line 396 of file htup_details.h.

Referenced by apply_returning_filter(), fill_seq_with_data(), heap_prepare_insert(), heap_update(), heap_xlog_insert(), heap_xlog_multi_insert(), heap_xlog_update(), and make_tuple_from_result_row().

◆ HeapTupleHeaderSetDatumLength

#define HeapTupleHeaderSetDatumLength (   tup,
  len 
)    SET_VARSIZE(tup, len)

◆ HeapTupleHeaderSetHeapOnly

#define HeapTupleHeaderSetHeapOnly (   tup)
Value:
( \
(tup)->t_infomask2 |= HEAP_ONLY_TUPLE \
)
#define HEAP_ONLY_TUPLE
Definition: htup_details.h:280

Definition at line 519 of file htup_details.h.

◆ HeapTupleHeaderSetHotUpdated

#define HeapTupleHeaderSetHotUpdated (   tup)
Value:
( \
(tup)->t_infomask2 |= HEAP_HOT_UPDATED \
)
#define HEAP_HOT_UPDATED
Definition: htup_details.h:279

Definition at line 504 of file htup_details.h.

Referenced by heap_xlog_update().

◆ HeapTupleHeaderSetMatch

#define HeapTupleHeaderSetMatch (   tup)
Value:
( \
(tup)->t_infomask2 |= HEAP_TUPLE_HAS_MATCH \
)
#define HEAP_TUPLE_HAS_MATCH
Definition: htup_details.h:290

Definition at line 534 of file htup_details.h.

Referenced by ExecHashJoinImpl().

◆ HeapTupleHeaderSetMovedPartitions

#define HeapTupleHeaderSetMovedPartitions (   tup)    ItemPointerSet(&(tup)->t_ctid, MovedPartitionsBlockNumber, MovedPartitionsOffsetNumber)

Definition at line 448 of file htup_details.h.

Referenced by heap_delete(), and heap_xlog_delete().

◆ HeapTupleHeaderSetNatts

#define HeapTupleHeaderSetNatts (   tup,
  natts 
)
Value:
( \
(tup)->t_infomask2 = ((tup)->t_infomask2 & ~HEAP_NATTS_MASK) | (natts) \
)
#define HEAP_NATTS_MASK
Definition: htup_details.h:275

Definition at line 547 of file htup_details.h.

Referenced by ER_flatten_into(), expand_tuple(), heap_form_minimal_tuple(), heap_form_tuple(), toast_flatten_tuple_to_datum(), and toast_insert_or_update().

◆ HeapTupleHeaderSetOid

#define HeapTupleHeaderSetOid (   tup,
  oid 
)
Value:
do { \
Assert((tup)->t_infomask & HEAP_HASOID); \
*((Oid *) ((char *)(tup) + (tup)->t_hoff - sizeof(Oid))) = (oid); \
} while (0)
unsigned int Oid
Definition: postgres_ext.h:31
#define HEAP_HASOID
Definition: htup_details.h:191

Definition at line 485 of file htup_details.h.

Referenced by suppress_redundant_updates_trigger(), toast_flatten_tuple_to_datum(), and toast_insert_or_update().

◆ HeapTupleHeaderSetSpeculativeToken

#define HeapTupleHeaderSetSpeculativeToken (   tup,
  token 
)
Value:
( \
ItemPointerSet(&(tup)->t_ctid, token, SpecTokenOffsetNumber) \
)
#define SpecTokenOffsetNumber
Definition: itemptr.h:63

Definition at line 439 of file htup_details.h.

Referenced by ExecInsert().

◆ HeapTupleHeaderSetTypeId

#define HeapTupleHeaderSetTypeId (   tup,
  typeid 
)
Value:
( \
(tup)->t_choice.t_datum.datum_typeid = (typeid) \
)

Definition at line 462 of file htup_details.h.

Referenced by ER_flatten_into(), ExecEvalWholeRowVar(), expand_tuple(), heap_copy_tuple_as_datum(), heap_form_tuple(), and toast_flatten_tuple_to_datum().

◆ HeapTupleHeaderSetTypMod

#define HeapTupleHeaderSetTypMod (   tup,
  typmod 
)
Value:
( \
(tup)->t_choice.t_datum.datum_typmod = (typmod) \
)

Definition at line 472 of file htup_details.h.

Referenced by ER_flatten_into(), ExecEvalWholeRowVar(), expand_tuple(), heap_copy_tuple_as_datum(), heap_form_tuple(), and toast_flatten_tuple_to_datum().

◆ HeapTupleHeaderSetXmax

◆ HeapTupleHeaderSetXmin

#define HeapTupleHeaderSetXmin (   tup,
  xid 
)

◆ HeapTupleHeaderSetXminCommitted

#define HeapTupleHeaderSetXminCommitted (   tup)
Value:
( \
AssertMacro(!HeapTupleHeaderXminInvalid(tup)), \
((tup)->t_infomask |= HEAP_XMIN_COMMITTED) \
)
#define HeapTupleHeaderXminInvalid(tup)
Definition: htup_details.h:328
#define HEAP_XMIN_COMMITTED
Definition: htup_details.h:202

Definition at line 339 of file htup_details.h.

◆ HeapTupleHeaderSetXminFrozen

#define HeapTupleHeaderSetXminFrozen (   tup)
Value:
( \
AssertMacro(!HeapTupleHeaderXminInvalid(tup)), \
((tup)->t_infomask |= HEAP_XMIN_FROZEN) \
)
#define HEAP_XMIN_FROZEN
Definition: htup_details.h:204
#define HeapTupleHeaderXminInvalid(tup)
Definition: htup_details.h:328

Definition at line 351 of file htup_details.h.

Referenced by fill_seq_with_data(), and heap_prepare_insert().

◆ HeapTupleHeaderSetXminInvalid

#define HeapTupleHeaderSetXminInvalid (   tup)
Value:
( \
AssertMacro(!HeapTupleHeaderXminCommitted(tup)), \
((tup)->t_infomask |= HEAP_XMIN_INVALID) \
)
#define HEAP_XMIN_INVALID
Definition: htup_details.h:203
#define HeapTupleHeaderXminCommitted(tup)
Definition: htup_details.h:323

Definition at line 345 of file htup_details.h.

◆ HeapTupleHeaderSetXvac

#define HeapTupleHeaderSetXvac (   tup,
  xid 
)
Value:
do { \
Assert((tup)->t_infomask & HEAP_MOVED); \
(tup)->t_choice.t_heap.t_field3.t_xvac = (xid); \
} while (0)
#define HEAP_MOVED
Definition: htup_details.h:215

Definition at line 422 of file htup_details.h.

Referenced by heap_execute_freeze_tuple().

◆ HeapTupleHeaderXminCommitted

◆ HeapTupleHeaderXminFrozen

#define HeapTupleHeaderXminFrozen (   tup)
Value:
( \
((tup)->t_infomask & (HEAP_XMIN_FROZEN)) == HEAP_XMIN_FROZEN \
)
#define HEAP_XMIN_FROZEN
Definition: htup_details.h:204

Definition at line 334 of file htup_details.h.

Referenced by heap_mask(), heap_prepare_freeze_tuple(), and HeapTupleSatisfiesMVCC().

◆ HeapTupleHeaderXminInvalid

◆ HeapTupleIsHeapOnly

◆ HeapTupleIsHotUpdated

#define HeapTupleIsHotUpdated (   tuple)    HeapTupleHeaderIsHotUpdated((tuple)->t_data)

Definition at line 689 of file htup_details.h.

Referenced by heap_hot_search_buffer(), IndexBuildHeapRangeScan(), and lazy_scan_heap().

◆ HeapTupleNoNulls

#define HeapTupleNoNulls (   tuple)    (!((tuple)->t_data->t_infomask & HEAP_HASNULL))

Definition at line 677 of file htup_details.h.

Referenced by heap_attisnull(), heapgettup_pagemode(), and nocachegetattr().

◆ HeapTupleSetHeapOnly

#define HeapTupleSetHeapOnly (   tuple)    HeapTupleHeaderSetHeapOnly((tuple)->t_data)

Definition at line 701 of file htup_details.h.

Referenced by heap_update().

◆ HeapTupleSetHotUpdated

#define HeapTupleSetHotUpdated (   tuple)    HeapTupleHeaderSetHotUpdated((tuple)->t_data)

Definition at line 692 of file htup_details.h.

Referenced by heap_update().

◆ HeapTupleSetOid

◆ MaxAttrSize

#define MaxAttrSize   (10 * 1024 * 1024)

Definition at line 598 of file htup_details.h.

Referenced by anybit_typmodin(), and anychar_typmodin().

◆ MaxHeapAttributeNumber

#define MaxHeapAttributeNumber   1600 /* 8 * 200 */

◆ MaxHeapTupleSize

◆ MaxHeapTuplesPerPage

◆ MaxTupleAttributeNumber

◆ MinHeapTupleSize

#define MinHeapTupleSize   MAXALIGN(SizeofHeapTupleHeader)

Definition at line 574 of file htup_details.h.

Referenced by heap_page_items().

◆ MINIMAL_TUPLE_DATA_OFFSET

#define MINIMAL_TUPLE_DATA_OFFSET   offsetof(MinimalTupleData, t_infomask2)

Definition at line 636 of file htup_details.h.

Referenced by readtup_heap(), and writetup_heap().

◆ MINIMAL_TUPLE_OFFSET

#define MINIMAL_TUPLE_OFFSET   ((offsetof(HeapTupleHeaderData, t_infomask2) - sizeof(uint32)) / MAXIMUM_ALIGNOF * MAXIMUM_ALIGNOF)

◆ MINIMAL_TUPLE_PADDING

#define MINIMAL_TUPLE_PADDING   ((offsetof(HeapTupleHeaderData, t_infomask2) - sizeof(uint32)) % MAXIMUM_ALIGNOF)

Definition at line 634 of file htup_details.h.

◆ SizeofHeapTupleHeader

◆ SizeofMinimalTupleHeader

Typedef Documentation

◆ DatumTupleFields

◆ HeapTupleFields

Function Documentation

◆ heap_attisnull()

bool heap_attisnull ( HeapTuple  tup,
int  attnum,
TupleDesc  tupleDesc 
)

Definition at line 397 of file heaptuple.c.

References Assert, att_isnull, elog, ERROR, HeapTupleHeaderGetNatts, HeapTupleNoNulls, MaxCommandIdAttributeNumber, MaxTransactionIdAttributeNumber, MinCommandIdAttributeNumber, MinTransactionIdAttributeNumber, ObjectIdAttributeNumber, SelfItemPointerAttributeNumber, HeapTupleHeaderData::t_bits, HeapTupleData::t_data, TableOidAttributeNumber, and TupleDescAttr.

Referenced by AlterDomainNotNull(), ATRewriteTable(), build_function_result_tupdesc_t(), check_index_is_clusterable(), CheckIndexCompatible(), ExecEvalRowNullInt(), ExecuteCallStmt(), fmgr_info_cxt_security(), fmgr_symbol(), get_func_result_name(), index_drop(), inline_function(), inline_set_returning_function(), pg_attribute_aclcheck_all(), pg_get_indexdef_worker(), pg_get_partkeydef_worker(), RelationGetIndexExpressions(), RelationGetIndexList(), RelationGetIndexPredicate(), ri_NullCheck(), slot_attisnull(), statext_is_kind_built(), and transformFkeyCheckAttrs().

398 {
399  /*
400  * We allow a NULL tupledesc for relations not expected to have missing
401  * values, such as catalog relations and indexes.
402  */
403  Assert(!tupleDesc || attnum <= tupleDesc->natts);
404  if (attnum > (int) HeapTupleHeaderGetNatts(tup->t_data))
405  {
406  if (tupleDesc && TupleDescAttr(tupleDesc, attnum - 1)->atthasmissing)
407  return false;
408  else
409  return true;
410  }
411 
412  if (attnum > 0)
413  {
414  if (HeapTupleNoNulls(tup))
415  return false;
416  return att_isnull(attnum - 1, tup->t_data->t_bits);
417  }
418 
419  switch (attnum)
420  {
428  /* these are never null */
429  break;
430 
431  default:
432  elog(ERROR, "invalid attnum: %d", attnum);
433  }
434 
435  return false;
436 }
bits8 t_bits[FLEXIBLE_ARRAY_MEMBER]
Definition: htup_details.h:176
#define ObjectIdAttributeNumber
Definition: sysattr.h:22
#define att_isnull(ATT, BITS)
Definition: tupmacs.h:21
#define TupleDescAttr(tupdesc, i)
Definition: tupdesc.h:93
#define MinCommandIdAttributeNumber
Definition: sysattr.h:24
HeapTupleHeader t_data
Definition: htup.h:68
#define ERROR
Definition: elog.h:43
#define HeapTupleHeaderGetNatts(tup)
Definition: htup_details.h:544
#define TableOidAttributeNumber
Definition: sysattr.h:27
#define HeapTupleNoNulls(tuple)
Definition: htup_details.h:677
#define MaxCommandIdAttributeNumber
Definition: sysattr.h:26
#define MaxTransactionIdAttributeNumber
Definition: sysattr.h:25
int16 attnum
Definition: pg_attribute.h:79
#define Assert(condition)
Definition: c.h:699
#define SelfItemPointerAttributeNumber
Definition: sysattr.h:21
#define elog
Definition: elog.h:219
#define MinTransactionIdAttributeNumber
Definition: sysattr.h:23

◆ heap_compute_data_size()

Size heap_compute_data_size ( TupleDesc  tupleDesc,
Datum values,
bool isnull 
)

Definition at line 157 of file heaptuple.c.

References att_addlength_datum, att_align_datum, att_align_nominal, ATT_IS_PACKABLE, DatumGetEOHP(), DatumGetPointer, EOH_get_flat_size(), i, tupleDesc::natts, TupleDescAttr, val, VARATT_CAN_MAKE_SHORT, VARATT_CONVERTED_SHORT_SIZE, and VARATT_IS_EXTERNAL_EXPANDED.

Referenced by brin_form_tuple(), ER_get_flat_size(), heap_form_minimal_tuple(), heap_form_tuple(), index_form_tuple(), toast_flatten_tuple_to_datum(), and toast_insert_or_update().

160 {
161  Size data_length = 0;
162  int i;
163  int numberOfAttributes = tupleDesc->natts;
164 
165  for (i = 0; i < numberOfAttributes; i++)
166  {
167  Datum val;
168  Form_pg_attribute atti;
169 
170  if (isnull[i])
171  continue;
172 
173  val = values[i];
174  atti = TupleDescAttr(tupleDesc, i);
175 
176  if (ATT_IS_PACKABLE(atti) &&
178  {
179  /*
180  * we're anticipating converting to a short varlena header, so
181  * adjust length and don't count any alignment
182  */
183  data_length += VARATT_CONVERTED_SHORT_SIZE(DatumGetPointer(val));
184  }
185  else if (atti->attlen == -1 &&
187  {
188  /*
189  * we want to flatten the expanded value so that the constructed
190  * tuple doesn't depend on it
191  */
192  data_length = att_align_nominal(data_length, atti->attalign);
193  data_length += EOH_get_flat_size(DatumGetEOHP(val));
194  }
195  else
196  {
197  data_length = att_align_datum(data_length, atti->attalign,
198  atti->attlen, val);
199  data_length = att_addlength_datum(data_length, atti->attlen,
200  val);
201  }
202  }
203 
204  return data_length;
205 }
#define att_align_nominal(cur_offset, attalign)
Definition: tupmacs.h:144
#define VARATT_IS_EXTERNAL_EXPANDED(PTR)
Definition: postgres.h:322
#define TupleDescAttr(tupdesc, i)
Definition: tupdesc.h:93
int natts
Definition: tupdesc.h:82
#define att_align_datum(cur_offset, attalign, attlen, attdatum)
Definition: tupmacs.h:101
#define VARATT_CAN_MAKE_SHORT(PTR)
Definition: postgres.h:270
FormData_pg_attribute * Form_pg_attribute
Definition: pg_attribute.h:197
Size EOH_get_flat_size(ExpandedObjectHeader *eohptr)
Definition: expandeddatum.c:75
ExpandedObjectHeader * DatumGetEOHP(Datum d)
Definition: expandeddatum.c:29
#define VARATT_CONVERTED_SHORT_SIZE(PTR)
Definition: postgres.h:273
uintptr_t Datum
Definition: postgres.h:367
size_t Size
Definition: c.h:433
#define DatumGetPointer(X)
Definition: postgres.h:534
static Datum values[MAXATTR]
Definition: bootstrap.c:164
#define att_addlength_datum(cur_offset, attlen, attdatum)
Definition: tupmacs.h:160
#define ATT_IS_PACKABLE(att)
Definition: heaptuple.c:68
int i
long val
Definition: informix.c:689

◆ heap_copy_minimal_tuple()

MinimalTuple heap_copy_minimal_tuple ( MinimalTuple  mtup)

Definition at line 1880 of file heaptuple.c.

References palloc(), and MinimalTupleData::t_len.

Referenced by ExecCopySlotMinimalTuple(), tuplesort_gettupleslot(), and tuplestore_gettupleslot().

1881 {
1882  MinimalTuple result;
1883 
1884  result = (MinimalTuple) palloc(mtup->t_len);
1885  memcpy(result, mtup, mtup->t_len);
1886  return result;
1887 }
MinimalTupleData * MinimalTuple
Definition: htup.h:27
void * palloc(Size size)
Definition: mcxt.c:924

◆ heap_copy_tuple_as_datum()

Datum heap_copy_tuple_as_datum ( HeapTuple  tuple,
TupleDesc  tupleDesc 
)

Definition at line 1038 of file heaptuple.c.

References HeapTupleHasExternal, HeapTupleHeaderSetDatumLength, HeapTupleHeaderSetTypeId, HeapTupleHeaderSetTypMod, palloc(), PointerGetDatum, HeapTupleData::t_data, HeapTupleData::t_len, tupleDesc::tdtypeid, tupleDesc::tdtypmod, and toast_flatten_tuple_to_datum().

Referenced by ExecEvalConvertRowtype(), ExecFetchSlotTupleDatum(), PLyGenericObject_ToComposite(), PLyMapping_ToComposite(), PLySequence_ToComposite(), and SPI_returntuple().

1039 {
1040  HeapTupleHeader td;
1041 
1042  /*
1043  * If the tuple contains any external TOAST pointers, we have to inline
1044  * those fields to meet the conventions for composite-type Datums.
1045  */
1046  if (HeapTupleHasExternal(tuple))
1047  return toast_flatten_tuple_to_datum(tuple->t_data,
1048  tuple->t_len,
1049  tupleDesc);
1050 
1051  /*
1052  * Fast path for easy case: just make a palloc'd copy and insert the
1053  * correct composite-Datum header fields (since those may not be set if
1054  * the given tuple came from disk, rather than from heap_form_tuple).
1055  */
1056  td = (HeapTupleHeader) palloc(tuple->t_len);
1057  memcpy((char *) td, (char *) tuple->t_data, tuple->t_len);
1058 
1060  HeapTupleHeaderSetTypeId(td, tupleDesc->tdtypeid);
1061  HeapTupleHeaderSetTypMod(td, tupleDesc->tdtypmod);
1062 
1063  return PointerGetDatum(td);
1064 }
Oid tdtypeid
Definition: tupdesc.h:83
#define HeapTupleHeaderSetTypeId(tup, typeid)
Definition: htup_details.h:462
#define PointerGetDatum(X)
Definition: postgres.h:541
HeapTupleHeaderData * HeapTupleHeader
Definition: htup.h:23
int32 tdtypmod
Definition: tupdesc.h:84
#define HeapTupleHeaderSetDatumLength(tup, len)
Definition: htup_details.h:454
HeapTupleHeader t_data
Definition: htup.h:68
uint32 t_len
Definition: htup.h:64
Datum toast_flatten_tuple_to_datum(HeapTupleHeader tup, uint32 tup_len, TupleDesc tupleDesc)
Definition: tuptoaster.c:1187
#define HeapTupleHeaderSetTypMod(tup, typmod)
Definition: htup_details.h:472
#define HeapTupleHasExternal(tuple)
Definition: htup_details.h:686
void * palloc(Size size)
Definition: mcxt.c:924

◆ heap_copytuple()

HeapTuple heap_copytuple ( HeapTuple  tuple)

Definition at line 722 of file heaptuple.c.

References HeapTupleIsValid, HEAPTUPLESIZE, palloc(), HeapTupleData::t_data, HeapTupleData::t_len, HeapTupleData::t_self, and HeapTupleData::t_tableOid.

Referenced by acquire_sample_rows(), AlterConstraintNamespaces(), AlterDomainValidateConstraint(), AlterExtensionNamespace(), AlterSequence(), AlterTypeOwner(), ATExecAlterConstraint(), ATExecDropConstraint(), ATExecValidateConstraint(), changeDependencyFor(), ConstraintSetParentConstraint(), copytup_cluster(), DefineIndex(), EnableDisableTrigger(), EvalPlanQualFetch(), EvalPlanQualFetchRowMarks(), ExecCopySlotTuple(), ExecLockRows(), expanded_record_set_tuple(), get_catalog_object_by_oid(), GetDatabaseTuple(), GetDatabaseTupleByOid(), GetTupleForTrigger(), index_update_stats(), make_expanded_record_from_datum(), MergeConstraintsIntoExisting(), MergeWithExistingConstraint(), RelationInitIndexAccessInfo(), RemoveInheritance(), rename_policy(), RenameEnumLabel(), RenameTableSpace(), renametrig(), RenumberEnumType(), reorderqueue_push(), ResetSequence(), rewrite_heap_tuple(), ScanPgRelation(), SearchSysCacheCopy(), SearchSysCacheCopyAttName(), SearchSysCacheCopyAttNum(), shdepChangeDep(), SPI_copytuple(), TupleQueueReaderNext(), update_relispartition(), and validatePartitionedIndex().

723 {
724  HeapTuple newTuple;
725 
726  if (!HeapTupleIsValid(tuple) || tuple->t_data == NULL)
727  return NULL;
728 
729  newTuple = (HeapTuple) palloc(HEAPTUPLESIZE + tuple->t_len);
730  newTuple->t_len = tuple->t_len;
731  newTuple->t_self = tuple->t_self;
732  newTuple->t_tableOid = tuple->t_tableOid;
733  newTuple->t_data = (HeapTupleHeader) ((char *) newTuple + HEAPTUPLESIZE);
734  memcpy((char *) newTuple->t_data, (char *) tuple->t_data, tuple->t_len);
735  return newTuple;
736 }
HeapTupleData * HeapTuple
Definition: htup.h:71
HeapTupleHeaderData * HeapTupleHeader
Definition: htup.h:23
HeapTupleHeader t_data
Definition: htup.h:68
ItemPointerData t_self
Definition: htup.h:65
uint32 t_len
Definition: htup.h:64
Oid t_tableOid
Definition: htup.h:66
#define HeapTupleIsValid(tuple)
Definition: htup.h:78
void * palloc(Size size)
Definition: mcxt.c:924
#define HEAPTUPLESIZE
Definition: htup.h:73

◆ heap_copytuple_with_tuple()

void heap_copytuple_with_tuple ( HeapTuple  src,
HeapTuple  dest 
)

Definition at line 748 of file heaptuple.c.

References HeapTupleIsValid, palloc(), HeapTupleData::t_data, HeapTupleData::t_len, HeapTupleData::t_self, and HeapTupleData::t_tableOid.

749 {
750  if (!HeapTupleIsValid(src) || src->t_data == NULL)
751  {
752  dest->t_data = NULL;
753  return;
754  }
755 
756  dest->t_len = src->t_len;
757  dest->t_self = src->t_self;
758  dest->t_tableOid = src->t_tableOid;
759  dest->t_data = (HeapTupleHeader) palloc(src->t_len);
760  memcpy((char *) dest->t_data, (char *) src->t_data, src->t_len);
761 }
HeapTupleHeaderData * HeapTupleHeader
Definition: htup.h:23
HeapTupleHeader t_data
Definition: htup.h:68
ItemPointerData t_self
Definition: htup.h:65
uint32 t_len
Definition: htup.h:64
Oid t_tableOid
Definition: htup.h:66
#define HeapTupleIsValid(tuple)
Definition: htup.h:78
void * palloc(Size size)
Definition: mcxt.c:924

◆ heap_deform_tuple()

void heap_deform_tuple ( HeapTuple  tuple,
TupleDesc  tupleDesc,
Datum values,
bool isnull 
)

Definition at line 1315 of file heaptuple.c.

References att_addlength_pointer, att_align_nominal, att_align_pointer, att_isnull, attnum, fetchatt, getmissingattr(), HeapTupleHasNulls, HeapTupleHeaderGetNatts, Min, tupleDesc::natts, HeapTupleHeaderData::t_bits, HeapTupleData::t_data, HeapTupleHeaderData::t_hoff, TupleDescAttr, and values.

Referenced by ATRewriteTable(), CopyTo(), deconstruct_expanded_record(), do_convert_tuple(), exec_move_row(), ExecEvalFieldStoreDeForm(), ExtractReplicaIdentity(), heap_modify_tuple(), heap_modify_tuple_by_cols(), hstore_from_record(), hstore_populate_record(), logicalrep_write_tuple(), make_tuple_indirect(), populate_record(), record_cmp(), record_eq(), record_image_cmp(), record_image_eq(), record_out(), record_send(), reform_and_rewrite_tuple(), ReorderBufferToastReplace(), SPI_modifytuple(), toast_delete(), toast_flatten_tuple(), toast_flatten_tuple_to_datum(), toast_insert_or_update(), and tuple_equals_slot().

1317 {
1318  HeapTupleHeader tup = tuple->t_data;
1319  bool hasnulls = HeapTupleHasNulls(tuple);
1320  int tdesc_natts = tupleDesc->natts;
1321  int natts; /* number of atts to extract */
1322  int attnum;
1323  char *tp; /* ptr to tuple data */
1324  uint32 off; /* offset in tuple data */
1325  bits8 *bp = tup->t_bits; /* ptr to null bitmap in tuple */
1326  bool slow = false; /* can we use/set attcacheoff? */
1327 
1328  natts = HeapTupleHeaderGetNatts(tup);
1329 
1330  /*
1331  * In inheritance situations, it is possible that the given tuple actually
1332  * has more fields than the caller is expecting. Don't run off the end of
1333  * the caller's arrays.
1334  */
1335  natts = Min(natts, tdesc_natts);
1336 
1337  tp = (char *) tup + tup->t_hoff;
1338 
1339  off = 0;
1340 
1341  for (attnum = 0; attnum < natts; attnum++)
1342  {
1343  Form_pg_attribute thisatt = TupleDescAttr(tupleDesc, attnum);
1344 
1345  if (hasnulls && att_isnull(attnum, bp))
1346  {
1347  values[attnum] = (Datum) 0;
1348  isnull[attnum] = true;
1349  slow = true; /* can't use attcacheoff anymore */
1350  continue;
1351  }
1352 
1353  isnull[attnum] = false;
1354 
1355  if (!slow && thisatt->attcacheoff >= 0)
1356  off = thisatt->attcacheoff;
1357  else if (thisatt->attlen == -1)
1358  {
1359  /*
1360  * We can only cache the offset for a varlena attribute if the
1361  * offset is already suitably aligned, so that there would be no
1362  * pad bytes in any case: then the offset will be valid for either
1363  * an aligned or unaligned value.
1364  */
1365  if (!slow &&
1366  off == att_align_nominal(off, thisatt->attalign))
1367  thisatt->attcacheoff = off;
1368  else
1369  {
1370  off = att_align_pointer(off, thisatt->attalign, -1,
1371  tp + off);
1372  slow = true;
1373  }
1374  }
1375  else
1376  {
1377  /* not varlena, so safe to use att_align_nominal */
1378  off = att_align_nominal(off, thisatt->attalign);
1379 
1380  if (!slow)
1381  thisatt->attcacheoff = off;
1382  }
1383 
1384  values[attnum] = fetchatt(thisatt, tp + off);
1385 
1386  off = att_addlength_pointer(off, thisatt->attlen, tp + off);
1387 
1388  if (thisatt->attlen <= 0)
1389  slow = true; /* can't use attcacheoff anymore */
1390  }
1391 
1392  /*
1393  * If tuple doesn't have all the atts indicated by tupleDesc, read the
1394  * rest as nulls or missing values as appropriate.
1395  */
1396  for (; attnum < tdesc_natts; attnum++)
1397  values[attnum] = getmissingattr(tupleDesc, attnum + 1, &isnull[attnum]);
1398 }
#define att_align_nominal(cur_offset, attalign)
Definition: tupmacs.h:144
bits8 t_bits[FLEXIBLE_ARRAY_MEMBER]
Definition: htup_details.h:176
#define att_isnull(ATT, BITS)
Definition: tupmacs.h:21
#define TupleDescAttr(tupdesc, i)
Definition: tupdesc.h:93
#define Min(x, y)
Definition: c.h:857
int natts
Definition: tupdesc.h:82
#define fetchatt(A, T)
Definition: tupmacs.h:37
HeapTupleHeader t_data
Definition: htup.h:68
#define HeapTupleHeaderGetNatts(tup)
Definition: htup_details.h:544
#define HeapTupleHasNulls(tuple)
Definition: htup_details.h:674
FormData_pg_attribute * Form_pg_attribute
Definition: pg_attribute.h:197
unsigned int uint32
Definition: c.h:325
static Datum getmissingattr(TupleDesc tupleDesc, int attnum, bool *isnull)
Definition: heaptuple.c:84
#define att_addlength_pointer(cur_offset, attlen, attptr)
Definition: tupmacs.h:172
uint8 bits8
Definition: c.h:332
uintptr_t Datum
Definition: postgres.h:367
#define att_align_pointer(cur_offset, attalign, attlen, attptr)
Definition: tupmacs.h:122
int16 attnum
Definition: pg_attribute.h:79
static Datum values[MAXATTR]
Definition: bootstrap.c:164

◆ heap_expand_tuple()

HeapTuple heap_expand_tuple ( HeapTuple  sourceTuple,
TupleDesc  tupleDesc 
)

Definition at line 1023 of file heaptuple.c.

References expand_tuple().

Referenced by EvalPlanQualFetchRowMarks(), and ExecFetchSlotTuple().

1024 {
1025  HeapTuple heapTuple;
1026 
1027  expand_tuple(&heapTuple, NULL, sourceTuple, tupleDesc);
1028  return heapTuple;
1029 }
static void expand_tuple(HeapTuple *targetHeapTuple, MinimalTuple *targetMinimalTuple, HeapTuple sourceTuple, TupleDesc tupleDesc)
Definition: heaptuple.c:774

◆ heap_fill_tuple()

void heap_fill_tuple ( TupleDesc  tupleDesc,
Datum values,
bool isnull,
char *  data,
Size  data_size,
uint16 infomask,
bits8 bit 
)

Definition at line 342 of file heaptuple.c.

References Assert, fill_val(), HEAP_HASEXTERNAL, HEAP_HASNULL, HEAP_HASVARWIDTH, HIGHBIT, i, tupleDesc::natts, PointerGetDatum, and TupleDescAttr.

Referenced by brin_form_tuple(), ER_flatten_into(), heap_form_minimal_tuple(), heap_form_tuple(), index_form_tuple(), toast_flatten_tuple_to_datum(), and toast_insert_or_update().

346 {
347  bits8 *bitP;
348  int bitmask;
349  int i;
350  int numberOfAttributes = tupleDesc->natts;
351 
352 #ifdef USE_ASSERT_CHECKING
353  char *start = data;
354 #endif
355 
356  if (bit != NULL)
357  {
358  bitP = &bit[-1];
359  bitmask = HIGHBIT;
360  }
361  else
362  {
363  /* just to keep compiler quiet */
364  bitP = NULL;
365  bitmask = 0;
366  }
367 
368  *infomask &= ~(HEAP_HASNULL | HEAP_HASVARWIDTH | HEAP_HASEXTERNAL);
369 
370  for (i = 0; i < numberOfAttributes; i++)
371  {
372  Form_pg_attribute attr = TupleDescAttr(tupleDesc, i);
373 
374  fill_val(attr,
375  bitP ? &bitP : NULL,
376  &bitmask,
377  &data,
378  infomask,
379  values ? values[i] : PointerGetDatum(NULL),
380  isnull ? isnull[i] : true);
381  }
382 
383  Assert((data - start) == data_size);
384 }
#define PointerGetDatum(X)
Definition: postgres.h:541
#define TupleDescAttr(tupdesc, i)
Definition: tupdesc.h:93
int natts
Definition: tupdesc.h:82
static void fill_val(Form_pg_attribute att, bits8 **bit, int *bitmask, char **dataP, uint16 *infomask, Datum datum, bool isnull)
Definition: heaptuple.c:213
#define HEAP_HASNULL
Definition: htup_details.h:188
FormData_pg_attribute * Form_pg_attribute
Definition: pg_attribute.h:197
#define HEAP_HASVARWIDTH
Definition: htup_details.h:189
#define HIGHBIT
Definition: c.h:993
uint8 bits8
Definition: c.h:332
Datum bit(PG_FUNCTION_ARGS)
Definition: varbit.c:362
#define Assert(condition)
Definition: c.h:699
static Datum values[MAXATTR]
Definition: bootstrap.c:164
int i
#define HEAP_HASEXTERNAL
Definition: htup_details.h:190

◆ heap_form_minimal_tuple()

MinimalTuple heap_form_minimal_tuple ( TupleDesc  tupleDescriptor,
Datum values,
bool isnull 
)

Definition at line 1791 of file heaptuple.c.

References BITMAPLEN, ereport, errcode(), errmsg(), ERROR, heap_compute_data_size(), heap_fill_tuple(), HEAP_HASOID, HeapTupleHeaderSetNatts, i, MAXALIGN, MaxTupleAttributeNumber, MINIMAL_TUPLE_OFFSET, tupleDesc::natts, palloc0(), SizeofMinimalTupleHeader, MinimalTupleData::t_bits, MinimalTupleData::t_hoff, MinimalTupleData::t_infomask, MinimalTupleData::t_len, and tupleDesc::tdhasoid.

Referenced by ExecCopySlotMinimalTuple(), and tuplestore_putvalues().

1794 {
1795  MinimalTuple tuple; /* return tuple */
1796  Size len,
1797  data_len;
1798  int hoff;
1799  bool hasnull = false;
1800  int numberOfAttributes = tupleDescriptor->natts;
1801  int i;
1802 
1803  if (numberOfAttributes > MaxTupleAttributeNumber)
1804  ereport(ERROR,
1805  (errcode(ERRCODE_TOO_MANY_COLUMNS),
1806  errmsg("number of columns (%d) exceeds limit (%d)",
1807  numberOfAttributes, MaxTupleAttributeNumber)));
1808 
1809  /*
1810  * Check for nulls
1811  */
1812  for (i = 0; i < numberOfAttributes; i++)
1813  {
1814  if (isnull[i])
1815  {
1816  hasnull = true;
1817  break;
1818  }
1819  }
1820 
1821  /*
1822  * Determine total space needed
1823  */
1825 
1826  if (hasnull)
1827  len += BITMAPLEN(numberOfAttributes);
1828 
1829  if (tupleDescriptor->tdhasoid)
1830  len += sizeof(Oid);
1831 
1832  hoff = len = MAXALIGN(len); /* align user data safely */
1833 
1834  data_len = heap_compute_data_size(tupleDescriptor, values, isnull);
1835 
1836  len += data_len;
1837 
1838  /*
1839  * Allocate and zero the space needed.
1840  */
1841  tuple = (MinimalTuple) palloc0(len);
1842 
1843  /*
1844  * And fill in the information.
1845  */
1846  tuple->t_len = len;
1847  HeapTupleHeaderSetNatts(tuple, numberOfAttributes);
1848  tuple->t_hoff = hoff + MINIMAL_TUPLE_OFFSET;
1849 
1850  if (tupleDescriptor->tdhasoid) /* else leave infomask = 0 */
1851  tuple->t_infomask = HEAP_HASOID;
1852 
1853  heap_fill_tuple(tupleDescriptor,
1854  values,
1855  isnull,
1856  (char *) tuple + hoff,
1857  data_len,
1858  &tuple->t_infomask,
1859  (hasnull ? tuple->t_bits : NULL));
1860 
1861  return tuple;
1862 }
void heap_fill_tuple(TupleDesc tupleDesc, Datum *values, bool *isnull, char *data, Size data_size, uint16 *infomask, bits8 *bit)
Definition: heaptuple.c:342
bool tdhasoid
Definition: tupdesc.h:85
#define MaxTupleAttributeNumber
Definition: htup_details.h:33
int errcode(int sqlerrcode)
Definition: elog.c:575
#define BITMAPLEN(NATTS)
Definition: htup_details.h:560
unsigned int Oid
Definition: postgres_ext.h:31
int natts
Definition: tupdesc.h:82
bits8 t_bits[FLEXIBLE_ARRAY_MEMBER]
Definition: htup_details.h:655
#define ERROR
Definition: elog.h:43
MinimalTupleData * MinimalTuple
Definition: htup.h:27
#define ereport(elevel, rest)
Definition: elog.h:122
#define SizeofMinimalTupleHeader
Definition: htup_details.h:662
void * palloc0(Size size)
Definition: mcxt.c:955
#define HeapTupleHeaderSetNatts(tup, natts)
Definition: htup_details.h:547
size_t Size
Definition: c.h:433
#define MAXALIGN(LEN)
Definition: c.h:652
#define MINIMAL_TUPLE_OFFSET
Definition: htup_details.h:632
Size heap_compute_data_size(TupleDesc tupleDesc, Datum *values, bool *isnull)
Definition: heaptuple.c:157
static Datum values[MAXATTR]
Definition: bootstrap.c:164
int errmsg(const char *fmt,...)
Definition: elog.c:797
int i
#define HEAP_HASOID
Definition: htup_details.h:191

◆ heap_form_tuple()

HeapTuple heap_form_tuple ( TupleDesc  tupleDescriptor,
Datum values,
bool isnull 
)

Definition at line 1074 of file heaptuple.c.

References BITMAPLEN, ereport, errcode(), errmsg(), ERROR, heap_compute_data_size(), heap_fill_tuple(), HEAP_HASOID, HeapTupleHeaderSetDatumLength, HeapTupleHeaderSetNatts, HeapTupleHeaderSetTypeId, HeapTupleHeaderSetTypMod, HEAPTUPLESIZE, i, InvalidOid, ItemPointerSetInvalid, MAXALIGN, MaxTupleAttributeNumber, tupleDesc::natts, offsetof, palloc0(), HeapTupleHeaderData::t_bits, HeapTupleHeaderData::t_ctid, HeapTupleData::t_data, HeapTupleHeaderData::t_hoff, HeapTupleHeaderData::t_infomask, HeapTupleData::t_len, HeapTupleData::t_self, HeapTupleData::t_tableOid, tupleDesc::tdhasoid, tupleDesc::tdtypeid, and tupleDesc::tdtypmod.

Referenced by aclexplode(), AddEnumLabel(), AddRoleMems(), AddSubscriptionRelState(), AggregateCreate(), AlterSetting(), ATRewriteTable(), brin_metapage_info(), BuildTupleFromCStrings(), CollationCreate(), ConversionCreate(), CopyFrom(), create_proc_lang(), CreateAccessMethod(), CreateCast(), CreateComments(), CreateConstraintEntry(), createdb(), CreateForeignDataWrapper(), CreateForeignServer(), CreateForeignTable(), CreateOpFamily(), CreatePolicy(), CreatePublication(), CreateRole(), CreateSharedComments(), CreateStatistics(), CreateSubscription(), CreateTableSpace(), CreateTransform(), CreateTrigger(), CreateUserMapping(), DefineOpClass(), DefineSequence(), DefineTSConfiguration(), DefineTSDictionary(), DefineTSParser(), DefineTSTemplate(), do_convert_tuple(), each_object_field_end(), each_worker_jsonb(), elements_array_element_end(), elements_worker_jsonb(), EnumValuesCreate(), ExecCopySlotTuple(), ExecEvalFieldStoreForm(), ExecEvalRow(), expanded_record_get_tuple(), ExtractReplicaIdentity(), file_acquire_sample_rows(), fill_hba_line(), gin_leafpage_items(), gin_metapage_info(), gin_page_opaque_info(), gistFetchTuple(), hash_bitmap_info(), hash_metapage_info(), hash_page_items(), hash_page_stats(), heap_modify_tuple(), heap_modify_tuple_by_cols(), heap_page_items(), hstore_each(), hstore_populate_record(), IndexSetParentIndex(), insert_event_trigger_tuple(), InsertExtensionTuple(), InsertOneTuple(), InsertPgAttributeTuple(), InsertPgClassTuple(), InsertRule(), inv_truncate(), inv_write(), LargeObjectCreate(), make_tuple_from_result_row(), make_tuple_from_row(), make_tuple_indirect(), MakeConfigurationMapping(), NamespaceCreate(), OperatorCreate(), OperatorShellMake(), page_header(), pg_buffercache_pages(), pg_control_checkpoint(), pg_control_init(), pg_control_recovery(), pg_control_system(), pg_create_logical_replication_slot(), pg_create_physical_replication_slot(), pg_get_object_address(), pg_identify_object(), pg_identify_object_as_address(), pg_last_committed_xact(), pg_lock_status(), pg_ls_dir_files(), pg_prepared_xact(), pg_replication_slot_advance(), pg_sequence_parameters(), pg_stat_file(), pg_stat_get_archiver(), pg_stat_get_wal_receiver(), pg_timezone_abbrevs(), pg_timezone_names(), pg_visibility(), pg_visibility_map(), pg_visibility_map_rel(), pg_visibility_map_summary(), pg_visibility_rel(), pg_walfile_name_offset(), pgstatginindex_internal(), pgstathashindex(), pgstattuple_approx_internal(), plperl_build_tuple_result(), PLyGenericObject_ToComposite(), PLyMapping_ToComposite(), PLySequence_ToComposite(), populate_record(), ProcedureCreate(), publication_add_relation(), RangeCreate(), record_in(), record_recv(), recordExtensionInitPrivWorker(), recordMultipleDependencies(), reform_and_rewrite_tuple(), ReorderBufferToastReplace(), replorigin_create(), SetDefaultACL(), SetSecurityLabel(), SetSharedSecurityLabel(), shdepAddDependency(), shdepChangeDep(), SPI_modifytuple(), ssl_extension_info(), StoreAttrDefault(), storeGettuple(), storeOperators(), StorePartitionKey(), storeProcedures(), StoreSingleInheritance(), test_predtest(), toast_build_flattened_tuple(), toast_flatten_tuple(), toast_save_datum(), tsvector_unnest(), TypeCreate(), TypeShellMake(), update_attstats(), and UpdateIndexRelation().

1077 {
1078  HeapTuple tuple; /* return tuple */
1079  HeapTupleHeader td; /* tuple data */
1080  Size len,
1081  data_len;
1082  int hoff;
1083  bool hasnull = false;
1084  int numberOfAttributes = tupleDescriptor->natts;
1085  int i;
1086 
1087  if (numberOfAttributes > MaxTupleAttributeNumber)
1088  ereport(ERROR,
1089  (errcode(ERRCODE_TOO_MANY_COLUMNS),
1090  errmsg("number of columns (%d) exceeds limit (%d)",
1091  numberOfAttributes, MaxTupleAttributeNumber)));
1092 
1093  /*
1094  * Check for nulls
1095  */
1096  for (i = 0; i < numberOfAttributes; i++)
1097  {
1098  if (isnull[i])
1099  {
1100  hasnull = true;
1101  break;
1102  }
1103  }
1104 
1105  /*
1106  * Determine total space needed
1107  */
1108  len = offsetof(HeapTupleHeaderData, t_bits);
1109 
1110  if (hasnull)
1111  len += BITMAPLEN(numberOfAttributes);
1112 
1113  if (tupleDescriptor->tdhasoid)
1114  len += sizeof(Oid);
1115 
1116  hoff = len = MAXALIGN(len); /* align user data safely */
1117 
1118  data_len = heap_compute_data_size(tupleDescriptor, values, isnull);
1119 
1120  len += data_len;
1121 
1122  /*
1123  * Allocate and zero the space needed. Note that the tuple body and
1124  * HeapTupleData management structure are allocated in one chunk.
1125  */
1126  tuple = (HeapTuple) palloc0(HEAPTUPLESIZE + len);
1127  tuple->t_data = td = (HeapTupleHeader) ((char *) tuple + HEAPTUPLESIZE);
1128 
1129  /*
1130  * And fill in the information. Note we fill the Datum fields even though
1131  * this tuple may never become a Datum. This lets HeapTupleHeaderGetDatum
1132  * identify the tuple type if needed.
1133  */
1134  tuple->t_len = len;
1135  ItemPointerSetInvalid(&(tuple->t_self));
1136  tuple->t_tableOid = InvalidOid;
1137 
1139  HeapTupleHeaderSetTypeId(td, tupleDescriptor->tdtypeid);
1140  HeapTupleHeaderSetTypMod(td, tupleDescriptor->tdtypmod);
1141  /* We also make sure that t_ctid is invalid unless explicitly set */
1142  ItemPointerSetInvalid(&(td->t_ctid));
1143 
1144  HeapTupleHeaderSetNatts(td, numberOfAttributes);
1145  td->t_hoff = hoff;
1146 
1147  if (tupleDescriptor->tdhasoid) /* else leave infomask = 0 */
1148  td->t_infomask = HEAP_HASOID;
1149 
1150  heap_fill_tuple(tupleDescriptor,
1151  values,
1152  isnull,
1153  (char *) td + hoff,
1154  data_len,
1155  &td->t_infomask,
1156  (hasnull ? td->t_bits : NULL));
1157 
1158  return tuple;
1159 }
void heap_fill_tuple(TupleDesc tupleDesc, Datum *values, bool *isnull, char *data, Size data_size, uint16 *infomask, bits8 *bit)
Definition: heaptuple.c:342
HeapTupleData * HeapTuple
Definition: htup.h:71
Oid tdtypeid
Definition: tupdesc.h:83
#define HeapTupleHeaderSetTypeId(tup, typeid)
Definition: htup_details.h:462
bool tdhasoid
Definition: tupdesc.h:85
bits8 t_bits[FLEXIBLE_ARRAY_MEMBER]
Definition: htup_details.h:176
#define MaxTupleAttributeNumber
Definition: htup_details.h:33
HeapTupleHeaderData * HeapTupleHeader
Definition: htup.h:23
int errcode(int sqlerrcode)
Definition: elog.c:575
#define BITMAPLEN(NATTS)
Definition: htup_details.h:560
unsigned int Oid
Definition: postgres_ext.h:31
int natts
Definition: tupdesc.h:82
int32 tdtypmod
Definition: tupdesc.h:84
#define HeapTupleHeaderSetDatumLength(tup, len)
Definition: htup_details.h:454
HeapTupleHeader t_data
Definition: htup.h:68
#define ERROR
Definition: elog.h:43
ItemPointerData t_ctid
Definition: htup_details.h:159
ItemPointerData t_self
Definition: htup.h:65
uint32 t_len
Definition: htup.h:64
Oid t_tableOid
Definition: htup.h:66
#define ereport(elevel, rest)
Definition: elog.h:122
void * palloc0(Size size)
Definition: mcxt.c:955
#define HeapTupleHeaderSetTypMod(tup, typmod)
Definition: htup_details.h:472
#define InvalidOid
Definition: postgres_ext.h:36
#define HeapTupleHeaderSetNatts(tup, natts)
Definition: htup_details.h:547
size_t Size
Definition: c.h:433
#define MAXALIGN(LEN)
Definition: c.h:652
Size heap_compute_data_size(TupleDesc tupleDesc, Datum *values, bool *isnull)
Definition: heaptuple.c:157
static Datum values[MAXATTR]
Definition: bootstrap.c:164
#define ItemPointerSetInvalid(pointer)
Definition: itemptr.h:172
int errmsg(const char *fmt,...)
Definition: elog.c:797
#define HEAPTUPLESIZE
Definition: htup.h:73
int i
#define HEAP_HASOID
Definition: htup_details.h:191
#define offsetof(type, field)
Definition: c.h:622

◆ heap_free_minimal_tuple()

void heap_free_minimal_tuple ( MinimalTuple  mtup)

Definition at line 1868 of file heaptuple.c.

References pfree().

Referenced by ExecClearTuple(), ExecStoreMinimalTuple(), ExecStoreTuple(), and writetup_heap().

1869 {
1870  pfree(mtup);
1871 }
void pfree(void *pointer)
Definition: mcxt.c:1031

◆ heap_freetuple()

void heap_freetuple ( HeapTuple  htup)

Definition at line 1773 of file heaptuple.c.

References pfree().

Referenced by acquire_inherited_sample_rows(), acquire_sample_rows(), AddEnumLabel(), AddSubscriptionRelState(), AfterTriggerExecute(), AlterCollation(), AlterDatabaseOwner(), AlterDomainDefault(), AlterDomainNotNull(), AlterDomainValidateConstraint(), AlterEventTrigger(), AlterEventTriggerOwner(), AlterEventTriggerOwner_oid(), AlterForeignDataWrapper(), AlterForeignDataWrapperOwner(), AlterForeignDataWrapperOwner_oid(), AlterForeignServer(), AlterForeignServerOwner(), AlterForeignServerOwner_oid(), AlterFunction(), AlterObjectRename_internal(), AlterPolicy(), AlterPublication(), AlterPublicationOwner(), AlterPublicationOwner_oid(), AlterRelationNamespaceInternal(), AlterRole(), AlterSchemaOwner_internal(), AlterSubscription(), AlterSubscriptionOwner(), AlterSubscriptionOwner_oid(), AlterTableSpaceOptions(), AlterTSDictionary(), AlterTypeNamespaceInternal(), AlterUserMapping(), analyze_row_processor(), ATExecAddColumn(), ATExecAddIdentity(), ATExecAddOf(), ATExecAlterColumnGenericOptions(), ATExecAlterColumnType(), ATExecAlterConstraint(), ATExecChangeOwner(), ATExecDetachPartition(), ATExecDisableRowSecurity(), ATExecDropColumn(), ATExecDropConstraint(), ATExecDropIdentity(), ATExecDropOf(), ATExecEnableRowSecurity(), ATExecForceNoForceRowSecurity(), ATExecGenericOptions(), ATExecSetIdentity(), ATExecSetOptions(), ATExecSetRelOptions(), ATExecSetStatistics(), ATExecSetStorage(), ATExecSetTableSpace(), ATExecValidateConstraint(), build_tuplestore_recursively(), CatalogCacheCreateEntry(), change_owner_fix_column_acls(), changeDependencyFor(), CollationCreate(), ConversionCreate(), copy_heap_data(), copyTemplateDependencies(), create_toast_table(), CreateAccessMethod(), CreateCast(), CreateComments(), CreateForeignDataWrapper(), CreateForeignServer(), CreateForeignTable(), CreateOpFamily(), CreatePolicy(), CreatePublication(), CreateSharedComments(), CreateStatistics(), CreateSubscription(), CreateTableSpace(), CreateTransform(), CreateTrigger(), CreateUserMapping(), crosstab(), DefineIndex(), DefineOpClass(), DefineQueryRewrite(), DefineSequence(), DefineTSConfiguration(), DefineTSDictionary(), DefineTSParser(), DefineTSTemplate(), EnableDisableRule(), EnableDisableTrigger(), EnumValuesCreate(), EvalPlanQualSetTuple(), examine_attribute(), exec_stmt_return_query(), ExecARDeleteTriggers(), ExecARUpdateTriggers(), ExecBRDeleteTriggers(), ExecBRInsertTriggers(), ExecBRUpdateTriggers(), ExecClearTuple(), ExecIRDeleteTriggers(), ExecIRInsertTriggers(), ExecIRUpdateTriggers(), ExecLockRows(), ExecReScanAgg(), ExecReScanSetOp(), ExecScanSubPlan(), ExecSetParamPlan(), ExecStoreMinimalTuple(), ExecStoreTuple(), expanded_record_set_tuple(), ExtractReplicaIdentity(), file_acquire_sample_rows(), gather_merge_clear_tuples(), heap_delete(), heap_insert(), heap_update(), index_build(), index_constraint_create(), index_update_stats(), insert_event_trigger_tuple(), InsertExtensionTuple(), InsertOneTuple(), InsertPgAttributeTuple(), InsertPgClassTuple(), InsertRule(), inv_truncate(), inv_write(), LargeObjectCreate(), MakeConfigurationMapping(), mark_index_clustered(), MergeAttributesIntoExisting(), MergeConstraintsIntoExisting(), OperatorShellMake(), PLyGenericObject_ToComposite(), PLyMapping_ToComposite(), PLySequence_ToComposite(), ProcedureCreate(), publication_add_relation(), RangeCreate(), raw_heap_insert(), record_in(), record_recv(), recordMultipleDependencies(), reform_and_rewrite_tuple(), relation_mark_replica_identity(), RelationBuildDesc(), RelationClearMissing(), RelationInitPhysicalAddr(), RelationReloadIndexInfo(), RelationReloadNailed(), RelationSetNewRelfilenode(), RemoveConstraintById(), RemoveInheritance(), RemoveRoleFromObjectPolicy(), renameatt_internal(), RenameConstraintById(), RenameEnumLabel(), RenameRelationInternal(), RenameRewriteRule(), RenameSchema(), RenameTypeInternal(), RenumberEnumType(), replorigin_create(), rewrite_heap_dead_tuple(), rewrite_heap_tuple(), SetMatViewPopulatedState(), SetRelationHasSubclass(), SetRelationNumChecks(), SetRelationRuleStatus(), SetSecurityLabel(), SetSharedSecurityLabel(), shdepAddDependency(), shdepChangeDep(), SPI_freetuple(), statext_store(), StoreAttrDefault(), storeOperators(), StorePartitionBound(), storeProcedures(), StoreSingleInheritance(), swap_relation_files(), table_recheck_autovac(), toast_save_datum(), TypeShellMake(), update_attstats(), update_default_partition_oid(), update_relispartition(), UpdateIndexRelation(), vac_update_datfrozenxid(), writetup_cluster(), and xpath_table().

1774 {
1775  pfree(htup);
1776 }
void pfree(void *pointer)
Definition: mcxt.c:1031

◆ heap_getsysattr()

Datum heap_getsysattr ( HeapTuple  tup,
int  attnum,
TupleDesc  tupleDesc,
bool isnull 
)

Definition at line 666 of file heaptuple.c.

References Assert, CommandIdGetDatum, elog, ERROR, HeapTupleGetOid, HeapTupleHeaderGetRawCommandId, HeapTupleHeaderGetRawXmax, HeapTupleHeaderGetRawXmin, MaxCommandIdAttributeNumber, MaxTransactionIdAttributeNumber, MinCommandIdAttributeNumber, MinTransactionIdAttributeNumber, ObjectIdAttributeNumber, ObjectIdGetDatum, PointerGetDatum, SelfItemPointerAttributeNumber, HeapTupleData::t_data, HeapTupleData::t_self, HeapTupleData::t_tableOid, TableOidAttributeNumber, and TransactionIdGetDatum.

Referenced by ExecInterpExpr(), expanded_record_fetch_field(), slot_getattr(), and slot_getsysattr().

667 {
668  Datum result;
669 
670  Assert(tup);
671 
672  /* Currently, no sys attribute ever reads as NULL. */
673  *isnull = false;
674 
675  switch (attnum)
676  {
678  /* pass-by-reference datatype */
679  result = PointerGetDatum(&(tup->t_self));
680  break;
682  result = ObjectIdGetDatum(HeapTupleGetOid(tup));
683  break;
686  break;
689  break;
692 
693  /*
694  * cmin and cmax are now both aliases for the same field, which
695  * can in fact also be a combo command id. XXX perhaps we should
696  * return the "real" cmin or cmax if possible, that is if we are
697  * inside the originating transaction?
698  */
700  break;
702  result = ObjectIdGetDatum(tup->t_tableOid);
703  break;
704  default:
705  elog(ERROR, "invalid attnum: %d", attnum);
706  result = 0; /* keep compiler quiet */
707  break;
708  }
709  return result;
710 }
#define ObjectIdAttributeNumber
Definition: sysattr.h:22
#define PointerGetDatum(X)
Definition: postgres.h:541
#define MinCommandIdAttributeNumber
Definition: sysattr.h:24
HeapTupleHeader t_data
Definition: htup.h:68
#define HeapTupleHeaderGetRawXmax(tup)
Definition: htup_details.h:374
#define ObjectIdGetDatum(X)
Definition: postgres.h:492
#define ERROR
Definition: elog.h:43
ItemPointerData t_self
Definition: htup.h:65
#define TableOidAttributeNumber
Definition: sysattr.h:27
Oid t_tableOid
Definition: htup.h:66
#define MaxCommandIdAttributeNumber
Definition: sysattr.h:26
#define MaxTransactionIdAttributeNumber
Definition: sysattr.h:25
#define TransactionIdGetDatum(X)
Definition: postgres.h:506
uintptr_t Datum
Definition: postgres.h:367
int16 attnum
Definition: pg_attribute.h:79
#define Assert(condition)
Definition: c.h:699
#define HeapTupleHeaderGetRawXmin(tup)
Definition: htup_details.h:307
#define HeapTupleHeaderGetRawCommandId(tup)
Definition: htup_details.h:390
#define CommandIdGetDatum(X)
Definition: postgres.h:527
#define SelfItemPointerAttributeNumber
Definition: sysattr.h:21
#define elog
Definition: elog.h:219
#define HeapTupleGetOid(tuple)
Definition: htup_details.h:707
#define MinTransactionIdAttributeNumber
Definition: sysattr.h:23

◆ heap_modify_tuple()

HeapTuple heap_modify_tuple ( HeapTuple  tuple,
TupleDesc  tupleDesc,
Datum replValues,
bool replIsnull,
bool doReplace 
)

Definition at line 1173 of file heaptuple.c.

References heap_deform_tuple(), heap_form_tuple(), HeapTupleGetOid, HeapTupleSetOid, tupleDesc::natts, palloc(), pfree(), HeapTupleHeaderData::t_ctid, HeapTupleData::t_data, HeapTupleData::t_self, HeapTupleData::t_tableOid, tupleDesc::tdhasoid, and values.

Referenced by AddRoleMems(), AlterCollation(), AlterDatabase(), AlterDatabaseOwner(), AlterDomainDefault(), AlterForeignDataWrapper(), AlterForeignDataWrapperOwner_internal(), AlterForeignServer(), AlterForeignServerOwner_internal(), AlterFunction(), AlterObjectNamespace_internal(), AlterObjectOwner_internal(), AlterObjectRename_internal(), AlterOperator(), AlterPolicy(), AlterPublicationOptions(), AlterRole(), AlterSchemaOwner_internal(), AlterSetting(), AlterSubscription(), AlterTableSpaceOptions(), AlterTSDictionary(), AlterTypeOwnerInternal(), AlterUserMapping(), ApplyExtensionUpdates(), ATExecAlterColumnGenericOptions(), ATExecChangeOwner(), ATExecDetachPartition(), ATExecGenericOptions(), ATExecSetOptions(), ATExecSetRelOptions(), change_owner_fix_column_acls(), copyTemplateDependencies(), create_proc_lang(), CreateComments(), CreateSharedComments(), CreateTransform(), DelRoleMems(), ExecGrant_Attribute(), ExecGrant_Database(), ExecGrant_Fdw(), ExecGrant_ForeignServer(), ExecGrant_Function(), ExecGrant_Language(), ExecGrant_Largeobject(), ExecGrant_Namespace(), ExecGrant_Relation(), ExecGrant_Tablespace(), ExecGrant_Type(), extension_config_remove(), InsertRule(), inv_truncate(), inv_write(), MakeConfigurationMapping(), movedb(), OperatorCreate(), pg_extension_config_dump(), plperl_modify_tuple(), PLy_modify_tuple(), ProcedureCreate(), recordExtensionInitPrivWorker(), RelationClearMissing(), RemoveAttributeById(), RemoveRoleFromObjectPolicy(), RenameRole(), SetAttrMissing(), SetDefaultACL(), SetSecurityLabel(), SetSharedSecurityLabel(), statext_store(), StoreAttrDefault(), StorePartitionBound(), TypeCreate(), update_attstats(), and UpdateSubscriptionRelState().

1178 {
1179  int numberOfAttributes = tupleDesc->natts;
1180  int attoff;
1181  Datum *values;
1182  bool *isnull;
1183  HeapTuple newTuple;
1184 
1185  /*
1186  * allocate and fill values and isnull arrays from either the tuple or the
1187  * repl information, as appropriate.
1188  *
1189  * NOTE: it's debatable whether to use heap_deform_tuple() here or just
1190  * heap_getattr() only the non-replaced columns. The latter could win if
1191  * there are many replaced columns and few non-replaced ones. However,
1192  * heap_deform_tuple costs only O(N) while the heap_getattr way would cost
1193  * O(N^2) if there are many non-replaced columns, so it seems better to
1194  * err on the side of linear cost.
1195  */
1196  values = (Datum *) palloc(numberOfAttributes * sizeof(Datum));
1197  isnull = (bool *) palloc(numberOfAttributes * sizeof(bool));
1198 
1199  heap_deform_tuple(tuple, tupleDesc, values, isnull);
1200 
1201  for (attoff = 0; attoff < numberOfAttributes; attoff++)
1202  {
1203  if (doReplace[attoff])
1204  {
1205  values[attoff] = replValues[attoff];
1206  isnull[attoff] = replIsnull[attoff];
1207  }
1208  }
1209 
1210  /*
1211  * create a new tuple from the values and isnull arrays
1212  */
1213  newTuple = heap_form_tuple(tupleDesc, values, isnull);
1214 
1215  pfree(values);
1216  pfree(isnull);
1217 
1218  /*
1219  * copy the identification info of the old tuple: t_ctid, t_self, and OID
1220  * (if any)
1221  */
1222  newTuple->t_data->t_ctid = tuple->t_data->t_ctid;
1223  newTuple->t_self = tuple->t_self;
1224  newTuple->t_tableOid = tuple->t_tableOid;
1225  if (tupleDesc->tdhasoid)
1226  HeapTupleSetOid(newTuple, HeapTupleGetOid(tuple));
1227 
1228  return newTuple;
1229 }
bool tdhasoid
Definition: tupdesc.h:85
HeapTuple heap_form_tuple(TupleDesc tupleDescriptor, Datum *values, bool *isnull)
Definition: heaptuple.c:1074
int natts
Definition: tupdesc.h:82
HeapTupleHeader t_data
Definition: htup.h:68
#define HeapTupleSetOid(tuple, oid)
Definition: htup_details.h:710
void pfree(void *pointer)
Definition: mcxt.c:1031
ItemPointerData t_ctid
Definition: htup_details.h:159
ItemPointerData t_self
Definition: htup.h:65
Oid t_tableOid
Definition: htup.h:66
uintptr_t Datum
Definition: postgres.h:367
void heap_deform_tuple(HeapTuple tuple, TupleDesc tupleDesc, Datum *values, bool *isnull)
Definition: heaptuple.c:1315
static Datum values[MAXATTR]
Definition: bootstrap.c:164
void * palloc(Size size)
Definition: mcxt.c:924
#define HeapTupleGetOid(tuple)
Definition: htup_details.h:707

◆ heap_modify_tuple_by_cols()

HeapTuple heap_modify_tuple_by_cols ( HeapTuple  tuple,
TupleDesc  tupleDesc,
int  nCols,
int *  replCols,
Datum replValues,
bool replIsnull 
)

Definition at line 1244 of file heaptuple.c.

References attnum, elog, ERROR, heap_deform_tuple(), heap_form_tuple(), HeapTupleGetOid, HeapTupleSetOid, i, tupleDesc::natts, palloc(), pfree(), HeapTupleHeaderData::t_ctid, HeapTupleData::t_data, HeapTupleData::t_self, HeapTupleData::t_tableOid, tupleDesc::tdhasoid, and values.

Referenced by autoinc(), insert_username(), moddatetime(), timetravel(), and tsvector_update_trigger().

1250 {
1251  int numberOfAttributes = tupleDesc->natts;
1252  Datum *values;
1253  bool *isnull;
1254  HeapTuple newTuple;
1255  int i;
1256 
1257  /*
1258  * allocate and fill values and isnull arrays from the tuple, then replace
1259  * selected columns from the input arrays.
1260  */
1261  values = (Datum *) palloc(numberOfAttributes * sizeof(Datum));
1262  isnull = (bool *) palloc(numberOfAttributes * sizeof(bool));
1263 
1264  heap_deform_tuple(tuple, tupleDesc, values, isnull);
1265 
1266  for (i = 0; i < nCols; i++)
1267  {
1268  int attnum = replCols[i];
1269 
1270  if (attnum <= 0 || attnum > numberOfAttributes)
1271  elog(ERROR, "invalid column number %d", attnum);
1272  values[attnum - 1] = replValues[i];
1273  isnull[attnum - 1] = replIsnull[i];
1274  }
1275 
1276  /*
1277  * create a new tuple from the values and isnull arrays
1278  */
1279  newTuple = heap_form_tuple(tupleDesc, values, isnull);
1280 
1281  pfree(values);
1282  pfree(isnull);
1283 
1284  /*
1285  * copy the identification info of the old tuple: t_ctid, t_self, and OID
1286  * (if any)
1287  */
1288  newTuple->t_data->t_ctid = tuple->t_data->t_ctid;
1289  newTuple->t_self = tuple->t_self;
1290  newTuple->t_tableOid = tuple->t_tableOid;
1291  if (tupleDesc->tdhasoid)
1292  HeapTupleSetOid(newTuple, HeapTupleGetOid(tuple));
1293 
1294  return newTuple;
1295 }
bool tdhasoid
Definition: tupdesc.h:85
HeapTuple heap_form_tuple(TupleDesc tupleDescriptor, Datum *values, bool *isnull)
Definition: heaptuple.c:1074
int natts
Definition: tupdesc.h:82
HeapTupleHeader t_data
Definition: htup.h:68
#define HeapTupleSetOid(tuple, oid)
Definition: htup_details.h:710
void pfree(void *pointer)
Definition: mcxt.c:1031
#define ERROR
Definition: elog.h:43
ItemPointerData t_ctid
Definition: htup_details.h:159
ItemPointerData t_self
Definition: htup.h:65
Oid t_tableOid
Definition: htup.h:66
uintptr_t Datum
Definition: postgres.h:367
int16 attnum
Definition: pg_attribute.h:79
void heap_deform_tuple(HeapTuple tuple, TupleDesc tupleDesc, Datum *values, bool *isnull)
Definition: heaptuple.c:1315
static Datum values[MAXATTR]
Definition: bootstrap.c:164
void * palloc(Size size)
Definition: mcxt.c:924
int i
#define elog
Definition: elog.h:219
#define HeapTupleGetOid(tuple)
Definition: htup_details.h:707

◆ heap_tuple_from_minimal_tuple()

HeapTuple heap_tuple_from_minimal_tuple ( MinimalTuple  mtup)

Definition at line 1899 of file heaptuple.c.

References HEAPTUPLESIZE, InvalidOid, ItemPointerSetInvalid, MINIMAL_TUPLE_OFFSET, offsetof, palloc(), HeapTupleData::t_data, HeapTupleData::t_len, MinimalTupleData::t_len, HeapTupleData::t_self, and HeapTupleData::t_tableOid.

Referenced by ExecCopySlotTuple().

1900 {
1901  HeapTuple result;
1902  uint32 len = mtup->t_len + MINIMAL_TUPLE_OFFSET;
1903 
1904  result = (HeapTuple) palloc(HEAPTUPLESIZE + len);
1905  result->t_len = len;
1906  ItemPointerSetInvalid(&(result->t_self));
1907  result->t_tableOid = InvalidOid;
1908  result->t_data = (HeapTupleHeader) ((char *) result + HEAPTUPLESIZE);
1909  memcpy((char *) result->t_data + MINIMAL_TUPLE_OFFSET, mtup, mtup->t_len);
1910  memset(result->t_data, 0, offsetof(HeapTupleHeaderData, t_infomask2));
1911  return result;
1912 }
HeapTupleData * HeapTuple
Definition: htup.h:71
HeapTupleHeaderData * HeapTupleHeader
Definition: htup.h:23
HeapTupleHeader t_data
Definition: htup.h:68
ItemPointerData t_self
Definition: htup.h:65
uint32 t_len
Definition: htup.h:64
unsigned int uint32
Definition: c.h:325
Oid t_tableOid
Definition: htup.h:66
#define InvalidOid
Definition: postgres_ext.h:36
#define MINIMAL_TUPLE_OFFSET
Definition: htup_details.h:632
#define ItemPointerSetInvalid(pointer)
Definition: itemptr.h:172
void * palloc(Size size)
Definition: mcxt.c:924
#define HEAPTUPLESIZE
Definition: htup.h:73
#define offsetof(type, field)
Definition: c.h:622

◆ minimal_expand_tuple()

MinimalTuple minimal_expand_tuple ( HeapTuple  sourceTuple,
TupleDesc  tupleDesc 
)

Definition at line 1011 of file heaptuple.c.

References expand_tuple().

Referenced by ExecCopySlotMinimalTuple().

1012 {
1013  MinimalTuple minimalTuple;
1014 
1015  expand_tuple(NULL, &minimalTuple, sourceTuple, tupleDesc);
1016  return minimalTuple;
1017 }
static void expand_tuple(HeapTuple *targetHeapTuple, MinimalTuple *targetMinimalTuple, HeapTuple sourceTuple, TupleDesc tupleDesc)
Definition: heaptuple.c:774

◆ minimal_tuple_from_heap_tuple()

MinimalTuple minimal_tuple_from_heap_tuple ( HeapTuple  htup)

Definition at line 1921 of file heaptuple.c.

References Assert, MINIMAL_TUPLE_OFFSET, palloc(), HeapTupleData::t_data, HeapTupleData::t_len, and MinimalTupleData::t_len.

Referenced by copytup_heap(), and ExecCopySlotMinimalTuple().

1922 {
1923  MinimalTuple result;
1924  uint32 len;
1925 
1927  len = htup->t_len - MINIMAL_TUPLE_OFFSET;
1928  result = (MinimalTuple) palloc(len);
1929  memcpy(result, (char *) htup->t_data + MINIMAL_TUPLE_OFFSET, len);
1930  result->t_len = len;
1931  return result;
1932 }
HeapTupleHeader t_data
Definition: htup.h:68
uint32 t_len
Definition: htup.h:64
MinimalTupleData * MinimalTuple
Definition: htup.h:27
unsigned int uint32
Definition: c.h:325
#define Assert(condition)
Definition: c.h:699
#define MINIMAL_TUPLE_OFFSET
Definition: htup_details.h:632
void * palloc(Size size)
Definition: mcxt.c:924

◆ nocachegetattr()

Datum nocachegetattr ( HeapTuple  tup,
int  attnum,
TupleDesc  att 
)

Definition at line 462 of file heaptuple.c.

References Assert, att_addlength_pointer, att_align_nominal, att_align_pointer, att_isnull, attlen, attnum, byte, fetchatt, HeapTupleHasNulls, HeapTupleHasVarWidth, HeapTupleNoNulls, i, tupleDesc::natts, HeapTupleHeaderData::t_bits, HeapTupleData::t_data, HeapTupleHeaderData::t_hoff, and TupleDescAttr.

Referenced by heapgettup_pagemode().

465 {
466  HeapTupleHeader tup = tuple->t_data;
467  char *tp; /* ptr to data part of tuple */
468  bits8 *bp = tup->t_bits; /* ptr to null bitmap in tuple */
469  bool slow = false; /* do we have to walk attrs? */
470  int off; /* current offset within data */
471 
472  /* ----------------
473  * Three cases:
474  *
475  * 1: No nulls and no variable-width attributes.
476  * 2: Has a null or a var-width AFTER att.
477  * 3: Has nulls or var-widths BEFORE att.
478  * ----------------
479  */
480 
481  attnum--;
482 
483  if (!HeapTupleNoNulls(tuple))
484  {
485  /*
486  * there's a null somewhere in the tuple
487  *
488  * check to see if any preceding bits are null...
489  */
490  int byte = attnum >> 3;
491  int finalbit = attnum & 0x07;
492 
493  /* check for nulls "before" final bit of last byte */
494  if ((~bp[byte]) & ((1 << finalbit) - 1))
495  slow = true;
496  else
497  {
498  /* check for nulls in any "earlier" bytes */
499  int i;
500 
501  for (i = 0; i < byte; i++)
502  {
503  if (bp[i] != 0xFF)
504  {
505  slow = true;
506  break;
507  }
508  }
509  }
510  }
511 
512  tp = (char *) tup + tup->t_hoff;
513 
514  if (!slow)
515  {
516  Form_pg_attribute att;
517 
518  /*
519  * If we get here, there are no nulls up to and including the target
520  * attribute. If we have a cached offset, we can use it.
521  */
523  if (att->attcacheoff >= 0)
524  return fetchatt(att, tp + att->attcacheoff);
525 
526  /*
527  * Otherwise, check for non-fixed-length attrs up to and including
528  * target. If there aren't any, it's safe to cheaply initialize the
529  * cached offsets for these attrs.
530  */
531  if (HeapTupleHasVarWidth(tuple))
532  {
533  int j;
534 
535  for (j = 0; j <= attnum; j++)
536  {
537  if (TupleDescAttr(tupleDesc, j)->attlen <= 0)
538  {
539  slow = true;
540  break;
541  }
542  }
543  }
544  }
545 
546  if (!slow)
547  {
548  int natts = tupleDesc->natts;
549  int j = 1;
550 
551  /*
552  * If we get here, we have a tuple with no nulls or var-widths up to
553  * and including the target attribute, so we can use the cached offset
554  * ... only we don't have it yet, or we'd not have got here. Since
555  * it's cheap to compute offsets for fixed-width columns, we take the
556  * opportunity to initialize the cached offsets for *all* the leading
557  * fixed-width columns, in hope of avoiding future visits to this
558  * routine.
559  */
560  TupleDescAttr(tupleDesc, 0)->attcacheoff = 0;
561 
562  /* we might have set some offsets in the slow path previously */
563  while (j < natts && TupleDescAttr(tupleDesc, j)->attcacheoff > 0)
564  j++;
565 
566  off = TupleDescAttr(tupleDesc, j - 1)->attcacheoff +
567  TupleDescAttr(tupleDesc, j - 1)->attlen;
568 
569  for (; j < natts; j++)
570  {
572 
573  if (att->attlen <= 0)
574  break;
575 
576  off = att_align_nominal(off, att->attalign);
577 
578  att->attcacheoff = off;
579 
580  off += att->attlen;
581  }
582 
583  Assert(j > attnum);
584 
585  off = TupleDescAttr(tupleDesc, attnum)->attcacheoff;
586  }
587  else
588  {
589  bool usecache = true;
590  int i;
591 
592  /*
593  * Now we know that we have to walk the tuple CAREFULLY. But we still
594  * might be able to cache some offsets for next time.
595  *
596  * Note - This loop is a little tricky. For each non-null attribute,
597  * we have to first account for alignment padding before the attr,
598  * then advance over the attr based on its length. Nulls have no
599  * storage and no alignment padding either. We can use/set
600  * attcacheoff until we reach either a null or a var-width attribute.
601  */
602  off = 0;
603  for (i = 0;; i++) /* loop exit is at "break" */
604  {
606 
607  if (HeapTupleHasNulls(tuple) && att_isnull(i, bp))
608  {
609  usecache = false;
610  continue; /* this cannot be the target att */
611  }
612 
613  /* If we know the next offset, we can skip the rest */
614  if (usecache && att->attcacheoff >= 0)
615  off = att->attcacheoff;
616  else if (att->attlen == -1)
617  {
618  /*
619  * We can only cache the offset for a varlena attribute if the
620  * offset is already suitably aligned, so that there would be
621  * no pad bytes in any case: then the offset will be valid for
622  * either an aligned or unaligned value.
623  */
624  if (usecache &&
625  off == att_align_nominal(off, att->attalign))
626  att->attcacheoff = off;
627  else
628  {
629  off = att_align_pointer(off, att->attalign, -1,
630  tp + off);
631  usecache = false;
632  }
633  }
634  else
635  {
636  /* not varlena, so safe to use att_align_nominal */
637  off = att_align_nominal(off, att->attalign);
638 
639  if (usecache)
640  att->attcacheoff = off;
641  }
642 
643  if (i == attnum)
644  break;
645 
646  off = att_addlength_pointer(off, att->attlen, tp + off);
647 
648  if (usecache && att->attlen <= 0)
649  usecache = false;
650  }
651  }
652 
653  return fetchatt(TupleDescAttr(tupleDesc, attnum), tp + off);
654 }
#define HeapTupleHasVarWidth(tuple)
Definition: htup_details.h:680
#define att_align_nominal(cur_offset, attalign)
Definition: tupmacs.h:144
bits8 t_bits[FLEXIBLE_ARRAY_MEMBER]
Definition: htup_details.h:176
#define att_isnull(ATT, BITS)
Definition: tupmacs.h:21
#define TupleDescAttr(tupdesc, i)
Definition: tupdesc.h:93
int natts
Definition: tupdesc.h:82
#define fetchatt(A, T)
Definition: tupmacs.h:37
HeapTupleHeader t_data
Definition: htup.h:68
#define HeapTupleHasNulls(tuple)
Definition: htup_details.h:674
FormData_pg_attribute * Form_pg_attribute
Definition: pg_attribute.h:197
#define att_addlength_pointer(cur_offset, attlen, attptr)
Definition: tupmacs.h:172
#define HeapTupleNoNulls(tuple)
Definition: htup_details.h:677
#define byte(x, n)
Definition: rijndael.c:68
int16 attlen
Definition: pg_attribute.h:64
uint8 bits8
Definition: c.h:332
#define att_align_pointer(cur_offset, attalign, attlen, attptr)
Definition: tupmacs.h:122
int16 attnum
Definition: pg_attribute.h:79
#define Assert(condition)
Definition: c.h:699
int i

◆ varsize_any()

size_t varsize_any ( void *  p)

Definition at line 1939 of file heaptuple.c.

References VARSIZE_ANY.

1940 {
1941  return VARSIZE_ANY(p);
1942 }
#define VARSIZE_ANY(PTR)
Definition: postgres.h:335