PostgreSQL Source Code git master
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
tupdesc.h File Reference
#include "access/attnum.h"
#include "catalog/pg_attribute.h"
#include "nodes/pg_list.h"
Include dependency graph for tupdesc.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Data Structures

struct  AttrDefault
 
struct  ConstrCheck
 
struct  TupleConstr
 
struct  CompactAttribute
 
struct  TupleDescData
 

Macros

#define ATTNULLABLE_UNRESTRICTED   'f' /* No constraint exists */
 
#define ATTNULLABLE_UNKNOWN   'u' /* constraint exists, validity unknown */
 
#define ATTNULLABLE_VALID   'v' /* valid constraint exists */
 
#define ATTNULLABLE_INVALID   'i' /* constraint exists, marked invalid */
 
#define TupleDescAttrAddress(desc)
 
#define TupleDescSize(src)
 
#define PinTupleDesc(tupdesc)
 
#define ReleaseTupleDesc(tupdesc)
 

Typedefs

typedef struct AttrDefault AttrDefault
 
typedef struct ConstrCheck ConstrCheck
 
typedef struct TupleConstr TupleConstr
 
typedef struct CompactAttribute CompactAttribute
 
typedef struct TupleDescData TupleDescData
 
typedef struct TupleDescDataTupleDesc
 

Functions

void populate_compact_attribute (TupleDesc tupdesc, int attnum)
 
static FormData_pg_attributeTupleDescAttr (TupleDesc tupdesc, int i)
 
void verify_compact_attribute (TupleDesc, int attnum)
 
static CompactAttributeTupleDescCompactAttr (TupleDesc tupdesc, int i)
 
TupleDesc CreateTemplateTupleDesc (int natts)
 
TupleDesc CreateTupleDesc (int natts, Form_pg_attribute *attrs)
 
TupleDesc CreateTupleDescCopy (TupleDesc tupdesc)
 
TupleDesc CreateTupleDescTruncatedCopy (TupleDesc tupdesc, int natts)
 
TupleDesc CreateTupleDescCopyConstr (TupleDesc tupdesc)
 
void TupleDescCopy (TupleDesc dst, TupleDesc src)
 
void TupleDescCopyEntry (TupleDesc dst, AttrNumber dstAttno, TupleDesc src, AttrNumber srcAttno)
 
void FreeTupleDesc (TupleDesc tupdesc)
 
void IncrTupleDescRefCount (TupleDesc tupdesc)
 
void DecrTupleDescRefCount (TupleDesc tupdesc)
 
bool equalTupleDescs (TupleDesc tupdesc1, TupleDesc tupdesc2)
 
bool equalRowTypes (TupleDesc tupdesc1, TupleDesc tupdesc2)
 
uint32 hashRowType (TupleDesc desc)
 
void TupleDescInitEntry (TupleDesc desc, AttrNumber attributeNumber, const char *attributeName, Oid oidtypeid, int32 typmod, int attdim)
 
void TupleDescInitBuiltinEntry (TupleDesc desc, AttrNumber attributeNumber, const char *attributeName, Oid oidtypeid, int32 typmod, int attdim)
 
void TupleDescInitEntryCollation (TupleDesc desc, AttrNumber attributeNumber, Oid collationid)
 
TupleDesc BuildDescFromLists (const List *names, const List *types, const List *typmods, const List *collations)
 
NodeTupleDescGetDefault (TupleDesc tupdesc, AttrNumber attnum)
 

Macro Definition Documentation

◆ ATTNULLABLE_INVALID

#define ATTNULLABLE_INVALID   'i' /* constraint exists, marked invalid */

Definition at line 87 of file tupdesc.h.

◆ ATTNULLABLE_UNKNOWN

#define ATTNULLABLE_UNKNOWN   'u' /* constraint exists, validity unknown */

Definition at line 85 of file tupdesc.h.

◆ ATTNULLABLE_UNRESTRICTED

#define ATTNULLABLE_UNRESTRICTED   'f' /* No constraint exists */

Definition at line 84 of file tupdesc.h.

◆ ATTNULLABLE_VALID

#define ATTNULLABLE_VALID   'v' /* valid constraint exists */

Definition at line 86 of file tupdesc.h.

◆ PinTupleDesc

#define PinTupleDesc (   tupdesc)
Value:
do { \
if ((tupdesc)->tdrefcount >= 0) \
IncrTupleDescRefCount(tupdesc); \
} while (0)

Definition at line 213 of file tupdesc.h.

◆ ReleaseTupleDesc

#define ReleaseTupleDesc (   tupdesc)
Value:
do { \
if ((tupdesc)->tdrefcount >= 0) \
DecrTupleDescRefCount(tupdesc); \
} while (0)

Definition at line 219 of file tupdesc.h.

◆ TupleDescAttrAddress

#define TupleDescAttrAddress (   desc)
Value:
(Form_pg_attribute) ((char *) (desc) + \
(offsetof(struct TupleDescData, compact_attrs) + \
(desc)->natts * sizeof(CompactAttribute)))
FormData_pg_attribute * Form_pg_attribute
Definition: pg_attribute.h:202

Definition at line 153 of file tupdesc.h.

◆ TupleDescSize

#define TupleDescSize (   src)
Value:
(offsetof(struct TupleDescData, compact_attrs) + \
(src)->natts * sizeof(CompactAttribute) + \
(src)->natts * sizeof(FormData_pg_attribute))
FormData_pg_attribute
Definition: pg_attribute.h:186

Definition at line 198 of file tupdesc.h.

Typedef Documentation

◆ AttrDefault

typedef struct AttrDefault AttrDefault

◆ CompactAttribute

◆ ConstrCheck

typedef struct ConstrCheck ConstrCheck

◆ TupleConstr

typedef struct TupleConstr TupleConstr

◆ TupleDesc

typedef struct TupleDescData* TupleDesc

Definition at line 145 of file tupdesc.h.

◆ TupleDescData

typedef struct TupleDescData TupleDescData

Function Documentation

◆ BuildDescFromLists()

TupleDesc BuildDescFromLists ( const List names,
const List types,
const List typmods,
const List collations 
)

Definition at line 1051 of file tupdesc.c.

1052{
1053 int natts;
1055 ListCell *l1;
1056 ListCell *l2;
1057 ListCell *l3;
1058 ListCell *l4;
1059 TupleDesc desc;
1060
1061 natts = list_length(names);
1062 Assert(natts == list_length(types));
1063 Assert(natts == list_length(typmods));
1064 Assert(natts == list_length(collations));
1065
1066 /*
1067 * allocate a new tuple descriptor
1068 */
1069 desc = CreateTemplateTupleDesc(natts);
1070
1071 attnum = 0;
1072 forfour(l1, names, l2, types, l3, typmods, l4, collations)
1073 {
1074 char *attname = strVal(lfirst(l1));
1075 Oid atttypid = lfirst_oid(l2);
1076 int32 atttypmod = lfirst_int(l3);
1077 Oid attcollation = lfirst_oid(l4);
1078
1079 attnum++;
1080
1081 TupleDescInitEntry(desc, attnum, attname, atttypid, atttypmod, 0);
1082 TupleDescInitEntryCollation(desc, attnum, attcollation);
1083 }
1084
1085 return desc;
1086}
int16 AttrNumber
Definition: attnum.h:21
int32_t int32
Definition: c.h:534
struct typedefs * types
Definition: ecpg.c:30
Assert(PointerIsAligned(start, uint64))
NameData attname
Definition: pg_attribute.h:41
int16 attnum
Definition: pg_attribute.h:74
#define lfirst(lc)
Definition: pg_list.h:172
static int list_length(const List *l)
Definition: pg_list.h:152
#define lfirst_int(lc)
Definition: pg_list.h:173
#define forfour(cell1, list1, cell2, list2, cell3, list3, cell4, list4)
Definition: pg_list.h:575
#define lfirst_oid(lc)
Definition: pg_list.h:174
unsigned int Oid
Definition: postgres_ext.h:32
TupleDesc CreateTemplateTupleDesc(int natts)
Definition: tupdesc.c:182
void TupleDescInitEntryCollation(TupleDesc desc, AttrNumber attributeNumber, Oid collationid)
Definition: tupdesc.c:1026
void TupleDescInitEntry(TupleDesc desc, AttrNumber attributeNumber, const char *attributeName, Oid oidtypeid, int32 typmod, int attdim)
Definition: tupdesc.c:842
#define strVal(v)
Definition: value.h:82

