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; }