Skip to content

Commit ac607a1

Browse files
author
Nikita Glukhov
committed
Add compression to pg_attribute
1 parent dbcd051 commit ac607a1

File tree

18 files changed

+201
-15
lines changed

18 files changed

+201
-15
lines changed

src/backend/access/common/tupdesc.c

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,11 @@
1919

2020
#include "postgres.h"
2121

22+
#include "access/compression.h"
2223
#include "access/htup_details.h"
2324
#include "catalog/pg_collation.h"
2425
#include "catalog/pg_type.h"
26+
#include "commands/defrem.h"
2527
#include "miscadmin.h"
2628
#include "parser/parse_type.h"
2729
#include "utils/acl.h"
@@ -89,6 +91,7 @@ CreateTemplateTupleDesc(int natts, bool hasoid)
8991
*/
9092
desc->natts = natts;
9193
desc->constr = NULL;
94+
desc->tdcmroutines = NULL;
9295
desc->tdtypeid = RECORDOID;
9396
desc->tdtypmod = -1;
9497
desc->tdhasoid = hasoid;
@@ -122,6 +125,7 @@ CreateTupleDesc(int natts, bool hasoid, Form_pg_attribute *attrs)
122125
desc->attrs = attrs;
123126
desc->natts = natts;
124127
desc->constr = NULL;
128+
desc->tdcmroutines = NULL;
125129
desc->tdtypeid = RECORDOID;
126130
desc->tdtypmod = -1;
127131
desc->tdhasoid = hasoid;
@@ -169,6 +173,7 @@ CreateTupleDescCopyConstr(TupleDesc tupdesc)
169173
{
170174
TupleDesc desc;
171175
TupleConstr *constr = tupdesc->constr;
176+
CompressionMethodRoutine **cmroutines = tupdesc->tdcmroutines;
172177
int i;
173178

174179
desc = CreateTemplateTupleDesc(tupdesc->natts, tupdesc->tdhasoid);
@@ -213,6 +218,21 @@ CreateTupleDescCopyConstr(TupleDesc tupdesc)
213218
desc->constr = cpy;
214219
}
215220

221+
if (cmroutines)
222+
{
223+
CompressionMethodRoutine **cmrs = (CompressionMethodRoutine **)
224+
palloc0(sizeof(*cmrs) * tupdesc->natts);
225+
226+
for (i = 0; i < tupdesc->natts; i++)
227+
if (cmroutines[i])
228+
{
229+
cmrs[i] = palloc(sizeof(**cmrs));
230+
memcpy(cmrs[i], cmroutines[i], sizeof(**cmrs));
231+
}
232+
233+
desc->tdcmroutines = cmrs;
234+
}
235+
216236
desc->tdtypeid = tupdesc->tdtypeid;
217237
desc->tdtypmod = tupdesc->tdtypmod;
218238

@@ -304,6 +324,14 @@ FreeTupleDesc(TupleDesc tupdesc)
304324
pfree(tupdesc->constr);
305325
}
306326

327+
if (tupdesc->tdcmroutines)
328+
{
329+
for (i = 0; i < tupdesc->natts; i++)
330+
if (tupdesc->tdcmroutines[i])
331+
pfree(tupdesc->tdcmroutines[i]);
332+
pfree(tupdesc->tdcmroutines);
333+
}
334+
307335
pfree(tupdesc);
308336
}
309337

@@ -413,6 +441,8 @@ equalTupleDescs(TupleDesc tupdesc1, TupleDesc tupdesc2)
413441
return false;
414442
if (attr1->attcollation != attr2->attcollation)
415443
return false;
444+
if (attr1->attcompression != attr2->attcompression)
445+
return false;
416446
/* attacl, attoptions and attfdwoptions are not even present... */
417447
}
418448

@@ -475,6 +505,10 @@ equalTupleDescs(TupleDesc tupdesc1, TupleDesc tupdesc2)
475505
}
476506
else if (tupdesc2->constr != NULL)
477507
return false;
508+
509+
if (tupdesc1->tdcmroutines != tupdesc2->tdcmroutines) /* FIXME compare cmroutines[*] */
510+
return false;
511+
478512
return true;
479513
}
480514

