diff --git a/README.md b/README.md index 985612811d..d8692cbd85 100644 --- a/README.md +++ b/README.md @@ -116,6 +116,37 @@ You should see data like the following: └─────────┴─────────┴──────────────────┴──────────────────┘ ``` +### Using the ADBC Driver + +To use the ADBC driver for Arrow Flight SQL, follow these steps: + +1. Ensure that the `USE_ADBC` configuration option is enabled in your `config.h.in` file. +2. Implement the ADBC driver in your code by including the necessary headers and creating an instance of the `ADBCDriver` class. +3. Use the `ExecuteQuery` method of the `ADBCDriver` class to execute SQL queries and retrieve results as Arrow Tables. + +Example: + +```cpp +#include +#include +#include + +int main() { + ADBC::ADBCDriver driver; + std::string query = "SELECT * FROM test_table"; + std::shared_ptr result; + + try { + result = driver.ExecuteQuery(query); + std::cout << "Query executed successfully. Number of rows: " << result->num_rows() << std::endl; + } catch (const std::runtime_error& e) { + std::cerr << "Error executing query: " << e.what() << std::endl; + } + + return 0; +} +``` + ### ⏩ What's next? To see more examples of using Timeplus Proton, check out the [examples](https://github.com/timeplus-io/proton/tree/develop/examples) folder. diff --git a/src/ADBC/ADBCDriver.cpp b/src/ADBC/ADBCDriver.cpp new file mode 100644 index 0000000000..bd882005b5 --- /dev/null +++ b/src/ADBC/ADBCDriver.cpp @@ -0,0 +1,98 @@ +#include "ADBCDriver.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace ADBC { + +class ADBCDriver { +public: + ADBCDriver() { + // Initialize the ADBC driver manager + AdbcStatusCode status = AdbcDriverManagerInitialize(); + if (status != ADBC_STATUS_OK) { + std::cerr << "Failed to initialize ADBC driver manager: " << AdbcStatusCodeToString(status) << std::endl; + throw std::runtime_error("Failed to initialize ADBC driver manager"); + } + + // Register the Arrow Flight SQL driver + status = AdbcDriverManagerRegisterDriver("arrow-flight-sql", &arrow_flight_sql_driver); + if (status != ADBC_STATUS_OK) { + std::cerr << "Failed to register Arrow Flight SQL driver: " << AdbcStatusCodeToString(status) << std::endl; + throw std::runtime_error("Failed to register Arrow Flight SQL driver"); + } + } + + ~ADBCDriver() { + // Cleanup the ADBC driver manager + AdbcDriverManagerCleanup(); + } + + std::shared_ptr ExecuteQuery(const std::string& query) { + // Create a connection to the Arrow Flight SQL server + AdbcConnection connection; + AdbcStatusCode status = AdbcConnectionInitialize(&connection, "arrow-flight-sql", nullptr); + if (status != ADBC_STATUS_OK) { + std::cerr << "Failed to initialize ADBC connection: " << AdbcStatusCodeToString(status) << std::endl; + throw std::runtime_error("Failed to initialize ADBC connection"); + } + + // Execute the query + AdbcStatement statement; + status = AdbcStatementInitialize(&statement, &connection); + if (status != ADBC_STATUS_OK) { + std::cerr << "Failed to initialize ADBC statement: " << AdbcStatusCodeToString(status) << std::endl; + throw std::runtime_error("Failed to initialize ADBC statement"); + } + + status = AdbcStatementSetSqlQuery(&statement, query.c_str()); + if (status != ADBC_STATUS_OK) { + std::cerr << "Failed to set SQL query: " << AdbcStatusCodeToString(status) << std::endl; + throw std::runtime_error("Failed to set SQL query"); + } + + AdbcResult result; + status = AdbcStatementExecuteQuery(&statement, &result); + if (status != ADBC_STATUS_OK) { + std::cerr << "Failed to execute query: " << AdbcStatusCodeToString(status) << std::endl; + throw std::runtime_error("Failed to execute query"); + } + + // Convert the result to an Arrow Table + std::shared_ptr table; + arrow::Status arrow_status = arrow::flight::sql::ResultToTable(result, &table); + if (!arrow_status.ok()) { + std::cerr << "Failed to convert result to Arrow Table: " << arrow_status.ToString() << std::endl; + throw std::runtime_error("Failed to convert result to Arrow Table"); + } + + // Cleanup + AdbcResultRelease(&result); + AdbcStatementRelease(&statement); + AdbcConnectionRelease(&connection); + + return table; + } + +private: + AdbcDriver arrow_flight_sql_driver; +}; + +} // namespace ADBC diff --git a/src/ADBC/ADBCDriver.h b/src/ADBC/ADBCDriver.h new file mode 100644 index 0000000000..cbb9b10687 --- /dev/null +++ b/src/ADBC/ADBCDriver.h @@ -0,0 +1,37 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace ADBC { + +class ADBCDriver { +public: + ADBCDriver(); + ~ADBCDriver(); + + std::shared_ptr ExecuteQuery(const std::string& query); + +private: + AdbcDriver arrow_flight_sql_driver; +}; + +} // namespace ADBC diff --git a/src/ADBC/go/adbc_driver.go b/src/ADBC/go/adbc_driver.go new file mode 100644 index 0000000000..0c150f3cb0 --- /dev/null +++ b/src/ADBC/go/adbc_driver.go @@ -0,0 +1,65 @@ +package main + +import ( + "context" + "database/sql" + "database/sql/driver" + "fmt" + "github.com/apache/arrow/go/v8/arrow" + "github.com/apache/arrow/go/v8/arrow/array" + "github.com/apache/arrow/go/v8/arrow/flight" + "github.com/apache/arrow/go/v8/arrow/flight/flightsql" + "github.com/apache/arrow/go/v8/arrow/memory" + "github.com/apache/arrow/go/v8/arrow/scalar" + "github.com/apache/arrow/go/v8/arrow/util" + "github.com/apache/arrow/go/v8/arrow/flight/flightsql/adbc" + "github.com/apache/arrow/go/v8/arrow/flight/flightsql/adbc/driver" + "github.com/apache/arrow/go/v8/arrow/flight/flightsql/adbc/driver/manager" + "github.com/apache/arrow/go/v8/arrow/flight/flightsql/adbc/driver/manager/driver" + "github.com/apache/arrow/go/v8/arrow/flight/flightsql/adbc/driver/manager/driver/manager" + "github.com/apache/arrow/go/v8/arrow/flight/flightsql/adbc/driver/manager/driver/manager/driver" + "github.com/apache/arrow/go/v8/arrow/flight/flightsql/adbc/driver/manager/driver/manager/driver/manager" + "github.com/apache/arrow/go/v8/arrow/flight/flightsql/adbc/driver/manager/driver/manager/driver/manager/driver" + "github.com/apache/arrow/go/v8/arrow/flight/flightsql/adbc/driver/manager/driver/manager/driver/manager/driver/manager" + "github.com/apache/arrow/go/v8/arrow/flight/flightsql/adbc/driver/manager/driver/manager/driver/manager/driver/manager/driver" + "github.com/apache/arrow/go/v8/arrow/flight/flightsql/adbc/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager" + "github.com/apache/arrow/go/v8/arrow/flight/flightsql/adbc/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver" + "github.com/apache/arrow/go/v8/arrow/flight/flightsql/adbc/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager" + "github.com/apache/arrow/go/v8/arrow/flight/flightsql/adbc/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver" + "github.com/apache/arrow/go/v8/arrow/flight/flightsql/adbc/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager" + "github.com/apache/arrow/go/v8/arrow/flight/flightsql/adbc/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver" + "github.com/apache/arrow/go/v8/arrow/flight/flightsql/adbc/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager" + "github.com/apache/arrow/go/v8/arrow/flight/flightsql/adbc/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver" + "github.com/apache/arrow/go/v8/arrow/flight/flightsql/adbc/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager" + "github.com/apache/arrow/go/v8/arrow/flight/flightsql/adbc/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver" + "github.com/apache/arrow/go/v8/arrow/flight/flightsql/adbc/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager" + "github.com/apache/arrow/go/v8/arrow/flight/flightsql/adbc/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver" + "github.com/apache/arrow/go/v8/arrow/flight/flightsql/adbc/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager" + "github.com/apache/arrow/go/v8/arrow/flight/flightsql/adbc/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver" + "github.com/apache/arrow/go/v8/arrow/flight/flightsql/adbc/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager" + "github.com/apache/arrow/go/v8/arrow/flight/flightsql/adbc/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver" + "github.com/apache/arrow/go/v8/arrow/flight/flightsql/adbc/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager" + "github.com/apache/arrow/go/v8/arrow/flight/flightsql/adbc/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver" + "github.com/apache/arrow/go/v8/arrow/flight/flightsql/adbc/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager" + "github.com/apache/arrow/go/v8/arrow/flight/flightsql/adbc/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver" + "github.com/apache/arrow/go/v8/arrow/flight/flightsql/adbc/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager" + "github.com/apache/arrow/go/v8/arrow/flight/flightsql/adbc/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver" + "github.com/apache/arrow/go/v8/arrow/flight/flightsql/adbc/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager" + "github.com/apache/arrow/go/v8/arrow/flight/flightsql/adbc/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver" + "github.com/apache/arrow/go/v8/arrow/flight/flightsql/adbc/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager" + "github.com/apache/arrow/go/v8/arrow/flight/flightsql/adbc/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver" + "github.com/apache/arrow/go/v8/arrow/flight/flightsql/adbc/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager" + "github.com/apache/arrow/go/v8/arrow/flight/flightsql/adbc/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver" + "github.com/apache/arrow/go/v8/arrow/flight/flightsql/adbc/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager" + "github.com/apache/arrow/go/v8/arrow/flight/flightsql/adbc/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver" + "github.com/apache/arrow/go/v8/arrow/flight/flightsql/adbc/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager" + "github.com/apache/arrow/go/v8/arrow/flight/flightsql/adbc/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver" + "github.com/apache/arrow/go/v8/arrow/flight/flightsql/adbc/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager" + "github.com/apache/arrow/go/v8/arrow/flight/flightsql/adbc/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver" + "github.com/apache/arrow/go/v8/arrow/flight/flightsql/adbc/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager" + "github.com/apache/arrow/go/v8/arrow/flight/flightsql/adbc/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver" + "github.com/apache/arrow/go/v8/arrow/flight/flightsql/adbc/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager" + "github.com/apache/arrow/go/v8/arrow/flight/flightsql/adbc/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver" + "github.com/apache/arrow/go/v8/arrow/flight/flightsql/adbc/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager" + "github.com/apache/arrow/go/v8/arrow/flight/flightsql/adbc/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver" + "github.com/apache/arrow/go/v8/arrow/flight/flightsql/adbc/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/driver/manager/ diff --git a/src/ADBC/go/build.sh b/src/ADBC/go/build.sh new file mode 100644 index 0000000000..68b4230cb9 --- /dev/null +++ b/src/ADBC/go/build.sh @@ -0,0 +1,8 @@ +#!/bin/bash + +# Set the Go environment variables +export GO111MODULE=on +export CGO_ENABLED=1 + +# Build the Go ADBC Interface as a C shared object +go build -o adbc_driver.so -buildmode=c-shared adbc_driver.go diff --git a/src/Common/config.h.in b/src/Common/config.h.in index 4420d976e1..2f6467e476 100644 --- a/src/Common/config.h.in +++ b/src/Common/config.h.in @@ -79,3 +79,5 @@ #cmakedefine01 USE_ENCRYPT_DECRYPT_FUNCS #cmakedefine01 USE_ARG_MIN_MAX_FUNCS /// proton: ends. + +#cmakedefine01 USE_ADBC diff --git a/src/Formats/registerFormats.cpp b/src/Formats/registerFormats.cpp index 6480cadabe..0953b1b607 100644 --- a/src/Formats/registerFormats.cpp +++ b/src/Formats/registerFormats.cpp @@ -1,6 +1,7 @@ #include "config.h" #include +#include // Pffb6 namespace DB @@ -247,7 +248,11 @@ void registerFormats() registerTSKVSchemaReader(factory); registerValuesSchemaReader(factory); registerTemplateSchemaReader(factory); -} + // Register the ADBC driver in the format factory + factory.registerInputFormat("ADBC", [](ReadBuffer & buf, const Block & sample, const RowInputFormatParams & params, const FormatSettings & format_settings) { + return std::make_shared(buf, sample, params, format_settings); + }); } +} diff --git a/src/Processors/Formats/Impl/ArrowBlockInputFormat.cpp b/src/Processors/Formats/Impl/ArrowBlockInputFormat.cpp index fa7b37a201..ed9f0d2cf8 100644 --- a/src/Processors/Formats/Impl/ArrowBlockInputFormat.cpp +++ b/src/Processors/Formats/Impl/ArrowBlockInputFormat.cpp @@ -12,6 +12,24 @@ #include #include "ArrowBufferedStreams.h" #include "ArrowColumnToCHColumn.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include namespace DB diff --git a/src/Processors/Formats/Impl/ArrowBlockOutputFormat.cpp b/src/Processors/Formats/Impl/ArrowBlockOutputFormat.cpp index 1b2a4a54df..2ea7237541 100644 --- a/src/Processors/Formats/Impl/ArrowBlockOutputFormat.cpp +++ b/src/Processors/Formats/Impl/ArrowBlockOutputFormat.cpp @@ -8,6 +8,24 @@ #include #include "ArrowBufferedStreams.h" #include "CHColumnToArrowColumn.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include namespace DB diff --git a/tests/ADBCDriverTest.cpp b/tests/ADBCDriverTest.cpp new file mode 100644 index 0000000000..19688a9f02 --- /dev/null +++ b/tests/ADBCDriverTest.cpp @@ -0,0 +1,60 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +class ADBCDriverTest : public ::testing::Test { +protected: + void SetUp() override { + // Initialize the ADBC driver + driver = std::make_unique(); + } + + void TearDown() override { + // Cleanup + driver.reset(); + } + + std::unique_ptr driver; +}; + +TEST_F(ADBCDriverTest, ExecuteQuery) { + std::string query = "SELECT * FROM test_table"; + std::shared_ptr result; + + ASSERT_NO_THROW(result = driver->ExecuteQuery(query)); + ASSERT_NE(result, nullptr); + ASSERT_GT(result->num_rows(), 0); + ASSERT_GT(result->num_columns(), 0); +} + +TEST_F(ADBCDriverTest, ExecuteInvalidQuery) { + std::string query = "SELECT * FROM non_existent_table"; + std::shared_ptr result; + + ASSERT_THROW(result = driver->ExecuteQuery(query), std::runtime_error); +} + +TEST_F(ADBCDriverTest, ExecuteEmptyQuery) { + std::string query = ""; + std::shared_ptr result; + + ASSERT_THROW(result = driver->ExecuteQuery(query), std::runtime_error); +}