66 #include "utils/fmgroids.h" 83 #define TCFLAGS_HAVE_PG_TYPE_DATA 0x000001 84 #define TCFLAGS_CHECKED_BTREE_OPCLASS 0x000002 85 #define TCFLAGS_CHECKED_HASH_OPCLASS 0x000004 86 #define TCFLAGS_CHECKED_EQ_OPR 0x000008 87 #define TCFLAGS_CHECKED_LT_OPR 0x000010 88 #define TCFLAGS_CHECKED_GT_OPR 0x000020 89 #define TCFLAGS_CHECKED_CMP_PROC 0x000040 90 #define TCFLAGS_CHECKED_HASH_PROC 0x000080 91 #define TCFLAGS_CHECKED_HASH_EXTENDED_PROC 0x000100 92 #define TCFLAGS_CHECKED_ELEM_PROPERTIES 0x000200 93 #define TCFLAGS_HAVE_ELEM_EQUALITY 0x000400 94 #define TCFLAGS_HAVE_ELEM_COMPARE 0x000800 95 #define TCFLAGS_HAVE_ELEM_HASHING 0x001000 96 #define TCFLAGS_HAVE_ELEM_EXTENDED_HASHING 0x002000 97 #define TCFLAGS_CHECKED_FIELD_PROPERTIES 0x004000 98 #define TCFLAGS_HAVE_FIELD_EQUALITY 0x008000 99 #define TCFLAGS_HAVE_FIELD_COMPARE 0x010000 100 #define TCFLAGS_HAVE_FIELD_HASHING 0x020000 101 #define TCFLAGS_HAVE_FIELD_EXTENDED_HASHING 0x040000 102 #define TCFLAGS_CHECKED_DOMAIN_CONSTRAINTS 0x080000 103 #define TCFLAGS_DOMAIN_BASE_IS_COMPOSITE 0x100000 106 #define TCFLAGS_OPERATOR_FLAGS \ 107 (~(TCFLAGS_HAVE_PG_TYPE_DATA | \ 108 TCFLAGS_CHECKED_DOMAIN_CONSTRAINTS | \ 109 TCFLAGS_DOMAIN_BASE_IS_COMPOSITE)) 292 static int dcs_cmp(
const void *a,
const void *b);
318 static int enum_oid_cmp(
const void *left,
const void *right);
343 if (TypeCacheHash == NULL)
350 TypeCacheHash =
hash_create(
"Type information cache", 64,
368 if (typentry == NULL)
383 (
errcode(ERRCODE_UNDEFINED_OBJECT),
384 errmsg(
"type with OID %u does not exist", type_id)));
386 if (!typtup->typisdefined)
388 (
errcode(ERRCODE_UNDEFINED_OBJECT),
389 errmsg(
"type \"%s\" is only a shell",
406 typentry->
typlen = typtup->typlen;
407 typentry->
typbyval = typtup->typbyval;
408 typentry->
typalign = typtup->typalign;
410 typentry->
typtype = typtup->typtype;
411 typentry->
typrelid = typtup->typrelid;
413 typentry->
typelem = typtup->typelem;
418 if (typentry->
typtype == TYPTYPE_DOMAIN)
421 firstDomainTypeEntry = typentry;
438 (
errcode(ERRCODE_UNDEFINED_OBJECT),
439 errmsg(
"type with OID %u does not exist", type_id)));
441 if (!typtup->typisdefined)
443 (
errcode(ERRCODE_UNDEFINED_OBJECT),
444 errmsg(
"type \"%s\" is only a shell",
451 typentry->
typlen = typtup->typlen;
452 typentry->
typbyval = typtup->typbyval;
453 typentry->
typalign = typtup->typalign;
455 typentry->
typtype = typtup->typtype;
456 typentry->
typrelid = typtup->typrelid;
458 typentry->
typelem = typtup->typelem;
567 if (eq_opr == ARRAY_EQ_OP &&
570 else if (eq_opr == RECORD_EQ_OP &&
575 if (typentry->
eq_opr != eq_opr)
578 typentry->
eq_opr = eq_opr;
604 if (lt_opr == ARRAY_LT_OP &&
607 else if (lt_opr == RECORD_LT_OP &&
611 typentry->
lt_opr = lt_opr;
629 if (gt_opr == ARRAY_GT_OP &&
632 else if (gt_opr == RECORD_GT_OP &&
636 typentry->
gt_opr = gt_opr;
654 if (cmp_proc == F_BTARRAYCMP &&
657 else if (cmp_proc == F_BTRECORDCMP &&
692 if (hash_proc == F_HASH_ARRAY &&
695 else if (hash_proc == F_HASH_RECORD &&
698 else if (hash_proc == F_HASH_RANGE &&
705 if (hash_proc == F_HASH_MULTIRANGE &&
741 if (hash_extended_proc == F_HASH_ARRAY_EXTENDED &&
744 else if (hash_extended_proc == F_HASH_RECORD_EXTENDED &&
747 else if (hash_extended_proc == F_HASH_RANGE_EXTENDED &&
754 if (hash_extended_proc == F_HASH_MULTIRANGE_EXTENDED &&
817 typentry->
typtype == TYPTYPE_COMPOSITE)
829 typentry->
typtype == TYPTYPE_RANGE)
842 typentry->
typtype == TYPTYPE_MULTIRANGE)
852 typentry->
typtype == TYPTYPE_DOMAIN)
860 typentry->
typtype == TYPTYPE_DOMAIN)
877 elog(
ERROR,
"invalid typrelid for composite type %u",
922 elog(
ERROR,
"cache lookup failed for range type %u",
926 subtypeOid = pg_range->rngsubtype;
928 opclassOid = pg_range->rngsubopc;
929 canonicalOid = pg_range->rngcanonical;
930 subdiffOid = pg_range->rngsubdiff;
941 elog(
ERROR,
"missing support function %d(%u,%u) in opfamily %u",
969 elog(
ERROR,
"cache lookup failed for multirange type %u",
989 bool notNull =
false;
1033 elog(
ERROR,
"cache lookup failed for type %u", typeOid);
1036 if (typTup->typtype != TYPTYPE_DOMAIN)
1044 if (typTup->typnotnull)
1049 Anum_pg_constraint_contypid,
1066 if (c->contype != CONSTRAINT_CHECK)
1070 val =
fastgetattr(conTup, Anum_pg_constraint_conbin,
1071 conRel->
rd_att, &isNull);
1073 elog(
ERROR,
"domain \"%s\" constraint \"%s\" has NULL conbin",
1085 "Domain constraints",
1126 else if (nccons >= cconslen)
1132 ccons[nccons++] = r;
1157 typeOid = typTup->typbasetype;
1177 "Domain constraints",
1226 return strcmp((*ca)->name, (*cb)->name);
1274 foreach(lc, constraints)
1285 result =
lappend(result, newr);
1348 typentry->
typtype == TYPTYPE_DOMAIN)
1519 if (typentry->
type_id == RECORDOID)
1526 else if (typentry->
typtype == TYPTYPE_COMPOSITE)
1533 if (typentry->
tupDesc == NULL)
1545 for (i = 0; i < tupdesc->
natts; i++)
1550 if (attr->attisdropped)
1571 typentry->
flags |= newflags;
1575 else if (typentry->
typtype == TYPTYPE_DOMAIN)
1593 if (baseentry->
typtype == TYPTYPE_COMPOSITE)
1634 typentry->
typtype == TYPTYPE_RANGE)
1673 if (typentry->
rngtype == NULL &&
1674 typentry->
typtype == TYPTYPE_MULTIRANGE)
1700 if (RecordCacheArray == NULL)
1713 while (typmod >= newlen)
1721 newlen *
sizeof(uint64));
1737 if (type_id != RECORDOID)
1745 if (typentry->
tupDesc == NULL && !noError)
1747 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
1748 errmsg(
"type %s is not composite",
1761 RecordCacheArray[typmod] != NULL)
1762 return RecordCacheArray[typmod];
1788 RecordCacheArray[typmod] = tupdesc;
1800 return RecordCacheArray[typmod];
1807 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
1808 errmsg(
"record type has not been registered")));
1848 if (tupDesc != NULL)
1886 if (type_id != RECORDOID)
1897 if (typentry->
typtype == TYPTYPE_DOMAIN)
1901 if (typentry->
tupDesc == NULL && !noError)
1903 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
1904 errmsg(
"type %s is not composite",
1910 if (tupDesc != NULL)
1955 if (RecordCacheHash == NULL)
1964 RecordCacheHash =
hash_create(
"Record information cache", 64,
1977 if (found && recentry->
tupdesc != NULL)
1989 if (entDesc == NULL)
1997 RecordCacheArray[entDesc->
tdtypmod] = entDesc;
2022 if (type_id != RECORDOID)
2030 if (typentry->
tupDesc == NULL)
2032 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
2033 errmsg(
"type %s is not composite",
2044 RecordCacheArray[typmod] != NULL)
2102 record_table =
dshash_create(area, &srtr_record_table_params, area);
2105 typmod_table =
dshash_create(area, &srtr_typmod_table_params, NULL);
2127 tupdesc = RecordCacheArray[typmod];
2128 if (tupdesc == NULL)
2139 elog(
ERROR,
"cannot create duplicate shared record typmod");
2145 record_table_key.
shared =
false;
2214 &srtr_record_table_params,
2218 &srtr_typmod_table_params,
2274 if (typentry->
typtype == TYPTYPE_COMPOSITE)
2281 if (typentry->
tupDesc != NULL)
2307 else if (typentry->
typtype == TYPTYPE_DOMAIN)
2340 if (hashvalue == 0 || typentry->
type_id_hash == hashvalue)
2409 for (typentry = firstDomainTypeEntry;
2427 if (arg < enumdata->bitmap_base)
2430 if (offset > (
Oid) INT_MAX)
2488 if (item1 == NULL || item2 == NULL)
2506 elog(
ERROR,
"enum value %u not found in cache for enum %s",
2509 elog(
ERROR,
"enum value %u not found in cache for enum %s",
2542 if (tcache->
typtype != TYPTYPE_ENUM)
2544 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
2545 errmsg(
"%s is not an enum",
2561 Anum_pg_enum_enumtypid,
2575 if (numitems >= maxitems)
2580 items[numitems].
enum_oid = en->oid;
2581 items[numitems].
sort_order = en->enumsortorder;
2607 for (start_pos = 0; start_pos < numitems - 1; start_pos++)
2613 int this_bm_size = 1;
2618 for (i = start_pos + 1; i < numitems; i++)
2627 if (items[i].sort_order > prev_order)
2636 if (this_bm_size > bm_size)
2639 bitmap_base = start_oid;
2640 bitmap = this_bitmap;
2641 bm_size = this_bm_size;
2652 if (bm_size >= (numitems - start_pos - 1))
2755 if (record_table_entry)
2759 record_table_entry);
2786 elog(
ERROR,
"cannot create duplicate shared record typmod");
2794 typmod_table_entry->
typmod = typmod;
2797 typmod_table_entry);
2813 record_table_entry);
2835 record_table_entry);
MemoryContextCallback callback
int compare_values_of_enum(TypeCacheEntry *tcache, Oid arg1, Oid arg2)
struct TypeCacheEnumData TypeCacheEnumData
MemoryContextCallbackFunction func
struct TypeCacheEnumData * enumData
static bool array_element_has_hashing(TypeCacheEntry *typentry)
static void load_typcache_tupdesc(TypeCacheEntry *typentry)
void IncrTupleDescRefCount(TupleDesc tupdesc)
Oid getBaseTypeAndTypmod(Oid typid, int32 *typmod)
FormData_pg_range * Form_pg_range
FmgrInfo rng_cmp_proc_finfo
TupleDesc CreateTupleDescCopy(TupleDesc tupdesc)
void MemoryContextDelete(MemoryContext context)
#define AllocSetContextCreate
DomainConstraintCache * dcc
void table_close(Relation relation, LOCKMODE lockmode)
#define TYPECACHE_RANGE_INFO
#define TCFLAGS_CHECKED_FIELD_PROPERTIES
Oid GetDefaultOpClass(Oid type_id, Oid am_id)
#define BTGreaterStrategyNumber
void systable_endscan(SysScanDesc sysscan)
Bitmapset * bms_copy(const Bitmapset *a)
dshash_table * dshash_attach(dsa_area *area, const dshash_parameters *params, dshash_table_handle handle, void *arg)
#define fastgetattr(tup, attnum, tupleDesc, isnull)
#define TCFLAGS_CHECKED_EQ_OPR
void UpdateDomainConstraintRef(DomainConstraintRef *ref)
static TypeCacheEntry * firstDomainTypeEntry
TupleDesc lookup_rowtype_tupdesc(Oid type_id, int32 typmod)
#define TYPECACHE_HASH_EXTENDED_PROC_FINFO
#define TCFLAGS_DOMAIN_BASE_IS_COMPOSITE
static bool multirange_element_has_extended_hashing(TypeCacheEntry *typentry)
#define RelationGetDescr(relation)
#define TCFLAGS_HAVE_ELEM_COMPARE
static void dccref_deletion_callback(void *arg)
DomainConstraintType constrainttype
static bool record_fields_have_extended_hashing(TypeCacheEntry *typentry)
dsa_pointer dshash_table_handle
#define TCFLAGS_CHECKED_HASH_EXTENDED_PROC
DomainConstraintCache * domainData
static TupleDesc find_or_make_matching_shared_tupledesc(TupleDesc tupdesc)
#define TYPECACHE_MULTIRANGE_INFO
#define PointerGetDatum(X)
void MemoryContextSetParent(MemoryContext context, MemoryContext new_parent)
struct RecordCacheEntry RecordCacheEntry
struct TypeCacheEntry TypeCacheEntry
#define TupleDescAttr(tupdesc, i)
char * pstrdup(const char *in)
#define TYPECACHE_EQ_OPR_FINFO
#define ALLOCSET_SMALL_SIZES
static const dshash_parameters srtr_record_table_params
dshash_table * shared_record_table
Expr * expression_planner(Expr *expr)
#define TYPECACHE_HASH_PROC_FINFO
static MemoryContext MemoryContextSwitchTo(MemoryContext context)
static void cache_range_element_properties(TypeCacheEntry *typentry)
static int shared_record_table_compare(const void *a, const void *b, size_t size, void *arg)
static uint32 shared_record_table_hash(const void *a, size_t size, void *arg)
#define FLEXIBLE_ARRAY_MEMBER
#define TCFLAGS_HAVE_ELEM_EXTENDED_HASHING
int errcode(int sqlerrcode)
void * stringToNode(const char *str)
#define HASHEXTENDED_PROC
#define MemSet(start, val, len)
static uint64 tupledesc_id_counter
uint32 hashTupleDesc(TupleDesc desc)
static int dcs_cmp(const void *a, const void *b)
static HTAB * RecordCacheHash
#define GetSysCacheHashValue1(cacheId, key1)
void * hash_search(HTAB *hashp, const void *keyPtr, HASHACTION action, bool *foundPtr)
void on_dsm_detach(dsm_segment *seg, on_dsm_detach_callback function, Datum arg)
#define TupleDescSize(src)
#define OidIsValid(objectId)
void dshash_release_lock(dshash_table *hash_table, void *entry)
#define INVALID_TUPLEDESC_IDENTIFIER
void SharedRecordTypmodRegistryAttach(SharedRecordTypmodRegistry *registry)
SysScanDesc systable_beginscan(Relation heapRelation, Oid indexId, bool indexOK, Snapshot snapshot, int nkeys, ScanKey key)
int dshash_memcmp(const void *a, const void *b, size_t size, void *arg)
TupleDesc lookup_rowtype_tupdesc_domain(Oid type_id, int32 typmod, bool noError)
Oid get_multirange_range(Oid multirangeOid)
void assign_record_type_typmod(TupleDesc tupDesc)
void SharedRecordTypmodRegistryInit(SharedRecordTypmodRegistry *registry, dsm_segment *segment, dsa_area *area)
static TupleDesc * RecordCacheArray
void CacheRegisterRelcacheCallback(RelcacheCallbackFunction func, Datum arg)
#define EnumTypIdLabelIndexId
bool DomainHasConstraints(Oid type_id)
FmgrInfo rng_subdiff_finfo
static void cache_multirange_element_properties(TypeCacheEntry *typentry)
void * dsa_get_address(dsa_area *area, dsa_pointer dp)
static void cache_record_field_properties(TypeCacheEntry *typentry)
struct TypeCacheEntry * nextDomain
dsa_pointer shared_tupdesc
HeapTuple systable_getnext(SysScanDesc sysscan)
#define TCFLAGS_CHECKED_ELEM_PROPERTIES
#define ConstraintTypidIndexId
pg_atomic_uint32 next_typmod
Bitmapset * sorted_values
void pfree(void *pointer)
#define TCFLAGS_CHECKED_GT_OPR
#define ObjectIdGetDatum(X)
#define TCFLAGS_HAVE_PG_TYPE_DATA
#define TCFLAGS_HAVE_FIELD_COMPARE
static bool enum_known_sorted(TypeCacheEnumData *enumdata, Oid arg)
Relation relation_open(Oid relationId, LOCKMODE lockmode)
#define HTEqualStrategyNumber
static void load_multirangetype_info(TypeCacheEntry *typentry)
#define TCFLAGS_HAVE_FIELD_HASHING
Bitmapset * bms_make_singleton(int x)
dshash_table_handle dshash_get_hash_table_handle(dshash_table *hash_table)
static void TypeCacheRelCallback(Datum arg, Oid relid)
#define RegProcedureIsValid(p)
static bool array_element_has_compare(TypeCacheEntry *typentry)
void dshash_detach(dshash_table *hash_table)
Oid get_opfamily_member(Oid opfamily, Oid lefttype, Oid righttype, int16 strategy)
ExprState * check_exprstate
HTAB * hash_create(const char *tabname, long nelem, const HASHCTL *info, int flags)
FormData_pg_enum * Form_pg_enum
#define TCFLAGS_HAVE_FIELD_EXTENDED_HASHING
FormData_pg_attribute * Form_pg_attribute
MemoryContext CurrentMemoryContext
TupleDesc lookup_rowtype_tupdesc_noerror(Oid type_id, int32 typmod, bool noError)
TupleDesc CreateTupleDescCopyConstr(TupleDesc tupdesc)
void fmgr_info_cxt(Oid functionId, FmgrInfo *finfo, MemoryContext mcxt)
#define HASHSTANDARD_PROC
#define TYPECACHE_BTREE_OPFAMILY
dsa_pointer shared_tupdesc
static EnumItem * find_enumitem(TypeCacheEnumData *enumdata, Oid arg)
#define IsParallelWorker()
#define TCFLAGS_HAVE_FIELD_EQUALITY
MemoryContext TopMemoryContext
FmgrInfo rng_canonical_finfo
EnumItem enum_values[FLEXIBLE_ARRAY_MEMBER]
static const dshash_parameters srtr_typmod_table_params
struct TypeCacheEntry * rngelemtype
List * lappend(List *list, void *datum)
#define TYPECACHE_DOMAIN_BASE_INFO
static void cache_array_element_properties(TypeCacheEntry *typentry)
static void TypeCacheTypCallback(Datum arg, int cacheid, uint32 hashvalue)
HeapTuple SearchSysCache1(int cacheId, Datum key1)
static bool range_element_has_hashing(TypeCacheEntry *typentry)
#define TextDatumGetCString(d)
FmgrInfo hash_extended_proc_finfo
static int32 RecordCacheArrayLen
static void shared_record_typmod_registry_detach(dsm_segment *segment, Datum datum)
struct SharedTypmodTableEntry SharedTypmodTableEntry
void CacheRegisterSyscacheCallback(int cacheid, SyscacheCallbackFunction func, Datum arg)
static int32 NextRecordTypmod
struct SharedRecordTypmodRegistry * shared_typmod_registry
#define TYPECACHE_HASH_EXTENDED_PROC
void ReleaseSysCache(HeapTuple tuple)
dshash_table * dshash_create(dsa_area *area, const dshash_parameters *params, void *arg)
static void ensure_record_cache_typmod_slot_exists(int32 typmod)
struct SharedRecordTableKey SharedRecordTableKey
void * MemoryContextAllocZero(MemoryContext context, Size size)
TypeCacheEntry * lookup_type_cache(Oid type_id, int flags)
static void load_rangetype_info(TypeCacheEntry *typentry)
RegProcedure get_opcode(Oid opno)
static bool multirange_element_has_hashing(TypeCacheEntry *typentry)
struct SharedRecordTypmodRegistry SharedRecordTypmodRegistry
#define ereport(elevel,...)
static uint32 record_type_typmod_hash(const void *data, size_t size)
size_t SharedRecordTypmodRegistryEstimate(void)
dshash_table * shared_typmod_table
static uint32 pg_atomic_fetch_add_u32(volatile pg_atomic_uint32 *ptr, int32 add_)
#define TYPECACHE_CMP_PROC
List * lcons(void *datum, List *list)
void bms_free(Bitmapset *a)
FormData_pg_constraint * Form_pg_constraint
#define HeapTupleIsValid(tuple)
dshash_hash dshash_memhash(const void *v, size_t size, void *arg)
bool dshash_delete_key(dshash_table *hash_table, const void *key)
void relation_close(Relation relation, LOCKMODE lockmode)
#define Assert(condition)
static List * prep_domain_constraints(List *constraints, MemoryContext execctx)
#define TYPECACHE_DOMAIN_CONSTR_INFO
void DecrTupleDescRefCount(TupleDesc tupdesc)
Oid get_opfamily_proc(Oid opfamily, Oid lefttype, Oid righttype, int16 procnum)
#define TCFLAGS_HAVE_ELEM_EQUALITY
static void load_enum_cache_data(TypeCacheEntry *tcache)
void InitDomainConstraintRef(Oid type_id, DomainConstraintRef *ref, MemoryContext refctx, bool need_exprstate)
void CreateCacheMemoryContext(void)
FormData_pg_type * Form_pg_type
#define TCFLAGS_CHECKED_BTREE_OPCLASS
static dsa_pointer share_tupledesc(dsa_area *area, TupleDesc tupdesc, uint32 typmod)
#define TCFLAGS_CHECKED_DOMAIN_CONSTRAINTS
uint64 tupDesc_identifier
struct TypeCacheEntry * rngtype
dshash_table_handle record_table_handle
void * hash_seq_search(HASH_SEQ_STATUS *status)
Bitmapset * bms_add_member(Bitmapset *a, int x)
static bool record_fields_have_compare(TypeCacheEntry *typentry)
Oid get_opclass_family(Oid opclass)
void * repalloc(void *pointer, Size size)
void hash_seq_init(HASH_SEQ_STATUS *status, HTAB *hashp)
static bool record_fields_have_hashing(TypeCacheEntry *typentry)
#define TCFLAGS_HAVE_ELEM_HASHING
static bool array_element_has_equality(TypeCacheEntry *typentry)
void FreeTupleDesc(TupleDesc tupdesc)
#define PinTupleDesc(tupdesc)
#define TCFLAGS_OPERATOR_FLAGS
static void load_domaintype_info(TypeCacheEntry *typentry)
Oid get_base_element_type(Oid typid)
void TupleDescCopy(TupleDesc dst, TupleDesc src)
void dsa_free(dsa_area *area, dsa_pointer dp)
struct TupleDescData * TupleDesc
#define TCFLAGS_CHECKED_HASH_PROC
int errmsg(const char *fmt,...)
static int enum_oid_cmp(const void *left, const void *right)
void * MemoryContextAlloc(MemoryContext context, Size size)
static int record_type_typmod_compare(const void *a, const void *b, size_t size)
#define TCFLAGS_CHECKED_LT_OPR
void ScanKeyInit(ScanKey entry, AttrNumber attributeNumber, StrategyNumber strategy, RegProcedure procedure, Datum argument)
void * dshash_find_or_insert(dshash_table *hash_table, const void *key, bool *found)
bool equalTupleDescs(TupleDesc tupdesc1, TupleDesc tupdesc2)
void MemoryContextRegisterResetCallback(MemoryContext context, MemoryContextCallback *cb)
ExprState * ExecInitExpr(Expr *node, PlanState *parent)
#define TYPECACHE_CMP_PROC_FINFO
void * dshash_find(dshash_table *hash_table, const void *key, bool exclusive)
#define TCFLAGS_CHECKED_HASH_OPCLASS
static void pg_atomic_init_u32(volatile pg_atomic_uint32 *ptr, uint32 val)
static bool range_element_has_extended_hashing(TypeCacheEntry *typentry)
#define TYPECACHE_HASH_OPFAMILY
#define qsort(a, b, c, d)
static bool record_fields_have_equality(TypeCacheEntry *typentry)
dshash_table_handle typmod_table_handle
#define TCFLAGS_CHECKED_CMP_PROC
static void static void status(const char *fmt,...) pg_attribute_printf(1
#define BTLessStrategyNumber
Relation table_open(Oid relationId, LOCKMODE lockmode)
static void decr_dcc_refcount(DomainConstraintCache *dcc)
struct SharedRecordTableEntry SharedRecordTableEntry
union SharedRecordTableKey::@33 u
bool bms_is_member(int x, const Bitmapset *a)
static bool array_element_has_extended_hashing(TypeCacheEntry *typentry)
uint64 assign_record_type_identifier(Oid type_id, int32 typmod)
static void TypeCacheConstrCallback(Datum arg, int cacheid, uint32 hashvalue)
static TupleDesc lookup_rowtype_tupdesc_internal(Oid type_id, int32 typmod, bool noError)
static HTAB * TypeCacheHash
#define TYPECACHE_HASH_PROC
#define TYPECACHE_TUPDESC
#define BTEqualStrategyNumber
#define offsetof(type, field)
static uint64 * RecordIdentifierArray
static void TypeCacheOpcCallback(Datum arg, int cacheid, uint32 hashvalue)
#define dsa_allocate(area, size)
MemoryContext CacheMemoryContext
TupleDesc lookup_rowtype_tupdesc_copy(Oid type_id, int32 typmod)
Oid get_opclass_input_type(Oid opclass)