//===----------------------------------------------------------------------===// // // DuckDB // // duckdb.h // // //===----------------------------------------------------------------------===// // // !!!!!!! // WARNING: this file is autogenerated by scripts/generate_c_api.py, manual changes will be overwritten // !!!!!!! #pragma once #ifndef DUCKDB_C_API #ifdef _WIN32 #ifdef DUCKDB_STATIC_BUILD #define DUCKDB_C_API #else #if defined(DUCKDB_BUILD_LIBRARY) && !defined(DUCKDB_BUILD_LOADABLE_EXTENSION) #define DUCKDB_C_API __declspec(dllexport) #else #define DUCKDB_C_API __declspec(dllimport) #endif #endif #else #define DUCKDB_C_API #endif #endif //! duplicate of duckdb/main/winapi.hpp #ifndef DUCKDB_EXTENSION_API #ifdef _WIN32 #ifdef DUCKDB_STATIC_BUILD #define DUCKDB_EXTENSION_API #else #define DUCKDB_EXTENSION_API __declspec(dllexport) #endif #else #define DUCKDB_EXTENSION_API __attribute__((visibility("default"))) #endif #endif #include #include #include #ifdef __cplusplus extern "C" { #endif //===--------------------------------------------------------------------===// // Enums //===--------------------------------------------------------------------===// //! WARNING: The numbers of these enums should not be changed, as changing the numbers breaks ABI compatibility. //! Always add enums at the END of the enum //! An enum over DuckDB's internal types. typedef enum DUCKDB_TYPE { DUCKDB_TYPE_INVALID = 0, // bool DUCKDB_TYPE_BOOLEAN = 1, // int8_t DUCKDB_TYPE_TINYINT = 2, // int16_t DUCKDB_TYPE_SMALLINT = 3, // int32_t DUCKDB_TYPE_INTEGER = 4, // int64_t DUCKDB_TYPE_BIGINT = 5, // uint8_t DUCKDB_TYPE_UTINYINT = 6, // uint16_t DUCKDB_TYPE_USMALLINT = 7, // uint32_t DUCKDB_TYPE_UINTEGER = 8, // uint64_t DUCKDB_TYPE_UBIGINT = 9, // float DUCKDB_TYPE_FLOAT = 10, // double DUCKDB_TYPE_DOUBLE = 11, // duckdb_timestamp (microseconds) DUCKDB_TYPE_TIMESTAMP = 12, // duckdb_date DUCKDB_TYPE_DATE = 13, // duckdb_time DUCKDB_TYPE_TIME = 14, // duckdb_interval DUCKDB_TYPE_INTERVAL = 15, // duckdb_hugeint DUCKDB_TYPE_HUGEINT = 16, // duckdb_uhugeint DUCKDB_TYPE_UHUGEINT = 32, // const char* DUCKDB_TYPE_VARCHAR = 17, // duckdb_blob DUCKDB_TYPE_BLOB = 18, // duckdb_decimal DUCKDB_TYPE_DECIMAL = 19, // duckdb_timestamp_s (seconds) DUCKDB_TYPE_TIMESTAMP_S = 20, // duckdb_timestamp_ms (milliseconds) DUCKDB_TYPE_TIMESTAMP_MS = 21, // duckdb_timestamp_ns (nanoseconds) DUCKDB_TYPE_TIMESTAMP_NS = 22, // enum type, only useful as logical type DUCKDB_TYPE_ENUM = 23, // list type, only useful as logical type DUCKDB_TYPE_LIST = 24, // struct type, only useful as logical type DUCKDB_TYPE_STRUCT = 25, // map type, only useful as logical type DUCKDB_TYPE_MAP = 26, // duckdb_array, only useful as logical type DUCKDB_TYPE_ARRAY = 33, // duckdb_hugeint DUCKDB_TYPE_UUID = 27, // union type, only useful as logical type DUCKDB_TYPE_UNION = 28, // duckdb_bit DUCKDB_TYPE_BIT = 29, // duckdb_time_tz DUCKDB_TYPE_TIME_TZ = 30, // duckdb_timestamp (microseconds) DUCKDB_TYPE_TIMESTAMP_TZ = 31, // enum type, only useful as logical type DUCKDB_TYPE_ANY = 34, // duckdb_bignum DUCKDB_TYPE_BIGNUM = 35, // enum type, only useful as logical type DUCKDB_TYPE_SQLNULL = 36, // enum type, only useful as logical type DUCKDB_TYPE_STRING_LITERAL = 37, // enum type, only useful as logical type DUCKDB_TYPE_INTEGER_LITERAL = 38, // duckdb_time_ns (nanoseconds) DUCKDB_TYPE_TIME_NS = 39, } duckdb_type; //! An enum over the returned state of different functions. typedef enum duckdb_state { DuckDBSuccess = 0, DuckDBError = 1 } duckdb_state; //! An enum over the pending state of a pending query result. typedef enum duckdb_pending_state { DUCKDB_PENDING_RESULT_READY = 0, DUCKDB_PENDING_RESULT_NOT_READY = 1, DUCKDB_PENDING_ERROR = 2, DUCKDB_PENDING_NO_TASKS_AVAILABLE = 3 } duckdb_pending_state; //! An enum over DuckDB's different result types. typedef enum duckdb_result_type { DUCKDB_RESULT_TYPE_INVALID = 0, DUCKDB_RESULT_TYPE_CHANGED_ROWS = 1, DUCKDB_RESULT_TYPE_NOTHING = 2, DUCKDB_RESULT_TYPE_QUERY_RESULT = 3, } duckdb_result_type; //! An enum over DuckDB's different statement types. typedef enum duckdb_statement_type { DUCKDB_STATEMENT_TYPE_INVALID = 0, DUCKDB_STATEMENT_TYPE_SELECT = 1, DUCKDB_STATEMENT_TYPE_INSERT = 2, DUCKDB_STATEMENT_TYPE_UPDATE = 3, DUCKDB_STATEMENT_TYPE_EXPLAIN = 4, DUCKDB_STATEMENT_TYPE_DELETE = 5, DUCKDB_STATEMENT_TYPE_PREPARE = 6, DUCKDB_STATEMENT_TYPE_CREATE = 7, DUCKDB_STATEMENT_TYPE_EXECUTE = 8, DUCKDB_STATEMENT_TYPE_ALTER = 9, DUCKDB_STATEMENT_TYPE_TRANSACTION = 10, DUCKDB_STATEMENT_TYPE_COPY = 11, DUCKDB_STATEMENT_TYPE_ANALYZE = 12, DUCKDB_STATEMENT_TYPE_VARIABLE_SET = 13, DUCKDB_STATEMENT_TYPE_CREATE_FUNC = 14, DUCKDB_STATEMENT_TYPE_DROP = 15, DUCKDB_STATEMENT_TYPE_EXPORT = 16, DUCKDB_STATEMENT_TYPE_PRAGMA = 17, DUCKDB_STATEMENT_TYPE_VACUUM = 18, DUCKDB_STATEMENT_TYPE_CALL = 19, DUCKDB_STATEMENT_TYPE_SET = 20, DUCKDB_STATEMENT_TYPE_LOAD = 21, DUCKDB_STATEMENT_TYPE_RELATION = 22, DUCKDB_STATEMENT_TYPE_EXTENSION = 23, DUCKDB_STATEMENT_TYPE_LOGICAL_PLAN = 24, DUCKDB_STATEMENT_TYPE_ATTACH = 25, DUCKDB_STATEMENT_TYPE_DETACH = 26, DUCKDB_STATEMENT_TYPE_MULTI = 27, } duckdb_statement_type; //! An enum over DuckDB's different error types. typedef enum duckdb_error_type { DUCKDB_ERROR_INVALID = 0, DUCKDB_ERROR_OUT_OF_RANGE = 1, DUCKDB_ERROR_CONVERSION = 2, DUCKDB_ERROR_UNKNOWN_TYPE = 3, DUCKDB_ERROR_DECIMAL = 4, DUCKDB_ERROR_MISMATCH_TYPE = 5, DUCKDB_ERROR_DIVIDE_BY_ZERO = 6, DUCKDB_ERROR_OBJECT_SIZE = 7, DUCKDB_ERROR_INVALID_TYPE = 8, DUCKDB_ERROR_SERIALIZATION = 9, DUCKDB_ERROR_TRANSACTION = 10, DUCKDB_ERROR_NOT_IMPLEMENTED = 11, DUCKDB_ERROR_EXPRESSION = 12, DUCKDB_ERROR_CATALOG = 13, DUCKDB_ERROR_PARSER = 14, DUCKDB_ERROR_PLANNER = 15, DUCKDB_ERROR_SCHEDULER = 16, DUCKDB_ERROR_EXECUTOR = 17, DUCKDB_ERROR_CONSTRAINT = 18, DUCKDB_ERROR_INDEX = 19, DUCKDB_ERROR_STAT = 20, DUCKDB_ERROR_CONNECTION = 21, DUCKDB_ERROR_SYNTAX = 22, DUCKDB_ERROR_SETTINGS = 23, DUCKDB_ERROR_BINDER = 24, DUCKDB_ERROR_NETWORK = 25, DUCKDB_ERROR_OPTIMIZER = 26, DUCKDB_ERROR_NULL_POINTER = 27, DUCKDB_ERROR_IO = 28, DUCKDB_ERROR_INTERRUPT = 29, DUCKDB_ERROR_FATAL = 30, DUCKDB_ERROR_INTERNAL = 31, DUCKDB_ERROR_INVALID_INPUT = 32, DUCKDB_ERROR_OUT_OF_MEMORY = 33, DUCKDB_ERROR_PERMISSION = 34, DUCKDB_ERROR_PARAMETER_NOT_RESOLVED = 35, DUCKDB_ERROR_PARAMETER_NOT_ALLOWED = 36, DUCKDB_ERROR_DEPENDENCY = 37, DUCKDB_ERROR_HTTP = 38, DUCKDB_ERROR_MISSING_EXTENSION = 39, DUCKDB_ERROR_AUTOLOAD = 40, DUCKDB_ERROR_SEQUENCE = 41, DUCKDB_INVALID_CONFIGURATION = 42 } duckdb_error_type; //! An enum over DuckDB's different cast modes. typedef enum duckdb_cast_mode { DUCKDB_CAST_NORMAL = 0, DUCKDB_CAST_TRY = 1 } duckdb_cast_mode; //===--------------------------------------------------------------------===// // General type definitions //===--------------------------------------------------------------------===// //! DuckDB's index type. typedef uint64_t idx_t; //! Type definition for the data pointers of selection vectors. typedef uint32_t sel_t; //! The callback to destroy data, e.g., //! bind data (if any), init data (if any), extra data for replacement scans (if any), etc. typedef void (*duckdb_delete_callback_t)(void *data); //! The callback to copy data, e.g., bind data (if any). typedef void *(*duckdb_copy_callback_t)(void *data); //! Used for threading, contains a task state. //! Must be destroyed with `duckdb_destroy_task_state`. typedef void *duckdb_task_state; //===--------------------------------------------------------------------===// // Types (no explicit freeing) //===--------------------------------------------------------------------===// //! DATE is stored as days since 1970-01-01. //! Use the `duckdb_from_date` and `duckdb_to_date` functions to extract individual information. typedef struct { int32_t days; } duckdb_date; typedef struct { int32_t year; int8_t month; int8_t day; } duckdb_date_struct; //! TIME is stored as microseconds since 00:00:00. //! Use the `duckdb_from_time` and `duckdb_to_time` functions to extract individual information. typedef struct { int64_t micros; } duckdb_time; typedef struct { int8_t hour; int8_t min; int8_t sec; int32_t micros; } duckdb_time_struct; //! TIME_NS is stored as nanoseconds since 00:00:00. typedef struct { int64_t nanos; } duckdb_time_ns; //! TIME_TZ is stored as 40 bits for the int64_t microseconds, and 24 bits for the int32_t offset. //! Use the `duckdb_from_time_tz` function to extract individual information. typedef struct { uint64_t bits; } duckdb_time_tz; typedef struct { duckdb_time_struct time; int32_t offset; } duckdb_time_tz_struct; //! TIMESTAMP is stored as microseconds since 1970-01-01. //! Use the `duckdb_from_timestamp` and `duckdb_to_timestamp` functions to extract individual information. typedef struct { int64_t micros; } duckdb_timestamp; typedef struct { duckdb_date_struct date; duckdb_time_struct time; } duckdb_timestamp_struct; //! TIMESTAMP_S is stored as seconds since 1970-01-01. typedef struct { int64_t seconds; } duckdb_timestamp_s; //! TIMESTAMP_MS is stored as milliseconds since 1970-01-01. typedef struct { int64_t millis; } duckdb_timestamp_ms; //! TIMESTAMP_NS is stored as nanoseconds since 1970-01-01. typedef struct { int64_t nanos; } duckdb_timestamp_ns; //! INTERVAL is stored in months, days, and micros. typedef struct { int32_t months; int32_t days; int64_t micros; } duckdb_interval; //! HUGEINT is composed of a lower and upper component. //! Its value is upper * 2^64 + lower. //! For simplified usage, use `duckdb_hugeint_to_double` and `duckdb_double_to_hugeint`. typedef struct { uint64_t lower; int64_t upper; } duckdb_hugeint; //! UHUGEINT is composed of a lower and upper component. //! Its value is upper * 2^64 + lower. //! For simplified usage, use `duckdb_uhugeint_to_double` and `duckdb_double_to_uhugeint`. typedef struct { uint64_t lower; uint64_t upper; } duckdb_uhugeint; //! DECIMAL is composed of a width and a scale. //! Their value is stored in a HUGEINT. typedef struct { uint8_t width; uint8_t scale; duckdb_hugeint value; } duckdb_decimal; //! A type holding information about the query execution progress. typedef struct { double percentage; uint64_t rows_processed; uint64_t total_rows_to_process; } duckdb_query_progress_type; //! The internal representation of a VARCHAR (string_t). If the VARCHAR does not //! exceed 12 characters, then we inline it. Otherwise, we inline a four-byte prefix for faster //! string comparisons and store a pointer to the remaining characters. This is a non- //! owning structure, i.e., it does not have to be freed. typedef struct { union { struct { uint32_t length; char prefix[4]; char *ptr; } pointer; struct { uint32_t length; char inlined[12]; } inlined; } value; } duckdb_string_t; //! DuckDB's LISTs are composed of a 'parent' vector holding metadata of each list, //! and a child vector holding the entries of the lists. //! The `duckdb_list_entry` struct contains the internal representation of a LIST metadata entry. //! A metadata entry contains the length of the list, and its offset in the child vector. typedef struct { uint64_t offset; uint64_t length; } duckdb_list_entry; //! A column consists of a pointer to its internal data. Don't operate on this type directly. //! Instead, use functions such as `duckdb_column_data`, `duckdb_nullmask_data`, //! `duckdb_column_type`, and `duckdb_column_name`. typedef struct { // Deprecated, use `duckdb_column_data`. void *deprecated_data; // Deprecated, use `duckdb_nullmask_data`. bool *deprecated_nullmask; // Deprecated, use `duckdb_column_type`. duckdb_type deprecated_type; // Deprecated, use `duckdb_column_name`. char *deprecated_name; void *internal_data; } duckdb_column; //! 1. A standalone vector that must be destroyed, or //! 2. A vector to a column in a data chunk that lives as long as the data chunk lives. typedef struct _duckdb_vector { void *internal_ptr; } * duckdb_vector; //! A selection vector is a vector of indices, which usually refer to values in a vector. //! Can be used to slice vectors, changing their length and the order of their entries. //! Standalone selection vectors must be destroyed. typedef struct _duckdb_selection_vector { void *internal_ptr; } * duckdb_selection_vector; //===--------------------------------------------------------------------===// // Types (explicit freeing/destroying) //===--------------------------------------------------------------------===// //! Strings are composed of a `char` pointer and a size. //! You must free `string.data` with `duckdb_free`. typedef struct { char *data; idx_t size; } duckdb_string; //! BLOBs are composed of a byte pointer and a size. //! You must free `blob.data` with `duckdb_free`. typedef struct { void *data; idx_t size; } duckdb_blob; //! BITs are composed of a byte pointer and a size. //! BIT byte data has 0 to 7 bits of padding. //! The first byte contains the number of padding bits. //! The padding bits of the second byte are set to 1, starting from the MSB. //! You must free `data` with `duckdb_free`. typedef struct { uint8_t *data; idx_t size; } duckdb_bit; //! BIGNUMs are composed of a byte pointer, a size, and an `is_negative` bool. //! The absolute value of the number is stored in `data` in little endian format. //! You must free `data` with `duckdb_free`. typedef struct { uint8_t *data; idx_t size; bool is_negative; } duckdb_bignum; //! A query result consists of a pointer to its internal data. //! Must be freed with 'duckdb_destroy_result'. typedef struct { // Deprecated, use `duckdb_column_count`. idx_t deprecated_column_count; // Deprecated, use `duckdb_row_count`. idx_t deprecated_row_count; // Deprecated, use `duckdb_rows_changed`. idx_t deprecated_rows_changed; // Deprecated, use `duckdb_column_*`-family of functions. duckdb_column *deprecated_columns; // Deprecated, use `duckdb_result_error`. char *deprecated_error_message; void *internal_data; } duckdb_result; //! A database instance cache object. Must be destroyed with `duckdb_destroy_instance_cache`. typedef struct _duckdb_instance_cache { void *internal_ptr; } * duckdb_instance_cache; //! A database object. Must be closed with `duckdb_close`. typedef struct _duckdb_database { void *internal_ptr; } * duckdb_database; //! A connection to a duckdb database. Must be closed with `duckdb_disconnect`. typedef struct _duckdb_connection { void *internal_ptr; } * duckdb_connection; //! A client context of a duckdb connection. Must be destroyed with `duckdb_destroy_context`. typedef struct _duckdb_client_context { void *internal_ptr; } * duckdb_client_context; //! A prepared statement is a parameterized query that allows you to bind parameters to it. //! Must be destroyed with `duckdb_destroy_prepare`. typedef struct _duckdb_prepared_statement { void *internal_ptr; } * duckdb_prepared_statement; //! Extracted statements. Must be destroyed with `duckdb_destroy_extracted`. typedef struct _duckdb_extracted_statements { void *internal_ptr; } * duckdb_extracted_statements; //! The pending result represents an intermediate structure for a query that is not yet fully executed. //! Must be destroyed with `duckdb_destroy_pending`. typedef struct _duckdb_pending_result { void *internal_ptr; } * duckdb_pending_result; //! The appender enables fast data loading into DuckDB. //! Must be destroyed with `duckdb_appender_destroy`. typedef struct _duckdb_appender { void *internal_ptr; } * duckdb_appender; //! The table description allows querying information about the table. //! Must be destroyed with `duckdb_table_description_destroy`. typedef struct _duckdb_table_description { void *internal_ptr; } * duckdb_table_description; //! The configuration can be used to provide start-up options for a database. //! Must be destroyed with `duckdb_destroy_config`. typedef struct _duckdb_config { void *internal_ptr; } * duckdb_config; //! A logical type. //! Must be destroyed with `duckdb_destroy_logical_type`. typedef struct _duckdb_logical_type { void *internal_ptr; } * duckdb_logical_type; //! Holds extra information to register a custom logical type. //! Reserved for future use. typedef struct _duckdb_create_type_info { void *internal_ptr; } * duckdb_create_type_info; //! Contains a data chunk of a duckdb_result. //! Must be destroyed with `duckdb_destroy_data_chunk`. typedef struct _duckdb_data_chunk { void *internal_ptr; } * duckdb_data_chunk; //! A value of a logical type. //! Must be destroyed with `duckdb_destroy_value`. typedef struct _duckdb_value { void *internal_ptr; } * duckdb_value; //! Holds a recursive tree containing profiling metrics. //! The tree matches the query plan, and has a top-level node. typedef struct _duckdb_profiling_info { void *internal_ptr; } * duckdb_profiling_info; //! Holds error data. //! Must be destroyed with `duckdb_destroy_error_data`. typedef struct _duckdb_error_data { void *internal_ptr; } * duckdb_error_data; //! Holds a bound expression. //! Must be destroyed with `duckdb_destroy_expression`. typedef struct _duckdb_expression { void *internal_ptr; } * duckdb_expression; //===--------------------------------------------------------------------===// // C API extension information //===--------------------------------------------------------------------===// //! Holds the state of the C API extension initialization process. typedef struct _duckdb_extension_info { void *internal_ptr; } * duckdb_extension_info; //===--------------------------------------------------------------------===// // Function types //===--------------------------------------------------------------------===// //! Additional function info. //! When setting this info, it is necessary to pass a destroy-callback function. typedef struct _duckdb_function_info { void *internal_ptr; } * duckdb_function_info; //! The bind info of a function. //! When setting this info, it is necessary to pass a destroy-callback function. typedef struct _duckdb_bind_info { void *internal_ptr; } * duckdb_bind_info; //===--------------------------------------------------------------------===// // Scalar function types //===--------------------------------------------------------------------===// //! A scalar function. Must be destroyed with `duckdb_destroy_scalar_function`. typedef struct _duckdb_scalar_function { void *internal_ptr; } * duckdb_scalar_function; //! A scalar function set. Must be destroyed with `duckdb_destroy_scalar_function_set`. typedef struct _duckdb_scalar_function_set { void *internal_ptr; } * duckdb_scalar_function_set; //! The bind function callback of the scalar function. typedef void (*duckdb_scalar_function_bind_t)(duckdb_bind_info info); //! The function to execute the scalar function on an input chunk. typedef void (*duckdb_scalar_function_t)(duckdb_function_info info, duckdb_data_chunk input, duckdb_vector output); //===--------------------------------------------------------------------===// // Aggregate function types //===--------------------------------------------------------------------===// //! An aggregate function. Must be destroyed with `duckdb_destroy_aggregate_function`. typedef struct _duckdb_aggregate_function { void *internal_ptr; } * duckdb_aggregate_function; //! A aggregate function set. Must be destroyed with `duckdb_destroy_aggregate_function_set`. typedef struct _duckdb_aggregate_function_set { void *internal_ptr; } * duckdb_aggregate_function_set; //! The state of an aggregate function. typedef struct _duckdb_aggregate_state { void *internal_ptr; } * duckdb_aggregate_state; //! A function to return the aggregate state's size. typedef idx_t (*duckdb_aggregate_state_size)(duckdb_function_info info); //! A function to initialize an aggregate state. typedef void (*duckdb_aggregate_init_t)(duckdb_function_info info, duckdb_aggregate_state state); //! An optional function to destroy an aggregate state. typedef void (*duckdb_aggregate_destroy_t)(duckdb_aggregate_state *states, idx_t count); //! A function to update a set of aggregate states with new values. typedef void (*duckdb_aggregate_update_t)(duckdb_function_info info, duckdb_data_chunk input, duckdb_aggregate_state *states); //! A function to combine aggregate states. typedef void (*duckdb_aggregate_combine_t)(duckdb_function_info info, duckdb_aggregate_state *source, duckdb_aggregate_state *target, idx_t count); //! A function to finalize aggregate states into a result vector. typedef void (*duckdb_aggregate_finalize_t)(duckdb_function_info info, duckdb_aggregate_state *source, duckdb_vector result, idx_t count, idx_t offset); //===--------------------------------------------------------------------===// // Table function types //===--------------------------------------------------------------------===// //! A table function. Must be destroyed with `duckdb_destroy_table_function`. typedef struct _duckdb_table_function { void *internal_ptr; } * duckdb_table_function; //! Additional function initialization info. //! When setting this info, it is necessary to pass a destroy-callback function. typedef struct _duckdb_init_info { void *internal_ptr; } * duckdb_init_info; //! The bind function of the table function. typedef void (*duckdb_table_function_bind_t)(duckdb_bind_info info); //! The possibly thread-local initialization function of the table function. typedef void (*duckdb_table_function_init_t)(duckdb_init_info info); //! The function to generate an output chunk during table function execution. typedef void (*duckdb_table_function_t)(duckdb_function_info info, duckdb_data_chunk output); //===--------------------------------------------------------------------===// // Cast types //===--------------------------------------------------------------------===// //! A cast function. Must be destroyed with `duckdb_destroy_cast_function`. typedef struct _duckdb_cast_function { void *internal_ptr; } * duckdb_cast_function; //! The function to cast from an input vector to an output vector. typedef bool (*duckdb_cast_function_t)(duckdb_function_info info, idx_t count, duckdb_vector input, duckdb_vector output); //===--------------------------------------------------------------------===// // Replacement scan types //===--------------------------------------------------------------------===// //! Additional replacement scan info. When setting this info, it is necessary to pass a destroy-callback function. typedef struct _duckdb_replacement_scan_info { void *internal_ptr; } * duckdb_replacement_scan_info; //! A replacement scan function. typedef void (*duckdb_replacement_callback_t)(duckdb_replacement_scan_info info, const char *table_name, void *data); //===--------------------------------------------------------------------===// // Arrow-related types //===--------------------------------------------------------------------===// //! Forward declare Arrow structs //! It is important to notice that these structs are not defined by DuckDB but are actually Arrow external objects. //! They're defined by the C Data Interface Arrow spec: https://arrow.apache.org/docs/format/CDataInterface.html struct ArrowArray; struct ArrowSchema; //! Holds an arrow query result. Must be destroyed with `duckdb_destroy_arrow`. typedef struct _duckdb_arrow { void *internal_ptr; } * duckdb_arrow; //! Holds an arrow array stream. Must be destroyed with `duckdb_destroy_arrow_stream`. typedef struct _duckdb_arrow_stream { void *internal_ptr; } * duckdb_arrow_stream; //! Holds an arrow schema. Remember to release the respective ArrowSchema object. typedef struct _duckdb_arrow_schema { void *internal_ptr; } * duckdb_arrow_schema; //! Holds an arrow converted schema (i.e., duckdb::ArrowTableSchema). //! In practice, this object holds the information necessary to do proper conversion between Arrow Types and DuckDB //! Types. Check duckdb/function/table/arrow/arrow_duck_schema.hpp for more details! Must be destroyed with //! `duckdb_destroy_arrow_converted_schema` typedef struct _duckdb_arrow_converted_schema { void *internal_ptr; } * duckdb_arrow_converted_schema; //! Holds an arrow array. Remember to release the respective ArrowSchema object. typedef struct _duckdb_arrow_array { void *internal_ptr; } * duckdb_arrow_array; //! The arrow options used when transforming the DuckDB schema and datachunks into Arrow schema and arrays. //! Used in `duckdb_to_arrow_schema` and `duckdb_data_chunk_to_arrow` typedef struct _duckdb_arrow_options { void *internal_ptr; } * duckdb_arrow_options; //===--------------------------------------------------------------------===// // DuckDB extension access //===--------------------------------------------------------------------===// //! Passed to C API extension as a parameter to the entrypoint. struct duckdb_extension_access { //! Indicate that an error has occurred. void (*set_error)(duckdb_extension_info info, const char *error); //! Fetch the database on which to register the extension. duckdb_database *(*get_database)(duckdb_extension_info info); //! Fetch the API struct pointer. const void *(*get_api)(duckdb_extension_info info, const char *version); }; #ifndef DUCKDB_API_EXCLUDE_FUNCTIONS //===--------------------------------------------------------------------===// // Functions //===--------------------------------------------------------------------===// //===--------------------------------------------------------------------===// // Open Connect //===--------------------------------------------------------------------===// /*! Creates a new database instance cache. The instance cache is necessary if a client/program (re)opens multiple databases to the same file within the same process. Must be destroyed with 'duckdb_destroy_instance_cache'. * @return The database instance cache. */ DUCKDB_C_API duckdb_instance_cache duckdb_create_instance_cache(); /*! Creates a new database instance in the instance cache, or retrieves an existing database instance. Must be closed with 'duckdb_close'. * @param instance_cache The instance cache in which to create the database, or from which to take the database. * @param path Path to the database file on disk. Both `nullptr` and `:memory:` open or retrieve an in-memory database. * @param out_database The resulting cached database. * @param config (Optional) configuration used to create the database. * @param out_error If set and the function returns `DuckDBError`, this contains the error message. Note that the error message must be freed using `duckdb_free`. * @return `DuckDBSuccess` on success or `DuckDBError` on failure. */ DUCKDB_C_API duckdb_state duckdb_get_or_create_from_cache(duckdb_instance_cache instance_cache, const char *path, duckdb_database *out_database, duckdb_config config, char **out_error); /*! Destroys an existing database instance cache and de-allocates its memory. * @param instance_cache The instance cache to destroy. */ DUCKDB_C_API void duckdb_destroy_instance_cache(duckdb_instance_cache *instance_cache); /*! Creates a new database or opens an existing database file stored at the given path. If no path is given a new in-memory database is created instead. The database must be closed with 'duckdb_close'. * @param path Path to the database file on disk. Both `nullptr` and `:memory:` open an in-memory database. * @param out_database The result database object. * @return `DuckDBSuccess` on success or `DuckDBError` on failure. */ DUCKDB_C_API duckdb_state duckdb_open(const char *path, duckdb_database *out_database); /*! Extended version of duckdb_open. Creates a new database or opens an existing database file stored at the given path. The database must be closed with 'duckdb_close'. * @param path Path to the database file on disk. Both `nullptr` and `:memory:` open an in-memory database. * @param out_database The result database object. * @param config (Optional) configuration used to start up the database. * @param out_error If set and the function returns `DuckDBError`, this contains the error message. Note that the error message must be freed using `duckdb_free`. * @return `DuckDBSuccess` on success or `DuckDBError` on failure. */ DUCKDB_C_API duckdb_state duckdb_open_ext(const char *path, duckdb_database *out_database, duckdb_config config, char **out_error); /*! Closes the specified database and de-allocates all memory allocated for that database. This should be called after you are done with any database allocated through `duckdb_open` or `duckdb_open_ext`. Note that failing to call `duckdb_close` (in case of e.g. a program crash) will not cause data corruption. Still, it is recommended to always correctly close a database object after you are done with it. * @param database The database object to shut down. */ DUCKDB_C_API void duckdb_close(duckdb_database *database); /*! Opens a connection to a database. Connections are required to query the database, and store transactional state associated with the connection. The instantiated connection should be closed using 'duckdb_disconnect'. * @param database The database file to connect to. * @param out_connection The result connection object. * @return `DuckDBSuccess` on success or `DuckDBError` on failure. */ DUCKDB_C_API duckdb_state duckdb_connect(duckdb_database database, duckdb_connection *out_connection); /*! Interrupt running query * @param connection The connection to interrupt */ DUCKDB_C_API void duckdb_interrupt(duckdb_connection connection); /*! Get progress of the running query * @param connection The working connection * @return -1 if no progress or a percentage of the progress */ DUCKDB_C_API duckdb_query_progress_type duckdb_query_progress(duckdb_connection connection); /*! Closes the specified connection and de-allocates all memory allocated for that connection. * @param connection The connection to close. */ DUCKDB_C_API void duckdb_disconnect(duckdb_connection *connection); /*! Retrieves the client context of the connection. * @param connection The connection. * @param out_context The client context of the connection. Must be destroyed with `duckdb_destroy_client_context`. */ DUCKDB_C_API void duckdb_connection_get_client_context(duckdb_connection connection, duckdb_client_context *out_context); /*! Retrieves the arrow options of the connection. * @param connection The connection. */ DUCKDB_C_API void duckdb_connection_get_arrow_options(duckdb_connection connection, duckdb_arrow_options *out_arrow_options); /*! Returns the connection id of the client context. * @param context The client context. * @return The connection id of the client context. */ DUCKDB_C_API idx_t duckdb_client_context_get_connection_id(duckdb_client_context context); /*! Destroys the client context and deallocates its memory. * @param context The client context to destroy. */ DUCKDB_C_API void duckdb_destroy_client_context(duckdb_client_context *context); /*! Destroys the arrow options and deallocates its memory. * @param arrow_options The arrow options to destroy. */ DUCKDB_C_API void duckdb_destroy_arrow_options(duckdb_arrow_options *arrow_options); /*! Returns the version of the linked DuckDB, with a version postfix for dev versions Usually used for developing C extensions that must return this for a compatibility check. */ DUCKDB_C_API const char *duckdb_library_version(); /*! Get the list of (fully qualified) table names of the query. * @param connection The connection for which to get the table names. * @param query The query for which to get the table names. * @param qualified Returns fully qualified table names (catalog.schema.table), if set to true, else only the (not escaped) table names. * @return A duckdb_value of type VARCHAR[] containing the (fully qualified) table names of the query. Must be destroyed with duckdb_destroy_value. */ DUCKDB_C_API duckdb_value duckdb_get_table_names(duckdb_connection connection, const char *query, bool qualified); //===--------------------------------------------------------------------===// // Configuration //===--------------------------------------------------------------------===// /*! Initializes an empty configuration object that can be used to provide start-up options for the DuckDB instance through `duckdb_open_ext`. The duckdb_config must be destroyed using 'duckdb_destroy_config' This will always succeed unless there is a malloc failure. Note that `duckdb_destroy_config` should always be called on the resulting config, even if the function returns `DuckDBError`. * @param out_config The result configuration object. * @return `DuckDBSuccess` on success or `DuckDBError` on failure. */ DUCKDB_C_API duckdb_state duckdb_create_config(duckdb_config *out_config); /*! This returns the total amount of configuration options available for usage with `duckdb_get_config_flag`. This should not be called in a loop as it internally loops over all the options. * @return The amount of config options available. */ DUCKDB_C_API size_t duckdb_config_count(); /*! Obtains a human-readable name and description of a specific configuration option. This can be used to e.g. display configuration options. This will succeed unless `index` is out of range (i.e. `>= duckdb_config_count`). The result name or description MUST NOT be freed. * @param index The index of the configuration option (between 0 and `duckdb_config_count`) * @param out_name A name of the configuration flag. * @param out_description A description of the configuration flag. * @return `DuckDBSuccess` on success or `DuckDBError` on failure. */ DUCKDB_C_API duckdb_state duckdb_get_config_flag(size_t index, const char **out_name, const char **out_description); /*! Sets the specified option for the specified configuration. The configuration option is indicated by name. To obtain a list of config options, see `duckdb_get_config_flag`. In the source code, configuration options are defined in `config.cpp`. This can fail if either the name is invalid, or if the value provided for the option is invalid. * @param config The configuration object to set the option on. * @param name The name of the configuration flag to set. * @param option The value to set the configuration flag to. * @return `DuckDBSuccess` on success or `DuckDBError` on failure. */ DUCKDB_C_API duckdb_state duckdb_set_config(duckdb_config config, const char *name, const char *option); /*! Destroys the specified configuration object and de-allocates all memory allocated for the object. * @param config The configuration object to destroy. */ DUCKDB_C_API void duckdb_destroy_config(duckdb_config *config); //===--------------------------------------------------------------------===// // Error Data //===--------------------------------------------------------------------===// // Functions that can throw DuckDB errors must return duckdb_error_data. // Please use this interface for all new functions, as it deprecates all previous error handling approaches. /*! Creates duckdb_error_data. Must be destroyed with `duckdb_destroy_error_data`. * @param type The error type. * @param message The error message. * @return The error data. */ DUCKDB_C_API duckdb_error_data duckdb_create_error_data(duckdb_error_type type, const char *message); /*! Destroys the error data and deallocates its memory. * @param error_data The error data to destroy. */ DUCKDB_C_API void duckdb_destroy_error_data(duckdb_error_data *error_data); /*! Returns the duckdb_error_type of the error data. * @param error_data The error data. * @return The error type. */ DUCKDB_C_API duckdb_error_type duckdb_error_data_error_type(duckdb_error_data error_data); /*! Returns the error message of the error data. Must not be freed. * @param error_data The error data. * @return The error message. */ DUCKDB_C_API const char *duckdb_error_data_message(duckdb_error_data error_data); /*! Returns whether the error data contains an error or not. * @param error_data The error data. * @return True, if the error data contains an exception, else false. */ DUCKDB_C_API bool duckdb_error_data_has_error(duckdb_error_data error_data); //===--------------------------------------------------------------------===// // Query Execution //===--------------------------------------------------------------------===// /*! Executes a SQL query within a connection and stores the full (materialized) result in the out_result pointer. If the query fails to execute, DuckDBError is returned and the error message can be retrieved by calling `duckdb_result_error`. Note that after running `duckdb_query`, `duckdb_destroy_result` must be called on the result object even if the query fails, otherwise the error stored within the result will not be freed correctly. * @param connection The connection to perform the query in. * @param query The SQL query to run. * @param out_result The query result. * @return `DuckDBSuccess` on success or `DuckDBError` on failure. */ DUCKDB_C_API duckdb_state duckdb_query(duckdb_connection connection, const char *query, duckdb_result *out_result); /*! Closes the result and de-allocates all memory allocated for that result. * @param result The result to destroy. */ DUCKDB_C_API void duckdb_destroy_result(duckdb_result *result); /*! Returns the column name of the specified column. The result should not need to be freed; the column names will automatically be destroyed when the result is destroyed. Returns `NULL` if the column is out of range. * @param result The result object to fetch the column name from. * @param col The column index. * @return The column name of the specified column. */ DUCKDB_C_API const char *duckdb_column_name(duckdb_result *result, idx_t col); /*! Returns the column type of the specified column. Returns `DUCKDB_TYPE_INVALID` if the column is out of range. * @param result The result object to fetch the column type from. * @param col The column index. * @return The column type of the specified column. */ DUCKDB_C_API duckdb_type duckdb_column_type(duckdb_result *result, idx_t col); /*! Returns the statement type of the statement that was executed * @param result The result object to fetch the statement type from. * @return duckdb_statement_type value or DUCKDB_STATEMENT_TYPE_INVALID */ DUCKDB_C_API duckdb_statement_type duckdb_result_statement_type(duckdb_result result); /*! Returns the logical column type of the specified column. The return type of this call should be destroyed with `duckdb_destroy_logical_type`. Returns `NULL` if the column is out of range. * @param result The result object to fetch the column type from. * @param col The column index. * @return The logical column type of the specified column. */ DUCKDB_C_API duckdb_logical_type duckdb_column_logical_type(duckdb_result *result, idx_t col); /*! Returns the arrow options associated with the given result. These options are definitions of how the arrow arrays/schema should be produced. * @param result The result object to fetch arrow options from. * @return The arrow options associated with the given result. This must be destroyed with `duckdb_destroy_arrow_options`. */ DUCKDB_C_API duckdb_arrow_options duckdb_result_get_arrow_options(duckdb_result *result); /*! Returns the number of columns present in a the result object. * @param result The result object. * @return The number of columns present in the result object. */ DUCKDB_C_API idx_t duckdb_column_count(duckdb_result *result); #ifndef DUCKDB_API_NO_DEPRECATED /*! **DEPRECATION NOTICE**: This method is scheduled for removal in a future release. Returns the number of rows present in the result object. * @param result The result object. * @return The number of rows present in the result object. */ DUCKDB_C_API idx_t duckdb_row_count(duckdb_result *result); #endif /*! Returns the number of rows changed by the query stored in the result. This is relevant only for INSERT/UPDATE/DELETE queries. For other queries the rows_changed will be 0. * @param result The result object. * @return The number of rows changed. */ DUCKDB_C_API idx_t duckdb_rows_changed(duckdb_result *result); #ifndef DUCKDB_API_NO_DEPRECATED /*! **DEPRECATED**: Prefer using `duckdb_result_get_chunk` instead. Returns the data of a specific column of a result in columnar format. The function returns a dense array which contains the result data. The exact type stored in the array depends on the corresponding duckdb_type (as provided by `duckdb_column_type`). For the exact type by which the data should be accessed, see the comments in [the types section](types) or the `DUCKDB_TYPE` enum. For example, for a column of type `DUCKDB_TYPE_INTEGER`, rows can be accessed in the following manner: ```c int32_t *data = (int32_t *) duckdb_column_data(&result, 0); printf("Data for row %d: %d\n", row, data[row]); ``` * @param result The result object to fetch the column data from. * @param col The column index. * @return The column data of the specified column. */ DUCKDB_C_API void *duckdb_column_data(duckdb_result *result, idx_t col); /*! **DEPRECATED**: Prefer using `duckdb_result_get_chunk` instead. Returns the nullmask of a specific column of a result in columnar format. The nullmask indicates for every row whether or not the corresponding row is `NULL`. If a row is `NULL`, the values present in the array provided by `duckdb_column_data` are undefined. ```c int32_t *data = (int32_t *) duckdb_column_data(&result, 0); bool *nullmask = duckdb_nullmask_data(&result, 0); if (nullmask[row]) { printf("Data for row %d: NULL\n", row); } else { printf("Data for row %d: %d\n", row, data[row]); } ``` * @param result The result object to fetch the nullmask from. * @param col The column index. * @return The nullmask of the specified column. */ DUCKDB_C_API bool *duckdb_nullmask_data(duckdb_result *result, idx_t col); #endif /*! Returns the error message contained within the result. The error is only set if `duckdb_query` returns `DuckDBError`. The result of this function must not be freed. It will be cleaned up when `duckdb_destroy_result` is called. * @param result The result object to fetch the error from. * @return The error of the result. */ DUCKDB_C_API const char *duckdb_result_error(duckdb_result *result); /*! Returns the result error type contained within the result. The error is only set if `duckdb_query` returns `DuckDBError`. * @param result The result object to fetch the error from. * @return The error type of the result. */ DUCKDB_C_API duckdb_error_type duckdb_result_error_type(duckdb_result *result); //===--------------------------------------------------------------------===// // Result Functions //===--------------------------------------------------------------------===// #ifndef DUCKDB_API_NO_DEPRECATED /*! **DEPRECATION NOTICE**: This method is scheduled for removal in a future release. Fetches a data chunk from the duckdb_result. This function should be called repeatedly until the result is exhausted. The result must be destroyed with `duckdb_destroy_data_chunk`. This function supersedes all `duckdb_value` functions, as well as the `duckdb_column_data` and `duckdb_nullmask_data` functions. It results in significantly better performance, and should be preferred in newer code-bases. If this function is used, none of the other result functions can be used and vice versa (i.e. this function cannot be mixed with the legacy result functions). Use `duckdb_result_chunk_count` to figure out how many chunks there are in the result. * @param result The result object to fetch the data chunk from. * @param chunk_index The chunk index to fetch from. * @return The resulting data chunk. Returns `NULL` if the chunk index is out of bounds. */ DUCKDB_C_API duckdb_data_chunk duckdb_result_get_chunk(duckdb_result result, idx_t chunk_index); /*! **DEPRECATION NOTICE**: This method is scheduled for removal in a future release. Checks if the type of the internal result is StreamQueryResult. * @param result The result object to check. * @return Whether or not the result object is of the type StreamQueryResult */ DUCKDB_C_API bool duckdb_result_is_streaming(duckdb_result result); /*! **DEPRECATION NOTICE**: This method is scheduled for removal in a future release. Returns the number of data chunks present in the result. * @param result The result object * @return Number of data chunks present in the result. */ DUCKDB_C_API idx_t duckdb_result_chunk_count(duckdb_result result); #endif /*! Returns the return_type of the given result, or DUCKDB_RETURN_TYPE_INVALID on error * @param result The result object * @return The return_type */ DUCKDB_C_API duckdb_result_type duckdb_result_return_type(duckdb_result result); //===--------------------------------------------------------------------===// // Safe Fetch Functions //===--------------------------------------------------------------------===// // These functions will perform conversions if necessary. // On failure (e.g. if conversion cannot be performed or if the value is NULL) a default value is returned. // Note that these functions are slow since they perform bounds checking and conversion // For fast access of values prefer using `duckdb_result_get_chunk` #ifndef DUCKDB_API_NO_DEPRECATED /*! **DEPRECATION NOTICE**: This method is scheduled for removal in a future release. * @return The boolean value at the specified location, or false if the value cannot be converted. */ DUCKDB_C_API bool duckdb_value_boolean(duckdb_result *result, idx_t col, idx_t row); /*! **DEPRECATION NOTICE**: This method is scheduled for removal in a future release. * @return The int8_t value at the specified location, or 0 if the value cannot be converted. */ DUCKDB_C_API int8_t duckdb_value_int8(duckdb_result *result, idx_t col, idx_t row); /*! **DEPRECATION NOTICE**: This method is scheduled for removal in a future release. * @return The int16_t value at the specified location, or 0 if the value cannot be converted. */ DUCKDB_C_API int16_t duckdb_value_int16(duckdb_result *result, idx_t col, idx_t row); /*! **DEPRECATION NOTICE**: This method is scheduled for removal in a future release. * @return The int32_t value at the specified location, or 0 if the value cannot be converted. */ DUCKDB_C_API int32_t duckdb_value_int32(duckdb_result *result, idx_t col, idx_t row); /*! **DEPRECATION NOTICE**: This method is scheduled for removal in a future release. * @return The int64_t value at the specified location, or 0 if the value cannot be converted. */ DUCKDB_C_API int64_t duckdb_value_int64(duckdb_result *result, idx_t col, idx_t row); /*! **DEPRECATION NOTICE**: This method is scheduled for removal in a future release. * @return The duckdb_hugeint value at the specified location, or 0 if the value cannot be converted. */ DUCKDB_C_API duckdb_hugeint duckdb_value_hugeint(duckdb_result *result, idx_t col, idx_t row); /*! **DEPRECATION NOTICE**: This method is scheduled for removal in a future release. * @return The duckdb_uhugeint value at the specified location, or 0 if the value cannot be converted. */ DUCKDB_C_API duckdb_uhugeint duckdb_value_uhugeint(duckdb_result *result, idx_t col, idx_t row); /*! **DEPRECATION NOTICE**: This method is scheduled for removal in a future release. * @return The duckdb_decimal value at the specified location, or 0 if the value cannot be converted. */ DUCKDB_C_API duckdb_decimal duckdb_value_decimal(duckdb_result *result, idx_t col, idx_t row); /*! **DEPRECATION NOTICE**: This method is scheduled for removal in a future release. * @return The uint8_t value at the specified location, or 0 if the value cannot be converted. */ DUCKDB_C_API uint8_t duckdb_value_uint8(duckdb_result *result, idx_t col, idx_t row); /*! **DEPRECATION NOTICE**: This method is scheduled for removal in a future release. * @return The uint16_t value at the specified location, or 0 if the value cannot be converted. */ DUCKDB_C_API uint16_t duckdb_value_uint16(duckdb_result *result, idx_t col, idx_t row); /*! **DEPRECATION NOTICE**: This method is scheduled for removal in a future release. * @return The uint32_t value at the specified location, or 0 if the value cannot be converted. */ DUCKDB_C_API uint32_t duckdb_value_uint32(duckdb_result *result, idx_t col, idx_t row); /*! **DEPRECATION NOTICE**: This method is scheduled for removal in a future release. * @return The uint64_t value at the specified location, or 0 if the value cannot be converted. */ DUCKDB_C_API uint64_t duckdb_value_uint64(duckdb_result *result, idx_t col, idx_t row); /*! **DEPRECATION NOTICE**: This method is scheduled for removal in a future release. * @return The float value at the specified location, or 0 if the value cannot be converted. */ DUCKDB_C_API float duckdb_value_float(duckdb_result *result, idx_t col, idx_t row); /*! **DEPRECATION NOTICE**: This method is scheduled for removal in a future release. * @return The double value at the specified location, or 0 if the value cannot be converted. */ DUCKDB_C_API double duckdb_value_double(duckdb_result *result, idx_t col, idx_t row); /*! **DEPRECATION NOTICE**: This method is scheduled for removal in a future release. * @return The duckdb_date value at the specified location, or 0 if the value cannot be converted. */ DUCKDB_C_API duckdb_date duckdb_value_date(duckdb_result *result, idx_t col, idx_t row); /*! **DEPRECATION NOTICE**: This method is scheduled for removal in a future release. * @return The duckdb_time value at the specified location, or 0 if the value cannot be converted. */ DUCKDB_C_API duckdb_time duckdb_value_time(duckdb_result *result, idx_t col, idx_t row); /*! **DEPRECATION NOTICE**: This method is scheduled for removal in a future release. * @return The duckdb_timestamp value at the specified location, or 0 if the value cannot be converted. */ DUCKDB_C_API duckdb_timestamp duckdb_value_timestamp(duckdb_result *result, idx_t col, idx_t row); /*! **DEPRECATION NOTICE**: This method is scheduled for removal in a future release. * @return The duckdb_interval value at the specified location, or 0 if the value cannot be converted. */ DUCKDB_C_API duckdb_interval duckdb_value_interval(duckdb_result *result, idx_t col, idx_t row); /*! **DEPRECATED**: Use duckdb_value_string instead. This function does not work correctly if the string contains null bytes. * @return The text value at the specified location as a null-terminated string, or nullptr if the value cannot be converted. The result must be freed with `duckdb_free`. */ DUCKDB_C_API char *duckdb_value_varchar(duckdb_result *result, idx_t col, idx_t row); /*! **DEPRECATION NOTICE**: This method is scheduled for removal in a future release. No support for nested types, and for other complex types. The resulting field "string.data" must be freed with `duckdb_free.` * @return The string value at the specified location. Attempts to cast the result value to string. */ DUCKDB_C_API duckdb_string duckdb_value_string(duckdb_result *result, idx_t col, idx_t row); /*! **DEPRECATED**: Use duckdb_value_string_internal instead. This function does not work correctly if the string contains null bytes. * @return The char* value at the specified location. ONLY works on VARCHAR columns and does not auto-cast. If the column is NOT a VARCHAR column this function will return NULL. The result must NOT be freed. */ DUCKDB_C_API char *duckdb_value_varchar_internal(duckdb_result *result, idx_t col, idx_t row); /*! **DEPRECATED**: Use duckdb_value_string_internal instead. This function does not work correctly if the string contains null bytes. * @return The char* value at the specified location. ONLY works on VARCHAR columns and does not auto-cast. If the column is NOT a VARCHAR column this function will return NULL. The result must NOT be freed. */ DUCKDB_C_API duckdb_string duckdb_value_string_internal(duckdb_result *result, idx_t col, idx_t row); /*! **DEPRECATION NOTICE**: This method is scheduled for removal in a future release. * @return The duckdb_blob value at the specified location. Returns a blob with blob.data set to nullptr if the value cannot be converted. The resulting field "blob.data" must be freed with `duckdb_free.` */ DUCKDB_C_API duckdb_blob duckdb_value_blob(duckdb_result *result, idx_t col, idx_t row); /*! **DEPRECATION NOTICE**: This method is scheduled for removal in a future release. * @return Returns true if the value at the specified index is NULL, and false otherwise. */ DUCKDB_C_API bool duckdb_value_is_null(duckdb_result *result, idx_t col, idx_t row); #endif //===--------------------------------------------------------------------===// // Helpers //===--------------------------------------------------------------------===// /*! Allocate `size` bytes of memory using the duckdb internal malloc function. Any memory allocated in this manner should be freed using `duckdb_free`. * @param size The number of bytes to allocate. * @return A pointer to the allocated memory region. */ DUCKDB_C_API void *duckdb_malloc(size_t size); /*! Free a value returned from `duckdb_malloc`, `duckdb_value_varchar`, `duckdb_value_blob`, or `duckdb_value_string`. * @param ptr The memory region to de-allocate. */ DUCKDB_C_API void duckdb_free(void *ptr); /*! The internal vector size used by DuckDB. This is the amount of tuples that will fit into a data chunk created by `duckdb_create_data_chunk`. * @return The vector size. */ DUCKDB_C_API idx_t duckdb_vector_size(); /*! Whether or not the duckdb_string_t value is inlined. This means that the data of the string does not have a separate allocation. */ DUCKDB_C_API bool duckdb_string_is_inlined(duckdb_string_t string); /*! Get the string length of a string_t * @param string The string to get the length of. * @return The length. */ DUCKDB_C_API uint32_t duckdb_string_t_length(duckdb_string_t string); /*! Get a pointer to the string data of a string_t * @param string The string to get the pointer to. * @return The pointer. */ DUCKDB_C_API const char *duckdb_string_t_data(duckdb_string_t *string); //===--------------------------------------------------------------------===// // Date Time Timestamp Helpers //===--------------------------------------------------------------------===// /*! Decompose a `duckdb_date` object into year, month and date (stored as `duckdb_date_struct`). * @param date The date object, as obtained from a `DUCKDB_TYPE_DATE` column. * @return The `duckdb_date_struct` with the decomposed elements. */ DUCKDB_C_API duckdb_date_struct duckdb_from_date(duckdb_date date); /*! Re-compose a `duckdb_date` from year, month and date (`duckdb_date_struct`). * @param date The year, month and date stored in a `duckdb_date_struct`. * @return The `duckdb_date` element. */ DUCKDB_C_API duckdb_date duckdb_to_date(duckdb_date_struct date); /*! Test a `duckdb_date` to see if it is a finite value. * @param date The date object, as obtained from a `DUCKDB_TYPE_DATE` column. * @return True if the date is finite, false if it is ±infinity. */ DUCKDB_C_API bool duckdb_is_finite_date(duckdb_date date); /*! Decompose a `duckdb_time` object into hour, minute, second and microsecond (stored as `duckdb_time_struct`). * @param time The time object, as obtained from a `DUCKDB_TYPE_TIME` column. * @return The `duckdb_time_struct` with the decomposed elements. */ DUCKDB_C_API duckdb_time_struct duckdb_from_time(duckdb_time time); /*! Create a `duckdb_time_tz` object from micros and a timezone offset. * @param micros The microsecond component of the time. * @param offset The timezone offset component of the time. * @return The `duckdb_time_tz` element. */ DUCKDB_C_API duckdb_time_tz duckdb_create_time_tz(int64_t micros, int32_t offset); /*! Decompose a TIME_TZ objects into micros and a timezone offset. Use `duckdb_from_time` to further decompose the micros into hour, minute, second and microsecond. * @param micros The time object, as obtained from a `DUCKDB_TYPE_TIME_TZ` column. */ DUCKDB_C_API duckdb_time_tz_struct duckdb_from_time_tz(duckdb_time_tz micros); /*! Re-compose a `duckdb_time` from hour, minute, second and microsecond (`duckdb_time_struct`). * @param time The hour, minute, second and microsecond in a `duckdb_time_struct`. * @return The `duckdb_time` element. */ DUCKDB_C_API duckdb_time duckdb_to_time(duckdb_time_struct time); /*! Decompose a `duckdb_timestamp` object into a `duckdb_timestamp_struct`. * @param ts The ts object, as obtained from a `DUCKDB_TYPE_TIMESTAMP` column. * @return The `duckdb_timestamp_struct` with the decomposed elements. */ DUCKDB_C_API duckdb_timestamp_struct duckdb_from_timestamp(duckdb_timestamp ts); /*! Re-compose a `duckdb_timestamp` from a duckdb_timestamp_struct. * @param ts The de-composed elements in a `duckdb_timestamp_struct`. * @return The `duckdb_timestamp` element. */ DUCKDB_C_API duckdb_timestamp duckdb_to_timestamp(duckdb_timestamp_struct ts); /*! Test a `duckdb_timestamp` to see if it is a finite value. * @param ts The duckdb_timestamp object, as obtained from a `DUCKDB_TYPE_TIMESTAMP` column. * @return True if the timestamp is finite, false if it is ±infinity. */ DUCKDB_C_API bool duckdb_is_finite_timestamp(duckdb_timestamp ts); /*! Test a `duckdb_timestamp_s` to see if it is a finite value. * @param ts The duckdb_timestamp_s object, as obtained from a `DUCKDB_TYPE_TIMESTAMP_S` column. * @return True if the timestamp is finite, false if it is ±infinity. */ DUCKDB_C_API bool duckdb_is_finite_timestamp_s(duckdb_timestamp_s ts); /*! Test a `duckdb_timestamp_ms` to see if it is a finite value. * @param ts The duckdb_timestamp_ms object, as obtained from a `DUCKDB_TYPE_TIMESTAMP_MS` column. * @return True if the timestamp is finite, false if it is ±infinity. */ DUCKDB_C_API bool duckdb_is_finite_timestamp_ms(duckdb_timestamp_ms ts); /*! Test a `duckdb_timestamp_ns` to see if it is a finite value. * @param ts The duckdb_timestamp_ns object, as obtained from a `DUCKDB_TYPE_TIMESTAMP_NS` column. * @return True if the timestamp is finite, false if it is ±infinity. */ DUCKDB_C_API bool duckdb_is_finite_timestamp_ns(duckdb_timestamp_ns ts); //===--------------------------------------------------------------------===// // Hugeint Helpers //===--------------------------------------------------------------------===// /*! Converts a duckdb_hugeint object (as obtained from a `DUCKDB_TYPE_HUGEINT` column) into a double. * @param val The hugeint value. * @return The converted `double` element. */ DUCKDB_C_API double duckdb_hugeint_to_double(duckdb_hugeint val); /*! Converts a double value to a duckdb_hugeint object. If the conversion fails because the double value is too big the result will be 0. * @param val The double value. * @return The converted `duckdb_hugeint` element. */ DUCKDB_C_API duckdb_hugeint duckdb_double_to_hugeint(double val); //===--------------------------------------------------------------------===// // Unsigned Hugeint Helpers //===--------------------------------------------------------------------===// /*! Converts a duckdb_uhugeint object (as obtained from a `DUCKDB_TYPE_UHUGEINT` column) into a double. * @param val The uhugeint value. * @return The converted `double` element. */ DUCKDB_C_API double duckdb_uhugeint_to_double(duckdb_uhugeint val); /*! Converts a double value to a duckdb_uhugeint object. If the conversion fails because the double value is too big the result will be 0. * @param val The double value. * @return The converted `duckdb_uhugeint` element. */ DUCKDB_C_API duckdb_uhugeint duckdb_double_to_uhugeint(double val); //===--------------------------------------------------------------------===// // Decimal Helpers //===--------------------------------------------------------------------===// /*! Converts a double value to a duckdb_decimal object. If the conversion fails because the double value is too big, or the width/scale are invalid the result will be 0. * @param val The double value. * @return The converted `duckdb_decimal` element. */ DUCKDB_C_API duckdb_decimal duckdb_double_to_decimal(double val, uint8_t width, uint8_t scale); /*! Converts a duckdb_decimal object (as obtained from a `DUCKDB_TYPE_DECIMAL` column) into a double. * @param val The decimal value. * @return The converted `double` element. */ DUCKDB_C_API double duckdb_decimal_to_double(duckdb_decimal val); //===--------------------------------------------------------------------===// // Prepared Statements //===--------------------------------------------------------------------===// // A prepared statement is a parameterized query that allows you to bind parameters to it. // * This is useful to easily supply parameters to functions and avoid SQL injection attacks. // * This is useful to speed up queries that you will execute several times with different parameters. // Because the query will only be parsed, bound, optimized and planned once during the prepare stage, // rather than once per execution. // For example: // SELECT * FROM tbl WHERE id=? // Or a query with multiple parameters: // SELECT * FROM tbl WHERE id=$1 OR name=$2 /*! Create a prepared statement object from a query. Note that after calling `duckdb_prepare`, the prepared statement should always be destroyed using `duckdb_destroy_prepare`, even if the prepare fails. If the prepare fails, `duckdb_prepare_error` can be called to obtain the reason why the prepare failed. * @param connection The connection object * @param query The SQL query to prepare * @param out_prepared_statement The resulting prepared statement object * @return `DuckDBSuccess` on success or `DuckDBError` on failure. */ DUCKDB_C_API duckdb_state duckdb_prepare(duckdb_connection connection, const char *query, duckdb_prepared_statement *out_prepared_statement); /*! Closes the prepared statement and de-allocates all memory allocated for the statement. * @param prepared_statement The prepared statement to destroy. */ DUCKDB_C_API void duckdb_destroy_prepare(duckdb_prepared_statement *prepared_statement); /*! Returns the error message associated with the given prepared statement. If the prepared statement has no error message, this returns `nullptr` instead. The error message should not be freed. It will be de-allocated when `duckdb_destroy_prepare` is called. * @param prepared_statement The prepared statement to obtain the error from. * @return The error message, or `nullptr` if there is none. */ DUCKDB_C_API const char *duckdb_prepare_error(duckdb_prepared_statement prepared_statement); /*! Returns the number of parameters that can be provided to the given prepared statement. Returns 0 if the query was not successfully prepared. * @param prepared_statement The prepared statement to obtain the number of parameters for. */ DUCKDB_C_API idx_t duckdb_nparams(duckdb_prepared_statement prepared_statement); /*! Returns the name used to identify the parameter The returned string should be freed using `duckdb_free`. Returns NULL if the index is out of range for the provided prepared statement. * @param prepared_statement The prepared statement for which to get the parameter name from. */ DUCKDB_C_API const char *duckdb_parameter_name(duckdb_prepared_statement prepared_statement, idx_t index); /*! Returns the parameter type for the parameter at the given index. Returns `DUCKDB_TYPE_INVALID` if the parameter index is out of range or the statement was not successfully prepared. * @param prepared_statement The prepared statement. * @param param_idx The parameter index. * @return The parameter type */ DUCKDB_C_API duckdb_type duckdb_param_type(duckdb_prepared_statement prepared_statement, idx_t param_idx); /*! Returns the logical type for the parameter at the given index. Returns `nullptr` if the parameter index is out of range or the statement was not successfully prepared. The return type of this call should be destroyed with `duckdb_destroy_logical_type`. * @param prepared_statement The prepared statement. * @param param_idx The parameter index. * @return The logical type of the parameter */ DUCKDB_C_API duckdb_logical_type duckdb_param_logical_type(duckdb_prepared_statement prepared_statement, idx_t param_idx); /*! Clear the params bind to the prepared statement. */ DUCKDB_C_API duckdb_state duckdb_clear_bindings(duckdb_prepared_statement prepared_statement); /*! Returns the statement type of the statement to be executed * @param statement The prepared statement. * @return duckdb_statement_type value or DUCKDB_STATEMENT_TYPE_INVALID */ DUCKDB_C_API duckdb_statement_type duckdb_prepared_statement_type(duckdb_prepared_statement statement); /*! Returns the number of columns present in a the result of the prepared statement. If any of the column types are invalid, the result will be 1. * @param prepared_statement The prepared statement. * @return The number of columns present in the result of the prepared statement. */ DUCKDB_C_API idx_t duckdb_prepared_statement_column_count(duckdb_prepared_statement prepared_statement); /*! Returns the name of the specified column of the result of the prepared_statement. The returned string should be freed using `duckdb_free`. Returns `nullptr` if the column is out of range. * @param prepared_statement The prepared statement. * @param col_idx The column index. * @return The column name of the specified column. */ DUCKDB_C_API const char *duckdb_prepared_statement_column_name(duckdb_prepared_statement prepared_statement, idx_t col_idx); /*! Returns the column type of the specified column of the result of the prepared_statement. Returns `DUCKDB_TYPE_INVALID` if the column is out of range. The return type of this call should be destroyed with `duckdb_destroy_logical_type`. * @param prepared_statement The prepared statement to fetch the column type from. * @param col_idx The column index. * @return The logical type of the specified column. */ DUCKDB_C_API duckdb_logical_type duckdb_prepared_statement_column_logical_type(duckdb_prepared_statement prepared_statement, idx_t col_idx); /*! Returns the column type of the specified column of the result of the prepared_statement. Returns `DUCKDB_TYPE_INVALID` if the column is out of range. * @param prepared_statement The prepared statement to fetch the column type from. * @param col_idx The column index. * @return The type of the specified column. */ DUCKDB_C_API duckdb_type duckdb_prepared_statement_column_type(duckdb_prepared_statement prepared_statement, idx_t col_idx); //===--------------------------------------------------------------------===// // Bind Values to Prepared Statements //===--------------------------------------------------------------------===// /*! Binds a value to the prepared statement at the specified index. */ DUCKDB_C_API duckdb_state duckdb_bind_value(duckdb_prepared_statement prepared_statement, idx_t param_idx, duckdb_value val); /*! Retrieve the index of the parameter for the prepared statement, identified by name */ DUCKDB_C_API duckdb_state duckdb_bind_parameter_index(duckdb_prepared_statement prepared_statement, idx_t *param_idx_out, const char *name); /*! Binds a bool value to the prepared statement at the specified index. */ DUCKDB_C_API duckdb_state duckdb_bind_boolean(duckdb_prepared_statement prepared_statement, idx_t param_idx, bool val); /*! Binds an int8_t value to the prepared statement at the specified index. */ DUCKDB_C_API duckdb_state duckdb_bind_int8(duckdb_prepared_statement prepared_statement, idx_t param_idx, int8_t val); /*! Binds an int16_t value to the prepared statement at the specified index. */ DUCKDB_C_API duckdb_state duckdb_bind_int16(duckdb_prepared_statement prepared_statement, idx_t param_idx, int16_t val); /*! Binds an int32_t value to the prepared statement at the specified index. */ DUCKDB_C_API duckdb_state duckdb_bind_int32(duckdb_prepared_statement prepared_statement, idx_t param_idx, int32_t val); /*! Binds an int64_t value to the prepared statement at the specified index. */ DUCKDB_C_API duckdb_state duckdb_bind_int64(duckdb_prepared_statement prepared_statement, idx_t param_idx, int64_t val); /*! Binds a duckdb_hugeint value to the prepared statement at the specified index. */ DUCKDB_C_API duckdb_state duckdb_bind_hugeint(duckdb_prepared_statement prepared_statement, idx_t param_idx, duckdb_hugeint val); /*! Binds a duckdb_uhugeint value to the prepared statement at the specified index. */ DUCKDB_C_API duckdb_state duckdb_bind_uhugeint(duckdb_prepared_statement prepared_statement, idx_t param_idx, duckdb_uhugeint val); /*! Binds a duckdb_decimal value to the prepared statement at the specified index. */ DUCKDB_C_API duckdb_state duckdb_bind_decimal(duckdb_prepared_statement prepared_statement, idx_t param_idx, duckdb_decimal val); /*! Binds a uint8_t value to the prepared statement at the specified index. */ DUCKDB_C_API duckdb_state duckdb_bind_uint8(duckdb_prepared_statement prepared_statement, idx_t param_idx, uint8_t val); /*! Binds a uint16_t value to the prepared statement at the specified index. */ DUCKDB_C_API duckdb_state duckdb_bind_uint16(duckdb_prepared_statement prepared_statement, idx_t param_idx, uint16_t val); /*! Binds a uint32_t value to the prepared statement at the specified index. */ DUCKDB_C_API duckdb_state duckdb_bind_uint32(duckdb_prepared_statement prepared_statement, idx_t param_idx, uint32_t val); /*! Binds a uint64_t value to the prepared statement at the specified index. */ DUCKDB_C_API duckdb_state duckdb_bind_uint64(duckdb_prepared_statement prepared_statement, idx_t param_idx, uint64_t val); /*! Binds a float value to the prepared statement at the specified index. */ DUCKDB_C_API duckdb_state duckdb_bind_float(duckdb_prepared_statement prepared_statement, idx_t param_idx, float val); /*! Binds a double value to the prepared statement at the specified index. */ DUCKDB_C_API duckdb_state duckdb_bind_double(duckdb_prepared_statement prepared_statement, idx_t param_idx, double val); /*! Binds a duckdb_date value to the prepared statement at the specified index. */ DUCKDB_C_API duckdb_state duckdb_bind_date(duckdb_prepared_statement prepared_statement, idx_t param_idx, duckdb_date val); /*! Binds a duckdb_time value to the prepared statement at the specified index. */ DUCKDB_C_API duckdb_state duckdb_bind_time(duckdb_prepared_statement prepared_statement, idx_t param_idx, duckdb_time val); /*! Binds a duckdb_timestamp value to the prepared statement at the specified index. */ DUCKDB_C_API duckdb_state duckdb_bind_timestamp(duckdb_prepared_statement prepared_statement, idx_t param_idx, duckdb_timestamp val); /*! Binds a duckdb_timestamp value to the prepared statement at the specified index. */ DUCKDB_C_API duckdb_state duckdb_bind_timestamp_tz(duckdb_prepared_statement prepared_statement, idx_t param_idx, duckdb_timestamp val); /*! Binds a duckdb_interval value to the prepared statement at the specified index. */ DUCKDB_C_API duckdb_state duckdb_bind_interval(duckdb_prepared_statement prepared_statement, idx_t param_idx, duckdb_interval val); /*! Binds a null-terminated varchar value to the prepared statement at the specified index. */ DUCKDB_C_API duckdb_state duckdb_bind_varchar(duckdb_prepared_statement prepared_statement, idx_t param_idx, const char *val); /*! Binds a varchar value to the prepared statement at the specified index. */ DUCKDB_C_API duckdb_state duckdb_bind_varchar_length(duckdb_prepared_statement prepared_statement, idx_t param_idx, const char *val, idx_t length); /*! Binds a blob value to the prepared statement at the specified index. */ DUCKDB_C_API duckdb_state duckdb_bind_blob(duckdb_prepared_statement prepared_statement, idx_t param_idx, const void *data, idx_t length); /*! Binds a NULL value to the prepared statement at the specified index. */ DUCKDB_C_API duckdb_state duckdb_bind_null(duckdb_prepared_statement prepared_statement, idx_t param_idx); //===--------------------------------------------------------------------===// // Execute Prepared Statements //===--------------------------------------------------------------------===// /*! Executes the prepared statement with the given bound parameters, and returns a materialized query result. This method can be called multiple times for each prepared statement, and the parameters can be modified between calls to this function. Note that the result must be freed with `duckdb_destroy_result`. * @param prepared_statement The prepared statement to execute. * @param out_result The query result. * @return `DuckDBSuccess` on success or `DuckDBError` on failure. */ DUCKDB_C_API duckdb_state duckdb_execute_prepared(duckdb_prepared_statement prepared_statement, duckdb_result *out_result); #ifndef DUCKDB_API_NO_DEPRECATED /*! **DEPRECATION NOTICE**: This method is scheduled for removal in a future release. Executes the prepared statement with the given bound parameters, and returns an optionally-streaming query result. To determine if the resulting query was in fact streamed, use `duckdb_result_is_streaming` This method can be called multiple times for each prepared statement, and the parameters can be modified between calls to this function. Note that the result must be freed with `duckdb_destroy_result`. * @param prepared_statement The prepared statement to execute. * @param out_result The query result. * @return `DuckDBSuccess` on success or `DuckDBError` on failure. */ DUCKDB_C_API duckdb_state duckdb_execute_prepared_streaming(duckdb_prepared_statement prepared_statement, duckdb_result *out_result); #endif //===--------------------------------------------------------------------===// // Extract Statements //===--------------------------------------------------------------------===// // A query string can be extracted into multiple SQL statements. Each statement can be prepared and executed separately. /*! Extract all statements from a query. Note that after calling `duckdb_extract_statements`, the extracted statements should always be destroyed using `duckdb_destroy_extracted`, even if no statements were extracted. If the extract fails, `duckdb_extract_statements_error` can be called to obtain the reason why the extract failed. * @param connection The connection object * @param query The SQL query to extract * @param out_extracted_statements The resulting extracted statements object * @return The number of extracted statements or 0 on failure. */ DUCKDB_C_API idx_t duckdb_extract_statements(duckdb_connection connection, const char *query, duckdb_extracted_statements *out_extracted_statements); /*! Prepare an extracted statement. Note that after calling `duckdb_prepare_extracted_statement`, the prepared statement should always be destroyed using `duckdb_destroy_prepare`, even if the prepare fails. If the prepare fails, `duckdb_prepare_error` can be called to obtain the reason why the prepare failed. * @param connection The connection object * @param extracted_statements The extracted statements object * @param index The index of the extracted statement to prepare * @param out_prepared_statement The resulting prepared statement object * @return `DuckDBSuccess` on success or `DuckDBError` on failure. */ DUCKDB_C_API duckdb_state duckdb_prepare_extracted_statement(duckdb_connection connection, duckdb_extracted_statements extracted_statements, idx_t index, duckdb_prepared_statement *out_prepared_statement); /*! Returns the error message contained within the extracted statements. The result of this function must not be freed. It will be cleaned up when `duckdb_destroy_extracted` is called. * @param extracted_statements The extracted statements to fetch the error from. * @return The error of the extracted statements. */ DUCKDB_C_API const char *duckdb_extract_statements_error(duckdb_extracted_statements extracted_statements); /*! De-allocates all memory allocated for the extracted statements. * @param extracted_statements The extracted statements to destroy. */ DUCKDB_C_API void duckdb_destroy_extracted(duckdb_extracted_statements *extracted_statements); //===--------------------------------------------------------------------===// // Pending Result Interface //===--------------------------------------------------------------------===// /*! Executes the prepared statement with the given bound parameters, and returns a pending result. The pending result represents an intermediate structure for a query that is not yet fully executed. The pending result can be used to incrementally execute a query, returning control to the client between tasks. Note that after calling `duckdb_pending_prepared`, the pending result should always be destroyed using `duckdb_destroy_pending`, even if this function returns DuckDBError. * @param prepared_statement The prepared statement to execute. * @param out_result The pending query result. * @return `DuckDBSuccess` on success or `DuckDBError` on failure. */ DUCKDB_C_API duckdb_state duckdb_pending_prepared(duckdb_prepared_statement prepared_statement, duckdb_pending_result *out_result); #ifndef DUCKDB_API_NO_DEPRECATED /*! **DEPRECATION NOTICE**: This method is scheduled for removal in a future release. Executes the prepared statement with the given bound parameters, and returns a pending result. This pending result will create a streaming duckdb_result when executed. The pending result represents an intermediate structure for a query that is not yet fully executed. Note that after calling `duckdb_pending_prepared_streaming`, the pending result should always be destroyed using `duckdb_destroy_pending`, even if this function returns DuckDBError. * @param prepared_statement The prepared statement to execute. * @param out_result The pending query result. * @return `DuckDBSuccess` on success or `DuckDBError` on failure. */ DUCKDB_C_API duckdb_state duckdb_pending_prepared_streaming(duckdb_prepared_statement prepared_statement, duckdb_pending_result *out_result); #endif /*! Closes the pending result and de-allocates all memory allocated for the result. * @param pending_result The pending result to destroy. */ DUCKDB_C_API void duckdb_destroy_pending(duckdb_pending_result *pending_result); /*! Returns the error message contained within the pending result. The result of this function must not be freed. It will be cleaned up when `duckdb_destroy_pending` is called. * @param pending_result The pending result to fetch the error from. * @return The error of the pending result. */ DUCKDB_C_API const char *duckdb_pending_error(duckdb_pending_result pending_result); /*! Executes a single task within the query, returning whether or not the query is ready. If this returns DUCKDB_PENDING_RESULT_READY, the duckdb_execute_pending function can be called to obtain the result. If this returns DUCKDB_PENDING_RESULT_NOT_READY, the duckdb_pending_execute_task function should be called again. If this returns DUCKDB_PENDING_ERROR, an error occurred during execution. The error message can be obtained by calling duckdb_pending_error on the pending_result. * @param pending_result The pending result to execute a task within. * @return The state of the pending result after the execution. */ DUCKDB_C_API duckdb_pending_state duckdb_pending_execute_task(duckdb_pending_result pending_result); /*! If this returns DUCKDB_PENDING_RESULT_READY, the duckdb_execute_pending function can be called to obtain the result. If this returns DUCKDB_PENDING_RESULT_NOT_READY, the duckdb_pending_execute_check_state function should be called again. If this returns DUCKDB_PENDING_ERROR, an error occurred during execution. The error message can be obtained by calling duckdb_pending_error on the pending_result. * @param pending_result The pending result. * @return The state of the pending result. */ DUCKDB_C_API duckdb_pending_state duckdb_pending_execute_check_state(duckdb_pending_result pending_result); /*! Fully execute a pending query result, returning the final query result. If duckdb_pending_execute_task has been called until DUCKDB_PENDING_RESULT_READY was returned, this will return fast. Otherwise, all remaining tasks must be executed first. Note that the result must be freed with `duckdb_destroy_result`. * @param pending_result The pending result to execute. * @param out_result The result object. * @return `DuckDBSuccess` on success or `DuckDBError` on failure. */ DUCKDB_C_API duckdb_state duckdb_execute_pending(duckdb_pending_result pending_result, duckdb_result *out_result); /*! Returns whether a duckdb_pending_state is finished executing. For example if `pending_state` is DUCKDB_PENDING_RESULT_READY, this function will return true. * @param pending_state The pending state on which to decide whether to finish execution. * @return Boolean indicating pending execution should be considered finished. */ DUCKDB_C_API bool duckdb_pending_execution_is_finished(duckdb_pending_state pending_state); //===--------------------------------------------------------------------===// // Value Interface //===--------------------------------------------------------------------===// /*! Destroys the value and de-allocates all memory allocated for that type. * @param value The value to destroy. */ DUCKDB_C_API void duckdb_destroy_value(duckdb_value *value); /*! Creates a value from a null-terminated string * @param text The null-terminated string * @return The value. This must be destroyed with `duckdb_destroy_value`. */ DUCKDB_C_API duckdb_value duckdb_create_varchar(const char *text); /*! Creates a value from a string * @param text The text * @param length The length of the text * @return The value. This must be destroyed with `duckdb_destroy_value`. */ DUCKDB_C_API duckdb_value duckdb_create_varchar_length(const char *text, idx_t length); /*! Creates a value from a boolean * @param input The boolean value * @return The value. This must be destroyed with `duckdb_destroy_value`. */ DUCKDB_C_API duckdb_value duckdb_create_bool(bool input); /*! Creates a value from an int8_t (a tinyint) * @param input The tinyint value * @return The value. This must be destroyed with `duckdb_destroy_value`. */ DUCKDB_C_API duckdb_value duckdb_create_int8(int8_t input); /*! Creates a value from a uint8_t (a utinyint) * @param input The utinyint value * @return The value. This must be destroyed with `duckdb_destroy_value`. */ DUCKDB_C_API duckdb_value duckdb_create_uint8(uint8_t input); /*! Creates a value from an int16_t (a smallint) * @param input The smallint value * @return The value. This must be destroyed with `duckdb_destroy_value`. */ DUCKDB_C_API duckdb_value duckdb_create_int16(int16_t input); /*! Creates a value from a uint16_t (a usmallint) * @param input The usmallint value * @return The value. This must be destroyed with `duckdb_destroy_value`. */ DUCKDB_C_API duckdb_value duckdb_create_uint16(uint16_t input); /*! Creates a value from an int32_t (an integer) * @param input The integer value * @return The value. This must be destroyed with `duckdb_destroy_value`. */ DUCKDB_C_API duckdb_value duckdb_create_int32(int32_t input); /*! Creates a value from a uint32_t (a uinteger) * @param input The uinteger value * @return The value. This must be destroyed with `duckdb_destroy_value`. */ DUCKDB_C_API duckdb_value duckdb_create_uint32(uint32_t input); /*! Creates a value from a uint64_t (a ubigint) * @param input The ubigint value * @return The value. This must be destroyed with `duckdb_destroy_value`. */ DUCKDB_C_API duckdb_value duckdb_create_uint64(uint64_t input); /*! Creates a value from an int64 * @return The value. This must be destroyed with `duckdb_destroy_value`. */ DUCKDB_C_API duckdb_value duckdb_create_int64(int64_t val); /*! Creates a value from a hugeint * @param input The hugeint value * @return The value. This must be destroyed with `duckdb_destroy_value`. */ DUCKDB_C_API duckdb_value duckdb_create_hugeint(duckdb_hugeint input); /*! Creates a value from a uhugeint * @param input The uhugeint value * @return The value. This must be destroyed with `duckdb_destroy_value`. */ DUCKDB_C_API duckdb_value duckdb_create_uhugeint(duckdb_uhugeint input); /*! Creates a BIGNUM value from a duckdb_bignum * @param input The duckdb_bignum value * @return The value. This must be destroyed with `duckdb_destroy_value`. */ DUCKDB_C_API duckdb_value duckdb_create_bignum(duckdb_bignum input); /*! Creates a DECIMAL value from a duckdb_decimal * @param input The duckdb_decimal value * @return The value. This must be destroyed with `duckdb_destroy_value`. */ DUCKDB_C_API duckdb_value duckdb_create_decimal(duckdb_decimal input); /*! Creates a value from a float * @param input The float value * @return The value. This must be destroyed with `duckdb_destroy_value`. */ DUCKDB_C_API duckdb_value duckdb_create_float(float input); /*! Creates a value from a double * @param input The double value * @return The value. This must be destroyed with `duckdb_destroy_value`. */ DUCKDB_C_API duckdb_value duckdb_create_double(double input); /*! Creates a value from a date * @param input The date value * @return The value. This must be destroyed with `duckdb_destroy_value`. */ DUCKDB_C_API duckdb_value duckdb_create_date(duckdb_date input); /*! Creates a value from a time * @param input The time value * @return The value. This must be destroyed with `duckdb_destroy_value`. */ DUCKDB_C_API duckdb_value duckdb_create_time(duckdb_time input); /*! Creates a value from a time_ns * @param input The time value * @return The value. This must be destroyed with `duckdb_destroy_value`. */ DUCKDB_C_API duckdb_value duckdb_create_time_ns(duckdb_time_ns input); /*! Creates a value from a time_tz. Not to be confused with `duckdb_create_time_tz`, which creates a duckdb_time_tz_t. * @param value The time_tz value * @return The value. This must be destroyed with `duckdb_destroy_value`. */ DUCKDB_C_API duckdb_value duckdb_create_time_tz_value(duckdb_time_tz value); /*! Creates a TIMESTAMP value from a duckdb_timestamp * @param input The duckdb_timestamp value * @return The value. This must be destroyed with `duckdb_destroy_value`. */ DUCKDB_C_API duckdb_value duckdb_create_timestamp(duckdb_timestamp input); /*! Creates a TIMESTAMP_TZ value from a duckdb_timestamp * @param input The duckdb_timestamp value * @return The value. This must be destroyed with `duckdb_destroy_value`. */ DUCKDB_C_API duckdb_value duckdb_create_timestamp_tz(duckdb_timestamp input); /*! Creates a TIMESTAMP_S value from a duckdb_timestamp_s * @param input The duckdb_timestamp_s value * @return The value. This must be destroyed with `duckdb_destroy_value`. */ DUCKDB_C_API duckdb_value duckdb_create_timestamp_s(duckdb_timestamp_s input); /*! Creates a TIMESTAMP_MS value from a duckdb_timestamp_ms * @param input The duckdb_timestamp_ms value * @return The value. This must be destroyed with `duckdb_destroy_value`. */ DUCKDB_C_API duckdb_value duckdb_create_timestamp_ms(duckdb_timestamp_ms input); /*! Creates a TIMESTAMP_NS value from a duckdb_timestamp_ns * @param input The duckdb_timestamp_ns value * @return The value. This must be destroyed with `duckdb_destroy_value`. */ DUCKDB_C_API duckdb_value duckdb_create_timestamp_ns(duckdb_timestamp_ns input); /*! Creates a value from an interval * @param input The interval value * @return The value. This must be destroyed with `duckdb_destroy_value`. */ DUCKDB_C_API duckdb_value duckdb_create_interval(duckdb_interval input); /*! Creates a value from a blob * @param data The blob data * @param length The length of the blob data * @return The value. This must be destroyed with `duckdb_destroy_value`. */ DUCKDB_C_API duckdb_value duckdb_create_blob(const uint8_t *data, idx_t length); /*! Creates a BIT value from a duckdb_bit * @param input The duckdb_bit value * @return The value. This must be destroyed with `duckdb_destroy_value`. */ DUCKDB_C_API duckdb_value duckdb_create_bit(duckdb_bit input); /*! Creates a UUID value from a uhugeint * @param input The duckdb_uhugeint containing the UUID * @return The value. This must be destroyed with `duckdb_destroy_value`. */ DUCKDB_C_API duckdb_value duckdb_create_uuid(duckdb_uhugeint input); /*! Returns the boolean value of the given value. * @param val A duckdb_value containing a boolean * @return A boolean, or false if the value cannot be converted */ DUCKDB_C_API bool duckdb_get_bool(duckdb_value val); /*! Returns the int8_t value of the given value. * @param val A duckdb_value containing a tinyint * @return A int8_t, or MinValue if the value cannot be converted */ DUCKDB_C_API int8_t duckdb_get_int8(duckdb_value val); /*! Returns the uint8_t value of the given value. * @param val A duckdb_value containing a utinyint * @return A uint8_t, or MinValue if the value cannot be converted */ DUCKDB_C_API uint8_t duckdb_get_uint8(duckdb_value val); /*! Returns the int16_t value of the given value. * @param val A duckdb_value containing a smallint * @return A int16_t, or MinValue if the value cannot be converted */ DUCKDB_C_API int16_t duckdb_get_int16(duckdb_value val); /*! Returns the uint16_t value of the given value. * @param val A duckdb_value containing a usmallint * @return A uint16_t, or MinValue if the value cannot be converted */ DUCKDB_C_API uint16_t duckdb_get_uint16(duckdb_value val); /*! Returns the int32_t value of the given value. * @param val A duckdb_value containing an integer * @return A int32_t, or MinValue if the value cannot be converted */ DUCKDB_C_API int32_t duckdb_get_int32(duckdb_value val); /*! Returns the uint32_t value of the given value. * @param val A duckdb_value containing a uinteger * @return A uint32_t, or MinValue if the value cannot be converted */ DUCKDB_C_API uint32_t duckdb_get_uint32(duckdb_value val); /*! Returns the int64_t value of the given value. * @param val A duckdb_value containing a bigint * @return A int64_t, or MinValue if the value cannot be converted */ DUCKDB_C_API int64_t duckdb_get_int64(duckdb_value val); /*! Returns the uint64_t value of the given value. * @param val A duckdb_value containing a ubigint * @return A uint64_t, or MinValue if the value cannot be converted */ DUCKDB_C_API uint64_t duckdb_get_uint64(duckdb_value val); /*! Returns the hugeint value of the given value. * @param val A duckdb_value containing a hugeint * @return A duckdb_hugeint, or MinValue if the value cannot be converted */ DUCKDB_C_API duckdb_hugeint duckdb_get_hugeint(duckdb_value val); /*! Returns the uhugeint value of the given value. * @param val A duckdb_value containing a uhugeint * @return A duckdb_uhugeint, or MinValue if the value cannot be converted */ DUCKDB_C_API duckdb_uhugeint duckdb_get_uhugeint(duckdb_value val); /*! Returns the duckdb_bignum value of the given value. The `data` field must be destroyed with `duckdb_free`. * @param val A duckdb_value containing a BIGNUM * @return A duckdb_bignum. The `data` field must be destroyed with `duckdb_free`. */ DUCKDB_C_API duckdb_bignum duckdb_get_bignum(duckdb_value val); /*! Returns the duckdb_decimal value of the given value. * @param val A duckdb_value containing a DECIMAL * @return A duckdb_decimal, or MinValue if the value cannot be converted */ DUCKDB_C_API duckdb_decimal duckdb_get_decimal(duckdb_value val); /*! Returns the float value of the given value. * @param val A duckdb_value containing a float * @return A float, or NAN if the value cannot be converted */ DUCKDB_C_API float duckdb_get_float(duckdb_value val); /*! Returns the double value of the given value. * @param val A duckdb_value containing a double * @return A double, or NAN if the value cannot be converted */ DUCKDB_C_API double duckdb_get_double(duckdb_value val); /*! Returns the date value of the given value. * @param val A duckdb_value containing a date * @return A duckdb_date, or MinValue if the value cannot be converted */ DUCKDB_C_API duckdb_date duckdb_get_date(duckdb_value val); /*! Returns the time value of the given value. * @param val A duckdb_value containing a time * @return A duckdb_time, or MinValue