duckdb 0.7.1-dev7.0 → 0.7.1-dev90.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 (64) hide show
  1. package/package.json +1 -1
  2. package/src/duckdb/extension/json/json_scan.cpp +2 -1
  3. package/src/duckdb/extension/parquet/parquet-extension.cpp +3 -2
  4. package/src/duckdb/src/common/enums/logical_operator_type.cpp +2 -0
  5. package/src/duckdb/src/common/enums/physical_operator_type.cpp +2 -0
  6. package/src/duckdb/src/common/enums/statement_type.cpp +2 -0
  7. package/src/duckdb/src/common/file_system.cpp +14 -0
  8. package/src/duckdb/src/common/operator/cast_operators.cpp +14 -8
  9. package/src/duckdb/src/common/printer.cpp +1 -1
  10. package/src/duckdb/src/common/types/time.cpp +1 -1
  11. package/src/duckdb/src/common/types/timestamp.cpp +35 -4
  12. package/src/duckdb/src/execution/operator/persistent/base_csv_reader.cpp +6 -11
  13. package/src/duckdb/src/execution/operator/persistent/buffered_csv_reader.cpp +4 -13
  14. package/src/duckdb/src/execution/operator/persistent/parallel_csv_reader.cpp +1 -1
  15. package/src/duckdb/src/execution/operator/schema/physical_detach.cpp +37 -0
  16. package/src/duckdb/src/execution/operator/schema/physical_drop.cpp +0 -5
  17. package/src/duckdb/src/execution/physical_plan/plan_simple.cpp +4 -0
  18. package/src/duckdb/src/execution/physical_plan_generator.cpp +1 -0
  19. package/src/duckdb/src/function/table/read_csv.cpp +2 -4
  20. package/src/duckdb/src/function/table/version/pragma_version.cpp +2 -2
  21. package/src/duckdb/src/include/duckdb/common/enums/logical_operator_type.hpp +1 -0
  22. package/src/duckdb/src/include/duckdb/common/enums/physical_operator_type.hpp +1 -0
  23. package/src/duckdb/src/include/duckdb/common/enums/statement_type.hpp +2 -1
  24. package/src/duckdb/src/include/duckdb/common/exception.hpp +10 -0
  25. package/src/duckdb/src/include/duckdb/common/file_system.hpp +1 -0
  26. package/src/duckdb/src/include/duckdb/common/types/timestamp.hpp +5 -1
  27. package/src/duckdb/src/include/duckdb/execution/operator/persistent/base_csv_reader.hpp +1 -3
  28. package/src/duckdb/src/include/duckdb/execution/operator/persistent/buffered_csv_reader.hpp +0 -2
  29. package/src/duckdb/src/include/duckdb/execution/operator/schema/physical_detach.hpp +32 -0
  30. package/src/duckdb/src/include/duckdb/main/config.hpp +0 -3
  31. package/src/duckdb/src/include/duckdb/parser/parsed_data/create_database_info.hpp +0 -4
  32. package/src/duckdb/src/include/duckdb/parser/parsed_data/detach_info.hpp +32 -0
  33. package/src/duckdb/src/include/duckdb/parser/statement/detach_statement.hpp +29 -0
  34. package/src/duckdb/src/include/duckdb/parser/statement/list.hpp +1 -0
  35. package/src/duckdb/src/include/duckdb/parser/tokens.hpp +1 -0
  36. package/src/duckdb/src/include/duckdb/parser/transformer.hpp +1 -0
  37. package/src/duckdb/src/include/duckdb/planner/binder.hpp +1 -0
  38. package/src/duckdb/src/include/duckdb/storage/storage_extension.hpp +7 -0
  39. package/src/duckdb/src/include/duckdb/storage/table/update_segment.hpp +2 -0
  40. package/src/duckdb/src/parser/statement/detach_statement.cpp +15 -0
  41. package/src/duckdb/src/parser/transform/statement/transform_create_database.cpp +0 -1
  42. package/src/duckdb/src/parser/transform/statement/transform_detach.cpp +19 -0
  43. package/src/duckdb/src/parser/transformer.cpp +2 -0
  44. package/src/duckdb/src/planner/binder/statement/bind_create.cpp +16 -14
  45. package/src/duckdb/src/planner/binder/statement/bind_detach.cpp +19 -0
  46. package/src/duckdb/src/planner/binder/statement/bind_drop.cpp +29 -4
  47. package/src/duckdb/src/planner/binder/tableref/bind_joinref.cpp +2 -1
  48. package/src/duckdb/src/planner/binder.cpp +2 -0
  49. package/src/duckdb/src/planner/expression_binder/lateral_binder.cpp +21 -5
  50. package/src/duckdb/src/planner/logical_operator.cpp +2 -0
  51. package/src/duckdb/src/planner/planner.cpp +1 -0
  52. package/src/duckdb/src/storage/storage_info.cpp +2 -1
  53. package/src/duckdb/src/storage/table/column_data.cpp +4 -2
  54. package/src/duckdb/src/storage/table/update_segment.cpp +15 -0
  55. package/src/duckdb/third_party/libpg_query/include/nodes/nodes.hpp +1 -0
  56. package/src/duckdb/third_party/libpg_query/include/nodes/parsenodes.hpp +14 -0
  57. package/src/duckdb/third_party/libpg_query/include/parser/gram.hpp +530 -1006
  58. package/src/duckdb/third_party/libpg_query/src_backend_parser_gram.cpp +17659 -17626
  59. package/src/duckdb/third_party/thrift/thrift/Thrift.h +8 -2
  60. package/src/duckdb/ub_src_execution_operator_schema.cpp +2 -0
  61. package/src/duckdb/ub_src_parser_statement.cpp +2 -0
  62. package/src/duckdb/ub_src_parser_transform_statement.cpp +2 -0
  63. package/src/duckdb/ub_src_planner_binder_statement.cpp +2 -0
  64. package/src/duckdb/src/include/duckdb/function/create_database_extension.hpp +0 -37