References Assert(), attname, attnum, CreateTemplateTupleDesc(), forfour, lfirst, lfirst_int, lfirst_oid, list_length(), strVal, TupleDescInitEntry(), TupleDescInitEntryCollation(), and types.

Referenced by ExecInitFunctionScan(), ExecInitTableFuncScan(), and inline_set_returning_function().

◆ CreateTemplateTupleDesc()

TupleDesc CreateTemplateTupleDesc ( int  natts)

Definition at line 182 of file tupdesc.c.

183{
184 TupleDesc desc;
185
186 /*
187 * sanity checks
188 */
189 Assert(natts >= 0);
190
191 /*
192 * Allocate enough memory for the tuple descriptor, the CompactAttribute
193 * array and also an array of FormData_pg_attribute.
194 *
195 * Note: the FormData_pg_attribute array stride is
196 * sizeof(FormData_pg_attribute), since we declare the array elements as
197 * FormData_pg_attribute for notational convenience. However, we only
198 * guarantee that the first ATTRIBUTE_FIXED_PART_SIZE bytes of each entry
199 * are valid; most code that copies tupdesc entries around copies just
200 * that much. In principle that could be less due to trailing padding,
201 * although with the current definition of pg_attribute there probably
202 * isn't any padding.
203 */
204 desc = (TupleDesc) palloc(offsetof(struct TupleDescData, compact_attrs) +
205 natts * sizeof(CompactAttribute) +
206 natts * sizeof(FormData_pg_attribute));
207
208 /*
209 * Initialize other fields of the tupdesc.
210 */
211 desc->natts = natts;
212 desc->constr = NULL;
213 desc->tdtypeid = RECORDOID;
214 desc->tdtypmod = -1;
215 desc->tdrefcount = -1; /* assume not reference-counted */
216
217 return desc;
218}
void * palloc(Size size)
Definition: mcxt.c:1365
int tdrefcount
Definition: tupdesc.h:140
TupleConstr * constr
Definition: tupdesc.h:141
int32 tdtypmod
Definition: tupdesc.h:139
Oid tdtypeid
Definition: tupdesc.h:138
struct CompactAttribute CompactAttribute
struct TupleDescData * TupleDesc
Definition: tupdesc.h:145

References Assert(), TupleDescData::constr, FormData_pg_attribute, TupleDescData::natts, palloc(), TupleDescData::tdrefcount, TupleDescData::tdtypeid, and TupleDescData::tdtypmod.

Referenced by aclexplode(), addRangeTableEntryForFunction(), AllocateRelationDesc(), brtuple_disk_tupdesc(), build_function_result_tupdesc_d(), build_row_from_vars(), BuildDescForRelation(), BuildDescFromLists(), BuildHardcodedDescriptor(), ConstructTupleDescriptor(), create_toast_table(), CreateReplicationSlot(), CreateTupleDesc(), CreateTupleDescCopy(), CreateTupleDescCopyConstr(), CreateTupleDescTruncatedCopy(), dblink_get_pkey(), ExecInitFunctionScan(), ExecMakeTableFunctionResult(), ExecTypeFromExprList(), ExecTypeFromTLInternal(), expandRecordVariable(), ExplainResultDesc(), formrdesc(), get_expr_result_type(), GetPGVariableResultDesc(), gistrescan(), IdentifySystem(), init_sexpr(), initGinState(), injection_points_stats_fixed(), libpqrcv_processTuples(), load_relcache_init_file(), materializeQueryResult(), materializeResult(), ordered_set_startup(), pg_buffercache_numa_pages(), pg_buffercache_pages(), pg_get_publication_tables(), pg_get_sequence_data(), pg_lock_status(), pg_prepared_xact(), pg_stat_file(), pg_stat_get_archiver(), pg_stat_get_backend_subxact(), pg_stat_get_replication_slot(), pg_stat_get_subscription_stats(), pg_stat_wal_build_tuple(), pg_visibility_tupdesc(), pg_walfile_name_offset(), ReadReplicationSlot(), SendTablespaceList(), SendTimeLineHistory(), SendXlogRecPtrResult(), show_all_settings(), ShowAllGUCConfig(), ShowGUCConfigOption(), StartReplication(), test_predtest(), tsvector_unnest(), and TypeGetTupleDesc().

◆ CreateTupleDesc()

TupleDesc CreateTupleDesc ( int  natts,
Form_pg_attribute attrs 
)

Definition at line 229 of file tupdesc.c.

230{
231 TupleDesc desc;
232 int i;
233
234 desc = CreateTemplateTupleDesc(natts);
235
236 for (i = 0; i < natts; ++i)
237 {
238 memcpy(TupleDescAttr(desc, i), attrs[i], ATTRIBUTE_FIXED_PART_SIZE);
240 }
241 return desc;
242}
int i
Definition: isn.c:77
#define ATTRIBUTE_FIXED_PART_SIZE
Definition: pg_attribute.h:194
void populate_compact_attribute(TupleDesc tupdesc, int attnum)
Definition: tupdesc.c:117
static FormData_pg_attribute * TupleDescAttr(TupleDesc tupdesc, int i)
Definition: tupdesc.h:160

References ATTRIBUTE_FIXED_PART_SIZE, CreateTemplateTupleDesc(), i, populate_compact_attribute(), and TupleDescAttr().

Referenced by AddNewAttributeTuples(), and InsertOneTuple().

◆ CreateTupleDescCopy()

TupleDesc CreateTupleDescCopy ( TupleDesc  tupdesc)

Definition at line 252 of file tupdesc.c.

253{
254 TupleDesc desc;
255 int i;
256
257 desc = CreateTemplateTupleDesc(tupdesc->natts);
258
259 /* Flat-copy the attribute array */
260 memcpy(TupleDescAttr(desc, 0),
261 TupleDescAttr(tupdesc, 0),
262 desc->natts * sizeof(FormData_pg_attribute));
263
264 /*
265 * Since we're not copying constraints and defaults, clear fields
266 * associated with them.
267 */
268 for (i = 0; i < desc->natts; i++)
269 {
270 Form_pg_attribute att = TupleDescAttr(desc, i);
271
272 att->attnotnull = false;
273 att->atthasdef = false;
274 att->atthasmissing = false;
275 att->attidentity = '\0';
276 att->attgenerated = '\0';
277
279 }
280
281 /* We can copy the tuple type identification, too */
282 desc->tdtypeid = tupdesc->tdtypeid;
283 desc->tdtypmod = tupdesc->tdtypmod;
284
285 return desc;
286}

References CreateTemplateTupleDesc(), FormData_pg_attribute, i, TupleDescData::natts, populate_compact_attribute(), TupleDescData::tdtypeid, TupleDescData::tdtypmod, and TupleDescAttr().

Referenced by assign_record_type_typmod(), BuildTupleHashTable(), cfunc_hashtable_insert(), CompleteCachedPlan(), connectby_text(), connectby_text_serial(), CopyCachedPlan(), crosstab(), crosstab_hash(), database_to_xmlschema_internal(), do_autovacuum(), ExecEvalWholeRowVar(), ExecInitForeignScan(), ExecInitFunctionScan(), ExecInsert(), ExecPrepareTuplestoreResult(), FetchPreparedStatementResultDesc(), fmgr_sql(), get_record_type_from_query(), get_tupdesc_for_join_scan_tuples(), GetAfterTriggersStoreSlot(), getSpGistTupleDesc(), init_sexpr(), InitMaterializedSRF(), make_expanded_record_from_exprecord(), make_expanded_record_from_tupdesc(), materializeResult(), PersistHoldablePortal(), plperl_return_next_internal(), plpgsql_exec_function(), pltcl_func_handler(), PLy_spi_execute_fetch_result(), populate_recordset_worker(), RelationBuildLocalRelation(), RelationNameGetTupleDesc(), RevalidateCachedQuery(), schema_to_xmlschema_internal(), spi_dest_startup(), sql_compile_callback(), storeRow(), update_cached_tupdesc(), and UtilityTupleDescriptor().

