duckdb 0.3.2-dev50.0 → 0.3.2-dev502.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/package.json +1 -1
  2. package/src/duckdb.cpp +45024 -29651
  3. package/src/duckdb.hpp +763 -628
package/src/duckdb.hpp CHANGED
@@ -10,8 +10,8 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
10
10
 
11
11
  #pragma once
12
12
  #define DUCKDB_AMALGAMATION 1
13
- #define DUCKDB_SOURCE_ID "1f398ce3b"
14
- #define DUCKDB_VERSION "0.3.2-dev50"
13
+ #define DUCKDB_SOURCE_ID "7a4c1fbf0"
14
+ #define DUCKDB_VERSION "0.3.2-dev502"
15
15
  //===----------------------------------------------------------------------===//
16
16
  // DuckDB
17
17
  //
@@ -72,6 +72,32 @@ using std::string;
72
72
  }
73
73
 
74
74
 
75
+
76
+ #ifndef DUCKDB_API
77
+ #ifdef _WIN32
78
+ #if defined(DUCKDB_BUILD_LIBRARY) && !defined(DUCKDB_BUILD_LOADABLE_EXTENSION)
79
+ #define DUCKDB_API __declspec(dllexport)
80
+ #else
81
+ #define DUCKDB_API __declspec(dllimport)
82
+ #endif
83
+ #else
84
+ #define DUCKDB_API
85
+ #endif
86
+ #endif
87
+
88
+ #ifndef DUCKDB_EXTENSION_API
89
+ #ifdef _WIN32
90
+ #ifdef DUCKDB_BUILD_LOADABLE_EXTENSION
91
+ #define DUCKDB_EXTENSION_API __declspec(dllexport)
92
+ #else
93
+ #define DUCKDB_EXTENSION_API
94
+ #endif
95
+ #else
96
+ #define DUCKDB_EXTENSION_API
97
+ #endif
98
+ #endif
99
+
100
+
75
101
  namespace duckdb {
76
102
 
77
103
  //! inline std directives that we use frequently
@@ -96,9 +122,6 @@ typedef int64_t row_t;
96
122
  //! The type used for hashes
97
123
  typedef uint64_t hash_t;
98
124
 
99
- //! The value used to signify an invalid index entry
100
- extern const idx_t INVALID_INDEX;
101
-
102
125
  //! data pointers
103
126
  typedef uint8_t data_t;
104
127
  typedef data_t *data_ptr_t;
@@ -124,6 +147,11 @@ extern const transaction_t NOT_DELETED_ID;
124
147
 
125
148
  extern const double PI;
126
149
 
150
+ struct DConstants {
151
+ //! The value used to signify an invalid index entry
152
+ static constexpr const idx_t INVALID_INDEX = idx_t(-1);
153
+ };
154
+
127
155
  struct Storage {
128
156
  //! The size of a hard disk sector, only really needed for Direct IO
129
157
  constexpr static int SECTOR_SIZE = 4096;
@@ -198,6 +226,12 @@ enum class ProfilerPrintFormat : uint8_t { NONE, QUERY_TREE, JSON, QUERY_TREE_OP
198
226
  #define suint64_t int64_t
199
227
  #endif
200
228
 
229
+ #if defined(_WIN32) || defined(_WIN64)
230
+ #define DUCKDB_WINDOWS
231
+ #elif defined(__unix__) || defined(__unix) || (defined(__APPLE__) && defined(__MACH__))
232
+ #define DUCKDB_POSIX
233
+ #endif
234
+
201
235
  namespace duckdb {
202
236
  #if !defined(_MSC_VER) && (__cplusplus < 201402L)
203
237
  template <typename T, typename... Args>
@@ -546,28 +580,6 @@ using std::vector;
546
580
 
547
581
 
548
582
 
549
- #ifndef DUCKDB_API
550
- #ifdef _WIN32
551
- #if defined(DUCKDB_BUILD_LIBRARY) && !defined(DUCKDB_BUILD_LOADABLE_EXTENSION)
552
- #define DUCKDB_API __declspec(dllexport)
553
- #else
554
- #define DUCKDB_API __declspec(dllimport)
555
- #endif
556
- #else
557
- #define DUCKDB_API
558
- #endif
559
- #endif
560
-
561
- #ifdef DUCKDB_BUILD_LOADABLE_EXTENSION
562
- #ifdef _WIN32
563
- #define DUCKDB_EXTENSION_API __declspec(dllexport)
564
- #else
565
- #define DUCKDB_EXTENSION_API
566
- #endif
567
- #endif
568
-
569
-
570
-
571
583
  namespace duckdb {
572
584
 
573
585
  class Serializer;
@@ -904,6 +916,9 @@ enum class LogicalTypeId : uint8_t {
904
916
  USMALLINT = 29,
905
917
  UINTEGER = 30,
906
918
  UBIGINT = 31,
919
+ TIMESTAMP_TZ = 32,
920
+ DATE_TZ = 33,
921
+ TIME_TZ = 34,
907
922
 
908
923
 
909
924
  HUGEINT = 50,
@@ -925,42 +940,38 @@ struct LogicalType {
925
940
  DUCKDB_API LogicalType();
926
941
  DUCKDB_API LogicalType(LogicalTypeId id); // NOLINT: Allow implicit conversion from `LogicalTypeId`
927
942
  DUCKDB_API LogicalType(LogicalTypeId id, shared_ptr<ExtraTypeInfo> type_info);
928
-
929
- DUCKDB_API LogicalType(const LogicalType &other) :
930
- id_(other.id_), physical_type_(other.physical_type_), type_info_(other.type_info_) {}
931
-
932
- DUCKDB_API LogicalType(LogicalType &&other) :
933
- id_(other.id_), physical_type_(other.physical_type_), type_info_(move(other.type_info_)) {}
943
+ DUCKDB_API LogicalType(const LogicalType &other);
944
+ DUCKDB_API LogicalType(LogicalType &&other) noexcept;
934
945
 
935
946
  DUCKDB_API ~LogicalType();
936
947
 
937
- LogicalTypeId id() const {
948
+ inline LogicalTypeId id() const {
938
949
  return id_;
939
950
  }
940
- PhysicalType InternalType() const {
951
+ inline PhysicalType InternalType() const {
941
952
  return physical_type_;
942
953
  }
943
- const ExtraTypeInfo *AuxInfo() const {
954
+ inline const ExtraTypeInfo *AuxInfo() const {
944
955
  return type_info_.get();
945
956
  }
946
957
 
947
958
  // copy assignment
948
- LogicalType& operator=(const LogicalType &other) {
959
+ inline LogicalType& operator=(const LogicalType &other) {
949
960
  id_ = other.id_;
950
961
  physical_type_ = other.physical_type_;
951
962
  type_info_ = other.type_info_;
952
963
  return *this;
953
964
  }
954
965
  // move assignment
955
- LogicalType& operator=(LogicalType&& other) {
966
+ inline LogicalType& operator=(LogicalType&& other) {
956
967
  id_ = other.id_;
957
968
  physical_type_ = other.physical_type_;
958
969
  type_info_ = move(other.type_info_);
959
970
  return *this;
960
971
  }
961
972
 
962
- bool operator==(const LogicalType &rhs) const;
963
- bool operator!=(const LogicalType &rhs) const {
973
+ DUCKDB_API bool operator==(const LogicalType &rhs) const;
974
+ inline bool operator!=(const LogicalType &rhs) const {
964
975
  return !(*this == rhs);
965
976
  }
966
977
 
@@ -990,34 +1001,37 @@ private:
990
1001
  PhysicalType GetInternalType();
991
1002
 
992
1003
  public:
993
- DUCKDB_API static const LogicalType SQLNULL;
994
- DUCKDB_API static const LogicalType BOOLEAN;
995
- DUCKDB_API static const LogicalType TINYINT;
996
- DUCKDB_API static const LogicalType UTINYINT;
997
- DUCKDB_API static const LogicalType SMALLINT;
998
- DUCKDB_API static const LogicalType USMALLINT;
999
- DUCKDB_API static const LogicalType INTEGER;
1000
- DUCKDB_API static const LogicalType UINTEGER;
1001
- DUCKDB_API static const LogicalType BIGINT;
1002
- DUCKDB_API static const LogicalType UBIGINT;
1003
- DUCKDB_API static const LogicalType FLOAT;
1004
- DUCKDB_API static const LogicalType DOUBLE;
1005
- DUCKDB_API static const LogicalType DATE;
1006
- DUCKDB_API static const LogicalType TIMESTAMP;
1007
- DUCKDB_API static const LogicalType TIMESTAMP_S;
1008
- DUCKDB_API static const LogicalType TIMESTAMP_MS;
1009
- DUCKDB_API static const LogicalType TIMESTAMP_NS;
1010
- DUCKDB_API static const LogicalType TIME;
1011
- DUCKDB_API static const LogicalType VARCHAR;
1012
- DUCKDB_API static const LogicalType ANY;
1013
- DUCKDB_API static const LogicalType BLOB;
1014
- DUCKDB_API static const LogicalType INTERVAL;
1015
- DUCKDB_API static const LogicalType HUGEINT;
1016
- DUCKDB_API static const LogicalType UUID;
1017
- DUCKDB_API static const LogicalType HASH;
1018
- DUCKDB_API static const LogicalType POINTER;
1019
- DUCKDB_API static const LogicalType TABLE;
1020
- DUCKDB_API static const LogicalType INVALID;
1004
+ static constexpr const LogicalTypeId SQLNULL = LogicalTypeId::SQLNULL;
1005
+ static constexpr const LogicalTypeId BOOLEAN = LogicalTypeId::BOOLEAN;
1006
+ static constexpr const LogicalTypeId TINYINT = LogicalTypeId::TINYINT;
1007
+ static constexpr const LogicalTypeId UTINYINT = LogicalTypeId::UTINYINT;
1008
+ static constexpr const LogicalTypeId SMALLINT = LogicalTypeId::SMALLINT;
1009
+ static constexpr const LogicalTypeId USMALLINT = LogicalTypeId::USMALLINT;
1010
+ static constexpr const LogicalTypeId INTEGER = LogicalTypeId::INTEGER;
1011
+ static constexpr const LogicalTypeId UINTEGER = LogicalTypeId::UINTEGER;
1012
+ static constexpr const LogicalTypeId BIGINT = LogicalTypeId::BIGINT;
1013
+ static constexpr const LogicalTypeId UBIGINT = LogicalTypeId::UBIGINT;
1014
+ static constexpr const LogicalTypeId FLOAT = LogicalTypeId::FLOAT;
1015
+ static constexpr const LogicalTypeId DOUBLE = LogicalTypeId::DOUBLE;
1016
+ static constexpr const LogicalTypeId DATE = LogicalTypeId::DATE;
1017
+ static constexpr const LogicalTypeId TIMESTAMP = LogicalTypeId::TIMESTAMP;
1018
+ static constexpr const LogicalTypeId TIMESTAMP_S = LogicalTypeId::TIMESTAMP_SEC;
1019
+ static constexpr const LogicalTypeId TIMESTAMP_MS = LogicalTypeId::TIMESTAMP_MS;
1020
+ static constexpr const LogicalTypeId TIMESTAMP_NS = LogicalTypeId::TIMESTAMP_NS;
1021
+ static constexpr const LogicalTypeId TIME = LogicalTypeId::TIME;
1022
+ static constexpr const LogicalTypeId TIMESTAMP_TZ = LogicalTypeId::TIMESTAMP_TZ;
1023
+ static constexpr const LogicalTypeId DATE_TZ = LogicalTypeId::DATE_TZ;
1024
+ static constexpr const LogicalTypeId TIME_TZ = LogicalTypeId::TIME_TZ;
1025
+ static constexpr const LogicalTypeId VARCHAR = LogicalTypeId::VARCHAR;
1026
+ static constexpr const LogicalTypeId ANY = LogicalTypeId::ANY;
1027
+ static constexpr const LogicalTypeId BLOB = LogicalTypeId::BLOB;
1028
+ static constexpr const LogicalTypeId INTERVAL = LogicalTypeId::INTERVAL;
1029
+ static constexpr const LogicalTypeId HUGEINT = LogicalTypeId::HUGEINT;
1030
+ static constexpr const LogicalTypeId UUID = LogicalTypeId::UUID;
1031
+ static constexpr const LogicalTypeId HASH = LogicalTypeId::HASH;
1032
+ static constexpr const LogicalTypeId POINTER = LogicalTypeId::POINTER;
1033
+ static constexpr const LogicalTypeId TABLE = LogicalTypeId::TABLE;
1034
+ static constexpr const LogicalTypeId INVALID = LogicalTypeId::INVALID;
1021
1035
 
1022
1036
  // explicitly allowing these functions to be capitalized to be in-line with the remaining functions
1023
1037
  DUCKDB_API static LogicalType DECIMAL(int width, int scale); // NOLINT
@@ -1025,6 +1039,7 @@ public:
1025
1039
  DUCKDB_API static LogicalType LIST( LogicalType child); // NOLINT
1026
1040
  DUCKDB_API static LogicalType STRUCT( child_list_t<LogicalType> children); // NOLINT
1027
1041
  DUCKDB_API static LogicalType MAP( child_list_t<LogicalType> children); // NOLINT
1042
+ DUCKDB_API static LogicalType MAP(LogicalType key, LogicalType value); // NOLINT
1028
1043
  DUCKDB_API static LogicalType ENUM(const string &enum_name, const vector<string> &ordered_data); // NOLINT
1029
1044
  DUCKDB_API static LogicalType USER(const string &user_type_name); // NOLINT
1030
1045
  //! A list of all NUMERIC types (integral and floating point types)
@@ -1158,15 +1173,9 @@ enum class ExceptionFormatValueType : uint8_t {
1158
1173
  };
1159
1174
 
1160
1175
  struct ExceptionFormatValue {
1161
- ExceptionFormatValue(double dbl_val) // NOLINT
1162
- : type(ExceptionFormatValueType::FORMAT_VALUE_TYPE_DOUBLE), dbl_val(dbl_val) {
1163
- }
1164
- ExceptionFormatValue(int64_t int_val) // NOLINT
1165
- : type(ExceptionFormatValueType::FORMAT_VALUE_TYPE_INTEGER), int_val(int_val) {
1166
- }
1167
- ExceptionFormatValue(string str_val) // NOLINT
1168
- : type(ExceptionFormatValueType::FORMAT_VALUE_TYPE_STRING), str_val(move(str_val)) {
1169
- }
1176
+ DUCKDB_API ExceptionFormatValue(double dbl_val); // NOLINT
1177
+ DUCKDB_API ExceptionFormatValue(int64_t int_val); // NOLINT
1178
+ DUCKDB_API ExceptionFormatValue(string str_val); // NOLINT
1170
1179
 
1171
1180
  ExceptionFormatValueType type;
1172
1181
 
@@ -1183,19 +1192,19 @@ public:
1183
1192
  };
1184
1193
 
1185
1194
  template <>
1186
- ExceptionFormatValue ExceptionFormatValue::CreateFormatValue(PhysicalType value);
1195
+ DUCKDB_API ExceptionFormatValue ExceptionFormatValue::CreateFormatValue(PhysicalType value);
1187
1196
  template <>
1188
- ExceptionFormatValue ExceptionFormatValue::CreateFormatValue(LogicalType value);
1197
+ DUCKDB_API ExceptionFormatValue ExceptionFormatValue::CreateFormatValue(LogicalType value);
1189
1198
  template <>
1190
- ExceptionFormatValue ExceptionFormatValue::CreateFormatValue(float value);
1199
+ DUCKDB_API ExceptionFormatValue ExceptionFormatValue::CreateFormatValue(float value);
1191
1200
  template <>
1192
- ExceptionFormatValue ExceptionFormatValue::CreateFormatValue(double value);
1201
+ DUCKDB_API ExceptionFormatValue ExceptionFormatValue::CreateFormatValue(double value);
1193
1202
  template <>
1194
- ExceptionFormatValue ExceptionFormatValue::CreateFormatValue(string value);
1203
+ DUCKDB_API ExceptionFormatValue ExceptionFormatValue::CreateFormatValue(string value);
1195
1204
  template <>
1196
- ExceptionFormatValue ExceptionFormatValue::CreateFormatValue(const char *value);
1205
+ DUCKDB_API ExceptionFormatValue ExceptionFormatValue::CreateFormatValue(const char *value);
1197
1206
  template <>
1198
- ExceptionFormatValue ExceptionFormatValue::CreateFormatValue(char *value);
1207
+ DUCKDB_API ExceptionFormatValue ExceptionFormatValue::CreateFormatValue(char *value);
1199
1208
 
1200
1209
  } // namespace duckdb
1201
1210
 
@@ -1266,15 +1275,15 @@ enum class ExceptionType {
1266
1275
 
1267
1276
  class Exception : public std::exception {
1268
1277
  public:
1269
- explicit Exception(const string &msg);
1270
- Exception(ExceptionType exception_type, const string &message);
1278
+ DUCKDB_API explicit Exception(const string &msg);
1279
+ DUCKDB_API Exception(ExceptionType exception_type, const string &message);
1271
1280
 
1272
1281
  ExceptionType type;
1273
1282
 
1274
1283
  public:
1275
- const char *what() const noexcept override;
1284
+ DUCKDB_API const char *what() const noexcept override;
1276
1285
 
1277
- string ExceptionTypeToString(ExceptionType type);
1286
+ DUCKDB_API string ExceptionTypeToString(ExceptionType type);
1278
1287
 
1279
1288
  template <typename... Args>
1280
1289
  static string ConstructMessage(const string &msg, Args... params) {
@@ -1282,7 +1291,7 @@ public:
1282
1291
  return ConstructMessageRecursive(msg, values, params...);
1283
1292
  }
1284
1293
 
1285
- static string ConstructMessageRecursive(const string &msg, vector<ExceptionFormatValue> &values);
1294
+ DUCKDB_API static string ConstructMessageRecursive(const string &msg, vector<ExceptionFormatValue> &values);
1286
1295
 
1287
1296
  template <class T, typename... Args>
1288
1297
  static string ConstructMessageRecursive(const string &msg, vector<ExceptionFormatValue> &values, T param,
@@ -1291,6 +1300,8 @@ public:
1291
1300
  return ConstructMessageRecursive(msg, values, params...);
1292
1301
  }
1293
1302
 
1303
+ DUCKDB_API static bool UncaughtException();
1304
+
1294
1305
  private:
1295
1306
  string exception_message_;
1296
1307
  };
@@ -1302,13 +1313,12 @@ private:
1302
1313
  //! Exceptions that are StandardExceptions do NOT invalidate the current transaction when thrown
1303
1314
  class StandardException : public Exception {
1304
1315
  public:
1305
- StandardException(ExceptionType exception_type, string message) : Exception(exception_type, message) {
1306
- }
1316
+ DUCKDB_API StandardException(ExceptionType exception_type, const string &message);
1307
1317
  };
1308
1318
 
1309
1319
  class CatalogException : public StandardException {
1310
1320
  public:
1311
- explicit CatalogException(const string &msg);
1321
+ DUCKDB_API explicit CatalogException(const string &msg);
1312
1322
 
1313
1323
  template <typename... Args>
1314
1324
  explicit CatalogException(const string &msg, Args... params) : CatalogException(ConstructMessage(msg, params...)) {
@@ -1317,7 +1327,7 @@ public:
1317
1327
 
1318
1328
  class ParserException : public StandardException {
1319
1329
  public:
1320
- explicit ParserException(const string &msg);
1330
+ DUCKDB_API explicit ParserException(const string &msg);
1321
1331
 
1322
1332
  template <typename... Args>
1323
1333
  explicit ParserException(const string &msg, Args... params) : ParserException(ConstructMessage(msg, params...)) {
@@ -1326,7 +1336,7 @@ public:
1326
1336
 
1327
1337
  class BinderException : public StandardException {
1328
1338
  public:
1329
- explicit BinderException(const string &msg);
1339
+ DUCKDB_API explicit BinderException(const string &msg);
1330
1340
 
1331
1341
  template <typename... Args>
1332
1342
  explicit BinderException(const string &msg, Args... params) : BinderException(ConstructMessage(msg, params...)) {
@@ -1335,7 +1345,7 @@ public:
1335
1345
 
1336
1346
  class ConversionException : public Exception {
1337
1347
  public:
1338
- explicit ConversionException(const string &msg);
1348
+ DUCKDB_API explicit ConversionException(const string &msg);
1339
1349
 
1340
1350
  template <typename... Args>
1341
1351
  explicit ConversionException(const string &msg, Args... params)
@@ -1345,7 +1355,7 @@ public:
1345
1355
 
1346
1356
  class TransactionException : public Exception {
1347
1357
  public:
1348
- explicit TransactionException(const string &msg);
1358
+ DUCKDB_API explicit TransactionException(const string &msg);
1349
1359
 
1350
1360
  template <typename... Args>
1351
1361
  explicit TransactionException(const string &msg, Args... params)
@@ -1355,7 +1365,7 @@ public:
1355
1365
 
1356
1366
  class NotImplementedException : public Exception {
1357
1367
  public:
1358
- explicit NotImplementedException(const string &msg);
1368
+ DUCKDB_API explicit NotImplementedException(const string &msg);
1359
1369
 
1360
1370
  template <typename... Args>
1361
1371
  explicit NotImplementedException(const string &msg, Args... params)
@@ -1365,7 +1375,7 @@ public:
1365
1375
 
1366
1376
  class OutOfRangeException : public Exception {
1367
1377
  public:
1368
- explicit OutOfRangeException(const string &msg);
1378
+ DUCKDB_API explicit OutOfRangeException(const string &msg);
1369
1379
 
1370
1380
  template <typename... Args>
1371
1381
  explicit OutOfRangeException(const string &msg, Args... params)
@@ -1375,7 +1385,7 @@ public:
1375
1385
 
1376
1386
  class OutOfMemoryException : public Exception {
1377
1387
  public:
1378
- explicit OutOfMemoryException(const string &msg);
1388
+ DUCKDB_API explicit OutOfMemoryException(const string &msg);
1379
1389
 
1380
1390
  template <typename... Args>
1381
1391
  explicit OutOfMemoryException(const string &msg, Args... params)
@@ -1385,7 +1395,7 @@ public:
1385
1395
 
1386
1396
  class SyntaxException : public Exception {
1387
1397
  public:
1388
- explicit SyntaxException(const string &msg);
1398
+ DUCKDB_API explicit SyntaxException(const string &msg);
1389
1399
 
1390
1400
  template <typename... Args>
1391
1401
  explicit SyntaxException(const string &msg, Args... params) : SyntaxException(ConstructMessage(msg, params...)) {
@@ -1394,7 +1404,7 @@ public:
1394
1404
 
1395
1405
  class ConstraintException : public Exception {
1396
1406
  public:
1397
- explicit ConstraintException(const string &msg);
1407
+ DUCKDB_API explicit ConstraintException(const string &msg);
1398
1408
 
1399
1409
  template <typename... Args>
1400
1410
  explicit ConstraintException(const string &msg, Args... params)
@@ -1404,7 +1414,7 @@ public:
1404
1414
 
1405
1415
  class IOException : public Exception {
1406
1416
  public:
1407
- explicit IOException(const string &msg);
1417
+ DUCKDB_API explicit IOException(const string &msg);
1408
1418
 
1409
1419
  template <typename... Args>
1410
1420
  explicit IOException(const string &msg, Args... params) : IOException(ConstructMessage(msg, params...)) {
@@ -1413,7 +1423,7 @@ public:
1413
1423
 
1414
1424
  class SerializationException : public Exception {
1415
1425
  public:
1416
- explicit SerializationException(const string &msg);
1426
+ DUCKDB_API explicit SerializationException(const string &msg);
1417
1427
 
1418
1428
  template <typename... Args>
1419
1429
  explicit SerializationException(const string &msg, Args... params)
@@ -1423,7 +1433,7 @@ public:
1423
1433
 
1424
1434
  class SequenceException : public Exception {
1425
1435
  public:
1426
- explicit SequenceException(const string &msg);
1436
+ DUCKDB_API explicit SequenceException(const string &msg);
1427
1437
 
1428
1438
  template <typename... Args>
1429
1439
  explicit SequenceException(const string &msg, Args... params)
@@ -1433,12 +1443,12 @@ public:
1433
1443
 
1434
1444
  class InterruptException : public Exception {
1435
1445
  public:
1436
- InterruptException();
1446
+ DUCKDB_API InterruptException();
1437
1447
  };
1438
1448
 
1439
1449
  class FatalException : public Exception {
1440
1450
  public:
1441
- explicit FatalException(const string &msg);
1451
+ DUCKDB_API explicit FatalException(const string &msg);
1442
1452
 
1443
1453
  template <typename... Args>
1444
1454
  explicit FatalException(const string &msg, Args... params) : FatalException(ConstructMessage(msg, params...)) {
@@ -1447,7 +1457,7 @@ public:
1447
1457
 
1448
1458
  class InternalException : public Exception {
1449
1459
  public:
1450
- explicit InternalException(const string &msg);
1460
+ DUCKDB_API explicit InternalException(const string &msg);
1451
1461
 
1452
1462
  template <typename... Args>
1453
1463
  explicit InternalException(const string &msg, Args... params)
@@ -1457,7 +1467,7 @@ public:
1457
1467
 
1458
1468
  class InvalidInputException : public Exception {
1459
1469
  public:
1460
- explicit InvalidInputException(const string &msg);
1470
+ DUCKDB_API explicit InvalidInputException(const string &msg);
1461
1471
 
1462
1472
  template <typename... Args>
1463
1473
  explicit InvalidInputException(const string &msg, Args... params)
@@ -1467,28 +1477,28 @@ public:
1467
1477
 
1468
1478
  class CastException : public Exception {
1469
1479
  public:
1470
- CastException(const PhysicalType origType, const PhysicalType newType);
1471
- CastException(const LogicalType &origType, const LogicalType &newType);
1480
+ DUCKDB_API CastException(const PhysicalType origType, const PhysicalType newType);
1481
+ DUCKDB_API CastException(const LogicalType &origType, const LogicalType &newType);
1472
1482
  };
1473
1483
 
1474
1484
  class InvalidTypeException : public Exception {
1475
1485
  public:
1476
- InvalidTypeException(PhysicalType type, const string &msg);
1477
- InvalidTypeException(const LogicalType &type, const string &msg);
1486
+ DUCKDB_API InvalidTypeException(PhysicalType type, const string &msg);
1487
+ DUCKDB_API InvalidTypeException(const LogicalType &type, const string &msg);
1478
1488
  };
1479
1489
 
1480
1490
  class TypeMismatchException : public Exception {
1481
1491
  public:
1482
- TypeMismatchException(const PhysicalType type_1, const PhysicalType type_2, const string &msg);
1483
- TypeMismatchException(const LogicalType &type_1, const LogicalType &type_2, const string &msg);
1492
+ DUCKDB_API TypeMismatchException(const PhysicalType type_1, const PhysicalType type_2, const string &msg);
1493
+ DUCKDB_API TypeMismatchException(const LogicalType &type_1, const LogicalType &type_2, const string &msg);
1484
1494
  };
1485
1495
 
1486
1496
  class ValueOutOfRangeException : public Exception {
1487
1497
  public:
1488
- ValueOutOfRangeException(const int64_t value, const PhysicalType origType, const PhysicalType newType);
1489
- ValueOutOfRangeException(const hugeint_t value, const PhysicalType origType, const PhysicalType newType);
1490
- ValueOutOfRangeException(const double value, const PhysicalType origType, const PhysicalType newType);
1491
- ValueOutOfRangeException(const PhysicalType varType, const idx_t length);
1498
+ DUCKDB_API ValueOutOfRangeException(const int64_t value, const PhysicalType origType, const PhysicalType newType);
1499
+ DUCKDB_API ValueOutOfRangeException(const hugeint_t value, const PhysicalType origType, const PhysicalType newType);
1500
+ DUCKDB_API ValueOutOfRangeException(const double value, const PhysicalType origType, const PhysicalType newType);
1501
+ DUCKDB_API ValueOutOfRangeException(const PhysicalType varType, const idx_t length);
1492
1502
  };
1493
1503
 
1494
1504
  } // namespace duckdb
@@ -1718,7 +1728,9 @@ using std::unordered_map;
1718
1728
 
1719
1729
  namespace duckdb {
1720
1730
 
1721
- enum class FileCompressionType : uint8_t { AUTO_DETECT = 0, UNCOMPRESSED = 1, GZIP = 2 };
1731
+ enum class FileCompressionType : uint8_t { AUTO_DETECT = 0, UNCOMPRESSED = 1, GZIP = 2, ZSTD = 3 };
1732
+
1733
+ FileCompressionType FileCompressionTypeFromString(const string &input);
1722
1734
 
1723
1735
  } // namespace duckdb
1724
1736
 
@@ -1778,7 +1790,7 @@ public:
1778
1790
  idx_t GetFileSize();
1779
1791
  FileType GetType();
1780
1792
 
1781
- protected:
1793
+ //! Closes the file handle.
1782
1794
  virtual void Close() = 0;
1783
1795
 
1784
1796
  public:
@@ -1882,6 +1894,7 @@ public:
1882
1894
 
1883
1895
  //! registers a sub-file system to handle certain file name prefixes, e.g. http:// etc.
1884
1896
  virtual void RegisterSubSystem(unique_ptr<FileSystem> sub_fs);
1897
+ virtual void RegisterSubSystem(FileCompressionType compression_type, unique_ptr<FileSystem> fs);
1885
1898
 
1886
1899
  //! Whether or not a sub-system can handle a specific file path
1887
1900
  virtual bool CanHandleFile(const string &fpath);
@@ -1898,6 +1911,8 @@ public:
1898
1911
  //! in a file on-disk are much cheaper than e.g. random reads in a file over the network
1899
1912
  virtual bool OnDiskFile(FileHandle &handle);
1900
1913
 
1914
+ virtual unique_ptr<FileHandle> OpenCompressedFile(unique_ptr<FileHandle> handle, bool write);
1915
+
1901
1916
  //! Create a LocalFileSystem.
1902
1917
  static unique_ptr<FileSystem> CreateLocal();
1903
1918
 
@@ -1923,6 +1938,7 @@ public:
1923
1938
  FileOpener *opener = nullptr);
1924
1939
 
1925
1940
  FileSystem &fs;
1941
+ string path;
1926
1942
  unique_ptr<data_t[]> data;
1927
1943
  idx_t offset;
1928
1944
  idx_t total_written;
@@ -2224,14 +2240,14 @@ struct TemplatedValidityData {
2224
2240
  static constexpr const V MAX_ENTRY = ~V(0);
2225
2241
 
2226
2242
  public:
2227
- explicit TemplatedValidityData(idx_t count) {
2243
+ inline explicit TemplatedValidityData(idx_t count) {
2228
2244
  auto entry_count = EntryCount(count);
2229
2245
  owned_data = unique_ptr<V[]>(new V[entry_count]);
2230
2246
  for (idx_t entry_idx = 0; entry_idx < entry_count; entry_idx++) {
2231
2247
  owned_data[entry_idx] = MAX_ENTRY;
2232
2248
  }
2233
2249
  }
2234
- TemplatedValidityData(const V *validity_mask, idx_t count) {
2250
+ inline TemplatedValidityData(const V *validity_mask, idx_t count) {
2235
2251
  D_ASSERT(validity_mask);
2236
2252
  auto entry_count = EntryCount(count);
2237
2253
  owned_data = unique_ptr<V[]>(new V[entry_count]);
@@ -2267,14 +2283,14 @@ public:
2267
2283
  static constexpr const int STANDARD_MASK_SIZE = STANDARD_ENTRY_COUNT * sizeof(validity_t);
2268
2284
 
2269
2285
  public:
2270
- TemplatedValidityMask() : validity_mask(nullptr) {
2286
+ inline TemplatedValidityMask() : validity_mask(nullptr) {
2271
2287
  }
2272
- explicit TemplatedValidityMask(idx_t max_count) {
2288
+ inline explicit TemplatedValidityMask(idx_t max_count) {
2273
2289
  Initialize(max_count);
2274
2290
  }
2275
- explicit TemplatedValidityMask(V *ptr) : validity_mask(ptr) {
2291
+ inline explicit TemplatedValidityMask(V *ptr) : validity_mask(ptr) {
2276
2292
  }
2277
- TemplatedValidityMask(const TemplatedValidityMask &original, idx_t count) {
2293
+ inline TemplatedValidityMask(const TemplatedValidityMask &original, idx_t count) {
2278
2294
  Copy(original, count);
2279
2295
  }
2280
2296
 
@@ -2284,7 +2300,7 @@ public:
2284
2300
  inline bool AllValid() const {
2285
2301
  return !validity_mask;
2286
2302
  }
2287
- bool CheckAllValid(idx_t count) const {
2303
+ inline bool CheckAllValid(idx_t count) const {
2288
2304
  if (AllValid()) {
2289
2305
  return true;
2290
2306
  }
@@ -2296,7 +2312,7 @@ public:
2296
2312
  return valid_count == entry_count;
2297
2313
  }
2298
2314
 
2299
- bool CheckAllValid(idx_t to, idx_t from) const {
2315
+ inline bool CheckAllValid(idx_t to, idx_t from) const {
2300
2316
  if (AllValid()) {
2301
2317
  return true;
2302
2318
  }
@@ -2311,7 +2327,7 @@ public:
2311
2327
  inline V *GetData() const {
2312
2328
  return validity_mask;
2313
2329
  }
2314
- void Reset() {
2330
+ inline void Reset() {
2315
2331
  validity_mask = nullptr;
2316
2332
  validity_data.reset();
2317
2333
  }
@@ -2437,19 +2453,19 @@ public:
2437
2453
  }
2438
2454
 
2439
2455
  public:
2440
- void Initialize(validity_t *validity) {
2456
+ inline void Initialize(validity_t *validity) {
2441
2457
  validity_data.reset();
2442
2458
  validity_mask = validity;
2443
2459
  }
2444
- void Initialize(const TemplatedValidityMask &other) {
2460
+ inline void Initialize(const TemplatedValidityMask &other) {
2445
2461
  validity_mask = other.validity_mask;
2446
2462
  validity_data = other.validity_data;
2447
2463
  }
2448
- void Initialize(idx_t count = STANDARD_VECTOR_SIZE) {
2464
+ inline void Initialize(idx_t count = STANDARD_VECTOR_SIZE) {
2449
2465
  validity_data = make_buffer<ValidityBuffer>(count);
2450
2466
  validity_mask = validity_data->owned_data.get();
2451
2467
  }
2452
- void Copy(const TemplatedValidityMask &other, idx_t count) {
2468
+ inline void Copy(const TemplatedValidityMask &other, idx_t count) {
2453
2469
  if (other.AllValid()) {
2454
2470
  validity_data = nullptr;
2455
2471
  validity_mask = nullptr;
@@ -2466,21 +2482,21 @@ protected:
2466
2482
 
2467
2483
  struct ValidityMask : public TemplatedValidityMask<validity_t> {
2468
2484
  public:
2469
- ValidityMask() : TemplatedValidityMask(nullptr) {
2485
+ inline ValidityMask() : TemplatedValidityMask(nullptr) {
2470
2486
  }
2471
- explicit ValidityMask(idx_t max_count) : TemplatedValidityMask(max_count) {
2487
+ inline explicit ValidityMask(idx_t max_count) : TemplatedValidityMask(max_count) {
2472
2488
  }
2473
- explicit ValidityMask(validity_t *ptr) : TemplatedValidityMask(ptr) {
2489
+ inline explicit ValidityMask(validity_t *ptr) : TemplatedValidityMask(ptr) {
2474
2490
  }
2475
- ValidityMask(const ValidityMask &original, idx_t count) : TemplatedValidityMask(original, count) {
2491
+ inline ValidityMask(const ValidityMask &original, idx_t count) : TemplatedValidityMask(original, count) {
2476
2492
  }
2477
2493
 
2478
2494
  public:
2479
- void Resize(idx_t old_size, idx_t new_size);
2495
+ DUCKDB_API void Resize(idx_t old_size, idx_t new_size);
2480
2496
 
2481
- void Slice(const ValidityMask &other, idx_t offset);
2482
- void Combine(const ValidityMask &other, idx_t count);
2483
- string ToString(idx_t count) const;
2497
+ DUCKDB_API void Slice(const ValidityMask &other, idx_t offset);
2498
+ DUCKDB_API void Combine(const ValidityMask &other, idx_t count);
2499
+ DUCKDB_API string ToString(idx_t count) const;
2484
2500
  };
2485
2501
 
2486
2502
  } // namespace duckdb
@@ -2512,25 +2528,25 @@ class Value {
2512
2528
 
2513
2529
  public:
2514
2530
  //! Create an empty NULL value of the specified type
2515
- explicit Value(LogicalType type = LogicalType::SQLNULL);
2531
+ DUCKDB_API explicit Value(LogicalType type = LogicalType::SQLNULL);
2516
2532
  //! Create an INTEGER value
2517
- Value(int32_t val); // NOLINT: Allow implicit conversion from `int32_t`
2533
+ DUCKDB_API Value(int32_t val); // NOLINT: Allow implicit conversion from `int32_t`
2518
2534
  //! Create a BIGINT value
2519
- Value(int64_t val); // NOLINT: Allow implicit conversion from `int64_t`
2535
+ DUCKDB_API Value(int64_t val); // NOLINT: Allow implicit conversion from `int64_t`
2520
2536
  //! Create a FLOAT value
2521
- Value(float val); // NOLINT: Allow implicit conversion from `float`
2537
+ DUCKDB_API Value(float val); // NOLINT: Allow implicit conversion from `float`
2522
2538
  //! Create a DOUBLE value
2523
- Value(double val); // NOLINT: Allow implicit conversion from `double`
2539
+ DUCKDB_API Value(double val); // NOLINT: Allow implicit conversion from `double`
2524
2540
  //! Create a VARCHAR value
2525
- Value(const char *val); // NOLINT: Allow implicit conversion from `const char *`
2541
+ DUCKDB_API Value(const char *val); // NOLINT: Allow implicit conversion from `const char *`
2526
2542
  //! Create a NULL value
2527
- Value(std::nullptr_t val); // NOLINT: Allow implicit conversion from `nullptr_t`
2543
+ DUCKDB_API Value(std::nullptr_t val); // NOLINT: Allow implicit conversion from `nullptr_t`
2528
2544
  //! Create a VARCHAR value
2529
- Value(string_t val); // NOLINT: Allow implicit conversion from `string_t`
2545
+ DUCKDB_API Value(string_t val); // NOLINT: Allow implicit conversion from `string_t`
2530
2546
  //! Create a VARCHAR value
2531
- Value(string val); // NOLINT: Allow implicit conversion from `string`
2547
+ DUCKDB_API Value(string val); // NOLINT: Allow implicit conversion from `string`
2532
2548
 
2533
- const LogicalType &type() const {
2549
+ inline const LogicalType &type() const {
2534
2550
  return type_;
2535
2551
  }
2536
2552
 
@@ -2572,19 +2588,22 @@ public:
2572
2588
  DUCKDB_API static Value POINTER(uintptr_t value);
2573
2589
  //! Create a date Value from a specified date
2574
2590
  DUCKDB_API static Value DATE(date_t date);
2591
+ DUCKDB_API static Value DATETZ(date_t date);
2575
2592
  //! Create a date Value from a specified date
2576
2593
  DUCKDB_API static Value DATE(int32_t year, int32_t month, int32_t day);
2577
2594
  //! Create a time Value from a specified time
2578
2595
  DUCKDB_API static Value TIME(dtime_t time);
2596
+ DUCKDB_API static Value TIMETZ(dtime_t time);
2579
2597
  //! Create a time Value from a specified time
2580
2598
  DUCKDB_API static Value TIME(int32_t hour, int32_t min, int32_t sec, int32_t micros);
2581
2599
  //! Create a timestamp Value from a specified date/time combination
2582
2600
  DUCKDB_API static Value TIMESTAMP(date_t date, dtime_t time);
2583
2601
  //! Create a timestamp Value from a specified timestamp
2584
2602
  DUCKDB_API static Value TIMESTAMP(timestamp_t timestamp);
2585
- DUCKDB_API static Value TimestampNs(timestamp_t timestamp);
2586
- DUCKDB_API static Value TimestampMs(timestamp_t timestamp);
2587
- DUCKDB_API static Value TimestampSec(timestamp_t timestamp);
2603
+ DUCKDB_API static Value TIMESTAMPNS(timestamp_t timestamp);
2604
+ DUCKDB_API static Value TIMESTAMPMS(timestamp_t timestamp);
2605
+ DUCKDB_API static Value TIMESTAMPSEC(timestamp_t timestamp);
2606
+ DUCKDB_API static Value TIMESTAMPTZ(timestamp_t timestamp);
2588
2607
  //! Create a timestamp Value from a specified timestamp in separate values
2589
2608
  DUCKDB_API static Value TIMESTAMP(int32_t year, int32_t month, int32_t day, int32_t hour, int32_t min, int32_t sec,
2590
2609
  int32_t micros);
@@ -2605,8 +2624,11 @@ public:
2605
2624
  DUCKDB_API static Value DOUBLE(double value);
2606
2625
  //! Create a struct value with given list of entries
2607
2626
  DUCKDB_API static Value STRUCT(child_list_t<Value> values);
2608
- //! Create a list value with the given entries
2627
+ //! Create a list value with the given entries, list type is inferred from children
2628
+ //! Cannot be called with an empty list, use either EMPTYLIST or LIST with a type instead
2609
2629
  DUCKDB_API static Value LIST(vector<Value> values);
2630
+ //! Create a list value with the given entries
2631
+ DUCKDB_API static Value LIST(LogicalType child_type, vector<Value> values);
2610
2632
  //! Create an empty list with the specified type
2611
2633
  DUCKDB_API static Value EMPTYLIST(LogicalType child_type);
2612
2634
  //! Creat a map value from a (key, value) pair
@@ -2661,32 +2683,32 @@ public:
2661
2683
  //===--------------------------------------------------------------------===//
2662
2684
  // Numeric Operators
2663
2685
  //===--------------------------------------------------------------------===//
2664
- Value operator+(const Value &rhs) const;
2665
- Value operator-(const Value &rhs) const;
2666
- Value operator*(const Value &rhs) const;
2667
- Value operator/(const Value &rhs) const;
2668
- Value operator%(const Value &rhs) const;
2686
+ DUCKDB_API Value operator+(const Value &rhs) const;
2687
+ DUCKDB_API Value operator-(const Value &rhs) const;
2688
+ DUCKDB_API Value operator*(const Value &rhs) const;
2689
+ DUCKDB_API Value operator/(const Value &rhs) const;
2690
+ DUCKDB_API Value operator%(const Value &rhs) const;
2669
2691
 
2670
2692
  //===--------------------------------------------------------------------===//
2671
2693
  // Comparison Operators
2672
2694
  //===--------------------------------------------------------------------===//
2673
- bool operator==(const Value &rhs) const;
2674
- bool operator!=(const Value &rhs) const;
2675
- bool operator<(const Value &rhs) const;
2676
- bool operator>(const Value &rhs) const;
2677
- bool operator<=(const Value &rhs) const;
2678
- bool operator>=(const Value &rhs) const;
2679
-
2680
- bool operator==(const int64_t &rhs) const;
2681
- bool operator!=(const int64_t &rhs) const;
2682
- bool operator<(const int64_t &rhs) const;
2683
- bool operator>(const int64_t &rhs) const;
2684
- bool operator<=(const int64_t &rhs) const;
2685
- bool operator>=(const int64_t &rhs) const;
2686
-
2687
- static bool FloatIsValid(float value);
2688
- static bool DoubleIsValid(double value);
2689
- static bool StringIsValid(const char *str, idx_t length);
2695
+ DUCKDB_API bool operator==(const Value &rhs) const;
2696
+ DUCKDB_API bool operator!=(const Value &rhs) const;
2697
+ DUCKDB_API bool operator<(const Value &rhs) const;
2698
+ DUCKDB_API bool operator>(const Value &rhs) const;
2699
+ DUCKDB_API bool operator<=(const Value &rhs) const;
2700
+ DUCKDB_API bool operator>=(const Value &rhs) const;
2701
+
2702
+ DUCKDB_API bool operator==(const int64_t &rhs) const;
2703
+ DUCKDB_API bool operator!=(const int64_t &rhs) const;
2704
+ DUCKDB_API bool operator<(const int64_t &rhs) const;
2705
+ DUCKDB_API bool operator>(const int64_t &rhs) const;
2706
+ DUCKDB_API bool operator<=(const int64_t &rhs) const;
2707
+ DUCKDB_API bool operator>=(const int64_t &rhs) const;
2708
+
2709
+ DUCKDB_API static bool FloatIsValid(float value);
2710
+ DUCKDB_API static bool DoubleIsValid(double value);
2711
+ DUCKDB_API static bool StringIsValid(const char *str, idx_t length);
2690
2712
  static bool StringIsValid(const string &str) {
2691
2713
  return StringIsValid(str.c_str(), str.size());
2692
2714
  }
@@ -2698,13 +2720,13 @@ public:
2698
2720
 
2699
2721
  //! Returns true if the values are (approximately) equivalent. Note this is NOT the SQL equivalence. For this
2700
2722
  //! function, NULL values are equivalent and floating point values that are close are equivalent.
2701
- static bool ValuesAreEqual(const Value &result_value, const Value &value);
2723
+ DUCKDB_API static bool ValuesAreEqual(const Value &result_value, const Value &value);
2702
2724
 
2703
2725
  friend std::ostream &operator<<(std::ostream &out, const Value &val) {
2704
2726
  out << val.ToString();
2705
2727
  return out;
2706
2728
  }
2707
- void Print() const;
2729
+ DUCKDB_API void Print() const;
2708
2730
 
2709
2731
  private:
2710
2732
  //! The logical of the value
@@ -3283,69 +3305,69 @@ class Vector {
3283
3305
 
3284
3306
  public:
3285
3307
  //! Create a vector that references the other vector
3286
- explicit Vector(Vector &other);
3308
+ DUCKDB_API explicit Vector(Vector &other);
3287
3309
  //! Create a vector that slices another vector
3288
- explicit Vector(Vector &other, const SelectionVector &sel, idx_t count);
3310
+ DUCKDB_API explicit Vector(Vector &other, const SelectionVector &sel, idx_t count);
3289
3311
  //! Create a vector that slices another vector starting from a specific offset
3290
- explicit Vector(Vector &other, idx_t offset);
3312
+ DUCKDB_API explicit Vector(Vector &other, idx_t offset);
3291
3313
  //! Create a vector of size one holding the passed on value
3292
- explicit Vector(const Value &value);
3314
+ DUCKDB_API explicit Vector(const Value &value);
3293
3315
  //! Create a vector of size tuple_count (non-standard)
3294
- explicit Vector(LogicalType type, idx_t capacity = STANDARD_VECTOR_SIZE);
3316
+ DUCKDB_API explicit Vector(LogicalType type, idx_t capacity = STANDARD_VECTOR_SIZE);
3295
3317
  //! Create an empty standard vector with a type, equivalent to calling Vector(type, true, false)
3296
- explicit Vector(const VectorCache &cache);
3318
+ DUCKDB_API explicit Vector(const VectorCache &cache);
3297
3319
  //! Create a non-owning vector that references the specified data
3298
- Vector(LogicalType type, data_ptr_t dataptr);
3320
+ DUCKDB_API Vector(LogicalType type, data_ptr_t dataptr);
3299
3321
  //! Create an owning vector that holds at most STANDARD_VECTOR_SIZE entries.
3300
3322
  /*!
3301
3323
  Create a new vector
3302
3324
  If create_data is true, the vector will be an owning empty vector.
3303
3325
  If zero_data is true, the allocated data will be zero-initialized.
3304
3326
  */
3305
- Vector(LogicalType type, bool create_data, bool zero_data, idx_t capacity = STANDARD_VECTOR_SIZE);
3327
+ DUCKDB_API Vector(LogicalType type, bool create_data, bool zero_data, idx_t capacity = STANDARD_VECTOR_SIZE);
3306
3328
  // implicit copying of Vectors is not allowed
3307
- Vector(const Vector &) = delete;
3329
+ DUCKDB_API Vector(const Vector &) = delete;
3308
3330
  // but moving of vectors is allowed
3309
- Vector(Vector &&other) noexcept;
3331
+ DUCKDB_API Vector(Vector &&other) noexcept;
3310
3332
 
3311
3333
  public:
3312
3334
  //! Create a vector that references the specified value.
3313
- void Reference(const Value &value);
3335
+ DUCKDB_API void Reference(const Value &value);
3314
3336
  //! Causes this vector to reference the data held by the other vector.
3315
3337
  //! The type of the "other" vector should match the type of this vector
3316
- void Reference(Vector &other);
3338
+ DUCKDB_API void Reference(Vector &other);
3317
3339
  //! Reinterpret the data of the other vector as the type of this vector
3318
3340
  //! Note that this takes the data of the other vector as-is and places it in this vector
3319
3341
  //! Without changing the type of this vector
3320
- void Reinterpret(Vector &other);
3342
+ DUCKDB_API void Reinterpret(Vector &other);
3321
3343
 
3322
3344
  //! Causes this vector to reference the data held by the other vector, changes the type if required.
3323
- void ReferenceAndSetType(Vector &other);
3345
+ DUCKDB_API void ReferenceAndSetType(Vector &other);
3324
3346
 
3325
3347
  //! Resets a vector from a vector cache.
3326
3348
  //! This turns the vector back into an empty FlatVector with STANDARD_VECTOR_SIZE entries.
3327
3349
  //! The VectorCache is used so this can be done without requiring any allocations.
3328
- void ResetFromCache(const VectorCache &cache);
3350
+ DUCKDB_API void ResetFromCache(const VectorCache &cache);
3329
3351
 
3330
3352
  //! Creates a reference to a slice of the other vector
3331
- void Slice(Vector &other, idx_t offset);
3353
+ DUCKDB_API void Slice(Vector &other, idx_t offset);
3332
3354
  //! Creates a reference to a slice of the other vector
3333
- void Slice(Vector &other, const SelectionVector &sel, idx_t count);
3355
+ DUCKDB_API void Slice(Vector &other, const SelectionVector &sel, idx_t count);
3334
3356
  //! Turns the vector into a dictionary vector with the specified dictionary
3335
- void Slice(const SelectionVector &sel, idx_t count);
3357
+ DUCKDB_API void Slice(const SelectionVector &sel, idx_t count);
3336
3358
  //! Slice the vector, keeping the result around in a cache or potentially using the cache instead of slicing
3337
- void Slice(const SelectionVector &sel, idx_t count, SelCache &cache);
3359
+ DUCKDB_API void Slice(const SelectionVector &sel, idx_t count, SelCache &cache);
3338
3360
 
3339
3361
  //! Creates the data of this vector with the specified type. Any data that
3340
3362
  //! is currently in the vector is destroyed.
3341
- void Initialize(bool zero_data = false, idx_t capacity = STANDARD_VECTOR_SIZE);
3363
+ DUCKDB_API void Initialize(bool zero_data = false, idx_t capacity = STANDARD_VECTOR_SIZE);
3342
3364
 
3343
3365
  //! Converts this Vector to a printable string representation
3344
- string ToString(idx_t count) const;
3345
- void Print(idx_t count);
3366
+ DUCKDB_API string ToString(idx_t count) const;
3367
+ DUCKDB_API void Print(idx_t count);
3346
3368
 
3347
- string ToString() const;
3348
- void Print();
3369
+ DUCKDB_API string ToString() const;
3370
+ DUCKDB_API void Print();
3349
3371
 
3350
3372
  //! Flatten the vector, removing any compression and turning it into a FLAT_VECTOR
3351
3373
  DUCKDB_API void Normalify(idx_t count);
@@ -3354,31 +3376,31 @@ public:
3354
3376
  DUCKDB_API void Orrify(idx_t count, VectorData &data);
3355
3377
 
3356
3378
  //! Turn the vector into a sequence vector
3357
- void Sequence(int64_t start, int64_t increment);
3379
+ DUCKDB_API void Sequence(int64_t start, int64_t increment);
3358
3380
 
3359
3381
  //! Verify that the Vector is in a consistent, not corrupt state. DEBUG
3360
3382
  //! FUNCTION ONLY!
3361
- void Verify(idx_t count);
3362
- void Verify(const SelectionVector &sel, idx_t count);
3363
- void UTFVerify(idx_t count);
3364
- void UTFVerify(const SelectionVector &sel, idx_t count);
3383
+ DUCKDB_API void Verify(idx_t count);
3384
+ DUCKDB_API void Verify(const SelectionVector &sel, idx_t count);
3385
+ DUCKDB_API void UTFVerify(idx_t count);
3386
+ DUCKDB_API void UTFVerify(const SelectionVector &sel, idx_t count);
3365
3387
 
3366
3388
  //! Returns the [index] element of the Vector as a Value.
3367
- Value GetValue(idx_t index) const;
3389
+ DUCKDB_API Value GetValue(idx_t index) const;
3368
3390
  //! Sets the [index] element of the Vector to the specified Value.
3369
- void SetValue(idx_t index, const Value &val);
3391
+ DUCKDB_API void SetValue(idx_t index, const Value &val);
3370
3392
 
3371
- void SetAuxiliary(buffer_ptr<VectorBuffer> new_buffer) {
3393
+ inline void SetAuxiliary(buffer_ptr<VectorBuffer> new_buffer) {
3372
3394
  auxiliary = std::move(new_buffer);
3373
3395
  };
3374
3396
 
3375
3397
  //! This functions resizes the vector
3376
- void Resize(idx_t cur_size, idx_t new_size);
3398
+ DUCKDB_API void Resize(idx_t cur_size, idx_t new_size);
3377
3399
 
3378
3400
  //! Serializes a Vector to a stand-alone binary blob
3379
- void Serialize(idx_t count, Serializer &serializer);
3401
+ DUCKDB_API void Serialize(idx_t count, Serializer &serializer);
3380
3402
  //! Deserializes a blob back into a Vector
3381
- void Deserialize(idx_t count, Deserializer &source);
3403
+ DUCKDB_API void Deserialize(idx_t count, Deserializer &source);
3382
3404
 
3383
3405
  // Getters
3384
3406
  inline VectorType GetVectorType() const {
@@ -3391,11 +3413,11 @@ public:
3391
3413
  return data;
3392
3414
  }
3393
3415
 
3394
- buffer_ptr<VectorBuffer> GetAuxiliary() {
3416
+ inline buffer_ptr<VectorBuffer> GetAuxiliary() {
3395
3417
  return auxiliary;
3396
3418
  }
3397
3419
 
3398
- buffer_ptr<VectorBuffer> GetBuffer() {
3420
+ inline buffer_ptr<VectorBuffer> GetBuffer() {
3399
3421
  return buffer;
3400
3422
  }
3401
3423
 
@@ -3646,27 +3668,27 @@ class VectorCache;
3646
3668
  class DataChunk {
3647
3669
  public:
3648
3670
  //! Creates an empty DataChunk
3649
- DataChunk();
3650
- ~DataChunk();
3671
+ DUCKDB_API DataChunk();
3672
+ DUCKDB_API ~DataChunk();
3651
3673
 
3652
3674
  //! The vectors owned by the DataChunk.
3653
3675
  vector<Vector> data;
3654
3676
 
3655
3677
  public:
3656
- DUCKDB_API idx_t size() const {
3678
+ inline idx_t size() const { // NOLINT
3657
3679
  return count;
3658
3680
  }
3659
- DUCKDB_API idx_t ColumnCount() const {
3681
+ inline idx_t ColumnCount() const {
3660
3682
  return data.size();
3661
3683
  }
3662
- void SetCardinality(idx_t count_p) {
3684
+ inline void SetCardinality(idx_t count_p) {
3663
3685
  D_ASSERT(count_p <= capacity);
3664
3686
  this->count = count_p;
3665
3687
  }
3666
- void SetCardinality(const DataChunk &other) {
3688
+ inline void SetCardinality(const DataChunk &other) {
3667
3689
  this->count = other.size();
3668
3690
  }
3669
- void SetCapacity(const DataChunk &other) {
3691
+ inline void SetCapacity(const DataChunk &other) {
3670
3692
  this->capacity = other.capacity;
3671
3693
  }
3672
3694
 
@@ -3682,9 +3704,9 @@ public:
3682
3704
  //! This will create one vector of the specified type for each LogicalType in the
3683
3705
  //! types list. The vector will be referencing vector to the data owned by
3684
3706
  //! the DataChunk.
3685
- void Initialize(const vector<LogicalType> &types);
3707
+ DUCKDB_API void Initialize(const vector<LogicalType> &types);
3686
3708
  //! Initializes an empty DataChunk with the given types. The vectors will *not* have any data allocated for them.
3687
- void InitializeEmpty(const vector<LogicalType> &types);
3709
+ DUCKDB_API void InitializeEmpty(const vector<LogicalType> &types);
3688
3710
  //! Append the other DataChunk to this one. The column count and types of
3689
3711
  //! the two DataChunks have to match exactly. Throws an exception if there
3690
3712
  //! is not enough space in the chunk and resize is not allowed.
@@ -5422,7 +5444,7 @@ public:
5422
5444
  }
5423
5445
 
5424
5446
  //! The location in the query (if any)
5425
- idx_t query_location = INVALID_INDEX;
5447
+ idx_t query_location = DConstants::INVALID_INDEX;
5426
5448
 
5427
5449
  public:
5428
5450
  bool IsAggregate() const override;
@@ -5491,11 +5513,8 @@ namespace duckdb {
5491
5513
  //! A column of a table.
5492
5514
  class ColumnDefinition {
5493
5515
  public:
5494
- ColumnDefinition(string name, LogicalType type) : name(name), type(type) {
5495
- }
5496
- ColumnDefinition(string name, LogicalType type, unique_ptr<ParsedExpression> default_value)
5497
- : name(name), type(type), default_value(move(default_value)) {
5498
- }
5516
+ DUCKDB_API ColumnDefinition(string name, LogicalType type);
5517
+ DUCKDB_API ColumnDefinition(string name, LogicalType type, unique_ptr<ParsedExpression> default_value);
5499
5518
 
5500
5519
  //! The name of the entry
5501
5520
  string name;
@@ -5509,10 +5528,10 @@ public:
5509
5528
  CompressionType compression_type = CompressionType::COMPRESSION_AUTO;
5510
5529
 
5511
5530
  public:
5512
- ColumnDefinition Copy() const;
5531
+ DUCKDB_API ColumnDefinition Copy() const;
5513
5532
 
5514
- void Serialize(Serializer &serializer) const;
5515
- static ColumnDefinition Deserialize(Deserializer &source);
5533
+ DUCKDB_API void Serialize(Serializer &serializer) const;
5534
+ DUCKDB_API static ColumnDefinition Deserialize(Deserializer &source);
5516
5535
  };
5517
5536
 
5518
5537
  } // namespace duckdb
@@ -5538,24 +5557,11 @@ class TableFunction;
5538
5557
  struct PragmaInfo;
5539
5558
 
5540
5559
  struct FunctionData {
5541
- virtual ~FunctionData() {
5542
- }
5560
+ DUCKDB_API virtual ~FunctionData();
5543
5561
 
5544
- virtual unique_ptr<FunctionData> Copy() {
5545
- throw InternalException("Unimplemented copy for FunctionData");
5546
- };
5547
- virtual bool Equals(FunctionData &other) {
5548
- return true;
5549
- }
5550
- static bool Equals(FunctionData *left, FunctionData *right) {
5551
- if (left == right) {
5552
- return true;
5553
- }
5554
- if (!left || !right) {
5555
- return false;
5556
- }
5557
- return left->Equals(*right);
5558
- }
5562
+ DUCKDB_API virtual unique_ptr<FunctionData> Copy();
5563
+ DUCKDB_API virtual bool Equals(FunctionData &other);
5564
+ DUCKDB_API static bool Equals(FunctionData *left, FunctionData *right);
5559
5565
  };
5560
5566
 
5561
5567
  struct TableFunctionData : public FunctionData {
@@ -5571,10 +5577,8 @@ struct FunctionParameters {
5571
5577
  //! Function is the base class used for any type of function (scalar, aggregate or simple function)
5572
5578
  class Function {
5573
5579
  public:
5574
- explicit Function(string name) : name(name) {
5575
- }
5576
- virtual ~Function() {
5577
- }
5580
+ DUCKDB_API explicit Function(string name);
5581
+ DUCKDB_API virtual ~Function();
5578
5582
 
5579
5583
  //! The name of the function
5580
5584
  string name;
@@ -5590,35 +5594,33 @@ public:
5590
5594
  const unordered_map<string, LogicalType> &named_parameters);
5591
5595
 
5592
5596
  //! Bind a scalar function from the set of functions and input arguments. Returns the index of the chosen function,
5593
- //! returns INVALID_INDEX and sets error if none could be found
5594
- static idx_t BindFunction(const string &name, vector<ScalarFunction> &functions, vector<LogicalType> &arguments,
5595
- string &error);
5596
- static idx_t BindFunction(const string &name, vector<ScalarFunction> &functions,
5597
- vector<unique_ptr<Expression>> &arguments, string &error);
5597
+ //! returns DConstants::INVALID_INDEX and sets error if none could be found
5598
+ DUCKDB_API static idx_t BindFunction(const string &name, vector<ScalarFunction> &functions,
5599
+ vector<LogicalType> &arguments, string &error);
5600
+ DUCKDB_API static idx_t BindFunction(const string &name, vector<ScalarFunction> &functions,
5601
+ vector<unique_ptr<Expression>> &arguments, string &error);
5598
5602
  //! Bind an aggregate function from the set of functions and input arguments. Returns the index of the chosen
5599
- //! function, returns INVALID_INDEX and sets error if none could be found
5600
- static idx_t BindFunction(const string &name, vector<AggregateFunction> &functions, vector<LogicalType> &arguments,
5601
- string &error);
5602
- static idx_t BindFunction(const string &name, vector<AggregateFunction> &functions,
5603
- vector<unique_ptr<Expression>> &arguments, string &error);
5603
+ //! function, returns DConstants::INVALID_INDEX and sets error if none could be found
5604
+ DUCKDB_API static idx_t BindFunction(const string &name, vector<AggregateFunction> &functions,
5605
+ vector<LogicalType> &arguments, string &error);
5606
+ DUCKDB_API static idx_t BindFunction(const string &name, vector<AggregateFunction> &functions,
5607
+ vector<unique_ptr<Expression>> &arguments, string &error);
5604
5608
  //! Bind a table function from the set of functions and input arguments. Returns the index of the chosen
5605
- //! function, returns INVALID_INDEX and sets error if none could be found
5606
- static idx_t BindFunction(const string &name, vector<TableFunction> &functions, vector<LogicalType> &arguments,
5607
- string &error);
5608
- static idx_t BindFunction(const string &name, vector<TableFunction> &functions,
5609
- vector<unique_ptr<Expression>> &arguments, string &error);
5609
+ //! function, returns DConstants::INVALID_INDEX and sets error if none could be found
5610
+ DUCKDB_API static idx_t BindFunction(const string &name, vector<TableFunction> &functions,
5611
+ vector<LogicalType> &arguments, string &error);
5612
+ DUCKDB_API static idx_t BindFunction(const string &name, vector<TableFunction> &functions,
5613
+ vector<unique_ptr<Expression>> &arguments, string &error);
5610
5614
  //! Bind a pragma function from the set of functions and input arguments
5611
- static idx_t BindFunction(const string &name, vector<PragmaFunction> &functions, PragmaInfo &info, string &error);
5615
+ DUCKDB_API static idx_t BindFunction(const string &name, vector<PragmaFunction> &functions, PragmaInfo &info,
5616
+ string &error);
5612
5617
  };
5613
5618
 
5614
5619
  class SimpleFunction : public Function {
5615
5620
  public:
5616
- SimpleFunction(string name, vector<LogicalType> arguments,
5617
- LogicalType varargs = LogicalType(LogicalTypeId::INVALID))
5618
- : Function(name), arguments(move(arguments)), varargs(varargs) {
5619
- }
5620
- ~SimpleFunction() override {
5621
- }
5621
+ DUCKDB_API SimpleFunction(string name, vector<LogicalType> arguments,
5622
+ LogicalType varargs = LogicalType(LogicalTypeId::INVALID));
5623
+ DUCKDB_API ~SimpleFunction() override;
5622
5624
 
5623
5625
  //! The set of arguments of the function
5624
5626
  vector<LogicalType> arguments;
@@ -5627,50 +5629,34 @@ public:
5627
5629
  LogicalType varargs;
5628
5630
 
5629
5631
  public:
5630
- virtual string ToString() {
5631
- return Function::CallToString(name, arguments);
5632
- }
5632
+ DUCKDB_API virtual string ToString();
5633
5633
 
5634
- bool HasVarArgs() const {
5635
- return varargs.id() != LogicalTypeId::INVALID;
5636
- }
5634
+ DUCKDB_API bool HasVarArgs() const;
5637
5635
  };
5638
5636
 
5639
5637
  class SimpleNamedParameterFunction : public SimpleFunction {
5640
5638
  public:
5641
- SimpleNamedParameterFunction(string name, vector<LogicalType> arguments,
5642
- LogicalType varargs = LogicalType(LogicalTypeId::INVALID))
5643
- : SimpleFunction(name, move(arguments), varargs) {
5644
- }
5645
- ~SimpleNamedParameterFunction() override {
5646
- }
5639
+ DUCKDB_API SimpleNamedParameterFunction(string name, vector<LogicalType> arguments,
5640
+ LogicalType varargs = LogicalType(LogicalTypeId::INVALID));
5641
+ DUCKDB_API ~SimpleNamedParameterFunction() override;
5647
5642
 
5648
5643
  //! The named parameters of the function
5649
5644
  unordered_map<string, LogicalType> named_parameters;
5650
5645
 
5651
5646
  public:
5652
- string ToString() override {
5653
- return Function::CallToString(name, arguments, named_parameters);
5654
- }
5655
-
5656
- bool HasNamedParameters() {
5657
- return named_parameters.size() != 0;
5658
- }
5647
+ DUCKDB_API string ToString() override;
5648
+ DUCKDB_API bool HasNamedParameters();
5659
5649
 
5660
- void EvaluateInputParameters(vector<LogicalType> &arguments, vector<Value> &parameters,
5661
- unordered_map<string, Value> &named_parameters,
5662
- vector<unique_ptr<ParsedExpression>> &children);
5650
+ DUCKDB_API void EvaluateInputParameters(vector<LogicalType> &arguments, vector<Value> &parameters,
5651
+ unordered_map<string, Value> &named_parameters,
5652
+ vector<unique_ptr<ParsedExpression>> &children);
5663
5653
  };
5664
5654
 
5665
5655
  class BaseScalarFunction : public SimpleFunction {
5666
5656
  public:
5667
- BaseScalarFunction(string name, vector<LogicalType> arguments, LogicalType return_type, bool has_side_effects,
5668
- LogicalType varargs = LogicalType(LogicalTypeId::INVALID))
5669
- : SimpleFunction(move(name), move(arguments), move(varargs)), return_type(return_type),
5670
- has_side_effects(has_side_effects) {
5671
- }
5672
- ~BaseScalarFunction() override {
5673
- }
5657
+ DUCKDB_API BaseScalarFunction(string name, vector<LogicalType> arguments, LogicalType return_type,
5658
+ bool has_side_effects, LogicalType varargs = LogicalType(LogicalTypeId::INVALID));
5659
+ DUCKDB_API ~BaseScalarFunction() override;
5674
5660
 
5675
5661
  //! Return type of the function
5676
5662
  LogicalType return_type;
@@ -5679,14 +5665,12 @@ public:
5679
5665
  bool has_side_effects;
5680
5666
 
5681
5667
  public:
5682
- hash_t Hash() const;
5668
+ DUCKDB_API hash_t Hash() const;
5683
5669
 
5684
5670
  //! Cast a set of expressions to the arguments of this function
5685
- void CastToFunctionArguments(vector<unique_ptr<Expression>> &children);
5671
+ DUCKDB_API void CastToFunctionArguments(vector<unique_ptr<Expression>> &children);
5686
5672
 
5687
- string ToString() override {
5688
- return Function::CallToString(name, arguments, return_type);
5689
- }
5673
+ DUCKDB_API string ToString() override;
5690
5674
  };
5691
5675
 
5692
5676
  class BuiltinFunctions {
@@ -6050,7 +6034,7 @@ public:
6050
6034
  static string ToString(const interval_t &val);
6051
6035
 
6052
6036
  //! Convert milliseconds to a normalised interval
6053
- static interval_t FromMicro(int64_t micros);
6037
+ DUCKDB_API static interval_t FromMicro(int64_t micros);
6054
6038
 
6055
6039
  //! Get Interval in milliseconds
6056
6040
  static int64_t GetMilli(const interval_t &val);
@@ -6408,23 +6392,17 @@ typedef void (*dependency_function_t)(BoundFunctionExpression &expr, unordered_s
6408
6392
 
6409
6393
  class ScalarFunction : public BaseScalarFunction {
6410
6394
  public:
6411
- ScalarFunction(string name, vector<LogicalType> arguments, LogicalType return_type, scalar_function_t function,
6412
- bool has_side_effects = false, bind_scalar_function_t bind = nullptr,
6413
- dependency_function_t dependency = nullptr, function_statistics_t statistics = nullptr,
6414
- init_local_state_t init_local_state = nullptr,
6415
- LogicalType varargs = LogicalType(LogicalTypeId::INVALID))
6416
- : BaseScalarFunction(name, arguments, return_type, has_side_effects, varargs), function(function), bind(bind),
6417
- init_local_state(init_local_state), dependency(dependency), statistics(statistics) {
6418
- }
6395
+ DUCKDB_API ScalarFunction(string name, vector<LogicalType> arguments, LogicalType return_type,
6396
+ scalar_function_t function, bool has_side_effects = false,
6397
+ bind_scalar_function_t bind = nullptr, dependency_function_t dependency = nullptr,
6398
+ function_statistics_t statistics = nullptr, init_local_state_t init_local_state = nullptr,
6399
+ LogicalType varargs = LogicalType(LogicalTypeId::INVALID));
6419
6400
 
6420
- ScalarFunction(vector<LogicalType> arguments, LogicalType return_type, scalar_function_t function,
6421
- bool has_side_effects = false, bind_scalar_function_t bind = nullptr,
6422
- dependency_function_t dependency = nullptr, function_statistics_t statistics = nullptr,
6423
- init_local_state_t init_local_state = nullptr,
6424
- LogicalType varargs = LogicalType(LogicalTypeId::INVALID))
6425
- : ScalarFunction(string(), arguments, return_type, function, has_side_effects, bind, dependency, statistics,
6426
- init_local_state, varargs) {
6427
- }
6401
+ DUCKDB_API ScalarFunction(vector<LogicalType> arguments, LogicalType return_type, scalar_function_t function,
6402
+ bool has_side_effects = false, bind_scalar_function_t bind = nullptr,
6403
+ dependency_function_t dependency = nullptr, function_statistics_t statistics = nullptr,
6404
+ init_local_state_t init_local_state = nullptr,
6405
+ LogicalType varargs = LogicalType(LogicalTypeId::INVALID));
6428
6406
 
6429
6407
  //! The main scalar function to execute
6430
6408
  scalar_function_t function;
@@ -6432,78 +6410,35 @@ public:
6432
6410
  bind_scalar_function_t bind;
6433
6411
  //! Init thread local state for the function (if any)
6434
6412
  init_local_state_t init_local_state;
6435
- // The dependency function (if any)
6413
+ //! The dependency function (if any)
6436
6414
  dependency_function_t dependency;
6437
6415
  //! The statistics propagation function (if any)
6438
6416
  function_statistics_t statistics;
6439
6417
 
6440
- static unique_ptr<BoundFunctionExpression> BindScalarFunction(ClientContext &context, const string &schema,
6441
- const string &name,
6442
- vector<unique_ptr<Expression>> children,
6443
- string &error, bool is_operator = false);
6444
- static unique_ptr<BoundFunctionExpression> BindScalarFunction(ClientContext &context,
6445
- ScalarFunctionCatalogEntry &function,
6446
- vector<unique_ptr<Expression>> children,
6447
- string &error, bool is_operator = false);
6418
+ DUCKDB_API static unique_ptr<BoundFunctionExpression> BindScalarFunction(ClientContext &context,
6419
+ const string &schema, const string &name,
6420
+ vector<unique_ptr<Expression>> children,
6421
+ string &error, bool is_operator = false);
6422
+ DUCKDB_API static unique_ptr<BoundFunctionExpression> BindScalarFunction(ClientContext &context,
6423
+ ScalarFunctionCatalogEntry &function,
6424
+ vector<unique_ptr<Expression>> children,
6425
+ string &error, bool is_operator = false);
6448
6426
 
6449
- static unique_ptr<BoundFunctionExpression> BindScalarFunction(ClientContext &context, ScalarFunction bound_function,
6450
- vector<unique_ptr<Expression>> children,
6451
- bool is_operator = false);
6427
+ DUCKDB_API static unique_ptr<BoundFunctionExpression> BindScalarFunction(ClientContext &context,
6428
+ ScalarFunction bound_function,
6429
+ vector<unique_ptr<Expression>> children,
6430
+ bool is_operator = false);
6452
6431
 
6453
- bool operator==(const ScalarFunction &rhs) const {
6454
- return CompareScalarFunctionT(rhs.function) && bind == rhs.bind && dependency == rhs.dependency &&
6455
- statistics == rhs.statistics;
6456
- }
6457
- bool operator!=(const ScalarFunction &rhs) const {
6458
- return !(*this == rhs);
6459
- }
6432
+ DUCKDB_API bool operator==(const ScalarFunction &rhs) const;
6433
+ DUCKDB_API bool operator!=(const ScalarFunction &rhs) const;
6460
6434
 
6461
- bool Equal(const ScalarFunction &rhs) const {
6462
- // number of types
6463
- if (this->arguments.size() != rhs.arguments.size()) {
6464
- return false;
6465
- }
6466
- // argument types
6467
- for (idx_t i = 0; i < this->arguments.size(); ++i) {
6468
- if (this->arguments[i] != rhs.arguments[i]) {
6469
- return false;
6470
- }
6471
- }
6472
- // return type
6473
- if (this->return_type != rhs.return_type) {
6474
- return false;
6475
- }
6476
- // varargs
6477
- if (this->varargs != rhs.varargs) {
6478
- return false;
6479
- }
6480
-
6481
- return true; // they are equal
6482
- }
6435
+ DUCKDB_API bool Equal(const ScalarFunction &rhs) const;
6483
6436
 
6484
6437
  private:
6485
- bool CompareScalarFunctionT(const scalar_function_t other) const {
6486
- typedef void(scalar_function_ptr_t)(DataChunk &, ExpressionState &, Vector &);
6487
-
6488
- auto func_ptr = (scalar_function_ptr_t **)function.template target<scalar_function_ptr_t *>();
6489
- auto other_ptr = (scalar_function_ptr_t **)other.template target<scalar_function_ptr_t *>();
6490
-
6491
- // Case the functions were created from lambdas the target will return a nullptr
6492
- if (!func_ptr && !other_ptr) {
6493
- return true;
6494
- }
6495
- if (func_ptr == nullptr || other_ptr == nullptr) {
6496
- // scalar_function_t (std::functions) from lambdas cannot be compared
6497
- return false;
6498
- }
6499
- return ((size_t)*func_ptr == (size_t)*other_ptr);
6500
- }
6438
+ bool CompareScalarFunctionT(const scalar_function_t &other) const;
6501
6439
 
6502
6440
  public:
6503
- static void NopFunction(DataChunk &input, ExpressionState &state, Vector &result) {
6504
- D_ASSERT(input.ColumnCount() >= 1);
6505
- result.Reference(input.data[0]);
6506
- }
6441
+ DUCKDB_API static void NopFunction(DataChunk &input, ExpressionState &state, Vector &result);
6507
6442
 
6508
6443
  template <class TA, class TR, class OP>
6509
6444
  static void UnaryFunction(DataChunk &input, ExpressionState &state, Vector &result) {
@@ -6954,12 +6889,12 @@ public:
6954
6889
 
6955
6890
  template <class STATE, class INPUT_TYPE, class RESULT_TYPE, class OP>
6956
6891
  static void UnaryWindow(Vector &input, FunctionData *bind_data, data_ptr_t state, const FrameBounds &frame,
6957
- const FrameBounds &prev, Vector &result, idx_t rid) {
6892
+ const FrameBounds &prev, Vector &result, idx_t rid, idx_t bias) {
6958
6893
 
6959
- auto idata = FlatVector::GetData<const INPUT_TYPE>(input) - MinValue(frame.first, prev.first);
6894
+ auto idata = FlatVector::GetData<const INPUT_TYPE>(input) - bias;
6960
6895
  const auto &ivalid = FlatVector::Validity(input);
6961
6896
  OP::template Window<STATE, INPUT_TYPE, RESULT_TYPE>(idata, ivalid, bind_data, (STATE *)state, frame, prev,
6962
- result, rid);
6897
+ result, rid, bias);
6963
6898
  }
6964
6899
 
6965
6900
  template <class STATE_TYPE, class OP>
@@ -7059,7 +6994,12 @@ enum class OrderByNullType : uint8_t { INVALID = 0, ORDER_DEFAULT = 1, NULLS_FIR
7059
6994
 
7060
6995
  namespace duckdb {
7061
6996
 
7062
- enum ResultModifierType : uint8_t { LIMIT_MODIFIER = 1, ORDER_MODIFIER = 2, DISTINCT_MODIFIER = 3 };
6997
+ enum ResultModifierType : uint8_t {
6998
+ LIMIT_MODIFIER = 1,
6999
+ ORDER_MODIFIER = 2,
7000
+ DISTINCT_MODIFIER = 3,
7001
+ LIMIT_PERCENT_MODIFIER = 4
7002
+ };
7063
7003
 
7064
7004
  //! A ResultModifier
7065
7005
  class ResultModifier {
@@ -7149,6 +7089,23 @@ public:
7149
7089
  static unique_ptr<ResultModifier> Deserialize(Deserializer &source);
7150
7090
  };
7151
7091
 
7092
+ class LimitPercentModifier : public ResultModifier {
7093
+ public:
7094
+ LimitPercentModifier() : ResultModifier(ResultModifierType::LIMIT_PERCENT_MODIFIER) {
7095
+ }
7096
+
7097
+ //! LIMIT %
7098
+ unique_ptr<ParsedExpression> limit;
7099
+ //! OFFSET
7100
+ unique_ptr<ParsedExpression> offset;
7101
+
7102
+ public:
7103
+ bool Equals(const ResultModifier *other) const override;
7104
+ unique_ptr<ResultModifier> Copy() override;
7105
+ void Serialize(Serializer &serializer) override;
7106
+ static unique_ptr<ResultModifier> Deserialize(Deserializer &source);
7107
+ };
7108
+
7152
7109
  } // namespace duckdb
7153
7110
 
7154
7111
  //===----------------------------------------------------------------------===//
@@ -7343,7 +7300,7 @@ class SQLStatement;
7343
7300
 
7344
7301
  class QueryErrorContext {
7345
7302
  public:
7346
- explicit QueryErrorContext(SQLStatement *statement_ = nullptr, idx_t query_location_ = INVALID_INDEX)
7303
+ explicit QueryErrorContext(SQLStatement *statement_ = nullptr, idx_t query_location_ = DConstants::INVALID_INDEX)
7347
7304
  : statement(statement_), query_location(query_location_) {
7348
7305
  }
7349
7306
 
@@ -7388,6 +7345,7 @@ struct CreateViewInfo;
7388
7345
  struct CreateSequenceInfo;
7389
7346
  struct CreateCollationInfo;
7390
7347
  struct CreateTypeInfo;
7348
+ struct CreateTableInfo;
7391
7349
 
7392
7350
  class ClientContext;
7393
7351
  class Transaction;
@@ -7410,7 +7368,7 @@ struct CatalogEntryLookup {
7410
7368
  SchemaCatalogEntry *schema;
7411
7369
  CatalogEntry *entry;
7412
7370
 
7413
- bool Found() const {
7371
+ DUCKDB_API bool Found() const {
7414
7372
  return entry;
7415
7373
  }
7416
7374
  };
@@ -7424,11 +7382,11 @@ struct SimilarCatalogEntry {
7424
7382
  //! The schema of the entry.
7425
7383
  SchemaCatalogEntry *schema;
7426
7384
 
7427
- bool Found() const {
7385
+ DUCKDB_API bool Found() const {
7428
7386
  return !name.empty();
7429
7387
  }
7430
7388
 
7431
- string GetQualifiedName() const;
7389
+ DUCKDB_API string GetQualifiedName() const;
7432
7390
  };
7433
7391
 
7434
7392
  //! The Catalog object represents the catalog of the database.
@@ -7448,79 +7406,93 @@ public:
7448
7406
 
7449
7407
  public:
7450
7408
  //! Get the ClientContext from the Catalog
7451
- static Catalog &GetCatalog(ClientContext &context);
7452
- static Catalog &GetCatalog(DatabaseInstance &db);
7409
+ DUCKDB_API static Catalog &GetCatalog(ClientContext &context);
7410
+ DUCKDB_API static Catalog &GetCatalog(DatabaseInstance &db);
7453
7411
 
7454
- DependencyManager &GetDependencyManager() {
7412
+ DUCKDB_API DependencyManager &GetDependencyManager() {
7455
7413
  return *dependency_manager;
7456
7414
  }
7457
7415
 
7458
7416
  //! Returns the current version of the catalog (incremented whenever anything changes, not stored between restarts)
7459
- idx_t GetCatalogVersion();
7417
+ DUCKDB_API idx_t GetCatalogVersion();
7460
7418
  //! Trigger a modification in the catalog, increasing the catalog version and returning the previous version
7461
- idx_t ModifyCatalog();
7419
+ DUCKDB_API idx_t ModifyCatalog();
7462
7420
 
7463
7421
  //! Creates a schema in the catalog.
7464
- CatalogEntry *CreateSchema(ClientContext &context, CreateSchemaInfo *info);
7422
+ DUCKDB_API CatalogEntry *CreateSchema(ClientContext &context, CreateSchemaInfo *info);
7465
7423
  //! Creates a table in the catalog.
7466
- CatalogEntry *CreateTable(ClientContext &context, BoundCreateTableInfo *info);
7424
+ DUCKDB_API CatalogEntry *CreateTable(ClientContext &context, BoundCreateTableInfo *info);
7425
+ //! Creates a table in the catalog.
7426
+ DUCKDB_API CatalogEntry *CreateTable(ClientContext &context, unique_ptr<CreateTableInfo> info);
7467
7427
  //! Create a table function in the catalog
7468
- CatalogEntry *CreateTableFunction(ClientContext &context, CreateTableFunctionInfo *info);
7428
+ DUCKDB_API CatalogEntry *CreateTableFunction(ClientContext &context, CreateTableFunctionInfo *info);
7469
7429
  //! Create a copy function in the catalog
7470
- CatalogEntry *CreateCopyFunction(ClientContext &context, CreateCopyFunctionInfo *info);
7430
+ DUCKDB_API CatalogEntry *CreateCopyFunction(ClientContext &context, CreateCopyFunctionInfo *info);
7471
7431
  //! Create a pragma function in the catalog
7472
- CatalogEntry *CreatePragmaFunction(ClientContext &context, CreatePragmaFunctionInfo *info);
7432
+ DUCKDB_API CatalogEntry *CreatePragmaFunction(ClientContext &context, CreatePragmaFunctionInfo *info);
7473
7433
  //! Create a scalar or aggregate function in the catalog
7474
- CatalogEntry *CreateFunction(ClientContext &context, CreateFunctionInfo *info);
7434
+ DUCKDB_API CatalogEntry *CreateFunction(ClientContext &context, CreateFunctionInfo *info);
7475
7435
  //! Creates a table in the catalog.
7476
- CatalogEntry *CreateView(ClientContext &context, CreateViewInfo *info);
7436
+ DUCKDB_API CatalogEntry *CreateView(ClientContext &context, CreateViewInfo *info);
7477
7437
  //! Creates a table in the catalog.
7478
- CatalogEntry *CreateSequence(ClientContext &context, CreateSequenceInfo *info);
7438
+ DUCKDB_API CatalogEntry *CreateSequence(ClientContext &context, CreateSequenceInfo *info);
7479
7439
  //! Creates a Enum in the catalog.
7480
- CatalogEntry *CreateType(ClientContext &context, CreateTypeInfo *info);
7440
+ DUCKDB_API CatalogEntry *CreateType(ClientContext &context, CreateTypeInfo *info);
7481
7441
  //! Creates a collation in the catalog
7482
- CatalogEntry *CreateCollation(ClientContext &context, CreateCollationInfo *info);
7442
+ DUCKDB_API CatalogEntry *CreateCollation(ClientContext &context, CreateCollationInfo *info);
7483
7443
 
7484
7444
  //! Creates a table in the catalog.
7485
- CatalogEntry *CreateTable(ClientContext &context, SchemaCatalogEntry *schema, BoundCreateTableInfo *info);
7445
+ DUCKDB_API CatalogEntry *CreateTable(ClientContext &context, SchemaCatalogEntry *schema,
7446
+ BoundCreateTableInfo *info);
7486
7447
  //! Create a table function in the catalog
7487
- CatalogEntry *CreateTableFunction(ClientContext &context, SchemaCatalogEntry *schema,
7488
- CreateTableFunctionInfo *info);
7448
+ DUCKDB_API CatalogEntry *CreateTableFunction(ClientContext &context, SchemaCatalogEntry *schema,
7449
+ CreateTableFunctionInfo *info);
7489
7450
  //! Create a copy function in the catalog
7490
- CatalogEntry *CreateCopyFunction(ClientContext &context, SchemaCatalogEntry *schema, CreateCopyFunctionInfo *info);
7451
+ DUCKDB_API CatalogEntry *CreateCopyFunction(ClientContext &context, SchemaCatalogEntry *schema,
7452
+ CreateCopyFunctionInfo *info);
7491
7453
  //! Create a pragma function in the catalog
7492
- CatalogEntry *CreatePragmaFunction(ClientContext &context, SchemaCatalogEntry *schema,
7493
- CreatePragmaFunctionInfo *info);
7454
+ DUCKDB_API CatalogEntry *CreatePragmaFunction(ClientContext &context, SchemaCatalogEntry *schema,
7455
+ CreatePragmaFunctionInfo *info);
7494
7456
  //! Create a scalar or aggregate function in the catalog
7495
- CatalogEntry *CreateFunction(ClientContext &context, SchemaCatalogEntry *schema, CreateFunctionInfo *info);
7457
+ DUCKDB_API CatalogEntry *CreateFunction(ClientContext &context, SchemaCatalogEntry *schema,
7458
+ CreateFunctionInfo *info);
7496
7459
  //! Creates a table in the catalog.
7497
- CatalogEntry *CreateView(ClientContext &context, SchemaCatalogEntry *schema, CreateViewInfo *info);
7460
+ DUCKDB_API CatalogEntry *CreateView(ClientContext &context, SchemaCatalogEntry *schema, CreateViewInfo *info);
7498
7461
  //! Creates a table in the catalog.
7499
- CatalogEntry *CreateSequence(ClientContext &context, SchemaCatalogEntry *schema, CreateSequenceInfo *info);
7462
+ DUCKDB_API CatalogEntry *CreateSequence(ClientContext &context, SchemaCatalogEntry *schema,
7463
+ CreateSequenceInfo *info);
7500
7464
  //! Creates a enum in the catalog.
7501
- CatalogEntry *CreateType(ClientContext &context, SchemaCatalogEntry *schema, CreateTypeInfo *info);
7465
+ DUCKDB_API CatalogEntry *CreateType(ClientContext &context, SchemaCatalogEntry *schema, CreateTypeInfo *info);
7502
7466
  //! Creates a collation in the catalog
7503
- CatalogEntry *CreateCollation(ClientContext &context, SchemaCatalogEntry *schema, CreateCollationInfo *info);
7467
+ DUCKDB_API CatalogEntry *CreateCollation(ClientContext &context, SchemaCatalogEntry *schema,
7468
+ CreateCollationInfo *info);
7504
7469
 
7505
7470
  //! Drops an entry from the catalog
7506
- void DropEntry(ClientContext &context, DropInfo *info);
7471
+ DUCKDB_API void DropEntry(ClientContext &context, DropInfo *info);
7507
7472
 
7508
7473
  //! Returns the schema object with the specified name, or throws an exception if it does not exist
7509
- SchemaCatalogEntry *GetSchema(ClientContext &context, const string &name = DEFAULT_SCHEMA, bool if_exists = false,
7510
- QueryErrorContext error_context = QueryErrorContext());
7474
+ DUCKDB_API SchemaCatalogEntry *GetSchema(ClientContext &context, const string &name = DEFAULT_SCHEMA,
7475
+ bool if_exists = false,
7476
+ QueryErrorContext error_context = QueryErrorContext());
7511
7477
  //! Scans all the schemas in the system one-by-one, invoking the callback for each entry
7512
- void ScanSchemas(ClientContext &context, std::function<void(CatalogEntry *)> callback);
7478
+ DUCKDB_API void ScanSchemas(ClientContext &context, std::function<void(CatalogEntry *)> callback);
7513
7479
  //! Gets the "schema.name" entry of the specified type, if if_exists=true returns nullptr if entry does not exist,
7514
7480
  //! otherwise an exception is thrown
7515
- CatalogEntry *GetEntry(ClientContext &context, CatalogType type, const string &schema, const string &name,
7516
- bool if_exists = false, QueryErrorContext error_context = QueryErrorContext());
7481
+ DUCKDB_API CatalogEntry *GetEntry(ClientContext &context, CatalogType type, const string &schema,
7482
+ const string &name, bool if_exists = false,
7483
+ QueryErrorContext error_context = QueryErrorContext());
7517
7484
 
7518
7485
  template <class T>
7519
7486
  T *GetEntry(ClientContext &context, const string &schema_name, const string &name, bool if_exists = false,
7520
7487
  QueryErrorContext error_context = QueryErrorContext());
7521
7488
 
7489
+ //! Append a scalar or aggregate function to the catalog
7490
+ DUCKDB_API CatalogEntry *AddFunction(ClientContext &context, CreateFunctionInfo *info);
7491
+ //! Append a scalar or aggregate function to the catalog
7492
+ DUCKDB_API CatalogEntry *AddFunction(ClientContext &context, SchemaCatalogEntry *schema, CreateFunctionInfo *info);
7493
+
7522
7494
  //! Alter an existing entry in the catalog.
7523
- void Alter(ClientContext &context, AlterInfo *info);
7495
+ DUCKDB_API void Alter(ClientContext &context, AlterInfo *info);
7524
7496
 
7525
7497
  private:
7526
7498
  //! The catalog version, incremented whenever anything changes in the catalog
@@ -7544,26 +7516,30 @@ private:
7544
7516
  };
7545
7517
 
7546
7518
  template <>
7547
- TableCatalogEntry *Catalog::GetEntry(ClientContext &context, const string &schema_name, const string &name,
7548
- bool if_exists, QueryErrorContext error_context);
7519
+ DUCKDB_API TableCatalogEntry *Catalog::GetEntry(ClientContext &context, const string &schema_name, const string &name,
7520
+ bool if_exists, QueryErrorContext error_context);
7549
7521
  template <>
7550
- SequenceCatalogEntry *Catalog::GetEntry(ClientContext &context, const string &schema_name, const string &name,
7551
- bool if_exists, QueryErrorContext error_context);
7522
+ DUCKDB_API SequenceCatalogEntry *Catalog::GetEntry(ClientContext &context, const string &schema_name,
7523
+ const string &name, bool if_exists, QueryErrorContext error_context);
7552
7524
  template <>
7553
- TableFunctionCatalogEntry *Catalog::GetEntry(ClientContext &context, const string &schema_name, const string &name,
7554
- bool if_exists, QueryErrorContext error_context);
7525
+ DUCKDB_API TableFunctionCatalogEntry *Catalog::GetEntry(ClientContext &context, const string &schema_name,
7526
+ const string &name, bool if_exists,
7527
+ QueryErrorContext error_context);
7555
7528
  template <>
7556
- CopyFunctionCatalogEntry *Catalog::GetEntry(ClientContext &context, const string &schema_name, const string &name,
7557
- bool if_exists, QueryErrorContext error_context);
7529
+ DUCKDB_API CopyFunctionCatalogEntry *Catalog::GetEntry(ClientContext &context, const string &schema_name,
7530
+ const string &name, bool if_exists,
7531
+ QueryErrorContext error_context);
7558
7532
  template <>
7559
- PragmaFunctionCatalogEntry *Catalog::GetEntry(ClientContext &context, const string &schema_name, const string &name,
7560
- bool if_exists, QueryErrorContext error_context);
7533
+ DUCKDB_API PragmaFunctionCatalogEntry *Catalog::GetEntry(ClientContext &context, const string &schema_name,
7534
+ const string &name, bool if_exists,
7535
+ QueryErrorContext error_context);
7561
7536
  template <>
7562
- AggregateFunctionCatalogEntry *Catalog::GetEntry(ClientContext &context, const string &schema_name, const string &name,
7563
- bool if_exists, QueryErrorContext error_context);
7537
+ DUCKDB_API AggregateFunctionCatalogEntry *Catalog::GetEntry(ClientContext &context, const string &schema_name,
7538
+ const string &name, bool if_exists,
7539
+ QueryErrorContext error_context);
7564
7540
  template <>
7565
- CollateCatalogEntry *Catalog::GetEntry(ClientContext &context, const string &schema_name, const string &name,
7566
- bool if_exists, QueryErrorContext error_context);
7541
+ DUCKDB_API CollateCatalogEntry *Catalog::GetEntry(ClientContext &context, const string &schema_name, const string &name,
7542
+ bool if_exists, QueryErrorContext error_context);
7567
7543
 
7568
7544
  } // namespace duckdb
7569
7545
 
@@ -7598,6 +7574,7 @@ enum class LogicalOperatorType : uint8_t {
7598
7574
  LOGICAL_COPY_TO_FILE = 10,
7599
7575
  LOGICAL_DISTINCT = 11,
7600
7576
  LOGICAL_SAMPLE = 12,
7577
+ LOGICAL_LIMIT_PERCENT = 13,
7601
7578
 
7602
7579
  // -----------------------------
7603
7580
  // Data sources
@@ -7928,7 +7905,7 @@ struct ColumnBinding {
7928
7905
  idx_t table_index;
7929
7906
  idx_t column_index;
7930
7907
 
7931
- ColumnBinding() : table_index(INVALID_INDEX), column_index(INVALID_INDEX) {
7908
+ ColumnBinding() : table_index(DConstants::INVALID_INDEX), column_index(DConstants::INVALID_INDEX) {
7932
7909
  }
7933
7910
  ColumnBinding(idx_t table, idx_t column) : table_index(table), column_index(column) {
7934
7911
  }
@@ -7982,7 +7959,7 @@ public:
7982
7959
 
7983
7960
  virtual string GetName() const;
7984
7961
  virtual string ParamsToString() const;
7985
- virtual string ToString(idx_t depth = 0) const;
7962
+ virtual string ToString() const;
7986
7963
  void Print();
7987
7964
  //! Debug method: verify that the integrity of expressions & child nodes are maintained
7988
7965
  virtual void Verify();
@@ -8089,6 +8066,20 @@ public:
8089
8066
  vector<unique_ptr<Expression>> target_distincts;
8090
8067
  };
8091
8068
 
8069
+ class BoundLimitPercentModifier : public BoundResultModifier {
8070
+ public:
8071
+ BoundLimitPercentModifier() : BoundResultModifier(ResultModifierType::LIMIT_PERCENT_MODIFIER) {
8072
+ }
8073
+ //! LIMIT %
8074
+ double limit_percent = 100.0;
8075
+ //! OFFSET
8076
+ int64_t offset_val = 0;
8077
+ //! Expression in case limit is not constant
8078
+ unique_ptr<Expression> limit;
8079
+ //! Expression in case limit is not constant
8080
+ unique_ptr<Expression> offset;
8081
+ };
8082
+
8092
8083
  } // namespace duckdb
8093
8084
 
8094
8085
 
@@ -8126,26 +8117,29 @@ typedef void (*aggregate_simple_update_t)(Vector inputs[], FunctionData *bind_da
8126
8117
  //! The type used for updating complex windowed aggregate functions (optional)
8127
8118
  typedef std::pair<idx_t, idx_t> FrameBounds;
8128
8119
  typedef void (*aggregate_window_t)(Vector inputs[], FunctionData *bind_data, idx_t input_count, data_ptr_t state,
8129
- const FrameBounds &frame, const FrameBounds &prev, Vector &result, idx_t offset);
8120
+ const FrameBounds &frame, const FrameBounds &prev, Vector &result, idx_t rid,
8121
+ idx_t bias);
8130
8122
 
8131
8123
  class AggregateFunction : public BaseScalarFunction {
8132
8124
  public:
8133
- AggregateFunction(const string &name, const vector<LogicalType> &arguments, const LogicalType &return_type,
8134
- aggregate_size_t state_size, aggregate_initialize_t initialize, aggregate_update_t update,
8135
- aggregate_combine_t combine, aggregate_finalize_t finalize,
8136
- aggregate_simple_update_t simple_update = nullptr, bind_aggregate_function_t bind = nullptr,
8137
- aggregate_destructor_t destructor = nullptr, aggregate_statistics_t statistics = nullptr,
8138
- aggregate_window_t window = nullptr)
8125
+ DUCKDB_API AggregateFunction(const string &name, const vector<LogicalType> &arguments,
8126
+ const LogicalType &return_type, aggregate_size_t state_size,
8127
+ aggregate_initialize_t initialize, aggregate_update_t update,
8128
+ aggregate_combine_t combine, aggregate_finalize_t finalize,
8129
+ aggregate_simple_update_t simple_update = nullptr,
8130
+ bind_aggregate_function_t bind = nullptr, aggregate_destructor_t destructor = nullptr,
8131
+ aggregate_statistics_t statistics = nullptr, aggregate_window_t window = nullptr)
8139
8132
  : BaseScalarFunction(name, arguments, return_type, false), state_size(state_size), initialize(initialize),
8140
8133
  update(update), combine(combine), finalize(finalize), simple_update(simple_update), window(window),
8141
8134
  bind(bind), destructor(destructor), statistics(statistics) {
8142
8135
  }
8143
8136
 
8144
- AggregateFunction(const vector<LogicalType> &arguments, const LogicalType &return_type, aggregate_size_t state_size,
8145
- aggregate_initialize_t initialize, aggregate_update_t update, aggregate_combine_t combine,
8146
- aggregate_finalize_t finalize, aggregate_simple_update_t simple_update = nullptr,
8147
- bind_aggregate_function_t bind = nullptr, aggregate_destructor_t destructor = nullptr,
8148
- aggregate_statistics_t statistics = nullptr, aggregate_window_t window = nullptr)
8137
+ DUCKDB_API AggregateFunction(const vector<LogicalType> &arguments, const LogicalType &return_type,
8138
+ aggregate_size_t state_size, aggregate_initialize_t initialize,
8139
+ aggregate_update_t update, aggregate_combine_t combine, aggregate_finalize_t finalize,
8140
+ aggregate_simple_update_t simple_update = nullptr,
8141
+ bind_aggregate_function_t bind = nullptr, aggregate_destructor_t destructor = nullptr,
8142
+ aggregate_statistics_t statistics = nullptr, aggregate_window_t window = nullptr)
8149
8143
  : AggregateFunction(string(), arguments, return_type, state_size, initialize, update, combine, finalize,
8150
8144
  simple_update, bind, destructor, statistics, window) {
8151
8145
  }
@@ -8173,23 +8167,23 @@ public:
8173
8167
  //! The statistics propagation function (may be null)
8174
8168
  aggregate_statistics_t statistics;
8175
8169
 
8176
- bool operator==(const AggregateFunction &rhs) const {
8170
+ DUCKDB_API bool operator==(const AggregateFunction &rhs) const {
8177
8171
  return state_size == rhs.state_size && initialize == rhs.initialize && update == rhs.update &&
8178
8172
  combine == rhs.combine && finalize == rhs.finalize && window == rhs.window;
8179
8173
  }
8180
- bool operator!=(const AggregateFunction &rhs) const {
8174
+ DUCKDB_API bool operator!=(const AggregateFunction &rhs) const {
8181
8175
  return !(*this == rhs);
8182
8176
  }
8183
8177
 
8184
- static unique_ptr<BoundAggregateExpression>
8178
+ DUCKDB_API static unique_ptr<BoundAggregateExpression>
8185
8179
  BindAggregateFunction(ClientContext &context, AggregateFunction bound_function,
8186
8180
  vector<unique_ptr<Expression>> children, unique_ptr<Expression> filter = nullptr,
8187
8181
  bool is_distinct = false, unique_ptr<BoundOrderModifier> order_bys = nullptr);
8188
8182
 
8189
- static unique_ptr<FunctionData> BindSortedAggregate(AggregateFunction &bound_function,
8190
- vector<unique_ptr<Expression>> &children,
8191
- unique_ptr<FunctionData> bind_info,
8192
- unique_ptr<BoundOrderModifier> order_bys);
8183
+ DUCKDB_API static unique_ptr<FunctionData> BindSortedAggregate(AggregateFunction &bound_function,
8184
+ vector<unique_ptr<Expression>> &children,
8185
+ unique_ptr<FunctionData> bind_info,
8186
+ unique_ptr<BoundOrderModifier> order_bys);
8193
8187
 
8194
8188
  public:
8195
8189
  template <class STATE, class RESULT_TYPE, class OP>
@@ -8268,10 +8262,10 @@ public:
8268
8262
 
8269
8263
  template <class STATE, class INPUT_TYPE, class RESULT_TYPE, class OP>
8270
8264
  static void UnaryWindow(Vector inputs[], FunctionData *bind_data, idx_t input_count, data_ptr_t state,
8271
- const FrameBounds &frame, const FrameBounds &prev, Vector &result, idx_t rid) {
8265
+ const FrameBounds &frame, const FrameBounds &prev, Vector &result, idx_t rid, idx_t bias) {
8272
8266
  D_ASSERT(input_count == 1);
8273
8267
  AggregateExecutor::UnaryWindow<STATE, INPUT_TYPE, RESULT_TYPE, OP>(inputs[0], bind_data, state, frame, prev,
8274
- result, rid);
8268
+ result, rid, bias);
8275
8269
  }
8276
8270
 
8277
8271
  template <class STATE, class A_TYPE, class B_TYPE, class OP>
@@ -8592,7 +8586,7 @@ private:
8592
8586
  }
8593
8587
 
8594
8588
  template <typename T>
8595
- static bool TypesMatch(LogicalType sql_type) {
8589
+ static bool TypesMatch(const LogicalType &sql_type) {
8596
8590
  switch (sql_type.id()) {
8597
8591
  case LogicalTypeId::BOOLEAN:
8598
8592
  return std::is_same<T, bool>();
@@ -8605,13 +8599,16 @@ private:
8605
8599
  case LogicalTypeId::BIGINT:
8606
8600
  return std::is_same<T, int64_t>();
8607
8601
  case LogicalTypeId::DATE:
8602
+ case LogicalTypeId::DATE_TZ:
8608
8603
  return std::is_same<T, date_t>();
8609
8604
  case LogicalTypeId::TIME:
8605
+ case LogicalTypeId::TIME_TZ:
8610
8606
  return std::is_same<T, dtime_t>();
8611
8607
  case LogicalTypeId::TIMESTAMP:
8612
8608
  case LogicalTypeId::TIMESTAMP_MS:
8613
8609
  case LogicalTypeId::TIMESTAMP_NS:
8614
8610
  case LogicalTypeId::TIMESTAMP_SEC:
8611
+ case LogicalTypeId::TIMESTAMP_TZ:
8615
8612
  return std::is_same<T, timestamp_t>();
8616
8613
  case LogicalTypeId::FLOAT:
8617
8614
  return std::is_same<T, float>();
@@ -9464,11 +9461,13 @@ namespace duckdb {
9464
9461
  class Printer {
9465
9462
  public:
9466
9463
  //! Print the object to stderr
9467
- static void Print(const string &str);
9464
+ DUCKDB_API static void Print(const string &str);
9468
9465
  //! Prints Progress
9469
- static void PrintProgress(int percentage, const char *pbstr, int pbwidth);
9466
+ DUCKDB_API static void PrintProgress(int percentage, const char *pbstr, int pbwidth);
9470
9467
  //! Prints an empty line when progress bar is done
9471
- static void FinishProgressBarPrint(const char *pbstr, int pbwidth);
9468
+ DUCKDB_API static void FinishProgressBarPrint(const char *pbstr, int pbwidth);
9469
+ //! Whether or not we are printing to a terminal
9470
+ DUCKDB_API static bool IsTerminal();
9472
9471
  };
9473
9472
  } // namespace duckdb
9474
9473
 
@@ -9830,16 +9829,16 @@ namespace duckdb {
9830
9829
  */
9831
9830
  class StringUtil {
9832
9831
  public:
9833
- static bool CharacterIsSpace(char c) {
9832
+ DUCKDB_API static bool CharacterIsSpace(char c) {
9834
9833
  return c == ' ' || c == '\t' || c == '\n' || c == '\v' || c == '\f' || c == '\r';
9835
9834
  }
9836
- static bool CharacterIsNewline(char c) {
9835
+ DUCKDB_API static bool CharacterIsNewline(char c) {
9837
9836
  return c == '\n' || c == '\r';
9838
9837
  }
9839
- static bool CharacterIsDigit(char c) {
9838
+ DUCKDB_API static bool CharacterIsDigit(char c) {
9840
9839
  return c >= '0' && c <= '9';
9841
9840
  }
9842
- static char CharacterToLower(char c) {
9841
+ DUCKDB_API static char CharacterToLower(char c) {
9843
9842
  if (c >= 'A' && c <= 'Z') {
9844
9843
  return c - ('A' - 'a');
9845
9844
  }
@@ -9847,25 +9846,25 @@ public:
9847
9846
  }
9848
9847
 
9849
9848
  //! Returns true if the needle string exists in the haystack
9850
- static bool Contains(const string &haystack, const string &needle);
9849
+ DUCKDB_API static bool Contains(const string &haystack, const string &needle);
9851
9850
 
9852
9851
  //! Returns true if the target string starts with the given prefix
9853
- static bool StartsWith(string str, string prefix);
9852
+ DUCKDB_API static bool StartsWith(string str, string prefix);
9854
9853
 
9855
9854
  //! Returns true if the target string <b>ends</b> with the given suffix.
9856
- static bool EndsWith(const string &str, const string &suffix);
9855
+ DUCKDB_API static bool EndsWith(const string &str, const string &suffix);
9857
9856
 
9858
9857
  //! Repeat a string multiple times
9859
- static string Repeat(const string &str, const idx_t n);
9858
+ DUCKDB_API static string Repeat(const string &str, const idx_t n);
9860
9859
 
9861
9860
  //! Split the input string based on newline char
9862
- static vector<string> Split(const string &str, char delimiter);
9861
+ DUCKDB_API static vector<string> Split(const string &str, char delimiter);
9863
9862
 
9864
9863
  //! Split the input string allong a quote. Note that any escaping is NOT supported.
9865
- static vector<string> SplitWithQuote(const string &str, char delimiter = ',', char quote = '"');
9864
+ DUCKDB_API static vector<string> SplitWithQuote(const string &str, char delimiter = ',', char quote = '"');
9866
9865
 
9867
9866
  //! Join multiple strings into one string. Components are concatenated by the given separator
9868
- static string Join(const vector<string> &input, const string &separator);
9867
+ DUCKDB_API static string Join(const vector<string> &input, const string &separator);
9869
9868
 
9870
9869
  //! Join multiple items of container with given size, transformed to string
9871
9870
  //! using function, into one string using the given separator
@@ -9889,13 +9888,13 @@ public:
9889
9888
  }
9890
9889
 
9891
9890
  //! Return a string that formats the give number of bytes
9892
- static string BytesToHumanReadableString(idx_t bytes);
9891
+ DUCKDB_API static string BytesToHumanReadableString(idx_t bytes);
9893
9892
 
9894
9893
  //! Convert a string to uppercase
9895
- static string Upper(const string &str);
9894
+ DUCKDB_API static string Upper(const string &str);
9896
9895
 
9897
9896
  //! Convert a string to lowercase
9898
- static string Lower(const string &str);
9897
+ DUCKDB_API static string Lower(const string &str);
9899
9898
 
9900
9899
  //! Format a string using printf semantics
9901
9900
  template <typename... Args>
@@ -9904,30 +9903,38 @@ public:
9904
9903
  }
9905
9904
 
9906
9905
  //! Split the input string into a vector of strings based on the split string
9907
- static vector<string> Split(const string &input, const string &split);
9906
+ DUCKDB_API static vector<string> Split(const string &input, const string &split);
9908
9907
 
9909
9908
  //! Remove the whitespace char in the left end of the string
9910
- static void LTrim(string &str);
9909
+ DUCKDB_API static void LTrim(string &str);
9911
9910
  //! Remove the whitespace char in the right end of the string
9912
- static void RTrim(string &str);
9911
+ DUCKDB_API static void RTrim(string &str);
9913
9912
  //! Remove the whitespace char in the left and right end of the string
9914
- static void Trim(string &str);
9913
+ DUCKDB_API static void Trim(string &str);
9915
9914
 
9916
- static string Replace(string source, const string &from, const string &to);
9915
+ DUCKDB_API static string Replace(string source, const string &from, const string &to);
9917
9916
 
9918
9917
  //! Get the levenshtein distance from two strings
9919
- static idx_t LevenshteinDistance(const string &s1, const string &s2);
9918
+ DUCKDB_API static idx_t LevenshteinDistance(const string &s1, const string &s2);
9920
9919
 
9921
9920
  //! Get the top-n strings (sorted by the given score distance) from a set of scores.
9922
9921
  //! At least one entry is returned (if there is one).
9923
9922
  //! Strings are only returned if they have a score less than the threshold.
9924
- static vector<string> TopNStrings(vector<std::pair<string, idx_t>> scores, idx_t n = 5, idx_t threshold = 5);
9923
+ DUCKDB_API static vector<string> TopNStrings(vector<std::pair<string, idx_t>> scores, idx_t n = 5,
9924
+ idx_t threshold = 5);
9925
9925
  //! Computes the levenshtein distance of each string in strings, and compares it to target, then returns TopNStrings
9926
9926
  //! with the given params.
9927
- static vector<string> TopNLevenshtein(const vector<string> &strings, const string &target, idx_t n = 5,
9928
- idx_t threshold = 5);
9929
- static string CandidatesMessage(const vector<string> &candidates, const string &candidate = "Candidate bindings");
9927
+ DUCKDB_API static vector<string> TopNLevenshtein(const vector<string> &strings, const string &target, idx_t n = 5,
9928
+ idx_t threshold = 5);
9929
+ DUCKDB_API static string CandidatesMessage(const vector<string> &candidates,
9930
+ const string &candidate = "Candidate bindings");
9931
+
9932
+ //! Generate an error message in the form of "{message_prefix}: nearest_string, nearest_string2, ...
9933
+ //! Equivalent to calling TopNLevenshtein followed by CandidatesMessage
9934
+ DUCKDB_API static string CandidatesErrorMessage(const vector<string> &strings, const string &target,
9935
+ const string &message_prefix, idx_t n = 5);
9930
9936
  };
9937
+
9931
9938
  } // namespace duckdb
9932
9939
 
9933
9940
 
@@ -10040,6 +10047,7 @@ enum class OptimizerType : uint32_t {
10040
10047
  };
10041
10048
 
10042
10049
  string OptimizerTypeToString(OptimizerType type);
10050
+ OptimizerType OptimizerTypeFromString(const string &str);
10043
10051
 
10044
10052
  } // namespace duckdb
10045
10053
 
@@ -10068,6 +10076,29 @@ enum class WindowAggregationMode : uint32_t {
10068
10076
 
10069
10077
  } // namespace duckdb
10070
10078
 
10079
+ //===----------------------------------------------------------------------===//
10080
+ // DuckDB
10081
+ //
10082
+ // duckdb/common/enums/set_scope.hpp
10083
+ //
10084
+ //
10085
+ //===----------------------------------------------------------------------===//
10086
+
10087
+
10088
+
10089
+
10090
+
10091
+ namespace duckdb {
10092
+
10093
+ enum class SetScope : uint8_t {
10094
+ AUTOMATIC = 0,
10095
+ LOCAL = 1, /* unused */
10096
+ SESSION = 2,
10097
+ GLOBAL = 3
10098
+ };
10099
+
10100
+ } // namespace duckdb
10101
+
10071
10102
 
10072
10103
  namespace duckdb {
10073
10104
  class ClientContext;
@@ -10075,6 +10106,7 @@ class TableFunctionRef;
10075
10106
  class CompressionFunction;
10076
10107
 
10077
10108
  struct CompressionFunctionSet;
10109
+ struct DBConfig;
10078
10110
 
10079
10111
  enum class AccessMode : uint8_t { UNDEFINED = 0, AUTOMATIC = 1, READ_ONLY = 2, READ_WRITE = 3 };
10080
10112
 
@@ -10085,25 +10117,31 @@ enum class CheckpointAbort : uint8_t {
10085
10117
  DEBUG_ABORT_AFTER_FREE_LIST_WRITE = 3
10086
10118
  };
10087
10119
 
10088
- enum class ConfigurationOptionType : uint32_t {
10089
- INVALID = 0,
10090
- ACCESS_MODE,
10091
- DEFAULT_ORDER_TYPE,
10092
- DEFAULT_NULL_ORDER,
10093
- ENABLE_EXTERNAL_ACCESS,
10094
- ENABLE_OBJECT_CACHE,
10095
- MAXIMUM_MEMORY,
10096
- THREADS
10097
- };
10120
+ typedef void (*set_global_function_t)(DatabaseInstance *db, DBConfig &config, const Value &parameter);
10121
+ typedef void (*set_local_function_t)(ClientContext &context, const Value &parameter);
10122
+ typedef Value (*get_setting_function_t)(ClientContext &context);
10098
10123
 
10099
10124
  struct ConfigurationOption {
10100
- ConfigurationOptionType type;
10101
10125
  const char *name;
10102
10126
  const char *description;
10103
10127
  LogicalTypeId parameter_type;
10128
+ set_global_function_t set_global;
10129
+ set_local_function_t set_local;
10130
+ get_setting_function_t get_setting;
10131
+ };
10132
+
10133
+ typedef void (*set_option_callback_t)(ClientContext &context, SetScope scope, Value &parameter);
10134
+
10135
+ struct ExtensionOption {
10136
+ ExtensionOption(string description_p, LogicalType type_p, set_option_callback_t set_function_p)
10137
+ : description(move(description_p)), type(move(type_p)), set_function(set_function_p) {
10138
+ }
10139
+
10140
+ string description;
10141
+ LogicalType type;
10142
+ set_option_callback_t set_function;
10104
10143
  };
10105
10144
 
10106
- // this is optional and only used in tests at the moment
10107
10145
  struct DBConfig {
10108
10146
  friend class DatabaseInstance;
10109
10147
  friend class StorageManager;
@@ -10143,8 +10181,6 @@ public:
10143
10181
  bool enable_external_access = true;
10144
10182
  //! Whether or not object cache is used
10145
10183
  bool object_cache_enable = false;
10146
- //! Database configuration variables as controlled by SET
10147
- case_insensitive_map_t<Value> set_variables;
10148
10184
  //! Force checkpoint when CHECKPOINT is called or on shutdown, even if no changes have been made
10149
10185
  bool force_checkpoint = false;
10150
10186
  //! Run a checkpoint on successful shutdown and delete the WAL, to leave only a single database file behind
@@ -10165,6 +10201,14 @@ public:
10165
10201
  //! Debug setting for window aggregation mode: (window, combine, separate)
10166
10202
  WindowAggregationMode window_mode = WindowAggregationMode::WINDOW;
10167
10203
 
10204
+ //! Extra parameters that can be SET for loaded extensions
10205
+ case_insensitive_map_t<ExtensionOption> extension_parameters;
10206
+ //! Database configuration variables as controlled by SET
10207
+ case_insensitive_map_t<Value> set_variables;
10208
+
10209
+ DUCKDB_API void AddExtensionOption(string name, string description, LogicalType parameter,
10210
+ set_option_callback_t function = nullptr);
10211
+
10168
10212
  public:
10169
10213
  DUCKDB_API static DBConfig &GetConfig(ClientContext &context);
10170
10214
  DUCKDB_API static DBConfig &GetConfig(DatabaseInstance &db);
@@ -10210,8 +10254,10 @@ class DuckDB;
10210
10254
  //! The Extension class is the base class used to define extensions
10211
10255
  class Extension {
10212
10256
  public:
10257
+ DUCKDB_API virtual ~Extension();
10258
+
10213
10259
  DUCKDB_API virtual void Load(DuckDB &db) = 0;
10214
- DUCKDB_API virtual ~Extension() = default;
10260
+ DUCKDB_API virtual std::string Name() = 0;
10215
10261
  };
10216
10262
 
10217
10263
  } // namespace duckdb
@@ -10259,6 +10305,7 @@ private:
10259
10305
  unique_ptr<TaskScheduler> scheduler;
10260
10306
  unique_ptr<ObjectCache> object_cache;
10261
10307
  unique_ptr<ConnectionManager> connection_manager;
10308
+ unordered_set<std::string> loaded_extensions;
10262
10309
  };
10263
10310
 
10264
10311
  //! The database object. This object holds the catalog and all the
@@ -10267,6 +10314,8 @@ class DuckDB {
10267
10314
  public:
10268
10315
  DUCKDB_API explicit DuckDB(const char *path = nullptr, DBConfig *config = nullptr);
10269
10316
  DUCKDB_API explicit DuckDB(const string &path, DBConfig *config = nullptr);
10317
+ DUCKDB_API explicit DuckDB(DatabaseInstance &instance);
10318
+
10270
10319
  DUCKDB_API ~DuckDB();
10271
10320
 
10272
10321
  //! Reference to the actual database instance
@@ -10276,7 +10325,11 @@ public:
10276
10325
  template <class T>
10277
10326
  void LoadExtension() {
10278
10327
  T extension;
10328
+ if (ExtensionIsLoaded(extension.Name())) {
10329
+ return;
10330
+ }
10279
10331
  extension.Load(*this);
10332
+ SetExtensionLoaded(extension.Name());
10280
10333
  }
10281
10334
 
10282
10335
  DUCKDB_API FileSystem &GetFileSystem();
@@ -10284,16 +10337,39 @@ public:
10284
10337
  DUCKDB_API idx_t NumberOfThreads();
10285
10338
  DUCKDB_API static const char *SourceID();
10286
10339
  DUCKDB_API static const char *LibraryVersion();
10340
+ DUCKDB_API static string Platform();
10341
+ DUCKDB_API bool ExtensionIsLoaded(const std::string &name);
10342
+ DUCKDB_API void SetExtensionLoaded(const std::string &name);
10287
10343
  };
10288
10344
 
10289
10345
  } // namespace duckdb
10290
10346
 
10291
10347
 
10348
+ //===----------------------------------------------------------------------===//
10349
+ // DuckDB
10350
+ //
10351
+ // duckdb/main/loadable_extension.hpp
10352
+ //
10353
+ //
10354
+ //===----------------------------------------------------------------------===//
10355
+
10292
10356
 
10293
10357
 
10294
10358
  #ifdef DUCKDB_BUILD_LOADABLE_EXTENSION
10295
10359
  #ifdef _WIN32
10360
+ #ifndef NOMINMAX
10361
+ #define NOMINMAX
10362
+ #endif
10363
+
10364
+ #ifndef _WINSOCKAPI_
10365
+ #define _WINSOCKAPI_
10366
+ #endif
10296
10367
  #include <windows.h>
10368
+
10369
+ #undef CreateDirectory
10370
+ #undef MoveFile
10371
+ #undef RemoveDirectory
10372
+
10297
10373
  #include <delayimp.h>
10298
10374
 
10299
10375
  extern "C" {
@@ -10301,7 +10377,7 @@ extern "C" {
10301
10377
  This is interesting: Windows would normally require a duckdb.dll being on the DLL search path when we load an extension
10302
10378
  using LoadLibrary(). However, there is likely no such dll, because DuckDB was statically linked, or is running as part
10303
10379
  of an R or Python module with a completely different name (that we don't know) or something of the sorts. Amazingly,
10304
- Windows supports lazy-loading DLLs by linking them with /DELAYLOAD. Then a callback will be triggerd whenever we access
10380
+ Windows supports lazy-loading DLLs by linking them with /DELAYLOAD. Then a callback will be triggered whenever we access
10305
10381
  symbols in the extension. Since DuckDB is already running in the host process (hopefully), we can use
10306
10382
  GetModuleHandle(NULL) to return the current process so the symbols are looked for there. See here for another
10307
10383
  explanation of this crazy process:
@@ -10339,8 +10415,9 @@ ExternC const PfnDliHook __pfnDliFailureHook2 = duckdb_dllimport_delay_hook;
10339
10415
 
10340
10416
 
10341
10417
 
10418
+ #ifndef DUCKDB_API
10342
10419
  #ifdef _WIN32
10343
- #ifdef DUCKDB_BUILD_LIBRARY
10420
+ #if defined(DUCKDB_BUILD_LIBRARY) && !defined(DUCKDB_BUILD_LOADABLE_EXTENSION)
10344
10421
  #define DUCKDB_API __declspec(dllexport)
10345
10422
  #else
10346
10423
  #define DUCKDB_API __declspec(dllimport)
@@ -10348,6 +10425,7 @@ ExternC const PfnDliHook __pfnDliFailureHook2 = duckdb_dllimport_delay_hook;
10348
10425
  #else
10349
10426
  #define DUCKDB_API
10350
10427
  #endif
10428
+ #endif
10351
10429
 
10352
10430
  #include <stdbool.h>
10353
10431
  #include <stdint.h>
@@ -11742,6 +11820,12 @@ struct timestamp_struct {
11742
11820
  //! The Timestamp class is a static class that holds helper functions for the Timestamp
11743
11821
  //! type.
11744
11822
  class Timestamp {
11823
+ public:
11824
+ // min timestamp is 290308-12-22 (BC)
11825
+ constexpr static const int32_t MIN_YEAR = -290308;
11826
+ constexpr static const int32_t MIN_MONTH = 12;
11827
+ constexpr static const int32_t MIN_DAY = 22;
11828
+
11745
11829
  public:
11746
11830
  //! Convert a string in the format "YYYY-MM-DD hh:mm:ss" to a timestamp object
11747
11831
  DUCKDB_API static timestamp_t FromString(const string &str);
@@ -11814,6 +11898,8 @@ public:
11814
11898
 
11815
11899
  //! Convert a time object to a string in the format "hh:mm:ss"
11816
11900
  DUCKDB_API static string ToString(dtime_t time);
11901
+ //! Convert a UTC offset to ±HH[:MM]
11902
+ DUCKDB_API static string ToUTCOffset(int hour_offset, int minute_offset);
11817
11903
 
11818
11904
  DUCKDB_API static dtime_t FromTime(int32_t hour, int32_t minute, int32_t second, int32_t microseconds = 0);
11819
11905
 
@@ -11901,14 +11987,11 @@ class TableCatalogEntry;
11901
11987
  class Connection;
11902
11988
 
11903
11989
  //! The Appender class can be used to append elements to a table.
11904
- class Appender {
11990
+ class BaseAppender {
11991
+ protected:
11905
11992
  //! The amount of chunks that will be gathered in the chunk collection before flushing
11906
11993
  static constexpr const idx_t FLUSH_COUNT = 100;
11907
11994
 
11908
- //! A reference to a database connection that created this appender
11909
- shared_ptr<ClientContext> context;
11910
- //! The table description (including column names)
11911
- unique_ptr<TableDescription> description;
11912
11995
  //! The append types
11913
11996
  vector<LogicalType> types;
11914
11997
  //! The buffered data for the append
@@ -11919,9 +12002,9 @@ class Appender {
11919
12002
  idx_t column = 0;
11920
12003
 
11921
12004
  public:
11922
- DUCKDB_API Appender(Connection &con, const string &schema_name, const string &table_name);
11923
- DUCKDB_API Appender(Connection &con, const string &table_name);
11924
- DUCKDB_API ~Appender();
12005
+ DUCKDB_API BaseAppender();
12006
+ DUCKDB_API BaseAppender(vector<LogicalType> types);
12007
+ DUCKDB_API virtual ~BaseAppender();
11925
12008
 
11926
12009
  //! Begins a new row append, after calling this the other AppendX() functions
11927
12010
  //! should be called the correct amount of times. After that,
@@ -11957,7 +12040,9 @@ public:
11957
12040
  return column;
11958
12041
  }
11959
12042
 
11960
- private:
12043
+ protected:
12044
+ void Destructor();
12045
+ virtual void FlushInternal(ChunkCollection &collection) = 0;
11961
12046
  void InitializeChunk();
11962
12047
  void FlushChunk();
11963
12048
 
@@ -11979,46 +12064,75 @@ private:
11979
12064
  void AppendValue(const Value &value);
11980
12065
  };
11981
12066
 
12067
+ class Appender : public BaseAppender {
12068
+ //! A reference to a database connection that created this appender
12069
+ shared_ptr<ClientContext> context;
12070
+ //! The table description (including column names)
12071
+ unique_ptr<TableDescription> description;
12072
+
12073
+ public:
12074
+ DUCKDB_API Appender(Connection &con, const string &schema_name, const string &table_name);
12075
+ DUCKDB_API Appender(Connection &con, const string &table_name);
12076
+ DUCKDB_API ~Appender() override;
12077
+
12078
+ protected:
12079
+ void FlushInternal(ChunkCollection &collection) override;
12080
+ };
12081
+
12082
+ class InternalAppender : public BaseAppender {
12083
+ //! The client context
12084
+ ClientContext &context;
12085
+ //! The internal table entry to append to
12086
+ TableCatalogEntry &table;
12087
+
12088
+ public:
12089
+ DUCKDB_API InternalAppender(ClientContext &context, TableCatalogEntry &table);
12090
+ DUCKDB_API ~InternalAppender() override;
12091
+
12092
+ protected:
12093
+ void FlushInternal(ChunkCollection &collection) override;
12094
+ };
12095
+
11982
12096
  template <>
11983
- void DUCKDB_API Appender::Append(bool value);
12097
+ DUCKDB_API void BaseAppender::Append(bool value);
11984
12098
  template <>
11985
- void DUCKDB_API Appender::Append(int8_t value);
12099
+ DUCKDB_API void BaseAppender::Append(int8_t value);
11986
12100
  template <>
11987
- void DUCKDB_API Appender::Append(int16_t value);
12101
+ DUCKDB_API void BaseAppender::Append(int16_t value);
11988
12102
  template <>
11989
- void DUCKDB_API Appender::Append(int32_t value);
12103
+ DUCKDB_API void BaseAppender::Append(int32_t value);
11990
12104
  template <>
11991
- void DUCKDB_API Appender::Append(int64_t value);
12105
+ DUCKDB_API void BaseAppender::Append(int64_t value);
11992
12106
  template <>
11993
- void DUCKDB_API Appender::Append(hugeint_t value);
12107
+ DUCKDB_API void BaseAppender::Append(hugeint_t value);
11994
12108
  template <>
11995
- void DUCKDB_API Appender::Append(uint8_t value);
12109
+ DUCKDB_API void BaseAppender::Append(uint8_t value);
11996
12110
  template <>
11997
- void DUCKDB_API Appender::Append(uint16_t value);
12111
+ DUCKDB_API void BaseAppender::Append(uint16_t value);
11998
12112
  template <>
11999
- void DUCKDB_API Appender::Append(uint32_t value);
12113
+ DUCKDB_API void BaseAppender::Append(uint32_t value);
12000
12114
  template <>
12001
- void DUCKDB_API Appender::Append(uint64_t value);
12115
+ DUCKDB_API void BaseAppender::Append(uint64_t value);
12002
12116
  template <>
12003
- void DUCKDB_API Appender::Append(float value);
12117
+ DUCKDB_API void BaseAppender::Append(float value);
12004
12118
  template <>
12005
- void DUCKDB_API Appender::Append(double value);
12119
+ DUCKDB_API void BaseAppender::Append(double value);
12006
12120
  template <>
12007
- void DUCKDB_API Appender::Append(date_t value);
12121
+ DUCKDB_API void BaseAppender::Append(date_t value);
12008
12122
  template <>
12009
- void DUCKDB_API Appender::Append(dtime_t value);
12123
+ DUCKDB_API void BaseAppender::Append(dtime_t value);
12010
12124
  template <>
12011
- void DUCKDB_API Appender::Append(timestamp_t value);
12125
+ DUCKDB_API void BaseAppender::Append(timestamp_t value);
12012
12126
  template <>
12013
- void DUCKDB_API Appender::Append(interval_t value);
12127
+ DUCKDB_API void BaseAppender::Append(interval_t value);
12014
12128
  template <>
12015
- void DUCKDB_API Appender::Append(const char *value);
12129
+ DUCKDB_API void BaseAppender::Append(const char *value);
12016
12130
  template <>
12017
- void DUCKDB_API Appender::Append(string_t value);
12131
+ DUCKDB_API void BaseAppender::Append(string_t value);
12018
12132
  template <>
12019
- void DUCKDB_API Appender::Append(Value value);
12133
+ DUCKDB_API void BaseAppender::Append(Value value);
12020
12134
  template <>
12021
- void DUCKDB_API Appender::Append(std::nullptr_t value);
12135
+ DUCKDB_API void BaseAppender::Append(std::nullptr_t value);
12022
12136
 
12023
12137
  } // namespace duckdb
12024
12138
  //===----------------------------------------------------------------------===//
@@ -12182,22 +12296,21 @@ enum class ConstraintType : uint8_t {
12182
12296
  //! Constraint is the base class of any type of table constraint.
12183
12297
  class Constraint {
12184
12298
  public:
12185
- explicit Constraint(ConstraintType type) : type(type) {};
12186
- virtual ~Constraint() {
12187
- }
12299
+ DUCKDB_API explicit Constraint(ConstraintType type);
12300
+ DUCKDB_API virtual ~Constraint();
12188
12301
 
12189
12302
  ConstraintType type;
12190
12303
 
12191
12304
  public:
12192
- virtual string ToString() const = 0;
12193
- void Print();
12305
+ DUCKDB_API virtual string ToString() const = 0;
12306
+ DUCKDB_API void Print();
12194
12307
 
12195
- virtual unique_ptr<Constraint> Copy() = 0;
12308
+ DUCKDB_API virtual unique_ptr<Constraint> Copy() = 0;
12196
12309
  //! Serializes a Constraint to a stand-alone binary blob
12197
- virtual void Serialize(Serializer &serializer);
12310
+ DUCKDB_API virtual void Serialize(Serializer &serializer);
12198
12311
  //! Deserializes a blob back into a Constraint, returns NULL if
12199
12312
  //! deserialization is not possible
12200
- static unique_ptr<Constraint> Deserialize(Deserializer &source);
12313
+ DUCKDB_API static unique_ptr<Constraint> Deserialize(Deserializer &source);
12201
12314
  };
12202
12315
  } // namespace duckdb
12203
12316
 
@@ -12285,7 +12398,7 @@ public:
12285
12398
 
12286
12399
  //! Returns the column index of the specified column name.
12287
12400
  //! If the column does not exist:
12288
- //! If if_exists is true, returns INVALID_INDEX
12401
+ //! If if_exists is true, returns DConstants::INVALID_INDEX
12289
12402
  //! If if_exists is false, throws an exception
12290
12403
  idx_t GetColumnIndex(string &name, bool if_exists = false);
12291
12404
 
@@ -12324,21 +12437,21 @@ class CatalogSet {
12324
12437
  friend class DependencyManager;
12325
12438
 
12326
12439
  public:
12327
- explicit CatalogSet(Catalog &catalog, unique_ptr<DefaultGenerator> defaults = nullptr);
12440
+ DUCKDB_API explicit CatalogSet(Catalog &catalog, unique_ptr<DefaultGenerator> defaults = nullptr);
12328
12441
 
12329
12442
  //! Create an entry in the catalog set. Returns whether or not it was
12330
12443
  //! successful.
12331
- bool CreateEntry(ClientContext &context, const string &name, unique_ptr<CatalogEntry> value,
12332
- unordered_set<CatalogEntry *> &dependencies);
12444
+ DUCKDB_API bool CreateEntry(ClientContext &context, const string &name, unique_ptr<CatalogEntry> value,
12445
+ unordered_set<CatalogEntry *> &dependencies);
12333
12446
 
12334
- bool AlterEntry(ClientContext &context, const string &name, AlterInfo *alter_info);
12447
+ DUCKDB_API bool AlterEntry(ClientContext &context, const string &name, AlterInfo *alter_info);
12335
12448
 
12336
- bool DropEntry(ClientContext &context, const string &name, bool cascade);
12449
+ DUCKDB_API bool DropEntry(ClientContext &context, const string &name, bool cascade);
12337
12450
 
12338
12451
  void CleanupEntry(CatalogEntry *catalog_entry);
12339
12452
 
12340
12453
  //! Returns the entry with the specified name
12341
- CatalogEntry *GetEntry(ClientContext &context, const string &name);
12454
+ DUCKDB_API CatalogEntry *GetEntry(ClientContext &context, const string &name);
12342
12455
 
12343
12456
  //! Gets the entry that is most similar to the given name (i.e. smallest levenshtein distance), or empty string if
12344
12457
  //! none is found. The returned pair consists of the entry name and the distance (smaller means closer).
@@ -12349,9 +12462,9 @@ public:
12349
12462
  void Undo(CatalogEntry *entry);
12350
12463
 
12351
12464
  //! Scan the catalog set, invoking the callback method for every committed entry
12352
- void Scan(const std::function<void(CatalogEntry *)> &callback);
12465
+ DUCKDB_API void Scan(const std::function<void(CatalogEntry *)> &callback);
12353
12466
  //! Scan the catalog set, invoking the callback method for every entry
12354
- void Scan(ClientContext &context, const std::function<void(CatalogEntry *)> &callback);
12467
+ DUCKDB_API void Scan(ClientContext &context, const std::function<void(CatalogEntry *)> &callback);
12355
12468
 
12356
12469
  template <class T>
12357
12470
  vector<T *> GetEntries(ClientContext &context) {
@@ -12360,8 +12473,8 @@ public:
12360
12473
  return result;
12361
12474
  }
12362
12475
 
12363
- static bool HasConflict(ClientContext &context, transaction_t timestamp);
12364
- static bool UseTimestamp(ClientContext &context, transaction_t timestamp);
12476
+ DUCKDB_API static bool HasConflict(ClientContext &context, transaction_t timestamp);
12477
+ DUCKDB_API static bool UseTimestamp(ClientContext &context, transaction_t timestamp);
12365
12478
 
12366
12479
  CatalogEntry *GetEntryFromIndex(idx_t index);
12367
12480
  void UpdateTimestamp(CatalogEntry *entry, transaction_t timestamp);
@@ -12497,6 +12610,9 @@ private:
12497
12610
  //! Drops an entry from the schema
12498
12611
  void DropEntry(ClientContext &context, DropInfo *info);
12499
12612
 
12613
+ //! Append a scalar or aggregate function within the given schema
12614
+ CatalogEntry *AddFunction(ClientContext &context, CreateFunctionInfo *info);
12615
+
12500
12616
  //! Alters a catalog entry
12501
12617
  void Alter(ClientContext &context, AlterInfo *info);
12502
12618
 
@@ -12512,7 +12628,6 @@ private:
12512
12628
  } // namespace duckdb
12513
12629
 
12514
12630
 
12515
-
12516
12631
  //===----------------------------------------------------------------------===//
12517
12632
  // DuckDB
12518
12633
  //
@@ -12528,24 +12643,6 @@ private:
12528
12643
  namespace duckdb {
12529
12644
  using std::deque;
12530
12645
  }
12531
- //===----------------------------------------------------------------------===//
12532
- // DuckDB
12533
- //
12534
- // duckdb/common/enums/output_type.hpp
12535
- //
12536
- //
12537
- //===----------------------------------------------------------------------===//
12538
-
12539
-
12540
-
12541
-
12542
-
12543
- namespace duckdb {
12544
-
12545
- enum class ExplainOutputType : uint8_t { ALL = 0, OPTIMIZED_ONLY = 1, PHYSICAL_ONLY = 2 };
12546
-
12547
- } // namespace duckdb
12548
-
12549
12646
 
12550
12647
  //===----------------------------------------------------------------------===//
12551
12648
  // DuckDB
@@ -12634,6 +12731,7 @@ enum class PhysicalOperatorType : uint8_t {
12634
12731
  INVALID,
12635
12732
  ORDER_BY,
12636
12733
  LIMIT,
12734
+ LIMIT_PERCENT,
12637
12735
  TOP_N,
12638
12736
  WINDOW,
12639
12737
  UNNEST,
@@ -12697,6 +12795,7 @@ enum class PhysicalOperatorType : uint8_t {
12697
12795
  // Helpers
12698
12796
  // -----------------------------
12699
12797
  EXPLAIN,
12798
+ EXPLAIN_ANALYZE,
12700
12799
  EMPTY_RESULT,
12701
12800
  EXECUTE,
12702
12801
  PREPARE,
@@ -12845,7 +12944,7 @@ public:
12845
12944
  vector<unique_ptr<PhysicalOperator>> children;
12846
12945
  //! The types returned by this physical operator
12847
12946
  vector<LogicalType> types;
12848
- //! The extimated cardinality of this physical operator
12947
+ //! The estimated cardinality of this physical operator
12849
12948
  idx_t estimated_cardinality;
12850
12949
  //! The global sink state of this operator
12851
12950
  unique_ptr<GlobalSinkState> sink_state;
@@ -12955,14 +13054,13 @@ struct ParallelState;
12955
13054
  class TableFilterSet;
12956
13055
 
12957
13056
  struct FunctionOperatorData {
12958
- virtual ~FunctionOperatorData() {
12959
- }
13057
+ DUCKDB_API virtual ~FunctionOperatorData();
12960
13058
  };
12961
13059
 
12962
13060
  struct TableFilterCollection {
13061
+ DUCKDB_API explicit TableFilterCollection(TableFilterSet *table_filters);
13062
+
12963
13063
  TableFilterSet *table_filters;
12964
- explicit TableFilterCollection(TableFilterSet *table_filters) : table_filters(table_filters) {
12965
- }
12966
13064
  };
12967
13065
 
12968
13066
  typedef unique_ptr<FunctionData> (*table_function_bind_t)(ClientContext &context, vector<Value> &inputs,
@@ -13007,6 +13105,7 @@ typedef string (*table_function_to_string_t)(const FunctionData *bind_data);
13007
13105
 
13008
13106
  class TableFunction : public SimpleNamedParameterFunction {
13009
13107
  public:
13108
+ DUCKDB_API
13010
13109
  TableFunction(string name, vector<LogicalType> arguments, table_function_t function,
13011
13110
  table_function_bind_t bind = nullptr, table_function_init_t init = nullptr,
13012
13111
  table_statistics_t statistics = nullptr, table_function_cleanup_t cleanup = nullptr,
@@ -13017,14 +13116,8 @@ public:
13017
13116
  table_function_parallel_t parallel_function = nullptr,
13018
13117
  table_function_init_parallel_t parallel_init = nullptr,
13019
13118
  table_function_parallel_state_next_t parallel_state_next = nullptr, bool projection_pushdown = false,
13020
- bool filter_pushdown = false, table_function_progress_t query_progress = nullptr)
13021
- : SimpleNamedParameterFunction(std::move(name), move(arguments)), bind(bind), init(init), function(function),
13022
- statistics(statistics), cleanup(cleanup), dependency(dependency), cardinality(cardinality),
13023
- pushdown_complex_filter(pushdown_complex_filter), to_string(to_string), max_threads(max_threads),
13024
- init_parallel_state(init_parallel_state), parallel_function(parallel_function), parallel_init(parallel_init),
13025
- parallel_state_next(parallel_state_next), table_scan_progress(query_progress),
13026
- projection_pushdown(projection_pushdown), filter_pushdown(filter_pushdown) {
13027
- }
13119
+ bool filter_pushdown = false, table_function_progress_t query_progress = nullptr);
13120
+ DUCKDB_API
13028
13121
  TableFunction(const vector<LogicalType> &arguments, table_function_t function, table_function_bind_t bind = nullptr,
13029
13122
  table_function_init_t init = nullptr, table_statistics_t statistics = nullptr,
13030
13123
  table_function_cleanup_t cleanup = nullptr, table_function_dependency_t dependency = nullptr,
@@ -13035,13 +13128,8 @@ public:
13035
13128
  table_function_parallel_t parallel_function = nullptr,
13036
13129
  table_function_init_parallel_t parallel_init = nullptr,
13037
13130
  table_function_parallel_state_next_t parallel_state_next = nullptr, bool projection_pushdown = false,
13038
- bool filter_pushdown = false, table_function_progress_t query_progress = nullptr)
13039
- : TableFunction(string(), arguments, function, bind, init, statistics, cleanup, dependency, cardinality,
13040
- pushdown_complex_filter, to_string, max_threads, init_parallel_state, parallel_function,
13041
- parallel_init, parallel_state_next, projection_pushdown, filter_pushdown, query_progress) {
13042
- }
13043
- TableFunction() : SimpleNamedParameterFunction("", {}) {
13044
- }
13131
+ bool filter_pushdown = false, table_function_progress_t query_progress = nullptr);
13132
+ DUCKDB_API TableFunction();
13045
13133
 
13046
13134
  //! Bind function
13047
13135
  //! This function is used for determining the return type of a table producing function and returning bind data
@@ -13089,10 +13177,6 @@ public:
13089
13177
  //! Whether or not the table function supports filter pushdown. If not supported a filter will be added
13090
13178
  //! that applies the table filter directly.
13091
13179
  bool filter_pushdown;
13092
-
13093
- string ToString() override {
13094
- return SimpleNamedParameterFunction::ToString();
13095
- }
13096
13180
  };
13097
13181
 
13098
13182
  } // namespace duckdb
@@ -13177,6 +13261,7 @@ namespace duckdb {
13177
13261
  struct ConcurrentQueue;
13178
13262
  struct QueueProducerToken;
13179
13263
  class ClientContext;
13264
+ class DatabaseInstance;
13180
13265
  class TaskScheduler;
13181
13266
 
13182
13267
  struct SchedulerThread;
@@ -13200,6 +13285,7 @@ public:
13200
13285
  ~TaskScheduler();
13201
13286
 
13202
13287
  static TaskScheduler &GetScheduler(ClientContext &context);
13288
+ static TaskScheduler &GetScheduler(DatabaseInstance &db);
13203
13289
 
13204
13290
  unique_ptr<ProducerToken> CreateProducer();
13205
13291
  //! Schedule a task to be executed by the task scheduler
@@ -13444,7 +13530,7 @@ public:
13444
13530
  //! Starts the thread
13445
13531
  void Start();
13446
13532
  //! Stops the thread
13447
- void Stop();
13533
+ void Stop(bool success = true);
13448
13534
  //! Gets current percentage
13449
13535
  int GetCurrentPercentage();
13450
13536
 
@@ -13461,7 +13547,7 @@ private:
13461
13547
  std::condition_variable c;
13462
13548
  mutex m;
13463
13549
  #endif
13464
- idx_t show_progress_after;
13550
+ atomic<idx_t> show_progress_after;
13465
13551
  idx_t time_update_bar;
13466
13552
  atomic<int> current_percentage;
13467
13553
  atomic<bool> stop;
@@ -13547,6 +13633,75 @@ private:
13547
13633
 
13548
13634
  #include <random>
13549
13635
 
13636
+ //===----------------------------------------------------------------------===//
13637
+ // DuckDB
13638
+ //
13639
+ // duckdb/main/client_config.hpp
13640
+ //
13641
+ //
13642
+ //===----------------------------------------------------------------------===//
13643
+
13644
+
13645
+
13646
+
13647
+
13648
+ //===----------------------------------------------------------------------===//
13649
+ // DuckDB
13650
+ //
13651
+ // duckdb/common/enums/output_type.hpp
13652
+ //
13653
+ //
13654
+ //===----------------------------------------------------------------------===//
13655
+
13656
+
13657
+
13658
+
13659
+
13660
+ namespace duckdb {
13661
+
13662
+ enum class ExplainOutputType : uint8_t { ALL = 0, OPTIMIZED_ONLY = 1, PHYSICAL_ONLY = 2 };
13663
+
13664
+ } // namespace duckdb
13665
+
13666
+
13667
+
13668
+ namespace duckdb {
13669
+ class ClientContext;
13670
+
13671
+ struct ClientConfig {
13672
+ //! If the progress bar is enabled or not.
13673
+ bool enable_progress_bar = false;
13674
+ //! If the print of the progress bar is enabled
13675
+ bool print_progress_bar = true;
13676
+ //! The wait time before showing the progress bar
13677
+ int wait_time = 2000;
13678
+
13679
+ // Whether or not aggressive query verification is enabled
13680
+ bool query_verification_enabled = false;
13681
+ //! Enable the running of optimizers
13682
+ bool enable_optimizer = true;
13683
+ //! Force parallelism of small tables, used for testing
13684
+ bool verify_parallelism = false;
13685
+ //! Force index join independent of table cardinality, used for testing
13686
+ bool force_index_join = false;
13687
+ //! Force out-of-core computation for operators that support it, used for testing
13688
+ bool force_external = false;
13689
+ //! Maximum bits allowed for using a perfect hash table (i.e. the perfect HT can hold up to 2^perfect_ht_threshold
13690
+ //! elements)
13691
+ idx_t perfect_ht_threshold = 12;
13692
+
13693
+ //! The explain output type used when none is specified (default: PHYSICAL_ONLY)
13694
+ ExplainOutputType explain_output_type = ExplainOutputType::PHYSICAL_ONLY;
13695
+
13696
+ //! Generic options
13697
+ case_insensitive_map_t<Value> set_variables;
13698
+
13699
+ public:
13700
+ static ClientConfig &GetConfig(ClientContext &context);
13701
+ };
13702
+
13703
+ } // namespace duckdb
13704
+
13550
13705
 
13551
13706
  namespace duckdb {
13552
13707
  class Appender;
@@ -13591,35 +13746,12 @@ public:
13591
13746
 
13592
13747
  //! The Progress Bar
13593
13748
  unique_ptr<ProgressBar> progress_bar;
13594
- //! If the progress bar is enabled or not.
13595
- bool enable_progress_bar = false;
13596
- //! If the print of the progress bar is enabled
13597
- bool print_progress_bar = true;
13598
- //! The wait time before showing the progress bar
13599
- int wait_time = 2000;
13600
13749
 
13601
13750
  unique_ptr<SchemaCatalogEntry> temporary_objects;
13602
13751
  unordered_map<string, shared_ptr<PreparedStatementData>> prepared_statements;
13603
13752
 
13604
- case_insensitive_map_t<Value> set_variables;
13605
-
13606
- // Whether or not aggressive query verification is enabled
13607
- bool query_verification_enabled = false;
13608
- //! Enable the running of optimizers
13609
- bool enable_optimizer = true;
13610
- //! Force parallelism of small tables, used for testing
13611
- bool verify_parallelism = false;
13612
- //! Force index join independent of table cardinality, used for testing
13613
- bool force_index_join = false;
13614
- //! Force out-of-core computation for operators that support it, used for testing
13615
- bool force_external = false;
13616
- //! Maximum bits allowed for using a perfect hash table (i.e. the perfect HT can hold up to 2^perfect_ht_threshold
13617
- //! elements)
13618
- idx_t perfect_ht_threshold = 12;
13619
13753
  //! The writer used to log queries (if logging is enabled)
13620
13754
  unique_ptr<BufferedFileWriter> log_query_writer;
13621
- //! The explain output type used when none is specified (default: PHYSICAL_ONLY)
13622
- ExplainOutputType explain_output_type = ExplainOutputType::PHYSICAL_ONLY;
13623
13755
  //! The random generator used by random(). Its seed value can be set by setseed().
13624
13756
  std::mt19937 random_engine;
13625
13757
 
@@ -13627,6 +13759,9 @@ public:
13627
13759
 
13628
13760
  unique_ptr<FileOpener> file_opener;
13629
13761
 
13762
+ //! The client configuration
13763
+ ClientConfig config;
13764
+
13630
13765
  public:
13631
13766
  DUCKDB_API Transaction &ActiveTransaction() {
13632
13767
  return transaction.ActiveTransaction();