in c/validation/adbc_validation.cc [1710:1786]
void StatementTest::TestSqlPrepareSelectParams() {
if (!quirks()->supports_dynamic_parameter_binding()) {
GTEST_SKIP();
}
ASSERT_THAT(AdbcStatementNew(&connection, &statement, &error), IsOkStatus(&error));
std::string query = "SELECT ";
query += quirks()->BindParameter(0);
query += ", ";
query += quirks()->BindParameter(1);
ASSERT_THAT(AdbcStatementSetSqlQuery(&statement, query.c_str(), &error),
IsOkStatus(&error));
ASSERT_THAT(AdbcStatementPrepare(&statement, &error), IsOkStatus(&error));
Handle<struct ArrowSchema> schema;
Handle<struct ArrowArray> array;
struct ArrowError na_error;
ASSERT_THAT(MakeSchema(&schema.value, {{"int64s", NANOARROW_TYPE_INT64},
{"strings", NANOARROW_TYPE_STRING}}),
IsOkErrno());
ASSERT_THAT((MakeBatch<int64_t, std::string>(&schema.value, &array.value, &na_error,
{42, -42, std::nullopt},
{"", std::nullopt, "bar"})),
IsOkErrno());
ASSERT_THAT(AdbcStatementBind(&statement, &array.value, &schema.value, &error),
IsOkStatus(&error));
StreamReader reader;
ASSERT_THAT(AdbcStatementExecuteQuery(&statement, &reader.stream.value,
&reader.rows_affected, &error),
IsOkStatus(&error));
ASSERT_THAT(reader.rows_affected,
::testing::AnyOf(::testing::Eq(1), ::testing::Eq(-1)));
ASSERT_NO_FATAL_FAILURE(reader.GetSchema());
ASSERT_EQ(2, reader.schema->n_children);
const std::vector<std::optional<int32_t>> expected_int32{42, -42, std::nullopt};
const std::vector<std::optional<int64_t>> expected_int64{42, -42, std::nullopt};
const std::vector<std::optional<std::string>> expected_string{"", std::nullopt, "bar"};
int64_t nrows = 0;
while (nrows < 3) {
ASSERT_NO_FATAL_FAILURE(reader.Next());
ASSERT_NE(nullptr, reader.array->release);
ASSERT_EQ(2, reader.array->n_children);
auto start = nrows;
auto end = nrows + reader.array->length;
ASSERT_LT(start, expected_int32.size());
ASSERT_LE(end, expected_int32.size());
switch (reader.fields[0].type) {
case NANOARROW_TYPE_INT32:
ASSERT_NO_FATAL_FAILURE(CompareArray<int32_t>(
reader.array_view->children[0],
{expected_int32.begin() + start, expected_int32.begin() + end}));
break;
case NANOARROW_TYPE_INT64:
ASSERT_NO_FATAL_FAILURE(CompareArray<int64_t>(
reader.array_view->children[0],
{expected_int64.begin() + start, expected_int64.begin() + end}));
break;
default:
FAIL() << "Unexpected data type: " << reader.fields[0].type;
}
ASSERT_NO_FATAL_FAILURE(CompareArray<std::string>(
reader.array_view->children[1],
{expected_string.begin() + start, expected_string.begin() + end}));
nrows += reader.array->length;
}
ASSERT_EQ(3, nrows);
ASSERT_NO_FATAL_FAILURE(reader.Next());
ASSERT_EQ(nullptr, reader.array->release);
}