@@ -0,0 +1,29 @@
1
+ //===----------------------------------------------------------------------===//
2
+ // DuckDB
3
+ //
4
+ // duckdb/parser/statement/detach_statement.hpp
5
+ //
6
+ //
7
+ //===----------------------------------------------------------------------===//
8
+
9
+ #pragma once
10
+
11
+ #include "duckdb/parser/parsed_data/detach_info.hpp"
12
+ #include "duckdb/parser/sql_statement.hpp"
13
+
14
+ namespace duckdb {
15
+
16
+ class DetachStatement : public SQLStatement {
17
+ public:
18
+ DetachStatement();
19
+
20
+ unique_ptr<DetachInfo> info;
21
+
22
+ protected:
23
+ DetachStatement(const DetachStatement &other);
24
+
25
+ public:
26
+ unique_ptr<SQLStatement> Copy() const override;
27
+ };
28
+
29
+ } // namespace duckdb
@@ -4,6 +4,7 @@
4
4
  #include "duckdb/parser/statement/copy_statement.hpp"
5
5
  #include "duckdb/parser/statement/create_statement.hpp"
6
6
  #include "duckdb/parser/statement/delete_statement.hpp"
7
+ #include "duckdb/parser/statement/detach_statement.hpp"
7
8
  #include "duckdb/parser/statement/drop_statement.hpp"
8
9
  #include "duckdb/parser/statement/execute_statement.hpp"
9
10
  #include "duckdb/parser/statement/explain_statement.hpp"
@@ -20,6 +20,7 @@ class AttachStatement;
20
20
  class CallStatement;
21
21
  class CopyStatement;
22
22
  class CreateStatement;
23
+ class DetachStatement;
23
24
  class DeleteStatement;
24
25
  class DropStatement;
25
26
  class ExtensionStatement;
@@ -156,6 +156,7 @@ private:
156
156
  unique_ptr<SQLStatement> TransformShow(duckdb_libpgquery::PGNode *node);
157
157
  unique_ptr<ShowStatement> TransformShowSelect(duckdb_libpgquery::PGNode *node);
158
158
  unique_ptr<AttachStatement> TransformAttach(duckdb_libpgquery::PGNode *node);
159
+ unique_ptr<DetachStatement> TransformDetach(duckdb_libpgquery::PGNode *node);
159
160
  unique_ptr<SetStatement> TransformUse(duckdb_libpgquery::PGNode *node);