◆ CreateTupleDescCopyConstr()

TupleDesc CreateTupleDescCopyConstr ( TupleDesc  tupdesc)

Definition at line 340 of file tupdesc.c.

341{
342 TupleDesc desc;
343 TupleConstr *constr = tupdesc->constr;
344 int i;
345
346 desc = CreateTemplateTupleDesc(tupdesc->natts);
347
348 /* Flat-copy the attribute array */
349 memcpy(TupleDescAttr(desc, 0),
350 TupleDescAttr(tupdesc, 0),
351 desc->natts * sizeof(FormData_pg_attribute));
352
353 for (i = 0; i < desc->natts; i++)
354 {
356
359 }
360
361 /* Copy the TupleConstr data structure, if any */
362 if (constr)
363 {
364 TupleConstr *cpy = (TupleConstr *) palloc0(sizeof(TupleConstr));
365
366 cpy->has_not_null = constr->has_not_null;
369
370 if ((cpy->num_defval = constr->num_defval) > 0)
371 {
372 cpy->defval = (AttrDefault *) palloc(cpy->num_defval * sizeof(AttrDefault));
373 memcpy(cpy->defval, constr->defval, cpy->num_defval * sizeof(AttrDefault));
374 for (i = cpy->num_defval - 1; i >= 0; i--)
375 cpy->defval[i].adbin = pstrdup(constr->defval[i].adbin);
376 }
377
378 if (constr->missing)
379 {
380 cpy->missing = (AttrMissing *) palloc(tupdesc->natts * sizeof(AttrMissing));
381 memcpy(cpy->missing, constr->missing, tupdesc->natts * sizeof(AttrMissing));
382 for (i = tupdesc->natts - 1; i >= 0; i--)
383 {
384 if (constr->missing[i].am_present)
385 {
386 CompactAttribute *attr = TupleDescCompactAttr(tupdesc, i);
387
388 cpy->missing[i].am_value = datumCopy(constr->missing[i].am_value,
389 attr->attbyval,
390 attr->attlen);
391 }
392 }
393 }
394
395 if ((cpy->num_check = constr->num_check) > 0)
396 {
397 cpy->check = (ConstrCheck *) palloc(cpy->num_check * sizeof(ConstrCheck));
398 memcpy(cpy->check, constr->check, cpy->num_check * sizeof(ConstrCheck));
399 for (i = cpy->num_check - 1; i >= 0; i--)
400 {
401 cpy->check[i].ccname = pstrdup(constr->check[i].ccname);
402 cpy->check[i].ccbin = pstrdup(constr->check[i].ccbin);
403 cpy->check[i].ccenforced = constr->check[i].ccenforced;
404 cpy->check[i].ccvalid = constr->check[i].ccvalid;
405 cpy->check[i].ccnoinherit = constr->check[i].ccnoinherit;
406 }
407 }
408
409 desc->constr = cpy;
410 }
411
412 /* We can copy the tuple type identification, too */
413 desc->tdtypeid = tupdesc->tdtypeid;
414 desc->tdtypmod = tupdesc->tdtypmod;
415
416 return desc;
417}
Datum datumCopy(Datum value, bool typByVal, int typLen)
Definition: datum.c:132
char * pstrdup(const char *in)
Definition: mcxt.c:1759
void * palloc0(Size size)
Definition: mcxt.c:1395
char * adbin
Definition: tupdesc.h:25
int16 attlen
Definition: tupdesc.h:71
char attnullability
Definition: tupdesc.h:79
char * ccname
Definition: tupdesc.h:30
bool ccenforced
Definition: tupdesc.h:32
bool ccnoinherit
Definition: tupdesc.h:34
bool ccvalid
Definition: tupdesc.h:33
char * ccbin
Definition: tupdesc.h:31
bool has_generated_virtual
Definition: tupdesc.h:47
bool has_not_null
Definition: tupdesc.h:45
AttrDefault * defval
Definition: tupdesc.h:40
bool has_generated_stored
Definition: tupdesc.h:46
struct AttrMissing * missing
Definition: tupdesc.h:42
ConstrCheck * check
Definition: tupdesc.h:41
uint16 num_defval
Definition: tupdesc.h:43
uint16 num_check
Definition: tupdesc.h:44
static CompactAttribute * TupleDescCompactAttr(TupleDesc tupdesc, int i)
Definition: tupdesc.h:175

References AttrDefault::adbin, AttrMissing::am_present, AttrMissing::am_value, CompactAttribute::attbyval, CompactAttribute::attlen, CompactAttribute::attnullability, ConstrCheck::ccbin, ConstrCheck::ccenforced, ConstrCheck::ccname, ConstrCheck::ccnoinherit, ConstrCheck::ccvalid, TupleConstr::check, TupleDescData::constr, CreateTemplateTupleDesc(), datumCopy(), TupleConstr::defval, FormData_pg_attribute, TupleConstr::has_generated_stored, TupleConstr::has_generated_virtual, TupleConstr::has_not_null, i, TupleConstr::missing, TupleDescData::natts, TupleConstr::num_check, TupleConstr::num_defval, palloc(), palloc0(), populate_compact_attribute(), pstrdup(), TupleDescData::tdtypeid, TupleDescData::tdtypmod, TupleDescAttr(), and TupleDescCompactAttr().

Referenced by ATGetQueueEntry(), CatalogCacheInitializeCache(), init_tuple_slot(), and lookup_rowtype_tupdesc_copy().

◆ CreateTupleDescTruncatedCopy()

TupleDesc CreateTupleDescTruncatedCopy ( TupleDesc  tupdesc,
int  natts 
)

Definition at line 296 of file tupdesc.c.

297{
298 TupleDesc desc;
299 int i;
300
301 Assert(natts <= tupdesc->natts);
302
303 desc = CreateTemplateTupleDesc(natts);
304
305 /* Flat-copy the attribute array */
306 memcpy(TupleDescAttr(desc, 0),
307 TupleDescAttr(tupdesc, 0),
308 desc->natts * sizeof(FormData_pg_attribute));
309
310 /*
311 * Since we're not copying constraints and defaults, clear fields
312 * associated with them.
313 */
314 for (i = 0; i < desc->natts; i++)
315 {
316 Form_pg_attribute att = TupleDescAttr(desc, i);
317
318 att->attnotnull = false;
319 att->atthasdef = false;
320 att->atthasmissing = false;
321 att->attidentity = '\0';
322 att->attgenerated = '\0';
323
325 }
326
327 /* We can copy the tuple type identification, too */
328 desc->tdtypeid = tupdesc->tdtypeid;
329 desc->tdtypmod = tupdesc->tdtypmod;
330
331 return desc;
332}

References Assert(), CreateTemplateTupleDesc(), FormData_pg_attribute, i, TupleDescData::natts, populate_compact_attribute(), TupleDescData::tdtypeid, TupleDescData::tdtypmod, and TupleDescAttr().

Referenced by gist_page_items(), index_truncate_tuple(), and initGISTstate().

◆ DecrTupleDescRefCount()

void DecrTupleDescRefCount ( TupleDesc  tupdesc)

Definition at line 577 of file tupdesc.c.

578{
579 Assert(tupdesc->tdrefcount > 0);
580
582 if (--tupdesc->tdrefcount == 0)
583 FreeTupleDesc(tupdesc);
584}
ResourceOwner CurrentResourceOwner
Definition: resowner.c:173
void FreeTupleDesc(TupleDesc tupdesc)
Definition: tupdesc.c:502
static void ResourceOwnerForgetTupleDesc(ResourceOwner owner, TupleDesc tupdesc)
Definition: tupdesc.c:55

References Assert(), CurrentResourceOwner, FreeTupleDesc(), ResourceOwnerForgetTupleDesc(), and TupleDescData::tdrefcount.

Referenced by cache_record_field_properties(), and ExecEvalConvertRowtype().

◆ equalRowTypes()

bool equalRowTypes ( TupleDesc  tupdesc1,
TupleDesc  tupdesc2 
)

