mirror of
https://git.postgresql.org/git/postgresql.git
synced 2026-02-24 23:37:03 +08:00
When run on a server using default_toast_compression set to LZ4, this test would fail because of a consistency issue with the order of the tuples treated. LZ4 causes one tuple to be stored inline instead of getting externalized. As the goal of this test is to check after data stored externally, stick to pglz as the compression algorithm used, so as all data of this test is stored the way it should. Analyzed-by: Dilip Kumar Discussion: https://postgr.es/m/YLrDWxJgM8WWMoCg@paquier.xyz
72 lines
3.0 KiB
PL/PgSQL
72 lines
3.0 KiB
PL/PgSQL
--
|
|
-- Tests for external toast datums
|
|
--
|
|
|
|
-- Other compression algorithms may cause the compressed data to be stored
|
|
-- inline. pglz guarantees that the data is externalized, so stick to it.
|
|
SET default_toast_compression = 'pglz';
|
|
|
|
CREATE TABLE indtoasttest(descr text, cnt int DEFAULT 0, f1 text, f2 text);
|
|
|
|
INSERT INTO indtoasttest(descr, f1, f2) VALUES('two-compressed', repeat('1234567890',1000), repeat('1234567890',1000));
|
|
INSERT INTO indtoasttest(descr, f1, f2) VALUES('two-toasted', repeat('1234567890',30000), repeat('1234567890',50000));
|
|
INSERT INTO indtoasttest(descr, f1, f2) VALUES('one-compressed,one-null', NULL, repeat('1234567890',1000));
|
|
INSERT INTO indtoasttest(descr, f1, f2) VALUES('one-toasted,one-null', NULL, repeat('1234567890',50000));
|
|
|
|
-- check whether indirect tuples works on the most basic level
|
|
SELECT descr, substring(make_tuple_indirect(indtoasttest)::text, 1, 200) FROM indtoasttest;
|
|
|
|
-- modification without changing varlenas
|
|
UPDATE indtoasttest SET cnt = cnt +1 RETURNING substring(indtoasttest::text, 1, 200);
|
|
|
|
-- modification without modifying assigned value
|
|
UPDATE indtoasttest SET cnt = cnt +1, f1 = f1 RETURNING substring(indtoasttest::text, 1, 200);
|
|
|
|
-- modification modifying, but effectively not changing
|
|
UPDATE indtoasttest SET cnt = cnt +1, f1 = f1||'' RETURNING substring(indtoasttest::text, 1, 200);
|
|
|
|
UPDATE indtoasttest SET cnt = cnt +1, f1 = '-'||f1||'-' RETURNING substring(indtoasttest::text, 1, 200);
|
|
|
|
SELECT substring(indtoasttest::text, 1, 200) FROM indtoasttest;
|
|
-- check we didn't screw with main/toast tuple visibility
|
|
VACUUM FREEZE indtoasttest;
|
|
SELECT substring(indtoasttest::text, 1, 200) FROM indtoasttest;
|
|
|
|
-- now create a trigger that forces all Datums to be indirect ones
|
|
CREATE FUNCTION update_using_indirect()
|
|
RETURNS trigger
|
|
LANGUAGE plpgsql AS $$
|
|
BEGIN
|
|
NEW := make_tuple_indirect(NEW);
|
|
RETURN NEW;
|
|
END$$;
|
|
|
|
CREATE TRIGGER indtoasttest_update_indirect
|
|
BEFORE INSERT OR UPDATE
|
|
ON indtoasttest
|
|
FOR EACH ROW
|
|
EXECUTE PROCEDURE update_using_indirect();
|
|
|
|
-- modification without changing varlenas
|
|
UPDATE indtoasttest SET cnt = cnt +1 RETURNING substring(indtoasttest::text, 1, 200);
|
|
|
|
-- modification without modifying assigned value
|
|
UPDATE indtoasttest SET cnt = cnt +1, f1 = f1 RETURNING substring(indtoasttest::text, 1, 200);
|
|
|
|
-- modification modifying, but effectively not changing
|
|
UPDATE indtoasttest SET cnt = cnt +1, f1 = f1||'' RETURNING substring(indtoasttest::text, 1, 200);
|
|
|
|
UPDATE indtoasttest SET cnt = cnt +1, f1 = '-'||f1||'-' RETURNING substring(indtoasttest::text, 1, 200);
|
|
|
|
INSERT INTO indtoasttest(descr, f1, f2) VALUES('one-toasted,one-null, via indirect', repeat('1234567890',30000), NULL);
|
|
|
|
SELECT substring(indtoasttest::text, 1, 200) FROM indtoasttest;
|
|
-- check we didn't screw with main/toast tuple visibility
|
|
VACUUM FREEZE indtoasttest;
|
|
SELECT substring(indtoasttest::text, 1, 200) FROM indtoasttest;
|
|
|
|
DROP TABLE indtoasttest;
|
|
DROP FUNCTION update_using_indirect();
|
|
|
|
RESET default_toast_compression;
|