Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitac607a1

Browse files
author
Nikita Glukhov
committed
Add compression to pg_attribute
1 parentdbcd051 commitac607a1

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
TupleDescdesc;
171175
TupleConstr*constr=tupdesc->constr;
176+
CompressionMethodRoutine**cmroutines=tupdesc->tdcmroutines;
172177
inti;
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
elseif (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+
Oidcmoid=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
returnnewnode;
28212822
}
28222823

2824+
staticColumnCompression*
2825+
_copyColumnCompression(constColumnCompression*from)
2826+
{
2827+
ColumnCompression*newnode=makeNode(ColumnCompression);
2828+
2829+
COPY_STRING_FIELD(methodName);
2830+
COPY_NODE_FIELD(options);
2831+
2832+
returnnewnode;
2833+
}
2834+
2835+
28232836
staticConstraint*
28242837
_copyConstraint(constConstraint*from)
28252838
{
@@ -5451,6 +5464,9 @@ copyObjectImpl(const void *from)
54515464
caseT_ColumnDef:
54525465
retval=_copyColumnDef(from);
54535466
break;
5467+
caseT_ColumnCompression:
5468+
retval=_copyColumnCompression(from);
5469+
break;
54545470
caseT_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+
staticbool
2559+
_equalColumnCompression(constColumnCompression*a,constColumnCompression*b)
2560+
{
2561+
COMPARE_STRING_FIELD(methodName);
2562+
COMPARE_NODE_FIELD(options);
2563+
2564+
return true;
2565+
}
2566+
25572567
staticbool
25582568
_equalConstraint(constConstraint*a,constConstraint*b)
25592569
{
@@ -3600,6 +3610,9 @@ equal(const void *a, const void *b)
36003610
caseT_ColumnDef:
36013611
retval=_equalColumnDef(a,b);
36023612
break;
3613+
caseT_ColumnCompression:
3614+
retval=_equalColumnCompression(a,b);
3615+
break;
36033616
caseT_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+
caseT_ColumnCompression:
3657+
{
3658+
ColumnCompression*colcmp= (ColumnCompression*)node;
3659+
if (walker(colcmp->options,context))
3660+
return true;
3661+
}
3662+
break;
36543663
caseT_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+
staticvoid
2786+
_outColumnCompression(StringInfostr,constColumnCompression*node)
2787+
{
2788+
WRITE_NODE_TYPE("COLUMNCOMPRESSION");
2789+
2790+
WRITE_STRING_FIELD(methodName);
2791+
WRITE_NODE_FIELD(options);
2792+
}
2793+
27842794
staticvoid
27852795
_outTypeName(StringInfostr,constTypeName*node)
27862796
{
@@ -4063,6 +4073,9 @@ outNode(StringInfo str, const void *obj)
40634073
caseT_ColumnDef:
40644074
_outColumnDef(str,obj);
40654075
break;
4076+
caseT_ColumnCompression:
4077+
_outColumnCompression(str,obj);
4078+
break;
40664079
caseT_TypeName:
40674080
_outTypeName(str,obj);
40684081
break;

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp