118 lines
4.0 KiB
Python
118 lines
4.0 KiB
Python
# Test for page level predicate locking in gist
|
|
#
|
|
# Test to verify serialization failures and to check reduced false positives
|
|
#
|
|
# To verify serialization failures, queries and permutations are written in such
|
|
# a way that an index scan (from one transaction) and an index insert (from
|
|
# another transaction) will try to access the same part (sub-tree) of the index
|
|
# whereas to check reduced false positives, they will try to access different
|
|
# parts (sub-tree) of the index.
|
|
|
|
setup
|
|
{
|
|
create table gist_point_tbl(id int4, p point);
|
|
create index gist_pointidx on gist_point_tbl using gist(p);
|
|
insert into gist_point_tbl (id, p)
|
|
select g, point(g*10, g*10) from generate_series(1, 1000) g;
|
|
}
|
|
|
|
teardown
|
|
{
|
|
drop table gist_point_tbl;
|
|
}
|
|
|
|
session s1
|
|
setup
|
|
{
|
|
begin isolation level serializable;
|
|
set enable_seqscan=off;
|
|
set enable_bitmapscan=off;
|
|
set enable_indexonlyscan=on;
|
|
}
|
|
|
|
step rxy1 { select sum(p[0]) from gist_point_tbl where p << point(2500, 2500); }
|
|
step wx1 { insert into gist_point_tbl (id, p)
|
|
select g, point(g*500, g*500) from generate_series(15, 20) g; }
|
|
step rxy3 { select sum(p[0]) from gist_point_tbl where p >> point(6000,6000); }
|
|
step wx3 { insert into gist_point_tbl (id, p)
|
|
select g, point(g*500, g*500) from generate_series(12, 18) g; }
|
|
step c1 { commit; }
|
|
|
|
|
|
session s2
|
|
setup
|
|
{
|
|
begin isolation level serializable;
|
|
set enable_seqscan=off;
|
|
set enable_bitmapscan=off;
|
|
set enable_indexonlyscan=on;
|
|
}
|
|
|
|
step rxy2 { select sum(p[0]) from gist_point_tbl where p >> point(7500,7500); }
|
|
step wy2 { insert into gist_point_tbl (id, p)
|
|
select g, point(g*500, g*500) from generate_series(1, 5) g; }
|
|
step rxy4 { select sum(p[0]) from gist_point_tbl where p << point(1000,1000); }
|
|
step wy4 { insert into gist_point_tbl (id, p)
|
|
select g, point(g*50, g*50) from generate_series(1, 20) g; }
|
|
step c2 { commit; }
|
|
|
|
# An index scan (from one transaction) and an index insert (from another
|
|
# transaction) try to access the same part of the index but one transaction
|
|
# commits before other transaction begins so no r-w conflict.
|
|
|
|
permutation rxy1 wx1 c1 rxy2 wy2 c2
|
|
permutation rxy2 wy2 c2 rxy1 wx1 c1
|
|
|
|
# An index scan (from one transaction) and an index insert (from another
|
|
# transaction) try to access different parts of the index and also one
|
|
# transaction commits before other transaction begins, so no r-w conflict.
|
|
|
|
permutation rxy3 wx3 c1 rxy4 wy4 c2
|
|
permutation rxy4 wy4 c2 rxy3 wx3 c1
|
|
|
|
|
|
# An index scan (from one transaction) and an index insert (from another
|
|
# transaction) try to access the same part of the index and one transaction
|
|
# begins before other transaction commits so there is a r-w conflict.
|
|
|
|
permutation rxy1 wx1 rxy2 c1 wy2 c2
|
|
permutation rxy1 wx1 rxy2 wy2 c1 c2
|
|
permutation rxy1 wx1 rxy2 wy2 c2 c1
|
|
permutation rxy1 rxy2 wx1 c1 wy2 c2
|
|
permutation rxy1 rxy2 wx1 wy2 c1 c2
|
|
permutation rxy1 rxy2 wx1 wy2 c2 c1
|
|
permutation rxy1 rxy2 wy2 wx1 c1 c2
|
|
permutation rxy1 rxy2 wy2 wx1 c2 c1
|
|
permutation rxy1 rxy2 wy2 c2 wx1 c1
|
|
permutation rxy2 rxy1 wx1 c1 wy2 c2
|
|
permutation rxy2 rxy1 wx1 wy2 c1 c2
|
|
permutation rxy2 rxy1 wx1 wy2 c2 c1
|
|
permutation rxy2 rxy1 wy2 wx1 c1 c2
|
|
permutation rxy2 rxy1 wy2 wx1 c2 c1
|
|
permutation rxy2 rxy1 wy2 c2 wx1 c1
|
|
permutation rxy2 wy2 rxy1 wx1 c1 c2
|
|
permutation rxy2 wy2 rxy1 wx1 c2 c1
|
|
permutation rxy2 wy2 rxy1 c2 wx1 c1
|
|
|
|
# An index scan (from one transaction) and an index insert (from another
|
|
# transaction) try to access different parts of the index so no r-w conflict.
|
|
|
|
permutation rxy3 wx3 rxy4 c1 wy4 c2
|
|
permutation rxy3 wx3 rxy4 wy4 c1 c2
|
|
permutation rxy3 wx3 rxy4 wy4 c2 c1
|
|
permutation rxy3 rxy4 wx3 c1 wy4 c2
|
|
permutation rxy3 rxy4 wx3 wy4 c1 c2
|
|
permutation rxy3 rxy4 wx3 wy4 c2 c1
|
|
permutation rxy3 rxy4 wy4 wx3 c1 c2
|
|
permutation rxy3 rxy4 wy4 wx3 c2 c1
|
|
permutation rxy3 rxy4 wy4 c2 wx3 c1
|
|
permutation rxy4 rxy3 wx3 c1 wy4 c2
|
|
permutation rxy4 rxy3 wx3 wy4 c1 c2
|
|
permutation rxy4 rxy3 wx3 wy4 c2 c1
|
|
permutation rxy4 rxy3 wy4 wx3 c1 c2
|
|
permutation rxy4 rxy3 wy4 wx3 c2 c1
|
|
permutation rxy4 rxy3 wy4 c2 wx3 c1
|
|
permutation rxy4 wy4 rxy3 wx3 c1 c2
|
|
permutation rxy4 wy4 rxy3 wx3 c2 c1
|
|
permutation rxy4 wy4 rxy3 c2 wx3 c1
|