Remove pg_attribute.attcacheoff column
authorDavid Rowley <[email protected]>
Fri, 20 Dec 2024 10:22:37 +0000 (23:22 +1300)
committerDavid Rowley <[email protected]>
Fri, 20 Dec 2024 10:22:37 +0000 (23:22 +1300)
The column is no longer needed as the offset is now cached in the
CompactAttribute struct per commit 5983a4cff.

Author: David Rowley
Reviewed-by: Andres Freund, Victor Yegorov
Discussion: https://postgr.es/m/CAApHDvrBztXP3yx=NKNmo3xwFAFhEdyPnvrDg3=M0RhDs+4vYw@mail.gmail.com

doc/src/sgml/catalogs.sgml
src/backend/access/common/tupdesc.c
src/backend/bootstrap/bootstrap.c
src/backend/catalog/heap.c
src/backend/catalog/index.c
src/backend/utils/cache/relcache.c
src/include/catalog/catversion.h
src/include/catalog/pg_attribute.h
src/test/regress/expected/type_sanity.out
src/test/regress/sql/type_sanity.sql

index bf3cee08a93c7495119ab9016093f8be0a52b182..cc6cf9bef097874aad4df2e90119295c3f14350d 100644 (file)
       </para></entry>
      </row>
 
-     <row>
-      <entry role="catalog_table_entry"><para role="column_definition">
-       <structfield>attcacheoff</structfield> <type>int4</type>
-      </para>
-      <para>
-       Always -1 in storage, but when loaded into a row descriptor
-       in memory this might be updated to cache the offset of the attribute
-       within the row
-      </para></entry>
-     </row>
-
      <row>
       <entry role="catalog_table_entry"><para role="column_definition">
        <structfield>atttypmod</structfield> <type>int4</type>