Definition at line 777 of file tupdesc.c.

778{
779 if (tupdesc1->natts != tupdesc2->natts)
780 return false;
781 if (tupdesc1->tdtypeid != tupdesc2->tdtypeid)
782 return false;
783
784 for (int i = 0; i < tupdesc1->natts; i++)
785 {
786 Form_pg_attribute attr1 = TupleDescAttr(tupdesc1, i);
787 Form_pg_attribute attr2 = TupleDescAttr(tupdesc2, i);
788
789 if (strcmp(NameStr(attr1->attname), NameStr(attr2->attname)) != 0)
790 return false;
791 if (attr1->atttypid != attr2->atttypid)
792 return false;
793 if (attr1->atttypmod != attr2->atttypmod)
794 return false;
795 if (attr1->attcollation != attr2->attcollation)
796 return false;
797
798 /* Record types derived from tables could have dropped fields. */
799 if (attr1->attisdropped != attr2->attisdropped)
800 return false;
801 }
802
803 return true;
804}
#define NameStr(name)
Definition: c.h:751

References i, NameStr, TupleDescData::natts, TupleDescData::tdtypeid, and TupleDescAttr().

Referenced by acquire_inherited_sample_rows(), cfunc_match(), ProcedureCreate(), record_type_typmod_compare(), RevalidateCachedQuery(), and shared_record_table_compare().

◆ equalTupleDescs()

bool equalTupleDescs ( TupleDesc  tupdesc1,
TupleDesc  tupdesc2 
)

Definition at line 590 of file tupdesc.c.

591{
592 int i,
593 n;
594
595 if (tupdesc1->natts != tupdesc2->natts)
596 return false;
597 if (tupdesc1->tdtypeid != tupdesc2->tdtypeid)
598 return false;
599
600 /* tdtypmod and tdrefcount are not checked */
601
602 for (i = 0; i < tupdesc1->natts; i++)
603 {
604 Form_pg_attribute attr1 = TupleDescAttr(tupdesc1, i);
605 Form_pg_attribute attr2 = TupleDescAttr(tupdesc2, i);
606
607 /*
608 * We do not need to check every single field here: we can disregard
609 * attrelid and attnum (which were used to place the row in the attrs
610 * array in the first place). It might look like we could dispense
611 * with checking attlen/attbyval/attalign, since these are derived
612 * from atttypid; but in the case of dropped columns we must check
613 * them (since atttypid will be zero for all dropped columns) and in
614 * general it seems safer to check them always.
615 *
616 * We intentionally ignore atthasmissing, since that's not very
617 * relevant in tupdescs, which lack the attmissingval field.
618 */
619 if (strcmp(NameStr(attr1->attname), NameStr(attr2->attname)) != 0)
620 return false;
621 if (attr1->atttypid != attr2->atttypid)
622 return false;
623 if (attr1->attlen != attr2->attlen)
624 return false;
625 if (attr1->attndims != attr2->attndims)
626 return false;
627 if (attr1->atttypmod != attr2->atttypmod)
628 return false;
629 if (attr1->attbyval != attr2->attbyval)
630 return false;
631 if (attr1->attalign != attr2->attalign)
632 return false;
633 if (attr1->attstorage != attr2->attstorage)
634 return false;
635 if (attr1->attcompression != attr2->attcompression)
636 return false;
637 if (attr1->attnotnull != attr2->attnotnull)
638 return false;
639
640 /*
641 * When the column has a not-null constraint, we also need to consider
642 * its validity aspect, which only manifests in CompactAttribute->
643 * attnullability, so verify that.
644 */
645 if (attr1->attnotnull)
646 {
647 CompactAttribute *cattr1 = TupleDescCompactAttr(tupdesc1, i);
648 CompactAttribute *cattr2 = TupleDescCompactAttr(tupdesc2, i);
649
653
654 if (cattr1->attnullability != cattr2->attnullability)
655 return false;
656 }
657 if (attr1->atthasdef != attr2->atthasdef)
658 return false;
659 if (attr1->attidentity != attr2->attidentity)
660 return false;
661 if (attr1->attgenerated != attr2->attgenerated)
662 return false;
663 if (attr1->attisdropped != attr2->attisdropped)
664 return false;
665 if (attr1->attislocal != attr2->attislocal)
666 return false;
667 if (attr1->attinhcount != attr2->attinhcount)
668 return false;
669 if (attr1->attcollation != attr2->attcollation)
670 return false;
671 /* variable-length fields are not even present... */
672 }
673
674 if (tupdesc1->constr != NULL)
675 {
676 TupleConstr *constr1 = tupdesc1->constr;
677 TupleConstr *constr2 = tupdesc2->constr;
678
679 if (constr2 == NULL)
680 return false;
681 if (constr1->has_not_null != constr2->has_not_null)
682 return false;
683 if (constr1->has_generated_stored != constr2->has_generated_stored)
684 return false;
685 if (constr1->has_generated_virtual != constr2->has_generated_virtual)
686 return false;
687 n = constr1->num_defval;
688 if (n != (int) constr2->num_defval)
689 return false;
690 /* We assume here that both AttrDefault arrays are in adnum order */
691 for (i = 0; i < n; i++)
692 {
693 AttrDefault *defval1 = constr1->defval + i;
694 AttrDefault *defval2 = constr2->defval + i;
695
696 if (defval1->adnum != defval2->adnum)
697 return false;
698 if (strcmp(defval1->adbin, defval2->adbin) != 0)
699 return false;
700 }
701 if (constr1->missing)
702 {
703 if (!constr2->missing)
704 return false;
705 for (i = 0; i < tupdesc1->natts; i++)
706 {
707 AttrMissing *missval1 = constr1->missing + i;
708 AttrMissing *missval2 = constr2->missing + i;
709
710 if (missval1->am_present != missval2->am_present)
711 return false;
712 if (missval1->am_present)
713 {
714 CompactAttribute *missatt1 = TupleDescCompactAttr(tupdesc1, i);
715
716 if (!datumIsEqual(missval1->am_value, missval2->am_value,
717 missatt1->attbyval, missatt1->attlen))
718 return false;
719 }
720 }
721 }
722 else if (constr2->missing)
723 return false;
724 n = constr1->num_check;
725 if (n != (int) constr2->num_check)
726 return false;
727
728 /*
729 * Similarly, we rely here on the ConstrCheck entries being sorted by
730 * name. If there are duplicate names, the outcome of the comparison
731 * is uncertain, but that should not happen.
732 */
733 for (i = 0; i < n; i++)
734 {
735 ConstrCheck *check1 = constr1->check + i;
736 ConstrCheck *check2 = constr2->check + i;
737
738 if (!(strcmp(check1->ccname, check2->ccname) == 0 &&
739 strcmp(check1->ccbin, check2->ccbin) == 0 &&
740 check1->ccenforced == check2->ccenforced &&
741 check1->ccvalid == check2->ccvalid &&
742 check1->ccnoinherit == check2->ccnoinherit))
743 return false;
744 }
745 }
746 else if (tupdesc2->constr != NULL)
747 return false;
748 return true;
749}
bool datumIsEqual(Datum value1, Datum value2, bool typByVal, int typLen)
Definition: datum.c:223
AttrNumber adnum
Definition: tupdesc.h:24
#define ATTNULLABLE_UNKNOWN
Definition: tupdesc.h:85

References AttrDefault::adbin, AttrDefault::adnum, AttrMissing::am_present, AttrMissing::am_value, Assert(), CompactAttribute::attbyval, CompactAttribute::attlen, CompactAttribute::attnullability, ATTNULLABLE_UNKNOWN, ConstrCheck::ccbin, ConstrCheck::ccenforced, ConstrCheck::ccname, ConstrCheck::ccnoinherit, ConstrCheck::ccvalid, TupleConstr::check, TupleDescData::constr, datumIsEqual(), TupleConstr::defval, TupleConstr::has_generated_stored, TupleConstr::has_generated_virtual, TupleConstr::has_not_null, i, TupleConstr::missing, NameStr, TupleDescData::natts, TupleConstr::num_check, TupleConstr::num_defval, TupleDescData::tdtypeid, TupleDescAttr(), and TupleDescCompactAttr().

