Skip to content

Commit 8e650a2

Browse files
author
Nikita Glukhov
committed
Enable jsonbc compression method for jsonb type
1 parent 8d14756 commit 8e650a2

File tree

6 files changed

+38
-13
lines changed

6 files changed

+38
-13
lines changed

src/backend/access/common/tupdesc.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -785,7 +785,8 @@ TupleDescInitAttrCompression(TupleDesc desc,
785785
: get_base_typnullcm(desc->attrs[attnum - 1]->atttypid);
786786

787787
ac->routineNull = OidIsValid(nullcmoid)
788-
? GetCompressionMethodRoutineByCmId(nullcmoid)
788+
? GetCompressionMethodRoutineByCmId(nullcmoid,
789+
desc->attrs[attnum - 1]->atttypid)
789790
: NULL;
790791
}
791792

src/backend/catalog/heap.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1482,7 +1482,8 @@ DropAttributeCompression(HeapTuple tuple)
14821482
{
14831483
Form_pg_attribute att = (Form_pg_attribute) GETSTRUCT(tuple);
14841484
CompressionMethodRoutine *cmr =
1485-
GetCompressionMethodRoutineByCmId(att->attcompression);
1485+
GetCompressionMethodRoutineByCmId(att->attcompression,
1486+
att->atttypid);
14861487

14871488
if (cmr->dropAttr)
14881489
{

src/backend/commands/compressioncmds.c

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -243,12 +243,16 @@ get_compression_method_name(Oid cmOid)
243243
* which will be palloc'd in the caller's context.
244244
*/
245245
CompressionMethodRoutine *
246-
GetCompressionMethodRoutine(Oid cmhandler)
246+
GetCompressionMethodRoutine(Oid cmhandler, Oid typeid)
247247
{
248-
Datum datum;
249-
CompressionMethodRoutine *routine;
248+
Datum datum;
249+
CompressionMethodRoutine *routine;
250+
CompressionMethodOpArgs opargs;
250251

251-
datum = OidFunctionCall0(cmhandler);
252+
opargs.op = CMOP_GET_ROUTINE;
253+
opargs.args.getRoutine.typeid = typeid;
254+
255+
datum = OidFunctionCall1(cmhandler, PointerGetDatum(&opargs));
252256
routine = (CompressionMethodRoutine *) DatumGetPointer(datum);
253257

254258
if (routine == NULL || !IsA(routine, CompressionMethodRoutine))
@@ -265,7 +269,7 @@ GetCompressionMethodRoutine(Oid cmhandler)
265269
* and get its CompressionMethodRoutine struct.
266270
*/
267271
CompressionMethodRoutine *
268-
GetCompressionMethodRoutineByCmId(Oid cmoid)
272+
GetCompressionMethodRoutineByCmId(Oid cmoid, Oid typeid)
269273
{
270274
HeapTuple tuple;
271275
Form_pg_compression cmform;
@@ -291,5 +295,5 @@ GetCompressionMethodRoutineByCmId(Oid cmoid)
291295
ReleaseSysCache(tuple);
292296

293297
/* And finally, call the handler function to get the API struct. */
294-
return GetCompressionMethodRoutine(cmhandler);
298+
return GetCompressionMethodRoutine(cmhandler, typeid);
295299
}

src/backend/commands/tablecmds.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5239,7 +5239,8 @@ GetAttributeCompression(ColumnCompression *compression,
52395239
*optionsList = NIL;
52405240
}
52415241

5242-
*cmr = OidIsValid(*cmid) ? GetCompressionMethodRoutineByCmId(*cmid) : NULL;
5242+
*cmr = OidIsValid(*cmid) ?
5243+
GetCompressionMethodRoutineByCmId(*cmid, att->atttypid) : NULL;
52435244

52445245
if (*cmr && (*cmr)->options && (*cmr)->options->validate)
52455246
*optionsList = (*cmr)->options->validate(att, *optionsList);
@@ -12554,7 +12555,8 @@ ATExecAlterColumnCompression(AlteredTableInfo *tab, Relation rel,
1255412555
if (OidIsValid(oldCm))
1255512556
{
1255612557
CompressionMethodRoutine *oldCmr =
12557-
GetCompressionMethodRoutineByCmId(oldCm);
12558+
GetCompressionMethodRoutineByCmId(oldCm,
12559+
atttableform->atttypid);
1255812560

1255912561
if (oldCmr->dropAttr)
1256012562
{

src/backend/utils/cache/relcache.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -575,7 +575,8 @@ RelationBuildTupleDesc(Relation relation)
575575
List *optionsList;
576576
CompressionMethodRoutine *cmr;
577577

578-
cmr = GetCompressionMethodRoutineByCmId(attp->attcompression);
578+
cmr = GetCompressionMethodRoutineByCmId(attp->attcompression,
579+
attp->atttypid);
579580
optionsDatum = get_attcmoptions(RelationGetRelid(relation),
580581
attp->attnum);
581582
optionsList = untransformRelOptions(optionsDatum);

src/include/access/compression.h

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,23 @@ typedef struct CompressionMethodRoutine
5050
DecompressionRoutine decompress;
5151
} CompressionMethodRoutine;
5252

53-
extern CompressionMethodRoutine *GetCompressionMethodRoutine(Oid cmhandler);
54-
extern CompressionMethodRoutine *GetCompressionMethodRoutineByCmId(Oid cmoid);
53+
typedef enum { CMOP_GET_ROUTINE } CompressionMethodOp;
54+
55+
typedef struct CompressionMethodOpArgs
56+
{
57+
CompressionMethodOp op;
58+
union
59+
{
60+
struct
61+
{
62+
Oid typeid;
63+
} getRoutine;
64+
} args;
65+
} CompressionMethodOpArgs;
66+
67+
extern CompressionMethodRoutine *GetCompressionMethodRoutine(Oid cmhandler,
68+
Oid typeid);
69+
extern CompressionMethodRoutine *GetCompressionMethodRoutineByCmId(Oid cmoid,
70+
Oid typeid);
5571

5672
#endif /* COMPRESSION_H */

0 commit comments

Comments
 (0)