PostgreSQL Source Code git master
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 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

◆ PinTupleDesc

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

Definition at line 206 of file tupdesc.h.

◆ ReleaseTupleDesc

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

Definition at line 212 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:200

Definition at line 146 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:184

Definition at line 191 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 138 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 1007 of file tupdesc.c.

1008{
1009 int natts;
1011 ListCell *l1;
1012 ListCell *l2;
1013 ListCell *l3;
1014 ListCell *l4;
1015 TupleDesc desc;
1016
1017 natts = list_length(names);
1018 Assert(natts == list_length(types));
1019 Assert(natts == list_length(typmods));
1020 Assert(natts == list_length(collations));
1021
1022 /*
1023 * allocate a new tuple descriptor
1024 */
1025 desc = CreateTemplateTupleDesc(natts);
1026
1027 attnum = 0;
1028 forfour(l1, names, l2, types, l3, typmods, l4, collations)
1029 {
1030 char *attname = strVal(lfirst(l1));
1031 Oid atttypid = lfirst_oid(l2);
1032 int32 atttypmod = lfirst_int(l3);
1033 Oid attcollation = lfirst_oid(l4);
1034
1035 attnum++;
1036
1037 TupleDescInitEntry(desc, attnum, attname, atttypid, atttypmod, 0);
1038 TupleDescInitEntryCollation(desc, attnum, attcollation);
1039 }
1040
1041 return desc;
1042}
int16 AttrNumber
Definition: attnum.h:21
#define Assert(condition)
Definition: c.h:815
int32_t int32
Definition: c.h:484
struct typedefs * types
Definition: ecpg.c:30
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:164
void TupleDescInitEntryCollation(TupleDesc desc, AttrNumber attributeNumber, Oid collationid)
Definition: tupdesc.c:982
void TupleDescInitEntry(TupleDesc desc, AttrNumber attributeNumber, const char *attributeName, Oid oidtypeid, int32 typmod, int attdim)
Definition: tupdesc.c:798
#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 164 of file tupdesc.c.

165{
166 TupleDesc desc;
167
168 /*
169 * sanity checks
170 */
171 Assert(natts >= 0);
172
173 /*
174 * Allocate enough memory for the tuple descriptor, the CompactAttribute
175 * array and also an array of FormData_pg_attribute.
176 *
177 * Note: the FormData_pg_attribute array stride is
178 * sizeof(FormData_pg_attribute), since we declare the array elements as
179 * FormData_pg_attribute for notational convenience. However, we only
180 * guarantee that the first ATTRIBUTE_FIXED_PART_SIZE bytes of each entry
181 * are valid; most code that copies tupdesc entries around copies just
182 * that much. In principle that could be less due to trailing padding,
183 * although with the current definition of pg_attribute there probably
184 * isn't any padding.
185 */
186 desc = (TupleDesc) palloc(offsetof(struct TupleDescData, compact_attrs) +
187 natts * sizeof(CompactAttribute) +
188 natts * sizeof(FormData_pg_attribute));
189
190 /*
191 * Initialize other fields of the tupdesc.
192 */
193 desc->natts = natts;
194 desc->constr = NULL;
195 desc->tdtypeid = RECORDOID;
196 desc->tdtypmod = -1;
197 desc->tdrefcount = -1; /* assume not reference-counted */
198
199 return desc;
200}
void * palloc(Size size)
Definition: mcxt.c:1317
int tdrefcount
Definition: tupdesc.h:133
TupleConstr * constr
Definition: tupdesc.h:134
int32 tdtypmod
Definition: tupdesc.h:132
Oid tdtypeid
Definition: tupdesc.h:131
struct CompactAttribute CompactAttribute
struct TupleDescData * TupleDesc
Definition: tupdesc.h:138

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(), materializeResult(), ordered_set_startup(), 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_get_wal(), 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 211 of file tupdesc.c.

212{
213 TupleDesc desc;
214 int i;
215
216 desc = CreateTemplateTupleDesc(natts);
217
218 for (i = 0; i < natts; ++i)
219 {
220 memcpy(TupleDescAttr(desc, i), attrs[i], ATTRIBUTE_FIXED_PART_SIZE);
222 }
223 return desc;
224}
int i
Definition: isn.c:72
#define ATTRIBUTE_FIXED_PART_SIZE
Definition: pg_attribute.h:192
void populate_compact_attribute(TupleDesc tupdesc, int attnum)
Definition: tupdesc.c:107
static FormData_pg_attribute * TupleDescAttr(TupleDesc tupdesc, int i)
Definition: tupdesc.h:153

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 234 of file tupdesc.c.

