duckdb 0.10.3-dev8.0 → 1.0.1-dev15.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 (55) hide show
  1. package/.github/workflows/Electron.yml +293 -0
  2. package/.github/workflows/HighPriorityIssues.yml +1 -1
  3. package/.github/workflows/NodeJS.yml +3 -3
  4. package/package.json +1 -1
  5. package/scripts/electron-versions.json +64 -0
  6. package/scripts/node_build.sh +12 -0
  7. package/scripts/node_build_win.sh +12 -0
  8. package/src/duckdb/extension/parquet/parquet_extension.cpp +7 -1
  9. package/src/duckdb/src/catalog/dependency_manager.cpp +4 -0
  10. package/src/duckdb/src/common/enum_util.cpp +29 -0
  11. package/src/duckdb/src/common/error_data.cpp +5 -2
  12. package/src/duckdb/src/common/local_file_system.cpp +5 -0
  13. package/src/duckdb/src/common/multi_file_reader.cpp +3 -0
  14. package/src/duckdb/src/common/printer.cpp +1 -1
  15. package/src/duckdb/src/common/string_util.cpp +1 -1
  16. package/src/duckdb/src/core_functions/aggregate/holistic/approximate_quantile.cpp +14 -5
  17. package/src/duckdb/src/core_functions/aggregate/holistic/quantile.cpp +11 -3
  18. package/src/duckdb/src/execution/operator/helper/physical_load.cpp +2 -2
  19. package/src/duckdb/src/execution/operator/persistent/physical_copy_database.cpp +3 -1
  20. package/src/duckdb/src/execution/operator/persistent/physical_copy_to_file.cpp +13 -10
  21. package/src/duckdb/src/execution/physical_plan/plan_copy_to_file.cpp +2 -2
  22. package/src/duckdb/src/function/table/system/duckdb_extensions.cpp +2 -3
  23. package/src/duckdb/src/function/table/version/pragma_version.cpp +5 -5
  24. package/src/duckdb/src/include/duckdb/common/enum_util.hpp +8 -0
  25. package/src/duckdb/src/include/duckdb/common/enums/copy_overwrite_mode.hpp +18 -0
  26. package/src/duckdb/src/include/duckdb/common/multi_file_reader.hpp +1 -0
  27. package/src/duckdb/src/include/duckdb/common/shared_ptr.hpp +3 -3
  28. package/src/duckdb/src/include/duckdb/execution/operator/persistent/physical_copy_to_file.hpp +2 -1
  29. package/src/duckdb/src/include/duckdb/main/attached_database.hpp +6 -0
  30. package/src/duckdb/src/include/duckdb/main/config.hpp +4 -0
  31. package/src/duckdb/src/include/duckdb/main/extension_helper.hpp +6 -6
  32. package/src/duckdb/src/include/duckdb/main/settings.hpp +20 -0
  33. package/src/duckdb/src/include/duckdb/planner/operator/logical_comparison_join.hpp +7 -7
  34. package/src/duckdb/src/include/duckdb/planner/operator/logical_copy_to_file.hpp +2 -1
  35. package/src/duckdb/src/include/duckdb/storage/storage_extension.hpp +7 -0
  36. package/src/duckdb/src/include/duckdb.h +126 -4
  37. package/src/duckdb/src/main/attached_database.cpp +7 -6
  38. package/src/duckdb/src/main/capi/stream-c.cpp +17 -8
  39. package/src/duckdb/src/main/capi/table_function-c.cpp +11 -7
  40. package/src/duckdb/src/main/config.cpp +2 -0
  41. package/src/duckdb/src/main/extension/extension_helper.cpp +3 -25
  42. package/src/duckdb/src/main/extension/extension_install.cpp +10 -6
  43. package/src/duckdb/src/main/settings/settings.cpp +32 -0
  44. package/src/duckdb/src/optimizer/pushdown/pushdown_cross_product.cpp +3 -3
  45. package/src/duckdb/src/optimizer/rule/move_constants.cpp +4 -0
  46. package/src/duckdb/src/planner/binder/query_node/plan_subquery.cpp +2 -2
  47. package/src/duckdb/src/planner/binder/statement/bind_copy.cpp +17 -4
  48. package/src/duckdb/src/planner/binder/statement/bind_create.cpp +26 -15
  49. package/src/duckdb/src/planner/binder/tableref/plan_joinref.cpp +29 -11
  50. package/src/duckdb/src/planner/operator/logical_copy_to_file.cpp +3 -3
  51. package/src/duckdb/src/storage/storage_manager.cpp +17 -8
  52. package/test/replacement_scan.test.ts +2 -0
  53. /package/src/duckdb/src/include/duckdb/common/{enable_shared_from_this.ipp → enable_shared_from_this_ipp.hpp} +0 -0
  54. /package/src/duckdb/src/include/duckdb/common/{shared_ptr.ipp → shared_ptr_ipp.hpp} +0 -0
  55. /package/src/duckdb/src/include/duckdb/common/{weak_ptr.ipp → weak_ptr_ipp.hpp} +0 -0