Referenced by RelationFindDeletedTupleInfoByIndex(), RelationFindDeletedTupleInfoSeq(), RelationFindReplTupleSeq(), and RelationRebuildRelation().

◆ FreeTupleDesc()

void FreeTupleDesc ( TupleDesc  tupdesc)

Definition at line 502 of file tupdesc.c.

503{
504 int i;
505
506 /*
507 * Possibly this should assert tdrefcount == 0, to disallow explicit
508 * freeing of un-refcounted tupdescs?
509 */
510 Assert(tupdesc->tdrefcount <= 0);
511
512 if (tupdesc->constr)
513 {
514 if (tupdesc->constr->num_defval > 0)
515 {
516 AttrDefault *attrdef = tupdesc->constr->defval;
517
518 for (i = tupdesc->constr->num_defval - 1; i >= 0; i--)
519 pfree(attrdef[i].adbin);
520 pfree(attrdef);
521 }
522 if (tupdesc->constr->missing)
523 {
524 AttrMissing *attrmiss = tupdesc->constr->missing;
525
526 for (i = tupdesc->natts - 1; i >= 0; i--)
527 {
528 if (attrmiss[i].am_present
529 && !TupleDescAttr(tupdesc, i)->attbyval)
530 pfree(DatumGetPointer(attrmiss[i].am_value));
531 }
532 pfree(attrmiss);
533 }
534 if (tupdesc->constr->num_check > 0)
535 {
536 ConstrCheck *check = tupdesc->constr->check;
537
538 for (i = tupdesc->constr->num_check - 1; i >= 0; i--)
539 {
540 pfree(check[i].ccname);
541 pfree(check[i].ccbin);
542 }
543 pfree(check);
544 }
545 pfree(tupdesc->constr);
546 }
547
548 pfree(tupdesc);
549}
void pfree(void *pointer)
Definition: mcxt.c:1594
bool attbyval
Definition: pg_attribute.h:94
static Pointer DatumGetPointer(Datum X)
Definition: postgres.h:322

References Assert(), attbyval, TupleConstr::check, TupleDescData::constr, DatumGetPointer(), TupleConstr::defval, i, TupleConstr::missing, TupleDescData::natts, TupleConstr::num_check, TupleConstr::num_defval, pfree(), TupleDescData::tdrefcount, and TupleDescAttr().

Referenced by AddNewAttributeTuples(), AtEOXact_RelationCache(), cfunc_hashtable_delete(), DecrTupleDescRefCount(), do_autovacuum(), ER_mc_callback(), ExecMakeTableFunctionResult(), ExecPrepareTuplestoreResult(), get_record_type_from_query(), get_rel_sync_entry(), InvalidateCompositeTypeCacheEntry(), ordered_set_startup(), PLy_result_dealloc(), RelationDestroyRelation(), ResOwnerReleaseTupleDesc(), RevalidateCachedQuery(), spgendscan(), update_cached_tupdesc(), and walrcv_clear_result().

◆ hashRowType()

uint32 hashRowType ( TupleDesc  desc)

Definition at line 813 of file tupdesc.c.

814{
815 uint32 s;
816 int i;
817
818 s = hash_combine(0, hash_bytes_uint32(desc->natts));
820 for (i = 0; i < desc->natts; ++i)
821 s = hash_combine(s, hash_bytes_uint32(TupleDescAttr(desc, i)->atttypid));
822
823 return s;
824}
uint32_t uint32
Definition: c.h:538
uint32 hash_bytes_uint32(uint32 k)
Definition: hashfn.c:610
static uint32 hash_combine(uint32 a, uint32 b)
Definition: hashfn.h:68

References hash_bytes_uint32(), hash_combine(), i, TupleDescData::natts, TupleDescData::tdtypeid, and TupleDescAttr().

Referenced by cfunc_hash(), record_type_typmod_hash(), and shared_record_table_hash().

◆ IncrTupleDescRefCount()

void IncrTupleDescRefCount ( TupleDesc  tupdesc)

Definition at line 559 of file tupdesc.c.

560{
561 Assert(tupdesc->tdrefcount >= 0);
562
564 tupdesc->tdrefcount++;
566}
void ResourceOwnerEnlarge(ResourceOwner owner)
Definition: resowner.c:449
static void ResourceOwnerRememberTupleDesc(ResourceOwner owner, TupleDesc tupdesc)
Definition: tupdesc.c:49

References Assert(), CurrentResourceOwner, ResourceOwnerEnlarge(), ResourceOwnerRememberTupleDesc(), and TupleDescData::tdrefcount.

Referenced by cache_record_field_properties(), and ExecEvalConvertRowtype().

◆ populate_compact_attribute()

void populate_compact_attribute ( TupleDesc  tupdesc,
int  attnum 
)

Definition at line 117 of file tupdesc.c.

118{
119 Form_pg_attribute src = TupleDescAttr(tupdesc, attnum);
120 CompactAttribute *dst;
121
122 /*
123 * Don't use TupleDescCompactAttr to prevent infinite recursion in assert
124 * builds.
125 */
126 dst = &tupdesc->compact_attrs[attnum];
127
129}
CompactAttribute compact_attrs[FLEXIBLE_ARRAY_MEMBER]
Definition: tupdesc.h:143
static void populate_compact_attribute_internal(Form_pg_attribute src, CompactAttribute *dst)
Definition: tupdesc.c:65

References attnum, TupleDescData::compact_attrs, populate_compact_attribute_internal(), and TupleDescAttr().

Referenced by BuildDescForRelation(), BuildHardcodedDescriptor(), ConstructTupleDescriptor(), CreateTupleDesc(), CreateTupleDescCopy(), CreateTupleDescCopyConstr(), CreateTupleDescTruncatedCopy(), formrdesc(), getSpGistTupleDesc(), load_relcache_init_file(), RelationBuildLocalRelation(), RelationBuildTupleDesc(), TupleDescCopy(), TupleDescCopyEntry(), TupleDescInitBuiltinEntry(), and TupleDescInitEntry().

◆ TupleDescAttr()

static FormData_pg_attribute * TupleDescAttr ( TupleDesc  tupdesc,
int  i 
)
inlinestatic

Definition at line 160 of file tupdesc.h.

161{
163
164 return &attrs[i];
165}
#define TupleDescAttrAddress(desc)
Definition: tupdesc.h:153

References FormData_pg_attribute, i, and TupleDescAttrAddress.

