timescaledb/tsl/test/sql/include/compression_test.sql
Erik Nordström 19239ff8dd Add function to show compression information
Add a function that can be used on a compressed data value to show
some metadata information, such as the compression algorithm used and
the presence of any null values.
2024-08-05 17:34:41 +02:00

72 lines
2.9 KiB
SQL

-- This file and its contents are licensed under the Timescale License.
-- Please see the included NOTICE for copyright information and
-- LICENSE-TIMESCALE for a copy of the license.
\set ECHO errors
DROP TABLE IF EXISTS compressed;
CREATE TABLE compressed AS SELECT :COMPRESSION_CMD AS c FROM (:QUERY) AS sub;
SELECT (_timescaledb_functions.compressed_data_info(c)).*,
pg_column_size(c) as "compressed size"
FROM compressed;
--rewrite table (needed to make sure the compressed data does not reference toast table of original)
CREATE TABLE temp AS SELECT * FROM :TABLE_NAME;
DROP TABLE :TABLE_NAME;
ALTER TABLE temp RENAME TO :TABLE_NAME;
--test that decompression gives same result in forward direction
with original AS (
SELECT row_number() OVER() row_number, * FROM (:QUERY) as q
),
decompressed AS (
SELECT row_number() OVER () row_number, * FROM (SELECT :DECOMPRESS_FORWARD_CMD FROM compressed) as q
)
SELECT 'Number of rows different between original and decompressed forward (expect 0)', count(*)
FROM original
FULL OUTER JOIN decompressed ON (original.row_number = decompressed.row_number)
WHERE (original.*) IS DISTINCT FROM (decompressed.*);
--test the decompress reverse direction too
with count_orig AS (
SELECT count(*) as cnt FROM (:QUERY) as q
),
original AS (
SELECT count_orig.cnt + 1 - row_number() OVER() row_number, q.* FROM (:QUERY) as q, count_orig
),
decompressed AS (
SELECT row_number() OVER () row_number, * FROM (SELECT :DECOMPRESS_REVERSE_CMD FROM compressed) as q
)
SELECT 'Number of rows different between original and decompressed reversed (expect 0)', count(*)
FROM original
FULL OUTER JOIN decompressed ON (original.row_number = decompressed.row_number)
WHERE (original.*) IS DISTINCT FROM (decompressed.*);
--Test IO
SELECT c "COMPRESSED_AS_TEXT" FROM compressed \gset
WITH original AS
(
SELECT row_number() OVER() row_number, * FROM (:QUERY) as q
),
decompressed AS
(
SELECT row_number() OVER () row_number, * FROM (SELECT :DECOMPRESS_FORWARD_CMD FROM compressed) as q
),
decompressed_from_text AS (
SELECT row_number() OVER () row_number, * FROM (SELECT :DECOMPRESS_FORWARD_CMD FROM (SELECT :'COMPRESSED_AS_TEXT'::text as c) as txt) as q
)
SELECT 'Number of rows different between original, decompressed, and decompressed deserializeed (expect 0)', count(*)
FROM original
FULL OUTER JOIN decompressed ON (original.row_number = decompressed.row_number)
FULL OUTER JOIN decompressed_from_text ON (original.row_number = decompressed_from_text.row_number)
WHERE (original.*) IS DISTINCT FROM (decompressed_from_text.*) OR (decompressed.*) IS DISTINCT FROM (decompressed_from_text.*) ;
SELECT
'Test that deserialization, decompression, recompression, and serialization results in the same text',
:COMPRESSION_CMD::text IS NOT DISTINCT FROM :'COMPRESSED_AS_TEXT'
FROM
(SELECT :DECOMPRESS_FORWARD_CMD as item FROM (SELECT :'COMPRESSED_AS_TEXT'::text as c) as txt) as decompressed_serialized;
\set ECHO all