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(); }                
         \

Reply via email to