diff --git a/c/driver/snowflake/snowflake_test.cc b/c/driver/snowflake/snowflake_test.cc index cdd92e2c71..1c4237111f 100644 --- a/c/driver/snowflake/snowflake_test.cc +++ b/c/driver/snowflake/snowflake_test.cc @@ -23,6 +23,7 @@ #include #include #include +#include #include "validation/adbc_validation.h" #include "validation/adbc_validation_util.h" @@ -35,6 +36,26 @@ using adbc_validation::IsOkStatus; } \ } while (false) +namespace { +std::string GetUuid() { + static std::random_device dev; + static std::mt19937 rng(dev()); + + std::uniform_int_distribution dist(0, 15); + + const char* v = "0123456789ABCDEF"; + const bool dash[] = {0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0}; + + std::string res; + for (int i = 0; i < 16; i++) { + if (dash[i]) res += "-"; + res += v[dist(rng)]; + res += v[dist(rng)]; + } + return res; +} +} // namespace + class SnowflakeQuirks : public adbc_validation::DriverQuirks { public: SnowflakeQuirks() { @@ -47,6 +68,13 @@ class SnowflakeQuirks : public adbc_validation::DriverQuirks { AdbcStatusCode SetupDatabase(struct AdbcDatabase* database, struct AdbcError* error) const override { EXPECT_THAT(AdbcDatabaseSetOption(database, "uri", uri_, error), IsOkStatus(error)); + EXPECT_THAT(AdbcDatabaseSetOption( + database, "adbc.snowflake.sql.client_option.use_high_precision", + "false", error), + IsOkStatus(error)); + EXPECT_THAT(AdbcDatabaseSetOption(database, "adbc.snowflake.sql.schema", + schema_.c_str(), error), + IsOkStatus(error)); return ADBC_STATUS_OK; } @@ -119,11 +147,13 @@ class SnowflakeQuirks : public adbc_validation::DriverQuirks { bool supports_metadata_current_db_schema() const override { return false; } bool supports_partitioned_data() const override { return false; } bool supports_dynamic_parameter_binding() const override { return false; } + bool supports_error_on_incompatible_schema() const override { return false; } bool ddl_implicit_commit_txn() const override { return true; } - std::string db_schema() const override { return "ADBC_TESTING"; } + std::string db_schema() const override { return schema_; } const char* uri_; bool skip_{false}; + std::string schema_{"ADBC_TESTING"}; }; class SnowflakeTest : public ::testing::Test, public adbc_validation::DatabaseTest { @@ -175,6 +205,7 @@ class SnowflakeStatementTest : public ::testing::Test, public adbc_validation::StatementTest { public: const adbc_validation::DriverQuirks* quirks() const override { return &quirks_; } + void SetUp() override { if (quirks_.skip_) { GTEST_SKIP(); @@ -192,6 +223,78 @@ class SnowflakeStatementTest : public ::testing::Test, void TestSqlIngestColumnEscaping() { GTEST_SKIP(); } + public: + // will need to be updated to SetUpTestSuite when gtest is upgraded + static void SetUpTestCase() { + struct AdbcError error; + struct AdbcDatabase db; + struct AdbcConnection connection; + struct AdbcStatement statement; + + std::memset(&error, 0, sizeof(error)); + std::memset(&db, 0, sizeof(db)); + std::memset(&connection, 0, sizeof(connection)); + std::memset(&statement, 0, sizeof(statement)); + + ASSERT_THAT(AdbcDatabaseNew(&db, &error), IsOkStatus(&error)); + ASSERT_THAT(quirks_.SetupDatabase(&db, &error), IsOkStatus(&error)); + ASSERT_THAT(AdbcDatabaseInit(&db, &error), IsOkStatus(&error)); + + ASSERT_THAT(AdbcConnectionNew(&connection, &error), IsOkStatus(&error)); + ASSERT_THAT(AdbcConnectionInit(&connection, &db, &error), IsOkStatus(&error)); + + std::string schema_name = "ADBC_TESTING_" + GetUuid(); + std::string query = + "CREATE SCHEMA IDENTIFIER('\"ADBC_TESTING\".\"" + schema_name + "\"')"; + + ASSERT_THAT(AdbcStatementNew(&connection, &statement, &error), IsOkStatus(&error)); + ASSERT_THAT(AdbcStatementSetSqlQuery(&statement, query.c_str(), &error), + IsOkStatus(&error)); + ASSERT_THAT(AdbcStatementExecuteQuery(&statement, nullptr, nullptr, &error), + IsOkStatus(&error)); + + quirks_.schema_ = schema_name; + + ASSERT_THAT(AdbcStatementRelease(&statement, &error), IsOkStatus(&error)); + ASSERT_THAT(AdbcConnectionRelease(&connection, &error), IsOkStatus(&error)); + ASSERT_THAT(AdbcDatabaseRelease(&db, &error), IsOkStatus(&error)); + } + + // will need to be updated to TearDownTestSuite when gtest is upgraded + static void TearDownTestCase() { + struct AdbcError error; + struct AdbcDatabase db; + struct AdbcConnection connection; + struct AdbcStatement statement; + + std::memset(&error, 0, sizeof(error)); + std::memset(&db, 0, sizeof(db)); + std::memset(&connection, 0, sizeof(connection)); + std::memset(&statement, 0, sizeof(statement)); + + ASSERT_THAT(AdbcDatabaseNew(&db, &error), IsOkStatus(&error)); + ASSERT_THAT(quirks_.SetupDatabase(&db, &error), IsOkStatus(&error)); + ASSERT_THAT(AdbcDatabaseInit(&db, &error), IsOkStatus(&error)); + + ASSERT_THAT(AdbcConnectionNew(&connection, &error), IsOkStatus(&error)); + ASSERT_THAT(AdbcConnectionInit(&connection, &db, &error), IsOkStatus(&error)); + + std::string query = + "DROP SCHEMA IDENTIFIER('\"ADBC_TESTING\".\"" + quirks_.schema_ + "\"')"; + + ASSERT_THAT(AdbcStatementNew(&connection, &statement, &error), IsOkStatus(&error)); + ASSERT_THAT(AdbcStatementSetSqlQuery(&statement, query.c_str(), &error), + IsOkStatus(&error)); + ASSERT_THAT(AdbcStatementExecuteQuery(&statement, nullptr, nullptr, &error), + IsOkStatus(&error)); + + quirks_.schema_ = "ADBC_TESTING"; + + ASSERT_THAT(AdbcStatementRelease(&statement, &error), IsOkStatus(&error)); + ASSERT_THAT(AdbcConnectionRelease(&connection, &error), IsOkStatus(&error)); + ASSERT_THAT(AdbcDatabaseRelease(&db, &error), IsOkStatus(&error)); + } + protected: void ValidateIngestedTemporalData(struct ArrowArrayView* values, ArrowType type, enum ArrowTimeUnit unit, @@ -204,7 +307,7 @@ class SnowflakeStatementTest : public ::testing::Test, expected = {std::nullopt, -42, 0, 42}; break; case NANOARROW_TIME_UNIT_MILLI: - expected = {std::nullopt, -42000, 0, 42000}; + expected = {std::nullopt, -42, 0, 42}; break; case NANOARROW_TIME_UNIT_MICRO: expected = {std::nullopt, -42, 0, 42}; @@ -222,6 +325,8 @@ class SnowflakeStatementTest : public ::testing::Test, } } - SnowflakeQuirks quirks_; + static SnowflakeQuirks quirks_; }; + +SnowflakeQuirks SnowflakeStatementTest::quirks_; ADBCV_TEST_STATEMENT(SnowflakeStatementTest) diff --git a/c/validation/adbc_validation.h b/c/validation/adbc_validation.h index fcb4a5c286..6c59d95e09 100644 --- a/c/validation/adbc_validation.h +++ b/c/validation/adbc_validation.h @@ -220,6 +220,10 @@ class DriverQuirks { /// \brief Whether we can get statistics virtual bool supports_statistics() const { return false; } + /// \brief Whether ingest errors on an incompatible schema or simply performs + /// column matching. + virtual bool supports_error_on_incompatible_schema() const { return true; } + /// \brief Default catalog to use for tests virtual std::string catalog() const { return ""; } diff --git a/c/validation/adbc_validation_connection.cc b/c/validation/adbc_validation_connection.cc index f9af084ef6..7a438f1001 100644 --- a/c/validation/adbc_validation_connection.cc +++ b/c/validation/adbc_validation_connection.cc @@ -550,7 +550,7 @@ void ConnectionTest::TestMetadataGetObjectsDbSchemas() { ASSERT_NO_FATAL_FAILURE(CheckGetObjectsSchema(&reader.schema.value)); ASSERT_NO_FATAL_FAILURE(reader.Next()); ASSERT_NE(nullptr, reader.array->release); - ASSERT_GT(reader.array->length, 0); + ASSERT_GE(reader.array->length, 0); do { for (int64_t row = 0; row < reader.array->length; row++) { struct ArrowArrayView* catalog_db_schemas_list = reader.array_view->children[1]; @@ -596,19 +596,24 @@ void ConnectionTest::TestMetadataGetObjectsTables() { ASSERT_NO_FATAL_FAILURE(CheckGetObjectsSchema(&reader.schema.value)); ASSERT_NO_FATAL_FAILURE(reader.Next()); ASSERT_NE(nullptr, reader.array->release); - ASSERT_GT(reader.array->length, 0); + + // type: list + struct ArrowArrayView* catalog_db_schemas_list = reader.array_view->children[1]; + // type: db_schema_schema (struct) + struct ArrowArrayView* catalog_db_schemas = catalog_db_schemas_list->children[0]; + // type: list + struct ArrowArrayView* db_schema_tables_list = catalog_db_schemas->children[1]; + // type: table_schema (struct) + struct ArrowArrayView* db_schema_tables = db_schema_tables_list->children[0]; + + if (expected.second) { + ASSERT_GT(reader.array->length, 0); + } else { + ASSERT_EQ(db_schema_tables->length, 0); + } bool found_expected_table = false; do { for (int64_t row = 0; row < reader.array->length; row++) { - // type: list - struct ArrowArrayView* catalog_db_schemas_list = reader.array_view->children[1]; - // type: db_schema_schema (struct) - struct ArrowArrayView* catalog_db_schemas = catalog_db_schemas_list->children[0]; - // type: list - struct ArrowArrayView* db_schema_tables_list = catalog_db_schemas->children[1]; - // type: table_schema (struct) - struct ArrowArrayView* db_schema_tables = db_schema_tables_list->children[0]; - ASSERT_FALSE(ArrowArrayViewIsNull(catalog_db_schemas_list, row)) << "Row " << row << " should have non-null catalog_db_schemas"; @@ -670,7 +675,7 @@ void ConnectionTest::TestMetadataGetObjectsTablesTypes() { ASSERT_NO_FATAL_FAILURE(CheckGetObjectsSchema(&reader.schema.value)); ASSERT_NO_FATAL_FAILURE(reader.Next()); ASSERT_NE(nullptr, reader.array->release); - ASSERT_GT(reader.array->length, 0); + ASSERT_GE(reader.array->length, 0); bool found_expected_table = false; do { for (int64_t row = 0; row < reader.array->length; row++) { diff --git a/c/validation/adbc_validation_statement.cc b/c/validation/adbc_validation_statement.cc index 083fb0f286..7d24aac02e 100644 --- a/c/validation/adbc_validation_statement.cc +++ b/c/validation/adbc_validation_statement.cc @@ -141,10 +141,11 @@ void StatementTest::TestSqlIngestType(ArrowType type, ASSERT_THAT(rows_affected, ::testing::AnyOf(::testing::Eq(values.size()), ::testing::Eq(-1))); - ASSERT_THAT(AdbcStatementSetSqlQuery( - &statement, - "SELECT * FROM bulk_ingest ORDER BY \"col\" ASC NULLS FIRST", &error), - IsOkStatus(&error)); + ASSERT_THAT( + AdbcStatementSetSqlQuery( + &statement, "SELECT * FROM \"bulk_ingest\" ORDER BY \"col\" ASC NULLS FIRST", + &error), + IsOkStatus(&error)); { StreamReader reader; ASSERT_THAT(AdbcStatementExecuteQuery(&statement, &reader.stream.value, @@ -303,10 +304,11 @@ void StatementTest::TestSqlIngestTemporalType(const char* timezone) { ASSERT_THAT(rows_affected, ::testing::AnyOf(::testing::Eq(values.size()), ::testing::Eq(-1))); - ASSERT_THAT(AdbcStatementSetSqlQuery( - &statement, - "SELECT * FROM bulk_ingest ORDER BY \"col\" ASC NULLS FIRST", &error), - IsOkStatus(&error)); + ASSERT_THAT( + AdbcStatementSetSqlQuery( + &statement, "SELECT * FROM \"bulk_ingest\" ORDER BY \"col\" ASC NULLS FIRST", + &error), + IsOkStatus(&error)); { StreamReader reader; ASSERT_THAT(AdbcStatementExecuteQuery(&statement, &reader.stream.value, @@ -449,10 +451,11 @@ void StatementTest::TestSqlIngestInterval() { ASSERT_THAT(rows_affected, ::testing::AnyOf(::testing::Eq(values.size()), ::testing::Eq(-1))); - ASSERT_THAT(AdbcStatementSetSqlQuery( - &statement, - "SELECT * FROM bulk_ingest ORDER BY \"col\" ASC NULLS FIRST", &error), - IsOkStatus(&error)); + ASSERT_THAT( + AdbcStatementSetSqlQuery( + &statement, "SELECT * FROM \"bulk_ingest\" ORDER BY \"col\" ASC NULLS FIRST", + &error), + IsOkStatus(&error)); { StreamReader reader; ASSERT_THAT(AdbcStatementExecuteQuery(&statement, &reader.stream.value, @@ -483,9 +486,9 @@ void StatementTest::TestSqlIngestInterval() { } void StatementTest::TestSqlIngestStringDictionary() { - ASSERT_NO_FATAL_FAILURE(TestSqlIngestType( - NANOARROW_TYPE_STRING, {std::nullopt, "", "", "1234", "例"}, - /*dictionary_encode*/ true)); + ASSERT_NO_FATAL_FAILURE(TestSqlIngestType(NANOARROW_TYPE_STRING, + {"", "", "1234", "例"}, + /*dictionary_encode*/ true)); } void StatementTest::TestSqlIngestTableEscaping() { @@ -589,8 +592,9 @@ void StatementTest::TestSqlIngestAppend() { ASSERT_THAT(rows_affected, ::testing::AnyOf(::testing::Eq(2), ::testing::Eq(-1))); // Read data back - ASSERT_THAT(AdbcStatementSetSqlQuery(&statement, "SELECT * FROM bulk_ingest", &error), - IsOkStatus(&error)); + ASSERT_THAT( + AdbcStatementSetSqlQuery(&statement, "SELECT * FROM \"bulk_ingest\"", &error), + IsOkStatus(&error)); { StreamReader reader; ASSERT_THAT(AdbcStatementExecuteQuery(&statement, &reader.stream.value, @@ -648,8 +652,9 @@ void StatementTest::TestSqlIngestReplace() { ASSERT_THAT(rows_affected, ::testing::AnyOf(::testing::Eq(1), ::testing::Eq(-1))); // Read data back - ASSERT_THAT(AdbcStatementSetSqlQuery(&statement, "SELECT * FROM bulk_ingest", &error), - IsOkStatus(&error)); + ASSERT_THAT( + AdbcStatementSetSqlQuery(&statement, "SELECT * FROM \"bulk_ingest\"", &error), + IsOkStatus(&error)); { StreamReader reader; ASSERT_THAT(AdbcStatementExecuteQuery(&statement, &reader.stream.value, @@ -693,8 +698,9 @@ void StatementTest::TestSqlIngestReplace() { ASSERT_THAT(rows_affected, ::testing::AnyOf(::testing::Eq(2), ::testing::Eq(-1))); // Read data back - ASSERT_THAT(AdbcStatementSetSqlQuery(&statement, "SELECT * FROM bulk_ingest", &error), - IsOkStatus(&error)); + ASSERT_THAT( + AdbcStatementSetSqlQuery(&statement, "SELECT * FROM \"bulk_ingest\"", &error), + IsOkStatus(&error)); { StreamReader reader; ASSERT_THAT(AdbcStatementExecuteQuery(&statement, &reader.stream.value, @@ -766,8 +772,9 @@ void StatementTest::TestSqlIngestCreateAppend() { ASSERT_THAT(rows_affected, ::testing::AnyOf(::testing::Eq(2), ::testing::Eq(-1))); // Read data back - ASSERT_THAT(AdbcStatementSetSqlQuery(&statement, "SELECT * FROM bulk_ingest", &error), - IsOkStatus(&error)); + ASSERT_THAT( + AdbcStatementSetSqlQuery(&statement, "SELECT * FROM \"bulk_ingest\"", &error), + IsOkStatus(&error)); { StreamReader reader; ASSERT_THAT(AdbcStatementExecuteQuery(&statement, &reader.stream.value, @@ -858,6 +865,10 @@ void StatementTest::TestSqlIngestErrors() { ::testing::Not(IsOkStatus(&error))); if (error.release) error.release(&error); + if (!quirks()->supports_error_on_incompatible_schema()) { + return; + } + // ...then try to append an incompatible schema ASSERT_THAT(MakeSchema(&schema.value, {{"int64s", NANOARROW_TYPE_INT64}, {"coltwo", NANOARROW_TYPE_INT64}}), @@ -912,8 +923,8 @@ void StatementTest::TestSqlIngestMultipleConnections() { ASSERT_THAT( AdbcStatementSetSqlQuery( - &statement, "SELECT * FROM bulk_ingest ORDER BY \"int64s\" DESC NULLS LAST", - &error), + &statement, + "SELECT * FROM \"bulk_ingest\" ORDER BY \"int64s\" DESC NULLS LAST", &error), IsOkStatus(&error)); { @@ -954,10 +965,11 @@ void StatementTest::TestSqlIngestSample() { IsOkStatus(&error)); ASSERT_THAT(AdbcStatementNew(&connection, &statement, &error), IsOkStatus(&error)); - ASSERT_THAT(AdbcStatementSetSqlQuery( - &statement, "SELECT * FROM bulk_ingest ORDER BY int64s ASC NULLS FIRST", - &error), - IsOkStatus(&error)); + ASSERT_THAT( + AdbcStatementSetSqlQuery( + &statement, "SELECT * FROM \"bulk_ingest\" ORDER BY int64s ASC NULLS FIRST", + &error), + IsOkStatus(&error)); StreamReader reader; ASSERT_THAT(AdbcStatementExecuteQuery(&statement, &reader.stream.value, &reader.rows_affected, &error), @@ -1863,7 +1875,7 @@ void StatementTest::TestSqlPrepareUpdate() { // Prepare std::string query = - "INSERT INTO bulk_ingest VALUES (" + quirks()->BindParameter(0) + ")"; + "INSERT INTO \"bulk_ingest\" VALUES (" + quirks()->BindParameter(0) + ")"; ASSERT_THAT(AdbcStatementSetSqlQuery(&statement, query.c_str(), &error), IsOkStatus(&error)); ASSERT_THAT(AdbcStatementPrepare(&statement, &error), IsOkStatus(&error)); @@ -1879,8 +1891,9 @@ void StatementTest::TestSqlPrepareUpdate() { IsOkStatus(&error)); // Read data back - ASSERT_THAT(AdbcStatementSetSqlQuery(&statement, "SELECT * FROM bulk_ingest", &error), - IsOkStatus(&error)); + ASSERT_THAT( + AdbcStatementSetSqlQuery(&statement, "SELECT * FROM \"bulk_ingest\"", &error), + IsOkStatus(&error)); { StreamReader reader; ASSERT_THAT(AdbcStatementExecuteQuery(&statement, &reader.stream.value, @@ -1958,7 +1971,7 @@ void StatementTest::TestSqlPrepareUpdateStream() { // Prepare std::string query = - "INSERT INTO bulk_ingest VALUES (" + quirks()->BindParameter(0) + ")"; + "INSERT INTO \"bulk_ingest\" VALUES (" + quirks()->BindParameter(0) + ")"; ASSERT_THAT(AdbcStatementSetSqlQuery(&statement, query.c_str(), &error), IsOkStatus(&error)); ASSERT_THAT(AdbcStatementPrepare(&statement, &error), IsOkStatus(&error)); @@ -1970,8 +1983,9 @@ void StatementTest::TestSqlPrepareUpdateStream() { IsOkStatus(&error)); // Read data back - ASSERT_THAT(AdbcStatementSetSqlQuery(&statement, "SELECT * FROM bulk_ingest", &error), - IsOkStatus(&error)); + ASSERT_THAT( + AdbcStatementSetSqlQuery(&statement, "SELECT * FROM \"bulk_ingest\"", &error), + IsOkStatus(&error)); { StreamReader reader; ASSERT_THAT(AdbcStatementExecuteQuery(&statement, &reader.stream.value, @@ -2201,16 +2215,16 @@ void StatementTest::TestSqlQueryInsertRollback() { IsOkStatus(&error)); ASSERT_THAT(AdbcStatementNew(&connection, &statement, &error), IsOkStatus(&error)); - ASSERT_THAT( - AdbcStatementSetSqlQuery(&statement, "CREATE TABLE rollbacktest (a INT)", &error), - IsOkStatus(&error)); + ASSERT_THAT(AdbcStatementSetSqlQuery(&statement, + "CREATE TABLE \"rollbacktest\" (a INT)", &error), + IsOkStatus(&error)); ASSERT_THAT(AdbcStatementExecuteQuery(&statement, nullptr, nullptr, &error), IsOkStatus(&error)); ASSERT_THAT(AdbcConnectionCommit(&connection, &error), IsOkStatus(&error)); - ASSERT_THAT(AdbcStatementSetSqlQuery(&statement, - "INSERT INTO rollbacktest (a) VALUES (1)", &error), + ASSERT_THAT(AdbcStatementSetSqlQuery( + &statement, "INSERT INTO \"rollbacktest\" (a) VALUES (1)", &error), IsOkStatus(&error)); ASSERT_THAT(AdbcStatementExecuteQuery(&statement, nullptr, nullptr, &error), IsOkStatus(&error)); @@ -2218,8 +2232,9 @@ void StatementTest::TestSqlQueryInsertRollback() { ASSERT_THAT(AdbcConnectionRollback(&connection, &error), IsOkStatus(&error)); adbc_validation::StreamReader reader; - ASSERT_THAT(AdbcStatementSetSqlQuery(&statement, "SELECT * FROM rollbacktest", &error), - IsOkStatus(&error)); + ASSERT_THAT( + AdbcStatementSetSqlQuery(&statement, "SELECT * FROM \"rollbacktest\"", &error), + IsOkStatus(&error)); ASSERT_THAT(AdbcStatementExecuteQuery(&statement, &reader.stream.value, &reader.rows_affected, &error), IsOkStatus(&error)); @@ -2298,21 +2313,22 @@ void StatementTest::TestSqlQueryRowsAffectedDelete() { IsOkStatus(&error)); ASSERT_THAT(AdbcStatementNew(&connection, &statement, &error), IsOkStatus(&error)); - ASSERT_THAT( - AdbcStatementSetSqlQuery(&statement, "CREATE TABLE delete_test (foo INT)", &error), - IsOkStatus(&error)); + ASSERT_THAT(AdbcStatementSetSqlQuery(&statement, + "CREATE TABLE \"delete_test\" (foo INT)", &error), + IsOkStatus(&error)); ASSERT_THAT(AdbcStatementExecuteQuery(&statement, nullptr, nullptr, &error), IsOkStatus(&error)); - ASSERT_THAT(AdbcStatementSetSqlQuery( - &statement, - "INSERT INTO delete_test (foo) VALUES (1), (2), (3), (4), (5)", &error), - IsOkStatus(&error)); + ASSERT_THAT( + AdbcStatementSetSqlQuery( + &statement, "INSERT INTO \"delete_test\" (foo) VALUES (1), (2), (3), (4), (5)", + &error), + IsOkStatus(&error)); ASSERT_THAT(AdbcStatementExecuteQuery(&statement, nullptr, nullptr, &error), IsOkStatus(&error)); - ASSERT_THAT(AdbcStatementSetSqlQuery(&statement, - "DELETE FROM delete_test WHERE foo >= 3", &error), + ASSERT_THAT(AdbcStatementSetSqlQuery( + &statement, "DELETE FROM \"delete_test\" WHERE foo >= 3", &error), IsOkStatus(&error)); int64_t rows_affected = 0; @@ -2326,29 +2342,30 @@ void StatementTest::TestSqlQueryRowsAffectedDeleteStream() { IsOkStatus(&error)); ASSERT_THAT(AdbcStatementNew(&connection, &statement, &error), IsOkStatus(&error)); - ASSERT_THAT( - AdbcStatementSetSqlQuery(&statement, "CREATE TABLE delete_test (foo INT)", &error), - IsOkStatus(&error)); + ASSERT_THAT(AdbcStatementSetSqlQuery(&statement, + "CREATE TABLE \"delete_test\" (foo INT)", &error), + IsOkStatus(&error)); ASSERT_THAT(AdbcStatementExecuteQuery(&statement, nullptr, nullptr, &error), IsOkStatus(&error)); - ASSERT_THAT(AdbcStatementSetSqlQuery( - &statement, - "INSERT INTO delete_test (foo) VALUES (1), (2), (3), (4), (5)", &error), - IsOkStatus(&error)); + ASSERT_THAT( + AdbcStatementSetSqlQuery( + &statement, "INSERT INTO \"delete_test\" (foo) VALUES (1), (2), (3), (4), (5)", + &error), + IsOkStatus(&error)); ASSERT_THAT(AdbcStatementExecuteQuery(&statement, nullptr, nullptr, &error), IsOkStatus(&error)); - ASSERT_THAT(AdbcStatementSetSqlQuery(&statement, - "DELETE FROM delete_test WHERE foo >= 3", &error), + ASSERT_THAT(AdbcStatementSetSqlQuery( + &statement, "DELETE FROM \"delete_test\" WHERE foo >= 3", &error), IsOkStatus(&error)); adbc_validation::StreamReader reader; - ASSERT_THAT(AdbcStatementExecuteQuery(&statement, &reader.stream.value, - &reader.rows_affected, &error), - IsOkStatus(&error)); + ASSERT_THAT( + AdbcStatementExecuteQuery(&statement, nullptr, &reader.rows_affected, &error), + IsOkStatus(&error)); ASSERT_THAT(reader.rows_affected, - ::testing::AnyOf(::testing::Eq(5), ::testing::Eq(-1))); + ::testing::AnyOf(::testing::Eq(3), ::testing::Eq(-1))); } void StatementTest::TestTransactions() { @@ -2393,9 +2410,9 @@ void StatementTest::TestTransactions() { ASSERT_THAT(AdbcStatementNew(&connection, &statement.value, &error), IsOkStatus(&error)); - ASSERT_THAT( - AdbcStatementSetSqlQuery(&statement.value, "SELECT * FROM bulk_ingest", &error), - IsOkStatus(&error)); + ASSERT_THAT(AdbcStatementSetSqlQuery(&statement.value, + "SELECT * FROM \"bulk_ingest\"", &error), + IsOkStatus(&error)); ASSERT_THAT(AdbcStatementExecuteQuery(&statement.value, &reader.stream.value, &reader.rows_affected, &error), IsOkStatus(&error)); @@ -2410,8 +2427,8 @@ void StatementTest::TestTransactions() { StreamReader reader; CHECK_OK(AdbcStatementNew(&connection2.value, &statement.value, &error)); - CHECK_OK(AdbcStatementSetSqlQuery(&statement.value, - "SELECT * FROM bulk_ingest", &error)); + CHECK_OK(AdbcStatementSetSqlQuery( + &statement.value, "SELECT * FROM \"bulk_ingest\"", &error)); CHECK_OK(AdbcStatementExecuteQuery(&statement.value, &reader.stream.value, &reader.rows_affected, &error)); return ADBC_STATUS_OK; @@ -2429,8 +2446,8 @@ void StatementTest::TestTransactions() { StreamReader reader; CHECK_OK(AdbcStatementNew(&connection, &statement.value, &error)); - CHECK_OK(AdbcStatementSetSqlQuery(&statement.value, - "SELECT * FROM bulk_ingest", &error)); + CHECK_OK(AdbcStatementSetSqlQuery( + &statement.value, "SELECT * FROM \"bulk_ingest\"", &error)); CHECK_OK(AdbcStatementExecuteQuery(&statement.value, &reader.stream.value, &reader.rows_affected, &error)); return ADBC_STATUS_OK; @@ -2449,9 +2466,9 @@ void StatementTest::TestTransactions() { ASSERT_THAT(AdbcStatementNew(&connection2.value, &statement.value, &error), IsOkStatus(&error)); - ASSERT_THAT( - AdbcStatementSetSqlQuery(&statement.value, "SELECT * FROM bulk_ingest", &error), - IsOkStatus(&error)); + ASSERT_THAT(AdbcStatementSetSqlQuery(&statement.value, + "SELECT * FROM \"bulk_ingest\"", &error), + IsOkStatus(&error)); ASSERT_THAT(AdbcStatementExecuteQuery(&statement.value, &reader.stream.value, &reader.rows_affected, &error), IsOkStatus(&error)); diff --git a/go/adbc/driver/flightsql/flightsql_adbc_test.go b/go/adbc/driver/flightsql/flightsql_adbc_test.go index 8bce6e4428..3ae93e43fb 100644 --- a/go/adbc/driver/flightsql/flightsql_adbc_test.go +++ b/go/adbc/driver/flightsql/flightsql_adbc_test.go @@ -236,13 +236,14 @@ func (s *FlightSQLQuirks) SupportsConcurrentStatements() bool { return true } func (s *FlightSQLQuirks) SupportsCurrentCatalogSchema() bool { return false } // The driver supports it, but the server we use for testing does not. -func (s *FlightSQLQuirks) SupportsExecuteSchema() bool { return false } -func (s *FlightSQLQuirks) SupportsGetSetOptions() bool { return true } -func (s *FlightSQLQuirks) SupportsPartitionedData() bool { return true } -func (s *FlightSQLQuirks) SupportsStatistics() bool { return false } -func (s *FlightSQLQuirks) SupportsTransactions() bool { return true } -func (s *FlightSQLQuirks) SupportsGetParameterSchema() bool { return false } -func (s *FlightSQLQuirks) SupportsDynamicParameterBinding() bool { return true } +func (s *FlightSQLQuirks) SupportsErrorIngestIncompatibleSchema() bool { return true } +func (s *FlightSQLQuirks) SupportsExecuteSchema() bool { return false } +func (s *FlightSQLQuirks) SupportsGetSetOptions() bool { return true } +func (s *FlightSQLQuirks) SupportsPartitionedData() bool { return true } +func (s *FlightSQLQuirks) SupportsStatistics() bool { return false } +func (s *FlightSQLQuirks) SupportsTransactions() bool { return true } +func (s *FlightSQLQuirks) SupportsGetParameterSchema() bool { return false } +func (s *FlightSQLQuirks) SupportsDynamicParameterBinding() bool { return true } func (s *FlightSQLQuirks) GetMetadata(code adbc.InfoCode) interface{} { switch code { case adbc.InfoDriverName: diff --git a/go/adbc/driver/snowflake/bulk_ingestion.go b/go/adbc/driver/snowflake/bulk_ingestion.go index 2c2d96b532..5e1f1314fe 100644 --- a/go/adbc/driver/snowflake/bulk_ingestion.go +++ b/go/adbc/driver/snowflake/bulk_ingestion.go @@ -29,6 +29,7 @@ import ( "io" "math" "runtime" + "strconv" "strings" "sync" @@ -129,6 +130,15 @@ func (st *statement) ingestRecord(ctx context.Context) (nrows int64, err error) st.bound = nil }() + var initialRows int64 + + // Check final row count of target table to get definitive rows affected + initialRows, err = countRowsInTable(ctx, st.cnxn.sqldb, strconv.Quote(st.targetTable)) + if err != nil { + st.bound.Release() + return + } + parquetProps, arrowProps := newWriterProps(st.alloc, st.ingestOptions) g := errgroup.Group{} @@ -172,13 +182,14 @@ func (st *statement) ingestRecord(ctx context.Context) (nrows int64, err error) } // Load the uploaded file into the target table - _, err = st.cnxn.cn.ExecContext(ctx, copyQuery, []driver.NamedValue{{Value: st.targetTable}}) + _, err = st.cnxn.cn.ExecContext(ctx, copyQuery, []driver.NamedValue{{Value: strconv.Quote(st.targetTable)}}) if err != nil { return } // Check final row count of target table to get definitive rows affected - nrows, err = countRowsInTable(ctx, st.cnxn.sqldb, st.targetTable) + nrows, err = countRowsInTable(ctx, st.cnxn.sqldb, strconv.Quote(st.targetTable)) + nrows = nrows - initialRows return } @@ -192,11 +203,19 @@ func (st *statement) ingestStream(ctx context.Context) (nrows int64, err error) st.streamBind.Release() st.streamBind = nil }() + + var initialRows int64 + // Check final row count of target table to get definitive rows affected + initialRows, err = countRowsInTable(ctx, st.cnxn.sqldb, strconv.Quote(st.targetTable)) + if err != nil { + return + } + defer func() { // Always check the resulting row count, even in the case of an error. We may have ingested part of the data. ctx := context.Background() // TODO(joellubi): switch to context.WithoutCancel(ctx) once we're on Go 1.21 - n, countErr := countRowsInTable(ctx, st.cnxn.sqldb, st.targetTable) - nrows = n + n, countErr := countRowsInTable(ctx, st.cnxn.sqldb, strconv.Quote(st.targetTable)) + nrows = n - initialRows // Ingestion, row-count check, or both could have failed // Wrap any failures as ADBC errors @@ -249,7 +268,7 @@ func (st *statement) ingestStream(ctx context.Context) (nrows int64, err error) } // Kickoff background tasks to COPY Parquet files into Snowflake table as they are uploaded - fileReady, finishCopy, cancelCopy := runCopyTasks(ctx, st.cnxn.cn, st.targetTable, int(st.ingestOptions.copyConcurrency)) + fileReady, finishCopy, cancelCopy := runCopyTasks(ctx, st.cnxn.cn, strconv.Quote(st.targetTable), int(st.ingestOptions.copyConcurrency)) // Read Parquet files from buffer pool and upload to Snowflake stage in parallel g.Go(func() error { @@ -527,7 +546,7 @@ func countRowsInTable(ctx context.Context, db *sql.DB, tableName string) (int64, row := db.QueryRowContext(ctx, countQuery, tableName) if err := row.Scan(&nrows); err != nil { - return 0, err + return 0, errToAdbcErr(adbc.StatusIO, err) } return nrows, nil diff --git a/go/adbc/driver/snowflake/connection.go b/go/adbc/driver/snowflake/connection.go index 5855c875ec..1de2b6ae41 100644 --- a/go/adbc/driver/snowflake/connection.go +++ b/go/adbc/driver/snowflake/connection.go @@ -968,14 +968,14 @@ func (c *cnxn) GetTableSchema(ctx context.Context, catalog *string, dbSchema *st defer rows.Close() var ( - name, typ, kind, isnull, primary, unique string - def, check, expr, comment, policyName sql.NullString - fields = []arrow.Field{} + name, typ, kind, isnull, primary, unique string + def, check, expr, comment, policyName, privDomain sql.NullString + fields = []arrow.Field{} ) for rows.Next() { err := rows.Scan(&name, &typ, &kind, &isnull, &def, &primary, &unique, - &check, &expr, &comment, &policyName) + &check, &expr, &comment, &policyName, &privDomain) if err != nil { return nil, errToAdbcErr(adbc.StatusIO, err) } diff --git a/go/adbc/driver/snowflake/driver_test.go b/go/adbc/driver/snowflake/driver_test.go index f7b5ac4c13..5752ae5eec 100644 --- a/go/adbc/driver/snowflake/driver_test.go +++ b/go/adbc/driver/snowflake/driver_test.go @@ -143,7 +143,7 @@ func getArr(arr arrow.Array) interface{} { func (s *SnowflakeQuirks) CreateSampleTable(tableName string, r arrow.Record) error { var b strings.Builder b.WriteString("CREATE OR REPLACE TABLE ") - b.WriteString(tableName) + b.WriteString(strconv.Quote(tableName)) b.WriteString(" (") for i := 0; i < int(r.NumCols()); i++ { @@ -164,7 +164,7 @@ func (s *SnowflakeQuirks) CreateSampleTable(tableName string, r arrow.Record) er return err } - insertQuery := "INSERT INTO " + tableName + " VALUES (" + insertQuery := "INSERT INTO " + strconv.Quote(tableName) + " VALUES (" bindings := strings.Repeat("?,", int(r.NumCols())) insertQuery += bindings[:len(bindings)-1] + ")" @@ -184,7 +184,7 @@ func (s *SnowflakeQuirks) DropTable(cnxn adbc.Connection, tblname string) error } defer stmt.Close() - if err = stmt.SetSqlQuery(`DROP TABLE IF EXISTS ` + tblname); err != nil { + if err = stmt.SetSqlQuery(`DROP TABLE IF EXISTS ` + strconv.Quote(tblname)); err != nil { return err } @@ -192,20 +192,21 @@ func (s *SnowflakeQuirks) DropTable(cnxn adbc.Connection, tblname string) error return err } -func (s *SnowflakeQuirks) Alloc() memory.Allocator { return s.mem } -func (s *SnowflakeQuirks) BindParameter(_ int) string { return "?" } -func (s *SnowflakeQuirks) SupportsBulkIngest(string) bool { return true } -func (s *SnowflakeQuirks) SupportsConcurrentStatements() bool { return true } -func (s *SnowflakeQuirks) SupportsCurrentCatalogSchema() bool { return true } -func (s *SnowflakeQuirks) SupportsExecuteSchema() bool { return true } -func (s *SnowflakeQuirks) SupportsGetSetOptions() bool { return true } -func (s *SnowflakeQuirks) SupportsPartitionedData() bool { return false } -func (s *SnowflakeQuirks) SupportsStatistics() bool { return false } -func (s *SnowflakeQuirks) SupportsTransactions() bool { return true } -func (s *SnowflakeQuirks) SupportsGetParameterSchema() bool { return false } -func (s *SnowflakeQuirks) SupportsDynamicParameterBinding() bool { return false } -func (s *SnowflakeQuirks) Catalog() string { return s.catalogName } -func (s *SnowflakeQuirks) DBSchema() string { return s.schemaName } +func (s *SnowflakeQuirks) Alloc() memory.Allocator { return s.mem } +func (s *SnowflakeQuirks) BindParameter(_ int) string { return "?" } +func (s *SnowflakeQuirks) SupportsBulkIngest(string) bool { return true } +func (s *SnowflakeQuirks) SupportsConcurrentStatements() bool { return true } +func (s *SnowflakeQuirks) SupportsCurrentCatalogSchema() bool { return true } +func (s *SnowflakeQuirks) SupportsExecuteSchema() bool { return true } +func (s *SnowflakeQuirks) SupportsGetSetOptions() bool { return true } +func (s *SnowflakeQuirks) SupportsPartitionedData() bool { return false } +func (s *SnowflakeQuirks) SupportsStatistics() bool { return false } +func (s *SnowflakeQuirks) SupportsTransactions() bool { return true } +func (s *SnowflakeQuirks) SupportsGetParameterSchema() bool { return false } +func (s *SnowflakeQuirks) SupportsDynamicParameterBinding() bool { return false } +func (s *SnowflakeQuirks) SupportsErrorIngestIncompatibleSchema() bool { return false } +func (s *SnowflakeQuirks) Catalog() string { return s.catalogName } +func (s *SnowflakeQuirks) DBSchema() string { return s.schemaName } func (s *SnowflakeQuirks) GetMetadata(code adbc.InfoCode) interface{} { switch code { case adbc.InfoDriverName: @@ -281,7 +282,9 @@ func withQuirks(t *testing.T, fn func(*SnowflakeQuirks)) { // avoid multiple runs clashing by operating in a fresh schema and then // dropping that schema when we're done. q := &SnowflakeQuirks{dsn: uri, catalogName: database, schemaName: createTempSchema(database, uri)} - defer dropTempSchema(uri, q.schemaName) + t.Cleanup(func() { + dropTempSchema(uri, q.schemaName) + }) fn(q) } @@ -380,7 +383,7 @@ func (suite *SnowflakeTests) TestSqlIngestTimestamp() { suite.Require().NoError(err) suite.EqualValues(3, n) - suite.Require().NoError(suite.stmt.SetSqlQuery("SELECT * FROM bulk_ingest ORDER BY \"col\" ASC NULLS FIRST")) + suite.Require().NoError(suite.stmt.SetSqlQuery(`SELECT * FROM "bulk_ingest" ORDER BY "col" ASC NULLS FIRST`)) rdr, n, err := suite.stmt.ExecuteQuery(suite.ctx) suite.Require().NoError(err) defer rdr.Release() @@ -486,7 +489,7 @@ func (suite *SnowflakeTests) TestSqlIngestRecordAndStreamAreEquivalent() { suite.Require().NoError(err) suite.EqualValues(3, n) - suite.Require().NoError(suite.stmt.SetSqlQuery("SELECT * FROM bulk_ingest_bind ORDER BY \"col_int64\" ASC")) + suite.Require().NoError(suite.stmt.SetSqlQuery(`SELECT * FROM "bulk_ingest_bind" ORDER BY "col_int64" ASC`)) rdr, n, err := suite.stmt.ExecuteQuery(suite.ctx) suite.Require().NoError(err) defer rdr.Release() @@ -509,7 +512,7 @@ func (suite *SnowflakeTests) TestSqlIngestRecordAndStreamAreEquivalent() { suite.Require().NoError(err) suite.EqualValues(3, n) - suite.Require().NoError(suite.stmt.SetSqlQuery("SELECT * FROM bulk_ingest_bind_stream ORDER BY \"col_int64\" ASC")) + suite.Require().NoError(suite.stmt.SetSqlQuery(`SELECT * FROM "bulk_ingest_bind_stream" ORDER BY "col_int64" ASC`)) rdr, n, err = suite.stmt.ExecuteQuery(suite.ctx) suite.Require().NoError(err) defer rdr.Release() @@ -596,7 +599,7 @@ func (suite *SnowflakeTests) TestSqlIngestRoundtripTypes() { suite.Require().NoError(err) suite.EqualValues(3, n) - suite.Require().NoError(suite.stmt.SetSqlQuery("SELECT * FROM bulk_ingest_roundtrip ORDER BY \"col_int64\" ASC")) + suite.Require().NoError(suite.stmt.SetSqlQuery(`SELECT * FROM "bulk_ingest_roundtrip" ORDER BY "col_int64" ASC`)) rdr, n, err := suite.stmt.ExecuteQuery(suite.ctx) suite.Require().NoError(err) defer rdr.Release() @@ -672,7 +675,7 @@ func (suite *SnowflakeTests) TestSqlIngestTimestampTypes() { suite.Require().NoError(err) suite.EqualValues(3, n) - suite.Require().NoError(suite.stmt.SetSqlQuery("SELECT * FROM bulk_ingest_timestamps ORDER BY \"col_int64\" ASC")) + suite.Require().NoError(suite.stmt.SetSqlQuery(`SELECT * FROM "bulk_ingest_timestamps" ORDER BY "col_int64" ASC`)) rdr, n, err := suite.stmt.ExecuteQuery(suite.ctx) suite.Require().NoError(err) defer rdr.Release() @@ -784,7 +787,7 @@ func (suite *SnowflakeTests) TestSqlIngestDate64Type() { suite.Require().NoError(err) suite.EqualValues(3, n) - suite.Require().NoError(suite.stmt.SetSqlQuery("SELECT * FROM bulk_ingest_date64 ORDER BY \"col_int64\" ASC")) + suite.Require().NoError(suite.stmt.SetSqlQuery(`SELECT * FROM "bulk_ingest_date64" ORDER BY "col_int64" ASC`)) rdr, n, err := suite.stmt.ExecuteQuery(suite.ctx) suite.Require().NoError(err) defer rdr.Release() @@ -877,7 +880,7 @@ func (suite *SnowflakeTests) TestSqlIngestHighPrecision() { suite.Require().NoError(err) suite.EqualValues(3, n) - suite.Require().NoError(suite.stmt.SetSqlQuery("SELECT * FROM bulk_ingest_high_precision ORDER BY \"col_int64\" ASC")) + suite.Require().NoError(suite.stmt.SetSqlQuery(`SELECT * FROM "bulk_ingest_high_precision" ORDER BY "col_int64" ASC`)) suite.Require().NoError(suite.stmt.SetOption(driver.OptionUseHighPrecision, adbc.OptionValueEnabled)) defer func() { suite.Require().NoError(suite.stmt.SetOption(driver.OptionUseHighPrecision, adbc.OptionValueDisabled)) @@ -988,7 +991,7 @@ func (suite *SnowflakeTests) TestSqlIngestLowPrecision() { suite.Require().NoError(err) suite.EqualValues(3, n) - suite.Require().NoError(suite.stmt.SetSqlQuery("SELECT * FROM bulk_ingest_high_precision ORDER BY \"col_int64\" ASC")) + suite.Require().NoError(suite.stmt.SetSqlQuery(`SELECT * FROM "bulk_ingest_high_precision" ORDER BY "col_int64" ASC`)) // OptionUseHighPrecision already disabled rdr, n, err := suite.stmt.ExecuteQuery(suite.ctx) suite.Require().NoError(err) @@ -1106,7 +1109,7 @@ func (suite *SnowflakeTests) TestSqlIngestStructType() { suite.Require().NoError(err) suite.EqualValues(3, n) - suite.Require().NoError(suite.stmt.SetSqlQuery("SELECT * FROM bulk_ingest_struct ORDER BY \"col_int64\" ASC")) + suite.Require().NoError(suite.stmt.SetSqlQuery(`SELECT * FROM "bulk_ingest_struct" ORDER BY "col_int64" ASC`)) rdr, n, err := suite.stmt.ExecuteQuery(suite.ctx) suite.Require().NoError(err) defer rdr.Release() @@ -1210,7 +1213,7 @@ func (suite *SnowflakeTests) TestSqlIngestMapType() { suite.Require().NoError(err) suite.EqualValues(3, n) - suite.Require().NoError(suite.stmt.SetSqlQuery("SELECT * FROM bulk_ingest_map ORDER BY \"col_int64\" ASC")) + suite.Require().NoError(suite.stmt.SetSqlQuery(`SELECT * FROM "bulk_ingest_map" ORDER BY "col_int64" ASC`)) rdr, n, err := suite.stmt.ExecuteQuery(suite.ctx) suite.Require().NoError(err) defer rdr.Release() @@ -1299,7 +1302,7 @@ func (suite *SnowflakeTests) TestSqlIngestListType() { suite.Require().NoError(err) suite.EqualValues(3, n) - suite.Require().NoError(suite.stmt.SetSqlQuery("SELECT * FROM bulk_ingest_list ORDER BY \"col_int64\" ASC")) + suite.Require().NoError(suite.stmt.SetSqlQuery(`SELECT * FROM "bulk_ingest_list" ORDER BY "col_int64" ASC`)) rdr, n, err := suite.stmt.ExecuteQuery(suite.ctx) suite.Require().NoError(err) defer rdr.Release() diff --git a/go/adbc/driver/snowflake/statement.go b/go/adbc/driver/snowflake/statement.go index 8e4d5a5284..8439ddfcd4 100644 --- a/go/adbc/driver/snowflake/statement.go +++ b/go/adbc/driver/snowflake/statement.go @@ -361,7 +361,7 @@ func (st *statement) initIngest(ctx context.Context) error { if st.ingestMode == adbc.OptionValueIngestModeCreateAppend { createBldr.WriteString(" IF NOT EXISTS ") } - createBldr.WriteString(st.targetTable) + createBldr.WriteString(strconv.Quote(st.targetTable)) createBldr.WriteString(" (") var schema *arrow.Schema @@ -398,7 +398,7 @@ func (st *statement) initIngest(ctx context.Context) error { case adbc.OptionValueIngestModeAppend: // Do nothing case adbc.OptionValueIngestModeReplace: - replaceQuery := "DROP TABLE IF EXISTS " + st.targetTable + replaceQuery := "DROP TABLE IF EXISTS " + strconv.Quote(st.targetTable) _, err := st.cnxn.cn.ExecContext(ctx, replaceQuery, nil) if err != nil { return errToAdbcErr(adbc.StatusInternal, err) diff --git a/go/adbc/go.mod b/go/adbc/go.mod index 6322f5f8ea..7e7b605ea6 100644 --- a/go/adbc/go.mod +++ b/go/adbc/go.mod @@ -23,13 +23,13 @@ require ( github.com/apache/arrow/go/v16 v16.0.0-20240129203910-c2ca9bcedeb0 github.com/bluele/gcache v0.0.2 github.com/golang/protobuf v1.5.3 - github.com/google/uuid v1.3.1 - github.com/snowflakedb/gosnowflake v1.7.2 + github.com/google/uuid v1.6.0 + github.com/snowflakedb/gosnowflake v1.8.0 github.com/stretchr/testify v1.8.4 github.com/youmark/pkcs8 v0.0.0-20201027041543-1326539a0a0a - golang.org/x/exp v0.0.0-20240119083558-1b970713d09a + golang.org/x/exp v0.0.0-20240213143201-ec583247a57a golang.org/x/sync v0.6.0 - golang.org/x/tools v0.17.0 + golang.org/x/tools v0.18.0 google.golang.org/grpc v1.58.3 google.golang.org/protobuf v1.31.0 ) @@ -37,26 +37,26 @@ require ( require ( github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 // indirect github.com/99designs/keyring v1.2.2 // indirect - github.com/Azure/azure-sdk-for-go/sdk/azcore v1.9.1 // indirect - github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.1 // indirect - github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.2.1 // indirect + github.com/Azure/azure-sdk-for-go/sdk/azcore v1.9.2 // indirect + github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.2 // indirect + github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.3.0 // indirect github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c // indirect github.com/andybalholm/brotli v1.0.5 // indirect github.com/apache/arrow/go/v14 v14.0.2 // indirect github.com/apache/thrift v0.17.0 // indirect - github.com/aws/aws-sdk-go-v2 v1.24.1 // indirect - github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.5.4 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.16.16 // indirect - github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.15.13 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.10 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.10 // indirect - github.com/aws/aws-sdk-go-v2/internal/v4a v1.2.10 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.4 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.2.10 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.10 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.16.10 // indirect - github.com/aws/aws-sdk-go-v2/service/s3 v1.48.0 // indirect - github.com/aws/smithy-go v1.19.0 // indirect + github.com/aws/aws-sdk-go-v2 v1.25.1 // indirect + github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.1 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.17.2 // indirect + github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.16.4 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.1 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.1 // indirect + github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.1 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.1 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.1 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.1 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.1 // indirect + github.com/aws/aws-sdk-go-v2/service/s3 v1.50.3 // indirect + github.com/aws/smithy-go v1.20.1 // indirect github.com/danieljoos/wincred v1.2.1 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/dustin/go-humanize v1.0.1 // indirect @@ -71,8 +71,8 @@ require ( github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect github.com/klauspost/asmfmt v1.3.2 // indirect - github.com/klauspost/compress v1.17.4 // indirect - github.com/klauspost/cpuid/v2 v2.2.6 // indirect + github.com/klauspost/compress v1.17.7 // indirect + github.com/klauspost/cpuid/v2 v2.2.7 // indirect github.com/mattn/go-isatty v0.0.19 // indirect github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8 // indirect github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3 // indirect @@ -83,11 +83,11 @@ require ( github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect github.com/sirupsen/logrus v1.9.3 // indirect github.com/zeebo/xxh3 v1.0.2 // indirect - golang.org/x/crypto v0.18.0 // indirect - golang.org/x/mod v0.14.0 // indirect - golang.org/x/net v0.20.0 // indirect - golang.org/x/sys v0.16.0 // indirect - golang.org/x/term v0.16.0 // indirect + golang.org/x/crypto v0.19.0 // indirect + golang.org/x/mod v0.15.0 // indirect + golang.org/x/net v0.21.0 // indirect + golang.org/x/sys v0.17.0 // indirect + golang.org/x/term v0.17.0 // indirect golang.org/x/text v0.14.0 // indirect golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20231002182017-d307bd883b97 // indirect diff --git a/go/adbc/go.sum b/go/adbc/go.sum index ac006ef126..75377ffe63 100644 --- a/go/adbc/go.sum +++ b/go/adbc/go.sum @@ -4,57 +4,95 @@ github.com/99designs/keyring v1.2.2 h1:pZd3neh/EmUzWONb35LxQfvuY7kiSXAq3HQd97+XB github.com/99designs/keyring v1.2.2/go.mod h1:wes/FrByc8j7lFOAGLGSNEg8f/PaI3cgTBqhFkHUrPk= github.com/Azure/azure-sdk-for-go/sdk/azcore v1.9.1 h1:lGlwhPtrX6EVml1hO0ivjkUxsSyl4dsiw9qcA1k/3IQ= github.com/Azure/azure-sdk-for-go/sdk/azcore v1.9.1/go.mod h1:RKUqNu35KJYcVG/fqTRqmuXJZYNhYkBrnC/hX7yGbTA= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.9.2 h1:c4k2FIYIh4xtwqrQwV0Ct1v5+ehlNXj5NI/MWVsiTkQ= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.9.2/go.mod h1:5FDJtLEO/GxwNgUxbwrY3LP0pEoThTQJtk2oysdXHxM= github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.4.0 h1:BMAjVKJM0U/CYF27gA0ZMmXGkOcvfFtD0oHVZ1TIPRI= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.5.1 h1:sO0/P7g68FrryJzljemN+6GTssUXdANk6aJ7T1ZxnsQ= github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.1 h1:6oNBlSdi1QqM1PNW7FPA6xOGA5UNsXnkaYZz9vdPGhA= github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.1/go.mod h1:s4kgfzA0covAXNicZHDMN58jExvcng2mC/DepXiF1EI= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.2 h1:LqbJ/WzJUwBf8UiaSzgX7aMclParm9/5Vgp+TY51uBQ= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.2/go.mod h1:yInRyqWXAuaPrgI7p70+lDDgh3mlBohis29jGMISnmc= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.5.0 h1:AifHbc4mg0x9zW52WOpKbsHaDKuRhlI7TVl47thgQ70= github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.2.1 h1:AMf7YbZOZIW5b66cXNHMWWT/zkjhz5+a+k/3x40EO7E= github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.2.1/go.mod h1:uwfk06ZBcvL/g4VHNjurPfVln9NMbsk2XIZxJ+hu81k= +github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.3.0 h1:IfFdxTUDiV58iZqPKgyWiz4X4fCxZeQ1pTQPImLYXpY= +github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.3.0/go.mod h1:SUZc9YRRHfx2+FAQKNDGrssXehqLpxmwRv2mC/5ntj4= github.com/AzureAD/microsoft-authentication-library-for-go v1.1.1 h1:WpB/QDNLpMw72xHJc34BNNykqSOeEJDAWkhf0u12/Jk= +github.com/AzureAD/microsoft-authentication-library-for-go v1.2.1 h1:DzHpqpoJVaCgOUdVHxE8QB52S6NiVdDQvGlny1qvPqA= github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c h1:RGWPOewvKIROun94nF7v2cua9qP+thov/7M50KEoeSU= github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c/go.mod h1:X0CRv0ky0k6m906ixxpzmDRLvX58TFUKS2eePweuyxk= github.com/andybalholm/brotli v1.0.5 h1:8uQZIdzKmjc/iuPu7O2ioW48L81FgatrcpfFmiq/cCs= github.com/andybalholm/brotli v1.0.5/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/apache/arrow/go/v14 v14.0.2 h1:N8OkaJEOfI3mEZt07BIkvo4sC6XDbL+48MBPWO5IONw= github.com/apache/arrow/go/v14 v14.0.2/go.mod h1:u3fgh3EdgN/YQ8cVQRguVW3R+seMybFg8QBQ5LU+eBY= -github.com/apache/arrow/go/v16 v16.0.0-20240129164147-87dd4c4ceaef h1:Je1d9LheNxMM8UPRCrX32txKT5Et37eODXkAunTVJLI= -github.com/apache/arrow/go/v16 v16.0.0-20240129164147-87dd4c4ceaef/go.mod h1:+HkSDKotr3KDBxj7gTVgj8Egy18Y1ECzQdnY5XsXwlQ= github.com/apache/arrow/go/v16 v16.0.0-20240129203910-c2ca9bcedeb0 h1:ooLFCCZ/sq3KDyrcFBxWweB1wTr1oAIgjj1+Zl3WsRw= github.com/apache/arrow/go/v16 v16.0.0-20240129203910-c2ca9bcedeb0/go.mod h1:+HkSDKotr3KDBxj7gTVgj8Egy18Y1ECzQdnY5XsXwlQ= github.com/apache/thrift v0.17.0 h1:cMd2aj52n+8VoAtvSvLn4kDC3aZ6IAkBuqWQ2IDu7wo= github.com/apache/thrift v0.17.0/go.mod h1:OLxhMRJxomX+1I/KUw03qoV3mMz16BwaKI+d4fPBx7Q= github.com/aws/aws-sdk-go-v2 v1.24.1 h1:xAojnj+ktS95YZlDf0zxWBkbFtymPeDP+rvUQIH3uAU= github.com/aws/aws-sdk-go-v2 v1.24.1/go.mod h1:LNh45Br1YAkEKaAqvmE1m8FUx6a5b/V0oAKV7of29b4= +github.com/aws/aws-sdk-go-v2 v1.25.1 h1:P7hU6A5qEdmajGwvae/zDkOq+ULLC9tQBTwqqiwFGpI= +github.com/aws/aws-sdk-go-v2 v1.25.1/go.mod h1:Evoc5AsmtveRt1komDwIsjHFyrP5tDuF1D1U+6z6pNo= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.5.4 h1:OCs21ST2LrepDfD3lwlQiOqIGp6JiEUqG84GzTDoyJs= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.5.4/go.mod h1:usURWEKSNNAcAZuzRn/9ZYPT8aZQkR7xcCtunK/LkJo= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.1 h1:gTK2uhtAPtFcdRRJilZPx8uJLL2J85xK11nKtWL0wfU= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.1/go.mod h1:sxpLb+nZk7tIfCWChfd+h4QwHNUR57d8hA1cleTkjJo= github.com/aws/aws-sdk-go-v2/config v1.26.5 h1:lodGSevz7d+kkFJodfauThRxK9mdJbyutUxGq1NNhvw= +github.com/aws/aws-sdk-go-v2/config v1.27.2 h1:XnMKB9JRjfnxg9ZkUic4MiapnWJISWRo8HVM+7nx9qQ= github.com/aws/aws-sdk-go-v2/credentials v1.16.16 h1:8q6Rliyv0aUFAVtzaldUEcS+T5gbadPbWdV1WcAddK8= github.com/aws/aws-sdk-go-v2/credentials v1.16.16/go.mod h1:UHVZrdUsv63hPXFo1H7c5fEneoVo9UXiz36QG1GEPi0= +github.com/aws/aws-sdk-go-v2/credentials v1.17.2 h1:tCZXWtH0HiIEZ50NJ7/QEaXmuzEd36L+2JUiZkp2nsc= +github.com/aws/aws-sdk-go-v2/credentials v1.17.2/go.mod h1:7Zo+D6q4auSIo3p4EItuTKTk7J+RqjASISZqLvmUgpc= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.11 h1:c5I5iH+DZcH3xOIMlz3/tCKJDaHFwYEmxvlh2fAcFo8= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.15.1 h1:lk1ZZFbdb24qpOwVC1AwYNrswUjAxeyey6kFBVANudQ= github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.15.13 h1:8Nt4LBUEKV0FxLBO2BmRzDKax3hp2LRMKySMBwL4vMc= github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.15.13/go.mod h1:t5QEDu/FBJJM4kslbQlTSpYtnhoWDNmHSsgQojIxE0o= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.16.4 h1:yuhSpqtahkrC8kRCU5v4gEaTDy/ccTIPIkufIRF7YTk= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.16.4/go.mod h1:q3SxgP2WD9YRLCybtyse8EgO3vKKWVmxlTmBNeRXPyk= github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.10 h1:vF+Zgd9s+H4vOXd5BMaPWykta2a6Ih0AKLq/X6NYKn4= github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.10/go.mod h1:6BkRjejp/GR4411UGqkX8+wFMbFbqsUIimfK4XjOKR4= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.1 h1:evvi7FbTAoFxdP/mixmP7LIYzQWAmzBcwNB/es9XPNc= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.1/go.mod h1:rH61DT6FDdikhPghymripNUCsf+uVF4Cnk4c4DBKH64= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.10 h1:nYPe006ktcqUji8S2mqXf9c/7NdiKriOwMvWQHgYztw= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.10/go.mod h1:6UV4SZkVvmODfXKql4LCbaZUpF7HO2BX38FgBf9ZOLw= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.1 h1:RAnaIrbxPtlXNVI/OIlh1sidTQ3e1qM6LRjs7N0bE0I= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.1/go.mod h1:nbgAGkH5lk0RZRMh6A4K/oG6Xj11eC/1CyDow+DUAFI= github.com/aws/aws-sdk-go-v2/internal/ini v1.7.2 h1:GrSw8s0Gs/5zZ0SX+gX4zQjRnRsMJDJ2sLur1gRBhEM= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0 h1:hT8rVHwugYE2lEfdFE0QWVo81lF7jMrYJVDWI+f+VxU= github.com/aws/aws-sdk-go-v2/internal/v4a v1.2.10 h1:5oE2WzJE56/mVveuDZPJESKlg/00AaS2pY2QZcnxg4M= github.com/aws/aws-sdk-go-v2/internal/v4a v1.2.10/go.mod h1:FHbKWQtRBYUz4vO5WBWjzMD2by126ny5y/1EoaWoLfI= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.1 h1:rtYJd3w6IWCTVS8vmMaiXjW198noh2PBm5CiXyJea9o= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.1/go.mod h1:zvXu+CTlib30LUy4LTNFc6HTZ/K6zCae5YIHTdX9wIo= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.4 h1:/b31bi3YVNlkzkBrm9LfpaKoaYZUxIAj4sHfOTmLfqw= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.4/go.mod h1:2aGXHFmbInwgP9ZfpmdIfOELL79zhdNYNmReK8qDfdQ= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.1 h1:EyBZibRTVAs6ECHZOw5/wlylS9OcTzwyjeQMudmREjE= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.1/go.mod h1:JKpmtYhhPs7D97NL/ltqz7yCkERFW5dOlHyVl66ZYF8= github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.2.10 h1:L0ai8WICYHozIKK+OtPzVJBugL7culcuM4E4JOpIEm8= github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.2.10/go.mod h1:byqfyxJBshFk0fF9YmK0M0ugIO8OWjzH2T3bPG4eGuA= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.1 h1:5Wxh862HkXL9CbQ83BIkWKLIgQapGeuh5zG2G9OZtQk= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.1/go.mod h1:V7GLA01pNUxMCYSQsibdVrqUrNIYIT/9lCOyR8ExNvQ= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.10 h1:DBYTXwIGQSGs9w4jKm60F5dmCQ3EEruxdc0MFh+3EY4= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.10/go.mod h1:wohMUQiFdzo0NtxbBg0mSRGZ4vL3n0dKjLTINdcIino= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.1 h1:cVP8mng1RjDyI3JN/AXFCn5FHNlsBaBH0/MBtG1bg0o= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.1/go.mod h1:C8sQjoyAsdfjC7hpy4+S6B92hnFzx0d0UAyHicaOTIE= github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.16.10 h1:KOxnQeWy5sXyS37fdKEvAsGHOr9fa/qvwxfJurR/BzE= github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.16.10/go.mod h1:jMx5INQFYFYB3lQD9W0D8Ohgq6Wnl7NYOJ2TQndbulI= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.1 h1:OYmmIcyw19f7x0qLBLQ3XsrCZSSyLhxd9GXng5evsN4= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.1/go.mod h1:s5rqdn74Vdg10k61Pwf4ZHEApOSD6CKRe6qpeHDq32I= github.com/aws/aws-sdk-go-v2/service/s3 v1.48.0 h1:PJTdBMsyvra6FtED7JZtDpQrIAflYDHFoZAu/sKYkwU= github.com/aws/aws-sdk-go-v2/service/s3 v1.48.0/go.mod h1:4qXHrG1Ne3VGIMZPCB8OjH/pLFO94sKABIusjh0KWPU= +github.com/aws/aws-sdk-go-v2/service/s3 v1.50.3 h1:Cv/HH7sLzEdJMYQi4MCNHxZeyubQNOOIdVc0VU0lo3Q= +github.com/aws/aws-sdk-go-v2/service/s3 v1.50.3/go.mod h1:lTW7O4iMAnO2o7H3XJTvqaWFZCH6zIPs+eP7RdG/yp0= github.com/aws/aws-sdk-go-v2/service/sso v1.18.7 h1:eajuO3nykDPdYicLlP3AGgOyVN3MOlFmZv7WGTuJPow= +github.com/aws/aws-sdk-go-v2/service/sso v1.19.2 h1:pnj8llQoBAHD4UmbM8UM5GdfycFJKMhgPSeaOyRaZ34= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.21.7 h1:QPMJf+Jw8E1l7zqhZmMlFw6w1NmfkfiSK8mS4zOx3BA= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.22.2 h1:L4yhKxW6HbTSQ08OsvPJuaspaLE40qMgprgXUNFUiMg= github.com/aws/aws-sdk-go-v2/service/sts v1.26.7 h1:NzO4Vrau795RkUdSHKEwiR01FaGzGOH1EETJ+5QHnm0= +github.com/aws/aws-sdk-go-v2/service/sts v1.27.2 h1:Dr+7r/p20XpN+1U5tVNZfA2bLq0kQ9IjVBM0iAyMMLg= github.com/aws/smithy-go v1.19.0 h1:KWFKQV80DpP3vJrrA9sVAHQ5gc2z8i4EzrLhLlWXcBM= github.com/aws/smithy-go v1.19.0/go.mod h1:NukqUGpCZIILqqiV0NIjeFh24kd/FAa4beRb6nbIUPE= +github.com/aws/smithy-go v1.20.1 h1:4SZlSlMr36UEqC7XOyRVb27XMeZubNcBNN+9IgEPIQw= +github.com/aws/smithy-go v1.20.1/go.mod h1:krry+ya/rV9RDcV/Q16kpu6ypI4K2czasz0NC3qS14E= github.com/bluele/gcache v0.0.2 h1:WcbfdXICg7G/DGBh1PFfcirkWOQV+v077yF1pSy3DGw= github.com/bluele/gcache v0.0.2/go.mod h1:m15KV+ECjptwSPxKhOhQoAFQVtUFjTVkc3H8o0t/fp0= github.com/danieljoos/wincred v1.2.1 h1:dl9cBrupW8+r5250DYkYxocLeZ1Y4vB1kxgtjxw8GQs= @@ -76,6 +114,7 @@ github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MG github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 h1:ZpnhV/YsD2/4cESfV5+Hoeu/iUR3ruzNvZ+yQfO03a0= github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= github.com/golang-jwt/jwt/v5 v5.0.0 h1:1n1XNM9hk7O9mnQoNBGolZvzebBQ7p93ULHRc28XJUE= +github.com/golang-jwt/jwt/v5 v5.2.0 h1:d/ix8ftRUorsN+5eMIlF4T6J8CAt9rch3My2winC1Jw= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= @@ -88,6 +127,8 @@ github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26 h1:Xim43kblpZXfIBQsbuBVKCudVG457BR2GZFIz3uw3hQ= github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4= github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c h1:6rhixN/i8ZofjG1Y75iExal34USq5p+wiN1tpie8IrU= github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c/go.mod h1:NMPJylDgVpX0MLRlPy15sqSwOFv/U1GZ2m21JhFfek0= github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= @@ -100,8 +141,12 @@ github.com/klauspost/asmfmt v1.3.2 h1:4Ri7ox3EwapiOjCki+hw14RyKk201CN4rzyCJRFLpK github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE= github.com/klauspost/compress v1.17.4 h1:Ej5ixsIri7BrIjBkRZLTo6ghwrEtHFk7ijlczPW4fZ4= github.com/klauspost/compress v1.17.4/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM= +github.com/klauspost/compress v1.17.7 h1:ehO88t2UGzQK66LMdE8tibEd1ErmzZjNEqWkjLAKQQg= +github.com/klauspost/compress v1.17.7/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= github.com/klauspost/cpuid/v2 v2.2.6 h1:ndNyv040zDGIDh8thGkXYjnFtiN02M1PVVF+JE/48xc= github.com/klauspost/cpuid/v2 v2.2.6/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= +github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuVLDM= +github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= @@ -131,6 +176,8 @@ github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/snowflakedb/gosnowflake v1.7.2 h1:HRSwva8YXC64WUppfmHcMNVVzSE1+EwXXaJxgS0EkTo= github.com/snowflakedb/gosnowflake v1.7.2/go.mod h1:03tW856vc3ceM4rJuj7KO4dzqN7qoezTm+xw7aPIIFo= +github.com/snowflakedb/gosnowflake v1.8.0 h1:4bQj8eAYGMkou/nICiIEb9jSbBLDDp5cB6JaKx9WwiA= +github.com/snowflakedb/gosnowflake v1.8.0/go.mod h1:7yyY2MxtDti2eXgtvlZ8QxzCN6KV2B4qb1HuygMI+0U= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= @@ -145,13 +192,21 @@ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACk golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.18.0 h1:PGVlW0xEltQnzFZ55hkuX5+KLyrMYhHld1YHO4AKcdc= golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= +golang.org/x/crypto v0.19.0 h1:ENy+Az/9Y1vSrlrvBSyna3PITt4tiZLf7sgCjZBX7Wo= +golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= golang.org/x/exp v0.0.0-20240119083558-1b970713d09a h1:Q8/wZp0KX97QFTc2ywcOE0YRjZPVIx+MXInMzdvQqcA= golang.org/x/exp v0.0.0-20240119083558-1b970713d09a/go.mod h1:idGWGoKP1toJGkd5/ig9ZLuPcZBC3ewk7SzmH0uou08= +golang.org/x/exp v0.0.0-20240213143201-ec583247a57a h1:HinSgX1tJRX3KsL//Gxynpw5CTOAIPhgL4W8PNiIpVE= +golang.org/x/exp v0.0.0-20240213143201-ec583247a57a/go.mod h1:CxmFvTBINI24O/j8iY7H1xHzx2i4OsyguNBmN/uPtqc= golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.15.0 h1:SernR4v+D55NyBH2QiEQrlBAnj1ECL6AGrA5+dPaMY8= +golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.20.0 h1:aCL9BSgETF1k+blQaYUBx9hJ9LOGP3gAVemcZlf1Kpo= golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= +golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4= +golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -162,13 +217,19 @@ golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU= golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y= +golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.16.0 h1:m+B6fahuftsE9qjo0VWp2FW0mB3MTJvR0BaMQrq0pmE= golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= +golang.org/x/term v0.17.0 h1:mkTF7LCd6WGJNL3K1Ad7kwxNfYAW6a8a8QqtMblp/4U= +golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/tools v0.17.0 h1:FvmRgNOcs3kOa+T20R1uhfP9F6HgG2mfxDv1vrx1Htc= golang.org/x/tools v0.17.0/go.mod h1:xsh6VxdV005rRVaS6SSAf9oiAqljS7UZUacMZ8Bnsps= +golang.org/x/tools v0.18.0 h1:k8NLag8AGHnn+PHbl7g43CtqZAwG60vZkLqgyZgIHgQ= +golang.org/x/tools v0.18.0/go.mod h1:GL7B4CwcLLeo59yx/9UWWuNOW1n3VZ4f5axWfML7Lcg= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= diff --git a/go/adbc/validation/validation.go b/go/adbc/validation/validation.go index e68ff2a25b..ca594cba0f 100644 --- a/go/adbc/validation/validation.go +++ b/go/adbc/validation/validation.go @@ -64,6 +64,8 @@ type DriverQuirks interface { SupportsGetParameterSchema() bool // Whether it supports dynamic parameter binding in queries SupportsDynamicParameterBinding() bool + // Whether it returns an error when attempting to ingest with an incompatible schema + SupportsErrorIngestIncompatibleSchema() bool // Expected Metadata responses GetMetadata(adbc.InfoCode) interface{} // Create a sample table from an arrow record @@ -800,7 +802,7 @@ func (s *StatementTests) TestSqlIngestInts() { } // use order by clause to ensure we get the same order as the input batch - s.Require().NoError(stmt.SetSqlQuery(`SELECT * FROM bulk_ingest ORDER BY "int64s" DESC NULLS LAST`)) + s.Require().NoError(stmt.SetSqlQuery(`SELECT * FROM "bulk_ingest" ORDER BY "int64s" DESC NULLS LAST`)) rdr, rows, err := stmt.ExecuteQuery(s.ctx) s.Require().NoError(err) if rows != -1 && rows != 3 { @@ -871,7 +873,7 @@ func (s *StatementTests) TestSqlIngestAppend() { } // use order by clause to ensure we get the same order as the input batch - s.Require().NoError(stmt.SetSqlQuery(`SELECT * FROM bulk_ingest ORDER BY "int64s" DESC NULLS LAST`)) + s.Require().NoError(stmt.SetSqlQuery(`SELECT * FROM "bulk_ingest" ORDER BY "int64s" DESC NULLS LAST`)) rdr, rows, err := stmt.ExecuteQuery(s.ctx) s.Require().NoError(err) if rows != -1 && rows != 3 { @@ -945,7 +947,7 @@ func (s *StatementTests) TestSqlIngestReplace() { s.FailNowf("invalid number of affected rows", "should be -1 or 1, got: %d", affected) } - s.Require().NoError(stmt.SetSqlQuery(`SELECT * FROM bulk_ingest`)) + s.Require().NoError(stmt.SetSqlQuery(`SELECT * FROM "bulk_ingest"`)) rdr, rows, err := stmt.ExecuteQuery(s.ctx) s.Require().NoError(err) if rows != -1 && rows != 1 { @@ -1010,7 +1012,7 @@ func (s *StatementTests) TestSqlIngestCreateAppend() { } // validate - s.Require().NoError(stmt.SetSqlQuery(`SELECT * FROM bulk_ingest`)) + s.Require().NoError(stmt.SetSqlQuery(`SELECT * FROM "bulk_ingest"`)) rdr, rows, err := stmt.ExecuteQuery(s.ctx) s.Require().NoError(err) if rows != -1 && rows != 2 { @@ -1081,6 +1083,10 @@ func (s *StatementTests) TestSqlIngestErrors() { }) s.Run("overwrite and incompatible schema", func() { + if !s.Quirks.SupportsErrorIngestIncompatibleSchema() { + s.T().SkipNow() + } + s.Require().NoError(s.Quirks.DropTable(s.Cnxn, "bulk_ingest")) schema := arrow.NewSchema([]arrow.Field{{ Name: "int64s", Type: arrow.PrimitiveTypes.Int64, Nullable: true}}, nil)