From 0763466230bbbb5e6a7350d76ea3eab69bbf2a00 Mon Sep 17 00:00:00 2001 From: Rahim Kanji Date: Fri, 10 Oct 2025 00:49:48 +0500 Subject: [PATCH] Updated TAP test --- ...-transaction_variable_state_tracking-t.cpp | 162 +++++++++++++++--- 1 file changed, 139 insertions(+), 23 deletions(-) diff --git a/test/tap/tests/pgsql-transaction_variable_state_tracking-t.cpp b/test/tap/tests/pgsql-transaction_variable_state_tracking-t.cpp index c5f655765..8c67134a2 100644 --- a/test/tap/tests/pgsql-transaction_variable_state_tracking-t.cpp +++ b/test/tap/tests/pgsql-transaction_variable_state_tracking-t.cpp @@ -109,51 +109,92 @@ bool test_transaction_rollback(const TestVariable& var) { auto conn = createNewConnection(ConnType::BACKEND, "", false); const auto original = getVariable(conn.get(), var.name); - executeQuery(conn.get(), "BEGIN"); - executeQuery(conn.get(), "SET " + var.name + " = " + var.test_values[0]); - executeQuery(conn.get(), "ROLLBACK"); + bool success = true; + + for (const auto& val : var.test_values) { + executeQuery(conn.get(), "BEGIN"); + executeQuery(conn.get(), "SET " + var.name + " = " + val); + executeQuery(conn.get(), "ROLLBACK"); + + success = getVariable(conn.get(), var.name) == original; + if (!success) + break; + } - const bool success = getVariable(conn.get(), var.name) == original; + return success; +} + +bool test_transaction_abort(const TestVariable& var) { + auto conn = createNewConnection(ConnType::BACKEND, "", false); + const auto original = getVariable(conn.get(), var.name); + + bool success = true; + + for (const auto& val : var.test_values) { + executeQuery(conn.get(), "START TRANSACTION"); + executeQuery(conn.get(), "SET " + var.name + " = " + val); + executeQuery(conn.get(), "ABORT"); + + success = getVariable(conn.get(), var.name) == original; + if (!success) + break; + } return success; } bool test_savepoint_rollback(const TestVariable& var) { auto conn = createNewConnection(ConnType::BACKEND, "", false); const auto original = getVariable(conn.get(), var.name); - executeQuery(conn.get(), "BEGIN"); - executeQuery(conn.get(), "SAVEPOINT sp1"); - executeQuery(conn.get(), "SET " + var.name + " = " + var.test_values[0]); - executeQuery(conn.get(), "ROLLBACK TO sp1"); - executeQuery(conn.get(), "COMMIT"); - const bool success = getVariable(conn.get(), var.name) == original; + bool success = true; + + for (const auto& val : var.test_values) { + executeQuery(conn.get(), "BEGIN"); + executeQuery(conn.get(), "SAVEPOINT sp1"); + executeQuery(conn.get(), "SET " + var.name + " = " + val); + executeQuery(conn.get(), "ROLLBACK TO sp1"); + executeQuery(conn.get(), "COMMIT"); + + success = getVariable(conn.get(), var.name) == original; + if (!success) + break; + } return success; } bool test_transaction_commit(const TestVariable& var, const std::map& original_values) { auto conn = createNewConnection(ConnType::BACKEND, "", false); - const auto test_value = var.test_values[0]; - - executeQuery(conn.get(), "BEGIN"); - executeQuery(conn.get(), "SET " + var.name + " = " + test_value); - executeQuery(conn.get(), "COMMIT"); + + bool success = true; + + for (const auto& val : var.test_values) { + executeQuery(conn.get(), "BEGIN"); + executeQuery(conn.get(), "SET " + var.name + " = " + val); + executeQuery(conn.get(), "COMMIT"); - const bool success = getVariable(conn.get(), var.name) == test_value; + success = getVariable(conn.get(), var.name) == val; + if (!success) + break; + } reset_variable(conn.get(), var.name, original_values.at(var.name)); return success; } bool test_savepoint_commit(const TestVariable& var, const std::map& original_values) { auto conn = createNewConnection(ConnType::BACKEND, "", false); - const auto test_value = var.test_values[0]; + bool success = true; - executeQuery(conn.get(), "BEGIN"); - executeQuery(conn.get(), "SAVEPOINT sp1"); - executeQuery(conn.get(), "SET " + var.name + " = " + test_value); - executeQuery(conn.get(), "RELEASE SAVEPOINT sp1"); - executeQuery(conn.get(), "COMMIT"); + for (const auto& val : var.test_values) { + executeQuery(conn.get(), "BEGIN"); + executeQuery(conn.get(), "SAVEPOINT sp1"); + executeQuery(conn.get(), "SET " + var.name + " = " + val); + executeQuery(conn.get(), "RELEASE SAVEPOINT sp1"); + executeQuery(conn.get(), "COMMIT"); - const bool success = getVariable(conn.get(), var.name) == test_value; + success = getVariable(conn.get(), var.name) == val; + if (!success) + break; + } reset_variable(conn.get(), var.name, original_values.at(var.name)); return success; } @@ -172,6 +213,57 @@ bool test_savepoint_release_commit(const TestVariable& var, const std::map 1) { add_test("Multi-value savepoint for " + var.name, [&]() { @@ -277,6 +377,22 @@ int main(int argc, char** argv) { return success; }); + add_test("Mixed variables in transaction (ROLLBACK AND CHAIN)", [&]() { + auto conn = createNewConnection(ConnType::BACKEND, "", false); + bool success = true; + + executeQuery(conn.get(), "BEGIN"); + for (const auto& [name, var] : tracked_vars) { + executeQuery(conn.get(), "SET " + var.name + " = " + var.test_values[0]); + } + executeQuery(conn.get(), "ROLLBACK AND CHAIN"); + + for (const auto& [name, var] : tracked_vars) { + success = (getVariable(conn.get(), var.name) == original_values.at(var.name)); + } + return success; + }); + add_test("Prepared ROLLBACK statement", [&]() { auto conn = createNewConnection(ConnType::BACKEND, "", false);