2022-03-04 02:03:47 +01:00
|
|
|
-- 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;
|
|
|
|
^
|
Convert a few more datatype input functions to report errors softly.
Convert assorted internal-ish datatypes, namely aclitemin,
int2vectorin, oidin, oidvectorin, pg_lsn_in, pg_snapshot_in,
and tidin to the new style.
(Some others you might expect to find in this group, such as
cidin and xidin, need no changes because they never throw
errors at all. That seems a little cheesy ... but it is not in
the charter of this patch series to add new error conditions.)
Amul Sul, minor mods by me
Discussion: https://postgr.es/m/CAAJ_b97KeDWUdpTKGOaFYPv0OicjOu6EW+QYWj-Ywrgj_aEy1g@mail.gmail.com
2022-12-14 23:50:24 +01:00
|
|
|
-- Also try it with non-error-throwing API
|
|
|
|
SELECT pg_input_is_valid('(0)', 'tid');
|
|
|
|
pg_input_is_valid
|
|
|
|
-------------------
|
|
|
|
f
|
|
|
|
(1 row)
|
|
|
|
|
|
|
|
SELECT pg_input_error_message('(0)', 'tid');
|
|
|
|
pg_input_error_message
|
|
|
|
------------------------------------------
|
|
|
|
invalid input syntax for type tid: "(0)"
|
|
|
|
(1 row)
|
|
|
|
|
|
|
|
SELECT pg_input_is_valid('(0,-1)', 'tid');
|
|
|
|
pg_input_is_valid
|
|
|
|
-------------------
|
|
|
|
f
|
|
|
|
(1 row)
|
|
|
|
|
|
|
|
SELECT pg_input_error_message('(0,-1)', 'tid');
|
|
|
|
pg_input_error_message
|
|
|
|
---------------------------------------------
|
|
|
|
invalid input syntax for type tid: "(0,-1)"
|
|
|
|
(1 row)
|
|
|
|
|
2020-06-01 03:32:06 +02:00
|
|
|
-- 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)
|
|
|
|
|
|
|
|
TRUNCATE tid_tab;
|
Remove catalog function currtid()
currtid() and currtid2() are an undocumented set of functions whose sole
known user is the Postgres ODBC driver, able to retrieve the latest TID
version for a tuple given by the caller of those functions.
As used by Postgres ODBC, currtid() is a shortcut able to retrieve the
last TID loaded into a backend by passing an OID of 0 (magic value)
after a tuple insertion. This is removed in this commit, as it became
obsolete after the driver began using "RETURNING ctid" with inserts, a
clause supported since Postgres 8.2 (using RETURNING is better for
performance anyway as it reduces the number of round-trips to the
backend).
currtid2() is still used by the driver, so this remains around for now.
Note that this function is kept in its original shape for backward
compatibility reasons.
Per discussion with many people, including Andres Freund, Peter
Eisentraut, Álvaro Herrera, Hiroshi Inoue, Tom Lane and myself.
Bump catalog version.
Discussion: https://postgr.es/m/20200603021448.GB89559@paquier.xyz
2020-11-25 04:18:26 +01:00
|
|
|
-- Tests for currtid2() with various relation kinds
|
2020-06-01 03:32:06 +02:00
|
|
|
-- 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
|
2022-07-26 04:52:53 +02:00
|
|
|
ERROR: cannot open relation "tid_ind"
|
|
|
|
DETAIL: This operation is not supported for indexes.
|
2020-06-01 03:32:06 +02:00
|
|
|
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;
|