Referenced by AddNewAttributeTuples(), addRangeTableEntryForENR(), AddRelationNewConstraints(), apply_handle_update(), ATAddForeignKeyConstraint(), ATExecAddColumn(), ATExecAddOf(), ATExecAlterColumnType(), ATExecAttachPartition(), ATExecColumnDefault(), ATExecDropNotNull(), ATExecReplicaIdentity(), ATRewriteTable(), attnameAttNum(), attnumAttName(), attnumCollationId(), attnumTypeId(), BeginCopyFrom(), BeginCopyTo(), boot_openrel(), brin_build_desc(), brin_form_tuple(), brin_minmax_add_value(), brin_minmax_multi_add_value(), brin_minmax_multi_union(), brin_minmax_union(), brin_page_items(), bringetbitmap(), bt_normalize_tuple(), build_attrmap_by_name(), build_attrmap_by_position(), build_column_default(), build_generation_expression(), build_index_tlist(), build_physical_tlist(), build_remote_returning(), BuildDescForRelation(), BuildHardcodedDescriptor(), buildNSItemFromTupleDesc(), BuildOnConflictExcludedTargetlist(), buildRelationAliases(), cache_record_field_properties(), CallStmtResultDesc(), CatalogCacheInitializeCache(), CatCacheCopyKeys(), CatCacheFreeKeys(), check_and_init_gencol(), check_exclusion_or_unique_constraint(), check_modified_virtual_generated(), check_selective_binary_conversion(), check_sql_stmt_retval(), CheckAttributeNamesTypes(), CheckAttributeType(), CheckIndexCompatible(), checkInsertTargets(), checkRuleResultList(), CheckVarSlotCompatibility(), checkViewColumns(), CloneFkReferenced(), CloneFkReferencing(), CloneRowTriggersToPartition(), coerce_record_to_complex(), compatConnectbyTupleDescs(), compatCrosstabTupleDescs(), compatible_tupdescs(), composite_to_json(), composite_to_jsonb(), ComputePartitionAttrs(), ConstructTupleDescriptor(), conversion_error_callback(), CopyFromBinaryOneRow(), CopyFromTextLikeOneRow(), CopyGetAttnums(), CopyReadAttributesCSV(), CopyReadAttributesText(), CopyToTextLikeStart(), create_foreign_modify(), create_toast_table(), CreateTriggerFiringOn(), CreateTupleDesc(), CreateTupleDescCopy(), CreateTupleDescCopyConstr(), CreateTupleDescTruncatedCopy(), currtid_for_view(), debugStartup(), debugtup(), DefineIndex(), deparseAnalyzeSql(), deparseInsertSql(), deparseTargetList(), deparseUpdateSql(), DetachPartitionFinalize(), DoCopyTo(), equalRowTypes(), equalTupleDescs(), errtablecol(), examine_attribute(), exec_eval_expr(), exec_move_row_from_fields(), exec_stmt_return_next(), ExecBuildGroupingEqual(), ExecBuildHash32FromAttrs(), ExecBuildParamSetEqual(), ExecBuildProjectionInfo(), ExecBuildSlotValueDescription(), ExecBuildUpdateProjection(), ExecCheckPlanOutput(), ExecComputeStoredGenerated(), ExecConstraints(), ExecEvalFieldSelect(), ExecEvalWholeRowVar(), ExecInitExprRec(), ExecInitGenerated(), ExecInitIndexOnlyScan(), ExecInitTableFuncScan(), ExecScanSubPlan(), ExecSetParamPlan(), ExecSort(), ExecTypeSetColNames(), expand_generated_columns_internal(), expand_insert_targetlist(), expand_single_inheritance_child(), expand_virtual_generated_columns(), expanded_record_lookup_field(), expanded_record_set_tuple(), ExpandRowReference(), expandTableLikeClause(), expandTupleDesc(), find_composite_type_dependencies(), formrdesc(), FreeTupleDesc(), generateClonedIndexStmt(), get_dependent_generated_columns(), get_file_fdw_attribute_options(), get_name_for_var_field(), get_rel_data_width(), get_relation_constraints(), get_rels_with_domain(), get_rte_attribute_is_dropped(), get_rule_expr(), get_simple_values_rte(), get_sql_delete(), get_sql_insert(), get_sql_update(), get_target_list(), get_tupdesc_for_join_scan_tuples(), get_tuple_of_interest(), get_variable(), GetAttributeByName(), getSpGistTupleDesc(), GinBufferInit(), ginFlushBuildState(), gist_page_items(), gistrescan(), hash_record(), hash_record_extended(), hashRowType(), heap_toast_insert_or_update(), heapam_relation_needs_toast_table(), hstore_from_record(), hstore_populate_record(), hypothetical_check_argtypes(), inclusion_get_strategy_procinfo(), index_concurrently_create_copy(), index_form_tuple_context(), initGinState(), initialize_aggregate(), InitializeAttributeOids(), InsertOneNull(), InsertOneValue(), InsertPgAttributeTuples(), intorel_startup(), IsIndexUsableForReplicaIdentityFull(), load_relcache_init_file(), logicalrep_rel_open(), logicalrep_write_attrs(), logicalrep_write_tuple(), make_inh_translation_list(), make_tuple_from_row(), make_tuple_indirect(), map_sql_table_to_xmlschema(), map_sql_typecoll_to_xmlschema_types(), MergeAttributes(), MergeAttributesIntoExisting(), MergeConstraintsIntoExisting(), minmax_get_strategy_procinfo(), minmax_multi_get_strategy_procinfo(), NextCopyFromRawFieldsInternal(), page_header(), ParseComplexProjection(), PartConstraintImpliedByRelConstraint(), pg_get_publication_tables(), pg_prepared_statement(), plperl_build_tuple_result(), plperl_hash_from_tuple(), plperl_modify_tuple(), plpgsql_exec_trigger(), pltcl_build_tuple_argument(), pltcl_build_tuple_result(), pltcl_set_tuple_values(), pltcl_trigger_handler(), PLy_input_setup_tuple(), PLy_modify_tuple(), PLy_output_setup_tuple(), PLy_result_colnames(), PLy_result_coltypes(), PLy_result_coltypmods(), PLyDict_FromTuple(), PLyGenericObject_ToComposite(), PLyMapping_ToComposite(), PLySequence_ToComposite(), populate_compact_attribute(), populate_record(), printsimple(), printsimple_startup(), printtup_prepare_info(), pub_collist_validate(), pub_contains_invalid_column(), pub_form_cols_map(), rebuildInsertSql(), record_cmp(), record_eq(), record_image_cmp(), record_image_eq(), record_in(), record_out(), record_recv(), record_send(), refresh_by_match_merge(), RelationBuildLocalRelation(), RelationBuildPartitionKey(), RelationBuildTupleDesc(), ReorderBufferToastReplace(), ReportNotNullViolationError(), resolve_polymorphic_tupdesc(), rewriteTargetListIU(), rewriteValuesRTE(), ri_ReportViolation(), rowtype_field_matches(), send_relation_and_attrs(), SendRowDescriptionMessage(), serialize_prepare_info(), set_attnotnull(), set_relation_column_names(), slot_fill_defaults(), slot_modify_data(), slot_store_data(), spgGetCache(), SPI_fname(), SPI_fnumber(), SPI_gettype(), SPI_gettypeid(), SPI_getvalue(), SysCacheGetAttrNotNull(), test_predtest(), tfuncInitialize(), tfuncLoadRows(), tlist_matches_tupdesc(), toast_tuple_find_biggest_attribute(), toast_tuple_init(), transformAlterTableStmt(), transformAssignedExpr(), transformIndexConstraint(), transformOfType(), transformTableLikeClause(), triggered_change_notification(), tuple_to_stringinfo(), tupledesc_match(), TupleDescCopy(), TupleDescCopyEntry(), TupleDescGetAttInMetadata(), TupleDescInitBuiltinEntry(), TupleDescInitEntry(), TupleDescInitEntryCollation(), tuples_equal(), tuplesort_begin_index_gin(), TypeGetTupleDesc(), validate_pkattnums(), validateConnectbyTupleDesc(), validateDomainCheckConstraint(), validateDomainNotNullConstraint(), verify_compact_attribute(), verifyPartitionIndexNotNull(), and write_relcache_init_file().

◆ TupleDescCompactAttr()

static CompactAttribute * TupleDescCompactAttr ( TupleDesc  tupdesc,
int  i 
)
inlinestatic

Definition at line 175 of file tupdesc.h.

176{
177 CompactAttribute *cattr = &tupdesc->compact_attrs[i];
178
179#ifdef USE_ASSERT_CHECKING
180
181 /* Check that the CompactAttribute is correctly populated */
182 verify_compact_attribute(tupdesc, i);
183#endif
184
185 return cattr;
186}
void verify_compact_attribute(TupleDesc, int attnum)
Definition: tupdesc.c:142

References TupleDescData::compact_attrs, i, and verify_compact_attribute().

