From 2e04f1ad6b64fcabd70ff3fe1d938716b4e05b97 Mon Sep 17 00:00:00 2001 From: TotaJ Date: Sat, 14 May 2022 17:40:09 +0800 Subject: [PATCH] Fix transaction read/write mode. --- src/gausskernel/process/tcop/utility.cpp | 5 ++++- .../regress/expected/transactions_test.out | 20 +++++++++++++++++++ src/test/regress/parallel_schedule0 | 2 +- src/test/regress/sql/transactions_test.sql | 14 +++++++++++++ 4 files changed, 39 insertions(+), 2 deletions(-) create mode 100644 src/test/regress/expected/transactions_test.out create mode 100644 src/test/regress/sql/transactions_test.sql diff --git a/src/gausskernel/process/tcop/utility.cpp b/src/gausskernel/process/tcop/utility.cpp index d230593fd..d38551c07 100755 --- a/src/gausskernel/process/tcop/utility.cpp +++ b/src/gausskernel/process/tcop/utility.cpp @@ -2260,8 +2260,11 @@ static void set_item_arg_according_to_def_name(DefElem* item) if (strcmp(item->defname, "transaction_isolation") == 0) { SetPGVariable("transaction_isolation", list_make1(item->arg), true); } else if (strcmp(item->defname, "transaction_read_only") == 0) { +#ifdef ENABLE_MULTIPLE_NODES /* Set read only state from CN when this DN is not read only. */ - if (u_sess->attr.attr_storage.DefaultXactReadOnly == false) { + if (u_sess->attr.attr_storage.DefaultXactReadOnly == false) +#endif + { SetPGVariable("transaction_read_only", list_make1(item->arg), true); } } else if (strcmp(item->defname, "transaction_deferrable") == 0) { diff --git a/src/test/regress/expected/transactions_test.out b/src/test/regress/expected/transactions_test.out new file mode 100644 index 000000000..b32f061f3 --- /dev/null +++ b/src/test/regress/expected/transactions_test.out @@ -0,0 +1,20 @@ +SET SESSION CHARACTERISTICS AS TRANSACTION READ ONLY; +START TRANSACTION READ WRITE; +CREATE TABLE transaction_test_table(a int); +insert into transaction_test_table values(1); +update transaction_test_table set a=2 where a=1; +select * from transaction_test_table; + a +--- + 2 +(1 row) + +commit; +-- error +delete from transaction_test_table; +ERROR: cannot execute DELETE in a read-only transaction +drop table transaction_test_table; +ERROR: cannot execute DROP TABLE in a read-only transaction +START TRANSACTION READ WRITE; +drop table transaction_test_table; +commit; diff --git a/src/test/regress/parallel_schedule0 b/src/test/regress/parallel_schedule0 index e2086c3d8..db9afd925 100644 --- a/src/test/regress/parallel_schedule0 +++ b/src/test/regress/parallel_schedule0 @@ -154,7 +154,7 @@ test: single_node_select_implicit single_node_select_having test: single_node_union #test: single_node_case single_node_join single_node_aggregates #test: single_node_transactions -test: single_node_random +test: single_node_random transactions_test #test: single_node_portals #test: single_node_arrays #test: single_node_btree_index single_node_hash_index single_node_update diff --git a/src/test/regress/sql/transactions_test.sql b/src/test/regress/sql/transactions_test.sql new file mode 100644 index 000000000..a384641a3 --- /dev/null +++ b/src/test/regress/sql/transactions_test.sql @@ -0,0 +1,14 @@ +SET SESSION CHARACTERISTICS AS TRANSACTION READ ONLY; +START TRANSACTION READ WRITE; +CREATE TABLE transaction_test_table(a int); +insert into transaction_test_table values(1); +update transaction_test_table set a=2 where a=1; +select * from transaction_test_table; +commit; +-- error +delete from transaction_test_table; +drop table transaction_test_table; + +START TRANSACTION READ WRITE; +drop table transaction_test_table; +commit;