| 1 | //===----------------------------------------------------------------------===// |
| 2 | // DuckDB |
| 3 | // |
| 4 | // duckdb/main/config.hpp |
| 5 | // |
| 6 | // |
| 7 | //===----------------------------------------------------------------------===// |
| 8 | |
| 9 | #pragma once |
| 10 | |
| 11 | #include "duckdb/common/enums/access_mode.hpp" |
| 12 | #include "duckdb/common/allocator.hpp" |
| 13 | #include "duckdb/common/case_insensitive_map.hpp" |
| 14 | #include "duckdb/common/common.hpp" |
| 15 | #include "duckdb/common/enums/compression_type.hpp" |
| 16 | #include "duckdb/common/enums/optimizer_type.hpp" |
| 17 | #include "duckdb/common/enums/order_type.hpp" |
| 18 | #include "duckdb/common/enums/set_scope.hpp" |
| 19 | #include "duckdb/common/enums/window_aggregation_mode.hpp" |
| 20 | #include "duckdb/common/file_system.hpp" |
| 21 | #include "duckdb/common/set.hpp" |
| 22 | #include "duckdb/common/types/value.hpp" |
| 23 | #include "duckdb/common/vector.hpp" |
| 24 | #include "duckdb/common/winapi.hpp" |
| 25 | #include "duckdb/storage/compression/bitpacking.hpp" |
| 26 | #include "duckdb/function/cast/default_casts.hpp" |
| 27 | #include "duckdb/function/replacement_scan.hpp" |
| 28 | #include "duckdb/optimizer/optimizer_extension.hpp" |
| 29 | #include "duckdb/parser/parser_extension.hpp" |
| 30 | #include "duckdb/planner/operator_extension.hpp" |
| 31 | #include "duckdb/common/arrow/arrow_options.hpp" |
| 32 | |
| 33 | namespace duckdb { |
| 34 | class BufferPool; |
| 35 | class CastFunctionSet; |
| 36 | class ClientContext; |
| 37 | class ErrorManager; |
| 38 | class CompressionFunction; |
| 39 | class TableFunctionRef; |
| 40 | class OperatorExtension; |
| 41 | class StorageExtension; |
| 42 | |
| 43 | struct CompressionFunctionSet; |
| 44 | struct DBConfig; |
| 45 | |
| 46 | enum class CheckpointAbort : uint8_t { |
| 47 | NO_ABORT = 0, |
| 48 | DEBUG_ABORT_BEFORE_TRUNCATE = 1, |
| 49 | = 2, |
| 50 | DEBUG_ABORT_AFTER_FREE_LIST_WRITE = 3 |
| 51 | }; |
| 52 | |
| 53 | typedef void (*set_global_function_t)(DatabaseInstance *db, DBConfig &config, const Value ¶meter); |
| 54 | typedef void (*set_local_function_t)(ClientContext &context, const Value ¶meter); |
| 55 | typedef void (*reset_global_function_t)(DatabaseInstance *db, DBConfig &config); |
| 56 | typedef void (*reset_local_function_t)(ClientContext &context); |
| 57 | typedef Value (*get_setting_function_t)(ClientContext &context); |
| 58 | |
| 59 | struct ConfigurationOption { |
| 60 | const char *name; |
| 61 | const char *description; |
| 62 | LogicalTypeId parameter_type; |
| 63 | set_global_function_t set_global; |
| 64 | set_local_function_t set_local; |
| 65 | reset_global_function_t reset_global; |
| 66 | reset_local_function_t reset_local; |
| 67 | get_setting_function_t get_setting; |
| 68 | }; |
| 69 | |
| 70 | typedef void (*set_option_callback_t)(ClientContext &context, SetScope scope, Value ¶meter); |
| 71 | |
| 72 | struct ExtensionOption { |
| 73 | ExtensionOption(string description_p, LogicalType type_p, set_option_callback_t set_function_p, |
| 74 | Value default_value_p) |
| 75 | : description(std::move(description_p)), type(std::move(type_p)), set_function(set_function_p), |
| 76 | default_value(std::move(default_value_p)) { |
| 77 | } |
| 78 | |
| 79 | string description; |
| 80 | LogicalType type; |
| 81 | set_option_callback_t set_function; |
| 82 | Value default_value; |
| 83 | }; |
| 84 | |
| 85 | struct DBConfigOptions { |
| 86 | //! Database file path. May be empty for in-memory mode |
| 87 | string database_path; |
| 88 | //! Database type. If empty, automatically extracted from `database_path`, where a `type:path` syntax is expected |
| 89 | string database_type; |
| 90 | //! Access mode of the database (AUTOMATIC, READ_ONLY or READ_WRITE) |
| 91 | AccessMode access_mode = AccessMode::AUTOMATIC; |
| 92 | //! Checkpoint when WAL reaches this size (default: 16MB) |
| 93 | idx_t checkpoint_wal_size = 1 << 24; |
| 94 | //! Whether or not to use Direct IO, bypassing operating system buffers |
| 95 | bool use_direct_io = false; |
| 96 | //! Whether extensions should be loaded on start-up |
| 97 | bool load_extensions = true; |
| 98 | //! The maximum memory used by the database system (in bytes). Default: 80% of System available memory |
| 99 | idx_t maximum_memory = (idx_t)-1; |
| 100 | //! The maximum amount of CPU threads used by the database system. Default: all available. |
| 101 | idx_t maximum_threads = (idx_t)-1; |
| 102 | //! The number of external threads that work on DuckDB tasks. Default: none. |
| 103 | idx_t external_threads = 0; |
| 104 | //! Whether or not to create and use a temporary directory to store intermediates that do not fit in memory |
| 105 | bool use_temporary_directory = true; |
| 106 | //! Directory to store temporary structures that do not fit in memory |
| 107 | string temporary_directory; |
| 108 | //! The collation type of the database |
| 109 | string collation = string(); |
| 110 | //! The order type used when none is specified (default: ASC) |
| 111 | OrderType default_order_type = OrderType::ASCENDING; |
| 112 | //! Null ordering used when none is specified (default: NULLS LAST) |
| 113 | DefaultOrderByNullType default_null_order = DefaultOrderByNullType::NULLS_LAST; |
| 114 | //! enable COPY and related commands |
| 115 | bool enable_external_access = true; |
| 116 | //! Whether or not object cache is used |
| 117 | bool object_cache_enable = false; |
| 118 | //! Whether or not the global http metadata cache is used |
| 119 | bool http_metadata_cache_enable = false; |
| 120 | //! Force checkpoint when CHECKPOINT is called or on shutdown, even if no changes have been made |
| 121 | bool force_checkpoint = false; |
| 122 | //! Run a checkpoint on successful shutdown and delete the WAL, to leave only a single database file behind |
| 123 | bool checkpoint_on_shutdown = true; |
| 124 | //! Debug flag that decides when a checkpoing should be aborted. Only used for testing purposes. |
| 125 | CheckpointAbort checkpoint_abort = CheckpointAbort::NO_ABORT; |
| 126 | //! Initialize the database with the standard set of DuckDB functions |
| 127 | //! You should probably not touch this unless you know what you are doing |
| 128 | bool initialize_default_database = true; |
| 129 | //! The set of disabled optimizers (default empty) |
| 130 | set<OptimizerType> disabled_optimizers; |
| 131 | //! Force a specific compression method to be used when checkpointing (if available) |
| 132 | CompressionType force_compression = CompressionType::COMPRESSION_AUTO; |
| 133 | //! Force a specific bitpacking mode to be used when using the bitpacking compression method |
| 134 | BitpackingMode force_bitpacking_mode = BitpackingMode::AUTO; |
| 135 | //! Debug setting for window aggregation mode: (window, combine, separate) |
| 136 | WindowAggregationMode window_mode = WindowAggregationMode::WINDOW; |
| 137 | //! Whether or not preserving insertion order should be preserved |
| 138 | bool preserve_insertion_order = true; |
| 139 | //! Whether Arrow Arrays use Large or Regular buffers |
| 140 | ArrowOffsetSize arrow_offset_size = ArrowOffsetSize::REGULAR; |
| 141 | //! Database configuration variables as controlled by SET |
| 142 | case_insensitive_map_t<Value> set_variables; |
| 143 | //! Database configuration variable default values; |
| 144 | case_insensitive_map_t<Value> set_variable_defaults; |
| 145 | //! Directory to store extension binaries in |
| 146 | string extension_directory; |
| 147 | //! Whether unsigned extensions should be loaded |
| 148 | bool allow_unsigned_extensions = false; |
| 149 | //! Enable emitting FSST Vectors |
| 150 | bool enable_fsst_vectors = false; |
| 151 | //! Start transactions immediately in all attached databases - instead of lazily when a database is referenced |
| 152 | bool immediate_transaction_mode = false; |
| 153 | //! Debug setting - how to initialize blocks in the storage layer when allocating |
| 154 | DebugInitialize debug_initialize = DebugInitialize::NO_INITIALIZE; |
| 155 | //! The set of unrecognized (other) options |
| 156 | unordered_map<string, Value> unrecognized_options; |
| 157 | //! Whether or not the configuration settings can be altered |
| 158 | bool lock_configuration = false; |
| 159 | //! Whether to print bindings when printing the plan (debug mode only) |
| 160 | static bool debug_print_bindings; |
| 161 | |
| 162 | bool operator==(const DBConfigOptions &other) const; |
| 163 | }; |
| 164 | |
| 165 | struct DBConfig { |
| 166 | friend class DatabaseInstance; |
| 167 | friend class StorageManager; |
| 168 | |
| 169 | public: |
| 170 | DUCKDB_API DBConfig(); |
| 171 | DUCKDB_API DBConfig(std::unordered_map<string, string> &config_dict, bool read_only); |
| 172 | DUCKDB_API ~DBConfig(); |
| 173 | |
| 174 | mutex config_lock; |
| 175 | //! Replacement table scans are automatically attempted when a table name cannot be found in the schema |
| 176 | vector<ReplacementScan> replacement_scans; |
| 177 | |
| 178 | //! Extra parameters that can be SET for loaded extensions |
| 179 | case_insensitive_map_t<ExtensionOption> extension_parameters; |
| 180 | //! The FileSystem to use, can be overwritten to allow for injecting custom file systems for testing purposes (e.g. |
| 181 | //! RamFS or something similar) |
| 182 | unique_ptr<FileSystem> file_system; |
| 183 | //! The allocator used by the system |
| 184 | unique_ptr<Allocator> allocator; |
| 185 | //! Database configuration options |
| 186 | DBConfigOptions options; |
| 187 | //! Extensions made to the parser |
| 188 | vector<ParserExtension> parser_extensions; |
| 189 | //! Extensions made to the optimizer |
| 190 | vector<OptimizerExtension> optimizer_extensions; |
| 191 | //! Error manager |
| 192 | unique_ptr<ErrorManager> error_manager; |
| 193 | //! A reference to the (shared) default allocator (Allocator::DefaultAllocator) |
| 194 | shared_ptr<Allocator> default_allocator; |
| 195 | //! Extensions made to binder |
| 196 | vector<unique_ptr<OperatorExtension>> operator_extensions; |
| 197 | //! Extensions made to storage |
| 198 | case_insensitive_map_t<duckdb::unique_ptr<StorageExtension>> storage_extensions; |
| 199 | //! A buffer pool can be shared across multiple databases (if desired). |
| 200 | shared_ptr<BufferPool> buffer_pool; |
| 201 | |
| 202 | public: |
| 203 | DUCKDB_API static DBConfig &GetConfig(ClientContext &context); |
| 204 | DUCKDB_API static DBConfig &GetConfig(DatabaseInstance &db); |
| 205 | DUCKDB_API static DBConfig &Get(AttachedDatabase &db); |
| 206 | DUCKDB_API static const DBConfig &GetConfig(const ClientContext &context); |
| 207 | DUCKDB_API static const DBConfig &GetConfig(const DatabaseInstance &db); |
| 208 | DUCKDB_API static vector<ConfigurationOption> GetOptions(); |
| 209 | DUCKDB_API static idx_t GetOptionCount(); |
| 210 | DUCKDB_API static vector<string> GetOptionNames(); |
| 211 | |
| 212 | DUCKDB_API void AddExtensionOption(const string &name, string description, LogicalType parameter, |
| 213 | const Value &default_value = Value(), set_option_callback_t function = nullptr); |
| 214 | //! Fetch an option by index. Returns a pointer to the option, or nullptr if out of range |
| 215 | DUCKDB_API static ConfigurationOption *GetOptionByIndex(idx_t index); |
| 216 | //! Fetch an option by name. Returns a pointer to the option, or nullptr if none exists. |
| 217 | DUCKDB_API static ConfigurationOption *GetOptionByName(const string &name); |
| 218 | |
| 219 | DUCKDB_API void SetOption(const ConfigurationOption &option, const Value &value); |
| 220 | DUCKDB_API void SetOption(DatabaseInstance *db, const ConfigurationOption &option, const Value &value); |
| 221 | DUCKDB_API void SetOptionByName(const string &name, const Value &value); |
| 222 | DUCKDB_API void ResetOption(DatabaseInstance *db, const ConfigurationOption &option); |
| 223 | DUCKDB_API void SetOption(const string &name, Value value); |
| 224 | DUCKDB_API void ResetOption(const string &name); |
| 225 | |
| 226 | DUCKDB_API static idx_t ParseMemoryLimit(const string &arg); |
| 227 | |
| 228 | //! Return the list of possible compression functions for the specific physical type |
| 229 | DUCKDB_API vector<reference<CompressionFunction>> GetCompressionFunctions(PhysicalType data_type); |
| 230 | //! Return the compression function for the specified compression type/physical type combo |
| 231 | DUCKDB_API optional_ptr<CompressionFunction> GetCompressionFunction(CompressionType type, PhysicalType data_type); |
| 232 | |
| 233 | bool operator==(const DBConfig &other); |
| 234 | bool operator!=(const DBConfig &other); |
| 235 | |
| 236 | DUCKDB_API CastFunctionSet &GetCastFunctions(); |
| 237 | void SetDefaultMaxThreads(); |
| 238 | void SetDefaultMaxMemory(); |
| 239 | |
| 240 | OrderType ResolveOrder(OrderType order_type) const; |
| 241 | OrderByNullType ResolveNullOrder(OrderType order_type, OrderByNullType null_type) const; |
| 242 | |
| 243 | private: |
| 244 | unique_ptr<CompressionFunctionSet> compression_functions; |
| 245 | unique_ptr<CastFunctionSet> cast_functions; |
| 246 | }; |
| 247 | |
| 248 | } // namespace duckdb |
| 249 | |