235{
236 TupleDesc desc;
237 int i;
238
239 desc = CreateTemplateTupleDesc(tupdesc->natts);
240
241 /* Flat-copy the attribute array */
242 memcpy(TupleDescAttr(desc, 0),
243 TupleDescAttr(tupdesc, 0),
244 desc->natts * sizeof(FormData_pg_attribute));
245
246 /*
247 * Since we're not copying constraints and defaults, clear fields
248 * associated with them.
249 */
250 for (i = 0; i < desc->natts; i++)
251 {
252 Form_pg_attribute att = TupleDescAttr(desc, i);
253
254 att->attnotnull = false;
255 att->atthasdef = false;
256 att->atthasmissing = false;
257 att->attidentity = '\0';
258 att->attgenerated = '\0';
259
261 }
262
263 /* We can copy the tuple type identification, too */
264 desc->tdtypeid = tupdesc->tdtypeid;
265 desc->tdtypmod = tupdesc->tdtypmod;
266
267 return desc;
268}

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

Referenced by assign_record_type_typmod(), BuildTupleHashTable(), 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(), storeRow(), update_cached_tupdesc(), and UtilityTupleDescriptor().

◆ CreateTupleDescCopyConstr()

TupleDesc CreateTupleDescCopyConstr ( TupleDesc  tupdesc)

Definition at line 322 of file tupdesc.c.

323{
324 TupleDesc desc;
325 TupleConstr *constr = tupdesc->constr;
326 int i;
327
328 desc = CreateTemplateTupleDesc(tupdesc->natts);
329
330 /* Flat-copy the attribute array */
331 memcpy(TupleDescAttr(desc, 0),
332 TupleDescAttr(tupdesc, 0),
333 desc->natts * sizeof(FormData_pg_attribute));
334
335 for (i = 0; i < desc->natts; i++)
337
338 /* Copy the TupleConstr data structure, if any */
339 if (constr)
340 {
341 TupleConstr *cpy = (TupleConstr *) palloc0(sizeof(TupleConstr));
342
343 cpy->has_not_null = constr->has_not_null;
345
346 if ((cpy->num_defval = constr->num_defval) > 0)
347 {
348 cpy->defval = (AttrDefault *) palloc(cpy->num_defval * sizeof(AttrDefault));
349 memcpy(cpy->defval, constr->defval, cpy->num_defval * sizeof(AttrDefault));
350 for (i = cpy->num_defval - 1; i >= 0; i--)
351 cpy->defval[i].adbin = pstrdup(constr->defval[i].adbin);
352 }
353
354 if (constr->missing)
355 {
356 cpy->missing = (AttrMissing *) palloc(tupdesc->natts * sizeof(AttrMissing));
357 memcpy(cpy->missing, constr->missing, tupdesc->natts * sizeof(AttrMissing));
358 for (i = tupdesc->natts - 1; i >= 0; i--)
359 {
360 if (constr->missing[i].am_present)
361 {
362 CompactAttribute *attr = TupleDescCompactAttr(tupdesc, i);
363
364 cpy->missing[i].am_value = datumCopy(constr->missing[i].am_value,
365 attr->attbyval,
366 attr->attlen);
367 }
368 }
369 }
370
371 if ((cpy->num_check = constr->num_check) > 0)
372 {
373 cpy->check = (ConstrCheck *) palloc(cpy->num_check * sizeof(ConstrCheck));
374 memcpy(cpy->check, constr->check, cpy->num_check * sizeof(ConstrCheck));
375 for (i = cpy->num_check - 1; i >= 0; i--)
376 {
377 cpy->check[i].ccname = pstrdup(constr->check[i].ccname);
378 cpy->check[i].ccbin = pstrdup(constr->check[i].ccbin);
379 cpy->check[i].ccenforced = constr->check[i].ccenforced;
380 cpy->check[i].ccvalid = constr->check[i].ccvalid;
381 cpy->check[i].ccnoinherit = constr->check[i].ccnoinherit;
382 }
383 }
384
385 desc->constr = cpy;
386 }
387
388 /* We can copy the tuple type identification, too */
389 desc->tdtypeid = tupdesc->tdtypeid;
390 desc->tdtypmod = tupdesc->tdtypmod;
391
392 return desc;
393}
Datum datumCopy(Datum value, bool typByVal, int typLen)
Definition: datum.c:132
char * pstrdup(const char *in)
Definition: mcxt.c:1696
void * palloc0(Size size)
Definition: mcxt.c:1347
char * adbin
Definition: tupdesc.h:25
int16 attlen
Definition: tupdesc.h:70
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_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:168

References AttrDefault::adbin, AttrMissing::am_present, AttrMissing::am_value, CompactAttribute::attbyval, CompactAttribute::attlen, 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_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 278 of file tupdesc.c.

279{
280 TupleDesc desc;
281 int i;
282
283 Assert(natts <= tupdesc->natts);
284
285 desc = CreateTemplateTupleDesc(natts);
286
287 /* Flat-copy the attribute array */
288 memcpy(TupleDescAttr(desc, 0),
289 TupleDescAttr(tupdesc, 0),
290 desc->natts * sizeof(FormData_pg_attribute));
291
292 /*
293 * Since we're not copying constraints and defaults, clear fields
294 * associated with them.
295 */
296 for (i = 0; i < desc->natts; i++)
297 {
298 Form_pg_attribute att = TupleDescAttr(desc, i);
299
300 att->attnotnull = false;
301 att->atthasdef = false;
302 att->atthasmissing = false;
303 att->attidentity = '\0';
304 att->attgenerated = '\0';
305
307 }
308
309 /* We can copy the tuple type identification, too */
310 desc->tdtypeid = tupdesc->tdtypeid;
311 desc->tdtypmod = tupdesc->tdtypmod;
312
313 return desc;
314}

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 553 of file tupdesc.c.

554{
555 Assert(tupdesc->tdrefcount > 0);
556
558 if (--tupdesc->tdrefcount == 0)
559 FreeTupleDesc(tupdesc);
560}
ResourceOwner CurrentResourceOwner
Definition: resowner.c:165
void FreeTupleDesc(TupleDesc tupdesc)
Definition: tupdesc.c:478
static void ResourceOwnerForgetTupleDesc(ResourceOwner owner, TupleDesc tupdesc)
Definition: tupdesc.c:54

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 733 of file tupdesc.c.

734{
735 if (tupdesc1->natts != tupdesc2->natts)
736 return false;
737 if (tupdesc1->tdtypeid != tupdesc2->tdtypeid)
738 return false;
739
740 for (int i = 0; i < tupdesc1->natts; i++)
741 {
742 Form_pg_attribute attr1 = TupleDescAttr(tupdesc1, i);
743 Form_pg_attribute attr2 = TupleDescAttr(tupdesc2, i);
744
745 if (strcmp(NameStr(attr1->attname), NameStr(attr2->attname)) != 0)
746 return false;
747 if (attr1->atttypid != attr2->atttypid)
748 return false;
749 if (attr1->atttypmod != attr2->atttypmod)
750 return false;
751 if (attr1->attcollation != attr2->attcollation)
752 return false;
753
754 /* Record types derived from tables could have dropped fields. */
755 if (attr1->attisdropped != attr2->attisdropped)
756 return false;
757 }
758
759 return true;
760}
#define NameStr(name)
Definition: c.h:703

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

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

◆ equalTupleDescs()

bool equalTupleDescs ( TupleDesc  tupdesc1,
TupleDesc  tupdesc2 
)

Definition at line 566 of file tupdesc.c.

