From fa3edb552ce42fba1c369fd1d474a3af332d4cea Mon Sep 17 00:00:00 2001
From: David Li
Date: Mon, 9 Nov 2026 10:30:23 +0900
Subject: [PATCH] feat(c/driver/postgresql): remove trailing whitespace from
queries
Closes #4999.
Assisted-by: GPT-6 Astra
---
c/driver/postgresql/postgresql_test.cc | 22 ++++++++++++++++++++++
c/driver/postgresql/result_helper.cc | 6 ++++--
2 files changed, 26 insertions(+), 2 deletions(-)
diff --git a/c/driver/postgresql/postgresql_test.cc b/c/driver/postgresql/postgresql_test.cc
index 42e5df9056..4b060c47ed 100644
--- a/c/driver/postgresql/postgresql_test.cc
+++ b/c/driver/postgresql/postgresql_test.cc
@@ -2428,6 +2428,28 @@ TEST_F(PostgresStatementTest, BindUpsertWithSlicedListParameter) {
ASSERT_THAT(AdbcStatementRelease(&statement, &error), IsOkStatus(&error));
}
+// Regression test for https://github.com/apache/arrow-adbc/issues/4999.
+TEST_F(PostgresStatementTest, SqlQueryTrailingWhitespace) {
+ ASSERT_THAT(AdbcStatementNew(&connection, &statement, &error), IsOkStatus(&error));
+ ASSERT_THAT(AdbcStatementSetSqlQuery(&statement, "SELECT 1; \t\r\n", &error),
+ IsOkStatus(&error));
+
+ adbc_validation::StreamReader reader;
+ ASSERT_THAT(
+ AdbcStatementExecuteQuery(&statement, &reader.stream.value, nullptr, &error),
+ IsOkStatus(&error));
+ ASSERT_NO_FATAL_FAILURE(reader.GetSchema());
+ ASSERT_EQ(reader.schema->n_children, 1);
+ ASSERT_EQ(reader.fields[0].type, NANOARROW_TYPE_INT32);
+ ASSERT_NO_FATAL_FAILURE(reader.Next());
+ ASSERT_NE(reader.array->release, nullptr);
+ ASSERT_EQ(reader.array->length, 1);
+ ASSERT_NO_FATAL_FAILURE(
+ adbc_validation::CompareArray(reader.array_view->children[0], {1}));
+ ASSERT_NO_FATAL_FAILURE(reader.Next());
+ ASSERT_EQ(reader.array->release, nullptr);
+}
+
TEST_F(PostgresStatementTest, SqlExecuteCopyZeroRowOutputError) {
ASSERT_THAT(quirks()->DropTable(&connection, "adbc_test", &error), IsOkStatus(&error));
ASSERT_THAT(AdbcStatementNew(&connection, &statement, &error), IsOkStatus(&error));
diff --git a/c/driver/postgresql/result_helper.cc b/c/driver/postgresql/result_helper.cc
index 95a686730f..52285237a7 100644
--- a/c/driver/postgresql/result_helper.cc
+++ b/c/driver/postgresql/result_helper.cc
@@ -111,8 +111,10 @@ Status PqResultHelper::Execute(const std::vector& params,
}
Status PqResultHelper::ExecuteCopy() {
- // Remove trailing semicolon(s) from the query before feeding it into COPY
- while (!query_.empty() && query_.back() == ';') {
+ // Remove trailing semicolons and whitespace before feeding the query into COPY
+ while (!query_.empty() &&
+ (query_.back() == ';' || query_.back() == ' ' || query_.back() == '\t' ||
+ query_.back() == '\r' || query_.back() == '\n')) {
query_.pop_back();
}