|
19 | 19 |
|
20 | 20 | #include"postgres.h" |
21 | 21 |
|
| 22 | +#include"access/compression.h" |
22 | 23 | #include"access/htup_details.h" |
23 | 24 | #include"catalog/pg_collation.h" |
24 | 25 | #include"catalog/pg_type.h" |
| 26 | +#include"commands/defrem.h" |
25 | 27 | #include"miscadmin.h" |
26 | 28 | #include"parser/parse_type.h" |
27 | 29 | #include"utils/acl.h" |
@@ -89,6 +91,7 @@ CreateTemplateTupleDesc(int natts, bool hasoid) |
89 | 91 | */ |
90 | 92 | desc->natts=natts; |
91 | 93 | desc->constr=NULL; |
| 94 | +desc->tdcmroutines=NULL; |
92 | 95 | desc->tdtypeid=RECORDOID; |
93 | 96 | desc->tdtypmod=-1; |
94 | 97 | desc->tdhasoid=hasoid; |
@@ -122,6 +125,7 @@ CreateTupleDesc(int natts, bool hasoid, Form_pg_attribute *attrs) |
122 | 125 | desc->attrs=attrs; |
123 | 126 | desc->natts=natts; |
124 | 127 | desc->constr=NULL; |
| 128 | +desc->tdcmroutines=NULL; |
125 | 129 | desc->tdtypeid=RECORDOID; |
126 | 130 | desc->tdtypmod=-1; |
127 | 131 | desc->tdhasoid=hasoid; |
@@ -169,6 +173,7 @@ CreateTupleDescCopyConstr(TupleDesc tupdesc) |
169 | 173 | { |
170 | 174 | TupleDescdesc; |
171 | 175 | TupleConstr*constr=tupdesc->constr; |
| 176 | +CompressionMethodRoutine**cmroutines=tupdesc->tdcmroutines; |
172 | 177 | inti; |
173 | 178 |
|
174 | 179 | desc=CreateTemplateTupleDesc(tupdesc->natts,tupdesc->tdhasoid); |
@@ -213,6 +218,21 @@ CreateTupleDescCopyConstr(TupleDesc tupdesc) |
213 | 218 | desc->constr=cpy; |
214 | 219 | } |
215 | 220 |
|
| 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 | + |
216 | 236 | desc->tdtypeid=tupdesc->tdtypeid; |
217 | 237 | desc->tdtypmod=tupdesc->tdtypmod; |
218 | 238 |
|
@@ -304,6 +324,14 @@ FreeTupleDesc(TupleDesc tupdesc) |
304 | 324 | pfree(tupdesc->constr); |
305 | 325 | } |
306 | 326 |
|
| 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 | + |
307 | 335 | pfree(tupdesc); |
308 | 336 | } |
309 | 337 |
|
@@ -413,6 +441,8 @@ equalTupleDescs(TupleDesc tupdesc1, TupleDesc tupdesc2) |
413 | 441 | return false; |
414 | 442 | if (attr1->attcollation!=attr2->attcollation) |
415 | 443 | return false; |
| 444 | +if (attr1->attcompression!=attr2->attcompression) |
| 445 | +return false; |
416 | 446 | /* attacl, attoptions and attfdwoptions are not even present... */ |
417 | 447 | } |
418 | 448 |
|
@@ -475,6 +505,10 @@ equalTupleDescs(TupleDesc tupdesc1, TupleDesc tupdesc2) |
475 | 505 | } |
476 | 506 | elseif (tupdesc2->constr!=NULL) |
477 | 507 | return false; |
| 508 | + |
| 509 | +if (tupdesc1->tdcmroutines!=tupdesc2->tdcmroutines)/* FIXME compare cmroutines[*] */ |
| 510 | +return false; |
| 511 | + |
478 | 512 | return true; |
479 | 513 | } |
480 | 514 |
|
@@ -555,6 +589,7 @@ TupleDescInitEntry(TupleDesc desc, |
555 | 589 | att->attalign=typeForm->typalign; |
556 | 590 | att->attstorage=typeForm->typstorage; |
557 | 591 | att->attcollation=typeForm->typcollation; |
| 592 | +att->attcompression=InvalidOid; |
558 | 593 |
|
559 | 594 | ReleaseSysCache(tuple); |
560 | 595 | } |
@@ -741,6 +776,22 @@ BuildDescForRelation(List *schema) |
741 | 776 | has_not_null |=entry->is_not_null; |
742 | 777 | desc->attrs[attnum-1]->attislocal=entry->is_local; |
743 | 778 | 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 | +} |
744 | 795 | } |
745 | 796 |
|
746 | 797 | if (has_not_null) |
|