567{
568 int i,
569 n;
570
571 if (tupdesc1->natts != tupdesc2->natts)
572 return false;
573 if (tupdesc1->tdtypeid != tupdesc2->tdtypeid)
574 return false;
575
576 /* tdtypmod and tdrefcount are not checked */
577
578 for (i = 0; i < tupdesc1->natts; i++)
579 {
580 Form_pg_attribute attr1 = TupleDescAttr(tupdesc1, i);
581 Form_pg_attribute attr2 = TupleDescAttr(tupdesc2, i);
582
583 /*
584 * We do not need to check every single field here: we can disregard
585 * attrelid and attnum (which were used to place the row in the attrs
586 * array in the first place). It might look like we could dispense
587 * with checking attlen/attbyval/attalign, since these are derived
588 * from atttypid; but in the case of dropped columns we must check
589 * them (since atttypid will be zero for all dropped columns) and in
590 * general it seems safer to check them always.
591 *
592 * We intentionally ignore atthasmissing, since that's not very
593 * relevant in tupdescs, which lack the attmissingval field.
594 */
595 if (strcmp(NameStr(attr1->attname), NameStr(attr2->attname)) != 0)
596 return false;
597 if (attr1->atttypid != attr2->atttypid)
598 return false;
599 if (attr1->attlen != attr2->attlen)
600 return false;
601 if (attr1->attndims != attr2->attndims)
602 return false;
603 if (attr1->atttypmod != attr2->atttypmod)
604 return false;
605 if (attr1->attbyval != attr2->attbyval)
606 return false;
607 if (attr1->attalign != attr2->attalign)
608 return false;
609 if (attr1->attstorage != attr2->attstorage)
610 return false;
611 if (attr1->attcompression != attr2->attcompression)
612 return false;
613 if (attr1->attnotnull != attr2->attnotnull)
614 return false;
615 if (attr1->atthasdef != attr2->atthasdef)
616 return false;
617 if (attr1->attidentity != attr2->attidentity)
618 return false;
619 if (attr1->attgenerated != attr2->attgenerated)
620 return false;
621 if (attr1->attisdropped != attr2->attisdropped)
622 return false;
623 if (attr1->attislocal != attr2->attislocal)
624 return false;
625 if (attr1->attinhcount != attr2->attinhcount)
626 return false;
627 if (attr1->attcollation != attr2->attcollation)
628 return false;
629 /* variable-length fields are not even present... */
630 }
631
632 if (tupdesc1->constr != NULL)
633 {
634 TupleConstr *constr1 = tupdesc1->constr;
635 TupleConstr *constr2 = tupdesc2->constr;
636
637 if (constr2 == NULL)
638 return false;
639 if (constr1->has_not_null != constr2->has_not_null)
640 return false;
641 if (constr1->has_generated_stored != constr2->has_generated_stored)
642 return false;
643 n = constr1->num_defval;
644 if (n != (int) constr2->num_defval)
645 return false;
646 /* We assume here that both AttrDefault arrays are in adnum order */
647 for (i = 0; i < n; i++)
648 {
649 AttrDefault *defval1 = constr1->defval + i;
650 AttrDefault *defval2 = constr2->defval + i;
651
652 if (defval1->adnum != defval2->adnum)
653 return false;
654 if (strcmp(defval1->adbin, defval2->adbin) != 0)
655 return false;
656 }
657 if (constr1->missing)
658 {
659 if (!constr2->missing)
660 return false;
661 for (i = 0; i < tupdesc1->natts; i++)
662 {
663 AttrMissing *missval1 = constr1->missing + i;
664 AttrMissing *missval2 = constr2->missing + i;
665
666 if (missval1->am_present != missval2->am_present)
667 return false;
668 if (missval1->am_present)
669 {
670 CompactAttribute *missatt1 = TupleDescCompactAttr(tupdesc1, i);
671
672 if (!datumIsEqual(missval1->am_value, missval2->am_value,
673 missatt1->attbyval, missatt1->attlen))
674 return false;
675 }
676 }
677 }
678 else if (constr2->missing)
679 return false;
680 n = constr1->num_check;
681 if (n != (int) constr2->num_check)
682 return false;
683
684 /*
685 * Similarly, we rely here on the ConstrCheck entries being sorted by
686 * name. If there are duplicate names, the outcome of the comparison
687 * is uncertain, but that should not happen.
688 */
689 for (i = 0; i < n; i++)
690 {
691 ConstrCheck *check1 = constr1->check + i;
692 ConstrCheck *check2 = constr2->check + i;
693
694 if (!(strcmp(check1->ccname, check2->ccname) == 0 &&
695 strcmp(check1->ccbin, check2->ccbin) == 0 &&
696 check1->ccenforced == check2->ccenforced &&
697 check1->ccvalid == check2->ccvalid &&
698 check1->ccnoinherit == check2->ccnoinherit))
699 return false;
700 }
701 }
702 else if (tupdesc2->constr != NULL)
703 return false;
704 return true;
705}
bool datumIsEqual(Datum value1, Datum value2, bool typByVal, int typLen)
Definition: datum.c:223
AttrNumber adnum
Definition: tupdesc.h:24

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