index 4d89acbe5e2f9dd16a6d9bed6d36bb97c5900a14..1a8d6481a29f8e7b50e5ac074d4970ab3fa54d3d 100644 (file)
@@ -388,17 +388,7 @@ TupleDescCopyEntry(TupleDesc dst, AttrNumber dstAttno,
 
    memcpy(dstAtt, srcAtt, ATTRIBUTE_FIXED_PART_SIZE);
 
-   /*
-    * Aside from updating the attno, we'd better reset attcacheoff.
-    *
-    * XXX Actually, to be entirely safe we'd need to reset the attcacheoff of
-    * all following columns in dst as well.  Current usage scenarios don't
-    * require that though, because all following columns will get initialized
-    * by other uses of this function or TupleDescInitEntry.  So we cheat a
-    * bit to avoid a useless O(N^2) penalty.
-    */
    dstAtt->attnum = dstAttno;
-   dstAtt->attcacheoff = -1;
 
    /* since we're not copying constraints or defaults, clear these */
    dstAtt->attnotnull = false;
@@ -528,9 +518,8 @@ equalTupleDescs(TupleDesc tupdesc1, TupleDesc tupdesc2)
         * them (since atttypid will be zero for all dropped columns) and in
         * general it seems safer to check them always.
         *
-        * attcacheoff must NOT be checked since it's possibly not set in both
-        * copies.  We also intentionally ignore atthasmissing, since that's
-        * not very relevant in tupdescs, which lack the attmissingval field.
+        * We intentionally ignore atthasmissing, since that's not very
+        * relevant in tupdescs, which lack the attmissingval field.
         */
        if (strcmp(NameStr(attr1->attname), NameStr(attr2->attname)) != 0)
            return false;
@@ -771,7 +760,6 @@ TupleDescInitEntry(TupleDesc desc,
    else if (attributeName != NameStr(att->attname))
        namestrcpy(&(att->attname), attributeName);
 
-   att->attcacheoff = -1;
    att->atttypmod = typmod;
 
    att->attnum = attributeNumber;
@@ -835,7 +823,6 @@ TupleDescInitBuiltinEntry(TupleDesc desc,
    Assert(attributeName != NULL);
    namestrcpy(&(att->attname), attributeName);
 
-   att->attcacheoff = -1;
    att->atttypmod = typmod;
 
    att->attnum = attributeNumber;
index d35ccab487363b5cad1a71a126cd04019cab7fc7..e0cb70ee9daa4df280b106d157c840f5ecc0ff60 100644 (file)
@@ -580,7 +580,6 @@ DefineAttr(char *name, char *type, int attnum, int nullness)
    if (OidIsValid(attrtypes[attnum]->attcollation))
        attrtypes[attnum]->attcollation = C_COLLATION_OID;
 
-   attrtypes[attnum]->attcacheoff = -1;
    attrtypes[attnum]->atttypmod = -1;
    attrtypes[attnum]->attislocal = true;
 
index d7b88b61dccc0c8f94e2ffc47ec9260f76c996da..7015967e88183830d0996e7674e9c7d430bb3f1e 100644 (file)
@@ -144,7 +144,6 @@ static const FormData_pg_attribute a1 = {
    .atttypid = TIDOID,
    .attlen = sizeof(ItemPointerData),
    .attnum = SelfItemPointerAttributeNumber,
-   .attcacheoff = -1,
    .atttypmod = -1,
    .attbyval = false,
    .attalign = TYPALIGN_SHORT,
@@ -158,7 +157,6 @@ static const FormData_pg_attribute a2 = {
    .atttypid = XIDOID,
    .attlen = sizeof(TransactionId),
    .attnum = MinTransactionIdAttributeNumber,
-   .attcacheoff = -1,
    .atttypmod = -1,
    .attbyval = true,
    .attalign = TYPALIGN_INT,
@@ -172,7 +170,6 @@ static const FormData_pg_attribute a3 = {
    .atttypid = CIDOID,
    .attlen = sizeof(CommandId),
    .attnum = MinCommandIdAttributeNumber,
-   .attcacheoff = -1,
    .atttypmod = -1,
    .attbyval = true,
    .attalign = TYPALIGN_INT,
@@ -186,7 +183,6 @@ static const FormData_pg_attribute a4 = {
    .atttypid = XIDOID,
    .attlen = sizeof(TransactionId),
    .attnum = MaxTransactionIdAttributeNumber,
-   .attcacheoff = -1,
    .atttypmod = -1,
    .attbyval = true,
    .attalign = TYPALIGN_INT,
@@ -200,7 +196,6 @@ static const FormData_pg_attribute a5 = {
    .atttypid = CIDOID,
    .attlen = sizeof(CommandId),
    .attnum = MaxCommandIdAttributeNumber,
-   .attcacheoff = -1,
    .atttypmod = -1,
    .attbyval = true,
    .attalign = TYPALIGN_INT,
@@ -220,7 +215,6 @@ static const FormData_pg_attribute a6 = {
    .atttypid = OIDOID,
    .attlen = sizeof(Oid),
    .attnum = TableOidAttributeNumber,
-   .attcacheoff = -1,
    .atttypmod = -1,
    .attbyval = true,
    .attalign = TYPALIGN_INT,
@@ -684,11 +678,10 @@ CheckAttributeType(const char *attname,
  *     Construct and insert a set of tuples in pg_attribute.
  *
  * Caller has already opened and locked pg_attribute.  tupdesc contains the
- * attributes to insert.  attcacheoff is always initialized to -1.
- * tupdesc_extra supplies the values for certain variable-length/nullable
- * pg_attribute fields and must contain the same number of elements as tupdesc
- * or be NULL.  The other variable-length fields of pg_attribute are always
- * initialized to null values.
+ * attributes to insert.  tupdesc_extra supplies the values for certain
+ * variable-length/nullable pg_attribute fields and must contain the same
+ * number of elements as tupdesc or be NULL.  The other variable-length fields
+ * of pg_attribute are always initialized to null values.
  *
  * indstate is the index state for CatalogTupleInsertWithInfo.  It can be
  * passed as NULL, in which case we'll fetch the necessary info.  (Don't do
@@ -740,7 +733,6 @@ InsertPgAttributeTuples(Relation pg_attribute_rel,
        slot[slotCount]->tts_values[Anum_pg_attribute_atttypid - 1] = ObjectIdGetDatum(attrs->atttypid);
        slot[slotCount]->tts_values[Anum_pg_attribute_attlen - 1] = Int16GetDatum(attrs->attlen);
        slot[slotCount]->tts_values[Anum_pg_attribute_attnum - 1] = Int16GetDatum(attrs->attnum);
-       slot[slotCount]->tts_values[Anum_pg_attribute_attcacheoff - 1] = Int32GetDatum(-1);
        slot[slotCount]->tts_values[Anum_pg_attribute_atttypmod - 1] = Int32GetDatum(attrs->atttypmod);
        slot[slotCount]->tts_values[Anum_pg_attribute_attndims - 1] = Int16GetDatum(attrs->attndims);
        slot[slotCount]->tts_values[Anum_pg_attribute_attbyval - 1] = BoolGetDatum(attrs->attbyval);
index 6200a0da5013b0b65b00b4f48e0f2d7fcd536350..6976249e9e9bc7fdaf2c92c8856ef6fcd7fd389a 100644 (file)
@@ -320,7 +320,6 @@ ConstructTupleDescriptor(Relation heapRelation,
 
        MemSet(to, 0, ATTRIBUTE_FIXED_PART_SIZE);
        to->attnum = i + 1;
-       to->attcacheoff = -1;
        to->attislocal = true;
        to->attcollation = (i < numkeyatts) ? collationIds[i] : InvalidOid;
 
index 5658e4accbd259044446a079e54e705b779628d9..1ce7eb9da8f0f822c844076640cc23d2e8e6144f 100644 (file)
@@ -661,19 +661,6 @@ RelationBuildTupleDesc(Relation relation)
        elog(ERROR, "pg_attribute catalog is missing %d attribute(s) for relation OID %u",
             need, RelationGetRelid(relation));
 
-   /*
-    * The attcacheoff values we read from pg_attribute should all be -1
-    * ("unknown").  Verify this if assert checking is on.
-    */
-#ifdef USE_ASSERT_CHECKING
-   {
-       int         i;
-
-       for (i = 0; i < RelationGetNumberOfAttributes(relation); i++)
-           Assert(TupleDescAttr(relation->rd_att, i)->attcacheoff == -1);
-   }
-#endif
-
    /*
     * We can easily set the attcacheoff value for the first attribute: it
     * must be zero.  This eliminates the need for special cases for attnum=1
@@ -1964,8 +1951,6 @@ formrdesc(const char *relationName, Oid relationReltype,
               &attrs[i],
               ATTRIBUTE_FIXED_PART_SIZE);
        has_not_null |= attrs[i].attnotnull;
-       /* make sure attcacheoff is valid */
-       TupleDescAttr(relation->rd_att, i)->attcacheoff = -1;
 
        populate_compact_attribute(relation->rd_att, i);
    }
@@ -4401,8 +4386,6 @@ BuildHardcodedDescriptor(int natts, const FormData_pg_attribute *attrs)
    for (i = 0; i < natts; i++)
    {
        memcpy(TupleDescAttr(result, i), &attrs[i], ATTRIBUTE_FIXED_PART_SIZE);
-       /* make sure attcacheoff is valid */
-       TupleDescAttr(result, i)->attcacheoff = -1;
 
        populate_compact_attribute(result, i);
    }
index 7931e78c026fc808a1a19e25f6ef93aa01f42c0e..76d692772cf7590bbe0dca3361a5f5f3b8c33e2e 100644 (file)
@@ -57,6 +57,6 @@
  */
 
 /*                         yyyymmddN */
-#define CATALOG_VERSION_NO 202412191
+#define CATALOG_VERSION_NO 202412201
 
 #endif
index 1c62b8bfcb58e244e45d45bd57f923e6a0d23bba..30d1e8cfcc05ee5d2f9278fd5a0daa208458af41 100644 (file)
@@ -73,15 +73,6 @@ CATALOG(pg_attribute,1249,AttributeRelationId) BKI_BOOTSTRAP BKI_ROWTYPE_OID(75,
     */
    int16       attnum;
 
-   /*
-    * fastgetattr() uses attcacheoff to cache byte offsets of attributes in
-    * heap tuples.  The value actually stored in pg_attribute (-1) indicates
-    * no cached value.  But when we copy these tuples into a tuple
-    * descriptor, we may then update attcacheoff in the copies. This speeds
-    * up the attribute walking process.
-    */
-   int32       attcacheoff BKI_DEFAULT(-1);
-
    /*
     * atttypmod records type-specific data supplied at table creation time
     * (for example, the max length of a varchar field).  It is passed to
index 88d8f6c32d665ed7b814214287d8ce3ffa5cbad8..8eff3d10d2798ddb7b7b99ee625ebed348048f53 100644 (file)
@@ -550,8 +550,7 @@ WHERE pc.relkind IN ('r', 't', 'm') and
 SELECT a1.attrelid, a1.attname
 FROM pg_attribute as a1
 WHERE a1.attrelid = 0 OR a1.atttypid = 0 OR a1.attnum = 0 OR
-    a1.attcacheoff != -1 OR a1.attinhcount < 0 OR
-    (a1.attinhcount = 0 AND NOT a1.attislocal);
+    a1.attinhcount < 0 OR (a1.attinhcount = 0 AND NOT a1.attislocal);
  attrelid | attname 
 ----------+---------
 (0 rows)
index e88d6cbe49d16213a7162040048020fa89ad3788..303f90955d157cc06b3e69c74d2165f1bf18b3f5 100644 (file)
@@ -397,8 +397,7 @@ WHERE pc.relkind IN ('r', 't', 'm') and
 SELECT a1.attrelid, a1.attname
 FROM pg_attribute as a1
 WHERE a1.attrelid = 0 OR a1.atttypid = 0 OR a1.attnum = 0 OR
-    a1.attcacheoff != -1 OR a1.attinhcount < 0 OR
-    (a1.attinhcount = 0 AND NOT a1.attislocal);
+    a1.attinhcount < 0 OR (a1.attinhcount = 0 AND NOT a1.attislocal);
 
 -- Cross-check attnum against parent relation