From 9572160dbb8372ed42e0f90ddaef5480387a7b21 Mon Sep 17 00:00:00 2001 From: Ngo Quoc Dat Date: Wed, 11 Mar 2026 09:39:26 +0700 Subject: [PATCH 1/7] feat: add DuckDB database support Add DuckDB as a separately distributed plugin following the Oracle pattern. Includes driver implementation with schema support, information_schema introspection, file queries (CSV/Parquet/JSON), Finder file opening, DuckDB SQL dialect, and documentation. --- CHANGELOG.md | 4 + Libs/libduckdb.a | 3 + Libs/libduckdb_arm64.a | 3 + Libs/libduckdb_universal.a | 3 + Libs/libduckdb_x86_64.a | 3 + Plugins/DuckDBDriverPlugin/CDuckDB/CDuckDB.h | 11 + .../CDuckDB/include/duckdb.h | 6261 +++++++++++++++++ .../CDuckDB/module.modulemap | 4 + Plugins/DuckDBDriverPlugin/DuckDBPlugin.swift | 712 ++ Plugins/DuckDBDriverPlugin/Info.plist | 8 + TablePro/AppDelegate+ConnectionHandler.swift | 47 + TablePro/AppDelegate+FileOpen.swift | 17 +- .../Autocomplete/SQLCompletionProvider.swift | 5 + TablePro/Core/Database/DatabaseDriver.swift | 4 +- TablePro/Core/Database/DatabaseManager.swift | 8 +- .../Core/Database/FilterSQLGenerator.swift | 8 +- .../Core/Plugins/ImportDataSinkAdapter.swift | 4 +- .../SchemaStatementGenerator.swift | 48 +- .../Services/Query/SQLDialectProvider.swift | 75 + .../Services/Query/TableQueryBuilder.swift | 2 +- .../Connection/ConnectionURLFormatter.swift | 12 + TablePro/Info.plist | 36 + .../Connection/DatabaseConnection.swift | 15 +- TablePro/Theme/Theme.swift | 3 + .../DatabaseSwitcherViewModel.swift | 2 + .../Views/Connection/ConnectionFormView.swift | 12 +- TablePro/Views/Export/ExportDialog.swift | 2 +- ...inContentCoordinator+TableOperations.swift | 10 +- .../Main/MainContentCommandActions.swift | 4 +- .../Views/Main/MainContentCoordinator.swift | 2 +- .../Structure/TypePickerContentView.swift | 10 + .../Views/Toolbar/ConnectionStatusView.swift | 2 +- .../Toolbar/ConnectionSwitcherPopover.swift | 2 +- .../Views/Toolbar/TableProToolbarView.swift | 2 +- docs/databases/duckdb.mdx | 101 + docs/vi/databases/duckdb.mdx | 101 + scripts/build-duckdb.sh | 58 + 37 files changed, 7562 insertions(+), 42 deletions(-) create mode 100644 Libs/libduckdb.a create mode 100644 Libs/libduckdb_arm64.a create mode 100644 Libs/libduckdb_universal.a create mode 100644 Libs/libduckdb_x86_64.a create mode 100644 Plugins/DuckDBDriverPlugin/CDuckDB/CDuckDB.h create mode 100644 Plugins/DuckDBDriverPlugin/CDuckDB/include/duckdb.h create mode 100644 Plugins/DuckDBDriverPlugin/CDuckDB/module.modulemap create mode 100644 Plugins/DuckDBDriverPlugin/DuckDBPlugin.swift create mode 100644 Plugins/DuckDBDriverPlugin/Info.plist create mode 100644 docs/databases/duckdb.mdx create mode 100644 docs/vi/databases/duckdb.mdx create mode 100755 scripts/build-duckdb.sh diff --git a/CHANGELOG.md b/CHANGELOG.md index 45249277..41c1cc4d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Added + +- DuckDB database support — connect to `.duckdb` files, query CSV/Parquet/JSON files via SQL, schema navigation, and DuckDB extension management + ### Fixed - Result truncation at 100K rows now reported to UI via `PluginQueryResult.isTruncated` instead of being silently discarded diff --git a/Libs/libduckdb.a b/Libs/libduckdb.a new file mode 100644 index 00000000..f00dd352 --- /dev/null +++ b/Libs/libduckdb.a @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d95520ba0e250f7c5847cc9dab4bf8a2656fcefd64b35c859f8fae0d37f2f69f +size 102852216 diff --git a/Libs/libduckdb_arm64.a b/Libs/libduckdb_arm64.a new file mode 100644 index 00000000..459dae0f --- /dev/null +++ b/Libs/libduckdb_arm64.a @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1756e47a21076dbfd3bcfb937964dd0af231017f3adc549fdbc114464b304179 +size 49988848 diff --git a/Libs/libduckdb_universal.a b/Libs/libduckdb_universal.a new file mode 100644 index 00000000..f00dd352 --- /dev/null +++ b/Libs/libduckdb_universal.a @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d95520ba0e250f7c5847cc9dab4bf8a2656fcefd64b35c859f8fae0d37f2f69f +size 102852216 diff --git a/Libs/libduckdb_x86_64.a b/Libs/libduckdb_x86_64.a new file mode 100644 index 00000000..3757cd48 --- /dev/null +++ b/Libs/libduckdb_x86_64.a @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:aa5dfb4014c4b227d842ca20c2572434784cdad2de324afdc28fa8af83965ecd +size 52863320 diff --git a/Plugins/DuckDBDriverPlugin/CDuckDB/CDuckDB.h b/Plugins/DuckDBDriverPlugin/CDuckDB/CDuckDB.h new file mode 100644 index 00000000..aa7f613b --- /dev/null +++ b/Plugins/DuckDBDriverPlugin/CDuckDB/CDuckDB.h @@ -0,0 +1,11 @@ +// +// CDuckDB.h +// TablePro +// + +#ifndef CDuckDB_h +#define CDuckDB_h + +#include "include/duckdb.h" + +#endif /* CDuckDB_h */ diff --git a/Plugins/DuckDBDriverPlugin/CDuckDB/include/duckdb.h b/Plugins/DuckDBDriverPlugin/CDuckDB/include/duckdb.h new file mode 100644 index 00000000..a9f9e79c --- /dev/null +++ b/Plugins/DuckDBDriverPlugin/CDuckDB/include/duckdb.h @@ -0,0 +1,6261 @@ +//===----------------------------------------------------------------------===// +// +// 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; + +typedef enum duckdb_file_flag { + DUCKDB_FILE_FLAG_INVALID = 0, + // Open the file with "read" capabilities. + DUCKDB_FILE_FLAG_READ = 1, + // Open the file with "write" capabilities. + DUCKDB_FILE_FLAG_WRITE = 2, + // Create a new file, or open if it already exists. + DUCKDB_FILE_FLAG_CREATE = 3, + // Create a new file, or fail if it already exists. + DUCKDB_FILE_FLAG_CREATE_NEW = 4, + // Open the file in "append" mode. + DUCKDB_FILE_FLAG_APPEND = 5, +} duckdb_file_flag; + +//! An enum over DuckDB's configuration option scopes. +//! This enum can be used to specify the default scope when creating a custom configuration option, +//! but it is also be used to determine the scope in which a configuration option is set when it is +//! changed or retrieved. +typedef enum duckdb_config_option_scope { + DUCKDB_CONFIG_OPTION_SCOPE_INVALID = 0, + // The option is set for the duration of the current transaction only. + // !! CURRENTLY NOT IMPLEMENTED !! + DUCKDB_CONFIG_OPTION_SCOPE_LOCAL = 1, + // The option is set for the current session/connection only. + DUCKDB_CONFIG_OPTION_SCOPE_SESSION = 2, + // Set the option globally for all sessions/connections. + DUCKDB_CONFIG_OPTION_SCOPE_GLOBAL = 3, +} duckdb_config_option_scope; + +//! An enum over DuckDB's catalog entry types. +typedef enum duckdb_catalog_entry_type { + DUCKDB_CATALOG_ENTRY_TYPE_INVALID = 0, + DUCKDB_CATALOG_ENTRY_TYPE_TABLE = 1, + DUCKDB_CATALOG_ENTRY_TYPE_SCHEMA = 2, + DUCKDB_CATALOG_ENTRY_TYPE_VIEW = 3, + DUCKDB_CATALOG_ENTRY_TYPE_INDEX = 4, + DUCKDB_CATALOG_ENTRY_TYPE_PREPARED_STATEMENT = 5, + DUCKDB_CATALOG_ENTRY_TYPE_SEQUENCE = 6, + DUCKDB_CATALOG_ENTRY_TYPE_COLLATION = 7, + DUCKDB_CATALOG_ENTRY_TYPE_TYPE = 8, + DUCKDB_CATALOG_ENTRY_TYPE_DATABASE = 9, +} duckdb_catalog_entry_type; + +//===--------------------------------------------------------------------===// +// 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 custom configuration option instance. Used to register custom options that can be set on a duckdb_config. +//! or by the user in SQL using `SET = `. +typedef struct _duckdb_config_option { + void *internal_ptr; +} * duckdb_config_option; + +//! 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; + +//! 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; + +//===--------------------------------------------------------------------===// +// 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 thread-local initialization function of the scalar function. +typedef void (*duckdb_scalar_function_init_t)(duckdb_init_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; + +//! 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); + +//===--------------------------------------------------------------------===// +// Copy function types +//===--------------------------------------------------------------------===// + +//! A COPY function. Must be destroyed with `duckdb_destroy_copy_function`. +typedef struct _duckdb_copy_function { + void *internal_ptr; +} * duckdb_copy_function; + +//! Info for the bind function of a COPY function. +typedef struct _duckdb_copy_function_bind_info { + void *internal_ptr; +} * duckdb_copy_function_bind_info; + +//! Info for the global initialization function of a COPY function. +typedef struct _duckdb_copy_function_global_init_info { + void *internal_ptr; +} * duckdb_copy_function_global_init_info; + +//! Info for the sink function of a COPY function. +typedef struct _duckdb_copy_function_sink_info { + void *internal_ptr; +} * duckdb_copy_function_sink_info; + +//! Info for the finalize function of a COPY function. +typedef struct _duckdb_copy_function_finalize_info { + void *internal_ptr; +} * duckdb_copy_function_finalize_info; + +//! The bind function to use when binding a COPY ... TO function. +typedef void (*duckdb_copy_function_bind_t)(duckdb_copy_function_bind_info info); + +//! The initialization function to use when initializing a COPY ... TO function. +typedef void (*duckdb_copy_function_global_init_t)(duckdb_copy_function_global_init_info info); + +//! The function to sink an input chunk into during execution of a COPY ... TO function. +typedef void (*duckdb_copy_function_sink_t)(duckdb_copy_function_sink_info info, duckdb_data_chunk input); + +//! The function to finalize the COPY ... TO function execution. +typedef void (*duckdb_copy_function_finalize_t)(duckdb_copy_function_finalize_info info); + +//===--------------------------------------------------------------------===// +// 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; + +//===--------------------------------------------------------------------===// +// Virtual File System Access +//===--------------------------------------------------------------------===// + +typedef struct _duckdb_file_open_options { + void *internal_ptr; +} * duckdb_file_open_options; + +typedef struct _duckdb_file_system { + void *internal_ptr; +} * duckdb_file_system; + +typedef struct _duckdb_file_handle { + void *internal_ptr; +} * duckdb_file_handle; + +//===--------------------------------------------------------------------===// +// Catalog Interface +//===--------------------------------------------------------------------===// + +//! A handle to a database catalog. +//! Must be destroyed with `duckdb_destroy_catalog`. +typedef struct _duckdb_catalog { + void *internal_ptr; +} * duckdb_catalog; + +//! A handle to a catalog entry (e.g., table, view, index, etc.). +//! Must be destroyed with `duckdb_destroy_catalog_entry`. +typedef struct _duckdb_catalog_entry { + void *internal_ptr; +} * duckdb_catalog_entry; + +//===--------------------------------------------------------------------===// +// Logging Types +//===--------------------------------------------------------------------===// + +//! Holds a log storage object. +typedef struct _duckdb_log_storage { + void *internal_ptr; +} * duckdb_log_storage; + +//! This function is missing the logging context, which will be added later. +typedef void (*duckdb_logger_write_log_entry_t)(void *extra_data, duckdb_timestamp *timestamp, const char *level, + const char *log_type, const char *log_message); + +//===--------------------------------------------------------------------===// +// 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 +//---------------------------------------------------------------------------------------------------------------------- +// DESCRIPTION: +// Functions to operate on the instance cache, databases, connections, as well as some metadata functions. +//---------------------------------------------------------------------------------------------------------------------- + +/*! +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 the progress of the running query. + +* @param connection The connection running the query. +* @return The query progress type containing progress information. +*/ +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 +//---------------------------------------------------------------------------------------------------------------------- +// DESCRIPTION: +// Functions to interact with a `duckdb_config`, which is the configuration parameter for opening a database. +//---------------------------------------------------------------------------------------------------------------------- + +/*! +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 +//---------------------------------------------------------------------------------------------------------------------- +// DESCRIPTION: +// Functions to operate on `duckdb_error_data`, which contains, for example, the error type and message. Please use this +// interface for all new C API functions, as it supersedes 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 +//---------------------------------------------------------------------------------------------------------------------- +// DESCRIPTION: +// Functions to obtain a `duckdb_result` and to retrieve metadata from it. +//---------------------------------------------------------------------------------------------------------------------- + +/*! +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); + +#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 +//---------------------------------------------------------------------------------------------------------------------- +// DESCRIPTION: +// Deprecated functions to interact with a `duckdb_result`. +// +// DEPRECATION NOTICE: +// This function group is deprecated and scheduled for removal. +// +// USE INSTEAD: +// To access the values in a result, use `duckdb_fetch_chunk` repeatedly. For each chunk, use the `duckdb_data_chunk` +// interface to access any columns and their values. +//---------------------------------------------------------------------------------------------------------------------- + +#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); + +/*! +**DEPRECATION NOTICE**: This method is scheduled for removal in a future release. + +* @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. + +* @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); + +/*! +**DEPRECATION NOTICE**: This method is scheduled for removal in a future release. + +* @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); + +/*! +**DEPRECATION NOTICE**: This method is scheduled for removal in a future release. + +* @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 +//---------------------------------------------------------------------------------------------------------------------- +// DESCRIPTION: +// Generic and `duckdb_string_t` helper functions. +//---------------------------------------------------------------------------------------------------------------------- + +/*! +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); + +/*! +Checks if a string is valid UTF-8. + +* @param str The string to check +* @param len The length of the string (in bytes) +* @return nullptr if the string is valid UTF-8. Otherwise, a duckdb_error_data containing error information. Must be +destroyed with `duckdb_destroy_error_data`. +*/ +DUCKDB_C_API duckdb_error_data duckdb_valid_utf8_check(const char *str, idx_t len); + +//---------------------------------------------------------------------------------------------------------------------- +// Date Time Timestamp Helpers +//---------------------------------------------------------------------------------------------------------------------- +// DESCRIPTION: +// Functions to convert from and to `duckdb_[date, time, time_tz, timestamp]`. +// `duckdb_is_finite_timestamp[_s, _ms, _ns]` helper functions. +//---------------------------------------------------------------------------------------------------------------------- + +/*! +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 and Uhugeint Helpers +//---------------------------------------------------------------------------------------------------------------------- +// DESCRIPTION: +// Functions to convert from and to `duckdb_[hugeint, uhugeint]`. +//---------------------------------------------------------------------------------------------------------------------- + +/*! +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); + +/*! +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 +//---------------------------------------------------------------------------------------------------------------------- +// DESCRIPTION: +// Functions to convert from and to `duckdb_decimal`. +//---------------------------------------------------------------------------------------------------------------------- + +/*! +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 +//---------------------------------------------------------------------------------------------------------------------- +// DESCRIPTION: +// A prepared statement is a parameterized query, and you can bind parameters to it. Prepared statements are commonly +// used to easily supply parameters to functions and avoid SQL injection attacks. They also speed up queries that are +// executed repeatedly with different parameters. That is because the query is only parsed, bound, optimized and planned +// once during the prepare stage, rather than once per execution, if it is possible to resolve all parameter types. +// +// 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 +//---------------------------------------------------------------------------------------------------------------------- +// DESCRIPTION: +// Functions to bind values to prepared statements. Try to use `duckdb_bind_value` and the `duckdb_create_...` interface +// for all types. +//---------------------------------------------------------------------------------------------------------------------- + +/*! +Binds a value to the prepared statement at the specified index. + +Supersedes all type-specific bind functions (e.g., `duckdb_bind_varchar`, `duckdb_bind_int64`, etc.). +*/ +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. + +Superseded by `duckdb_bind_value`. +*/ +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. + +Superseded by `duckdb_bind_value`. +*/ +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 +//---------------------------------------------------------------------------------------------------------------------- +// DESCRIPTION: +// Functions to execute a prepared statement. +//---------------------------------------------------------------------------------------------------------------------- + +/*! +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 +//---------------------------------------------------------------------------------------------------------------------- +// DESCRIPTION: +// A query string can be extracted into multiple SQL statements. Each statement should 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 +//---------------------------------------------------------------------------------------------------------------------- +// DESCRIPTION: +// Functions to interact with a pending result. First, prepare a pending result, and then execute it. +//---------------------------------------------------------------------------------------------------------------------- + +/*! +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 +//---------------------------------------------------------------------------------------------------------------------- +// DESCRIPTION: +// Functions to create a `duckdb_value` for each of DuckDB's supported data types, and to access the contents of a +// `duckdb_value`. The `duckdb_value` wrapper allows handling of primitive and arbitrarily (nested) types through the +// same 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. Returns nullptr if the string is not valid UTF-8 or other invalid input. + +Superseded by `duckdb_create_varchar_length`. + +* @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. Returns nullptr if the string is not valid UTF-8 or other invalid input. + +* @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