diff --git a/src/backend/access/common/toast_dictionary.c b/src/backend/access/common/toast_dictionary.c index 48e9142253..c4364a7fee 100644 --- a/src/backend/access/common/toast_dictionary.c +++ b/src/backend/access/common/toast_dictionary.c @@ -310,20 +310,29 @@ dict_cache_invalidate(Datum arg, SysCacheIdentifier cacheid, uint32 hashvalue) ddict = NULL; cdict_id = ddict_id = InvalidOid; } +#endif /* USE_ZSTD */ +#if defined(USE_ZSTD) || defined(USE_LZ4) +/* + * Fetch a dictionary's bytes from the catalog. Used by both the zstd and + * the lz4 codecs, so it must not depend on USE_ZSTD alone. + */ static bytea * dict_fetch(Oid dictid) { - static bool registered = false; HeapTuple tup; bytea *result; +#ifdef USE_ZSTD + static bool registered = false; + if (!registered) { CacheRegisterSyscacheCallback(TOASTDICTOID, dict_cache_invalidate, (Datum) 0); registered = true; } +#endif tup = SearchSysCache1(TOASTDICTOID, ObjectIdGetDatum(dictid)); if (!HeapTupleIsValid(tup)) @@ -335,7 +344,9 @@ dict_fetch(Oid dictid) ReleaseSysCache(tup); return result; } +#endif +#ifdef USE_ZSTD static ZSTD_CDict * dict_get_cdict(Oid dictid) { diff --git a/src/test/regress/expected/compression_zstd_dict.out b/src/test/regress/expected/compression_zstd_dict.out index f645687b32..9591e59106 100644 --- a/src/test/regress/expected/compression_zstd_dict.out +++ b/src/test/regress/expected/compression_zstd_dict.out @@ -276,7 +276,7 @@ SELECT bool_and(f1 = doc(id::int)) AS all_equal FROM cmdict WHERE id <= 400; -- switching the column away from zstd_dict: existing values stay readable -- until the next rewrite, which recompresses them and drops the dictionary -ALTER TABLE cmdict ALTER COLUMN f1 SET COMPRESSION lz4; +ALTER TABLE cmdict ALTER COLUMN f1 SET COMPRESSION pglz; SELECT bool_and(f1 = doc(id::int)) AS all_equal FROM cmdict WHERE id <= 400; all_equal ----------- @@ -299,7 +299,7 @@ SELECT count(*) AS ndicts FROM pg_toast_dictionary WHERE tdrelid = 'cmdict'::reg SELECT pg_column_compression(f1), count(*) FROM cmdict WHERE id <= 400 GROUP BY 1 ORDER BY 1; pg_column_compression | count -----------------------+------- - lz4 | 200 + pglz | 200 zstd | 200 (2 rows) diff --git a/src/test/regress/sql/compression_zstd_dict.sql b/src/test/regress/sql/compression_zstd_dict.sql index dc8a5cf979..3cbe75b8e0 100644 --- a/src/test/regress/sql/compression_zstd_dict.sql +++ b/src/test/regress/sql/compression_zstd_dict.sql @@ -155,7 +155,7 @@ SELECT bool_and(f1 = doc(id::int)) AS all_equal FROM cmdict WHERE id <= 400; -- switching the column away from zstd_dict: existing values stay readable -- until the next rewrite, which recompresses them and drops the dictionary -ALTER TABLE cmdict ALTER COLUMN f1 SET COMPRESSION lz4; +ALTER TABLE cmdict ALTER COLUMN f1 SET COMPRESSION pglz; SELECT bool_and(f1 = doc(id::int)) AS all_equal FROM cmdict WHERE id <= 400; SELECT count(*) AS ndicts FROM pg_toast_dictionary WHERE tdrelid = 'cmdict'::regclass; VACUUM FULL cmdict;