Referenced by _bt_keep_natts_fast(), _bt_preprocess_array_keys(), ATRewriteTable(), brin_deconstruct_tuple(), brin_inclusion_add_value(), brin_inclusion_union(), btestimateparallelscan(), build_attrmap_by_position(), BuildHardcodedDescriptor(), BuildTupleFromCStrings(), check_attrmap_match(), check_domain_for_new_field(), check_sql_stmt_retval(), check_tuple_attribute(), collectMatchBitmap(), convert_prep_stmt_params(), CopyGetAttnums(), CreateTupleDescCopyConstr(), equalTupleDescs(), ER_get_flat_size(), ExecBuildUpdateProjection(), ExecComputeStoredGenerated(), ExecEvalRowNullInt(), ExecEvalWholeRowVar(), ExecInitJunkFilterConversion(), expand_tuple(), expanded_record_set_field_internal(), expanded_record_set_fields(), fastgetattr(), formrdesc(), get_relation_constraints(), get_relation_notnullatts(), getDatumCopy(), getmissingattr(), getSpGistTupleDesc(), gistInitBuffering(), heap_attisnull(), heap_attr_equals(), heap_compute_data_size(), heap_deform_tuple(), heap_fill_tuple(), HeapDetermineColumnsInfo(), index_deform_tuple_internal(), index_getattr(), MemoizeHash_equal(), MemoizeHash_hash(), nocache_index_getattr(), nocachegetattr(), PartConstraintImpliedByRelConstraint(), pgoutput_row_filter(), postgresBeginForeignInsert(), postgresPlanForeignModify(), reform_and_rewrite_tuple(), RelationBuildLocalRelation(), RelationBuildTupleDesc(), ri_KeysEqual(), set_attnotnull(), slot_compile_deform(), slot_deform_heap_tuple_internal(), spgdoinsert(), toast_build_flattened_tuple(), toast_delete_external(), toast_flatten_tuple(), toast_flatten_tuple_to_datum(), tstoreReceiveSlot_detoast(), tstoreStartupReceiver(), tts_virtual_materialize(), tuple_data_split_internal(), and ValuesNext().

◆ TupleDescCopy()

void TupleDescCopy ( TupleDesc  dst,
TupleDesc  src 
)

Definition at line 428 of file tupdesc.c.

429{
430 int i;
431
432 /* Flat-copy the header and attribute arrays */
433 memcpy(dst, src, TupleDescSize(src));
434
435 /*
436 * Since we're not copying constraints and defaults, clear fields
437 * associated with them.
438 */
439 for (i = 0; i < dst->natts; i++)
440 {
442
443 att->attnotnull = false;
444 att->atthasdef = false;
445 att->atthasmissing = false;
446 att->attidentity = '\0';
447 att->attgenerated = '\0';
448
450 }
451 dst->constr = NULL;
452
453 /*
454 * Also, assume the destination is not to be ref-counted. (Copying the
455 * source's refcount would be wrong in any case.)
456 */
457 dst->tdrefcount = -1;
458}
#define TupleDescSize(src)
Definition: tupdesc.h:198

References TupleDescData::constr, i, TupleDescData::natts, populate_compact_attribute(), TupleDescData::tdrefcount, TupleDescAttr(), and TupleDescSize.

Referenced by share_tupledesc().

◆ TupleDescCopyEntry()

void TupleDescCopyEntry ( TupleDesc  dst,
AttrNumber  dstAttno,
TupleDesc  src,
AttrNumber  srcAttno 
)

Definition at line 468 of file tupdesc.c.

470{
471 Form_pg_attribute dstAtt = TupleDescAttr(dst, dstAttno - 1);
472 Form_pg_attribute srcAtt = TupleDescAttr(src, srcAttno - 1);
473
474 /*
475 * sanity checks
476 */
477 Assert(src);
478 Assert(dst);
479 Assert(srcAttno >= 1);
480 Assert(srcAttno <= src->natts);
481 Assert(dstAttno >= 1);
482 Assert(dstAttno <= dst->natts);
483
484 memcpy(dstAtt, srcAtt, ATTRIBUTE_FIXED_PART_SIZE);
485
486 dstAtt->attnum = dstAttno;
487
488 /* since we're not copying constraints or defaults, clear these */
489 dstAtt->attnotnull = false;
490 dstAtt->atthasdef = false;
491 dstAtt->atthasmissing = false;
492 dstAtt->attidentity = '\0';
493 dstAtt->attgenerated = '\0';
494
495 populate_compact_attribute(dst, dstAttno - 1);
496}

References Assert(), ATTRIBUTE_FIXED_PART_SIZE, populate_compact_attribute(), and TupleDescAttr().

Referenced by addRangeTableEntryForFunction(), ExecInitFunctionScan(), and ordered_set_startup().

◆ TupleDescGetDefault()

Node * TupleDescGetDefault ( TupleDesc  tupdesc,
AttrNumber  attnum 
)

Definition at line 1092 of file tupdesc.c.

1093{
1094 Node *result = NULL;
1095
1096 if (tupdesc->constr)
1097 {
1098 AttrDefault *attrdef = tupdesc->constr->defval;
1099
1100 for (int i = 0; i < tupdesc->constr->num_defval; i++)
1101 {
1102 if (attrdef[i].adnum == attnum)
1103 {
1104 result = stringToNode(attrdef[i].adbin);
1105 break;
1106 }
1107 }
1108 }
1109
1110 return result;
1111}
void * stringToNode(const char *str)
Definition: read.c:90
Definition: nodes.h:135

References attnum, TupleDescData::constr, TupleConstr::defval, i, TupleConstr::num_defval, and stringToNode().

Referenced by build_column_default(), expandTableLikeClause(), and MergeAttributes().

◆ TupleDescInitBuiltinEntry()

void TupleDescInitBuiltinEntry ( TupleDesc  desc,
AttrNumber  attributeNumber,
const char *  attributeName,
Oid  oidtypeid,
int32  typmod,
int  attdim 
)

Definition at line 918 of file tupdesc.c.

924{
926
927 /* sanity checks */
928 Assert(desc);
929 Assert(attributeNumber >= 1);
930 Assert(attributeNumber <= desc->natts);
931 Assert(attdim >= 0);
932 Assert(attdim <= PG_INT16_MAX);
933
934 /* initialize the attribute fields */
935 att = TupleDescAttr(desc, attributeNumber - 1);
936 att->attrelid = 0; /* dummy value */
937
938 /* unlike TupleDescInitEntry, we require an attribute name */
939 Assert(attributeName != NULL);
940 namestrcpy(&(att->attname), attributeName);
941
942 att->atttypmod = typmod;
943
944 att->attnum = attributeNumber;
945 att->attndims = attdim;
946
947 att->attnotnull = false;
948 att->atthasdef = false;
949 att->atthasmissing = false;
950 att->attidentity = '\0';
951 att->attgenerated = '\0';
952 att->attisdropped = false;
953 att->attislocal = true;
954 att->attinhcount = 0;
955 /* variable-length fields are not present in tupledescs */
956
957 att->atttypid = oidtypeid;
958
959 /*
960 * Our goal here is to support just enough types to let basic builtin
961 * commands work without catalog access - e.g. so that we can do certain
962 * things even in processes that are not connected to a database.
963 */
964 switch (oidtypeid)
965 {
966 case TEXTOID:
967 case TEXTARRAYOID:
968 att->attlen = -1;
969 att->attbyval = false;
970 att->attalign = TYPALIGN_INT;
971 att->attstorage = TYPSTORAGE_EXTENDED;
972 att->attcompression = InvalidCompressionMethod;
973 att->attcollation = DEFAULT_COLLATION_OID;
974 break;
975
976 case BOOLOID:
977 att->attlen = 1;
978 att->attbyval = true;
979 att->attalign = TYPALIGN_CHAR;
980 att->attstorage = TYPSTORAGE_PLAIN;
981 att->attcompression = InvalidCompressionMethod;
982 att->attcollation = InvalidOid;
983 break;
984
985 case INT4OID:
986 att->attlen = 4;
987 att->attbyval = true;
988 att->attalign = TYPALIGN_INT;
989 att->attstorage = TYPSTORAGE_PLAIN;
990 att->attcompression = InvalidCompressionMethod;
991 att->attcollation = InvalidOid;
992 break;
993
994 case INT8OID:
995 att->attlen = 8;
996 att->attbyval = true;
997 att->attalign = TYPALIGN_DOUBLE;
998 att->attstorage = TYPSTORAGE_PLAIN;
999 att->attcompression = InvalidCompressionMethod;
1000 att->attcollation = InvalidOid;
1001 break;
1002
1003 case OIDOID:
1004 att->attlen = 4;
1005 att->attbyval = true;
1006 att->attalign = TYPALIGN_INT;
1007 att->attstorage = TYPSTORAGE_PLAIN;
1008 att->attcompression = InvalidCompressionMethod;
1009 att->attcollation = InvalidOid;
1010 break;
1011
1012 default:
1013 elog(ERROR, "unsupported type %u", oidtypeid);
1014 }
1015
1016 populate_compact_attribute(desc, attributeNumber - 1);
1017}
#define PG_INT16_MAX
Definition: c.h:591
#define ERROR
Definition: elog.h:39
#define elog(elevel,...)
Definition: elog.h:226
void namestrcpy(Name name, const char *str)
Definition: name.c:233
#define InvalidOid
Definition: postgres_ext.h:37
#define InvalidCompressionMethod