Referenced by RelationFindReplTupleSeq(), and RelationRebuildRelation().

◆ FreeTupleDesc()

void FreeTupleDesc ( TupleDesc  tupdesc)

Definition at line 478 of file tupdesc.c.

479{
480 int i;
481
482 /*
483 * Possibly this should assert tdrefcount == 0, to disallow explicit
484 * freeing of un-refcounted tupdescs?
485 */
486 Assert(tupdesc->tdrefcount <= 0);
487
488 if (tupdesc->constr)
489 {
490 if (tupdesc->constr->num_defval > 0)
491 {
492 AttrDefault *attrdef = tupdesc->constr->defval;
493
494 for (i = tupdesc->constr->num_defval - 1; i >= 0; i--)
495 pfree(attrdef[i].adbin);
496 pfree(attrdef);
497 }
498 if (tupdesc->constr->missing)
499 {
500 AttrMissing *attrmiss = tupdesc->constr->missing;
501
502 for (i = tupdesc->natts - 1; i >= 0; i--)
503 {
504 if (attrmiss[i].am_present
505 && !TupleDescAttr(tupdesc, i)->attbyval)
506 pfree(DatumGetPointer(attrmiss[i].am_value));
507 }
508 pfree(attrmiss);
509 }
510 if (tupdesc->constr->num_check > 0)
511 {
512 ConstrCheck *check = tupdesc->constr->check;
513
514 for (i = tupdesc->constr->num_check - 1; i >= 0; i--)
515 {
516 pfree(check[i].ccname);
517 pfree(check[i].ccbin);
518 }
519 pfree(check);
520 }
521 pfree(tupdesc->constr);
522 }
523
524 pfree(tupdesc);
525}
void pfree(void *pointer)
Definition: mcxt.c:1521
bool attbyval
Definition: pg_attribute.h:94
static Pointer DatumGetPointer(Datum X)
Definition: postgres.h:317

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(), DecrTupleDescRefCount(), 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 769 of file tupdesc.c.

770{
771 uint32 s;
772 int i;
773
774 s = hash_combine(0, hash_uint32(desc->natts));
775 s = hash_combine(s, hash_uint32(desc->tdtypeid));
776 for (i = 0; i < desc->natts; ++i)
777 s = hash_combine(s, hash_uint32(TupleDescAttr(desc, i)->atttypid));
778
779 return s;
780}
uint32_t uint32
Definition: c.h:488
static Datum hash_uint32(uint32 k)
Definition: hashfn.h:43
static uint32 hash_combine(uint32 a, uint32 b)
Definition: hashfn.h:68

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

Referenced by record_type_typmod_hash(), and shared_record_table_hash().

◆ IncrTupleDescRefCount()

void IncrTupleDescRefCount ( TupleDesc  tupdesc)

Definition at line 535 of file tupdesc.c.

536{
537 Assert(tupdesc->tdrefcount >= 0);
538
540 tupdesc->tdrefcount++;
542}
void ResourceOwnerEnlarge(ResourceOwner owner)
Definition: resowner.c:442
static void ResourceOwnerRememberTupleDesc(ResourceOwner owner, TupleDesc tupdesc)
Definition: tupdesc.c:48

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 107 of file tupdesc.c.

108{
109 Form_pg_attribute src = TupleDescAttr(tupdesc, attnum);
110 CompactAttribute *dst;
111
112 /*
113 * Don't use TupleDescCompactAttr to prevent infinite recursion in assert
114 * builds.
115 */
116 dst = &tupdesc->compact_attrs[attnum];
117
119}
CompactAttribute compact_attrs[FLEXIBLE_ARRAY_MEMBER]
Definition: tupdesc.h:136
static void populate_compact_attribute_internal(Form_pg_attribute src, CompactAttribute *dst)
Definition: tupdesc.c:64

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

Referenced by BuildDescForRelation(), BuildHardcodedDescriptor(), ConstructTupleDescriptor(), CreateTupleDesc(), CreateTupleDescCopy(), CreateTupleDescCopyConstr(), CreateTupleDescTruncatedCopy(), DefineRelation(), 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 153 of file tupdesc.h.

