This is an automated email from the ASF dual-hosted git repository.
lidavidm pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/arrow-adbc.git
The following commit(s) were added to refs/heads/main by this push:
new 777b9377 fix(c/driver/postgresql): Support trailing semicolon(s) for
queries inside COPY statements (#1171)
777b9377 is described below
commit 777b93776a853235d25d49ba3c734d25b341d566
Author: Solomon Choe <[email protected]>
AuthorDate: Thu Oct 5 16:21:04 2023 -0700
fix(c/driver/postgresql): Support trailing semicolon(s) for queries inside
COPY statements (#1171)
Fixes #1147
---
c/driver/postgresql/statement.cc | 5 +++++
c/validation/adbc_validation.cc | 15 +++++++++++++++
c/validation/adbc_validation.h | 2 ++
3 files changed, 22 insertions(+)
diff --git a/c/driver/postgresql/statement.cc b/c/driver/postgresql/statement.cc
index 1daf7093..24086ce3 100644
--- a/c/driver/postgresql/statement.cc
+++ b/c/driver/postgresql/statement.cc
@@ -1028,6 +1028,11 @@ AdbcStatusCode PostgresStatement::ExecuteQuery(struct
ArrowArrayStream* stream,
return ExecuteUpdateBulk(rows_affected, error);
}
+ // Remove trailing semicolon(s) from the query before feeding it into COPY
+ while (!query_.empty() && query_.back() == ';') {
+ query_.pop_back();
+ }
+
if (query_.empty()) {
SetError(error, "%s", "[libpq] Must SetSqlQuery before ExecuteQuery");
return ADBC_STATUS_INVALID_STATE;
diff --git a/c/validation/adbc_validation.cc b/c/validation/adbc_validation.cc
index ab74f57c..a8fb0af8 100644
--- a/c/validation/adbc_validation.cc
+++ b/c/validation/adbc_validation.cc
@@ -3410,6 +3410,21 @@ void StatementTest::TestSqlQueryErrors() {
ASSERT_NE(ADBC_STATUS_OK, code);
}
+void StatementTest::TestSqlQueryTrailingSemicolons() {
+ ASSERT_THAT(AdbcStatementNew(&connection, &statement, &error),
IsOkStatus(&error));
+ ASSERT_THAT(AdbcStatementSetSqlQuery(&statement, "SELECT current_date;;;",
&error),
+ IsOkStatus(&error));
+
+ {
+ StreamReader reader;
+ ASSERT_THAT(AdbcStatementExecuteQuery(&statement, &reader.stream.value,
+ &reader.rows_affected, &error),
+ IsOkStatus(&error));
+ }
+
+ ASSERT_THAT(AdbcStatementRelease(&statement, &error), IsOkStatus(&error));
+}
+
void StatementTest::TestTransactions() {
if (!quirks()->supports_transactions() ||
quirks()->ddl_implicit_commit_txn()) {
GTEST_SKIP();
diff --git a/c/validation/adbc_validation.h b/c/validation/adbc_validation.h
index e5b31e02..d125d1be 100644
--- a/c/validation/adbc_validation.h
+++ b/c/validation/adbc_validation.h
@@ -364,6 +364,7 @@ class StatementTest {
void TestSqlQueryCancel();
void TestSqlQueryErrors();
+ void TestSqlQueryTrailingSemicolons();
void TestSqlSchemaInts();
void TestSqlSchemaFloats();
@@ -453,6 +454,7 @@ class StatementTest {
TEST_F(FIXTURE, SqlQueryInsertRollback) { TestSqlQueryInsertRollback(); }
\
TEST_F(FIXTURE, SqlQueryCancel) { TestSqlQueryCancel(); }
\
TEST_F(FIXTURE, SqlQueryErrors) { TestSqlQueryErrors(); }
\
+ TEST_F(FIXTURE, SqlQueryTrailingSemicolons) {
TestSqlQueryTrailingSemicolons(); } \
TEST_F(FIXTURE, SqlSchemaInts) { TestSqlSchemaInts(); }
\
TEST_F(FIXTURE, SqlSchemaFloats) { TestSqlSchemaFloats(); }
\
TEST_F(FIXTURE, SqlSchemaStrings) { TestSqlSchemaStrings(); }
\