160
161
 
161
162
  unique_ptr<PrepareStatement> TransformPrepare(duckdb_libpgquery::PGNode *node);
@@ -247,6 +247,7 @@ private:
247
247
  BoundStatement Bind(LoadStatement &stmt);
248
248
  BoundStatement Bind(LogicalPlanStatement &stmt);
249
249
  BoundStatement Bind(AttachStatement &stmt);
250
+ BoundStatement Bind(DetachStatement &stmt);
250
251
 
251
252
  BoundStatement BindReturning(vector<unique_ptr<ParsedExpression>> returning_list, TableCatalogEntry *table,
252
253
  idx_t update_table_index, unique_ptr<LogicalOperator> child_operator,
@@ -10,6 +10,7 @@
10
10
 
11
11
  #include "duckdb/common/common.hpp"
12
12
  #include "duckdb/common/enums/access_mode.hpp"
13
+ #include "duckdb/parser/tableref/table_function_ref.hpp"
13
14
 
14
15
  namespace duckdb {
15
16
  class AttachedDatabase;
@@ -27,11 +28,17 @@ typedef unique_ptr<Catalog> (*attach_function_t)(StorageExtensionInfo *storage_i
27
28
  const string &name, AttachInfo &info, AccessMode access_mode);
28
29
  typedef unique_ptr<TransactionManager> (*create_transaction_manager_t)(StorageExtensionInfo *storage_info,
29
30
  AttachedDatabase &db, Catalog &catalog);
31
+ typedef unique_ptr<TableFunctionRef> (*create_database_t)(StorageExtensionInfo *info, ClientContext &context,
32
+ const string &database_name, const string &source_path);
33
+ typedef unique_ptr<TableFunctionRef> (*drop_database_t)(StorageExtensionInfo *storage_info, ClientContext &context,
34
+ const string &database_name);
30
35
 
31
36
  class StorageExtension {
32
37
  public:
33
38
  attach_function_t attach;
34
39
  create_transaction_manager_t create_transaction_manager;
40
+ create_database_t create_database;
41
+ drop_database_t drop_database;
35
42
 
36
43
  //! Additional info passed to the various storage functions
37
44
  shared_ptr<StorageExtensionInfo> storage_info;
@@ -23,6 +23,8 @@ struct UpdateNode;
23
23
  class UpdateSegment {
24
24
  public:
25
25
  UpdateSegment(ColumnData &column_data);
26
+ // Construct a duplicate of 'other' with 'new_owner' as it's column data
27
+ UpdateSegment(UpdateSegment &other, ColumnData &new_owner);
26
28
  ~UpdateSegment();
27
29
 
28
30
  ColumnData &column_data;
@@ -0,0 +1,15 @@
1
+ #include "duckdb/parser/statement/detach_statement.hpp"
2
+
3
+ namespace duckdb {
4
+
5
+ DetachStatement::DetachStatement() : SQLStatement(StatementType::DETACH_STATEMENT) {
6
+ }
7
+
8
+ DetachStatement::DetachStatement(const DetachStatement &other) : SQLStatement(other), info(other.info->Copy()) {
9
+ }
10
+
11
+ unique_ptr<SQLStatement> DetachStatement::Copy() const {
12
+ return unique_ptr<DetachStatement>(new DetachStatement(*this));
13
+ }
14
+
15
+ } // namespace duckdb
@@ -11,7 +11,6 @@ unique_ptr<CreateStatement> Transformer::TransformCreateDatabase(duckdb_libpgque
11
11
  auto result = make_unique<CreateStatement>();
12
12
  auto info = make_unique<CreateDatabaseInfo>();
13
13
 
14
- info->extension_name = stmt->extension ? stmt->extension : string();
15
14
  info->path = stmt->path ? stmt->path : string();
16
15
 
17
16
  auto qualified_name = TransformQualifiedName(stmt->name);
@@ -0,0 +1,19 @@
1
+ #include "duckdb/parser/transformer.hpp"
2
+ #include "duckdb/parser/statement/detach_statement.hpp"
3
+ #include "duckdb/parser/expression/constant_expression.hpp"
4
+ #include "duckdb/common/string_util.hpp"
5
+
6
+ namespace duckdb {
7
+
8
+ unique_ptr<DetachStatement> Transformer::TransformDetach(duckdb_libpgquery::PGNode *node) {
9
+ auto stmt = reinterpret_cast<duckdb_libpgquery::PGDetachStmt *>(node);
10
+ auto result = make_unique<DetachStatement>();
11
+ auto info = make_unique<DetachInfo>();
12
+ info->name = stmt->db_name;
13
+ info->if_exists = stmt->missing_ok;
14
+
15
+ result->info = std::move(info);
16
+ return result;
17
+ }
18
+
19
+ } // namespace duckdb
@@ -145,6 +145,8 @@ unique_ptr<SQLStatement> Transformer::TransformStatementInternal(duckdb_libpgque
145
145
  return TransformAlterSequence(stmt);
146
146
  case duckdb_libpgquery::T_PGAttachStmt:
147
147
  return TransformAttach(stmt);
148
+ case duckdb_libpgquery::T_PGDetachStmt:
149
+ return TransformDetach(stmt);
148
150
  case duckdb_libpgquery::T_PGUseStmt:
149
151
  return TransformUse(stmt);
150
152
  case duckdb_libpgquery::T_PGCreateDatabaseStmt:
@@ -12,13 +12,11 @@
12
12
  #include "duckdb/parser/parsed_data/create_macro_info.hpp"
13
13
  #include "duckdb/parser/parsed_data/create_view_info.hpp"
14
14
  #include "duckdb/parser/parsed_data/create_database_info.hpp"
15
- #include "duckdb/function/create_database_extension.hpp"
16
15
  #include "duckdb/parser/tableref/table_function_ref.hpp"
17
16
  #include "duckdb/parser/parsed_expression_iterator.hpp"
18
17
  #include "duckdb/parser/statement/create_statement.hpp"
19
18
  #include "duckdb/planner/binder.hpp"
20
19
  #include "duckdb/planner/bound_query_node.hpp"
21
- #include "duckdb/planner/expression_binder/aggregate_binder.hpp"
22
20
  #include "duckdb/planner/expression_binder/index_binder.hpp"
23
21
  #include "duckdb/planner/expression_binder/select_binder.hpp"
24
22
  #include "duckdb/planner/operator/logical_create.hpp"
@@ -26,13 +24,13 @@
26
24
  #include "duckdb/planner/operator/logical_create_table.hpp"
27
25
  #include "duckdb/planner/operator/logical_get.hpp"
28
26
  #include "duckdb/planner/operator/logical_distinct.hpp"
29
- #include "duckdb/planner/parsed_data/bound_create_function_info.hpp"
30
27
  #include "duckdb/planner/parsed_data/bound_create_table_info.hpp"
31
28
  #include "duckdb/planner/query_node/bound_select_node.hpp"
32
29
  #include "duckdb/planner/tableref/bound_basetableref.hpp"
33
30
  #include "duckdb/parser/constraints/foreign_key_constraint.hpp"
34
31
  #include "duckdb/function/scalar_macro_function.hpp"
35
32
  #include "duckdb/storage/data_table.hpp"
33
+ #include "duckdb/storage/storage_extension.hpp"
36
34
  #include "duckdb/main/client_data.hpp"
37
35
  #include "duckdb/parser/constraints/unique_constraint.hpp"
38
36
  #include "duckdb/parser/constraints/list.hpp"
@@ -651,23 +649,27 @@ BoundStatement Binder::Bind(CreateStatement &stmt) {
651
649
  case CatalogType::DATABASE_ENTRY: {
652
650
  // not supported in DuckDB yet but allow extensions to intercept and implement this functionality
653
651
  auto &base = (CreateDatabaseInfo &)*stmt.info;
654
- string extension_name = base.extension_name;
655
652
  string database_name = base.name;
656
653
  string source_path = base.path;
657
654
 
658
655
  auto &config = DBConfig::GetConfig(context);
659
- for (auto &extension : config.create_database_extensions) {
660
- auto create_database_function_ref =
661
- extension.function(context, extension_name, database_name, source_path, extension.data.get());
662
- if (create_database_function_ref) {
663
- auto bound_create_database_func = Bind(*create_database_function_ref);
664
- result.plan = CreatePlan(*bound_create_database_func);
665
- break;
666
- }
667
- }
668
- if (!result.plan) {
656
+
657
+ if (config.storage_extensions.empty()) {
669
658
  throw NotImplementedException("CREATE DATABASE not supported in DuckDB yet");
670
659
  }
660
+ // for now assume only one storage extension provides the custom create_database impl
661
+ for (auto &extension_entry : config.storage_extensions) {
662
+ if (extension_entry.second->create_database != nullptr) {
663
+ auto &storage_extension = extension_entry.second;
664
+ auto create_database_function_ref = storage_extension->create_database(
665
+ storage_extension->storage_info.get(), context, database_name, source_path);
666
+ if (create_database_function_ref) {
667
+ auto bound_create_database_func = Bind(*create_database_function_ref);
668
+ result.plan = CreatePlan(*bound_create_database_func);
669
+ break;
670
+ }
671
+ }
672
+ }
671
673
  break;
672
674
  }
673
675
  default:
@@ -0,0 +1,19 @@
1
+ #include "duckdb/parser/statement/detach_statement.hpp"
2
+ #include "duckdb/planner/binder.hpp"
3
+ #include "duckdb/planner/operator/logical_simple.hpp"
4
+ #include "duckdb/main/config.hpp"
5
+
6
+ namespace duckdb {
7
+
8
+ BoundStatement Binder::Bind(DetachStatement &stmt) {
9
+ BoundStatement result;
10
+
11
+ result.plan = make_unique<LogicalSimple>(LogicalOperatorType::LOGICAL_DETACH, std::move(stmt.info));
12
+ result.names = {"Success"};
13
+ result.types = {LogicalType::BOOLEAN};
14
+ properties.allow_stream_result = false;
15
+ properties.return_type = StatementReturnType::NOTHING;
16
+ return result;
17
+ }
18
+
19
+ } // namespace duckdb
@@ -1,9 +1,13 @@
1
1
  #include "duckdb/parser/statement/drop_statement.hpp"
2
2
  #include "duckdb/planner/binder.hpp"
3
+ #include "duckdb/planner/bound_tableref.hpp"
3
4
  #include "duckdb/planner/operator/logical_simple.hpp"
4
5
  #include "duckdb/catalog/catalog.hpp"
5
6
  #include "duckdb/catalog/standard_entry.hpp"
6
7
  #include "duckdb/catalog/catalog_entry/schema_catalog_entry.hpp"
8
+ #include "duckdb/parser/parsed_data/drop_info.hpp"
9
+ #include "duckdb/main/config.hpp"
10
+ #include "duckdb/storage/storage_extension.hpp"
7
11
 
8
12
  namespace duckdb {
9
13
 
@@ -43,10 +47,31 @@ BoundStatement Binder::Bind(DropStatement &stmt) {
43
47
  stmt.info->schema = entry->schema->name;
44
48
  break;
45
49
  }
46
- case CatalogType::DATABASE_ENTRY:
47
- // attaching and detaching is read-only
48
- stmt.info->catalog = SYSTEM_CATALOG;
49
- break;
50
+ case CatalogType::DATABASE_ENTRY: {
51
+ auto &base = (DropInfo &)*stmt.info;
52
+ string database_name = base.name;
53
+
54
+ auto &config = DBConfig::GetConfig(context);
55
+ // for now assume only one storage extension provides the custom drop_database impl
56
+ for (auto &extension_entry : config.storage_extensions) {
57
+ if (extension_entry.second->drop_database != nullptr) {
58
+ continue;
59
+ }
60
+ auto &storage_extension = extension_entry.second;
61
+ auto drop_database_function_ref =
62
+ storage_extension->drop_database(storage_extension->storage_info.get(), context, database_name);
63
+ if (drop_database_function_ref) {
64
+ auto bound_drop_database_func = Bind(*drop_database_function_ref);
65
+ result.plan = CreatePlan(*bound_drop_database_func);
66
+ result.names = {"Success"};
67
+ result.types = {LogicalType::BOOLEAN};
68
+ properties.allow_stream_result = false;
69
+ properties.return_type = StatementReturnType::NOTHING;
70
+ return result;
71
+ }
72
+ }
73
+ throw BinderException("Drop is not supported for this database!");
74
+ }
50
75
  default:
51
76
  throw BinderException("Unknown catalog type for drop statement!");
52
77
  }
@@ -128,6 +128,8 @@ unique_ptr<BoundTableRef> Binder::Bind(JoinRef &ref) {
128
128
  {
129
129
  LateralBinder binder(left_binder, context);
130
130
  result->right = right_binder.Bind(*ref.right);
131
+ result->correlated_columns = binder.ExtractCorrelatedColumns(right_binder);
132
+
131
133
  result->lateral = binder.HasCorrelatedColumns();
132
134
  if (result->lateral) {
133
135
  // lateral join: can only be an INNER or LEFT join
@@ -135,7 +137,6 @@ unique_ptr<BoundTableRef> Binder::Bind(JoinRef &ref) {
135
137
  throw BinderException("The combining JOIN type must be INNER or LEFT for a LATERAL reference");
136
138
  }
137
139
  }
138
- result->correlated_columns = binder.ExtractCorrelatedColumns(right_binder);
139
140
  }
140
141
 
141
142
  vector<unique_ptr<ParsedExpression>> extra_conditions;
@@ -90,6 +90,8 @@ BoundStatement Binder::Bind(SQLStatement &statement) {
90
90
  return Bind((LogicalPlanStatement &)statement);
91
91
  case StatementType::ATTACH_STATEMENT:
92
92
  return Bind((AttachStatement &)statement);
93
+ case StatementType::DETACH_STATEMENT:
94
+ return Bind((DetachStatement &)statement);
93
95
  default: // LCOV_EXCL_START
94
96
  throw NotImplementedException("Unimplemented statement type \"%s\" for Bind",
95
97
  StatementTypeToString(statement.type));
@@ -39,14 +39,30 @@ BindResult LateralBinder::BindColumnRef(unique_ptr<ParsedExpression> *expr_ptr,
39
39
  }
40
40
 
41
41
  vector<CorrelatedColumnInfo> LateralBinder::ExtractCorrelatedColumns(Binder &binder) {
42
+
43
+ if (correlated_columns.empty()) {
44
+ return binder.correlated_columns;
45
+ }
46
+
47
+ // clear outer
48
+ correlated_columns.clear();
42
49
  auto all_correlated_columns = binder.correlated_columns;
43
- for (auto &correlated : correlated_columns) {
44
- auto entry = std::find(binder.correlated_columns.begin(), binder.correlated_columns.end(), correlated);
45
- if (entry == binder.correlated_columns.end()) {
46
- throw InternalException("Lateral Binder: could not find correlated column in binder");
50
+
51
+ // remove outer from inner
52
+ for (auto &corr_column : correlated_columns) {
53
+ auto entry = std::find(binder.correlated_columns.begin(), binder.correlated_columns.end(), corr_column);
54
+ if (entry != binder.correlated_columns.end()) {
55
+ binder.correlated_columns.erase(entry);
47
56
  }
48
- binder.correlated_columns.erase(entry);
49
57
  }
58
+
59
+ // add inner to outer
60
+ for (auto &corr_column : binder.correlated_columns) {
61
+ correlated_columns.push_back(corr_column);
62
+ }
63
+
64
+ // clear inner
65
+ binder.correlated_columns.clear();
50
66
  return all_correlated_columns;
51
67
  }
52
68
 
@@ -338,6 +338,8 @@ unique_ptr<LogicalOperator> LogicalOperator::Deserialize(Deserializer &deseriali
338
338
  case LogicalOperatorType::LOGICAL_DROP:
339
339
  result = LogicalSimple::Deserialize(state, reader);
340
340
  break;
341
+ case LogicalOperatorType::LOGICAL_DETACH:
342
+ throw SerializationException("Logical Detach does not support serialization");
341
343
  case LogicalOperatorType::LOGICAL_EXTENSION_OPERATOR:
342
344
  result = LogicalExtensionOperator::Deserialize(state, reader);
343
345
  break;
@@ -133,6 +133,7 @@ void Planner::CreatePlan(unique_ptr<SQLStatement> statement) {
133
133
  case StatementType::EXECUTE_STATEMENT:
134
134
  case StatementType::LOGICAL_PLAN_STATEMENT:
135
135
  case StatementType::ATTACH_STATEMENT:
136
+ case StatementType::DETACH_STATEMENT:
136
137
  CreatePlan(*statement);
137
138
  break;
138
139
  default:
@@ -9,7 +9,8 @@ struct StorageVersionInfo {
9
9
  idx_t storage_version;
10
10
  };
11
11
 
12
- static StorageVersionInfo storage_version_info[] = {{"v0.6.0 or v0.6.1", 39},
12
+ static StorageVersionInfo storage_version_info[] = {{"v0.7.0", 43},
13
+ {"v0.6.0 or v0.6.1", 39},
13
14
  {"v0.5.0 or v0.5.1", 38},
14
15
  {"v0.3.3, v0.3.4 or v0.4.0", 33},
15
16
  {"v0.3.2", 31},
@@ -27,8 +27,10 @@ ColumnData::ColumnData(BlockManager &block_manager, DataTableInfo &info, idx_t c
27
27
 
28
28
  ColumnData::ColumnData(ColumnData &other, idx_t start, ColumnData *parent)
29
29
  : block_manager(other.block_manager), info(other.info), column_index(other.column_index), start(start),
30
- type(std::move(other.type)), parent(parent), updates(std::move(other.updates)),
31
- version(parent ? parent->version + 1 : 0) {
30
+ type(std::move(other.type)), parent(parent), version(parent ? parent->version + 1 : 0) {
31
+ if (other.updates) {
32
+ updates = make_unique<UpdateSegment>(*other.updates, *this);
33
+ }
32
34
  idx_t offset = 0;
33
35
  for (auto segment = other.data.GetRootSegment(); segment; segment = segment->Next()) {
34
36
  auto &other = (ColumnSegment &)*segment;
@@ -36,6 +36,21 @@ UpdateSegment::UpdateSegment(ColumnData &column_data)
36
36
  this->statistics_update_function = GetStatisticsUpdateFunction(physical_type);
37
37
  }
38
38
 
39
+ UpdateSegment::UpdateSegment(UpdateSegment &other, ColumnData &owner)
40
+ : column_data(owner), root(std::move(other.root)), stats(std::move(other.stats)), type_size(other.type_size) {
41
+
42
+ this->heap.Move(other.heap);
43
+
44
+ initialize_update_function = other.initialize_update_function;
45
+ merge_update_function = other.merge_update_function;
46
+ fetch_update_function = other.fetch_update_function;
47
+ fetch_committed_function = other.fetch_committed_function;
48
+ fetch_committed_range = other.fetch_committed_range;
49
+ fetch_row_function = other.fetch_row_function;
50
+ rollback_update_function = other.rollback_update_function;
51
+ statistics_update_function = other.statistics_update_function;
52
+ }
53
+
39
54
  UpdateSegment::~UpdateSegment() {
40
55
  }
41
56
 
@@ -422,6 +422,7 @@ typedef enum PGNodeTag {
422
422
  T_PGExportStmt,
423
423
  T_PGImportStmt,
424
424
  T_PGAttachStmt,
425
+ T_PGDetachStmt,
425
426
  T_PGCreateDatabaseStmt,
426
427
  T_PGUseStmt,
427
428
 
@@ -2070,6 +2070,20 @@ typedef struct PGAttachStmt
2070
2070
  PGNode *query;
2071
2071
  } PGAttachStmt;
2072
2072
 
2073
+ /* ----------------------
2074
+ * Dettach Statement
2075
+ * ----------------------
2076
+ */
2077
+
2078
+ typedef struct PGDetachStmt
2079
+ {
2080
+ PGNodeTag type;
2081
+ char *db_name; /* list of names of attached databases */
2082
+ bool missing_ok;
2083
+ } PGDetachStmt;
2084
+
2085
+
2086
+
2073
2087
  /* ----------------------
2074
2088
  * CREATE DATABASE Statement
2075
2089
  * ----------------------