提交 b3991132 编写于 作者: H Heikki Linnakangas 提交者: Ashwin Agrawal

Add test cases for updates of append-only tables.

Yes, append-only tables are not actually append-only in modern version of
GPDB, hence the oxymoronic name.

These tests are ported from Pivotal's TINC test suite which has not been
open sourced - we are porting tests out of the suite instead.
上级 ba7ec628
-- @Description Checks analyze and drop column interfaction
CREATE TABLE ck_ct_ao_analyze1(
text_col text,
bigint_col bigint,
char_vary_col character varying(30),
numeric_col numeric,
int_col int4,
float_col float4,
int_array_col int[],
drop_col numeric,
before_rename_col int4,
change_datatype_col numeric,
a_ts_without timestamp without time zone,
b_ts_with timestamp with time zone,
date_column date) with (appendonly=true) distributed randomly;
INSERT INTO ck_ct_ao_analyze1 values ('0_zero', 0, '0_zero', 0, 0, 0, '{0}', 0, 0, 0, '2004-10-19 10:23:54', '2004-10-19 10:23:54+02', '1-1-2000');
INSERT INTO ck_ct_ao_analyze1 values ('1_zero', 1, '1_zero', 1, 1, 1, '{1}', 1, 1, 1, '2005-10-19 10:23:54', '2005-10-19 10:23:54+02', '1-1-2001');
INSERT INTO ck_ct_ao_analyze1 values ('2_zero', 2, '2_zero', 2, 2, 2, '{2}', 2, 2, 2, '2006-10-19 10:23:54', '2006-10-19 10:23:54+02', '1-1-2002');
select count(*) AS only_visi_tups_ins from ck_ct_ao_analyze1;
only_visi_tups_ins
--------------------
3
(1 row)
set gp_select_invisible = true;
select count(*) AS invisi_and_visi_tups_ins from ck_ct_ao_analyze1;
invisi_and_visi_tups_ins
--------------------------
3
(1 row)
set gp_select_invisible = false;
update ck_ct_ao_analyze1 set bigint_col = bigint_col + 1 where text_col = '0_zero';
select count(*) AS only_visi_tups_upd from ck_ct_ao_analyze1;
only_visi_tups_upd
--------------------
3
(1 row)
set gp_select_invisible = true;
select count(*) AS invisi_and_visi_tups_upd from ck_ct_ao_analyze1;
invisi_and_visi_tups_upd
--------------------------
4
(1 row)
set gp_select_invisible = false;
delete from ck_ct_ao_analyze1 where int_col = 2;
select count(*) AS only_visi_tups_del from ck_ct_ao_analyze1;
only_visi_tups_del
--------------------
2
(1 row)
set gp_select_invisible = true;
select count(*) AS invisi_and_visi_tups_del from ck_ct_ao_analyze1;
invisi_and_visi_tups_del
--------------------------
4
(1 row)
set gp_select_invisible = false;
--
ALTER TABLE ck_ct_ao_analyze1 ADD COLUMN added_col character varying(30) default 'test_value';
ALTER TABLE ck_ct_ao_analyze1 DROP COLUMN drop_col ;
ALTER TABLE ck_ct_ao_analyze1 RENAME COLUMN before_rename_col TO after_rename_col;
ALTER TABLE ck_ct_ao_analyze1 ALTER COLUMN change_datatype_col TYPE int4;
ALTER TABLE ck_ct_ao_analyze1 set with ( reorganize='true') distributed by (int_col);
--
--
INSERT INTO ck_ct_ao_analyze1 values ('1_zero', 1, '1_zero', 1, 1, 1, '{1}', 1, 1, '2005-10-19 10:23:54', '2005-10-19 10:23:54+02', '1-1-2001');
INSERT INTO ck_ct_ao_analyze1 values ('2_zero', 2, '2_zero', 2, 2, 2, '{2}', 2, 2, '2006-10-19 10:23:54', '2006-10-19 10:23:54+02', '1-1-2002');
INSERT INTO ck_ct_ao_analyze1 values ('3_zero', 3, '3_zero', 0, 0, 0, '{0}', 0, 0, '2004-10-19 10:23:54', '2004-10-19 10:23:54+02', '1-1-2000');
update ck_ct_ao_analyze1 set bigint_col = bigint_col + 1 where text_col = '1_zero';
ANALYZE ck_ct_ao_analyze1;
-- @Description Checks analyze and drop column interfaction
CREATE TABLE ck_ct_ao_analyze2(
text_col text,
bigint_col bigint,
char_vary_col character varying(30),
numeric_col numeric,
int_col int4,
float_col float4,
int_array_col int[],
drop_col numeric,
before_rename_col int4,
change_datatype_col numeric,
a_ts_without timestamp without time zone,
b_ts_with timestamp with time zone,
date_column date) with (appendonly=true) distributed randomly;
INSERT INTO ck_ct_ao_analyze2 values ('0_zero', 0, '0_zero', 0, 0, 0, '{0}', 0, 0, 0, '2004-10-19 10:23:54', '2004-10-19 10:23:54+02', '1-1-2000');
INSERT INTO ck_ct_ao_analyze2 values ('1_zero', 1, '1_zero', 1, 1, 1, '{1}', 1, 1, 1, '2005-10-19 10:23:54', '2005-10-19 10:23:54+02', '1-1-2001');
INSERT INTO ck_ct_ao_analyze2 values ('2_zero', 2, '2_zero', 2, 2, 2, '{2}', 2, 2, 2, '2006-10-19 10:23:54', '2006-10-19 10:23:54+02', '1-1-2002');
select count(*) AS only_visi_tups_ins from ck_ct_ao_analyze2;
only_visi_tups_ins
--------------------
3
(1 row)
set gp_select_invisible = true;
select count(*) AS invisi_and_visi_tups_ins from ck_ct_ao_analyze2;
invisi_and_visi_tups_ins
--------------------------
3
(1 row)
set gp_select_invisible = false;
update ck_ct_ao_analyze2 set bigint_col = bigint_col + 1 where text_col = '0_zero';
select count(*) AS only_visi_tups_upd from ck_ct_ao_analyze2;
only_visi_tups_upd
--------------------
3
(1 row)
set gp_select_invisible = true;
select count(*) AS invisi_and_visi_tups_upd from ck_ct_ao_analyze2;
invisi_and_visi_tups_upd
--------------------------
4
(1 row)
set gp_select_invisible = false;
delete from ck_ct_ao_analyze2 where int_col = 2;
select count(*) AS only_visi_tups_del from ck_ct_ao_analyze2;
only_visi_tups_del
--------------------
2
(1 row)
set gp_select_invisible = true;
select count(*) AS invisi_and_visi_tups_del from ck_ct_ao_analyze2;
invisi_and_visi_tups_del
--------------------------
4
(1 row)
set gp_select_invisible = false;
--
ALTER TABLE ck_ct_ao_analyze2 ADD COLUMN added_col character varying(30) default 'test_value';
ALTER TABLE ck_ct_ao_analyze2 DROP COLUMN drop_col ;
ALTER TABLE ck_ct_ao_analyze2 RENAME COLUMN before_rename_col TO after_rename_col;
ALTER TABLE ck_ct_ao_analyze2 ALTER COLUMN change_datatype_col TYPE int4;
ALTER TABLE ck_ct_ao_analyze2 set with ( reorganize='true') distributed by (int_col);
update ck_ct_ao_analyze2 set bigint_col = bigint_col + 1 where text_col = '1_zero';
ANALYZE ck_ct_ao_analyze2;
-- @Description Basic lazy vacuum
CREATE TABLE uao_basic (a INT, b INT, c CHAR(128)) WITH (appendonly=true);
CREATE INDEX uao_basic_index ON uao_basic(b);
INSERT INTO uao_basic SELECT i as a, 1 as b, 'hello world' as c FROM generate_series(1, 10) AS i;
INSERT INTO uao_basic SELECT i as a, 1 as b, 'hello world' as c FROM generate_series(1, 10) AS i;
DELETE FROM uao_basic WHERE a < 4;
SELECT COUNT(*) FROM uao_basic;
count
-------
14
(1 row)
VACUUM uao_basic;
-- check if we get the same result afterwards
SELECT COUNT(*) FROM uao_basic;
count
-------
14
(1 row)
-- check if we can still insert into the relation
INSERT INTO uao_basic VALUES (11, 11);
SELECT COUNT(*) FROM uao_basic;
count
-------
15
(1 row)
-- @Description Checkes the deletion and vacuuming of toast values
-- Create a table with toasted values.
CREATE TABLE uao_delete_toast (a INT, b INT, c VARCHAR) WITH (appendonly=true) DISTRIBUTED BY (a);
CREATE INDEX uao_delete_toast_index ON uao_delete_toast(b);
INSERT INTO uao_delete_toast SELECT i as a, 1 as b, i::text || '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' as c FROM generate_series(1, 10) AS i;
DELETE FROM uao_delete_toast;
VACUUM uao_delete_toast;
-- @Description Tests dropping a column after a compaction
CREATE TABLE uao_drop_col (a INT, b INT, c CHAR(128)) WITH (appendonly=true) DISTRIBUTED BY (a);
CREATE INDEX uao_drop_col_index ON uao_drop_col(b);
INSERT INTO uao_drop_col SELECT i as a, 1 as b, 'hello world' as c FROM generate_series(1, 10) AS i;
DELETE FROM uao_drop_col WHERE a < 4;
SELECT COUNT(*) FROM uao_drop_col;
count
-------
7
(1 row)
SELECT relname, reltuples FROM pg_class WHERE relname = 'uao_drop_col';
relname | reltuples
--------------+-----------
uao_drop_col | 10
(1 row)
SELECT relname, reltuples FROM pg_class WHERE relname = 'uao_drop_col_index';
relname | reltuples
--------------------+-----------
uao_drop_col_index | 10
(1 row)
VACUUM uao_drop_col;
SELECT relname, reltuples FROM pg_class WHERE relname = 'uao_drop_col';
relname | reltuples
--------------+-----------
uao_drop_col | 7
(1 row)
SELECT relname, reltuples FROM pg_class WHERE relname = 'uao_drop_col_index';
relname | reltuples
--------------------+-----------
uao_drop_col_index | 7
(1 row)
ALTER TABLE uao_drop_col DROP COLUMN c;
SELECT * FROM uao_drop_col;
a | b
----+---
4 | 1
5 | 1
6 | 1
7 | 1
8 | 1
9 | 1
10 | 1
(7 rows)
INSERT INTO uao_drop_col VALUES (42, 42);
SELECT * FROM uao_drop_col;
a | b
----+----
42 | 42
4 | 1
5 | 1
6 | 1
7 | 1
8 | 1
9 | 1
10 | 1
(8 rows)
-- @Description Tests dropping a column after a compaction with update
CREATE TABLE ck_ct_ao_analyze3(
text_col text,
bigint_col bigint,
char_vary_col character varying(30),
int_array_col int[],
drop_col numeric) with (appendonly=true);
INSERT INTO ck_ct_ao_analyze3 values ('1_zero', 1, '1_zero', '{1}', 1);
ALTER TABLE ck_ct_ao_analyze3 DROP COLUMN drop_col;
Select char_vary_col, int_array_col from ck_ct_ao_analyze3;
char_vary_col | int_array_col
---------------+---------------
1_zero | {1}
(1 row)
INSERT INTO ck_ct_ao_analyze3 values ('2_zero', 2, '2_zero', '{2}');
update ck_ct_ao_analyze3 set bigint_col = bigint_col + 1 where text_col = '1_zero';
Select char_vary_col, int_array_col from ck_ct_ao_analyze3;
char_vary_col | int_array_col
---------------+---------------
2_zero | {2}
1_zero | {1}
(2 rows)
-- @Description Tests the behavior while compacting is disabled
CREATE TABLE uao_eof_truncate (a INT, b INT, c CHAR(128)) WITH (appendonly=true);
CREATE INDEX uao_eof_truncate_index ON uao_eof_truncate(b);
BEGIN;
INSERT INTO uao_eof_truncate SELECT i as a, 1 as b, 'hello world' as c FROM generate_series(1,1000) AS i;
COMMIT;
BEGIN;
INSERT INTO uao_eof_truncate SELECT i as a, 1 as b, 'hello world' as c FROM generate_series(1000,2000) AS i;
ROLLBACK;
SET gp_appendonly_compaction=false;
SELECT COUNT(*) FROM uao_eof_truncate;
count
-------
1000
(1 row)
VACUUM uao_eof_truncate;
SELECT COUNT(*) FROM uao_eof_truncate;
count
-------
1000
(1 row)
-- Insert afterwards
INSERT INTO uao_eof_truncate SELECT i as a, 1 as b, 'hello world' as c FROM generate_series(1,10) AS i;
SELECT COUNT(*) FROM uao_eof_truncate;
count
-------
1010
(1 row)
-- @Description Test the basic bahavior of vacuum full
CREATE TABLE uao_full (a INT, b INT, c CHAR(128)) WITH (appendonly=true);
CREATE INDEX uao_full_index ON uao_full(b);
INSERT INTO uao_full SELECT i as a, 1 as b, 'hello world' as c FROM generate_series(1,10) AS i;
INSERT INTO uao_full SELECT i as a, 1 as b, 'hello world' as c FROM generate_series(1,10) AS i;
DELETE FROM uao_full WHERE a < 4;
SELECT COUNT(*) FROM uao_full;
count
-------
14
(1 row)
VACUUM FULL uao_full;
-- check if we get the same result afterwards
SELECT COUNT(*) FROM uao_full;
count
-------
14
(1 row)
-- check if we can still insert into the relation
INSERT INTO uao_full VALUES (11, 11);
SELECT COUNT(*) FROM uao_full;
count
-------
15
(1 row)
-- @Description Tests the behavior while compacting is disabled
CREATE TABLE full_eof_truncate (a INT, b INT, c CHAR(128)) WITH (appendonly=true);
CREATE INDEX full_eof_truncate_index ON full_eof_truncate(b);
BEGIN;
INSERT INTO full_eof_truncate SELECT i as a, 1 as b, 'hello world' as c FROM generate_series(1,1000) AS i;
COMMIT;
BEGIN;
INSERT INTO full_eof_truncate SELECT i as a, 1 as b, 'hello world' as c FROM generate_series(1000,2000) AS i;
ROLLBACK;
SET gp_appendonly_compaction=false;
SELECT COUNT(*) FROM full_eof_truncate;
count
-------
1000
(1 row)
VACUUM FULL full_eof_truncate;
SELECT COUNT(*) FROM full_eof_truncate;
count
-------
1000
(1 row)
-- Insert afterwards
INSERT INTO full_eof_truncate SELECT i as a, 1 as b, 'hello world' as c FROM generate_series(1,10) AS i;
SELECT COUNT(*) FROM full_eof_truncate;
count
-------
1010
(1 row)
-- @Description Tests the behavior of full vacuum w.r.t. the pg_class statistics
CREATE TABLE uao_full_stats (a INT, b INT, c CHAR(128)) WITH (appendonly=true) DISTRIBUTED BY (a);
CREATE INDEX uao_full_stats_index ON uao_full_stats(b);
INSERT INTO uao_full_stats SELECT i as a, i as b, 'hello world' as c FROM generate_series(1, 50) AS i;
INSERT INTO uao_full_stats SELECT i as a, i as b, 'hello world' as c FROM generate_series(51, 100) AS i;
ANALYZE uao_full_stats;
-- ensure that the scan go through the index
SET enable_seqscan=false;
SELECT relname, reltuples FROM pg_class WHERE relname = 'uao_full_stats';
relname | reltuples
----------------+-----------
uao_full_stats | 100
(1 row)
SELECT relname, reltuples FROM pg_class WHERE relname = 'uao_full_stats_index';
relname | reltuples
----------------------+-----------
uao_full_stats_index | 100
(1 row)
DELETE FROM uao_full_stats WHERE a < 16;
VACUUM FULL uao_full_stats;
SELECT relname, reltuples FROM pg_class WHERE relname = 'uao_full_stats';
relname | reltuples
----------------+-----------
uao_full_stats | 85
(1 row)
SELECT relname, reltuples FROM pg_class WHERE relname = 'uao_full_stats_index';
relname | reltuples
----------------------+-----------
uao_full_stats_index | 85
(1 row)
-- @Description Tests that that full vacuum is ignoring the threshold guc value.
CREATE TABLE uao_full_threshold (a INT, b INT, c CHAR(128)) WITH (appendonly=true) DISTRIBUTED BY (a);
CREATE INDEX uao_full_threshold_index ON uao_full_threshold(b);
INSERT INTO uao_full_threshold SELECT i as a, 1 as b, 'hello world' as c FROM generate_series(1, 100) AS i;
VACUUM FULL uao_full_threshold;
DELETE FROM uao_full_threshold WHERE a < 4;
SET gp_appendonly_compaction_threshold=100;
VACUUM FULL uao_full_threshold;
-- @Description Tests basic index usage behavior after vacuuming
CREATE TABLE uao_index_test (a INT, b INT, c CHAR(128)) WITH (appendonly=true);
CREATE INDEX uao_index_test_index ON uao_index_test(b);
INSERT INTO uao_index_test SELECT i as a, i as b, 'hello world' as c FROM generate_series(1,10) AS i;
INSERT INTO uao_index_test SELECT i as a, i as b, 'hello world' as c FROM generate_series(1,10) AS i;
VACUUM uao_index_test;
SELECT * FROM uao_index_test WHERE b = 5;
a | b | c
---+---+----------------------------------------------------------------------------------------------------------------------------------
5 | 5 | hello world
5 | 5 | hello world
(2 rows)
-- Test index usage after vacuuming.
-- Bug verification for MPP-24913
CREATE TABLE table_index2 (a BIGINT, b BIGINT) WITH (appendonly=true);
CREATE INDEX table_index2_index_a ON table_index2(a);
CREATE INDEX table_index2_index_b ON table_index2(b);
\set QUIET off
INSERT INTO table_index2 SELECT *,* FROM generate_series(1, 347305);
INSERT 0 347305
INSERT INTO table_index2 SELECT *,* FROM generate_series(1, 347305);
INSERT 0 347305
UPDATE table_index2 SET b=100 WHERE a < 347305;
UPDATE 694608
INSERT INTO table_index2 SELECT *,* FROM generate_series(1, 347305);
INSERT 0 347305
UPDATE table_index2 SET b=100 WHERE a < 347305;
UPDATE 1041912
INSERT INTO table_index2 SELECT *,* FROM generate_series(1, 347305);
INSERT 0 347305
INSERT INTO table_index2 SELECT *,* FROM generate_series(1, 347305);
INSERT 0 347305
UPDATE table_index2 SET b=101 WHERE b = 100;
UPDATE 1041914
VACUUM table_index2;
VACUUM
UPDATE table_index2 SET b=102 WHERE b = 101;
UPDATE 1041916
VACUUM table_index2;
VACUUM
SELECT COUNT(*) FROM table_index2;
count
---------
1736525
(1 row)
SET enable_seqscan=OFF;
SET
SELECT COUNT(*) FROM table_index2 WHERE a > 0;
count
---------
1736525
(1 row)
-- @Description Tests basic index stats after vacuuming
CREATE TABLE mytab(
col_int int,
col_text text,
col_numeric numeric,
col_unq int
) with(appendonly=true) DISTRIBUTED RANDOMLY;
Create index mytab_int_idx1 on mytab(col_int);
insert into mytab values(1,'aa',1001,101),(2,'bb',1002,102);
select * from mytab;
col_int | col_text | col_numeric | col_unq
---------+----------+-------------+---------
1 | aa | 1001 | 101
2 | bb | 1002 | 102
(2 rows)
update mytab set col_text=' new value' where col_int = 1;
select * from mytab;
col_int | col_text | col_numeric | col_unq
---------+------------+-------------+---------
2 | bb | 1002 | 102
1 | new value | 1001 | 101
(2 rows)
vacuum mytab;
SELECT relname, reltuples FROM pg_class WHERE relname = 'mytab';
relname | reltuples
---------+-----------
mytab | 2
(1 row)
SELECT relname, reltuples FROM pg_class WHERE relname = 'mytab_int_idx1';
relname | reltuples
----------------+-----------
mytab_int_idx1 | 2
(1 row)
-- @Description Tests the behavior when the index of an ao table
-- has not been cleaned (e.g. because of a crash) in combination
-- with a partial index.
CREATE TABLE uao_outdated_partial (a INT, b INT, c CHAR(128)) WITH (appendonly=true) DISTRIBUTED BY (a);
CREATE INDEX uao_outdated_partial_index ON uao_outdated_partial(b) WHERE b < 20;
INSERT INTO uao_outdated_partial SELECT i as a, i as b, 'hello world' as c FROM generate_series(1, 50) AS i;
INSERT INTO uao_outdated_partial SELECT i as a, i as b, 'hello world' as c FROM generate_series(51, 100) AS i;
ANALYZE uao_outdated_partial;
SET enable_seqscan=false;
DELETE FROM uao_outdated_partial WHERE a < 16;
VACUUM uao_outdated_partial;
SELECT * FROM uao_outdated_partial WHERE b = 20;
a | b | c
----+----+----------------------------------------------------------------------------------------------------------------------------------
20 | 20 | hello world
(1 row)
SELECT * FROM uao_outdated_partial WHERE b = 10;
a | b | c
---+---+---
(0 rows)
INSERT INTO uao_outdated_partial SELECT i as a, i as b, 'Good morning' as c FROM generate_series(101, 110) AS i;
SELECT * FROM uao_outdated_partial WHERE b = 10;
a | b | c
---+---+---
(0 rows)
SELECT * FROM uao_outdated_partial WHERE b = 102;
a | b | c
-----+-----+----------------------------------------------------------------------------------------------------------------------------------
102 | 102 | Good morning
(1 row)
-- @Description Tests the behavior when the index of an ao table
-- has not been cleaned (e.g. because of a crash).
CREATE TABLE uao_outdated (a INT, b INT, c CHAR(128)) WITH (appendonly=true) DISTRIBUTED BY (a);
CREATE INDEX uao_outdated_index ON uao_outdated(b);
INSERT INTO uao_outdated SELECT i as a, i as b, 'hello world' as c FROM generate_series(1, 50) AS i;
INSERT INTO uao_outdated SELECT i as a, i as b, 'hello world' as c FROM generate_series(51, 100) AS i;
ANALYZE uao_outdated;
SET enable_seqscan=false;
DELETE FROM uao_outdated WHERE a < 16;
VACUUM uao_outdated;
SELECT * FROM uao_outdated WHERE b = 20;
a | b | c
----+----+----------------------------------------------------------------------------------------------------------------------------------
20 | 20 | hello world
(1 row)
SELECT * FROM uao_outdated WHERE b = 10;
a | b | c
---+---+---
(0 rows)
INSERT INTO uao_outdated SELECT i as a, i as b, 'Good morning' as c FROM generate_series(1, 10) AS i;
SELECT * FROM uao_outdated WHERE b = 10;
a | b | c
----+----+----------------------------------------------------------------------------------------------------------------------------------
10 | 10 | Good morning
(1 row)
-- @Description Tests the behavior when the index of an ao table
-- has not been cleaned (e.g. because of a crash) in combination
-- with aborted inserts.
CREATE TABLE uao_index_abort_test (a INT, b INT, c CHAR(128)) WITH (appendonly=true) DISTRIBUTED BY (a);
CREATE INDEX uao_index_abort_test_index ON uao_index_abort_test(b);
INSERT INTO uao_index_abort_test SELECT i as a, i as b, 'hello world' as c FROM generate_series(1, 50) AS i;
INSERT INTO uao_index_abort_test SELECT i as a, i as b, 'hello world' as c FROM generate_series(51, 100) AS i;
ANALYZE uao_index_abort_test;
SET enable_seqscan=false;
DELETE FROM uao_index_abort_test WHERE a < 16;
VACUUM uao_index_abort_test;
SELECT * FROM uao_index_abort_test WHERE b = 20;
a | b | c
----+----+----------------------------------------------------------------------------------------------------------------------------------
20 | 20 | hello world
(1 row)
SELECT * FROM uao_index_abort_test WHERE b = 10;
a | b | c
---+---+---
(0 rows)
INSERT INTO uao_index_abort_test SELECT i as a, i as b, 'Good morning' as c FROM generate_series(1, 4) AS i;
BEGIN;
INSERT INTO uao_index_abort_test SELECT i as a, i as b, 'Good morning' as c FROM generate_series(5, 8) AS i;
INSERT INTO uao_index_abort_test SELECT i as a, i as b, 'Good morning' as c FROM generate_series(9, 12) AS i;
ROLLBACK;
SELECT * FROM uao_index_abort_test WHERE b < 16;
a | b | c
---+---+----------------------------------------------------------------------------------------------------------------------------------
1 | 1 | Good morning
2 | 2 | Good morning
3 | 3 | Good morning
4 | 4 | Good morning
(4 rows)
-- @Description Tests that the pg_class statistics are updated on
-- lazy vacuum.
CREATE TABLE uao_stats (a INT, b INT, c CHAR(128)) WITH (appendonly=true) DISTRIBUTED BY (a);
CREATE INDEX uao_stats_index ON uao_stats(b);
INSERT INTO uao_stats SELECT i as a, i as b, 'hello world' as c FROM generate_series(1, 50) AS i;
INSERT INTO uao_stats SELECT i as a, i as b, 'hello world' as c FROM generate_series(51, 100) AS i;
ANALYZE uao_stats;
-- ensure that the scan go through the index
SET enable_seqscan=false;
SELECT relname, reltuples FROM pg_class WHERE relname = 'uao_stats';
relname | reltuples
-----------+-----------
uao_stats | 100
(1 row)
SELECT relname, reltuples FROM pg_class WHERE relname = 'uao_stats_index';
relname | reltuples
-----------------+-----------
uao_stats_index | 100
(1 row)
DELETE FROM uao_stats WHERE a < 16;
VACUUM uao_stats;
SELECT relname, reltuples FROM pg_class WHERE relname = 'uao_stats';
relname | reltuples
-----------+-----------
uao_stats | 85
(1 row)
SELECT relname, reltuples FROM pg_class WHERE relname = 'uao_stats_index';
relname | reltuples
-----------------+-----------
uao_stats_index | 85
(1 row)
-- @Description Tests the basic behavior of (lazy) vacuum w.r.t. to the threshold guc.
-- The output depends on the number of segments as the skip decision and the
-- notify is done on the segments.
CREATE TABLE uao_threshold (a INT, b INT, c CHAR(128)) WITH (appendonly=true);
CREATE INDEX uao_threshold_index ON uao_threshold(b);
INSERT INTO uao_threshold SELECT i as a, 1 as b, 'hello world' as c FROM generate_series(1, 100) AS i;
\set QUIET off
VACUUM uao_threshold;
VACUUM
DELETE FROM uao_threshold WHERE a < 4;
DELETE 3
SELECT COUNT(*) FROM uao_threshold;
count
-------
97
(1 row)
SELECT segno, tupcount, state FROM gp_toolkit.__gp_aoseg_name('uao_threshold');
segno | tupcount | state
-------+----------+-------
1 | 100 | 1
(1 row)
-- 97 visible tuples, no vacuum
VACUUM uao_threshold;
VACUUM
SELECT segno, tupcount, state FROM gp_toolkit.__gp_aoseg_name('uao_threshold');
segno | tupcount | state
-------+----------+-------
1 | 100 | 1
(1 row)
DELETE FROM uao_threshold WHERE a < 12;
DELETE 8
SELECT segno, tupcount, state FROM gp_toolkit.__gp_aoseg_name('uao_threshold');
segno | tupcount | state
-------+----------+-------
1 | 100 | 1
(1 row)
-- 89 visible tuples, do vacuum
VACUUM uao_threshold;
VACUUM
SELECT segno, tupcount, state FROM gp_toolkit.__gp_aoseg_name('uao_threshold');
segno | tupcount | state
-------+----------+-------
1 | 50 | 1
2 | 44 | 1
(2 rows)
-- no invisible tuples, no vacuum
VACUUM uao_threshold;
VACUUM
SELECT segno, tupcount, state FROM gp_toolkit.__gp_aoseg_name('uao_threshold');
segno | tupcount | state
-------+----------+-------
1 | 50 | 1
2 | 44 | 1
(2 rows)
DELETE FROM uao_threshold WHERE a < 15;
DELETE 3
SELECT segno, tupcount, state FROM gp_toolkit.__gp_aoseg_name('uao_threshold');
segno | tupcount | state
-------+----------+-------
1 | 50 | 1
2 | 44 | 1
(2 rows)
-- 3 invisible tuples, no vacuum
VACUUM uao_threshold;
VACUUM
SELECT segno, tupcount, state FROM gp_toolkit.__gp_aoseg_name('uao_threshold');
segno | tupcount | state
-------+----------+-------
1 | 0 | 1
2 | 44 | 1
3 | 43 | 1
(3 rows)
SET gp_appendonly_compaction_threshold=2;
SET
-- 3 invisible tuples, no vacuum
VACUUM uao_threshold;
VACUUM
SELECT segno, tupcount, state FROM gp_toolkit.__gp_aoseg_name('uao_threshold');
segno | tupcount | state
-------+----------+-------
1 | 0 | 1
2 | 44 | 1
3 | 43 | 1
(3 rows)
......@@ -88,4 +88,26 @@ ignore: tpch500GB_orca
# so what's the point of that? Anyhow, the test is disabled for now..
#test: orca_udfs
# Tests for "compaction", i.e. VACUUM, of updatable append-only tables
test: uao_compaction/full_stats
test: uao_compaction/full
test: uao_compaction/alter_table_analyze2
test: uao_compaction/index2
test: uao_compaction/outdated_partialindex
test: uao_compaction/index_stats
test: uao_compaction/drop_column_update
test: uao_compaction/eof_truncate
test: uao_compaction/basic
test: uao_compaction/index
test: uao_compaction/threshold
test: uao_compaction/outdatedindex
test: uao_compaction/update_toast
test: uao_compaction/outdatedindex_abort
test: uao_compaction/delete_toast
test: uao_compaction/stats
test: uao_compaction/drop_column
test: uao_compaction/alter_table_analyze
test: uao_compaction/full_eof_truncate
test: uao_compaction/full_threshold
# end of tests
......@@ -18,6 +18,9 @@
#include "pg_regress.h"
#include <sys/stat.h>
#include <sys/types.h>
/*
* start a psql test process for specified file (including redirection),
* and return process ID
......@@ -34,6 +37,7 @@ psql_start_test(const char *testname,
char expectfile[MAXPGPATH] = "";
char psql_cmd[MAXPGPATH * 3];
char use_utility_mode = 0;
char *lastslash;
/* generalise later */
if (strcmp(testname, "upg2") == 0)
......@@ -54,6 +58,31 @@ psql_start_test(const char *testname,
snprintf(outfile, sizeof(outfile), "%s/results/%s.out",
outputdir, testname);
/*
* If the test name contains slashes, create intermediary results
* directory.
*/
if ((lastslash = strrchr(outfile, '/')) != NULL)
{
char resultdir[MAXPGPATH];
memcpy(resultdir, outfile, lastslash - outfile);
resultdir[lastslash - outfile] = '\0';
if (mkdir(resultdir, S_IRWXU | S_IRWXG | S_IRWXO) < 0)
{
if (errno == EEXIST)
{
/* exists already, that's OK */
}
else
{
fprintf(stderr, _("could not create directory \"%s\": %s\n"),
resultdir, strerror(errno));
exit_nicely(2);
}
}
}
if (optimizer_enabled)
{
snprintf(expectfile, sizeof(expectfile), "%s/expected/%s_optimizer.out",
......
-- @Description Checks analyze and drop column interfaction
CREATE TABLE ck_ct_ao_analyze1(
text_col text,
bigint_col bigint,
char_vary_col character varying(30),
numeric_col numeric,
int_col int4,
float_col float4,
int_array_col int[],
drop_col numeric,
before_rename_col int4,
change_datatype_col numeric,
a_ts_without timestamp without time zone,
b_ts_with timestamp with time zone,
date_column date) with (appendonly=true) distributed randomly;
INSERT INTO ck_ct_ao_analyze1 values ('0_zero', 0, '0_zero', 0, 0, 0, '{0}', 0, 0, 0, '2004-10-19 10:23:54', '2004-10-19 10:23:54+02', '1-1-2000');
INSERT INTO ck_ct_ao_analyze1 values ('1_zero', 1, '1_zero', 1, 1, 1, '{1}', 1, 1, 1, '2005-10-19 10:23:54', '2005-10-19 10:23:54+02', '1-1-2001');
INSERT INTO ck_ct_ao_analyze1 values ('2_zero', 2, '2_zero', 2, 2, 2, '{2}', 2, 2, 2, '2006-10-19 10:23:54', '2006-10-19 10:23:54+02', '1-1-2002');
select count(*) AS only_visi_tups_ins from ck_ct_ao_analyze1;
set gp_select_invisible = true;
select count(*) AS invisi_and_visi_tups_ins from ck_ct_ao_analyze1;
set gp_select_invisible = false;
update ck_ct_ao_analyze1 set bigint_col = bigint_col + 1 where text_col = '0_zero';
select count(*) AS only_visi_tups_upd from ck_ct_ao_analyze1;
set gp_select_invisible = true;
select count(*) AS invisi_and_visi_tups_upd from ck_ct_ao_analyze1;
set gp_select_invisible = false;
delete from ck_ct_ao_analyze1 where int_col = 2;
select count(*) AS only_visi_tups_del from ck_ct_ao_analyze1;
set gp_select_invisible = true;
select count(*) AS invisi_and_visi_tups_del from ck_ct_ao_analyze1;
set gp_select_invisible = false;
--
ALTER TABLE ck_ct_ao_analyze1 ADD COLUMN added_col character varying(30) default 'test_value';
ALTER TABLE ck_ct_ao_analyze1 DROP COLUMN drop_col ;
ALTER TABLE ck_ct_ao_analyze1 RENAME COLUMN before_rename_col TO after_rename_col;
ALTER TABLE ck_ct_ao_analyze1 ALTER COLUMN change_datatype_col TYPE int4;
ALTER TABLE ck_ct_ao_analyze1 set with ( reorganize='true') distributed by (int_col);
--
--
INSERT INTO ck_ct_ao_analyze1 values ('1_zero', 1, '1_zero', 1, 1, 1, '{1}', 1, 1, '2005-10-19 10:23:54', '2005-10-19 10:23:54+02', '1-1-2001');
INSERT INTO ck_ct_ao_analyze1 values ('2_zero', 2, '2_zero', 2, 2, 2, '{2}', 2, 2, '2006-10-19 10:23:54', '2006-10-19 10:23:54+02', '1-1-2002');
INSERT INTO ck_ct_ao_analyze1 values ('3_zero', 3, '3_zero', 0, 0, 0, '{0}', 0, 0, '2004-10-19 10:23:54', '2004-10-19 10:23:54+02', '1-1-2000');
update ck_ct_ao_analyze1 set bigint_col = bigint_col + 1 where text_col = '1_zero';
ANALYZE ck_ct_ao_analyze1;
-- @Description Checks analyze and drop column interfaction
CREATE TABLE ck_ct_ao_analyze2(
text_col text,
bigint_col bigint,
char_vary_col character varying(30),
numeric_col numeric,
int_col int4,
float_col float4,
int_array_col int[],
drop_col numeric,
before_rename_col int4,
change_datatype_col numeric,
a_ts_without timestamp without time zone,
b_ts_with timestamp with time zone,
date_column date) with (appendonly=true) distributed randomly;
INSERT INTO ck_ct_ao_analyze2 values ('0_zero', 0, '0_zero', 0, 0, 0, '{0}', 0, 0, 0, '2004-10-19 10:23:54', '2004-10-19 10:23:54+02', '1-1-2000');
INSERT INTO ck_ct_ao_analyze2 values ('1_zero', 1, '1_zero', 1, 1, 1, '{1}', 1, 1, 1, '2005-10-19 10:23:54', '2005-10-19 10:23:54+02', '1-1-2001');
INSERT INTO ck_ct_ao_analyze2 values ('2_zero', 2, '2_zero', 2, 2, 2, '{2}', 2, 2, 2, '2006-10-19 10:23:54', '2006-10-19 10:23:54+02', '1-1-2002');
select count(*) AS only_visi_tups_ins from ck_ct_ao_analyze2;
set gp_select_invisible = true;
select count(*) AS invisi_and_visi_tups_ins from ck_ct_ao_analyze2;
set gp_select_invisible = false;
update ck_ct_ao_analyze2 set bigint_col = bigint_col + 1 where text_col = '0_zero';
select count(*) AS only_visi_tups_upd from ck_ct_ao_analyze2;
set gp_select_invisible = true;
select count(*) AS invisi_and_visi_tups_upd from ck_ct_ao_analyze2;
set gp_select_invisible = false;
delete from ck_ct_ao_analyze2 where int_col = 2;
select count(*) AS only_visi_tups_del from ck_ct_ao_analyze2;
set gp_select_invisible = true;
select count(*) AS invisi_and_visi_tups_del from ck_ct_ao_analyze2;
set gp_select_invisible = false;
--
ALTER TABLE ck_ct_ao_analyze2 ADD COLUMN added_col character varying(30) default 'test_value';
ALTER TABLE ck_ct_ao_analyze2 DROP COLUMN drop_col ;
ALTER TABLE ck_ct_ao_analyze2 RENAME COLUMN before_rename_col TO after_rename_col;
ALTER TABLE ck_ct_ao_analyze2 ALTER COLUMN change_datatype_col TYPE int4;
ALTER TABLE ck_ct_ao_analyze2 set with ( reorganize='true') distributed by (int_col);
update ck_ct_ao_analyze2 set bigint_col = bigint_col + 1 where text_col = '1_zero';
ANALYZE ck_ct_ao_analyze2;
-- @Description Basic lazy vacuum
CREATE TABLE uao_basic (a INT, b INT, c CHAR(128)) WITH (appendonly=true);
CREATE INDEX uao_basic_index ON uao_basic(b);
INSERT INTO uao_basic SELECT i as a, 1 as b, 'hello world' as c FROM generate_series(1, 10) AS i;
INSERT INTO uao_basic SELECT i as a, 1 as b, 'hello world' as c FROM generate_series(1, 10) AS i;
DELETE FROM uao_basic WHERE a < 4;
SELECT COUNT(*) FROM uao_basic;
VACUUM uao_basic;
-- check if we get the same result afterwards
SELECT COUNT(*) FROM uao_basic;
-- check if we can still insert into the relation
INSERT INTO uao_basic VALUES (11, 11);
SELECT COUNT(*) FROM uao_basic;
-- @Description Checkes the deletion and vacuuming of toast values
-- Create a table with toasted values.
CREATE TABLE uao_delete_toast (a INT, b INT, c VARCHAR) WITH (appendonly=true) DISTRIBUTED BY (a);
CREATE INDEX uao_delete_toast_index ON uao_delete_toast(b);
INSERT INTO uao_delete_toast SELECT i as a, 1 as b, i::text || '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' as c FROM generate_series(1, 10) AS i;
DELETE FROM uao_delete_toast;
VACUUM uao_delete_toast;
-- @Description Tests dropping a column after a compaction
CREATE TABLE uao_drop_col (a INT, b INT, c CHAR(128)) WITH (appendonly=true) DISTRIBUTED BY (a);
CREATE INDEX uao_drop_col_index ON uao_drop_col(b);
INSERT INTO uao_drop_col SELECT i as a, 1 as b, 'hello world' as c FROM generate_series(1, 10) AS i;
DELETE FROM uao_drop_col WHERE a < 4;
SELECT COUNT(*) FROM uao_drop_col;
SELECT relname, reltuples FROM pg_class WHERE relname = 'uao_drop_col';
SELECT relname, reltuples FROM pg_class WHERE relname = 'uao_drop_col_index';
VACUUM uao_drop_col;
SELECT relname, reltuples FROM pg_class WHERE relname = 'uao_drop_col';
SELECT relname, reltuples FROM pg_class WHERE relname = 'uao_drop_col_index';
ALTER TABLE uao_drop_col DROP COLUMN c;
SELECT * FROM uao_drop_col;
INSERT INTO uao_drop_col VALUES (42, 42);
SELECT * FROM uao_drop_col;
-- @Description Tests dropping a column after a compaction with update
CREATE TABLE ck_ct_ao_analyze3(
text_col text,
bigint_col bigint,
char_vary_col character varying(30),
int_array_col int[],
drop_col numeric) with (appendonly=true);
INSERT INTO ck_ct_ao_analyze3 values ('1_zero', 1, '1_zero', '{1}', 1);
ALTER TABLE ck_ct_ao_analyze3 DROP COLUMN drop_col;
Select char_vary_col, int_array_col from ck_ct_ao_analyze3;
INSERT INTO ck_ct_ao_analyze3 values ('2_zero', 2, '2_zero', '{2}');
update ck_ct_ao_analyze3 set bigint_col = bigint_col + 1 where text_col = '1_zero';
Select char_vary_col, int_array_col from ck_ct_ao_analyze3;
-- @Description Tests the behavior while compacting is disabled
CREATE TABLE uao_eof_truncate (a INT, b INT, c CHAR(128)) WITH (appendonly=true);
CREATE INDEX uao_eof_truncate_index ON uao_eof_truncate(b);
BEGIN;
INSERT INTO uao_eof_truncate SELECT i as a, 1 as b, 'hello world' as c FROM generate_series(1,1000) AS i;
COMMIT;
BEGIN;
INSERT INTO uao_eof_truncate SELECT i as a, 1 as b, 'hello world' as c FROM generate_series(1000,2000) AS i;
ROLLBACK;
SET gp_appendonly_compaction=false;
SELECT COUNT(*) FROM uao_eof_truncate;
VACUUM uao_eof_truncate;
SELECT COUNT(*) FROM uao_eof_truncate;
-- Insert afterwards
INSERT INTO uao_eof_truncate SELECT i as a, 1 as b, 'hello world' as c FROM generate_series(1,10) AS i;
SELECT COUNT(*) FROM uao_eof_truncate;
-- @Description Test the basic bahavior of vacuum full
CREATE TABLE uao_full (a INT, b INT, c CHAR(128)) WITH (appendonly=true);
CREATE INDEX uao_full_index ON uao_full(b);
INSERT INTO uao_full SELECT i as a, 1 as b, 'hello world' as c FROM generate_series(1,10) AS i;
INSERT INTO uao_full SELECT i as a, 1 as b, 'hello world' as c FROM generate_series(1,10) AS i;
DELETE FROM uao_full WHERE a < 4;
SELECT COUNT(*) FROM uao_full;
VACUUM FULL uao_full;
-- check if we get the same result afterwards
SELECT COUNT(*) FROM uao_full;
-- check if we can still insert into the relation
INSERT INTO uao_full VALUES (11, 11);
SELECT COUNT(*) FROM uao_full;
-- @Description Tests the behavior while compacting is disabled
CREATE TABLE full_eof_truncate (a INT, b INT, c CHAR(128)) WITH (appendonly=true);
CREATE INDEX full_eof_truncate_index ON full_eof_truncate(b);
BEGIN;
INSERT INTO full_eof_truncate SELECT i as a, 1 as b, 'hello world' as c FROM generate_series(1,1000) AS i;
COMMIT;
BEGIN;
INSERT INTO full_eof_truncate SELECT i as a, 1 as b, 'hello world' as c FROM generate_series(1000,2000) AS i;
ROLLBACK;
SET gp_appendonly_compaction=false;
SELECT COUNT(*) FROM full_eof_truncate;
VACUUM FULL full_eof_truncate;
SELECT COUNT(*) FROM full_eof_truncate;
-- Insert afterwards
INSERT INTO full_eof_truncate SELECT i as a, 1 as b, 'hello world' as c FROM generate_series(1,10) AS i;
SELECT COUNT(*) FROM full_eof_truncate;
-- @Description Tests the behavior of full vacuum w.r.t. the pg_class statistics
CREATE TABLE uao_full_stats (a INT, b INT, c CHAR(128)) WITH (appendonly=true) DISTRIBUTED BY (a);
CREATE INDEX uao_full_stats_index ON uao_full_stats(b);
INSERT INTO uao_full_stats SELECT i as a, i as b, 'hello world' as c FROM generate_series(1, 50) AS i;
INSERT INTO uao_full_stats SELECT i as a, i as b, 'hello world' as c FROM generate_series(51, 100) AS i;
ANALYZE uao_full_stats;
-- ensure that the scan go through the index
SET enable_seqscan=false;
SELECT relname, reltuples FROM pg_class WHERE relname = 'uao_full_stats';
SELECT relname, reltuples FROM pg_class WHERE relname = 'uao_full_stats_index';
DELETE FROM uao_full_stats WHERE a < 16;
VACUUM FULL uao_full_stats;
SELECT relname, reltuples FROM pg_class WHERE relname = 'uao_full_stats';
SELECT relname, reltuples FROM pg_class WHERE relname = 'uao_full_stats_index';
-- @Description Tests that that full vacuum is ignoring the threshold guc value.
CREATE TABLE uao_full_threshold (a INT, b INT, c CHAR(128)) WITH (appendonly=true) DISTRIBUTED BY (a);
CREATE INDEX uao_full_threshold_index ON uao_full_threshold(b);
INSERT INTO uao_full_threshold SELECT i as a, 1 as b, 'hello world' as c FROM generate_series(1, 100) AS i;
VACUUM FULL uao_full_threshold;
DELETE FROM uao_full_threshold WHERE a < 4;
SET gp_appendonly_compaction_threshold=100;
VACUUM FULL uao_full_threshold;
-- @Description Tests basic index usage behavior after vacuuming
CREATE TABLE uao_index_test (a INT, b INT, c CHAR(128)) WITH (appendonly=true);
CREATE INDEX uao_index_test_index ON uao_index_test(b);
INSERT INTO uao_index_test SELECT i as a, i as b, 'hello world' as c FROM generate_series(1,10) AS i;
INSERT INTO uao_index_test SELECT i as a, i as b, 'hello world' as c FROM generate_series(1,10) AS i;
VACUUM uao_index_test;
SELECT * FROM uao_index_test WHERE b = 5;
-- Test index usage after vacuuming.
-- Bug verification for MPP-24913
CREATE TABLE table_index2 (a BIGINT, b BIGINT) WITH (appendonly=true);
CREATE INDEX table_index2_index_a ON table_index2(a);
CREATE INDEX table_index2_index_b ON table_index2(b);
\set QUIET off
INSERT INTO table_index2 SELECT *,* FROM generate_series(1, 347305);
INSERT INTO table_index2 SELECT *,* FROM generate_series(1, 347305);
UPDATE table_index2 SET b=100 WHERE a < 347305;
INSERT INTO table_index2 SELECT *,* FROM generate_series(1, 347305);
UPDATE table_index2 SET b=100 WHERE a < 347305;
INSERT INTO table_index2 SELECT *,* FROM generate_series(1, 347305);
INSERT INTO table_index2 SELECT *,* FROM generate_series(1, 347305);
UPDATE table_index2 SET b=101 WHERE b = 100;
VACUUM table_index2;
UPDATE table_index2 SET b=102 WHERE b = 101;
VACUUM table_index2;
SELECT COUNT(*) FROM table_index2;
SET enable_seqscan=OFF;
SELECT COUNT(*) FROM table_index2 WHERE a > 0;
-- @Description Tests basic index stats after vacuuming
CREATE TABLE mytab(
col_int int,
col_text text,
col_numeric numeric,
col_unq int
) with(appendonly=true) DISTRIBUTED RANDOMLY;
Create index mytab_int_idx1 on mytab(col_int);
insert into mytab values(1,'aa',1001,101),(2,'bb',1002,102);
select * from mytab;
update mytab set col_text=' new value' where col_int = 1;
select * from mytab;
vacuum mytab;
SELECT relname, reltuples FROM pg_class WHERE relname = 'mytab';
SELECT relname, reltuples FROM pg_class WHERE relname = 'mytab_int_idx1';
-- @Description Tests the behavior when the index of an ao table
-- has not been cleaned (e.g. because of a crash) in combination
-- with a partial index.
CREATE TABLE uao_outdated_partial (a INT, b INT, c CHAR(128)) WITH (appendonly=true) DISTRIBUTED BY (a);
CREATE INDEX uao_outdated_partial_index ON uao_outdated_partial(b) WHERE b < 20;
INSERT INTO uao_outdated_partial SELECT i as a, i as b, 'hello world' as c FROM generate_series(1, 50) AS i;
INSERT INTO uao_outdated_partial SELECT i as a, i as b, 'hello world' as c FROM generate_series(51, 100) AS i;
ANALYZE uao_outdated_partial;
SET enable_seqscan=false;
DELETE FROM uao_outdated_partial WHERE a < 16;
VACUUM uao_outdated_partial;
SELECT * FROM uao_outdated_partial WHERE b = 20;
SELECT * FROM uao_outdated_partial WHERE b = 10;
INSERT INTO uao_outdated_partial SELECT i as a, i as b, 'Good morning' as c FROM generate_series(101, 110) AS i;
SELECT * FROM uao_outdated_partial WHERE b = 10;
SELECT * FROM uao_outdated_partial WHERE b = 102;
-- @Description Tests the behavior when the index of an ao table
-- has not been cleaned (e.g. because of a crash).
CREATE TABLE uao_outdated (a INT, b INT, c CHAR(128)) WITH (appendonly=true) DISTRIBUTED BY (a);
CREATE INDEX uao_outdated_index ON uao_outdated(b);
INSERT INTO uao_outdated SELECT i as a, i as b, 'hello world' as c FROM generate_series(1, 50) AS i;
INSERT INTO uao_outdated SELECT i as a, i as b, 'hello world' as c FROM generate_series(51, 100) AS i;
ANALYZE uao_outdated;
SET enable_seqscan=false;
DELETE FROM uao_outdated WHERE a < 16;
VACUUM uao_outdated;
SELECT * FROM uao_outdated WHERE b = 20;
SELECT * FROM uao_outdated WHERE b = 10;
INSERT INTO uao_outdated SELECT i as a, i as b, 'Good morning' as c FROM generate_series(1, 10) AS i;
SELECT * FROM uao_outdated WHERE b = 10;
-- @Description Tests the behavior when the index of an ao table
-- has not been cleaned (e.g. because of a crash) in combination
-- with aborted inserts.
CREATE TABLE uao_index_abort_test (a INT, b INT, c CHAR(128)) WITH (appendonly=true) DISTRIBUTED BY (a);
CREATE INDEX uao_index_abort_test_index ON uao_index_abort_test(b);
INSERT INTO uao_index_abort_test SELECT i as a, i as b, 'hello world' as c FROM generate_series(1, 50) AS i;
INSERT INTO uao_index_abort_test SELECT i as a, i as b, 'hello world' as c FROM generate_series(51, 100) AS i;
ANALYZE uao_index_abort_test;
SET enable_seqscan=false;
DELETE FROM uao_index_abort_test WHERE a < 16;
VACUUM uao_index_abort_test;
SELECT * FROM uao_index_abort_test WHERE b = 20;
SELECT * FROM uao_index_abort_test WHERE b = 10;
INSERT INTO uao_index_abort_test SELECT i as a, i as b, 'Good morning' as c FROM generate_series(1, 4) AS i;
BEGIN;
INSERT INTO uao_index_abort_test SELECT i as a, i as b, 'Good morning' as c FROM generate_series(5, 8) AS i;
INSERT INTO uao_index_abort_test SELECT i as a, i as b, 'Good morning' as c FROM generate_series(9, 12) AS i;
ROLLBACK;
SELECT * FROM uao_index_abort_test WHERE b < 16;
-- @Description Tests that the pg_class statistics are updated on
-- lazy vacuum.
CREATE TABLE uao_stats (a INT, b INT, c CHAR(128)) WITH (appendonly=true) DISTRIBUTED BY (a);
CREATE INDEX uao_stats_index ON uao_stats(b);
INSERT INTO uao_stats SELECT i as a, i as b, 'hello world' as c FROM generate_series(1, 50) AS i;
INSERT INTO uao_stats SELECT i as a, i as b, 'hello world' as c FROM generate_series(51, 100) AS i;
ANALYZE uao_stats;
-- ensure that the scan go through the index
SET enable_seqscan=false;
SELECT relname, reltuples FROM pg_class WHERE relname = 'uao_stats';
SELECT relname, reltuples FROM pg_class WHERE relname = 'uao_stats_index';
DELETE FROM uao_stats WHERE a < 16;
VACUUM uao_stats;
SELECT relname, reltuples FROM pg_class WHERE relname = 'uao_stats';
SELECT relname, reltuples FROM pg_class WHERE relname = 'uao_stats_index';
-- @Description Tests the basic behavior of (lazy) vacuum w.r.t. to the threshold guc.
-- The output depends on the number of segments as the skip decision and the
-- notify is done on the segments.
CREATE TABLE uao_threshold (a INT, b INT, c CHAR(128)) WITH (appendonly=true);
CREATE INDEX uao_threshold_index ON uao_threshold(b);
INSERT INTO uao_threshold SELECT i as a, 1 as b, 'hello world' as c FROM generate_series(1, 100) AS i;
\set QUIET off
VACUUM uao_threshold;
DELETE FROM uao_threshold WHERE a < 4;
SELECT COUNT(*) FROM uao_threshold;
SELECT segno, tupcount, state FROM gp_toolkit.__gp_aoseg_name('uao_threshold');
-- 97 visible tuples, no vacuum
VACUUM uao_threshold;
SELECT segno, tupcount, state FROM gp_toolkit.__gp_aoseg_name('uao_threshold');
DELETE FROM uao_threshold WHERE a < 12;
SELECT segno, tupcount, state FROM gp_toolkit.__gp_aoseg_name('uao_threshold');
-- 89 visible tuples, do vacuum
VACUUM uao_threshold;
SELECT segno, tupcount, state FROM gp_toolkit.__gp_aoseg_name('uao_threshold');
-- no invisible tuples, no vacuum
VACUUM uao_threshold;
SELECT segno, tupcount, state FROM gp_toolkit.__gp_aoseg_name('uao_threshold');
DELETE FROM uao_threshold WHERE a < 15;
SELECT segno, tupcount, state FROM gp_toolkit.__gp_aoseg_name('uao_threshold');
-- 3 invisible tuples, no vacuum
VACUUM uao_threshold;
SELECT segno, tupcount, state FROM gp_toolkit.__gp_aoseg_name('uao_threshold');
SET gp_appendonly_compaction_threshold=2;
-- 3 invisible tuples, no vacuum
VACUUM uao_threshold;
SELECT segno, tupcount, state FROM gp_toolkit.__gp_aoseg_name('uao_threshold');
此差异已折叠。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册