Skip to content

Commit

Permalink
test(c/driver/postgresql): ensure ingestion works with temp table (#1054
Browse files Browse the repository at this point in the history
)

- 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.
  • Loading branch information
lidavidm committed Sep 12, 2023
1 parent cfc1227 commit 70a741e
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 3 deletions.
44 changes: 44 additions & 0 deletions c/driver/postgresql/postgresql_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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<struct ArrowSchema> schema;
adbc_validation::Handle<struct ArrowArray> 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<int64_t>(
&schema.value, &batch.value, static_cast<struct ArrowError*>(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));

Expand Down
7 changes: 4 additions & 3 deletions c/driver/postgresql/statement.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down

0 comments on commit 70a741e

Please sign in to comment.