References Assert(), elog, ERROR, InvalidCompressionMethod, InvalidOid, namestrcpy(), PG_INT16_MAX, populate_compact_attribute(), and TupleDescAttr().

Referenced by CreateReplicationSlot(), IdentifySystem(), ReadReplicationSlot(), SendTablespaceList(), SendTimeLineHistory(), SendXlogRecPtrResult(), ShowAllGUCConfig(), ShowGUCConfigOption(), and StartReplication().

◆ TupleDescInitEntry()

void TupleDescInitEntry ( TupleDesc  desc,
AttrNumber  attributeNumber,
const char *  attributeName,
Oid  oidtypeid,
int32  typmod,
int  attdim 
)

Definition at line 842 of file tupdesc.c.

848{
849 HeapTuple tuple;
850 Form_pg_type typeForm;
852
853 /*
854 * sanity checks
855 */
856 Assert(desc);
857 Assert(attributeNumber >= 1);
858 Assert(attributeNumber <= desc->natts);
859 Assert(attdim >= 0);
860 Assert(attdim <= PG_INT16_MAX);
861
862 /*
863 * initialize the attribute fields
864 */
865 att = TupleDescAttr(desc, attributeNumber - 1);
866
867 att->attrelid = 0; /* dummy value */
868
869 /*
870 * Note: attributeName can be NULL, because the planner doesn't always
871 * fill in valid resname values in targetlists, particularly for resjunk
872 * attributes. Also, do nothing if caller wants to re-use the old attname.
873 */
874 if (attributeName == NULL)
875 MemSet(NameStr(att->attname), 0, NAMEDATALEN);
876 else if (attributeName != NameStr(att->attname))
877 namestrcpy(&(att->attname), attributeName);
878
879 att->atttypmod = typmod;
880
881 att->attnum = attributeNumber;
882 att->attndims = attdim;
883
884 att->attnotnull = false;
885 att->atthasdef = false;
886 att->atthasmissing = false;
887 att->attidentity = '\0';
888 att->attgenerated = '\0';
889 att->attisdropped = false;
890 att->attislocal = true;
891 att->attinhcount = 0;
892 /* variable-length fields are not present in tupledescs */
893
894 tuple = SearchSysCache1(TYPEOID, ObjectIdGetDatum(oidtypeid));
895 if (!HeapTupleIsValid(tuple))
896 elog(ERROR, "cache lookup failed for type %u", oidtypeid);
897 typeForm = (Form_pg_type) GETSTRUCT(tuple);
898
899 att->atttypid = oidtypeid;
900 att->attlen = typeForm->typlen;
901 att->attbyval = typeForm->typbyval;
902 att->attalign = typeForm->typalign;
903 att->attstorage = typeForm->typstorage;
904 att->attcompression = InvalidCompressionMethod;
905 att->attcollation = typeForm->typcollation;
906
907 populate_compact_attribute(desc, attributeNumber - 1);
908
909 ReleaseSysCache(tuple);
910}
#define MemSet(start, val, len)
Definition: c.h:1019
#define HeapTupleIsValid(tuple)
Definition: htup.h:78
static void * GETSTRUCT(const HeapTupleData *tuple)
Definition: htup_details.h:728
#define NAMEDATALEN
FormData_pg_type * Form_pg_type
Definition: pg_type.h:261
static Datum ObjectIdGetDatum(Oid X)
Definition: postgres.h:262
void ReleaseSysCache(HeapTuple tuple)
Definition: syscache.c:264
HeapTuple SearchSysCache1(int cacheId, Datum key1)
Definition: syscache.c:220

References Assert(), elog, ERROR, GETSTRUCT(), HeapTupleIsValid, InvalidCompressionMethod, MemSet, NAMEDATALEN, NameStr, namestrcpy(), ObjectIdGetDatum(), PG_INT16_MAX, populate_compact_attribute(), ReleaseSysCache(), SearchSysCache1(), and TupleDescAttr().

Referenced by aclexplode(), addRangeTableEntryForFunction(), brtuple_disk_tupdesc(), build_function_result_tupdesc_d(), build_row_from_vars(), BuildDescForRelation(), BuildDescFromLists(), CallStmtResultDesc(), create_toast_table(), dblink_get_pkey(), ExecInitFunctionScan(), ExecMakeTableFunctionResult(), ExecTypeFromExprList(), ExecTypeFromTLInternal(), expandRecordVariable(), ExplainResultDesc(), get_expr_result_type(), GetPGVariableResultDesc(), gistrescan(), init_sexpr(), initGinState(), injection_points_stats_fixed(), libpqrcv_processTuples(), materializeQueryResult(), materializeResult(), ordered_set_startup(), pg_buffercache_numa_pages(), pg_buffercache_pages(), pg_get_publication_tables(), pg_get_sequence_data(), pg_lock_status(), pg_prepared_xact(), pg_stat_file(), pg_stat_get_archiver(), pg_stat_get_backend_subxact(), pg_stat_get_replication_slot(), pg_stat_get_subscription_stats(), pg_stat_wal_build_tuple(), pg_visibility_tupdesc(), pg_walfile_name_offset(), resolve_polymorphic_tupdesc(), show_all_settings(), test_predtest(), tsvector_unnest(), and TypeGetTupleDesc().

◆ TupleDescInitEntryCollation()

void TupleDescInitEntryCollation ( TupleDesc  desc,
AttrNumber  attributeNumber,
Oid  collationid 
)

Definition at line 1026 of file tupdesc.c.

1029{
1030 /*
1031 * sanity checks
1032 */
1033 Assert(desc);
1034 Assert(attributeNumber >= 1);
1035 Assert(attributeNumber <= desc->natts);
1036
1037 TupleDescAttr(desc, attributeNumber - 1)->attcollation = collationid;
1038}

References Assert(), and TupleDescAttr().

Referenced by addRangeTableEntryForFunction(), build_row_from_vars(), BuildDescForRelation(), BuildDescFromLists(), ExecInitFunctionScan(), ExecTypeFromExprList(), ExecTypeFromTLInternal(), expandRecordVariable(), get_expr_result_type(), initGinState(), and resolve_polymorphic_tupdesc().

◆ verify_compact_attribute()

void verify_compact_attribute ( TupleDesc  tupdesc,
int  attnum 
)

Definition at line 142 of file tupdesc.c.

143{
144#ifdef USE_ASSERT_CHECKING
145 CompactAttribute cattr;
146 Form_pg_attribute attr = TupleDescAttr(tupdesc, attnum);
148
149 /*
150 * Make a temp copy of the TupleDesc's CompactAttribute. This may be a
151 * shared TupleDesc and the attcacheoff might get changed by another
152 * backend.
153 */
154 memcpy(&cattr, &tupdesc->compact_attrs[attnum], sizeof(CompactAttribute));
155
156 /*
157 * Populate the temporary CompactAttribute from the corresponding
158 * Form_pg_attribute
159 */
161
162 /*
163 * Make the attcacheoff match since it's been reset to -1 by
164 * populate_compact_attribute_internal. Same with attnullability.
165 */
166 tmp.attcacheoff = cattr.attcacheoff;
167 tmp.attnullability = cattr.attnullability;
168
169 /* Check the freshly populated CompactAttribute matches the TupleDesc's */
170 Assert(memcmp(&tmp, &cattr, sizeof(CompactAttribute)) == 0);
171#endif
172}
int32 attcacheoff
Definition: tupdesc.h:70

References Assert(), CompactAttribute::attcacheoff, CompactAttribute::attnullability, attnum, TupleDescData::compact_attrs, populate_compact_attribute_internal(), and TupleDescAttr().

Referenced by TupleDescCompactAttr().