</para></entry>
</row>
+ <row>
+ <entry role="catalog_table_entry"><para role="column_definition">
+ <structfield>attalign</structfield> <type>char</type>
+ </para>
+ <para>
+ A copy of <literal>pg_type.typalign</literal> of this column's type
+ </para></entry>
+ </row>
+
<row>
<entry role="catalog_table_entry"><para role="column_definition">
<structfield>attstorage</structfield> <type>char</type>
<row>
<entry role="catalog_table_entry"><para role="column_definition">
- <structfield>attalign</structfield> <type>char</type>
+ <structfield>attcompression</structfield> <type>char</type>
</para>
<para>
- A copy of <literal>pg_type.typalign</literal> of this column's type
+ The current compression method of the column. If it is an invalid
+ compression method (<literal>'\0'</literal>) then column data will not
+ be compressed. Otherwise, <literal>'p'</literal> = pglz compression or
+ <literal>'l'</literal> = <productname>LZ4</productname> compression.
</para></entry>
</row>
</para></entry>
</row>
- <row>
- <entry role="catalog_table_entry"><para role="column_definition">
- <structfield>attcompression</structfield> <type>char</type>
- </para>
- <para>
- The current compression method of the column. If it is an invalid
- compression method (<literal>'\0'</literal>) then column data will not
- be compressed. Otherwise, <literal>'p'</literal> = pglz compression or
- <literal>'l'</literal> = <productname>LZ4</productname> compression.
- </para></entry>
- </row>
-
<row>
<entry role="catalog_table_entry"><para role="column_definition">
<structfield>attacl</structfield> <type>aclitem[]</type>
* general it seems safer to check them always.
*
* attcacheoff must NOT be checked since it's possibly not set in both
- * copies.
+ * copies. We also 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;
return false;
if (attr1->attbyval != attr2->attbyval)
return false;
+ if (attr1->attalign != attr2->attalign)
+ return false;
if (attr1->attstorage != attr2->attstorage)
return false;
- if (attr1->attalign != attr2->attalign)
+ if (attr1->attcompression != attr2->attcompression)
return false;
if (attr1->attnotnull != attr2->attnotnull)
return false;
return false;
if (attr1->attcollation != attr2->attcollation)
return false;
- /* attacl, attoptions and attfdwoptions are not even present... */
+ /* variable-length fields are not even present... */
}
if (tupdesc1->constr != NULL)
att->attbyval = typeForm->typbyval;
att->attalign = typeForm->typalign;
att->attstorage = typeForm->typstorage;
- att->attcollation = typeForm->typcollation;
-
if (IsStorageCompressible(typeForm->typstorage))
att->attcompression = GetDefaultToastCompression();
else
att->attcompression = InvalidCompressionMethod;
+ att->attcollation = typeForm->typcollation;
ReleaseSysCache(tuple);
}
att->attbyval = false;
att->attalign = TYPALIGN_INT;
att->attstorage = TYPSTORAGE_EXTENDED;
+ att->attcompression = GetDefaultToastCompression();
att->attcollation = DEFAULT_COLLATION_OID;
break;
att->attbyval = true;
att->attalign = TYPALIGN_CHAR;
att->attstorage = TYPSTORAGE_PLAIN;
+ att->attcompression = InvalidCompressionMethod;
att->attcollation = InvalidOid;
break;
att->attbyval = true;
att->attalign = TYPALIGN_INT;
att->attstorage = TYPSTORAGE_PLAIN;
+ att->attcompression = InvalidCompressionMethod;
att->attcollation = InvalidOid;
break;
att->attbyval = FLOAT8PASSBYVAL;
att->attalign = TYPALIGN_DOUBLE;
att->attstorage = TYPSTORAGE_PLAIN;
+ att->attcompression = InvalidCompressionMethod;
att->attcollation = InvalidOid;
break;
typtup = (Form_pg_type) GETSTRUCT(tp);
desc->attlen = typtup->typlen;
desc->attbyval = typtup->typbyval;
- desc->attstorage = typtup->typstorage;
desc->attalign = typtup->typalign;
+ desc->attstorage = typtup->typstorage;
ReleaseSysCache(tp);
}
att->attalign = keyType->attalign;
att->attstorage = keyType->attstorage;
/* We shouldn't need to bother with making these valid: */
- att->attcollation = InvalidOid;
att->attcompression = InvalidCompressionMethod;
+ att->attcollation = InvalidOid;
/* In case we changed typlen, we'd better reset following offsets */
for (int i = spgFirstIncludeColumn; i < outTupDesc->natts; i++)
TupleDescAttr(outTupDesc, i)->attcacheoff = -1;
attrtypes[attnum]->atttypid = Ap->am_oid;
attrtypes[attnum]->attlen = Ap->am_typ.typlen;
attrtypes[attnum]->attbyval = Ap->am_typ.typbyval;
- attrtypes[attnum]->attstorage = Ap->am_typ.typstorage;
attrtypes[attnum]->attalign = Ap->am_typ.typalign;
+ attrtypes[attnum]->attstorage = Ap->am_typ.typstorage;
attrtypes[attnum]->attcollation = Ap->am_typ.typcollation;
/* if an array type, assume 1-dimensional attribute */
if (Ap->am_typ.typelem != InvalidOid && Ap->am_typ.typlen < 0)
attrtypes[attnum]->atttypid = TypInfo[typeoid].oid;
attrtypes[attnum]->attlen = TypInfo[typeoid].len;
attrtypes[attnum]->attbyval = TypInfo[typeoid].byval;
- attrtypes[attnum]->attstorage = TypInfo[typeoid].storage;
attrtypes[attnum]->attalign = TypInfo[typeoid].align;
+ attrtypes[attnum]->attstorage = TypInfo[typeoid].storage;
attrtypes[attnum]->attcollation = TypInfo[typeoid].collation;
/* if an array type, assume 1-dimensional attribute */
if (TypInfo[typeoid].elem != InvalidOid &&
attrtypes[attnum]->attndims = 0;
}
+ if (IsStorageCompressible(attrtypes[attnum]->attstorage))
+ attrtypes[attnum]->attcompression = GetDefaultToastCompression();
+ else
+ attrtypes[attnum]->attcompression = InvalidCompressionMethod;
+
/*
* If a system catalog column is collation-aware, force it to use C
* collation, so that its behavior is independent of the database's
attrtypes[attnum]->attcacheoff = -1;
attrtypes[attnum]->atttypmod = -1;
attrtypes[attnum]->attislocal = true;
- if (IsStorageCompressible(attrtypes[attnum]->attstorage))
- attrtypes[attnum]->attcompression = GetDefaultToastCompression();
- else
- attrtypes[attnum]->attcompression = InvalidCompressionMethod;
if (nullness == BOOTCOL_NULL_FORCE_NOT_NULL)
{
$row->{atttypid} = $type->{oid};
$row->{attlen} = $type->{typlen};
$row->{attbyval} = $type->{typbyval};
- $row->{attstorage} = $type->{typstorage};
$row->{attalign} = $type->{typalign};
+ $row->{attstorage} = $type->{typstorage};
+
+ $row->{attcompression} =
+ $type->{typstorage} ne 'p' && $type->{typstorage} ne 'e' ? 'p' : '\0';
# set attndims if it's an array type
$row->{attndims} = $type->{typcategory} eq 'A' ? '1' : '0';
$row->{attcollation} =
$type->{typcollation} ne '0' ? $C_COLLATION_OID : 0;
- $row->{attcompression} =
- $type->{typstorage} ne 'p' && $type->{typstorage} ne 'e' ? 'p' : '\0';
-
if (defined $attr->{forcenotnull})
{
$row->{attnotnull} = 't';
/*
* The initializers below do not include trailing variable length fields,
* but that's OK - we're never going to reference anything beyond the
- * fixed-size portion of the structure anyway.
+ * fixed-size portion of the structure anyway. Fields that can default
+ * to zeroes are also not mentioned.
*/
static const FormData_pg_attribute a1 = {
.attcacheoff = -1,
.atttypmod = -1,
.attbyval = false,
- .attstorage = TYPSTORAGE_PLAIN,
.attalign = TYPALIGN_SHORT,
+ .attstorage = TYPSTORAGE_PLAIN,
.attnotnull = true,
.attislocal = true,
};
.attcacheoff = -1,
.atttypmod = -1,
.attbyval = true,
- .attstorage = TYPSTORAGE_PLAIN,
.attalign = TYPALIGN_INT,
+ .attstorage = TYPSTORAGE_PLAIN,
.attnotnull = true,
.attislocal = true,
};
.attcacheoff = -1,
.atttypmod = -1,
.attbyval = true,
- .attstorage = TYPSTORAGE_PLAIN,
.attalign = TYPALIGN_INT,
+ .attstorage = TYPSTORAGE_PLAIN,
.attnotnull = true,
.attislocal = true,
};
.attcacheoff = -1,
.atttypmod = -1,
.attbyval = true,
- .attstorage = TYPSTORAGE_PLAIN,
.attalign = TYPALIGN_INT,
+ .attstorage = TYPSTORAGE_PLAIN,
.attnotnull = true,
.attislocal = true,
};
.attcacheoff = -1,
.atttypmod = -1,
.attbyval = true,
- .attstorage = TYPSTORAGE_PLAIN,
.attalign = TYPALIGN_INT,
+ .attstorage = TYPSTORAGE_PLAIN,
.attnotnull = true,
.attislocal = true,
};
.attcacheoff = -1,
.atttypmod = -1,
.attbyval = true,
- .attstorage = TYPSTORAGE_PLAIN,
.attalign = TYPALIGN_INT,
+ .attstorage = TYPSTORAGE_PLAIN,
.attnotnull = true,
.attislocal = true,
};
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_attbyval - 1] = BoolGetDatum(attrs->attbyval);
- slot[slotCount]->tts_values[Anum_pg_attribute_attstorage - 1] = CharGetDatum(attrs->attstorage);
slot[slotCount]->tts_values[Anum_pg_attribute_attalign - 1] = CharGetDatum(attrs->attalign);
+ slot[slotCount]->tts_values[Anum_pg_attribute_attstorage - 1] = CharGetDatum(attrs->attstorage);
+ slot[slotCount]->tts_values[Anum_pg_attribute_attcompression - 1] = CharGetDatum(attrs->attcompression);
slot[slotCount]->tts_values[Anum_pg_attribute_attnotnull - 1] = BoolGetDatum(attrs->attnotnull);
slot[slotCount]->tts_values[Anum_pg_attribute_atthasdef - 1] = BoolGetDatum(attrs->atthasdef);
slot[slotCount]->tts_values[Anum_pg_attribute_atthasmissing - 1] = BoolGetDatum(attrs->atthasmissing);
slot[slotCount]->tts_values[Anum_pg_attribute_attislocal - 1] = BoolGetDatum(attrs->attislocal);
slot[slotCount]->tts_values[Anum_pg_attribute_attinhcount - 1] = Int32GetDatum(attrs->attinhcount);
slot[slotCount]->tts_values[Anum_pg_attribute_attcollation - 1] = ObjectIdGetDatum(attrs->attcollation);
- slot[slotCount]->tts_values[Anum_pg_attribute_attcompression - 1] = CharGetDatum(attrs->attcompression);
if (attoptions && attoptions[natts] != (Datum) 0)
slot[slotCount]->tts_values[Anum_pg_attribute_attoptions - 1] = attoptions[natts];
else
to->attndims = from->attndims;
to->atttypmod = from->atttypmod;
to->attbyval = from->attbyval;
- to->attstorage = from->attstorage;
to->attalign = from->attalign;
+ to->attstorage = from->attstorage;
to->attcompression = from->attcompression;
}
else
*/
to->atttypid = keyType;
to->attlen = typeTup->typlen;
+ to->atttypmod = exprTypmod(indexkey);
to->attbyval = typeTup->typbyval;
- to->attstorage = typeTup->typstorage;
to->attalign = typeTup->typalign;
- to->atttypmod = exprTypmod(indexkey);
+ to->attstorage = typeTup->typstorage;
/*
* For expression columns, set attcompression invalid, since
* there's no table column from which to copy the value. Whenever
* we actually need to compress a value, we'll use whatever the
- * current value of default_compression_method is at that point in
+ * current value of default_toast_compression is at that point in
* time.
*/
to->attcompression = InvalidCompressionMethod;
to->attbyval = typeTup->typbyval;
to->attalign = typeTup->typalign;
to->attstorage = typeTup->typstorage;
+ /* As above, use the default compression method in this case */
+ to->attcompression = InvalidCompressionMethod;
ReleaseSysCache(tuple);
}
def->constraints = NIL;
def->location = -1;
if (CompressionMethodIsValid(attribute->attcompression))
- def->compression = pstrdup(GetCompressionMethodName(
- attribute->attcompression));
+ def->compression =
+ pstrdup(GetCompressionMethodName(attribute->attcompression));
else
def->compression = NULL;
inhSchema = lappend(inhSchema, def);
attribute.atttypid = typeOid;
attribute.attstattarget = (newattnum > 0) ? -1 : 0;
attribute.attlen = tform->typlen;
- attribute.atttypmod = typmod;
attribute.attnum = newattnum;
- attribute.attbyval = tform->typbyval;
attribute.attndims = list_length(colDef->typeName->arrayBounds);
- attribute.attstorage = tform->typstorage;
+ attribute.atttypmod = typmod;
+ attribute.attbyval = tform->typbyval;
attribute.attalign = tform->typalign;
+ attribute.attstorage = tform->typstorage;
+ /* do not set compression in views etc */
+ if (rel->rd_rel->relkind == RELKIND_RELATION ||
+ rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
+ attribute.attcompression = GetAttributeCompression(&attribute,
+ colDef->compression);
+ else
+ attribute.attcompression = InvalidCompressionMethod;
attribute.attnotnull = colDef->is_not_null;
attribute.atthasdef = false;
attribute.atthasmissing = false;
attribute.attinhcount = colDef->inhcount;
attribute.attcollation = collOid;
- /*
- * lookup attribute's compression method and store it in the
- * attr->attcompression.
- */
- if (rel->rd_rel->relkind == RELKIND_RELATION ||
- rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
- attribute.attcompression = GetAttributeCompression(&attribute,
- colDef->compression);
- else
- attribute.attcompression = InvalidCompressionMethod;
-
/* attribute.attacl is handled by InsertPgAttributeTuples() */
ReleaseSysCache(typeTuple);
Oid type;
int16 attlen;
bool attbyval;
- char attstorage;
char attalign;
+ char attstorage;
} SpGistTypeDesc;
typedef struct SpGistState
*/
/* yyyymmddN */
-#define CATALOG_VERSION_NO 202105121
+#define CATALOG_VERSION_NO 202105231
#endif
*/
bool attbyval;
+ /*
+ * attalign is a copy of the typalign field from pg_type for this
+ * attribute. See atttypid comments above.
+ */
+ char attalign;
+
/*----------
* attstorage tells for VARLENA attributes, what the heap access
* methods can do to it if a given tuple doesn't fit into a page.
char attstorage;
/*
- * attalign is a copy of the typalign field from pg_type for this
- * attribute. See atttypid comments above.
+ * Compression method. Must be InvalidCompressionMethod if and only if
+ * typstorage is 'plain' or 'external'.
*/
- char attalign;
+ char attcompression BKI_DEFAULT('\0');
/* This flag represents the "NOT NULL" constraint */
bool attnotnull;
/* attribute's collation, if any */
Oid attcollation BKI_LOOKUP_OPT(pg_collation);
- /*
- * compression method. Must be InvalidCompressionMethod if and only if
- * typstorage is 'plain' or 'external'.
- */
- char attcompression BKI_DEFAULT('\0');
-
#ifdef CATALOG_VARLEN /* variable-length fields start here */
/* NOTE: The following fields are not present in tuple descriptors. */
* ATTRIBUTE_FIXED_PART_SIZE is the size of the fixed-layout,
* guaranteed-not-null part of a pg_attribute row. This is in fact as much
* of the row as gets copied into tuple descriptors, so don't expect you
- * can access fields beyond attcollation except in a real tuple!
+ * can access the variable-length fields except in a real tuple!
*/
#define ATTRIBUTE_FIXED_PART_SIZE \
- (offsetof(FormData_pg_attribute,attcompression) + sizeof(char))
+ (offsetof(FormData_pg_attribute,attcollation) + sizeof(Oid))
/* ----------------
* Form_pg_attribute corresponds to a pointer to a tuple with