From cd2640fe61aef93c686c28264e77e77a0c6f9152 Mon Sep 17 00:00:00 2001 From: Rahim Kanji Date: Sat, 4 Oct 2025 01:40:13 +0500 Subject: [PATCH] Updated TAP test --- .../pgsql-extended_query_protocol_test-t.cpp | 61 ++++++++++++++++++- 1 file changed, 60 insertions(+), 1 deletion(-) diff --git a/test/tap/tests/pgsql-extended_query_protocol_test-t.cpp b/test/tap/tests/pgsql-extended_query_protocol_test-t.cpp index 0a8918747..420fa7dee 100644 --- a/test/tap/tests/pgsql-extended_query_protocol_test-t.cpp +++ b/test/tap/tests/pgsql-extended_query_protocol_test-t.cpp @@ -4992,6 +4992,61 @@ void test_explicit_txn_success_then_rollback_extended() { } } +void test_empty_query_describe_portal_returns_no_data() { + diag("Test %d: Describe Portal Returns No Data for empty query", test_count++); + auto conn = create_connection(); + if (!conn) return; + try{ + conn->prepareStatement("empty_query_stmt", "", false); + conn->bindStatement("empty_query_stmt", "", {}, {}, false); + conn->describePortal("", false); + conn->executeStatement(0, false); + conn->sendSync(); + + char type; + std::vector buffer; + conn->readMessage(type, buffer); + ok(type == PgConnection::PARSE_COMPLETE, "Received ParseComplete for empty query"); + conn->readMessage(type, buffer); + ok(type == PgConnection::BIND_COMPLETE, "Received BindComplete for empty query"); + conn->readMessage(type, buffer); + ok(type == PgConnection::NO_DATA, "Received NoData for empty query"); + conn->readMessage(type, buffer); + ok(type == PgConnection::EMPTY_QUERY_RESPONSE, "Received EmptyQueryResponse for empty query"); + conn->readMessage(type, buffer); + ok(type == PgConnection::READY_FOR_QUERY, "Received ReadyForQuery after all commands"); + } + catch (const PgException& e) { + ok(false, "Describe Portal Returns No Data for empty query failed with error:%s", e.what()); + } +} + +void test_empty_query_without_describe_portal() { + diag("Test %d: Execute empty query without Describe Portal", test_count++); + auto conn = create_connection(); + if (!conn) return; + try { + conn->prepareStatement("empty_query2_stmt", "", false); + conn->bindStatement("empty_query2_stmt", "", {}, {}, false); + conn->executeStatement(0, false); + conn->sendSync(); + + char type; + std::vector buffer; + conn->readMessage(type, buffer); + ok(type == PgConnection::PARSE_COMPLETE, "Received ParseComplete for empty query"); + conn->readMessage(type, buffer); + ok(type == PgConnection::BIND_COMPLETE, "Received BindComplete for empty query"); + conn->readMessage(type, buffer); + ok(type == PgConnection::EMPTY_QUERY_RESPONSE, "Received EmptyQueryResponse for empty query"); + conn->readMessage(type, buffer); + ok(type == PgConnection::READY_FOR_QUERY, "Received ReadyForQuery after all commands"); + } + catch (const PgException& e) { + ok(false, "Execute empty query without Describe Portal failed with error:%s", e.what()); + } +} + int main(int argc, char** argv) { if (cl.getEnv()) return exit_status(); @@ -5002,7 +5057,7 @@ int main(int argc, char** argv) { return exit_status(); } - plan(1052); // Adjust based on number of tests + plan(1061); // Adjust based on number of tests auto admin_conn = createNewConnection(ConnType::ADMIN, "", false); @@ -5127,6 +5182,10 @@ int main(int argc, char** argv) { test_explicit_txn_error_with_rollback_extended(); test_explicit_txn_error_with_commit_extended(); test_explicit_txn_success_then_rollback_extended(); + + // Empty query tests + test_empty_query_describe_portal_returns_no_data(); + test_empty_query_without_describe_portal(); } catch (const std::exception& e) { diag("Fatal error: %s",e.what());