From dcf2fe4f48dce5ad748567d5bb9a077ba083288e Mon Sep 17 00:00:00 2001 From: laishenghao Date: Sat, 3 Aug 2024 16:27:58 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A7=A3=E5=86=B3=E7=BB=A7=E6=89=BF=E8=A1=A8?= =?UTF-8?q?=E4=B8=8D=E6=94=AF=E6=8C=81select=20FOR=20UPDATE=20SKIP=20LOCKE?= =?UTF-8?q?D=20=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/gausskernel/optimizer/prep/prepunion.cpp | 1 + .../regress/expected/skiplocked_inherits.out | 12 +++++++ src/test/regress/expected/skiplocked_post.out | 2 ++ src/test/regress/expected/skiplocked_prep.out | 35 +++++++++++++++++++ .../regress/expected/skiplocked_test1_1.out | 6 ++++ src/test/regress/parallel_schedule0 | 2 +- src/test/regress/sql/skiplocked_inherits.sql | 2 ++ src/test/regress/sql/skiplocked_post.sql | 2 ++ src/test/regress/sql/skiplocked_prep.sql | 19 +++++++++- src/test/regress/sql/skiplocked_test1_1.sql | 2 +- 10 files changed, 80 insertions(+), 3 deletions(-) create mode 100644 src/test/regress/expected/skiplocked_inherits.out create mode 100644 src/test/regress/sql/skiplocked_inherits.sql diff --git a/src/gausskernel/optimizer/prep/prepunion.cpp b/src/gausskernel/optimizer/prep/prepunion.cpp index 44feb4f97..3cb0d9c3b 100644 --- a/src/gausskernel/optimizer/prep/prepunion.cpp +++ b/src/gausskernel/optimizer/prep/prepunion.cpp @@ -1602,6 +1602,7 @@ static void expand_inherited_rtentry(PlannerInfo* root, RangeTblEntry* rte, Inde newrc->waitPolicy = oldrc->waitPolicy; newrc->waitSec = oldrc->waitSec; newrc->isParent = false; + newrc->bms_nodeids = oldrc->bms_nodeids; root->rowMarks = lappend(root->rowMarks, newrc); } diff --git a/src/test/regress/expected/skiplocked_inherits.out b/src/test/regress/expected/skiplocked_inherits.out new file mode 100644 index 000000000..3c6416376 --- /dev/null +++ b/src/test/regress/expected/skiplocked_inherits.out @@ -0,0 +1,12 @@ +select pg_sleep(1); + pg_sleep +---------- + +(1 row) + +select * from skiplocked_inherits_1 order by 1 desc limit 1 FOR UPDATE SKIP LOCKED; + id | a1 +----+------------------- + 3 | {"name": "test3"} +(1 row) + diff --git a/src/test/regress/expected/skiplocked_post.out b/src/test/regress/expected/skiplocked_post.out index 922d3114b..384534251 100644 --- a/src/test/regress/expected/skiplocked_post.out +++ b/src/test/regress/expected/skiplocked_post.out @@ -4,3 +4,5 @@ drop view skiplocked_v3; drop table skiplocked_t1; drop table skiplocked_t2; drop table skiplocked_t3; +drop table skiplocked_inherits_2; +drop table skiplocked_inherits_1; diff --git a/src/test/regress/expected/skiplocked_prep.out b/src/test/regress/expected/skiplocked_prep.out index 239769052..59e2f1cb5 100644 --- a/src/test/regress/expected/skiplocked_prep.out +++ b/src/test/regress/expected/skiplocked_prep.out @@ -23,3 +23,38 @@ create table IF NOT EXISTS skiplocked_t3( )with (ORIENTATION=COLUMN); NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "skiplocked_t3_pkey" for table "skiplocked_t3" insert into skiplocked_t3 values (1, 'one'); +-- test skiplocked with inherited table +drop table if exists skiplocked_inherits_1,skiplocked_inherits_2; +NOTICE: table "skiplocked_inherits_1" does not exist, skipping +NOTICE: table "skiplocked_inherits_2" does not exist, skipping +create table skiplocked_inherits_1( + id int unique, + a1 jsonb check(a1!='{}') +); +NOTICE: CREATE TABLE / UNIQUE will create implicit index "skiplocked_inherits_1_id_key" for table "skiplocked_inherits_1" +CREATE TABLE skiplocked_inherits_2 ( + a2 jsonb default '{"name": "John", "age": 30}', + a3 jsonb not null +) INHERITS (skiplocked_inherits_1); +insert into skiplocked_inherits_2 values(1,'{"name":"test1"}','{"id":1001}','[null,"aaa"]'); +insert into skiplocked_inherits_2 values(2,'{"name":"test2"}',default,'["true"]'); +insert into skiplocked_inherits_2 values(3,'{"name":"test3"}','{"id":1003}','["a", {"b":1,"name": "John", "age": 30}]'); +insert into skiplocked_inherits_2 values(4,'{"name":"test"}',default,'["null","T"]'); +select * from skiplocked_inherits_1 order by id; + id | a1 +----+------------------- + 1 | {"name": "test1"} + 2 | {"name": "test2"} + 3 | {"name": "test3"} + 4 | {"name": "test"} +(4 rows) + +select * from skiplocked_inherits_2 order by id; + id | a1 | a2 | a3 +----+-------------------+-----------------------------+-------------------------------------------- + 1 | {"name": "test1"} | {"id": 1001} | [null, "aaa"] + 2 | {"name": "test2"} | {"age": 30, "name": "John"} | ["true"] + 3 | {"name": "test3"} | {"id": 1003} | ["a", {"b": 1, "age": 30, "name": "John"}] + 4 | {"name": "test"} | {"age": 30, "name": "John"} | ["null", "T"] +(4 rows) + diff --git a/src/test/regress/expected/skiplocked_test1_1.out b/src/test/regress/expected/skiplocked_test1_1.out index b522f995a..dbb2260f2 100644 --- a/src/test/regress/expected/skiplocked_test1_1.out +++ b/src/test/regress/expected/skiplocked_test1_1.out @@ -1,5 +1,11 @@ begin; update skiplocked_t1 set info = 'two2' where id = 2; +select * from skiplocked_inherits_1 order by 1 desc limit 1 FOR UPDATE SKIP LOCKED; + id | a1 +----+------------------ + 4 | {"name": "test"} +(1 row) + select pg_sleep(5); pg_sleep ---------- diff --git a/src/test/regress/parallel_schedule0 b/src/test/regress/parallel_schedule0 index 133fa781c..d396ebe1a 100644 --- a/src/test/regress/parallel_schedule0 +++ b/src/test/regress/parallel_schedule0 @@ -1016,7 +1016,7 @@ test: ledger_table_case # select ... for update skip locked test: skiplocked_prep -test: skiplocked_test1_1 skiplocked_test1_2 +test: skiplocked_test1_1 skiplocked_test1_2 skiplocked_inherits test: skiplocked_test1_1 skiplocked_test1_3 test: skiplocked_post diff --git a/src/test/regress/sql/skiplocked_inherits.sql b/src/test/regress/sql/skiplocked_inherits.sql new file mode 100644 index 000000000..f81d40848 --- /dev/null +++ b/src/test/regress/sql/skiplocked_inherits.sql @@ -0,0 +1,2 @@ +select pg_sleep(1); +select * from skiplocked_inherits_1 order by 1 desc limit 1 FOR UPDATE SKIP LOCKED; diff --git a/src/test/regress/sql/skiplocked_post.sql b/src/test/regress/sql/skiplocked_post.sql index fa6a3b124..4bc309983 100644 --- a/src/test/regress/sql/skiplocked_post.sql +++ b/src/test/regress/sql/skiplocked_post.sql @@ -5,3 +5,5 @@ drop view skiplocked_v3; drop table skiplocked_t1; drop table skiplocked_t2; drop table skiplocked_t3; +drop table skiplocked_inherits_2; +drop table skiplocked_inherits_1; diff --git a/src/test/regress/sql/skiplocked_prep.sql b/src/test/regress/sql/skiplocked_prep.sql index 6616ca971..bb83fce04 100644 --- a/src/test/regress/sql/skiplocked_prep.sql +++ b/src/test/regress/sql/skiplocked_prep.sql @@ -23,4 +23,21 @@ create table IF NOT EXISTS skiplocked_t3( info text, primary key (id) )with (ORIENTATION=COLUMN); -insert into skiplocked_t3 values (1, 'one'); \ No newline at end of file +insert into skiplocked_t3 values (1, 'one'); + +-- test skiplocked with inherited table +drop table if exists skiplocked_inherits_1,skiplocked_inherits_2; +create table skiplocked_inherits_1( + id int unique, + a1 jsonb check(a1!='{}') +); +CREATE TABLE skiplocked_inherits_2 ( + a2 jsonb default '{"name": "John", "age": 30}', + a3 jsonb not null +) INHERITS (skiplocked_inherits_1); +insert into skiplocked_inherits_2 values(1,'{"name":"test1"}','{"id":1001}','[null,"aaa"]'); +insert into skiplocked_inherits_2 values(2,'{"name":"test2"}',default,'["true"]'); +insert into skiplocked_inherits_2 values(3,'{"name":"test3"}','{"id":1003}','["a", {"b":1,"name": "John", "age": 30}]'); +insert into skiplocked_inherits_2 values(4,'{"name":"test"}',default,'["null","T"]'); +select * from skiplocked_inherits_1 order by id; +select * from skiplocked_inherits_2 order by id; diff --git a/src/test/regress/sql/skiplocked_test1_1.sql b/src/test/regress/sql/skiplocked_test1_1.sql index eb6400a9f..6ca95f595 100644 --- a/src/test/regress/sql/skiplocked_test1_1.sql +++ b/src/test/regress/sql/skiplocked_test1_1.sql @@ -1,7 +1,7 @@ begin; update skiplocked_t1 set info = 'two2' where id = 2; - +select * from skiplocked_inherits_1 order by 1 desc limit 1 FOR UPDATE SKIP LOCKED; select pg_sleep(5); end;