v5-0002-Use-CompactAttribute-instead-of-FormData_pg_attri.patch
application/octet-stream
Filename: v5-0002-Use-CompactAttribute-instead-of-FormData_pg_attri.patch
Type: application/octet-stream
Part: 1
Message:
Re: Make tuple deformation faster
Patch
Same data as JSON:
GET /api/v1/attachments/:id/patch
the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes.
API reference →
Format: format-patch
Series: patch v5-0002
Subject: Use CompactAttribute instead of FormData_pg_attribute
| File | + | − |
|---|---|---|
| contrib/amcheck/verify_heapam.c | 2 | 2 |
| contrib/pageinspect/heapfuncs.c | 2 | 2 |
| contrib/postgres_fdw/postgres_fdw.c | 3 | 3 |
| src/backend/access/brin/brin_inclusion.c | 4 | 4 |
| src/backend/access/brin/brin_tuple.c | 1 | 1 |
| src/backend/access/common/attmap.c | 5 | 3 |
| src/backend/access/gin/ginbulk.c | 2 | 2 |
| src/backend/access/gin/ginget.c | 2 | 2 |
| src/backend/access/gist/gistbuild.c | 4 | 2 |
| src/backend/access/heap/heapam.c | 4 | 4 |
| src/backend/access/heap/heapam_handler.c | 1 | 1 |
| src/backend/access/heap/heaptoast.c | 3 | 3 |
| src/backend/access/nbtree/nbtutils.c | 2 | 2 |
| src/backend/access/spgist/spgdoinsert.c | 1 | 1 |
| src/backend/access/table/toast_helper.c | 1 | 1 |
| src/backend/commands/copy.c | 3 | 3 |
| src/backend/executor/execExpr.c | 2 | 2 |
| src/backend/executor/execExprInterp.c | 3 | 3 |
| src/backend/executor/execJunk.c | 1 | 1 |
| src/backend/executor/execTuples.c | 2 | 2 |
| src/backend/executor/functions.c | 1 | 1 |
| src/backend/executor/nodeMemoize.c | 4 | 4 |
| src/backend/executor/nodeModifyTable.c | 2 | 2 |
| src/backend/executor/nodeValuesscan.c | 2 | 2 |
| src/backend/executor/tstoreReceiver.c | 2 | 2 |
| src/backend/jit/llvm/llvmjit_deform.c | 2 | 2 |
| src/backend/optimizer/util/plancat.c | 2 | 2 |
| src/backend/replication/pgoutput/pgoutput.c | 1 | 1 |
| src/backend/utils/adt/expandedrecord.c | 5 | 5 |
| src/backend/utils/adt/ri_triggers.c | 1 | 1 |
From 5cef2ced3221252f6dda1d2fd82149485bc7d22d Mon Sep 17 00:00:00 2001
From: David Rowley <dgrowley@gmail.com>
Date: Mon, 2 Dec 2024 13:39:04 +1300
Subject: [PATCH v5 2/5] Use CompactAttribute instead of FormData_pg_attribute
This adds more usages of TupleDesc's CompactAttribute rather than using
FormData_pg_attribute.
Author: David Rowley
Discussion: https://postgr.es/m/CAApHDvrBztXP3yx=NKNmo3xwFAFhEdyPnvrDg3=M0RhDs+4vYw@mail.gmail.com
---
contrib/amcheck/verify_heapam.c | 4 ++--
contrib/pageinspect/heapfuncs.c | 4 ++--
contrib/postgres_fdw/postgres_fdw.c | 6 +++---
src/backend/access/brin/brin_inclusion.c | 8 ++++----
src/backend/access/brin/brin_tuple.c | 2 +-
src/backend/access/common/attmap.c | 8 +++++---
src/backend/access/gin/ginbulk.c | 4 ++--
src/backend/access/gin/ginget.c | 4 ++--
src/backend/access/gist/gistbuild.c | 6 ++++--
src/backend/access/heap/heapam.c | 8 ++++----
src/backend/access/heap/heapam_handler.c | 2 +-
src/backend/access/heap/heaptoast.c | 6 +++---
src/backend/access/nbtree/nbtutils.c | 4 ++--
src/backend/access/spgist/spgdoinsert.c | 2 +-
src/backend/access/table/toast_helper.c | 2 +-
src/backend/commands/copy.c | 6 +++---
src/backend/executor/execExpr.c | 4 ++--
src/backend/executor/execExprInterp.c | 6 +++---
src/backend/executor/execJunk.c | 2 +-
src/backend/executor/execTuples.c | 4 ++--
src/backend/executor/functions.c | 2 +-
src/backend/executor/nodeMemoize.c | 8 ++++----
src/backend/executor/nodeModifyTable.c | 4 ++--
src/backend/executor/nodeValuesscan.c | 4 ++--
src/backend/executor/tstoreReceiver.c | 4 ++--
src/backend/jit/llvm/llvmjit_deform.c | 4 ++--
src/backend/optimizer/util/plancat.c | 4 ++--
src/backend/replication/pgoutput/pgoutput.c | 2 +-
src/backend/utils/adt/expandedrecord.c | 10 +++++-----
src/backend/utils/adt/ri_triggers.c | 2 +-
30 files changed, 70 insertions(+), 66 deletions(-)
diff --git a/contrib/amcheck/verify_heapam.c b/contrib/amcheck/verify_heapam.c
index 9c74daacee..f6d91aaa74 100644
--- a/contrib/amcheck/verify_heapam.c
+++ b/contrib/amcheck/verify_heapam.c
@@ -1571,11 +1571,11 @@ check_tuple_attribute(HeapCheckContext *ctx)
struct varlena *attr;
char *tp; /* pointer to the tuple data */
uint16 infomask;
- Form_pg_attribute thisatt;
+ CompactAttribute *thisatt;
struct varatt_external toast_pointer;
infomask = ctx->tuphdr->t_infomask;
- thisatt = TupleDescAttr(RelationGetDescr(ctx->rel), ctx->attnum);
+ thisatt = TupleDescCompactAttr(RelationGetDescr(ctx->rel), ctx->attnum);
tp = (char *) ctx->tuphdr + ctx->tuphdr->t_hoff;
diff --git a/contrib/pageinspect/heapfuncs.c b/contrib/pageinspect/heapfuncs.c
index 3dc705e43f..8c1b7d38aa 100644
--- a/contrib/pageinspect/heapfuncs.c
+++ b/contrib/pageinspect/heapfuncs.c
@@ -334,11 +334,11 @@ tuple_data_split_internal(Oid relid, char *tupdata,
for (i = 0; i < nattrs; i++)
{
- Form_pg_attribute attr;
+ CompactAttribute *attr;
bool is_null;
bytea *attr_data = NULL;
- attr = TupleDescAttr(tupdesc, i);
+ attr = TupleDescCompactAttr(tupdesc, i);
/*
* Tuple header can specify fewer attributes than tuple descriptor as
diff --git a/contrib/postgres_fdw/postgres_fdw.c b/contrib/postgres_fdw/postgres_fdw.c
index c0810fbd7c..cf56434118 100644
--- a/contrib/postgres_fdw/postgres_fdw.c
+++ b/contrib/postgres_fdw/postgres_fdw.c
@@ -1818,7 +1818,7 @@ postgresPlanForeignModify(PlannerInfo *root,
for (attnum = 1; attnum <= tupdesc->natts; attnum++)
{
- Form_pg_attribute attr = TupleDescAttr(tupdesc, attnum - 1);
+ CompactAttribute *attr = TupleDescCompactAttr(tupdesc, attnum - 1);
if (!attr->attisdropped)
targetAttrs = lappend_int(targetAttrs, attnum);
@@ -2191,7 +2191,7 @@ postgresBeginForeignInsert(ModifyTableState *mtstate,
/* We transmit all columns that are defined in the foreign table. */
for (attnum = 1; attnum <= tupdesc->natts; attnum++)
{
- Form_pg_attribute attr = TupleDescAttr(tupdesc, attnum - 1);
+ CompactAttribute *attr = TupleDescCompactAttr(tupdesc, attnum - 1);
if (!attr->attisdropped)
targetAttrs = lappend_int(targetAttrs, attnum);
@@ -4311,7 +4311,7 @@ convert_prep_stmt_params(PgFdwModifyState *fmstate,
foreach(lc, fmstate->target_attrs)
{
int attnum = lfirst_int(lc);
- Form_pg_attribute attr = TupleDescAttr(tupdesc, attnum - 1);
+ CompactAttribute *attr = TupleDescCompactAttr(tupdesc, attnum - 1);
Datum value;
bool isnull;
diff --git a/src/backend/access/brin/brin_inclusion.c b/src/backend/access/brin/brin_inclusion.c
index 750276998c..faec0a9da8 100644
--- a/src/backend/access/brin/brin_inclusion.c
+++ b/src/backend/access/brin/brin_inclusion.c
@@ -146,12 +146,12 @@ brin_inclusion_add_value(PG_FUNCTION_ARGS)
Datum result;
bool new = false;
AttrNumber attno;
- Form_pg_attribute attr;
+ CompactAttribute *attr;
Assert(!isnull);
attno = column->bv_attno;
- attr = TupleDescAttr(bdesc->bd_tupdesc, attno - 1);
+ attr = TupleDescCompactAttr(bdesc->bd_tupdesc, attno - 1);
/*
* If the recorded value is null, copy the new value (which we know to be
@@ -479,7 +479,7 @@ brin_inclusion_union(PG_FUNCTION_ARGS)
BrinValues *col_b = (BrinValues *) PG_GETARG_POINTER(2);
Oid colloid = PG_GET_COLLATION();
AttrNumber attno;
- Form_pg_attribute attr;
+ CompactAttribute *attr;
FmgrInfo *finfo;
Datum result;
@@ -487,7 +487,7 @@ brin_inclusion_union(PG_FUNCTION_ARGS)
Assert(!col_a->bv_allnulls && !col_b->bv_allnulls);
attno = col_a->bv_attno;
- attr = TupleDescAttr(bdesc->bd_tupdesc, attno - 1);
+ attr = TupleDescCompactAttr(bdesc->bd_tupdesc, attno - 1);
/* If B includes empty elements, mark A similarly, if needed. */
if (!DatumGetBool(col_a->bv_values[INCLUSION_CONTAINS_EMPTY]) &&
diff --git a/src/backend/access/brin/brin_tuple.c b/src/backend/access/brin/brin_tuple.c
index 997eb6d822..aae646be5d 100644
--- a/src/backend/access/brin/brin_tuple.c
+++ b/src/backend/access/brin/brin_tuple.c
@@ -699,7 +699,7 @@ brin_deconstruct_tuple(BrinDesc *brdesc,
datumno < brdesc->bd_info[attnum]->oi_nstored;
datumno++)
{
- Form_pg_attribute thisatt = TupleDescAttr(diskdsc, stored);
+ CompactAttribute *thisatt = TupleDescCompactAttr(diskdsc, stored);
if (thisatt->attlen == -1)
{
diff --git a/src/backend/access/common/attmap.c b/src/backend/access/common/attmap.c
index b0fe27ef57..0805c4121e 100644
--- a/src/backend/access/common/attmap.c
+++ b/src/backend/access/common/attmap.c
@@ -135,7 +135,7 @@ build_attrmap_by_position(TupleDesc indesc,
/* Check for unused input columns */
for (; j < indesc->natts; j++)
{
- if (TupleDescAttr(indesc, j)->attisdropped)
+ if (TupleDescCompactAttr(indesc, j)->attisdropped)
continue;
nincols++;
same = false; /* we'll complain below */
@@ -299,8 +299,8 @@ check_attrmap_match(TupleDesc indesc,
for (i = 0; i < attrMap->maplen; i++)
{
- Form_pg_attribute inatt = TupleDescAttr(indesc, i);
- Form_pg_attribute outatt = TupleDescAttr(outdesc, i);
+ CompactAttribute *inatt = TupleDescCompactAttr(indesc, i);
+ CompactAttribute *outatt;
/*
* If the input column has a missing attribute, we need a conversion.
@@ -311,6 +311,8 @@ check_attrmap_match(TupleDesc indesc,
if (attrMap->attnums[i] == (i + 1))
continue;
+ outatt = TupleDescCompactAttr(outdesc, i);
+
/*
* If it's a dropped column and the corresponding input column is also
* dropped, we don't need a conversion. However, attlen and attalign
diff --git a/src/backend/access/gin/ginbulk.c b/src/backend/access/gin/ginbulk.c
index f08b66ab79..d86b75bd63 100644
--- a/src/backend/access/gin/ginbulk.c
+++ b/src/backend/access/gin/ginbulk.c
@@ -127,10 +127,10 @@ ginInitBA(BuildAccumulator *accum)
static Datum
getDatumCopy(BuildAccumulator *accum, OffsetNumber attnum, Datum value)
{
- Form_pg_attribute att;
+ CompactAttribute *att;
Datum res;
- att = TupleDescAttr(accum->ginstate->origTupdesc, attnum - 1);
+ att = TupleDescCompactAttr(accum->ginstate->origTupdesc, attnum - 1);
if (att->attbyval)
res = value;
else
diff --git a/src/backend/access/gin/ginget.c b/src/backend/access/gin/ginget.c
index 0b4f2ebadb..2e347b6a32 100644
--- a/src/backend/access/gin/ginget.c
+++ b/src/backend/access/gin/ginget.c
@@ -122,7 +122,7 @@ collectMatchBitmap(GinBtreeData *btree, GinBtreeStack *stack,
GinScanEntry scanEntry, Snapshot snapshot)
{
OffsetNumber attnum;
- Form_pg_attribute attr;
+ CompactAttribute *attr;
/* Initialize empty bitmap result */
scanEntry->matchBitmap = tbm_create(work_mem * 1024L, NULL);
@@ -134,7 +134,7 @@ collectMatchBitmap(GinBtreeData *btree, GinBtreeStack *stack,
/* Locate tupdesc entry for key column (for attbyval/attlen data) */
attnum = scanEntry->attnum;
- attr = TupleDescAttr(btree->ginstate->origTupdesc, attnum - 1);
+ attr = TupleDescCompactAttr(btree->ginstate->origTupdesc, attnum - 1);
/*
* Predicate lock entry leaf page, following pages will be locked by
diff --git a/src/backend/access/gist/gistbuild.c b/src/backend/access/gist/gistbuild.c
index 63d1914b37..3a2759b446 100644
--- a/src/backend/access/gist/gistbuild.c
+++ b/src/backend/access/gist/gistbuild.c
@@ -657,10 +657,12 @@ gistInitBuffering(GISTBuildState *buildstate)
itupMinSize = (Size) MAXALIGN(sizeof(IndexTupleData));
for (i = 0; i < index->rd_att->natts; i++)
{
- if (TupleDescAttr(index->rd_att, i)->attlen < 0)
+ CompactAttribute *attr = TupleDescCompactAttr(index->rd_att, i);
+
+ if (attr->attlen < 0)
itupMinSize += VARHDRSZ;
else
- itupMinSize += TupleDescAttr(index->rd_att, i)->attlen;
+ itupMinSize += attr->attlen;
}
/* Calculate average and maximal number of index tuples which fit to page */
diff --git a/src/backend/access/heap/heapam.c b/src/backend/access/heap/heapam.c
index d00300c5dc..207e313bda 100644
--- a/src/backend/access/heap/heapam.c
+++ b/src/backend/access/heap/heapam.c
@@ -4197,8 +4197,6 @@ static bool
heap_attr_equals(TupleDesc tupdesc, int attrnum, Datum value1, Datum value2,
bool isnull1, bool isnull2)
{
- Form_pg_attribute att;
-
/*
* If one value is NULL and other is not, then they are certainly not
* equal
@@ -4228,8 +4226,10 @@ heap_attr_equals(TupleDesc tupdesc, int attrnum, Datum value1, Datum value2,
}
else
{
+ CompactAttribute *att;
+
Assert(attrnum <= tupdesc->natts);
- att = TupleDescAttr(tupdesc, attrnum - 1);
+ att = TupleDescCompactAttr(tupdesc, attrnum - 1);
return datumIsEqual(value1, value2, att->attbyval, att->attlen);
}
}
@@ -4311,7 +4311,7 @@ HeapDetermineColumnsInfo(Relation relation,
* that system attributes can't be stored externally.
*/
if (attrnum < 0 || isnull1 ||
- TupleDescAttr(tupdesc, attrnum - 1)->attlen != -1)
+ TupleDescCompactAttr(tupdesc, attrnum - 1)->attlen != -1)
continue;
/*
diff --git a/src/backend/access/heap/heapam_handler.c b/src/backend/access/heap/heapam_handler.c
index a8d95e0f1c..ee1392facf 100644
--- a/src/backend/access/heap/heapam_handler.c
+++ b/src/backend/access/heap/heapam_handler.c
@@ -2553,7 +2553,7 @@ reform_and_rewrite_tuple(HeapTuple tuple,
/* Be sure to null out any dropped columns */
for (i = 0; i < newTupDesc->natts; i++)
{
- if (TupleDescAttr(newTupDesc, i)->attisdropped)
+ if (TupleDescCompactAttr(newTupDesc, i)->attisdropped)
isnull[i] = true;
}
diff --git a/src/backend/access/heap/heaptoast.c b/src/backend/access/heap/heaptoast.c
index a420e16530..c3a85d8d32 100644
--- a/src/backend/access/heap/heaptoast.c
+++ b/src/backend/access/heap/heaptoast.c
@@ -369,7 +369,7 @@ toast_flatten_tuple(HeapTuple tup, TupleDesc tupleDesc)
/*
* Look at non-null varlena attributes
*/
- if (!toast_isnull[i] && TupleDescAttr(tupleDesc, i)->attlen == -1)
+ if (!toast_isnull[i] && TupleDescCompactAttr(tupleDesc, i)->attlen == -1)
{
struct varlena *new_value;
@@ -483,7 +483,7 @@ toast_flatten_tuple_to_datum(HeapTupleHeader tup,
*/
if (toast_isnull[i])
has_nulls = true;
- else if (TupleDescAttr(tupleDesc, i)->attlen == -1)
+ else if (TupleDescCompactAttr(tupleDesc, i)->attlen == -1)
{
struct varlena *new_value;
@@ -584,7 +584,7 @@ toast_build_flattened_tuple(TupleDesc tupleDesc,
/*
* Look at non-null varlena attributes
*/
- if (!isnull[i] && TupleDescAttr(tupleDesc, i)->attlen == -1)
+ if (!isnull[i] && TupleDescCompactAttr(tupleDesc, i)->attlen == -1)
{
struct varlena *new_value;
diff --git a/src/backend/access/nbtree/nbtutils.c b/src/backend/access/nbtree/nbtutils.c
index 50cbf06cb4..e5e4f3bfbb 100644
--- a/src/backend/access/nbtree/nbtutils.c
+++ b/src/backend/access/nbtree/nbtutils.c
@@ -4886,11 +4886,11 @@ _bt_keep_natts_fast(Relation rel, IndexTuple lastleft, IndexTuple firstright)
datum2;
bool isNull1,
isNull2;
- Form_pg_attribute att;
+ CompactAttribute *att;
datum1 = index_getattr(lastleft, attnum, itupdesc, &isNull1);
datum2 = index_getattr(firstright, attnum, itupdesc, &isNull2);
- att = TupleDescAttr(itupdesc, attnum - 1);
+ att = TupleDescCompactAttr(itupdesc, attnum - 1);
if (isNull1 != isNull2)
break;
diff --git a/src/backend/access/spgist/spgdoinsert.c b/src/backend/access/spgist/spgdoinsert.c
index a4995c168b..2cb7ce43ba 100644
--- a/src/backend/access/spgist/spgdoinsert.c
+++ b/src/backend/access/spgist/spgdoinsert.c
@@ -1974,7 +1974,7 @@ spgdoinsert(Relation index, SpGistState *state,
{
if (!isnulls[i])
{
- if (TupleDescAttr(leafDescriptor, i)->attlen == -1)
+ if (TupleDescCompactAttr(leafDescriptor, i)->attlen == -1)
leafDatums[i] = PointerGetDatum(PG_DETOAST_DATUM(datums[i]));
else
leafDatums[i] = datums[i];
diff --git a/src/backend/access/table/toast_helper.c b/src/backend/access/table/toast_helper.c
index 53224932f0..b16fd21b8d 100644
--- a/src/backend/access/table/toast_helper.c
+++ b/src/backend/access/table/toast_helper.c
@@ -324,7 +324,7 @@ toast_delete_external(Relation rel, const Datum *values, const bool *isnull,
for (i = 0; i < numAttrs; i++)
{
- if (TupleDescAttr(tupleDesc, i)->attlen == -1)
+ if (TupleDescCompactAttr(tupleDesc, i)->attlen == -1)
{
Datum value = values[i];
diff --git a/src/backend/commands/copy.c b/src/backend/commands/copy.c
index 2d98ecf3f4..edcdb7c2d4 100644
--- a/src/backend/commands/copy.c
+++ b/src/backend/commands/copy.c
@@ -954,9 +954,9 @@ CopyGetAttnums(TupleDesc tupDesc, Relation rel, List *attnamelist)
for (i = 0; i < attr_count; i++)
{
- if (TupleDescAttr(tupDesc, i)->attisdropped)
- continue;
- if (TupleDescAttr(tupDesc, i)->attgenerated)
+ CompactAttribute *attr = TupleDescCompactAttr(tupDesc, i);
+
+ if (attr->attisdropped || attr->attgenerated)
continue;
attnums = lappend_int(attnums, i + 1);
}
diff --git a/src/backend/executor/execExpr.c b/src/backend/executor/execExpr.c
index e0eb96fd5a..0737207862 100644
--- a/src/backend/executor/execExpr.c
+++ b/src/backend/executor/execExpr.c
@@ -598,7 +598,7 @@ ExecBuildUpdateProjection(List *targetList,
*/
for (int attnum = relDesc->natts; attnum > 0; attnum--)
{
- Form_pg_attribute attr = TupleDescAttr(relDesc, attnum - 1);
+ CompactAttribute *attr = TupleDescCompactAttr(relDesc, attnum - 1);
if (attr->attisdropped)
continue;
@@ -694,7 +694,7 @@ ExecBuildUpdateProjection(List *targetList,
*/
for (int attnum = 1; attnum <= relDesc->natts; attnum++)
{
- Form_pg_attribute attr = TupleDescAttr(relDesc, attnum - 1);
+ CompactAttribute *attr = TupleDescCompactAttr(relDesc, attnum - 1);
if (attr->attisdropped)
{
diff --git a/src/backend/executor/execExprInterp.c b/src/backend/executor/execExprInterp.c
index bad7b195bf..a2e5e19e4a 100644
--- a/src/backend/executor/execExprInterp.c
+++ b/src/backend/executor/execExprInterp.c
@@ -2948,7 +2948,7 @@ ExecEvalRowNullInt(ExprState *state, ExprEvalStep *op,
for (int att = 1; att <= tupDesc->natts; att++)
{
/* ignore dropped columns */
- if (TupleDescAttr(tupDesc, att - 1)->attisdropped)
+ if (TupleDescCompactAttr(tupDesc, att - 1)->attisdropped)
continue;
if (heap_attisnull(&tmptup, att, tupDesc))
{
@@ -5092,8 +5092,8 @@ ExecEvalWholeRowVar(ExprState *state, ExprEvalStep *op, ExprContext *econtext)
for (int i = 0; i < var_tupdesc->natts; i++)
{
- Form_pg_attribute vattr = TupleDescAttr(var_tupdesc, i);
- Form_pg_attribute sattr = TupleDescAttr(tupleDesc, i);
+ CompactAttribute *vattr = TupleDescCompactAttr(var_tupdesc, i);
+ CompactAttribute *sattr = TupleDescCompactAttr(tupleDesc, i);
if (!vattr->attisdropped)
continue; /* already checked non-dropped cols */
diff --git a/src/backend/executor/execJunk.c b/src/backend/executor/execJunk.c
index b962c31383..7d0afca418 100644
--- a/src/backend/executor/execJunk.c
+++ b/src/backend/executor/execJunk.c
@@ -169,7 +169,7 @@ ExecInitJunkFilterConversion(List *targetList,
t = list_head(targetList);
for (i = 0; i < cleanLength; i++)
{
- if (TupleDescAttr(cleanTupType, i)->attisdropped)
+ if (TupleDescCompactAttr(cleanTupType, i)->attisdropped)
continue; /* map entry is already zero */
for (;;)
{
diff --git a/src/backend/executor/execTuples.c b/src/backend/executor/execTuples.c
index a09aa251e6..875515777b 100644
--- a/src/backend/executor/execTuples.c
+++ b/src/backend/executor/execTuples.c
@@ -187,7 +187,7 @@ tts_virtual_materialize(TupleTableSlot *slot)
/* compute size of memory required */
for (int natt = 0; natt < desc->natts; natt++)
{
- Form_pg_attribute att = TupleDescAttr(desc, natt);
+ CompactAttribute *att = TupleDescCompactAttr(desc, natt);
Datum val;
if (att->attbyval || slot->tts_isnull[natt])
@@ -223,7 +223,7 @@ tts_virtual_materialize(TupleTableSlot *slot)
/* and copy all attributes into the pre-allocated space */
for (int natt = 0; natt < desc->natts; natt++)
{
- Form_pg_attribute att = TupleDescAttr(desc, natt);
+ CompactAttribute *att = TupleDescCompactAttr(desc, natt);
Datum val;
if (att->attbyval || slot->tts_isnull[natt])
diff --git a/src/backend/executor/functions.c b/src/backend/executor/functions.c
index 8d1fda2ddc..5d52e0ab81 100644
--- a/src/backend/executor/functions.c
+++ b/src/backend/executor/functions.c
@@ -1886,7 +1886,7 @@ check_sql_fn_retval(List *queryTreeLists,
/* remaining columns in rettupdesc had better all be dropped */
for (colindex++; colindex <= tupnatts; colindex++)
{
- if (!TupleDescAttr(rettupdesc, colindex - 1)->attisdropped)
+ if (!TupleDescCompactAttr(rettupdesc, colindex - 1)->attisdropped)
ereport(ERROR,
(errcode(ERRCODE_INVALID_FUNCTION_DEFINITION),
errmsg("return type mismatch in function declared to return %s",
diff --git a/src/backend/executor/nodeMemoize.c b/src/backend/executor/nodeMemoize.c
index df8e3fff08..aff3d9d921 100644
--- a/src/backend/executor/nodeMemoize.c
+++ b/src/backend/executor/nodeMemoize.c
@@ -175,10 +175,10 @@ MemoizeHash_hash(struct memoize_hash *tb, const MemoizeKey *key)
if (!pslot->tts_isnull[i]) /* treat nulls as having hash key 0 */
{
- Form_pg_attribute attr;
+ CompactAttribute *attr;
uint32 hkey;
- attr = TupleDescAttr(pslot->tts_tupleDescriptor, i);
+ attr = TupleDescCompactAttr(pslot->tts_tupleDescriptor, i);
hkey = datum_image_hash(pslot->tts_values[i], attr->attbyval, attr->attlen);
@@ -242,7 +242,7 @@ MemoizeHash_equal(struct memoize_hash *tb, const MemoizeKey *key1,
for (int i = 0; i < numkeys; i++)
{
- Form_pg_attribute attr;
+ CompactAttribute *attr;
if (tslot->tts_isnull[i] != pslot->tts_isnull[i])
{
@@ -255,7 +255,7 @@ MemoizeHash_equal(struct memoize_hash *tb, const MemoizeKey *key1,
continue;
/* perform binary comparison on the two datums */
- attr = TupleDescAttr(tslot->tts_tupleDescriptor, i);
+ attr = TupleDescCompactAttr(tslot->tts_tupleDescriptor, i);
if (!datum_image_eq(tslot->tts_values[i], pslot->tts_values[i],
attr->attbyval, attr->attlen))
{
diff --git a/src/backend/executor/nodeModifyTable.c b/src/backend/executor/nodeModifyTable.c
index 1161520f76..c445c433df 100644
--- a/src/backend/executor/nodeModifyTable.c
+++ b/src/backend/executor/nodeModifyTable.c
@@ -496,14 +496,14 @@ ExecComputeStoredGenerated(ResultRelInfo *resultRelInfo,
for (int i = 0; i < natts; i++)
{
- Form_pg_attribute attr = TupleDescAttr(tupdesc, i);
+ CompactAttribute *attr = TupleDescCompactAttr(tupdesc, i);
if (ri_GeneratedExprs[i])
{
Datum val;
bool isnull;
- Assert(attr->attgenerated == ATTRIBUTE_GENERATED_STORED);
+ Assert(TupleDescAttr(tupdesc, i)->attgenerated == ATTRIBUTE_GENERATED_STORED);
econtext->ecxt_scantuple = slot;
diff --git a/src/backend/executor/nodeValuesscan.c b/src/backend/executor/nodeValuesscan.c
index 92948917a0..9838977f08 100644
--- a/src/backend/executor/nodeValuesscan.c
+++ b/src/backend/executor/nodeValuesscan.c
@@ -142,8 +142,8 @@ ValuesNext(ValuesScanState *node)
foreach(lc, exprstatelist)
{
ExprState *estate = (ExprState *) lfirst(lc);
- Form_pg_attribute attr = TupleDescAttr(slot->tts_tupleDescriptor,
- resind);
+ CompactAttribute *attr = TupleDescCompactAttr(slot->tts_tupleDescriptor,
+ resind);
values[resind] = ExecEvalExpr(estate,
econtext,
diff --git a/src/backend/executor/tstoreReceiver.c b/src/backend/executor/tstoreReceiver.c
index de4646b5c2..658d1724c8 100644
--- a/src/backend/executor/tstoreReceiver.c
+++ b/src/backend/executor/tstoreReceiver.c
@@ -65,7 +65,7 @@ tstoreStartupReceiver(DestReceiver *self, int operation, TupleDesc typeinfo)
{
for (i = 0; i < natts; i++)
{
- Form_pg_attribute attr = TupleDescAttr(typeinfo, i);
+ CompactAttribute *attr = TupleDescCompactAttr(typeinfo, i);
if (attr->attisdropped)
continue;
@@ -154,7 +154,7 @@ tstoreReceiveSlot_detoast(TupleTableSlot *slot, DestReceiver *self)
for (i = 0; i < natts; i++)
{
Datum val = slot->tts_values[i];
- Form_pg_attribute attr = TupleDescAttr(typeinfo, i);
+ CompactAttribute *attr = TupleDescCompactAttr(typeinfo, i);
if (!attr->attisdropped && attr->attlen == -1 && !slot->tts_isnull[i])
{
diff --git a/src/backend/jit/llvm/llvmjit_deform.c b/src/backend/jit/llvm/llvmjit_deform.c
index b07f8e7f75..f49e7bce7d 100644
--- a/src/backend/jit/llvm/llvmjit_deform.c
+++ b/src/backend/jit/llvm/llvmjit_deform.c
@@ -110,7 +110,7 @@ slot_compile_deform(LLVMJitContext *context, TupleDesc desc,
*/
for (attnum = 0; attnum < desc->natts; attnum++)
{
- Form_pg_attribute att = TupleDescAttr(desc, attnum);
+ CompactAttribute *att = TupleDescCompactAttr(desc, attnum);
/*
* If the column is declared NOT NULL then it must be present in every
@@ -393,7 +393,7 @@ slot_compile_deform(LLVMJitContext *context, TupleDesc desc,
*/
for (attnum = 0; attnum < natts; attnum++)
{
- Form_pg_attribute att = TupleDescAttr(desc, attnum);
+ CompactAttribute *att = TupleDescCompactAttr(desc, attnum);
LLVMValueRef v_incby;
int alignto;
LLVMValueRef l_attno = l_int16_const(lc, attnum);
diff --git a/src/backend/optimizer/util/plancat.c b/src/backend/optimizer/util/plancat.c
index 37b0ca2e43..561db6058b 100644
--- a/src/backend/optimizer/util/plancat.c
+++ b/src/backend/optimizer/util/plancat.c
@@ -175,12 +175,12 @@ get_relation_info(PlannerInfo *root, Oid relationObjectId, bool inhparent,
{
for (int i = 0; i < relation->rd_att->natts; i++)
{
- Form_pg_attribute attr = TupleDescAttr(relation->rd_att, i);
+ CompactAttribute *attr = TupleDescCompactAttr(relation->rd_att, i);
if (attr->attnotnull)
{
rel->notnullattnums = bms_add_member(rel->notnullattnums,
- attr->attnum);
+ i + 1);
/*
* Per RemoveAttributeById(), dropped columns will have their
diff --git a/src/backend/replication/pgoutput/pgoutput.c b/src/backend/replication/pgoutput/pgoutput.c
index 5e23453f07..149f1e5a25 100644
--- a/src/backend/replication/pgoutput/pgoutput.c
+++ b/src/backend/replication/pgoutput/pgoutput.c
@@ -1340,7 +1340,7 @@ pgoutput_row_filter(Relation relation, TupleTableSlot *old_slot,
*/
for (i = 0; i < desc->natts; i++)
{
- Form_pg_attribute att = TupleDescAttr(desc, i);
+ CompactAttribute *att = TupleDescCompactAttr(desc, i);
/*
* if the column in the new tuple or old tuple is null, nothing to do
diff --git a/src/backend/utils/adt/expandedrecord.c b/src/backend/utils/adt/expandedrecord.c
index d2842495b5..913c08b06e 100644
--- a/src/backend/utils/adt/expandedrecord.c
+++ b/src/backend/utils/adt/expandedrecord.c
@@ -699,7 +699,7 @@ ER_get_flat_size(ExpandedObjectHeader *eohptr)
{
for (i = 0; i < erh->nfields; i++)
{
- Form_pg_attribute attr = TupleDescAttr(tupdesc, i);
+ CompactAttribute *attr = TupleDescCompactAttr(tupdesc, i);
if (!erh->dnulls[i] &&
!attr->attbyval && attr->attlen == -1 &&
@@ -1115,7 +1115,7 @@ expanded_record_set_field_internal(ExpandedRecordHeader *erh, int fnumber,
bool check_constraints)
{
TupleDesc tupdesc;
- Form_pg_attribute attr;
+ CompactAttribute *attr;
Datum *dvalues;
bool *dnulls;
char *oldValue;
@@ -1146,7 +1146,7 @@ expanded_record_set_field_internal(ExpandedRecordHeader *erh, int fnumber,
* Copy new field value into record's context, and deal with detoasting,
* if needed.
*/
- attr = TupleDescAttr(tupdesc, fnumber - 1);
+ attr = TupleDescCompactAttr(tupdesc, fnumber - 1);
if (!isnull && !attr->attbyval)
{
MemoryContext oldcxt;
@@ -1279,7 +1279,7 @@ expanded_record_set_fields(ExpandedRecordHeader *erh,
for (fnumber = 0; fnumber < erh->nfields; fnumber++)
{
- Form_pg_attribute attr = TupleDescAttr(tupdesc, fnumber);
+ CompactAttribute *attr = TupleDescCompactAttr(tupdesc, fnumber);
Datum newValue;
bool isnull;
@@ -1541,7 +1541,7 @@ check_domain_for_new_field(ExpandedRecordHeader *erh, int fnumber,
*/
if (!isnull)
{
- Form_pg_attribute attr = TupleDescAttr(erh->er_tupdesc, fnumber - 1);
+ CompactAttribute *attr = TupleDescCompactAttr(erh->er_tupdesc, fnumber - 1);
if (!attr->attbyval && attr->attlen == -1 &&
VARATT_IS_EXTERNAL(DatumGetPointer(newValue)))
diff --git a/src/backend/utils/adt/ri_triggers.c b/src/backend/utils/adt/ri_triggers.c
index 3185f48afa..093a3f1b66 100644
--- a/src/backend/utils/adt/ri_triggers.c
+++ b/src/backend/utils/adt/ri_triggers.c
@@ -2932,7 +2932,7 @@ ri_KeysEqual(Relation rel, TupleTableSlot *oldslot, TupleTableSlot *newslot,
* difference for ON UPDATE CASCADE, but for consistency we treat
* all changes to the PK the same.
*/
- Form_pg_attribute att = TupleDescAttr(oldslot->tts_tupleDescriptor, attnums[i] - 1);
+ CompactAttribute *att = TupleDescCompactAttr(oldslot->tts_tupleDescriptor, attnums[i] - 1);
if (!datum_image_eq(oldvalue, newvalue, att->attbyval, att->attlen))
return false;
--
2.34.1