@@ -555,6 +589,7 @@ TupleDescInitEntry(TupleDesc desc,
555589
att->attalign = typeForm->typalign;
556590
att->attstorage = typeForm->typstorage;
557591
att->attcollation = typeForm->typcollation;
592+
att->attcompression = InvalidOid;
558593

559594
ReleaseSysCache(tuple);
560595
}
@@ -741,6 +776,22 @@ BuildDescForRelation(List *schema)
741776
has_not_null |= entry->is_not_null;
742777
desc->attrs[attnum - 1]->attislocal = entry->is_local;
743778
desc->attrs[attnum - 1]->attinhcount = entry->inhcount;
779+
780+
if (entry->compression)
781+
{
782+
/* Get compression method OID, throwing an error if it doesn't exist. */
783+
Oid cmoid = GetCompressionMethodOid(entry->compression->methodName,
784+
false);
785+
CompressionMethodRoutine *cmr =
786+
GetCompressionMethodRoutineByCmId(cmoid);
787+
788+
desc->attrs[attnum - 1]->attcompression = cmoid;
789+
790+
if (cmr->addAttr)
791+
(*cmr->addAttr)(desc->attrs[attnum - 1]);
792+
793+
/* TODO attcmoptions */
794+
}
744795
}
745796

746797
if (has_not_null)

src/backend/bootstrap/bootstrap.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -718,6 +718,7 @@ DefineAttr(char *name, char *type, int attnum, int nullness)
718718
attrtypes[attnum]->attcacheoff = -1;
719719
attrtypes[attnum]->atttypmod = -1;
720720
attrtypes[attnum]->attislocal = true;
721+
attrtypes[attnum]->attcompression = InvalidOid;
721722

722723
if (nullness == BOOTCOL_NULL_FORCE_NOT_NULL)
723724
{

src/backend/catalog/genbki.pl

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -447,9 +447,11 @@ sub emit_pgattr_row
447447
attisdropped => 'f',
448448
attislocal => 't',
449449
attinhcount => '0',
450+
attcompression=> '0',
450451
attacl => '_null_',
451452
attoptions => '_null_',
452-
attfdwoptions => '_null_');
453+
attfdwoptions => '_null_',
454+
attcmoptions => '_null_');
453455
return { %PGATTR_DEFAULTS, %row };
454456
}
455457

@@ -484,6 +486,7 @@ sub emit_schemapg_row
484486
delete $row->{attacl};
485487
delete $row->{attoptions};
486488
delete $row->{attfdwoptions};
489+
delete $row->{attcmoptions};
487490

488491
# Expand booleans from 'f'/'t' to 'false'/'true'.
489492
# Some values might be other macros (eg FLOAT4PASSBYVAL), don't change.

src/backend/catalog/heap.c

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
#include "catalog/partition.h"
4545
#include "catalog/pg_attrdef.h"
4646
#include "catalog/pg_collation.h"
47+
#include "catalog/pg_compression.h"
4748
#include "catalog/pg_constraint.h"
4849
#include "catalog/pg_constraint_fn.h"
4950
#include "catalog/pg_foreign_table.h"
@@ -627,11 +628,13 @@ InsertPgAttributeTuple(Relation pg_attribute_rel,
627628
values[Anum_pg_attribute_attislocal - 1] = BoolGetDatum(new_attribute->attislocal);
628629
values[Anum_pg_attribute_attinhcount - 1] = Int32GetDatum(new_attribute->attinhcount);
629630
values[Anum_pg_attribute_attcollation - 1] = ObjectIdGetDatum(new_attribute->attcollation);
631+
values[Anum_pg_attribute_attcompression - 1] = ObjectIdGetDatum(new_attribute->attcompression);
630632

631633
/* start out with empty permissions and empty options */
632634
nulls[Anum_pg_attribute_attacl - 1] = true;
633635
nulls[Anum_pg_attribute_attoptions - 1] = true;
634636
nulls[Anum_pg_attribute_attfdwoptions - 1] = true;
637+
nulls[Anum_pg_attribute_attcmoptions - 1] = true;
635638

636639
tup = heap_form_tuple(RelationGetDescr(pg_attribute_rel), values, nulls);
637640

@@ -706,6 +709,13 @@ AddNewAttributeTuples(Oid new_rel_oid,
706709
referenced.objectSubId = 0;
707710
recordDependencyOn(&myself, &referenced, DEPENDENCY_NORMAL);
708711
}
712+
713+
if (OidIsValid(attr->attcompression))
714+
{
715+
ObjectAddressSet(referenced, CompressionMethodRelationId,
716+
attr->attcompression);
717+
recordDependencyOn(&myself, &referenced, DEPENDENCY_NORMAL);
718+
}
709719
}
710720

