diff --git a/src/gausskernel/storage/access/transam/xact.cpp b/src/gausskernel/storage/access/transam/xact.cpp index 8b3ee6bd5..0e510adf5 100755 --- a/src/gausskernel/storage/access/transam/xact.cpp +++ b/src/gausskernel/storage/access/transam/xact.cpp @@ -4471,8 +4471,12 @@ void AbortCurrentTransaction(bool STP_rollback) case TBLOCK_STARTED: AbortTransaction(PerfectRollback, STP_rollback); ApplyUndoActions(); - CleanupTransaction(); - s->blockState = TBLOCK_DEFAULT; + if (u_sess->attr.attr_storage.phony_autocommit || STP_rollback) { + CleanupTransaction(); + s->blockState = TBLOCK_DEFAULT; + } else { + s->blockState = TBLOCK_ABORT; + } break; /* diff --git a/src/test/regress/expected/autocommit_test.out b/src/test/regress/expected/autocommit_test.out index 5fdc53300..a6811f3d6 100644 --- a/src/test/regress/expected/autocommit_test.out +++ b/src/test/regress/expected/autocommit_test.out @@ -255,6 +255,16 @@ SHOW autocommit; on (1 row) +-- error in transaction block +SET autocommit = 0; +CREATE; +ERROR: syntax error at or near ";" +LINE 1: CREATE; + ^ +SET autocommit = 1; +ERROR: current transaction is aborted, commands ignored until end of transaction block, firstChar[Q] +ROLLBACK; +SET autocommit = 1; \c regression DROP DATABASE test_db; DROP DATABASE test_drop; diff --git a/src/test/regress/sql/autocommit_test.sql b/src/test/regress/sql/autocommit_test.sql index 98d9cad05..b0e268e0a 100644 --- a/src/test/regress/sql/autocommit_test.sql +++ b/src/test/regress/sql/autocommit_test.sql @@ -124,6 +124,13 @@ ROLLBACK; SELECT * FROM test_table; SHOW autocommit; +-- error in transaction block +SET autocommit = 0; +CREATE; +SET autocommit = 1; +ROLLBACK; +SET autocommit = 1; + \c regression DROP DATABASE test_db; DROP DATABASE test_drop;