@@ -228,12 +228,16 @@ unique_ptr<LocalSinkState> PhysicalCopyToFile::GetLocalSinkState(ExecutionContex
228
228
  return std::move(res);
229
229
  }
230
230
 
231
- void CheckDirectory(FileSystem &fs, const string &file_path, bool overwrite) {
232
- if (fs.IsRemoteFile(file_path) && overwrite) {
233
- // we only remove files for local file systems
234
- // as remote file systems (e.g. S3) do not support RemoveFile
231
+ void CheckDirectory(FileSystem &fs, const string &file_path, CopyOverwriteMode overwrite_mode) {
232
+ if (overwrite_mode == CopyOverwriteMode::COPY_OVERWRITE_OR_IGNORE) {
233
+ // with overwrite or ignore we fully ignore the presence of any files instead of erasing them
235
234
  return;
236
235
  }
236
+ if (fs.IsRemoteFile(file_path) && overwrite_mode == CopyOverwriteMode::COPY_OVERWRITE) {
237
+ // we can only remove files for local file systems currently
238
+ // as remote file systems (e.g. S3) do not support RemoveFile
239
+ throw NotImplementedException("OVERWRITE is not supported for remote file systems");
240
+ }
237
241
  vector<string> file_list;
238
242
  vector<string> directory_list;
239
243
  directory_list.push_back(file_path);
@@ -251,13 +255,12 @@ void CheckDirectory(FileSystem &fs, const string &file_path, bool overwrite) {
251
255
  if (file_list.empty()) {
252
256
  return;
253
257
  }
254
- if (overwrite) {
258
+ if (overwrite_mode == CopyOverwriteMode::COPY_OVERWRITE) {
255
259
  for (auto &file : file_list) {
256
260
  fs.RemoveFile(file);
257
261
  }
258
262
  } else {
259
- throw IOException("Directory \"%s\" is not empty! Enable OVERWRITE_OR_IGNORE option to force writing",
260
- file_path);
263
+ throw IOException("Directory \"%s\" is not empty! Enable OVERWRITE option to overwrite files", file_path);
261
264
  }
262
265
  }
263
266
 
@@ -272,11 +275,11 @@ unique_ptr<GlobalSinkState> PhysicalCopyToFile::GetGlobalSinkState(ClientContext
272
275
  throw IOException("Cannot write to \"%s\" - it exists and is a file, not a directory!", file_path);
273
276
  } else {
274
277
  // for local files we can remove the file if OVERWRITE_OR_IGNORE is enabled
275
- if (overwrite_or_ignore) {
278
+ if (overwrite_mode == CopyOverwriteMode::COPY_OVERWRITE) {
276
279
  fs.RemoveFile(file_path);
277
280
  } else {
278
281
  throw IOException("Cannot write to \"%s\" - it exists and is a file, not a directory! Enable "
279
- "OVERWRITE_OR_IGNORE option to force writing",
282
+ "OVERWRITE option to overwrite the file",
280
283
  file_path);
281
284
  }
282
285
  }
@@ -285,7 +288,7 @@ unique_ptr<GlobalSinkState> PhysicalCopyToFile::GetGlobalSinkState(ClientContext
285
288
  if (!fs.DirectoryExists(file_path)) {
286
289
  fs.CreateDirectory(file_path);
287
290
  } else {
288
- CheckDirectory(fs, file_path, overwrite_or_ignore);
291
+ CheckDirectory(fs, file_path, overwrite_mode);
289
292
  }
290
293
 
291
294
  auto state = make_uniq<CopyToFunctionGlobalState>(nullptr);
@@ -17,7 +17,7 @@ unique_ptr<PhysicalOperator> PhysicalPlanGenerator::CreatePlan(LogicalCopyToFile
17
17
  op.file_path = fs.JoinPath(path, "tmp_" + base);
18
18
  }
19
19
  if (op.per_thread_output || op.file_size_bytes.IsValid() || op.partition_output || !op.partition_columns.empty() ||
20
- op.overwrite_or_ignore) {
20
+ op.overwrite_mode != CopyOverwriteMode::COPY_ERROR_ON_CONFLICT) {
21
21
  // hive-partitioning/per-thread output does not care about insertion order, and does not support batch indexes
22
22
  preserve_insertion_order = false;
23
23
  supports_batch_index = false;
@@ -42,7 +42,7 @@ unique_ptr<PhysicalOperator> PhysicalPlanGenerator::CreatePlan(LogicalCopyToFile
42
42
  auto copy = make_uniq<PhysicalCopyToFile>(op.types, op.function, std::move(op.bind_data), op.estimated_cardinality);
43
43
  copy->file_path = op.file_path;
44
44
  copy->use_tmp_file = op.use_tmp_file;
45
- copy->overwrite_or_ignore = op.overwrite_or_ignore;
45
+ copy->overwrite_mode = op.overwrite_mode;
46
46
  copy->filename_pattern = op.filename_pattern;
47
47
  copy->file_extension = op.file_extension;
48
48
  copy->per_thread_output = op.per_thread_output;
@@ -125,7 +125,7 @@ unique_ptr<GlobalTableFunctionState> DuckDBExtensionsInit(ClientContext &context
125
125
  if (entry == installed_extensions.end()) {
126
126
  installed_extensions[info.name] = std::move(info);
127
127
  } else {
128
- if (!entry->second.loaded) {
128
+ if (entry->second.install_mode != ExtensionInstallMode::STATICALLY_LINKED) {
129
129
  entry->second.file_path = info.file_path;
130
130
  entry->second.install_mode = info.install_mode;
131
131
  entry->second.installed_from = info.installed_from;
@@ -144,13 +144,12 @@ unique_ptr<GlobalTableFunctionState> DuckDBExtensionsInit(ClientContext &context
144
144
  auto &ext_info = e.second;
145
145
  auto entry = installed_extensions.find(ext_name);
146
146
  if (entry == installed_extensions.end() || !entry->second.installed) {
147
- ExtensionInformation info;
147
+ ExtensionInformation &info = installed_extensions[ext_name];
148
148
  info.name = ext_name;
149
149
  info.loaded = true;
150
150
  info.extension_version = ext_info.version;
151
151
  info.installed = ext_info.mode == ExtensionInstallMode::STATICALLY_LINKED;
152
152
  info.install_mode = ext_info.mode;
153
- installed_extensions[ext_name] = std::move(info);
154
153
  } else {
155
154
  entry->second.loaded = true;
156
155
  entry->second.extension_version = ext_info.version;
@@ -1,17 +1,17 @@
1
1
  #ifndef DUCKDB_PATCH_VERSION
2
- #define DUCKDB_PATCH_VERSION "3"
2
+ #define DUCKDB_PATCH_VERSION "0"
3
3
  #endif
4
4
  #ifndef DUCKDB_MINOR_VERSION
5
- #define DUCKDB_MINOR_VERSION 10
5
+ #define DUCKDB_MINOR_VERSION 0
6
6
  #endif
7
7
  #ifndef DUCKDB_MAJOR_VERSION
8
- #define DUCKDB_MAJOR_VERSION 0
8
+ #define DUCKDB_MAJOR_VERSION 1
9
9
  #endif
10
10
  #ifndef DUCKDB_VERSION
11
- #define DUCKDB_VERSION "v0.10.3"
11
+ #define DUCKDB_VERSION "v1.0.0"
12
12
  #endif
13
13
  #ifndef DUCKDB_SOURCE_ID
14
- #define DUCKDB_SOURCE_ID "70fd6a8a24"
14
+ #define DUCKDB_SOURCE_ID "1f98600c2c"
15
15
  #endif
16
16
  #include "duckdb/function/table/system_functions.hpp"
17
17
  #include "duckdb/main/database.hpp"
@@ -98,6 +98,8 @@ enum class ConflictManagerMode : uint8_t;
98
98
 
99
99
  enum class ConstraintType : uint8_t;
100
100
 
101
+ enum class CopyOverwriteMode : uint8_t;
102
+
101
103
  enum class DataFileType : uint8_t;
102
104
 
103
105
  enum class DatePartSpecifier : uint8_t;
@@ -434,6 +436,9 @@ const char* EnumUtil::ToChars<ConflictManagerMode>(ConflictManagerMode value);
434
436
  template<>
435
437
  const char* EnumUtil::ToChars<ConstraintType>(ConstraintType value);
436
438
 
439
+ template<>
440
+ const char* EnumUtil::ToChars<CopyOverwriteMode>(CopyOverwriteMode value);
441
+
437
442
  template<>
438
443
  const char* EnumUtil::ToChars<DataFileType>(DataFileType value);
439
444
 
@@ -888,6 +893,9 @@ ConflictManagerMode EnumUtil::FromString<ConflictManagerMode>(const char *value)
888
893
  template<>
889
894
  ConstraintType EnumUtil::FromString<ConstraintType>(const char *value);
890
895
 
896
+ template<>
897
+ CopyOverwriteMode EnumUtil::FromString<CopyOverwriteMode>(const char *value);
898
+
891
899
  template<>
892
900
  DataFileType EnumUtil::FromString<DataFileType>(const char *value);
893
901
 
@@ -0,0 +1,18 @@
1
+ //===----------------------------------------------------------------------===//
2
+ // DuckDB
3
+ //
4
+ // duckdb/common/enums/copy_overwrite_mode.hpp
5
+ //
6
+ //
7
+ //===----------------------------------------------------------------------===//
8
+
9
+ #pragma once
10
+
11
+ #include "duckdb/common/constants.hpp"
12
+ #include "duckdb/common/vector.hpp"
13
+
14
+ namespace duckdb {
15
+
16
+ enum class CopyOverwriteMode : uint8_t { COPY_ERROR_ON_CONFLICT = 0, COPY_OVERWRITE = 1, COPY_OVERWRITE_OR_IGNORE = 2 };
17
+
18
+ } // namespace duckdb
@@ -52,6 +52,7 @@ struct MultiFileReaderBindData {
52
52
  struct MultiFileReaderGlobalState {
53
53
  MultiFileReaderGlobalState(vector<LogicalType> extra_columns_p, optional_ptr<const MultiFileList> file_list_p)
54
54
  : extra_columns(std::move(extra_columns_p)), file_list(file_list_p) {};
55
+ virtual ~MultiFileReaderGlobalState();
55
56
 
56
57
  //! extra columns that will be produced during scanning
57
58
  const vector<LogicalType> extra_columns;
@@ -37,9 +37,9 @@ struct compatible_with_t : std::is_convertible<U *, T *> {}; // NOLINT: invalid
37
37
 
38
38
  } // namespace duckdb
39
39
 
40
- #include "duckdb/common/shared_ptr.ipp"
41
- #include "duckdb/common/weak_ptr.ipp"
42
- #include "duckdb/common/enable_shared_from_this.ipp"
40
+ #include "duckdb/common/shared_ptr_ipp.hpp"
41
+ #include "duckdb/common/weak_ptr_ipp.hpp"
42
+ #include "duckdb/common/enable_shared_from_this_ipp.hpp"
43
43
 
44
44
  namespace duckdb {
45
45
 
@@ -13,6 +13,7 @@
13
13
  #include "duckdb/execution/physical_operator.hpp"
14
14
  #include "duckdb/function/copy_function.hpp"
15
15
  #include "duckdb/parser/parsed_data/copy_info.hpp"
16
+ #include "duckdb/common/enums/copy_overwrite_mode.hpp"
16
17
 
17
18
  namespace duckdb {
18
19
 
@@ -31,7 +32,7 @@ public:
31
32
  bool use_tmp_file;
32
33
  FilenamePattern filename_pattern;
33
34
  string file_extension;
34
- bool overwrite_or_ignore;
35
+ CopyOverwriteMode overwrite_mode;
35
36
  bool parallel;
36
37
  bool per_thread_output;
37
38
  optional_idx file_size_bytes;
@@ -54,6 +54,11 @@ public:
54
54
  DatabaseInstance &GetDatabase() {
55
55
  return db;
56
56
  }
57
+
58
+ optional_ptr<StorageExtension> GetStorageExtension() {
59
+ return storage_extension;
60
+ }
61
+
57
62
  const string &GetName() const {
58
63
  return name;
59
64
  }
@@ -74,6 +79,7 @@ private:
74
79
  unique_ptr<TransactionManager> transaction_manager;
75
80
  AttachedDatabaseType type;
76
81
  optional_ptr<Catalog> parent_catalog;
82
+ optional_ptr<StorageExtension> storage_extension;
77
83
  bool is_initial_database = false;
78
84
  bool is_closed = false;
79
85
  };
@@ -208,6 +208,10 @@ struct DBConfigOptions {
208
208
  bool allow_extensions_metadata_mismatch = false;
209
209
  //! Enable emitting FSST Vectors
210
210
  bool enable_fsst_vectors = false;
211
+ //! Enable VIEWs to create dependencies
212
+ bool enable_view_dependencies = false;
213
+ //! Enable macros to create dependencies
214
+ bool enable_macro_dependencies = false;
211
215
  //! Start transactions immediately in all attached databases - instead of lazily when a database is referenced
212
216
  bool immediate_transaction_mode = false;
213
217
  //! Debug setting - how to initialize blocks in the storage layer when allocating
@@ -88,10 +88,12 @@ public:
88
88
  static unique_ptr<ExtensionInstallInfo> InstallExtension(ClientContext &context, const string &extension,
89
89
  bool force_install,
90
90
  optional_ptr<ExtensionRepository> repository = nullptr,
91
+ bool throw_on_origin_mismatch = false,
91
92
  const string &version = "");
92
93
  static unique_ptr<ExtensionInstallInfo> InstallExtension(DBConfig &config, FileSystem &fs, const string &extension,
93
94
  bool force_install,
94
95
  optional_ptr<ExtensionRepository> repository = nullptr,
96
+ bool throw_on_origin_mismatch = false,
95
97
  const string &version = "");
96
98
  //! Load an extension
97
99
  static void LoadExternalExtension(ClientContext &context, const string &extension);
@@ -213,12 +215,10 @@ public:
213
215
  static bool CreateSuggestions(const string &extension_name, string &message);
214
216
 
215
217
  private:
216
- static unique_ptr<ExtensionInstallInfo> InstallExtensionInternal(DBConfig &config, FileSystem &fs,
217
- const string &local_path, const string &extension,
218
- bool force_install, const string &version,
219
- optional_ptr<ExtensionRepository> repository,
220
- optional_ptr<HTTPLogger> http_logger = nullptr,
221
- optional_ptr<ClientContext> context = nullptr);
218
+ static unique_ptr<ExtensionInstallInfo> InstallExtensionInternal(
219
+ DBConfig &config, FileSystem &fs, const string &local_path, const string &extension, bool force_install,
220
+ bool throw_on_origin_mismatch, const string &version, optional_ptr<ExtensionRepository> repository,
221
+ optional_ptr<HTTPLogger> http_logger = nullptr, optional_ptr<ClientContext> context = nullptr);
222
222
  static const vector<string> PathComponents();
223
223
  static string DefaultExtensionFolder(FileSystem &fs);
224
224
  static bool AllowAutoInstall(const string &extension);
@@ -206,6 +206,26 @@ struct EnableExternalAccessSetting {
206
206
  static Value GetSetting(const ClientContext &context);
207
207
  };
208
208
 
209
+ struct EnableMacrosDependencies {
210
+ static constexpr const char *Name = "enable_macro_dependencies";
211
+ static constexpr const char *Description =
212
+ "Enable created MACROs to create dependencies on the referenced objects (such as tables)";
213
+ static constexpr const LogicalTypeId InputType = LogicalTypeId::BOOLEAN;
214
+ static void SetGlobal(DatabaseInstance *db, DBConfig &config, const Value &parameter);
215
+ static void ResetGlobal(DatabaseInstance *db, DBConfig &config);
216
+ static Value GetSetting(const ClientContext &context);
217
+ };
218
+
219
+ struct EnableViewDependencies {
220
+ static constexpr const char *Name = "enable_view_dependencies";
221
+ static constexpr const char *Description =
222
+ "Enable created VIEWs to create dependencies on the referenced objects (such as tables)";
223
+ static constexpr const LogicalTypeId InputType = LogicalTypeId::BOOLEAN;
224
+ static void SetGlobal(DatabaseInstance *db, DBConfig &config, const Value &parameter);
225
+ static void ResetGlobal(DatabaseInstance *db, DBConfig &config);
226
+ static Value GetSetting(const ClientContext &context);
227
+ };
228
+
209
229
  struct EnableFSSTVectors {
210
230
  static constexpr const char *Name = "enable_fsst_vectors";
211
231
  static constexpr const char *Description =
@@ -51,16 +51,16 @@ public:
51
51
  vector<JoinCondition> conditions,
52
52
  vector<unique_ptr<Expression>> arbitrary_expressions);
53
53
 
54
- static void ExtractJoinConditions(ClientContext &context, JoinType type, unique_ptr<LogicalOperator> &left_child,
55
- unique_ptr<LogicalOperator> &right_child, unique_ptr<Expression> condition,
56
- vector<JoinCondition> &conditions,
54
+ static void ExtractJoinConditions(ClientContext &context, JoinType type, JoinRefType ref_type,
55
+ unique_ptr<LogicalOperator> &left_child, unique_ptr<LogicalOperator> &right_child,
56
+ unique_ptr<Expression> condition, vector<JoinCondition> &conditions,
57
57
  vector<unique_ptr<Expression>> &arbitrary_expressions);
58
- static void ExtractJoinConditions(ClientContext &context, JoinType type, unique_ptr<LogicalOperator> &left_child,
59
- unique_ptr<LogicalOperator> &right_child,
58
+ static void ExtractJoinConditions(ClientContext &context, JoinType type, JoinRefType ref_type,
59
+ unique_ptr<LogicalOperator> &left_child, unique_ptr<LogicalOperator> &right_child,
60
60
  vector<unique_ptr<Expression>> &expressions, vector<JoinCondition> &conditions,
61
61
  vector<unique_ptr<Expression>> &arbitrary_expressions);
62
- static void ExtractJoinConditions(ClientContext &context, JoinType type, unique_ptr<LogicalOperator> &left_child,
63
- unique_ptr<LogicalOperator> &right_child,
62
+ static void ExtractJoinConditions(ClientContext &context, JoinType type, JoinRefType ref_type,
63
+ unique_ptr<LogicalOperator> &left_child, unique_ptr<LogicalOperator> &right_child,
64
64
  const unordered_set<idx_t> &left_bindings,
65
65
  const unordered_set<idx_t> &right_bindings,
66
66
  vector<unique_ptr<Expression>> &expressions, vector<JoinCondition> &conditions,
@@ -13,6 +13,7 @@
13
13
  #include "duckdb/common/optional_idx.hpp"
14
14
  #include "duckdb/function/copy_function.hpp"
15
15
  #include "duckdb/planner/logical_operator.hpp"
16
+ #include "duckdb/common/enums/copy_overwrite_mode.hpp"
16
17
 
17
18
  namespace duckdb {
18
19
 
@@ -33,7 +34,7 @@ public:
33
34
  bool use_tmp_file;
34
35
  FilenamePattern filename_pattern;
35
36
  string file_extension;
36
- bool overwrite_or_ignore;
37
+ CopyOverwriteMode overwrite_mode;
37
38
  bool per_thread_output;
38
39
  optional_idx file_size_bytes;
39
40
 
@@ -11,6 +11,7 @@
11
11
  #include "duckdb/common/common.hpp"
12
12
  #include "duckdb/common/enums/access_mode.hpp"
13
13
  #include "duckdb/parser/tableref/table_function_ref.hpp"
14
+ #include "duckdb/storage/storage_manager.hpp"
14
15
 
15
16
  namespace duckdb {
16
17
  class AttachedDatabase;
@@ -40,6 +41,12 @@ public:
40
41
 
41
42
  virtual ~StorageExtension() {
42
43
  }
44
+
45
+ virtual void OnCheckpointStart(AttachedDatabase &db, CheckpointOptions checkpoint_options) {
46
+ }
47
+
48
+ virtual void OnCheckpointEnd(AttachedDatabase &db, CheckpointOptions checkpoint_options) {
49
+ }
43
50
  };
44
51
 
45
52
  } // namespace duckdb