mirror of https://github.com/postgres/postgres
While there are many tests related to relation rewrites, nothing existed to check how the cumulative statistics behave in such cases for relations. A different patch is under discussion to move the relation statistics to be tracked on a per-relfilenode basis, so as these could be rebuilt during crash recovery. This commit gives us a way to check (and perhaps change) the existing behaviors for several rewrite scenarios, mixing transactions, sub-transactions, two-phase commit and VACUUM. Author: Bertrand Drouvot <bertranddrouvot.pg@gmail.com> Reviewed-by: Michael Paquier <michael@paquier.xyz> Discussion: https://postgr.es/m/aQ3X20hbqoThQXgp@ip-10-97-1-34.eu-west-3.compute.internalpull/248/head
parent
812367f3d4
commit
b23fe993e1
@ -0,0 +1,355 @@ |
|||||||
|
-- |
||||||
|
-- Test cumulative statistics with relation rewrites |
||||||
|
-- |
||||||
|
-- Two-phase commit. |
||||||
|
-- Table-level stats with VACUUM and rewrite after 2PC commit. |
||||||
|
CREATE TABLE test_2pc_timestamp (a int) WITH (autovacuum_enabled = false); |
||||||
|
VACUUM ANALYZE test_2pc_timestamp; |
||||||
|
SELECT last_analyze AS last_vacuum_analyze |
||||||
|
FROM pg_stat_all_tables WHERE relname = 'test_2pc_timestamp' \gset |
||||||
|
BEGIN; |
||||||
|
ALTER TABLE test_2pc_timestamp ALTER COLUMN a TYPE int; |
||||||
|
PREPARE TRANSACTION 'test'; |
||||||
|
COMMIT PREPARED 'test'; |
||||||
|
SELECT pg_stat_force_next_flush(); |
||||||
|
pg_stat_force_next_flush |
||||||
|
-------------------------- |
||||||
|
|
||||||
|
(1 row) |
||||||
|
|
||||||
|
SELECT last_analyze = :'last_vacuum_analyze'::timestamptz AS same_vacuum_ts |
||||||
|
FROM pg_stat_all_tables WHERE relname = 'test_2pc_timestamp'; |
||||||
|
same_vacuum_ts |
||||||
|
---------------- |
||||||
|
t |
||||||
|
(1 row) |
||||||
|
|
||||||
|
DROP TABLE test_2pc_timestamp; |
||||||
|
-- Table-level stats with single rewrite after 2PC commit. |
||||||
|
CREATE TABLE test_2pc_rewrite_alone (a int) WITH (autovacuum_enabled = false); |
||||||
|
INSERT INTO test_2pc_rewrite_alone VALUES (1); |
||||||
|
BEGIN; |
||||||
|
ALTER TABLE test_2pc_rewrite_alone ALTER COLUMN a TYPE bigint; |
||||||
|
PREPARE TRANSACTION 'test'; |
||||||
|
COMMIT PREPARED 'test'; |
||||||
|
SELECT pg_stat_force_next_flush(); |
||||||
|
pg_stat_force_next_flush |
||||||
|
-------------------------- |
||||||
|
|
||||||
|
(1 row) |
||||||
|
|
||||||
|
SELECT n_tup_ins, n_live_tup, n_dead_tup |
||||||
|
FROM pg_stat_all_tables WHERE relname = 'test_2pc_rewrite_alone'; |
||||||
|
n_tup_ins | n_live_tup | n_dead_tup |
||||||
|
-----------+------------+------------ |
||||||
|
1 | 1 | 0 |
||||||
|
(1 row) |
||||||
|
|
||||||
|
DROP TABLE test_2pc_rewrite_alone; |
||||||
|
-- Table-level stats with rewrite and DMLs after 2PC commit. |
||||||
|
CREATE TABLE test_2pc (a int) WITH (autovacuum_enabled = false); |
||||||
|
INSERT INTO test_2pc VALUES (1); |
||||||
|
BEGIN; |
||||||
|
INSERT INTO test_2pc VALUES (1); |
||||||
|
INSERT INTO test_2pc VALUES (2); |
||||||
|
INSERT INTO test_2pc VALUES (3); |
||||||
|
ALTER TABLE test_2pc ALTER COLUMN a TYPE bigint; |
||||||
|
PREPARE TRANSACTION 'test'; |
||||||
|
COMMIT PREPARED 'test'; |
||||||
|
SELECT pg_stat_force_next_flush(); |
||||||
|
pg_stat_force_next_flush |
||||||
|
-------------------------- |
||||||
|
|
||||||
|
(1 row) |
||||||
|
|
||||||
|
SELECT n_tup_ins, n_live_tup, n_dead_tup |
||||||
|
FROM pg_stat_all_tables WHERE relname = 'test_2pc'; |
||||||
|
n_tup_ins | n_live_tup | n_dead_tup |
||||||
|
-----------+------------+------------ |
||||||
|
4 | 4 | 0 |
||||||
|
(1 row) |
||||||
|
|
||||||
|
DROP TABLE test_2pc; |
||||||
|
-- Table-level stats with multiple rewrites after 2PC commit. |
||||||
|
CREATE TABLE test_2pc_multi (a int) WITH (autovacuum_enabled = false); |
||||||
|
INSERT INTO test_2pc_multi VALUES (1); |
||||||
|
BEGIN; |
||||||
|
INSERT INTO test_2pc_multi VALUES (1); |
||||||
|
INSERT INTO test_2pc_multi VALUES (2); |
||||||
|
ALTER TABLE test_2pc_multi ALTER COLUMN a TYPE bigint; |
||||||
|
INSERT INTO test_2pc_multi VALUES (3); |
||||||
|
INSERT INTO test_2pc_multi VALUES (4); |
||||||
|
ALTER TABLE test_2pc_multi ALTER COLUMN a TYPE int; |
||||||
|
INSERT INTO test_2pc_multi VALUES (5); |
||||||
|
PREPARE TRANSACTION 'test'; |
||||||
|
COMMIT PREPARED 'test'; |
||||||
|
SELECT pg_stat_force_next_flush(); |
||||||
|
pg_stat_force_next_flush |
||||||
|
-------------------------- |
||||||
|
|
||||||
|
(1 row) |
||||||
|
|
||||||
|
SELECT n_tup_ins, n_live_tup, n_dead_tup |
||||||
|
FROM pg_stat_all_tables WHERE relname = 'test_2pc_multi'; |
||||||
|
n_tup_ins | n_live_tup | n_dead_tup |
||||||
|
-----------+------------+------------ |
||||||
|
6 | 6 | 0 |
||||||
|
(1 row) |
||||||
|
|
||||||
|
DROP TABLE test_2pc_multi; |
||||||
|
-- Table-level stats with single rewrite after 2PC abort. |
||||||
|
CREATE TABLE test_2pc_rewrite_alone_abort (a int) WITH (autovacuum_enabled = false); |
||||||
|
INSERT INTO test_2pc_rewrite_alone_abort VALUES (1); |
||||||
|
BEGIN; |
||||||
|
ALTER TABLE test_2pc_rewrite_alone_abort ALTER COLUMN a TYPE bigint; |
||||||
|
PREPARE TRANSACTION 'test'; |
||||||
|
ROLLBACK PREPARED 'test'; |
||||||
|
SELECT pg_stat_force_next_flush(); |
||||||
|
pg_stat_force_next_flush |
||||||
|
-------------------------- |
||||||
|
|
||||||
|
(1 row) |
||||||
|
|
||||||
|
SELECT n_tup_ins, n_live_tup, n_dead_tup |
||||||
|
FROM pg_stat_all_tables WHERE relname = 'test_2pc_rewrite_alone_abort'; |
||||||
|
n_tup_ins | n_live_tup | n_dead_tup |
||||||
|
-----------+------------+------------ |
||||||
|
1 | 1 | 0 |
||||||
|
(1 row) |
||||||
|
|
||||||
|
DROP TABLE test_2pc_rewrite_alone_abort; |
||||||
|
-- Table-level stats with rewrite and DMLs after 2PC abort. |
||||||
|
CREATE TABLE test_2pc_abort (a int) WITH (autovacuum_enabled = false); |
||||||
|
INSERT INTO test_2pc_abort VALUES (1); |
||||||
|
BEGIN; |
||||||
|
INSERT INTO test_2pc_abort VALUES (1); |
||||||
|
INSERT INTO test_2pc_abort VALUES (2); |
||||||
|
ALTER TABLE test_2pc_abort ALTER COLUMN a TYPE bigint; |
||||||
|
INSERT INTO test_2pc_abort VALUES (3); |
||||||
|
PREPARE TRANSACTION 'test'; |
||||||
|
ROLLBACK PREPARED 'test'; |
||||||
|
SELECT pg_stat_force_next_flush(); |
||||||
|
pg_stat_force_next_flush |
||||||
|
-------------------------- |
||||||
|
|
||||||
|
(1 row) |
||||||
|
|
||||||
|
SELECT n_tup_ins, n_live_tup, n_dead_tup |
||||||
|
FROM pg_stat_all_tables WHERE relname = 'test_2pc_abort'; |
||||||
|
n_tup_ins | n_live_tup | n_dead_tup |
||||||
|
-----------+------------+------------ |
||||||
|
4 | 1 | 3 |
||||||
|
(1 row) |
||||||
|
|
||||||
|
DROP TABLE test_2pc_abort; |
||||||
|
-- Table-level stats with rewrites and subtransactions after 2PC commit. |
||||||
|
CREATE TABLE test_2pc_savepoint (a int) WITH (autovacuum_enabled = false); |
||||||
|
INSERT INTO test_2pc_savepoint VALUES (1); |
||||||
|
BEGIN; |
||||||
|
SAVEPOINT a; |
||||||
|
INSERT INTO test_2pc_savepoint VALUES (1); |
||||||
|
INSERT INTO test_2pc_savepoint VALUES (2); |
||||||
|
ALTER TABLE test_2pc_savepoint ALTER COLUMN a TYPE bigint; |
||||||
|
SAVEPOINT b; |
||||||
|
INSERT INTO test_2pc_savepoint VALUES (3); |
||||||
|
ALTER TABLE test_2pc_savepoint ALTER COLUMN a TYPE int; |
||||||
|
SAVEPOINT c; |
||||||
|
INSERT INTO test_2pc_savepoint VALUES (4); |
||||||
|
INSERT INTO test_2pc_savepoint VALUES (5); |
||||||
|
ROLLBACK TO SAVEPOINT b; |
||||||
|
PREPARE TRANSACTION 'test'; |
||||||
|
COMMIT PREPARED 'test'; |
||||||
|
SELECT pg_stat_force_next_flush(); |
||||||
|
pg_stat_force_next_flush |
||||||
|
-------------------------- |
||||||
|
|
||||||
|
(1 row) |
||||||
|
|
||||||
|
SELECT n_tup_ins, n_live_tup, n_dead_tup |
||||||
|
FROM pg_stat_all_tables WHERE relname = 'test_2pc_savepoint'; |
||||||
|
n_tup_ins | n_live_tup | n_dead_tup |
||||||
|
-----------+------------+------------ |
||||||
|
6 | 3 | 3 |
||||||
|
(1 row) |
||||||
|
|
||||||
|
DROP TABLE test_2pc_savepoint; |
||||||
|
-- Table-level stats with single rewrite and VACUUM |
||||||
|
CREATE TABLE test_timestamp (a int) WITH (autovacuum_enabled = false); |
||||||
|
VACUUM ANALYZE test_timestamp; |
||||||
|
SELECT last_analyze AS last_vacuum_analyze |
||||||
|
FROM pg_stat_all_tables WHERE relname = 'test_timestamp' \gset |
||||||
|
ALTER TABLE test_timestamp ALTER COLUMN a TYPE bigint; |
||||||
|
SELECT pg_stat_force_next_flush(); |
||||||
|
pg_stat_force_next_flush |
||||||
|
-------------------------- |
||||||
|
|
||||||
|
(1 row) |
||||||
|
|
||||||
|
SELECT last_analyze = :'last_vacuum_analyze'::timestamptz AS same_vacuum_ts |
||||||
|
FROM pg_stat_all_tables WHERE relname = 'test_timestamp'; |
||||||
|
same_vacuum_ts |
||||||
|
---------------- |
||||||
|
t |
||||||
|
(1 row) |
||||||
|
|
||||||
|
DROP TABLE test_timestamp; |
||||||
|
-- Table-level stats with single rewrite. |
||||||
|
CREATE TABLE test_alone (a int) WITH (autovacuum_enabled = false); |
||||||
|
INSERT INTO test_alone VALUES (1); |
||||||
|
BEGIN; |
||||||
|
ALTER TABLE test_alone ALTER COLUMN a TYPE bigint; |
||||||
|
COMMIT; |
||||||
|
SELECT pg_stat_force_next_flush(); |
||||||
|
pg_stat_force_next_flush |
||||||
|
-------------------------- |
||||||
|
|
||||||
|
(1 row) |
||||||
|
|
||||||
|
SELECT n_tup_ins, n_live_tup, n_dead_tup |
||||||
|
FROM pg_stat_all_tables WHERE relname = 'test_alone'; |
||||||
|
n_tup_ins | n_live_tup | n_dead_tup |
||||||
|
-----------+------------+------------ |
||||||
|
1 | 1 | 0 |
||||||
|
(1 row) |
||||||
|
|
||||||
|
DROP TABLE test_alone; |
||||||
|
-- Table-level stats with rewrite and DMLs. |
||||||
|
CREATE TABLE test (a int) WITH (autovacuum_enabled = false); |
||||||
|
INSERT INTO test VALUES (1); |
||||||
|
BEGIN; |
||||||
|
INSERT INTO test VALUES (1); |
||||||
|
INSERT INTO test VALUES (2); |
||||||
|
INSERT INTO test VALUES (3); |
||||||
|
ALTER TABLE test ALTER COLUMN a TYPE bigint; |
||||||
|
COMMIT; |
||||||
|
SELECT pg_stat_force_next_flush(); |
||||||
|
pg_stat_force_next_flush |
||||||
|
-------------------------- |
||||||
|
|
||||||
|
(1 row) |
||||||
|
|
||||||
|
SELECT n_tup_ins, n_live_tup, n_dead_tup |
||||||
|
FROM pg_stat_all_tables WHERE relname = 'test'; |
||||||
|
n_tup_ins | n_live_tup | n_dead_tup |
||||||
|
-----------+------------+------------ |
||||||
|
4 | 4 | 0 |
||||||
|
(1 row) |
||||||
|
|
||||||
|
DROP TABLE test; |
||||||
|
-- Table-level stats with multiple rewrites and DMLs. |
||||||
|
CREATE TABLE test_multi (a int) WITH (autovacuum_enabled = false); |
||||||
|
INSERT INTO test_multi VALUES (1); |
||||||
|
BEGIN; |
||||||
|
INSERT INTO test_multi VALUES (1); |
||||||
|
INSERT INTO test_multi VALUES (2); |
||||||
|
ALTER TABLE test_multi ALTER COLUMN a TYPE bigint; |
||||||
|
INSERT INTO test_multi VALUES (3); |
||||||
|
INSERT INTO test_multi VALUES (4); |
||||||
|
ALTER TABLE test_multi ALTER COLUMN a TYPE int; |
||||||
|
INSERT INTO test_multi VALUES (5); |
||||||
|
COMMIT; |
||||||
|
SELECT pg_stat_force_next_flush(); |
||||||
|
pg_stat_force_next_flush |
||||||
|
-------------------------- |
||||||
|
|
||||||
|
(1 row) |
||||||
|
|
||||||
|
SELECT n_tup_ins, n_live_tup, n_dead_tup |
||||||
|
FROM pg_stat_all_tables WHERE relname = 'test_multi'; |
||||||
|
n_tup_ins | n_live_tup | n_dead_tup |
||||||
|
-----------+------------+------------ |
||||||
|
6 | 6 | 0 |
||||||
|
(1 row) |
||||||
|
|
||||||
|
DROP TABLE test_multi; |
||||||
|
-- Table-level stats with rewrite and rollback. |
||||||
|
CREATE TABLE test_rewrite_alone_abort (a int) WITH (autovacuum_enabled = false); |
||||||
|
INSERT INTO test_rewrite_alone_abort VALUES (1); |
||||||
|
BEGIN; |
||||||
|
ALTER TABLE test_rewrite_alone_abort ALTER COLUMN a TYPE bigint; |
||||||
|
ROLLBACK; |
||||||
|
SELECT pg_stat_force_next_flush(); |
||||||
|
pg_stat_force_next_flush |
||||||
|
-------------------------- |
||||||
|
|
||||||
|
(1 row) |
||||||
|
|
||||||
|
SELECT n_tup_ins, n_live_tup, n_dead_tup |
||||||
|
FROM pg_stat_all_tables WHERE relname = 'test_rewrite_alone_abort'; |
||||||
|
n_tup_ins | n_live_tup | n_dead_tup |
||||||
|
-----------+------------+------------ |
||||||
|
1 | 1 | 0 |
||||||
|
(1 row) |
||||||
|
|
||||||
|
DROP TABLE test_rewrite_alone_abort; |
||||||
|
-- Table-level stats with rewrite, DMLs and rollback. |
||||||
|
CREATE TABLE test_abort (a int) WITH (autovacuum_enabled = false); |
||||||
|
INSERT INTO test_abort VALUES (1); |
||||||
|
BEGIN; |
||||||
|
INSERT INTO test_abort VALUES (1); |
||||||
|
INSERT INTO test_abort VALUES (2); |
||||||
|
ALTER TABLE test_abort ALTER COLUMN a TYPE bigint; |
||||||
|
INSERT INTO test_abort VALUES (3); |
||||||
|
ROLLBACK; |
||||||
|
SELECT pg_stat_force_next_flush(); |
||||||
|
pg_stat_force_next_flush |
||||||
|
-------------------------- |
||||||
|
|
||||||
|
(1 row) |
||||||
|
|
||||||
|
SELECT n_tup_ins, n_live_tup, n_dead_tup |
||||||
|
FROM pg_stat_all_tables WHERE relname = 'test_abort'; |
||||||
|
n_tup_ins | n_live_tup | n_dead_tup |
||||||
|
-----------+------------+------------ |
||||||
|
4 | 1 | 3 |
||||||
|
(1 row) |
||||||
|
|
||||||
|
DROP TABLE test_abort; |
||||||
|
-- Table-level stats with rewrites and subtransactions. |
||||||
|
CREATE TABLE test_savepoint (a int) WITH (autovacuum_enabled = false); |
||||||
|
INSERT INTO test_savepoint VALUES (1); |
||||||
|
BEGIN; |
||||||
|
SAVEPOINT a; |
||||||
|
INSERT INTO test_savepoint VALUES (1); |
||||||
|
INSERT INTO test_savepoint VALUES (2); |
||||||
|
ALTER TABLE test_savepoint ALTER COLUMN a TYPE bigint; |
||||||
|
SAVEPOINT b; |
||||||
|
INSERT INTO test_savepoint VALUES (3); |
||||||
|
ALTER TABLE test_savepoint ALTER COLUMN a TYPE int; |
||||||
|
SAVEPOINT c; |
||||||
|
INSERT INTO test_savepoint VALUES (4); |
||||||
|
INSERT INTO test_savepoint VALUES (5); |
||||||
|
ROLLBACK TO SAVEPOINT b; |
||||||
|
COMMIT; |
||||||
|
SELECT pg_stat_force_next_flush(); |
||||||
|
pg_stat_force_next_flush |
||||||
|
-------------------------- |
||||||
|
|
||||||
|
(1 row) |
||||||
|
|
||||||
|
SELECT n_tup_ins, n_live_tup, n_dead_tup |
||||||
|
FROM pg_stat_all_tables WHERE relname = 'test_savepoint'; |
||||||
|
n_tup_ins | n_live_tup | n_dead_tup |
||||||
|
-----------+------------+------------ |
||||||
|
6 | 3 | 3 |
||||||
|
(1 row) |
||||||
|
|
||||||
|
DROP TABLE test_savepoint; |
||||||
|
-- Table-level stats with tablespace rewrite. |
||||||
|
CREATE TABLE test_tbs (a int) WITH (autovacuum_enabled = false); |
||||||
|
INSERT INTO test_tbs VALUES (1); |
||||||
|
ALTER TABLE test_tbs SET TABLESPACE pg_default; |
||||||
|
SELECT pg_stat_force_next_flush(); |
||||||
|
pg_stat_force_next_flush |
||||||
|
-------------------------- |
||||||
|
|
||||||
|
(1 row) |
||||||
|
|
||||||
|
SELECT n_tup_ins, n_live_tup, n_dead_tup |
||||||
|
FROM pg_stat_all_tables WHERE relname = 'test_tbs'; |
||||||
|
n_tup_ins | n_live_tup | n_dead_tup |
||||||
|
-----------+------------+------------ |
||||||
|
1 | 1 | 0 |
||||||
|
(1 row) |
||||||
|
|
||||||
|
DROP TABLE test_tbs; |
||||||
@ -0,0 +1,376 @@ |
|||||||
|
-- |
||||||
|
-- Test cumulative statistics with relation rewrites |
||||||
|
-- |
||||||
|
-- Two-phase commit. |
||||||
|
-- Table-level stats with VACUUM and rewrite after 2PC commit. |
||||||
|
CREATE TABLE test_2pc_timestamp (a int) WITH (autovacuum_enabled = false); |
||||||
|
VACUUM ANALYZE test_2pc_timestamp; |
||||||
|
SELECT last_analyze AS last_vacuum_analyze |
||||||
|
FROM pg_stat_all_tables WHERE relname = 'test_2pc_timestamp' \gset |
||||||
|
BEGIN; |
||||||
|
ALTER TABLE test_2pc_timestamp ALTER COLUMN a TYPE int; |
||||||
|
PREPARE TRANSACTION 'test'; |
||||||
|
ERROR: prepared transactions are disabled |
||||||
|
HINT: Set "max_prepared_transactions" to a nonzero value. |
||||||
|
COMMIT PREPARED 'test'; |
||||||
|
ERROR: prepared transaction with identifier "test" does not exist |
||||||
|
SELECT pg_stat_force_next_flush(); |
||||||
|
pg_stat_force_next_flush |
||||||
|
-------------------------- |
||||||
|
|
||||||
|
(1 row) |
||||||
|
|
||||||
|
SELECT last_analyze = :'last_vacuum_analyze'::timestamptz AS same_vacuum_ts |
||||||
|
FROM pg_stat_all_tables WHERE relname = 'test_2pc_timestamp'; |
||||||
|
same_vacuum_ts |
||||||
|
---------------- |
||||||
|
t |
||||||
|
(1 row) |
||||||
|
|
||||||
|
DROP TABLE test_2pc_timestamp; |
||||||
|
-- Table-level stats with single rewrite after 2PC commit. |
||||||
|
CREATE TABLE test_2pc_rewrite_alone (a int) WITH (autovacuum_enabled = false); |
||||||
|
INSERT INTO test_2pc_rewrite_alone VALUES (1); |
||||||
|
BEGIN; |
||||||
|
ALTER TABLE test_2pc_rewrite_alone ALTER COLUMN a TYPE bigint; |
||||||
|
PREPARE TRANSACTION 'test'; |
||||||
|
ERROR: prepared transactions are disabled |
||||||
|
HINT: Set "max_prepared_transactions" to a nonzero value. |
||||||
|
COMMIT PREPARED 'test'; |
||||||
|
ERROR: prepared transaction with identifier "test" does not exist |
||||||
|
SELECT pg_stat_force_next_flush(); |
||||||
|
pg_stat_force_next_flush |
||||||
|
-------------------------- |
||||||
|
|
||||||
|
(1 row) |
||||||
|
|
||||||
|
SELECT n_tup_ins, n_live_tup, n_dead_tup |
||||||
|
FROM pg_stat_all_tables WHERE relname = 'test_2pc_rewrite_alone'; |
||||||
|
n_tup_ins | n_live_tup | n_dead_tup |
||||||
|
-----------+------------+------------ |
||||||
|
1 | 1 | 0 |
||||||
|
(1 row) |
||||||
|
|
||||||
|
DROP TABLE test_2pc_rewrite_alone; |
||||||
|
-- Table-level stats with rewrite and DMLs after 2PC commit. |
||||||
|
CREATE TABLE test_2pc (a int) WITH (autovacuum_enabled = false); |
||||||
|
INSERT INTO test_2pc VALUES (1); |
||||||
|
BEGIN; |
||||||
|
INSERT INTO test_2pc VALUES (1); |
||||||
|
INSERT INTO test_2pc VALUES (2); |
||||||
|
INSERT INTO test_2pc VALUES (3); |
||||||
|
ALTER TABLE test_2pc ALTER COLUMN a TYPE bigint; |
||||||
|
PREPARE TRANSACTION 'test'; |
||||||
|
ERROR: prepared transactions are disabled |
||||||
|
HINT: Set "max_prepared_transactions" to a nonzero value. |
||||||
|
COMMIT PREPARED 'test'; |
||||||
|
ERROR: prepared transaction with identifier "test" does not exist |
||||||
|
SELECT pg_stat_force_next_flush(); |
||||||
|
pg_stat_force_next_flush |
||||||
|
-------------------------- |
||||||
|
|
||||||
|
(1 row) |
||||||
|
|
||||||
|
SELECT n_tup_ins, n_live_tup, n_dead_tup |
||||||
|
FROM pg_stat_all_tables WHERE relname = 'test_2pc'; |
||||||
|
n_tup_ins | n_live_tup | n_dead_tup |
||||||
|
-----------+------------+------------ |
||||||
|
4 | 1 | 3 |
||||||
|
(1 row) |
||||||
|
|
||||||
|
DROP TABLE test_2pc; |
||||||
|
-- Table-level stats with multiple rewrites after 2PC commit. |
||||||
|
CREATE TABLE test_2pc_multi (a int) WITH (autovacuum_enabled = false); |
||||||
|
INSERT INTO test_2pc_multi VALUES (1); |
||||||
|
BEGIN; |
||||||
|
INSERT INTO test_2pc_multi VALUES (1); |
||||||
|
INSERT INTO test_2pc_multi VALUES (2); |
||||||
|
ALTER TABLE test_2pc_multi ALTER COLUMN a TYPE bigint; |
||||||
|
INSERT INTO test_2pc_multi VALUES (3); |
||||||
|
INSERT INTO test_2pc_multi VALUES (4); |
||||||
|
ALTER TABLE test_2pc_multi ALTER COLUMN a TYPE int; |
||||||
|
INSERT INTO test_2pc_multi VALUES (5); |
||||||
|
PREPARE TRANSACTION 'test'; |
||||||
|
ERROR: prepared transactions are disabled |
||||||
|
HINT: Set "max_prepared_transactions" to a nonzero value. |
||||||
|
COMMIT PREPARED 'test'; |
||||||
|
ERROR: prepared transaction with identifier "test" does not exist |
||||||
|
SELECT pg_stat_force_next_flush(); |
||||||
|
pg_stat_force_next_flush |
||||||
|
-------------------------- |
||||||
|
|
||||||
|
(1 row) |
||||||
|
|
||||||
|
SELECT n_tup_ins, n_live_tup, n_dead_tup |
||||||
|
FROM pg_stat_all_tables WHERE relname = 'test_2pc_multi'; |
||||||
|
n_tup_ins | n_live_tup | n_dead_tup |
||||||
|
-----------+------------+------------ |
||||||
|
6 | 1 | 5 |
||||||
|
(1 row) |
||||||
|
|
||||||
|
DROP TABLE test_2pc_multi; |
||||||
|
-- Table-level stats with single rewrite after 2PC abort. |
||||||
|
CREATE TABLE test_2pc_rewrite_alone_abort (a int) WITH (autovacuum_enabled = false); |
||||||
|
INSERT INTO test_2pc_rewrite_alone_abort VALUES (1); |
||||||
|
BEGIN; |
||||||
|
ALTER TABLE test_2pc_rewrite_alone_abort ALTER COLUMN a TYPE bigint; |
||||||
|
PREPARE TRANSACTION 'test'; |
||||||
|
ERROR: prepared transactions are disabled |
||||||
|
HINT: Set "max_prepared_transactions" to a nonzero value. |
||||||
|
ROLLBACK PREPARED 'test'; |
||||||
|
ERROR: prepared transaction with identifier "test" does not exist |
||||||
|
SELECT pg_stat_force_next_flush(); |
||||||
|
pg_stat_force_next_flush |
||||||
|
-------------------------- |
||||||
|
|
||||||
|
(1 row) |
||||||
|
|
||||||
|
SELECT n_tup_ins, n_live_tup, n_dead_tup |
||||||
|
FROM pg_stat_all_tables WHERE relname = 'test_2pc_rewrite_alone_abort'; |
||||||
|
n_tup_ins | n_live_tup | n_dead_tup |
||||||
|
-----------+------------+------------ |
||||||
|
1 | 1 | 0 |
||||||
|
(1 row) |
||||||
|
|
||||||
|
DROP TABLE test_2pc_rewrite_alone_abort; |
||||||
|
-- Table-level stats with rewrite and DMLs after 2PC abort. |
||||||
|
CREATE TABLE test_2pc_abort (a int) WITH (autovacuum_enabled = false); |
||||||
|
INSERT INTO test_2pc_abort VALUES (1); |
||||||
|
BEGIN; |
||||||
|
INSERT INTO test_2pc_abort VALUES (1); |
||||||
|
INSERT INTO test_2pc_abort VALUES (2); |
||||||
|
ALTER TABLE test_2pc_abort ALTER COLUMN a TYPE bigint; |
||||||
|
INSERT INTO test_2pc_abort VALUES (3); |
||||||
|
PREPARE TRANSACTION 'test'; |
||||||
|
ERROR: prepared transactions are disabled |
||||||
|
HINT: Set "max_prepared_transactions" to a nonzero value. |
||||||
|
ROLLBACK PREPARED 'test'; |
||||||
|
ERROR: prepared transaction with identifier "test" does not exist |
||||||
|
SELECT pg_stat_force_next_flush(); |
||||||
|
pg_stat_force_next_flush |
||||||
|
-------------------------- |
||||||
|
|
||||||
|
(1 row) |
||||||
|
|
||||||
|
SELECT n_tup_ins, n_live_tup, n_dead_tup |
||||||
|
FROM pg_stat_all_tables WHERE relname = 'test_2pc_abort'; |
||||||
|
n_tup_ins | n_live_tup | n_dead_tup |
||||||
|
-----------+------------+------------ |
||||||
|
4 | 1 | 3 |
||||||
|
(1 row) |
||||||
|
|
||||||
|
DROP TABLE test_2pc_abort; |
||||||
|
-- Table-level stats with rewrites and subtransactions after 2PC commit. |
||||||
|
CREATE TABLE test_2pc_savepoint (a int) WITH (autovacuum_enabled = false); |
||||||
|
INSERT INTO test_2pc_savepoint VALUES (1); |
||||||
|
BEGIN; |
||||||
|
SAVEPOINT a; |
||||||
|
INSERT INTO test_2pc_savepoint VALUES (1); |
||||||
|
INSERT INTO test_2pc_savepoint VALUES (2); |
||||||
|
ALTER TABLE test_2pc_savepoint ALTER COLUMN a TYPE bigint; |
||||||
|
SAVEPOINT b; |
||||||
|
INSERT INTO test_2pc_savepoint VALUES (3); |
||||||
|
ALTER TABLE test_2pc_savepoint ALTER COLUMN a TYPE int; |
||||||
|
SAVEPOINT c; |
||||||
|
INSERT INTO test_2pc_savepoint VALUES (4); |
||||||
|
INSERT INTO test_2pc_savepoint VALUES (5); |
||||||
|
ROLLBACK TO SAVEPOINT b; |
||||||
|
PREPARE TRANSACTION 'test'; |
||||||
|
ERROR: prepared transactions are disabled |
||||||
|
HINT: Set "max_prepared_transactions" to a nonzero value. |
||||||
|
COMMIT PREPARED 'test'; |
||||||
|
ERROR: prepared transaction with identifier "test" does not exist |
||||||
|
SELECT pg_stat_force_next_flush(); |
||||||
|
pg_stat_force_next_flush |
||||||
|
-------------------------- |
||||||
|
|
||||||
|
(1 row) |
||||||
|
|
||||||
|
SELECT n_tup_ins, n_live_tup, n_dead_tup |
||||||
|
FROM pg_stat_all_tables WHERE relname = 'test_2pc_savepoint'; |
||||||
|
n_tup_ins | n_live_tup | n_dead_tup |
||||||
|
-----------+------------+------------ |
||||||
|
6 | 1 | 5 |
||||||
|
(1 row) |
||||||
|
|
||||||
|
DROP TABLE test_2pc_savepoint; |
||||||
|
-- Table-level stats with single rewrite and VACUUM |
||||||
|
CREATE TABLE test_timestamp (a int) WITH (autovacuum_enabled = false); |
||||||
|
VACUUM ANALYZE test_timestamp; |
||||||
|
SELECT last_analyze AS last_vacuum_analyze |
||||||
|
FROM pg_stat_all_tables WHERE relname = 'test_timestamp' \gset |
||||||
|
ALTER TABLE test_timestamp ALTER COLUMN a TYPE bigint; |
||||||
|
SELECT pg_stat_force_next_flush(); |
||||||
|
pg_stat_force_next_flush |
||||||
|
-------------------------- |
||||||
|
|
||||||
|
(1 row) |
||||||
|
|
||||||
|
SELECT last_analyze = :'last_vacuum_analyze'::timestamptz AS same_vacuum_ts |
||||||
|
FROM pg_stat_all_tables WHERE relname = 'test_timestamp'; |
||||||
|
same_vacuum_ts |
||||||
|
---------------- |
||||||
|
t |
||||||
|
(1 row) |
||||||
|
|
||||||
|
DROP TABLE test_timestamp; |
||||||
|
-- Table-level stats with single rewrite. |
||||||
|
CREATE TABLE test_alone (a int) WITH (autovacuum_enabled = false); |
||||||
|
INSERT INTO test_alone VALUES (1); |
||||||
|
BEGIN; |
||||||
|
ALTER TABLE test_alone ALTER COLUMN a TYPE bigint; |
||||||
|
COMMIT; |
||||||
|
SELECT pg_stat_force_next_flush(); |
||||||
|
pg_stat_force_next_flush |
||||||
|
-------------------------- |
||||||
|
|
||||||
|
(1 row) |
||||||
|
|
||||||
|
SELECT n_tup_ins, n_live_tup, n_dead_tup |
||||||
|
FROM pg_stat_all_tables WHERE relname = 'test_alone'; |
||||||
|
n_tup_ins | n_live_tup | n_dead_tup |
||||||
|
-----------+------------+------------ |
||||||
|
1 | 1 | 0 |
||||||
|
(1 row) |
||||||
|
|
||||||
|
DROP TABLE test_alone; |
||||||
|
-- Table-level stats with rewrite and DMLs. |
||||||
|
CREATE TABLE test (a int) WITH (autovacuum_enabled = false); |
||||||
|
INSERT INTO test VALUES (1); |
||||||
|
BEGIN; |
||||||
|
INSERT INTO test VALUES (1); |
||||||
|
INSERT INTO test VALUES (2); |
||||||
|
INSERT INTO test VALUES (3); |
||||||
|
ALTER TABLE test ALTER COLUMN a TYPE bigint; |
||||||
|
COMMIT; |
||||||
|
SELECT pg_stat_force_next_flush(); |
||||||
|
pg_stat_force_next_flush |
||||||
|
-------------------------- |
||||||
|
|
||||||
|
(1 row) |
||||||
|
|
||||||
|
SELECT n_tup_ins, n_live_tup, n_dead_tup |
||||||
|
FROM pg_stat_all_tables WHERE relname = 'test'; |
||||||
|
n_tup_ins | n_live_tup | n_dead_tup |
||||||
|
-----------+------------+------------ |
||||||
|
4 | 4 | 0 |
||||||
|
(1 row) |
||||||
|
|
||||||
|
DROP TABLE test; |
||||||
|
-- Table-level stats with multiple rewrites and DMLs. |
||||||
|
CREATE TABLE test_multi (a int) WITH (autovacuum_enabled = false); |
||||||
|
INSERT INTO test_multi VALUES (1); |
||||||
|
BEGIN; |
||||||
|
INSERT INTO test_multi VALUES (1); |
||||||
|
INSERT INTO test_multi VALUES (2); |
||||||
|
ALTER TABLE test_multi ALTER COLUMN a TYPE bigint; |
||||||
|
INSERT INTO test_multi VALUES (3); |
||||||
|
INSERT INTO test_multi VALUES (4); |
||||||
|
ALTER TABLE test_multi ALTER COLUMN a TYPE int; |
||||||
|
INSERT INTO test_multi VALUES (5); |
||||||
|
COMMIT; |
||||||
|
SELECT pg_stat_force_next_flush(); |
||||||
|
pg_stat_force_next_flush |
||||||
|
-------------------------- |
||||||
|
|
||||||
|
(1 row) |
||||||
|
|
||||||
|
SELECT n_tup_ins, n_live_tup, n_dead_tup |
||||||
|
FROM pg_stat_all_tables WHERE relname = 'test_multi'; |
||||||
|
n_tup_ins | n_live_tup | n_dead_tup |
||||||
|
-----------+------------+------------ |
||||||
|
6 | 6 | 0 |
||||||
|
(1 row) |
||||||
|
|
||||||
|
DROP TABLE test_multi; |
||||||
|
-- Table-level stats with rewrite and rollback. |
||||||
|
CREATE TABLE test_rewrite_alone_abort (a int) WITH (autovacuum_enabled = false); |
||||||
|
INSERT INTO test_rewrite_alone_abort VALUES (1); |
||||||
|
BEGIN; |
||||||
|
ALTER TABLE test_rewrite_alone_abort ALTER COLUMN a TYPE bigint; |
||||||
|
ROLLBACK; |
||||||
|
SELECT pg_stat_force_next_flush(); |
||||||
|
pg_stat_force_next_flush |
||||||
|
-------------------------- |
||||||
|
|
||||||
|
(1 row) |
||||||
|
|
||||||
|
SELECT n_tup_ins, n_live_tup, n_dead_tup |
||||||
|
FROM pg_stat_all_tables WHERE relname = 'test_rewrite_alone_abort'; |
||||||
|
n_tup_ins | n_live_tup | n_dead_tup |
||||||
|
-----------+------------+------------ |
||||||
|
1 | 1 | 0 |
||||||
|
(1 row) |
||||||
|
|
||||||
|
DROP TABLE test_rewrite_alone_abort; |
||||||
|
-- Table-level stats with rewrite, DMLs and rollback. |
||||||
|
CREATE TABLE test_abort (a int) WITH (autovacuum_enabled = false); |
||||||
|
INSERT INTO test_abort VALUES (1); |
||||||
|
BEGIN; |
||||||
|
INSERT INTO test_abort VALUES (1); |
||||||
|
INSERT INTO test_abort VALUES (2); |
||||||
|
ALTER TABLE test_abort ALTER COLUMN a TYPE bigint; |
||||||
|
INSERT INTO test_abort VALUES (3); |
||||||
|
ROLLBACK; |
||||||
|
SELECT pg_stat_force_next_flush(); |
||||||
|
pg_stat_force_next_flush |
||||||
|
-------------------------- |
||||||
|
|
||||||
|
(1 row) |
||||||
|
|
||||||
|
SELECT n_tup_ins, n_live_tup, n_dead_tup |
||||||
|
FROM pg_stat_all_tables WHERE relname = 'test_abort'; |
||||||
|
n_tup_ins | n_live_tup | n_dead_tup |
||||||
|
-----------+------------+------------ |
||||||
|
4 | 1 | 3 |
||||||
|
(1 row) |
||||||
|
|
||||||
|
DROP TABLE test_abort; |
||||||
|
-- Table-level stats with rewrites and subtransactions. |
||||||
|
CREATE TABLE test_savepoint (a int) WITH (autovacuum_enabled = false); |
||||||
|
INSERT INTO test_savepoint VALUES (1); |
||||||
|
BEGIN; |
||||||
|
SAVEPOINT a; |
||||||
|
INSERT INTO test_savepoint VALUES (1); |
||||||
|
INSERT INTO test_savepoint VALUES (2); |
||||||
|
ALTER TABLE test_savepoint ALTER COLUMN a TYPE bigint; |
||||||
|
SAVEPOINT b; |
||||||
|
INSERT INTO test_savepoint VALUES (3); |
||||||
|
ALTER TABLE test_savepoint ALTER COLUMN a TYPE int; |
||||||
|
SAVEPOINT c; |
||||||
|
INSERT INTO test_savepoint VALUES (4); |
||||||
|
INSERT INTO test_savepoint VALUES (5); |
||||||
|
ROLLBACK TO SAVEPOINT b; |
||||||
|
COMMIT; |
||||||
|
SELECT pg_stat_force_next_flush(); |
||||||
|
pg_stat_force_next_flush |
||||||
|
-------------------------- |
||||||
|
|
||||||
|
(1 row) |
||||||
|
|
||||||
|
SELECT n_tup_ins, n_live_tup, n_dead_tup |
||||||
|
FROM pg_stat_all_tables WHERE relname = 'test_savepoint'; |
||||||
|
n_tup_ins | n_live_tup | n_dead_tup |
||||||
|
-----------+------------+------------ |
||||||
|
6 | 3 | 3 |
||||||
|
(1 row) |
||||||
|
|
||||||
|
DROP TABLE test_savepoint; |
||||||
|
-- Table-level stats with tablespace rewrite. |
||||||
|
CREATE TABLE test_tbs (a int) WITH (autovacuum_enabled = false); |
||||||
|
INSERT INTO test_tbs VALUES (1); |
||||||
|
ALTER TABLE test_tbs SET TABLESPACE pg_default; |
||||||
|
SELECT pg_stat_force_next_flush(); |
||||||
|
pg_stat_force_next_flush |
||||||
|
-------------------------- |
||||||
|
|
||||||
|
(1 row) |
||||||
|
|
||||||
|
SELECT n_tup_ins, n_live_tup, n_dead_tup |
||||||
|
FROM pg_stat_all_tables WHERE relname = 'test_tbs'; |
||||||
|
n_tup_ins | n_live_tup | n_dead_tup |
||||||
|
-----------+------------+------------ |
||||||
|
1 | 1 | 0 |
||||||
|
(1 row) |
||||||
|
|
||||||
|
DROP TABLE test_tbs; |
||||||
@ -0,0 +1,220 @@ |
|||||||
|
-- |
||||||
|
-- Test cumulative statistics with relation rewrites |
||||||
|
-- |
||||||
|
|
||||||
|
-- Two-phase commit. |
||||||
|
-- Table-level stats with VACUUM and rewrite after 2PC commit. |
||||||
|
CREATE TABLE test_2pc_timestamp (a int) WITH (autovacuum_enabled = false); |
||||||
|
VACUUM ANALYZE test_2pc_timestamp; |
||||||
|
SELECT last_analyze AS last_vacuum_analyze |
||||||
|
FROM pg_stat_all_tables WHERE relname = 'test_2pc_timestamp' \gset |
||||||
|
BEGIN; |
||||||
|
ALTER TABLE test_2pc_timestamp ALTER COLUMN a TYPE int; |
||||||
|
PREPARE TRANSACTION 'test'; |
||||||
|
COMMIT PREPARED 'test'; |
||||||
|
SELECT pg_stat_force_next_flush(); |
||||||
|
SELECT last_analyze = :'last_vacuum_analyze'::timestamptz AS same_vacuum_ts |
||||||
|
FROM pg_stat_all_tables WHERE relname = 'test_2pc_timestamp'; |
||||||
|
DROP TABLE test_2pc_timestamp; |
||||||
|
|
||||||
|
-- Table-level stats with single rewrite after 2PC commit. |
||||||
|
CREATE TABLE test_2pc_rewrite_alone (a int) WITH (autovacuum_enabled = false); |
||||||
|
INSERT INTO test_2pc_rewrite_alone VALUES (1); |
||||||
|
BEGIN; |
||||||
|
ALTER TABLE test_2pc_rewrite_alone ALTER COLUMN a TYPE bigint; |
||||||
|
PREPARE TRANSACTION 'test'; |
||||||
|
COMMIT PREPARED 'test'; |
||||||
|
SELECT pg_stat_force_next_flush(); |
||||||
|
SELECT n_tup_ins, n_live_tup, n_dead_tup |
||||||
|
FROM pg_stat_all_tables WHERE relname = 'test_2pc_rewrite_alone'; |
||||||
|
DROP TABLE test_2pc_rewrite_alone; |
||||||
|
|
||||||
|
-- Table-level stats with rewrite and DMLs after 2PC commit. |
||||||
|
CREATE TABLE test_2pc (a int) WITH (autovacuum_enabled = false); |
||||||
|
INSERT INTO test_2pc VALUES (1); |
||||||
|
BEGIN; |
||||||
|
INSERT INTO test_2pc VALUES (1); |
||||||
|
INSERT INTO test_2pc VALUES (2); |
||||||
|
INSERT INTO test_2pc VALUES (3); |
||||||
|
ALTER TABLE test_2pc ALTER COLUMN a TYPE bigint; |
||||||
|
PREPARE TRANSACTION 'test'; |
||||||
|
COMMIT PREPARED 'test'; |
||||||
|
SELECT pg_stat_force_next_flush(); |
||||||
|
SELECT n_tup_ins, n_live_tup, n_dead_tup |
||||||
|
FROM pg_stat_all_tables WHERE relname = 'test_2pc'; |
||||||
|
DROP TABLE test_2pc; |
||||||
|
|
||||||
|
-- Table-level stats with multiple rewrites after 2PC commit. |
||||||
|
CREATE TABLE test_2pc_multi (a int) WITH (autovacuum_enabled = false); |
||||||
|
INSERT INTO test_2pc_multi VALUES (1); |
||||||
|
BEGIN; |
||||||
|
INSERT INTO test_2pc_multi VALUES (1); |
||||||
|
INSERT INTO test_2pc_multi VALUES (2); |
||||||
|
ALTER TABLE test_2pc_multi ALTER COLUMN a TYPE bigint; |
||||||
|
INSERT INTO test_2pc_multi VALUES (3); |
||||||
|
INSERT INTO test_2pc_multi VALUES (4); |
||||||
|
ALTER TABLE test_2pc_multi ALTER COLUMN a TYPE int; |
||||||
|
INSERT INTO test_2pc_multi VALUES (5); |
||||||
|
PREPARE TRANSACTION 'test'; |
||||||
|
COMMIT PREPARED 'test'; |
||||||
|
SELECT pg_stat_force_next_flush(); |
||||||
|
SELECT n_tup_ins, n_live_tup, n_dead_tup |
||||||
|
FROM pg_stat_all_tables WHERE relname = 'test_2pc_multi'; |
||||||
|
DROP TABLE test_2pc_multi; |
||||||
|
|
||||||
|
-- Table-level stats with single rewrite after 2PC abort. |
||||||
|
CREATE TABLE test_2pc_rewrite_alone_abort (a int) WITH (autovacuum_enabled = false); |
||||||
|
INSERT INTO test_2pc_rewrite_alone_abort VALUES (1); |
||||||
|
BEGIN; |
||||||
|
ALTER TABLE test_2pc_rewrite_alone_abort ALTER COLUMN a TYPE bigint; |
||||||
|
PREPARE TRANSACTION 'test'; |
||||||
|
ROLLBACK PREPARED 'test'; |
||||||
|
SELECT pg_stat_force_next_flush(); |
||||||
|
SELECT n_tup_ins, n_live_tup, n_dead_tup |
||||||
|
FROM pg_stat_all_tables WHERE relname = 'test_2pc_rewrite_alone_abort'; |
||||||
|
DROP TABLE test_2pc_rewrite_alone_abort; |
||||||
|
|
||||||
|
-- Table-level stats with rewrite and DMLs after 2PC abort. |
||||||
|
CREATE TABLE test_2pc_abort (a int) WITH (autovacuum_enabled = false); |
||||||
|
INSERT INTO test_2pc_abort VALUES (1); |
||||||
|
BEGIN; |
||||||
|
INSERT INTO test_2pc_abort VALUES (1); |
||||||
|
INSERT INTO test_2pc_abort VALUES (2); |
||||||
|
ALTER TABLE test_2pc_abort ALTER COLUMN a TYPE bigint; |
||||||
|
INSERT INTO test_2pc_abort VALUES (3); |
||||||
|
PREPARE TRANSACTION 'test'; |
||||||
|
ROLLBACK PREPARED 'test'; |
||||||
|
SELECT pg_stat_force_next_flush(); |
||||||
|
SELECT n_tup_ins, n_live_tup, n_dead_tup |
||||||
|
FROM pg_stat_all_tables WHERE relname = 'test_2pc_abort'; |
||||||
|
DROP TABLE test_2pc_abort; |
||||||
|
|
||||||
|
-- Table-level stats with rewrites and subtransactions after 2PC commit. |
||||||
|
CREATE TABLE test_2pc_savepoint (a int) WITH (autovacuum_enabled = false); |
||||||
|
INSERT INTO test_2pc_savepoint VALUES (1); |
||||||
|
BEGIN; |
||||||
|
SAVEPOINT a; |
||||||
|
INSERT INTO test_2pc_savepoint VALUES (1); |
||||||
|
INSERT INTO test_2pc_savepoint VALUES (2); |
||||||
|
ALTER TABLE test_2pc_savepoint ALTER COLUMN a TYPE bigint; |
||||||
|
SAVEPOINT b; |
||||||
|
INSERT INTO test_2pc_savepoint VALUES (3); |
||||||
|
ALTER TABLE test_2pc_savepoint ALTER COLUMN a TYPE int; |
||||||
|
SAVEPOINT c; |
||||||
|
INSERT INTO test_2pc_savepoint VALUES (4); |
||||||
|
INSERT INTO test_2pc_savepoint VALUES (5); |
||||||
|
ROLLBACK TO SAVEPOINT b; |
||||||
|
PREPARE TRANSACTION 'test'; |
||||||
|
COMMIT PREPARED 'test'; |
||||||
|
SELECT pg_stat_force_next_flush(); |
||||||
|
SELECT n_tup_ins, n_live_tup, n_dead_tup |
||||||
|
FROM pg_stat_all_tables WHERE relname = 'test_2pc_savepoint'; |
||||||
|
DROP TABLE test_2pc_savepoint; |
||||||
|
|
||||||
|
-- Table-level stats with single rewrite and VACUUM |
||||||
|
CREATE TABLE test_timestamp (a int) WITH (autovacuum_enabled = false); |
||||||
|
VACUUM ANALYZE test_timestamp; |
||||||
|
SELECT last_analyze AS last_vacuum_analyze |
||||||
|
FROM pg_stat_all_tables WHERE relname = 'test_timestamp' \gset |
||||||
|
ALTER TABLE test_timestamp ALTER COLUMN a TYPE bigint; |
||||||
|
SELECT pg_stat_force_next_flush(); |
||||||
|
SELECT last_analyze = :'last_vacuum_analyze'::timestamptz AS same_vacuum_ts |
||||||
|
FROM pg_stat_all_tables WHERE relname = 'test_timestamp'; |
||||||
|
DROP TABLE test_timestamp; |
||||||
|
|
||||||
|
-- Table-level stats with single rewrite. |
||||||
|
CREATE TABLE test_alone (a int) WITH (autovacuum_enabled = false); |
||||||
|
INSERT INTO test_alone VALUES (1); |
||||||
|
BEGIN; |
||||||
|
ALTER TABLE test_alone ALTER COLUMN a TYPE bigint; |
||||||
|
COMMIT; |
||||||
|
SELECT pg_stat_force_next_flush(); |
||||||
|
SELECT n_tup_ins, n_live_tup, n_dead_tup |
||||||
|
FROM pg_stat_all_tables WHERE relname = 'test_alone'; |
||||||
|
DROP TABLE test_alone; |
||||||
|
|
||||||
|
-- Table-level stats with rewrite and DMLs. |
||||||
|
CREATE TABLE test (a int) WITH (autovacuum_enabled = false); |
||||||
|
INSERT INTO test VALUES (1); |
||||||
|
BEGIN; |
||||||
|
INSERT INTO test VALUES (1); |
||||||
|
INSERT INTO test VALUES (2); |
||||||
|
INSERT INTO test VALUES (3); |
||||||
|
ALTER TABLE test ALTER COLUMN a TYPE bigint; |
||||||
|
COMMIT; |
||||||
|
SELECT pg_stat_force_next_flush(); |
||||||
|
SELECT n_tup_ins, n_live_tup, n_dead_tup |
||||||
|
FROM pg_stat_all_tables WHERE relname = 'test'; |
||||||
|
DROP TABLE test; |
||||||
|
|
||||||
|
-- Table-level stats with multiple rewrites and DMLs. |
||||||
|
CREATE TABLE test_multi (a int) WITH (autovacuum_enabled = false); |
||||||
|
INSERT INTO test_multi VALUES (1); |
||||||
|
BEGIN; |
||||||
|
INSERT INTO test_multi VALUES (1); |
||||||
|
INSERT INTO test_multi VALUES (2); |
||||||
|
ALTER TABLE test_multi ALTER COLUMN a TYPE bigint; |
||||||
|
INSERT INTO test_multi VALUES (3); |
||||||
|
INSERT INTO test_multi VALUES (4); |
||||||
|
ALTER TABLE test_multi ALTER COLUMN a TYPE int; |
||||||
|
INSERT INTO test_multi VALUES (5); |
||||||
|
COMMIT; |
||||||
|
SELECT pg_stat_force_next_flush(); |
||||||
|
SELECT n_tup_ins, n_live_tup, n_dead_tup |
||||||
|
FROM pg_stat_all_tables WHERE relname = 'test_multi'; |
||||||
|
DROP TABLE test_multi; |
||||||
|
|
||||||
|
-- Table-level stats with rewrite and rollback. |
||||||
|
CREATE TABLE test_rewrite_alone_abort (a int) WITH (autovacuum_enabled = false); |
||||||
|
INSERT INTO test_rewrite_alone_abort VALUES (1); |
||||||
|
BEGIN; |
||||||
|
ALTER TABLE test_rewrite_alone_abort ALTER COLUMN a TYPE bigint; |
||||||
|
ROLLBACK; |
||||||
|
SELECT pg_stat_force_next_flush(); |
||||||
|
SELECT n_tup_ins, n_live_tup, n_dead_tup |
||||||
|
FROM pg_stat_all_tables WHERE relname = 'test_rewrite_alone_abort'; |
||||||
|
DROP TABLE test_rewrite_alone_abort; |
||||||
|
|
||||||
|
-- Table-level stats with rewrite, DMLs and rollback. |
||||||
|
CREATE TABLE test_abort (a int) WITH (autovacuum_enabled = false); |
||||||
|
INSERT INTO test_abort VALUES (1); |
||||||
|
BEGIN; |
||||||
|
INSERT INTO test_abort VALUES (1); |
||||||
|
INSERT INTO test_abort VALUES (2); |
||||||
|
ALTER TABLE test_abort ALTER COLUMN a TYPE bigint; |
||||||
|
INSERT INTO test_abort VALUES (3); |
||||||
|
ROLLBACK; |
||||||
|
SELECT pg_stat_force_next_flush(); |
||||||
|
SELECT n_tup_ins, n_live_tup, n_dead_tup |
||||||
|
FROM pg_stat_all_tables WHERE relname = 'test_abort'; |
||||||
|
DROP TABLE test_abort; |
||||||
|
|
||||||
|
-- Table-level stats with rewrites and subtransactions. |
||||||
|
CREATE TABLE test_savepoint (a int) WITH (autovacuum_enabled = false); |
||||||
|
INSERT INTO test_savepoint VALUES (1); |
||||||
|
BEGIN; |
||||||
|
SAVEPOINT a; |
||||||
|
INSERT INTO test_savepoint VALUES (1); |
||||||
|
INSERT INTO test_savepoint VALUES (2); |
||||||
|
ALTER TABLE test_savepoint ALTER COLUMN a TYPE bigint; |
||||||
|
SAVEPOINT b; |
||||||
|
INSERT INTO test_savepoint VALUES (3); |
||||||
|
ALTER TABLE test_savepoint ALTER COLUMN a TYPE int; |
||||||
|
SAVEPOINT c; |
||||||
|
INSERT INTO test_savepoint VALUES (4); |
||||||
|
INSERT INTO test_savepoint VALUES (5); |
||||||
|
ROLLBACK TO SAVEPOINT b; |
||||||
|
COMMIT; |
||||||
|
SELECT pg_stat_force_next_flush(); |
||||||
|
SELECT n_tup_ins, n_live_tup, n_dead_tup |
||||||
|
FROM pg_stat_all_tables WHERE relname = 'test_savepoint'; |
||||||
|
DROP TABLE test_savepoint; |
||||||
|
|
||||||
|
-- Table-level stats with tablespace rewrite. |
||||||
|
CREATE TABLE test_tbs (a int) WITH (autovacuum_enabled = false); |
||||||
|
INSERT INTO test_tbs VALUES (1); |
||||||
|
ALTER TABLE test_tbs SET TABLESPACE pg_default; |
||||||
|
SELECT pg_stat_force_next_flush(); |
||||||
|
SELECT n_tup_ins, n_live_tup, n_dead_tup |
||||||
|
FROM pg_stat_all_tables WHERE relname = 'test_tbs'; |
||||||
|
DROP TABLE test_tbs; |
||||||
Loading…
Reference in new issue