/
githubmirror
/
postgres
Обзор
Документация
Войти
/
githubmirror
/
postgres
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
src/test/regress/expected/tid.out
195 строк
6 KB
Michael Paquier
Tighten tid input parsing with strtoul() to reject empty fields
06 авг 2026, 09:39
06 авг 2026, 09:39
58ff4a0
Код
Авторство
О чём код?
-- basic tests for the TID data type SELECT '(0,0)'::tid as tid00, '(0,1)'::tid as tid01, '(-1,0)'::tid as tidm10, '(4294967295,65535)'::tid as tidmax; tid00 | tid01 | tidm10 | tidmax -------+-------+----------------+-------------------- (0,0) | (0,1) | (4294967295,0) | (4294967295,65535) (1 row) SELECT '(4294967296,1)'::tid; -- error ERROR: invalid input syntax for type tid: "(4294967296,1)" LINE 1: SELECT '(4294967296,1)'::tid; ^ SELECT '(1,65536)'::tid; -- error ERROR: invalid input syntax for type tid: "(1,65536)" LINE 1: SELECT '(1,65536)'::tid; ^ SELECT '(,1)'::tid; -- error ERROR: invalid input syntax for type tid: "(,1)" LINE 1: SELECT '(,1)'::tid; ^ SELECT '(1,)'::tid; -- error ERROR: invalid input syntax for type tid: "(1,)" LINE 1: SELECT '(1,)'::tid; ^ -- Also try it with non-error-throwing API SELECT pg_input_is_valid('(0)', 'tid'); pg_input_is_valid ------------------- f (1 row) SELECT * FROM pg_input_error_info('(0)', 'tid'); message | detail | hint | sql_error_code ------------------------------------------+--------+------+---------------- invalid input syntax for type tid: "(0)" | | | 22P02 (1 row) SELECT pg_input_is_valid('(0,-1)', 'tid'); pg_input_is_valid ------------------- f (1 row) SELECT * FROM pg_input_error_info('(0,-1)', 'tid'); message | detail | hint | sql_error_code ---------------------------------------------+--------+------+---------------- invalid input syntax for type tid: "(0,-1)" | | | 22P02 (1 row) -- tests for tid_block() and tid_offset() SELECT tid_block('(0,0)'::tid), tid_offset('(0,0)'::tid); tid_block | tid_offset -----------+------------ 0 | 0 (1 row) SELECT tid_block('(0,1)'::tid), tid_offset('(0,1)'::tid); tid_block | tid_offset -----------+------------ 0 | 1 (1 row) SELECT tid_block('(42,7)'::tid), tid_offset('(42,7)'::tid); tid_block | tid_offset -----------+------------ 42 | 7 (1 row) -- max values: blockno uint32 max, offset uint16 max SELECT tid_block('(4294967295,65535)'::tid), tid_offset('(4294967295,65535)'::tid); tid_block | tid_offset ------------+------------ 4294967295 | 65535 (1 row) -- (-1,0) wraps to blockno 4294967295 SELECT tid_block('(-1,0)'::tid); tid_block ------------ 4294967295 (1 row) -- NULL handling (strict functions) SELECT tid_block(NULL::tid), tid_offset(NULL::tid); tid_block | tid_offset -----------+------------ | (1 row) -- round-trip: blockno + offset reconstruct the original TID SELECT t, tid_block(t), tid_offset(t), format('(%s,%s)', tid_block(t), tid_offset(t))::tid = t AS roundtrip_ok FROM (VALUES ('(0,0)'::tid), ('(1,42)'::tid), ('(4294967295,65535)'::tid)) AS v(t); t | tid_block | tid_offset | roundtrip_ok --------------------+------------+------------+-------------- (0,0) | 0 | 0 | t (1,42) | 1 | 42 | t (4294967295,65535) | 4294967295 | 65535 | t (3 rows) -- tests for functions related to TID handling CREATE TABLE tid_tab (a int); -- min() and max() for TIDs INSERT INTO tid_tab VALUES (1), (2); SELECT min(ctid) FROM tid_tab; min ------- (0,1) (1 row) SELECT max(ctid) FROM tid_tab; max ------- (0,2) (1 row) -- tid_block() and tid_offset() with real table ctid SELECT ctid, tid_block(ctid), tid_offset(ctid) FROM tid_tab; ctid | tid_block | tid_offset -------+-----------+------------ (0,1) | 0 | 1 (0,2) | 0 | 2 (2 rows) -- use in WHERE clause SELECT ctid FROM tid_tab WHERE tid_block(ctid) = 0 AND tid_offset(ctid) = 1; ctid ------- (0,1) (1 row) TRUNCATE tid_tab; -- Tests for currtid2() with various relation kinds -- Materialized view CREATE MATERIALIZED VIEW tid_matview AS SELECT a FROM tid_tab; SELECT currtid2('tid_matview'::text, '(0,1)'::tid); -- fails ERROR: tid (0, 1) is not valid for relation "tid_matview" INSERT INTO tid_tab VALUES (1); REFRESH MATERIALIZED VIEW tid_matview; SELECT currtid2('tid_matview'::text, '(0,1)'::tid); -- ok currtid2 ---------- (0,1) (1 row) DROP MATERIALIZED VIEW tid_matview; TRUNCATE tid_tab; -- Sequence CREATE SEQUENCE tid_seq; SELECT currtid2('tid_seq'::text, '(0,1)'::tid); -- ok currtid2 ---------- (0,1) (1 row) DROP SEQUENCE tid_seq; -- Index, fails with incorrect relation type CREATE INDEX tid_ind ON tid_tab(a); SELECT currtid2('tid_ind'::text, '(0,1)'::tid); -- fails ERROR: cannot open relation "tid_ind" DETAIL: This operation is not supported for indexes. DROP INDEX tid_ind; -- Partitioned table, no storage CREATE TABLE tid_part (a int) PARTITION BY RANGE (a); SELECT currtid2('tid_part'::text, '(0,1)'::tid); -- fails ERROR: cannot look at latest visible tid for relation "public.tid_part" DROP TABLE tid_part; -- Views -- ctid not defined in the view CREATE VIEW tid_view_no_ctid AS SELECT a FROM tid_tab; SELECT currtid2('tid_view_no_ctid'::text, '(0,1)'::tid); -- fails ERROR: currtid cannot handle views with no CTID DROP VIEW tid_view_no_ctid; -- ctid fetched directly from the source table. CREATE VIEW tid_view_with_ctid AS SELECT ctid, a FROM tid_tab; SELECT currtid2('tid_view_with_ctid'::text, '(0,1)'::tid); -- fails ERROR: tid (0, 1) is not valid for relation "tid_tab" INSERT INTO tid_tab VALUES (1); SELECT currtid2('tid_view_with_ctid'::text, '(0,1)'::tid); -- ok currtid2 ---------- (0,1) (1 row) DROP VIEW tid_view_with_ctid; TRUNCATE tid_tab; -- ctid attribute with incorrect data type CREATE VIEW tid_view_fake_ctid AS SELECT 1 AS ctid, 2 AS a; SELECT currtid2('tid_view_fake_ctid'::text, '(0,1)'::tid); -- fails ERROR: ctid isn't of type TID DROP VIEW tid_view_fake_ctid; DROP TABLE tid_tab CASCADE;