154{
156
157 return &attrs[i];
158}
#define TupleDescAttrAddress(desc)
Definition: tupdesc.h:146

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_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_selective_binary_conversion(), check_sql_fn_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(), CopyGetAttnums(), CopyReadAttributesCSV(), CopyReadAttributesText(), create_foreign_modify(), create_toast_table(), CreateTriggerFiringOn(), CreateTupleDesc(), CreateTupleDescCopy(), CreateTupleDescCopyConstr(), CreateTupleDescTruncatedCopy(), currtid_for_view(), debugStartup(), debugtup(), DefineIndex(), DefineRelation(), 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(), ExecInitIndexOnlyScan(), ExecInitStoredGenerated(), ExecInitTableFuncScan(), ExecScanSubPlan(), ExecSetParamPlan(), ExecSort(), ExecTypeSetColNames(), expand_insert_targetlist(), expand_single_inheritance_child(), 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(), 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(), NextCopyFrom(), NextCopyFromRawFields(), 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_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(), 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(), StoreAttrDefault(), 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(), 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 168 of file tupdesc.h.

169{
170 CompactAttribute *cattr = &tupdesc->compact_attrs[i];
171
172#ifdef USE_ASSERT_CHECKING
173
174 /* Check that the CompactAttribute is correctly populated */
175 verify_compact_attribute(tupdesc, i);
176#endif
177
178 return cattr;
179}
void verify_compact_attribute(TupleDesc, int attnum)
Definition: tupdesc.c:132

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

Referenced by _bt_keep_natts_fast(), brin_deconstruct_tuple(), brin_inclusion_add_value(), brin_inclusion_union(), build_attrmap_by_position(), BuildHardcodedDescriptor(), BuildTupleFromCStrings(), check_attrmap_match(), check_domain_for_new_field(), check_sql_fn_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_info(), 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(), pgoutput_row_filter(), postgresBeginForeignInsert(), postgresPlanForeignModify(), reform_and_rewrite_tuple(), RelationBuildTupleDesc(), ri_KeysEqual(), 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 404 of file tupdesc.c.

405{
406 int i;
407
408 /* Flat-copy the header and attribute arrays */
409 memcpy(dst, src, TupleDescSize(src));
410
411 /*
412 * Since we're not copying constraints and defaults, clear fields
413 * associated with them.
414 */
415 for (i = 0; i < dst->natts; i++)
416 {
418
419 att->attnotnull = false;
420 att->atthasdef = false;
421 att->atthasmissing = false;
422 att->attidentity = '\0';
423 att->attgenerated = '\0';
424
426 }
427 dst->constr = NULL;
428
429 /*
430 * Also, assume the destination is not to be ref-counted. (Copying the
431 * source's refcount would be wrong in any case.)
432 */
433 dst->tdrefcount = -1;
434}
#define TupleDescSize(src)
Definition: tupdesc.h:191

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 444 of file tupdesc.c.

446{
447 Form_pg_attribute dstAtt = TupleDescAttr(dst, dstAttno - 1);
448 Form_pg_attribute srcAtt = TupleDescAttr(src, srcAttno - 1);
449
450 /*
451 * sanity checks
452 */
455 Assert(srcAttno >= 1);
456 Assert(srcAttno <= src->natts);
457 Assert(dstAttno >= 1);
458 Assert(dstAttno <= dst->natts);
459
460 memcpy(dstAtt, srcAtt, ATTRIBUTE_FIXED_PART_SIZE);
461
462 dstAtt->attnum = dstAttno;
463
464 /* since we're not copying constraints or defaults, clear these */
465 dstAtt->attnotnull = false;
466 dstAtt->atthasdef = false;
467 dstAtt->atthasmissing = false;
468 dstAtt->attidentity = '\0';
469 dstAtt->attgenerated = '\0';
470
471 populate_compact_attribute(dst, dstAttno - 1);
472}
#define PointerIsValid(pointer)
Definition: c.h:720

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

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

◆ TupleDescGetDefault()

Node * TupleDescGetDefault ( TupleDesc  tupdesc,
AttrNumber  attnum 
)

Definition at line 1048 of file tupdesc.c.