711721
/*
@@ -1596,6 +1606,8 @@ RemoveAttributeById(Oid relid, AttrNumber attnum)
15961606
/* We don't want to keep stats for it anymore */
15971607
attStruct->attstattarget = 0;
15981608

1609+
attStruct->attcompression = InvalidOid;
1610+
15991611
/*
16001612
* Change the column name to something that isn't likely to conflict
16011613
*/

src/backend/catalog/index.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -393,6 +393,7 @@ ConstructTupleDescriptor(Relation heapRelation,
393393
to->atttypmod = exprTypmod(indexkey);
394394
to->attislocal = true;
395395
to->attcollation = collationObjectId[i];
396+
to->attcompression = InvalidOid;
396397

397398
ReleaseSysCache(tuple);
398399

src/backend/commands/tablecmds.c

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
#include "catalog/partition.h"
3434
#include "catalog/pg_am.h"
3535
#include "catalog/pg_collation.h"
36+
#include "catalog/pg_compression.h"
3637
#include "catalog/pg_constraint.h"
3738
#include "catalog/pg_constraint_fn.h"
3839
#include "catalog/pg_depend.h"
@@ -2136,6 +2137,8 @@ MergeAttributes(List *schema, List *supers, char relpersistence,
21362137
storage_name(def->storage),
21372138
storage_name(newdef->storage))));
21382139

2140+
/* FIXME check compression mismatch */
2141+
21392142
/* Mark the column as locally defined */
21402143
def->is_local = true;
21412144
/* Merge of NOT NULL constraints = OR 'em together */
@@ -5267,6 +5270,7 @@ ATExecAddColumn(List **wqueue, AlteredTableInfo *tab, Relation rel,
52675270
attribute.attislocal = colDef->is_local;
52685271
attribute.attinhcount = colDef->inhcount;
52695272
attribute.attcollation = collOid;
5273+
attribute.attcompression = InvalidOid;
52705274
/* attribute.attacl is handled by InsertPgAttributeTuple */
52715275

52725276
ReleaseSysCache(typeTuple);
@@ -9309,7 +9313,9 @@ ATExecAlterColumnType(AlteredTableInfo *tab, Relation rel,
93099313
if (!(foundDep->refclassid == TypeRelationId &&
93109314
foundDep->refobjid == attTup->atttypid) &&
93119315
!(foundDep->refclassid == CollationRelationId &&
9312-
foundDep->refobjid == attTup->attcollation))
9316+
foundDep->refobjid == attTup->attcollation) &&
9317+
!(foundDep->refclassid == CompressionMethodRelationId &&
9318+
foundDep->refobjid == attTup->attcompression))
93139319
elog(ERROR, "found unexpected dependency for column");
93149320

93159321
CatalogTupleDelete(depRel, &depTup->t_self);
@@ -9331,6 +9337,7 @@ ATExecAlterColumnType(AlteredTableInfo *tab, Relation rel,
93319337
attTup->attbyval = tform->typbyval;
93329338
attTup->attalign = tform->typalign;
93339339
attTup->attstorage = tform->typstorage;
9340+
attTup->attcompression = InvalidOid;
93349341

93359342
ReleaseSysCache(typeTuple);
93369343

src/backend/nodes/copyfuncs.c

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2802,6 +2802,7 @@ _copyColumnDef(const ColumnDef *from)
28022802

28032803
COPY_STRING_FIELD(colname);
28042804
COPY_NODE_FIELD(typeName);
2805+
COPY_NODE_FIELD(compression);
28052806
COPY_SCALAR_FIELD(inhcount);
28062807
COPY_SCALAR_FIELD(is_local);
28072808
COPY_SCALAR_FIELD(is_not_null);
@@ -2820,6 +2821,18 @@ _copyColumnDef(const ColumnDef *from)
28202821
return newnode;
28212822
}
28222823

