From 70a741e5d4dc39ea55be3e3b5474fb4adbcaa819 Mon Sep 17 00:00:00 2001
From: David Li
Date: Tue, 12 Sep 2023 11:10:23 -0400
Subject: [PATCH] test(c/driver/postgresql): ensure ingestion works with temp
table (#1054)
- Add a bit more information to the error message in case there are
future issues.
- Add a regression test to ensure this use case continues to work.
Fixes #1045.
---
c/driver/postgresql/postgresql_test.cc | 44 ++++++++++++++++++++++++++
c/driver/postgresql/statement.cc | 7 ++--
2 files changed, 48 insertions(+), 3 deletions(-)
diff --git a/c/driver/postgresql/postgresql_test.cc b/c/driver/postgresql/postgresql_test.cc
index aabb81334a..d44499813e 100644
--- a/c/driver/postgresql/postgresql_test.cc
+++ b/c/driver/postgresql/postgresql_test.cc
@@ -878,6 +878,50 @@ class PostgresStatementTest : public ::testing::Test,
};
ADBCV_TEST_STATEMENT(PostgresStatementTest)
+TEST_F(PostgresStatementTest, SqlIngestTemporaryTable) {
+ ASSERT_THAT(quirks()->DropTable(&connection, "temptable", &error), IsOkStatus(&error));
+
+ ASSERT_THAT(AdbcConnectionSetOption(&connection, ADBC_CONNECTION_OPTION_AUTOCOMMIT,
+ ADBC_OPTION_VALUE_DISABLED, &error),
+ IsOkStatus(&error));
+
+ ASSERT_THAT(AdbcStatementNew(&connection, &statement, &error), IsOkStatus(&error));
+
+ ASSERT_THAT(AdbcStatementSetSqlQuery(
+ &statement, "CREATE TEMPORARY TABLE temptable (ints BIGINT)", &error),
+ IsOkStatus(&error));
+ ASSERT_THAT(AdbcStatementExecuteQuery(&statement, nullptr, nullptr, &error),
+ IsOkStatus(&error));
+
+ {
+ adbc_validation::Handle schema;
+ adbc_validation::Handle batch;
+
+ ArrowSchemaInit(&schema.value);
+ ASSERT_THAT(ArrowSchemaSetTypeStruct(&schema.value, 1), adbc_validation::IsOkErrno());
+ ASSERT_THAT(ArrowSchemaSetType(schema->children[0], NANOARROW_TYPE_INT64),
+ adbc_validation::IsOkErrno());
+ ASSERT_THAT(ArrowSchemaSetName(schema->children[0], "ints"),
+ adbc_validation::IsOkErrno());
+
+ ASSERT_THAT((adbc_validation::MakeBatch(
+ &schema.value, &batch.value, static_cast(nullptr),
+ {-1, 0, 1, std::nullopt})),
+ adbc_validation::IsOkErrno());
+
+ ASSERT_THAT(AdbcStatementSetOption(&statement, ADBC_INGEST_OPTION_TARGET_TABLE,
+ "temptable", &error),
+ IsOkStatus(&error));
+ ASSERT_THAT(AdbcStatementSetOption(&statement, ADBC_INGEST_OPTION_MODE,
+ ADBC_INGEST_OPTION_MODE_APPEND, &error),
+ IsOkStatus(&error));
+ ASSERT_THAT(AdbcStatementBind(&statement, &batch.value, &schema.value, &error),
+ IsOkStatus(&error));
+ ASSERT_THAT(AdbcStatementExecuteQuery(&statement, nullptr, nullptr, &error),
+ IsOkStatus(&error));
+ }
+}
+
TEST_F(PostgresStatementTest, SqlIngestTimestampOverflow) {
ASSERT_THAT(AdbcStatementNew(&connection, &statement, &error), IsOkStatus(&error));
diff --git a/c/driver/postgresql/statement.cc b/c/driver/postgresql/statement.cc
index e38bf8f4b9..2806937959 100644
--- a/c/driver/postgresql/statement.cc
+++ b/c/driver/postgresql/statement.cc
@@ -500,10 +500,11 @@ struct BindStream {
param_lengths.data(), param_formats.data(),
/*resultFormat=*/0 /*text*/);
- if (PQresultStatus(result) != PGRES_COMMAND_OK) {
+ ExecStatusType pg_status = PQresultStatus(result);
+ if (pg_status != PGRES_COMMAND_OK) {
AdbcStatusCode code = SetError(
- error, result, "%s%s",
- "[libpq] Failed to execute prepared statement: ", PQerrorMessage(conn));
+ error, result, "[libpq] Failed to execute prepared statement: %s %s",
+ PQresStatus(pg_status), PQerrorMessage(conn));
PQclear(result);
return code;
}