1049{
1050 Node *result = NULL;
1051
1052 if (tupdesc->constr)
1053 {
1054 AttrDefault *attrdef = tupdesc->constr->defval;
1055
1056 for (int i = 0; i < tupdesc->constr->num_defval; i++)
1057 {
1058 if (attrdef[i].adnum == attnum)
1059 {
1060 result = stringToNode(attrdef[i].adbin);
1061 break;
1062 }
1063 }
1064 }
1065
1066 return result;
1067}
void * stringToNode(const char *str)
Definition: read.c:90
Definition: nodes.h:129

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 874 of file tupdesc.c.

880{
882
883 /* sanity checks */
884 Assert(PointerIsValid(desc));
885 Assert(attributeNumber >= 1);
886 Assert(attributeNumber <= desc->natts);
887 Assert(attdim >= 0);
888 Assert(attdim <= PG_INT16_MAX);
889
890 /* initialize the attribute fields */
891 att = TupleDescAttr(desc, attributeNumber - 1);
892 att->attrelid = 0; /* dummy value */
893
894 /* unlike TupleDescInitEntry, we require an attribute name */
895 Assert(attributeName != NULL);
896 namestrcpy(&(att->attname), attributeName);
897
898 att->atttypmod = typmod;
899
900 att->attnum = attributeNumber;
901 att->attndims = attdim;
902
903 att->attnotnull = false;
904 att->atthasdef = false;
905 att->atthasmissing = false;
906 att->attidentity = '\0';
907 att->attgenerated = '\0';
908 att->attisdropped = false;
909 att->attislocal = true;
910 att->attinhcount = 0;
911 /* variable-length fields are not present in tupledescs */
912
913 att->atttypid = oidtypeid;
914
915 /*
916 * Our goal here is to support just enough types to let basic builtin
917 * commands work without catalog access - e.g. so that we can do certain
918 * things even in processes that are not connected to a database.
919 */
920 switch (oidtypeid)
921 {
922 case TEXTOID:
923 case TEXTARRAYOID:
924 att->attlen = -1;
925 att->attbyval = false;
926 att->attalign = TYPALIGN_INT;
927 att->attstorage = TYPSTORAGE_EXTENDED;
928 att->attcompression = InvalidCompressionMethod;
929 att->attcollation = DEFAULT_COLLATION_OID;
930 break;
931
932 case BOOLOID:
933 att->attlen = 1;
934 att->attbyval = true;
935 att->attalign = TYPALIGN_CHAR;
936 att->attstorage = TYPSTORAGE_PLAIN;
937 att->attcompression = InvalidCompressionMethod;
938 att->attcollation = InvalidOid;
939 break;
940
941 case INT4OID:
942 att->attlen = 4;
943 att->attbyval = true;
944 att->attalign = TYPALIGN_INT;
945 att->attstorage = TYPSTORAGE_PLAIN;
946 att->attcompression = InvalidCompressionMethod;
947 att->attcollation = InvalidOid;
948 break;
949
950 case INT8OID:
951 att->attlen = 8;
952 att->attbyval = FLOAT8PASSBYVAL;
953 att->attalign = TYPALIGN_DOUBLE;
954 att->attstorage = TYPSTORAGE_PLAIN;
955 att->attcompression = InvalidCompressionMethod;
956 att->attcollation = InvalidOid;
957 break;
958
959 case OIDOID:
960 att->attlen = 4;
961 att->attbyval = true;
962 att->attalign = TYPALIGN_INT;
963 att->attstorage = TYPSTORAGE_PLAIN;
964 att->attcompression = InvalidCompressionMethod;
965 att->attcollation = InvalidOid;
966 break;
967
968 default:
969 elog(ERROR, "unsupported type %u", oidtypeid);
970 }
971
972 populate_compact_attribute(desc, attributeNumber - 1);
973}
#define FLOAT8PASSBYVAL
Definition: c.h:592
#define PG_INT16_MAX
Definition: c.h:543
#define ERROR
Definition: elog.h:39
#define elog(elevel,...)
Definition: elog.h:225
void namestrcpy(Name name, const char *str)
Definition: name.c:233
#define InvalidOid
Definition: postgres_ext.h:37
#define InvalidCompressionMethod

References Assert, elog, ERROR, FLOAT8PASSBYVAL, InvalidCompressionMethod, InvalidOid, namestrcpy(), PG_INT16_MAX, PointerIsValid, 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 798 of file tupdesc.c.