2824+
static ColumnCompression *
2825+
_copyColumnCompression(const ColumnCompression *from)
2826+
{
2827+
ColumnCompression *newnode = makeNode(ColumnCompression);
2828+
2829+
COPY_STRING_FIELD(methodName);
2830+
COPY_NODE_FIELD(options);
2831+
2832+
return newnode;
2833+
}
2834+
2835+
28232836
static Constraint *
28242837
_copyConstraint(const Constraint *from)
28252838
{
@@ -5451,6 +5464,9 @@ copyObjectImpl(const void *from)
54515464
case T_ColumnDef:
54525465
retval = _copyColumnDef(from);
54535466
break;
5467+
case T_ColumnCompression:
5468+
retval = _copyColumnCompression(from);
5469+
break;
54545470
case T_Constraint:
54555471
retval = _copyConstraint(from);
54565472
break;

src/backend/nodes/equalfuncs.c

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2536,6 +2536,7 @@ _equalColumnDef(const ColumnDef *a, const ColumnDef *b)
25362536
{
25372537
COMPARE_STRING_FIELD(colname);
25382538
COMPARE_NODE_FIELD(typeName);
2539+
COMPARE_NODE_FIELD(compression);
25392540
COMPARE_SCALAR_FIELD(inhcount);
25402541
COMPARE_SCALAR_FIELD(is_local);
25412542
COMPARE_SCALAR_FIELD(is_not_null);
@@ -2554,6 +2555,15 @@ _equalColumnDef(const ColumnDef *a, const ColumnDef *b)
25542555
return true;
25552556
}
25562557

2558+
static bool
2559+
_equalColumnCompression(const ColumnCompression *a, const ColumnCompression *b)
2560+
{
2561+
COMPARE_STRING_FIELD(methodName);
2562+
COMPARE_NODE_FIELD(options);
2563+
2564+
return true;
2565+
}
2566+
25572567
static bool
25582568
_equalConstraint(const Constraint *a, const Constraint *b)
25592569
{
@@ -3600,6 +3610,9 @@ equal(const void *a, const void *b)
36003610
case T_ColumnDef:
36013611
retval = _equalColumnDef(a, b);
36023612
break;
3613+
case T_ColumnCompression:
3614+
retval = _equalColumnCompression(a, b);
3615+
break;
36033616
case T_Constraint:
36043617
retval = _equalConstraint(a, b);
36053618
break;

src/backend/nodes/nodeFuncs.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3644,13 +3644,22 @@ raw_expression_tree_walker(Node *node,
36443644

36453645
if (walker(coldef->typeName, context))
36463646
return true;
3647+
if (walker(coldef->compression, context))
3648+
return true;
36473649
if (walker(coldef->raw_default, context))
36483650
return true;
36493651
if (walker(coldef->collClause, context))
36503652
return true;
36513653
/* for now, constraints are ignored */
36523654
}
36533655
break;
3656+
case T_ColumnCompression:
3657+
{
3658+
ColumnCompression *colcmp = (ColumnCompression *) node;
3659+
if (walker(colcmp->options, context))
3660+
return true;
3661+
}
3662+
break;
36543663
case T_IndexElem:
36553664
{
36563665
IndexElem *indelem = (IndexElem *) node;

src/backend/nodes/outfuncs.c

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2765,6 +2765,7 @@ _outColumnDef(StringInfo str, const ColumnDef *node)
27652765

27662766
WRITE_STRING_FIELD(colname);
27672767
WRITE_NODE_FIELD(typeName);
2768+
WRITE_NODE_FIELD(compression);
27682769
WRITE_INT_FIELD(inhcount);
27692770
WRITE_BOOL_FIELD(is_local);
27702771
WRITE_BOOL_FIELD(is_not_null);
@@ -2781,6 +2782,15 @@ _outColumnDef(StringInfo str, const ColumnDef *node)
27812782
WRITE_LOCATION_FIELD(location);
27822783
}
27832784

2785+
static void
2786+
_outColumnCompression(StringInfo str, const ColumnCompression *node)
2787+
{
2788+
WRITE_NODE_TYPE("COLUMNCOMPRESSION");
2789+
2790+
WRITE_STRING_FIELD(methodName);
2791+
WRITE_NODE_FIELD(options);
2792+
}
2793+
27842794
static void
27852795
_outTypeName(StringInfo str, const TypeName *node)
27862796
{
@@ -4063,6 +4073,9 @@ outNode(StringInfo str, const void *obj)
40634073
case T_ColumnDef:
40644074
_outColumnDef(str, obj);
40654075
break;
4076+
case T_ColumnCompression:
4077+
_outColumnCompression(str, obj);
4078+
break;
40664079
case T_TypeName:
40674080
_outTypeName(str, obj);
40684081
break;

0 commit comments

Comments
 (0)