mirror of
https://github.com/postgres/postgres.git
synced 2025-05-06 19:59:18 +03:00
Test some more cases with partitioned tables in EvalPlanQual.
We weren't testing anything involving EPQ on UPDATEs that move tuples into different partitions. Depending on the implementation, it might be that these cases aren't actually very interesting ... but given our thin coverage of EPQ in general, I think it's a good idea to have a test case. Amit Langote, minor tweak by me Discussion: https://postgr.es/m/7889df35-ad1a-691a-00e3-4d4b18f364e3@lab.ntt.co.jp
This commit is contained in:
parent
ba3fb5d4fb
commit
a2418f9e23
@ -641,3 +641,55 @@ step complexpartupdate:
|
||||
step c1: COMMIT;
|
||||
step complexpartupdate: <... completed>
|
||||
step c2: COMMIT;
|
||||
|
||||
starting permutation: simplepartupdate_route1to2 complexpartupdate_route_err1 c1 c2
|
||||
step simplepartupdate_route1to2:
|
||||
update parttbl set a = 2 where c = 1 returning *;
|
||||
|
||||
a b c
|
||||
|
||||
2 1 1
|
||||
step complexpartupdate_route_err1:
|
||||
with u as (update another_parttbl set a = 1 returning another_parttbl.*)
|
||||
update parttbl p set a = u.a from u where p.a = u.a and p.c = 1 returning p.*;
|
||||
<waiting ...>
|
||||
step c1: COMMIT;
|
||||
step complexpartupdate_route_err1: <... completed>
|
||||
error in steps c1 complexpartupdate_route_err1: ERROR: tuple to be locked was already moved to another partition due to concurrent update
|
||||
step c2: COMMIT;
|
||||
|
||||
starting permutation: simplepartupdate_noroute complexpartupdate_route c1 c2
|
||||
step simplepartupdate_noroute:
|
||||
update parttbl set b = 2 where c = 1 returning *;
|
||||
|
||||
a b c
|
||||
|
||||
1 2 1
|
||||
step complexpartupdate_route:
|
||||
with u as (update another_parttbl set a = 1 returning another_parttbl.*)
|
||||
update parttbl p set a = p.b from u where p.a = u.a and p.c = 1 returning p.*;
|
||||
<waiting ...>
|
||||
step c1: COMMIT;
|
||||
step complexpartupdate_route: <... completed>
|
||||
a b c
|
||||
|
||||
2 2 1
|
||||
step c2: COMMIT;
|
||||
|
||||
starting permutation: simplepartupdate_noroute complexpartupdate_doesnt_route c1 c2
|
||||
step simplepartupdate_noroute:
|
||||
update parttbl set b = 2 where c = 1 returning *;
|
||||
|
||||
a b c
|
||||
|
||||
1 2 1
|
||||
step complexpartupdate_doesnt_route:
|
||||
with u as (update another_parttbl set a = 1 returning another_parttbl.*)
|
||||
update parttbl p set a = 3 - p.b from u where p.a = u.a and p.c = 1 returning p.*;
|
||||
<waiting ...>
|
||||
step c1: COMMIT;
|
||||
step complexpartupdate_doesnt_route: <... completed>
|
||||
a b c
|
||||
|
||||
1 2 1
|
||||
step c2: COMMIT;
|
||||
|
@ -33,9 +33,15 @@ setup
|
||||
CREATE TABLE jointest AS SELECT generate_series(1,10) AS id, 0 AS data;
|
||||
CREATE INDEX ON jointest(id);
|
||||
|
||||
CREATE TABLE parttbl (a int) PARTITION BY LIST (a);
|
||||
CREATE TABLE parttbl (a int, b int, c int) PARTITION BY LIST (a);
|
||||
CREATE TABLE parttbl1 PARTITION OF parttbl FOR VALUES IN (1);
|
||||
INSERT INTO parttbl VALUES (1);
|
||||
CREATE TABLE parttbl2 PARTITION OF parttbl FOR VALUES IN (2);
|
||||
INSERT INTO parttbl VALUES (1, 1, 1);
|
||||
|
||||
CREATE TABLE another_parttbl (a int, b int, c int) PARTITION BY LIST (a);
|
||||
CREATE TABLE another_parttbl1 PARTITION OF another_parttbl FOR VALUES IN (1);
|
||||
CREATE TABLE another_parttbl2 PARTITION OF another_parttbl FOR VALUES IN (2);
|
||||
INSERT INTO another_parttbl VALUES (1, 1, 1);
|
||||
}
|
||||
|
||||
teardown
|
||||
@ -46,6 +52,7 @@ teardown
|
||||
DROP TABLE p CASCADE;
|
||||
DROP TABLE table_a, table_b, jointest;
|
||||
DROP TABLE parttbl;
|
||||
DROP TABLE another_parttbl;
|
||||
}
|
||||
|
||||
session "s1"
|
||||
@ -148,6 +155,16 @@ step "simplepartupdate" {
|
||||
update parttbl set a = a;
|
||||
}
|
||||
|
||||
# test scenarios where update may cause row movement
|
||||
|
||||
step "simplepartupdate_route1to2" {
|
||||
update parttbl set a = 2 where c = 1 returning *;
|
||||
}
|
||||
|
||||
step "simplepartupdate_noroute" {
|
||||
update parttbl set b = 2 where c = 1 returning *;
|
||||
}
|
||||
|
||||
|
||||
session "s2"
|
||||
setup { BEGIN ISOLATION LEVEL READ COMMITTED; }
|
||||
@ -190,6 +207,21 @@ step "complexpartupdate" {
|
||||
update parttbl set a = u.a from u;
|
||||
}
|
||||
|
||||
step "complexpartupdate_route_err1" {
|
||||
with u as (update another_parttbl set a = 1 returning another_parttbl.*)
|
||||
update parttbl p set a = u.a from u where p.a = u.a and p.c = 1 returning p.*;
|
||||
}
|
||||
|
||||
step "complexpartupdate_route" {
|
||||
with u as (update another_parttbl set a = 1 returning another_parttbl.*)
|
||||
update parttbl p set a = p.b from u where p.a = u.a and p.c = 1 returning p.*;
|
||||
}
|
||||
|
||||
step "complexpartupdate_doesnt_route" {
|
||||
with u as (update another_parttbl set a = 1 returning another_parttbl.*)
|
||||
update parttbl p set a = 3 - p.b from u where p.a = u.a and p.c = 1 returning p.*;
|
||||
}
|
||||
|
||||
# Use writable CTEs to create self-updated rows, that then are
|
||||
# (updated|deleted). The *fail versions of the tests additionally
|
||||
# perform an update, via a function, in a different command, to test
|
||||
@ -278,3 +310,6 @@ permutation "wrjt" "selectresultforupdate" "c2" "c1"
|
||||
permutation "wrtwcte" "multireadwcte" "c1" "c2"
|
||||
|
||||
permutation "simplepartupdate" "complexpartupdate" "c1" "c2"
|
||||
permutation "simplepartupdate_route1to2" "complexpartupdate_route_err1" "c1" "c2"
|
||||
permutation "simplepartupdate_noroute" "complexpartupdate_route" "c1" "c2"
|
||||
permutation "simplepartupdate_noroute" "complexpartupdate_doesnt_route" "c1" "c2"
|
||||
|
Loading…
x
Reference in New Issue
Block a user