804{
805 HeapTuple tuple;
806 Form_pg_type typeForm;
808
809 /*
810 * sanity checks
811 */
812 Assert(PointerIsValid(desc));
813 Assert(attributeNumber >= 1);
814 Assert(attributeNumber <= desc->natts);
815 Assert(attdim >= 0);
816 Assert(attdim <= PG_INT16_MAX);
817
818 /*
819 * initialize the attribute fields
820 */
821 att = TupleDescAttr(desc, attributeNumber - 1);
822
823 att->attrelid = 0; /* dummy value */
824
825 /*
826 * Note: attributeName can be NULL, because the planner doesn't always
827 * fill in valid resname values in targetlists, particularly for resjunk
828 * attributes. Also, do nothing if caller wants to re-use the old attname.
829 */
830 if (attributeName == NULL)
831 MemSet(NameStr(att->attname), 0, NAMEDATALEN);
832 else if (attributeName != NameStr(att->attname))
833 namestrcpy(&(att->attname), attributeName);
834
835 att->atttypmod = typmod;
836
837 att->attnum = attributeNumber;
838 att->attndims = attdim;
839
840 att->attnotnull = false;
841 att->atthasdef = false;
842 att->atthasmissing = false;
843 att->attidentity = '\0';
844 att->attgenerated = '\0';
845 att->attisdropped = false;
846 att->attislocal = true;
847 att->attinhcount = 0;
848 /* variable-length fields are not present in tupledescs */
849
850 tuple = SearchSysCache1(TYPEOID, ObjectIdGetDatum(oidtypeid));
851 if (!HeapTupleIsValid(tuple))
852 elog(ERROR, "cache lookup failed for type %u", oidtypeid);
853 typeForm = (Form_pg_type) GETSTRUCT(tuple);
854
855 att->atttypid = oidtypeid;
856 att->attlen = typeForm->typlen;
857 att->attbyval = typeForm->typbyval;
858 att->attalign = typeForm->typalign;
859 att->attstorage = typeForm->typstorage;
860 att->attcompression = InvalidCompressionMethod;
861 att->attcollation = typeForm->typcollation;
862
863 populate_compact_attribute(desc, attributeNumber - 1);
864
865 ReleaseSysCache(tuple);
866}
#define MemSet(start, val, len)
Definition: c.h:977
#define HeapTupleIsValid(tuple)
Definition: htup.h:78
#define GETSTRUCT(TUP)
Definition: htup_details.h:653
#define NAMEDATALEN
FormData_pg_type * Form_pg_type
Definition: pg_type.h:261
static Datum ObjectIdGetDatum(Oid X)
Definition: postgres.h:257
void ReleaseSysCache(HeapTuple tuple)
Definition: syscache.c:269
HeapTuple SearchSysCache1(int cacheId, Datum key1)
Definition: syscache.c:221

References Assert, elog, ERROR, GETSTRUCT, HeapTupleIsValid, InvalidCompressionMethod, MemSet, NAMEDATALEN, NameStr, namestrcpy(), ObjectIdGetDatum(), PG_INT16_MAX, PointerIsValid, 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(), materializeResult(), ordered_set_startup(), 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_get_wal(), 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 982 of file tupdesc.c.

985{
986 /*
987 * sanity checks
988 */
989 Assert(PointerIsValid(desc));
990 Assert(attributeNumber >= 1);
991 Assert(attributeNumber <= desc->natts);
992
993 TupleDescAttr(desc, attributeNumber - 1)->attcollation = collationid;
994}

References Assert, PointerIsValid, 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 132 of file tupdesc.c.

133{
134#ifdef USE_ASSERT_CHECKING
135 CompactAttribute *cattr = &tupdesc->compact_attrs[attnum];
136 Form_pg_attribute attr = TupleDescAttr(tupdesc, attnum);
138
139 /*
140 * Populate the temporary CompactAttribute from the corresponding
141 * Form_pg_attribute
142 */
144
145 /*
146 * Make the attcacheoff match since it's been reset to -1 by
147 * populate_compact_attribute_internal.
148 */
149 tmp.attcacheoff = cattr->attcacheoff;
150
151 /* Check the freshly populated CompactAttribute matches the TupleDesc's */
152 Assert(memcmp(&tmp, cattr, sizeof(CompactAttribute)) == 0);
153#endif
154}
int32 attcacheoff
Definition: tupdesc.h:69

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

Referenced by TupleDescCompactAttr().