64 using Value = std::variant<Unset, std::string, std::vector<uint8_t>, int64_t,
double>;
66 Option() : value_(
Unset{}) {}
71 explicit Option(std::string value) : value_(std::move(value)) {}
72 explicit Option(std::vector<uint8_t> value) : value_(std::move(value)) {}
73 explicit Option(
double value) : value_(value) {}
74 explicit Option(int64_t value) : value_(value) {}
76 const Value& value() const& {
return value_; }
77 Value& value() && {
return value_; }
80 bool has_value()
const {
return !std::holds_alternative<Unset>(value_); }
86 using T = std::decay_t<
decltype(value)>;
87 if constexpr (std::is_same_v<T, std::string>) {
94 return status::InvalidArgument(
"Invalid boolean value ", this->
Format());
103 using T = std::decay_t<
decltype(value)>;
104 if constexpr (std::is_same_v<T, int64_t>) {
106 }
else if constexpr (std::is_same_v<T, std::string>) {
108 auto begin = value.data();
109 auto end = value.data() + value.size();
110 auto result = std::from_chars(begin, end, parsed);
111 if (result.ec != std::errc()) {
112 return status::InvalidArgument(
"Invalid integer value '", value,
113 "': not an integer", value);
114 }
else if (result.ptr != end) {
115 return status::InvalidArgument(
"Invalid integer value '", value,
116 "': trailing data", value);
120 return status::InvalidArgument(
"Invalid integer value ", this->
Format());
130 using T = std::decay_t<
decltype(value)>;
131 if constexpr (std::is_same_v<T, std::string>) {
134 return status::InvalidArgument(
"Invalid string value ", this->
Format());
143 [&](
auto&& value) -> std::string {
144 using T = std::decay_t<
decltype(value)>;
145 if constexpr (std::is_same_v<T, adbc::driver::Option::Unset>) {
147 }
else if constexpr (std::is_same_v<T, std::string>) {
148 return std::string(
"'") + value +
"'";
149 }
else if constexpr (std::is_same_v<T, std::vector<uint8_t>>) {
150 return std::string(
"(") + std::to_string(value.size()) +
" bytes)";
152 return std::to_string(value);
165 if (!length || (!out && *length > 0)) {
166 return status::InvalidArgument(
"Must provide both out and length to GetOption")
171 using T = std::decay_t<
decltype(value)>;
172 if constexpr (std::is_same_v<T, std::string>) {
173 size_t value_size_with_terminator = value.size() + 1;
174 if (*length >= value_size_with_terminator) {
175 std::memcpy(out, value.data(), value.size());
176 out[value.size()] = 0;
178 *length = value_size_with_terminator;
180 }
else if constexpr (std::is_same_v<T, Unset>) {
181 return status::NotFound(
"Unknown option").ToAdbc(error);
183 return status::NotFound(
"Option value is not a string").ToAdbc(error);
189 AdbcStatusCode CGet(uint8_t* out,
size_t* length, AdbcError* error)
const {
190 if (!length || (!out && *length > 0)) {
191 return status::InvalidArgument(
"Must provide both out and length to GetOption")
196 using T = std::decay_t<
decltype(value)>;
197 if constexpr (std::is_same_v<T, std::string> ||
198 std::is_same_v<T, std::vector<uint8_t>>) {
199 if (*length >= value.size()) {
200 std::memcpy(out, value.data(), value.size());
202 *length = value.size();
204 }
else if constexpr (std::is_same_v<T, Unset>) {
205 return status::NotFound(
"Unknown option").ToAdbc(error);
207 return status::NotFound(
"Option value is not a bytestring").ToAdbc(error);
215 return status::InvalidArgument(
"Must provide out to GetOption").ToAdbc(error);
219 using T = std::decay_t<
decltype(value)>;
220 if constexpr (std::is_same_v<T, int64_t>) {
223 }
else if constexpr (std::is_same_v<T, Unset>) {
224 return status::NotFound(
"Unknown option").ToAdbc(error);
226 return status::NotFound(
"Option value is not an integer").ToAdbc(error);
234 return status::InvalidArgument(
"Must provide out to GetOption").ToAdbc(error);
238 using T = std::decay_t<
decltype(value)>;
239 if constexpr (std::is_same_v<T, double> || std::is_same_v<T, int64_t>) {
240 *out =
static_cast<double>(value);
242 }
else if constexpr (std::is_same_v<T, Unset>) {
243 return status::NotFound(
"Unknown option").ToAdbc(error);
245 return status::NotFound(
"Option value is not a double").ToAdbc(error);
374 auto* driver =
reinterpret_cast<AdbcDriver*
>(raw_driver);
378 driver->ErrorGetDetailCount = &CErrorGetDetailCount;
379 driver->ErrorGetDetail = &CErrorGetDetail;
381 driver->DatabaseGetOption = &CGetOption<AdbcDatabase>;
382 driver->DatabaseGetOptionBytes = &CGetOptionBytes<AdbcDatabase>;
383 driver->DatabaseGetOptionInt = &CGetOptionInt<AdbcDatabase>;
384 driver->DatabaseGetOptionDouble = &CGetOptionDouble<AdbcDatabase>;
385 driver->DatabaseSetOptionBytes = &CSetOptionBytes<AdbcDatabase>;
386 driver->DatabaseSetOptionInt = &CSetOptionInt<AdbcDatabase>;
387 driver->DatabaseSetOptionDouble = &CSetOptionDouble<AdbcDatabase>;
389 driver->ConnectionCancel = &CConnectionCancel;
390 driver->ConnectionGetOption = &CGetOption<AdbcConnection>;
391 driver->ConnectionGetOptionBytes = &CGetOptionBytes<AdbcConnection>;
392 driver->ConnectionGetOptionInt = &CGetOptionInt<AdbcConnection>;
393 driver->ConnectionGetOptionDouble = &CGetOptionDouble<AdbcConnection>;
394 driver->ConnectionGetStatistics = &CConnectionGetStatistics;
395 driver->ConnectionGetStatisticNames = &CConnectionGetStatisticNames;
396 driver->ConnectionSetOptionBytes = &CSetOptionBytes<AdbcConnection>;
397 driver->ConnectionSetOptionInt = &CSetOptionInt<AdbcConnection>;
398 driver->ConnectionSetOptionDouble = &CSetOptionDouble<AdbcConnection>;
400 driver->StatementCancel = &CStatementCancel;
401 driver->StatementExecuteSchema = &CStatementExecuteSchema;
402 driver->StatementGetOption = &CGetOption<AdbcStatement>;
403 driver->StatementGetOptionBytes = &CGetOptionBytes<AdbcStatement>;
404 driver->StatementGetOptionInt = &CGetOptionInt<AdbcStatement>;
405 driver->StatementGetOptionDouble = &CGetOptionDouble<AdbcStatement>;
406 driver->StatementSetOptionBytes = &CSetOptionBytes<AdbcStatement>;
407 driver->StatementSetOptionInt = &CSetOptionInt<AdbcStatement>;
408 driver->StatementSetOptionDouble = &CSetOptionDouble<AdbcStatement>;
414 driver->release = &CDriverRelease;
416 driver->DatabaseInit = &CDatabaseInit;
417 driver->DatabaseNew = &CNew<AdbcDatabase>;
418 driver->DatabaseRelease = &CRelease<AdbcDatabase>;
419 driver->DatabaseSetOption = &CSetOption<AdbcDatabase>;
421 driver->ConnectionCommit = &CConnectionCommit;
422 driver->ConnectionGetInfo = &CConnectionGetInfo;
423 driver->ConnectionGetObjects = &CConnectionGetObjects;
424 driver->ConnectionGetTableSchema = &CConnectionGetTableSchema;
425 driver->ConnectionGetTableTypes = &CConnectionGetTableTypes;
426 driver->ConnectionInit = &CConnectionInit;
427 driver->ConnectionNew = &CNew<AdbcConnection>;
428 driver->ConnectionRelease = &CRelease<AdbcConnection>;
429 driver->ConnectionReadPartition = &CConnectionReadPartition;
430 driver->ConnectionRollback = &CConnectionRollback;
431 driver->ConnectionSetOption = &CSetOption<AdbcConnection>;
433 driver->StatementBind = &CStatementBind;
434 driver->StatementBindStream = &CStatementBindStream;
435 driver->StatementExecutePartitions = &CStatementExecutePartitions;
436 driver->StatementExecuteQuery = &CStatementExecuteQuery;
437 driver->StatementGetParameterSchema = &CStatementGetParameterSchema;
438 driver->StatementNew = &CStatementNew;
439 driver->StatementPrepare = &CStatementPrepare;
440 driver->StatementRelease = &CRelease<AdbcStatement>;
441 driver->StatementSetOption = &CSetOption<AdbcStatement>;
442 driver->StatementSetSqlQuery = &CStatementSetSqlQuery;
443 driver->StatementSetSubstraitPlan = &CStatementSetSubstraitPlan;
450 auto driver_private =
reinterpret_cast<Driver*
>(driver->private_data);
451 delete driver_private;
452 driver->private_data =
nullptr;
456 static int CErrorGetDetailCount(
const AdbcError* error) {
465 return error_obj->CDetailCount();
470 return {
nullptr,
nullptr, 0};
475 return {
nullptr,
nullptr, 0};
478 return error_obj->CDetail(index);
483 template <
typename T>
485 using ObjectT = ResolveObjectT<DatabaseT, ConnectionT, StatementT, T>;
486 auto private_data =
new ObjectT();
487 obj->private_data = private_data;
491 template <
typename T>
493 using ObjectT = ResolveObjectT<DatabaseT, ConnectionT, StatementT, T>;
495 auto private_data =
reinterpret_cast<ObjectT*
>(obj->private_data);
503 obj->private_data =
nullptr;
507 template <
typename T>
508 static AdbcStatusCode CSetOption(T* obj,
const char* key,
const char* value,
510 using ObjectT = ResolveObjectT<DatabaseT, ConnectionT, StatementT, T>;
511 auto private_data =
reinterpret_cast<ObjectT*
>(obj->private_data);
512 return private_data->template CSetOption<>(key, value, error);
515 template <
typename T>
516 static AdbcStatusCode CSetOptionBytes(T* obj,
const char* key,
const uint8_t* value,
518 using ObjectT = ResolveObjectT<DatabaseT, ConnectionT, StatementT, T>;
519 auto private_data =
reinterpret_cast<ObjectT*
>(obj->private_data);
520 return private_data->CSetOptionBytes(key, value, length, error);
523 template <
typename T>
524 static AdbcStatusCode CSetOptionInt(T* obj,
const char* key, int64_t value,
526 using ObjectT = ResolveObjectT<DatabaseT, ConnectionT, StatementT, T>;
527 auto private_data =
reinterpret_cast<ObjectT*
>(obj->private_data);
528 return private_data->template CSetOption<>(key, value, error);
531 template <
typename T>
532 static AdbcStatusCode CSetOptionDouble(T* obj,
const char* key,
double value,
534 using ObjectT = ResolveObjectT<DatabaseT, ConnectionT, StatementT, T>;
535 auto private_data =
reinterpret_cast<ObjectT*
>(obj->private_data);
536 return private_data->template CSetOption<>(key, value, error);
539 template <
typename T>
540 static AdbcStatusCode CGetOption(T* obj,
const char* key,
char* value,
size_t* length,
542 using ObjectT = ResolveObjectT<DatabaseT, ConnectionT, StatementT, T>;
543 auto private_data =
reinterpret_cast<ObjectT*
>(obj->private_data);
544 return private_data->template CGetOptionStringLike<>(key, value, length, error);
547 template <
typename T>
548 static AdbcStatusCode CGetOptionBytes(T* obj,
const char* key, uint8_t* value,
550 using ObjectT = ResolveObjectT<DatabaseT, ConnectionT, StatementT, T>;
551 auto private_data =
reinterpret_cast<ObjectT*
>(obj->private_data);
552 return private_data->template CGetOptionStringLike<>(key, value, length, error);
555 template <
typename T>
556 static AdbcStatusCode CGetOptionInt(T* obj,
const char* key, int64_t* value,
558 using ObjectT = ResolveObjectT<DatabaseT, ConnectionT, StatementT, T>;
559 auto private_data =
reinterpret_cast<ObjectT*
>(obj->private_data);
560 return private_data->template CGetOptionNumeric<>(key, value, error);
563 template <
typename T>
564 static AdbcStatusCode CGetOptionDouble(T* obj,
const char* key,
double* value,
566 using ObjectT = ResolveObjectT<DatabaseT, ConnectionT, StatementT, T>;
567 auto private_data =
reinterpret_cast<ObjectT*
>(obj->private_data);
568 return private_data->template CGetOptionNumeric<>(key, value, error);
571#define CHECK_INIT(DATABASE, ERROR) \
572 if (!(DATABASE) || !(DATABASE)->private_data) { \
573 return status::InvalidState("Database is uninitialized").ToAdbc(ERROR); \
578 CHECK_INIT(database, error);
579 auto private_data =
reinterpret_cast<DatabaseT*
>(database->
private_data);
580 return private_data->Init(
nullptr, error);
584#define CHECK_INIT(CONNECTION, ERROR) \
585 if (!(CONNECTION) || !(CONNECTION)->private_data) { \
586 return status::InvalidState("Connection is uninitialized").ToAdbc(ERROR); \
592 CHECK_INIT(connection, error);
594 return status::InvalidState(
"Database is uninitialized").ToAdbc(error);
596 auto private_data =
reinterpret_cast<ConnectionT*
>(connection->
private_data);
597 return private_data->Init(database->
private_data, error);
601 CHECK_INIT(connection, error);
602 auto private_data =
reinterpret_cast<ConnectionT*
>(connection->
private_data);
603 return private_data->Cancel(error);
607 const uint32_t* info_codes,
608 size_t info_codes_length,
609 ArrowArrayStream* out,
AdbcError* error) {
610 CHECK_INIT(connection, error);
611 auto private_data =
reinterpret_cast<ConnectionT*
>(connection->
private_data);
612 return private_data->GetInfo(info_codes, info_codes_length, out, error);
616 const char* catalog,
const char* db_schema,
617 const char* table_name,
618 const char** table_type,
619 const char* column_name,
620 ArrowArrayStream* out,
AdbcError* error) {
621 CHECK_INIT(connection, error);
622 auto private_data =
reinterpret_cast<ConnectionT*
>(connection->
private_data);
623 return private_data->GetObjects(depth, catalog, db_schema, table_name, table_type,
624 column_name, out, error);
628 AdbcConnection* connection,
const char* catalog,
const char* db_schema,
629 const char* table_name,
char approximate, ArrowArrayStream* out,
AdbcError* error) {
630 CHECK_INIT(connection, error);
631 auto private_data =
reinterpret_cast<ConnectionT*
>(connection->
private_data);
632 return private_data->GetStatistics(catalog, db_schema, table_name, approximate, out,
637 ArrowArrayStream* out,
639 CHECK_INIT(connection, error);
640 auto private_data =
reinterpret_cast<ConnectionT*
>(connection->
private_data);
641 return private_data->GetStatisticNames(out, error);
646 const char* db_schema,
647 const char* table_name,
649 CHECK_INIT(connection, error);
650 auto private_data =
reinterpret_cast<ConnectionT*
>(connection->
private_data);
651 return private_data->GetTableSchema(catalog, db_schema, table_name, schema, error);
655 ArrowArrayStream* out,
657 CHECK_INIT(connection, error);
658 auto private_data =
reinterpret_cast<ConnectionT*
>(connection->
private_data);
659 return private_data->GetTableTypes(out, error);
663 const uint8_t* serialized_partition,
664 size_t serialized_length,
665 ArrowArrayStream* out,
667 CHECK_INIT(connection, error);
668 auto private_data =
reinterpret_cast<ConnectionT*
>(connection->
private_data);
669 return private_data->ReadPartition(serialized_partition, serialized_length, out,
674 CHECK_INIT(connection, error);
675 auto private_data =
reinterpret_cast<ConnectionT*
>(connection->
private_data);
676 return private_data->Commit(error);
681 CHECK_INIT(connection, error);
682 auto private_data =
reinterpret_cast<ConnectionT*
>(connection->
private_data);
683 return private_data->Rollback(error);
687#define CHECK_INIT(STATEMENT, ERROR) \
688 if (!(STATEMENT) || !(STATEMENT)->private_data) { \
689 return status::InvalidState("Statement is uninitialized").ToAdbc(ERROR); \
696 return status::InvalidState(
"Connection is uninitialized").ToAdbc(error);
698 auto private_data =
new StatementT();
710 CHECK_INIT(statement, error);
711 auto private_data =
reinterpret_cast<StatementT*
>(statement->
private_data);
712 return private_data->Bind(values, schema, error);
716 ArrowArrayStream* stream,
AdbcError* error) {
717 CHECK_INIT(statement, error);
718 auto private_data =
reinterpret_cast<StatementT*
>(statement->
private_data);
719 return private_data->BindStream(stream, error);
723 CHECK_INIT(statement, error);
724 auto private_data =
reinterpret_cast<StatementT*
>(statement->
private_data);
725 return private_data->Cancel(error);
729 struct ArrowSchema* schema,
731 int64_t* rows_affected,
733 CHECK_INIT(statement, error);
734 auto private_data =
reinterpret_cast<StatementT*
>(statement->
private_data);
735 return private_data->ExecutePartitions(schema, partitions, rows_affected, error);
739 ArrowArrayStream* stream,
740 int64_t* rows_affected,
AdbcError* error) {
741 CHECK_INIT(statement, error);
742 auto private_data =
reinterpret_cast<StatementT*
>(statement->
private_data);
743 return private_data->ExecuteQuery(stream, rows_affected, error);
748 CHECK_INIT(statement, error);
749 auto private_data =
reinterpret_cast<StatementT*
>(statement->
private_data);
750 return private_data->ExecuteSchema(schema, error);
756 CHECK_INIT(statement, error);
757 auto private_data =
reinterpret_cast<StatementT*
>(statement->
private_data);
758 return private_data->GetParameterSchema(schema, error);
762 CHECK_INIT(statement, error);
763 auto private_data =
reinterpret_cast<StatementT*
>(statement->
private_data);
764 return private_data->Prepare(error);
769 CHECK_INIT(statement, error);
770 auto private_data =
reinterpret_cast<StatementT*
>(statement->
private_data);
771 return private_data->SetSqlQuery(query, error);
775 const uint8_t* plan,
size_t length,
777 CHECK_INIT(statement, error);
778 auto private_data =
reinterpret_cast<StatementT*
>(statement->
private_data);
779 return private_data->SetSubstraitPlan(plan, length, error);
829class BaseConnection :
public ObjectBase {
831 using Base = BaseConnection<Derived>;
840 ~BaseConnection() =
default;
854 Status CancelImpl() {
return status::NotImplemented(
"Cancel"); }
859 Status CommitImpl() {
return status::NotImplemented(
"Commit"); }
862 AdbcStatusCode GetInfo(
const uint32_t* info_codes,
size_t info_codes_length,
863 ArrowArrayStream* out, AdbcError* error) {
864 std::vector<uint32_t> codes(info_codes, info_codes + info_codes_length);
869 Status GetInfoImpl(
const std::vector<uint32_t> info_codes, ArrowArrayStream* out) {
870 return status::NotImplemented(
"GetInfo");
874 AdbcStatusCode GetObjects(
int c_depth,
const char* catalog,
const char* db_schema,
875 const char* table_name,
const char** table_type,
876 const char* column_name, ArrowArrayStream* out,
878 const auto catalog_filter =
879 catalog ? std::make_optional(std::string_view(catalog)) : std::nullopt;
880 const auto schema_filter =
881 db_schema ? std::make_optional(std::string_view(db_schema)) : std::nullopt;
882 const auto table_filter =
883 table_name ? std::make_optional(std::string_view(table_name)) : std::nullopt;
884 const auto column_filter =
885 column_name ? std::make_optional(std::string_view(column_name)) : std::nullopt;
886 std::vector<std::string_view> table_type_filter;
887 while (table_type && *table_type) {
889 table_type_filter.push_back(std::string_view(*table_type));
895 error, impl().GetObjectsImpl(c_depth, catalog_filter, schema_filter, table_filter,
896 column_filter, table_type_filter, out));
901 Status GetObjectsImpl(
int c_depth, std::optional<std::string_view> catalog_filter,
902 std::optional<std::string_view> schema_filter,
903 std::optional<std::string_view> table_filter,
904 std::optional<std::string_view> column_filter,
905 const std::vector<std::string_view>& table_types,
906 struct ArrowArrayStream* out) {
907 return status::NotImplemented(
"GetObjects");
911 AdbcStatusCode GetStatistics(
const char* catalog,
const char* db_schema,
912 const char* table_name,
char approximate,
913 ArrowArrayStream* out, AdbcError* error) {
914 const auto catalog_filter =
915 catalog ? std::make_optional(std::string_view(catalog)) : std::nullopt;
916 const auto schema_filter =
917 db_schema ? std::make_optional(std::string_view(db_schema)) : std::nullopt;
918 const auto table_filter =
919 table_name ? std::make_optional(std::string_view(table_name)) : std::nullopt;
920 RAISE_STATUS(error, impl().GetStatisticsImpl(catalog_filter, schema_filter,
921 table_filter, approximate != 0, out));
925 Status GetStatisticsImpl(std::optional<std::string_view> catalog,
926 std::optional<std::string_view> db_schema,
927 std::optional<std::string_view> table_name,
bool approximate,
928 ArrowArrayStream* out) {
929 return status::NotImplemented(
"GetStatistics");
933 AdbcStatusCode GetStatisticNames(ArrowArrayStream* out, AdbcError* error) {
938 Status GetStatisticNames(ArrowArrayStream* out) {
939 return status::NotImplemented(
"GetStatisticNames");
943 AdbcStatusCode GetTableSchema(
const char* catalog,
const char* db_schema,
944 const char* table_name, ArrowSchema* schema,
947 return status::InvalidArgument(Derived::kErrorPrefix,
948 " GetTableSchema: must provide table_name")
952 std::optional<std::string_view> catalog_param =
953 catalog ? std::make_optional(std::string_view(catalog)) : std::nullopt;
954 std::optional<std::string_view> db_schema_param =
955 db_schema ? std::make_optional(std::string_view(db_schema)) : std::nullopt;
957 RAISE_STATUS(error, impl().GetTableSchemaImpl(catalog_param, db_schema_param,
958 table_name, schema));
962 Status GetTableSchemaImpl(std::optional<std::string_view> catalog,
963 std::optional<std::string_view> db_schema,
964 std::string_view table_name, ArrowSchema* out) {
965 return status::NotImplemented(
"GetTableSchema");
969 AdbcStatusCode GetTableTypes(ArrowArrayStream* out, AdbcError* error) {
974 Status GetTableTypesImpl(ArrowArrayStream* out) {
975 return status::NotImplemented(
"GetTableTypes");
980 size_t serialized_length, ArrowArrayStream* out,
982 std::string_view partition(
reinterpret_cast<const char*
>(serialized_partition),
984 RAISE_STATUS(error, impl().ReadPartitionImpl(partition, out));
988 Status ReadPartitionImpl(std::string_view serialized_partition, ArrowArrayStream* out) {
989 return status::NotImplemented(
"ReadPartition");
998 Status ReleaseImpl() {
return status::Ok(); }
1006 Status RollbackImpl() {
return status::NotImplemented(
"Rollback"); }
1017 return status::NotImplemented(Derived::kErrorPrefix,
" Unknown connection option ",
1018 key,
"=", value.
Format());
1022 Derived& impl() {
return static_cast<Derived&
>(*this); }
1045 Status ReleaseImpl() {
return status::Ok(); }
1056 return status::NotImplemented(Derived::kErrorPrefix,
" Unknown statement option ",
1057 key,
"=", value.
Format());
1060 AdbcStatusCode ExecuteQuery(ArrowArrayStream* stream, int64_t* rows_affected,
1062 int64_t rows_affected_result;
1063 RAISE_RESULT(error, rows_affected_result, impl().ExecuteQueryImpl(stream));
1064 if (rows_affected) {
1065 *rows_affected = rows_affected_result;
1071 Result<int64_t> ExecuteQueryImpl(ArrowArrayStream* stream) {
1072 return status::NotImplemented(
"ExecuteQuery");
1075 AdbcStatusCode ExecuteSchema(ArrowSchema* schema, AdbcError* error) {
1080 Status ExecuteSchemaImpl(ArrowSchema* schema) {
1081 return status::NotImplemented(
"ExecuteSchema");
1089 Status PrepareImpl() {
return status::NotImplemented(
"Prepare"); }
1091 AdbcStatusCode SetSqlQuery(
const char* query, AdbcError* error) {
1096 Status SetSqlQueryImpl(std::string_view query) {
1097 return status::NotImplemented(
"SetSqlQuery");
1100 AdbcStatusCode SetSubstraitPlan(
const uint8_t* plan,
size_t length, AdbcError* error) {
1101 RAISE_STATUS(error, impl().SetSubstraitPlanImpl(std::string_view(
1102 reinterpret_cast<const char*
>(plan), length)));
1106 Status SetSubstraitPlanImpl(std::string_view plan) {
1107 return status::NotImplemented(
"SetSubstraitPlan");
1110 AdbcStatusCode Bind(ArrowArray* values, ArrowSchema* schema, AdbcError* error) {
1115 Status BindImpl(ArrowArray* values, ArrowSchema* schema) {
1116 return status::NotImplemented(
"Bind");
1119 AdbcStatusCode BindStream(ArrowArrayStream* stream, AdbcError* error) {
1124 Status BindStreamImpl(ArrowArrayStream* stream) {
1125 return status::NotImplemented(
"BindStream");
1128 AdbcStatusCode GetParameterSchema(ArrowSchema* schema, AdbcError* error) {
1129 RAISE_STATUS(error, impl().GetParameterSchemaImpl(schema));
1133 Status GetParameterSchemaImpl(
struct ArrowSchema* schema) {
1134 return status::NotImplemented(
"GetParameterSchema");
1137 AdbcStatusCode ExecutePartitions(ArrowSchema* schema, AdbcPartitions* partitions,
1138 int64_t* rows_affected, AdbcError* error) {
1147 Status Cancel() {
return status::NotImplemented(
"Cancel"); }
1150 Derived& impl() {
return static_cast<Derived&
>(*this); }