duckdb 0.7.2-dev3515.0 → 0.7.2-dev3666.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 (133) hide show
  1. package/configure.py +2 -0
  2. package/package.json +1 -1
  3. package/src/database.cpp +1 -0
  4. package/src/duckdb/extension/json/buffered_json_reader.cpp +56 -17
  5. package/src/duckdb/extension/json/include/buffered_json_reader.hpp +56 -31
  6. package/src/duckdb/extension/json/include/json_common.hpp +5 -4
  7. package/src/duckdb/extension/json/include/json_executors.hpp +13 -18
  8. package/src/duckdb/extension/json/include/json_functions.hpp +3 -0
  9. package/src/duckdb/extension/json/include/json_scan.hpp +106 -153
  10. package/src/duckdb/extension/json/include/json_transform.hpp +2 -2
  11. package/src/duckdb/extension/json/json_common.cpp +1 -1
  12. package/src/duckdb/extension/json/json_functions/copy_json.cpp +94 -38
  13. package/src/duckdb/extension/json/json_functions/json_contains.cpp +7 -8
  14. package/src/duckdb/extension/json/json_functions/json_create.cpp +7 -7
  15. package/src/duckdb/extension/json/json_functions/json_merge_patch.cpp +4 -4
  16. package/src/duckdb/extension/json/json_functions/json_serialize_sql.cpp +4 -4
  17. package/src/duckdb/extension/json/json_functions/json_structure.cpp +7 -5
  18. package/src/duckdb/extension/json/json_functions/json_transform.cpp +10 -8
  19. package/src/duckdb/extension/json/json_functions/json_valid.cpp +1 -1
  20. package/src/duckdb/extension/json/json_functions/read_json.cpp +167 -169
  21. package/src/duckdb/extension/json/json_functions/read_json_objects.cpp +37 -16
  22. package/src/duckdb/extension/json/json_functions.cpp +11 -4
  23. package/src/duckdb/extension/json/json_scan.cpp +593 -374
  24. package/src/duckdb/extension/parquet/parquet-extension.cpp +5 -0
  25. package/src/duckdb/src/catalog/catalog_entry/macro_catalog_entry.cpp +42 -0
  26. package/src/duckdb/src/catalog/catalog_search_path.cpp +5 -0
  27. package/src/duckdb/src/catalog/catalog_set.cpp +1 -1
  28. package/src/duckdb/src/common/constants.cpp +1 -0
  29. package/src/duckdb/src/common/file_system.cpp +26 -6
  30. package/src/duckdb/src/common/local_file_system.cpp +0 -13
  31. package/src/duckdb/src/common/types/vector.cpp +3 -3
  32. package/src/duckdb/src/common/types/vector_buffer.cpp +11 -3
  33. package/src/duckdb/src/common/types/vector_cache.cpp +5 -5
  34. package/src/duckdb/src/execution/operator/persistent/buffered_csv_reader.cpp +12 -6
  35. package/src/duckdb/src/execution/operator/persistent/csv_reader_options.cpp +10 -0
  36. package/src/duckdb/src/execution/operator/schema/physical_create_type.cpp +2 -2
  37. package/src/duckdb/src/function/macro_function.cpp +43 -0
  38. package/src/duckdb/src/function/pragma/pragma_queries.cpp +5 -3
  39. package/src/duckdb/src/function/scalar/strftime_format.cpp +1 -0
  40. package/src/duckdb/src/function/scalar_macro_function.cpp +10 -0
  41. package/src/duckdb/src/function/table/copy_csv.cpp +68 -18
  42. package/src/duckdb/src/function/table/read_csv.cpp +30 -3
  43. package/src/duckdb/src/function/table/version/pragma_version.cpp +8 -2
  44. package/src/duckdb/src/function/table_macro_function.cpp +10 -0
  45. package/src/duckdb/src/include/duckdb/catalog/catalog_entry/column_dependency_manager.hpp +1 -1
  46. package/src/duckdb/src/include/duckdb/catalog/catalog_entry/macro_catalog_entry.hpp +3 -1
  47. package/src/duckdb/src/include/duckdb/catalog/catalog_entry/scalar_macro_catalog_entry.hpp +0 -6
  48. package/src/duckdb/src/include/duckdb/catalog/catalog_entry/table_macro_catalog_entry.hpp +0 -6
  49. package/src/duckdb/src/include/duckdb/catalog/catalog_search_path.hpp +1 -1
  50. package/src/duckdb/src/include/duckdb/catalog/similar_catalog_entry.hpp +1 -1
  51. package/src/duckdb/src/include/duckdb/common/constants.hpp +2 -0
  52. package/src/duckdb/src/include/duckdb/common/exception.hpp +3 -3
  53. package/src/duckdb/src/include/duckdb/common/field_writer.hpp +3 -3
  54. package/src/duckdb/src/include/duckdb/common/file_system.hpp +5 -0
  55. package/src/duckdb/src/include/duckdb/common/http_state.hpp +2 -1
  56. package/src/duckdb/src/include/duckdb/common/hugeint.hpp +6 -6
  57. package/src/duckdb/src/include/duckdb/common/limits.hpp +46 -46
  58. package/src/duckdb/src/include/duckdb/common/operator/cast_operators.hpp +8 -8
  59. package/src/duckdb/src/include/duckdb/common/operator/comparison_operators.hpp +6 -6
  60. package/src/duckdb/src/include/duckdb/common/operator/convert_to_string.hpp +1 -1
  61. package/src/duckdb/src/include/duckdb/common/operator/decimal_cast_operators.hpp +2 -4
  62. package/src/duckdb/src/include/duckdb/common/operator/string_cast.hpp +1 -1
  63. package/src/duckdb/src/include/duckdb/common/operator/subtract.hpp +1 -1
  64. package/src/duckdb/src/include/duckdb/common/preserved_error.hpp +1 -1
  65. package/src/duckdb/src/include/duckdb/common/re2_regex.hpp +1 -1
  66. package/src/duckdb/src/include/duckdb/common/string_util.hpp +7 -7
  67. package/src/duckdb/src/include/duckdb/common/types/chunk_collection.hpp +10 -10
  68. package/src/duckdb/src/include/duckdb/common/types/column/column_data_collection.hpp +12 -12
  69. package/src/duckdb/src/include/duckdb/common/types/column/column_data_collection_iterators.hpp +2 -2
  70. package/src/duckdb/src/include/duckdb/common/types/value.hpp +1 -1
  71. package/src/duckdb/src/include/duckdb/common/types/vector_buffer.hpp +12 -2
  72. package/src/duckdb/src/include/duckdb/common/types.hpp +2 -2
  73. package/src/duckdb/src/include/duckdb/common/winapi.hpp +1 -1
  74. package/src/duckdb/src/include/duckdb/execution/expression_executor_state.hpp +1 -1
  75. package/src/duckdb/src/include/duckdb/execution/operator/persistent/csv_reader_options.hpp +9 -5
  76. package/src/duckdb/src/include/duckdb/execution/operator/schema/physical_create_type.hpp +1 -1
  77. package/src/duckdb/src/include/duckdb/function/aggregate_function.hpp +10 -14
  78. package/src/duckdb/src/include/duckdb/function/macro_function.hpp +7 -1
  79. package/src/duckdb/src/include/duckdb/function/scalar/strftime_format.hpp +3 -4
  80. package/src/duckdb/src/include/duckdb/function/scalar_macro_function.hpp +7 -2
  81. package/src/duckdb/src/include/duckdb/function/table_function.hpp +1 -1
  82. package/src/duckdb/src/include/duckdb/function/table_macro_function.hpp +5 -0
  83. package/src/duckdb/src/include/duckdb/function/udf_function.hpp +56 -50
  84. package/src/duckdb/src/include/duckdb/main/appender.hpp +2 -2
  85. package/src/duckdb/src/include/duckdb/main/client_context.hpp +2 -2
  86. package/src/duckdb/src/include/duckdb/main/client_data.hpp +3 -1
  87. package/src/duckdb/src/include/duckdb/main/connection.hpp +8 -9
  88. package/src/duckdb/src/include/duckdb/main/extension_entries.hpp +1 -0
  89. package/src/duckdb/src/include/duckdb/main/query_result.hpp +3 -3
  90. package/src/duckdb/src/include/duckdb/main/relation.hpp +6 -7
  91. package/src/duckdb/src/include/duckdb/optimizer/optimizer_extension.hpp +1 -1
  92. package/src/duckdb/src/include/duckdb/parser/column_list.hpp +7 -7
  93. package/src/duckdb/src/include/duckdb/parser/parsed_data/attach_info.hpp +4 -7
  94. package/src/duckdb/src/include/duckdb/parser/parsed_data/create_macro_info.hpp +8 -12
  95. package/src/duckdb/src/include/duckdb/parser/parsed_data/create_sequence_info.hpp +6 -20
  96. package/src/duckdb/src/include/duckdb/parser/parsed_data/create_type_info.hpp +6 -18
  97. package/src/duckdb/src/include/duckdb/parser/parsed_data/detach_info.hpp +4 -8
  98. package/src/duckdb/src/include/duckdb/parser/parsed_data/drop_info.hpp +4 -38
  99. package/src/duckdb/src/include/duckdb/parser/parsed_data/transaction_info.hpp +5 -2
  100. package/src/duckdb/src/include/duckdb/parser/parsed_data/vacuum_info.hpp +10 -10
  101. package/src/duckdb/src/include/duckdb/parser/parser_extension.hpp +2 -2
  102. package/src/duckdb/src/include/duckdb/parser/sql_statement.hpp +1 -1
  103. package/src/duckdb/src/include/duckdb/parser/statement/select_statement.hpp +1 -1
  104. package/src/duckdb/src/include/duckdb/planner/operator_extension.hpp +2 -2
  105. package/src/duckdb/src/include/duckdb/storage/storage_extension.hpp +2 -2
  106. package/src/duckdb/src/parser/parsed_data/attach_info.cpp +42 -0
  107. package/src/duckdb/src/parser/parsed_data/create_index_info.cpp +0 -7
  108. package/src/duckdb/src/parser/parsed_data/create_info.cpp +19 -8
  109. package/src/duckdb/src/parser/parsed_data/create_macro_info.cpp +46 -0
  110. package/src/duckdb/src/parser/parsed_data/create_sequence_info.cpp +56 -0
  111. package/src/duckdb/src/parser/parsed_data/create_type_info.cpp +47 -0
  112. package/src/duckdb/src/parser/parsed_data/detach_info.cpp +34 -0
  113. package/src/duckdb/src/parser/parsed_data/drop_info.cpp +46 -0
  114. package/src/duckdb/src/parser/parsed_data/transaction_info.cpp +24 -0
  115. package/src/duckdb/src/parser/parsed_data/vacuum_info.cpp +37 -0
  116. package/src/duckdb/src/planner/binder/expression/bind_star_expression.cpp +27 -9
  117. package/src/duckdb/src/planner/binder/statement/bind_copy.cpp +9 -4
  118. package/src/duckdb/src/planner/binder/statement/bind_create.cpp +2 -1
  119. package/src/duckdb/src/planner/binder/statement/bind_create_table.cpp +1 -0
  120. package/src/duckdb/src/planner/binder/tableref/bind_basetableref.cpp +1 -1
  121. package/src/duckdb/src/planner/logical_operator.cpp +1 -2
  122. package/src/duckdb/src/planner/operator/logical_create_index.cpp +16 -25
  123. package/src/duckdb/src/planner/operator/logical_insert.cpp +30 -0
  124. package/src/duckdb/src/planner/operator/logical_simple.cpp +33 -5
  125. package/src/duckdb/src/planner/parsed_data/bound_create_table_info.cpp +6 -16
  126. package/src/duckdb/src/planner/planner.cpp +4 -13
  127. package/src/duckdb/src/storage/checkpoint_manager.cpp +12 -6
  128. package/src/duckdb/src/storage/single_file_block_manager.cpp +0 -4
  129. package/src/duckdb/src/storage/storage_info.cpp +1 -1
  130. package/src/duckdb/third_party/libpg_query/src_backend_parser_gram.cpp +5735 -5773
  131. package/src/duckdb/ub_src_catalog_catalog_entry.cpp +1 -1
  132. package/src/duckdb/ub_src_parser_parsed_data.cpp +16 -0
  133. package/src/duckdb/src/catalog/catalog_entry/scalar_macro_catalog_entry.cpp +0 -104
@@ -8,6 +8,15 @@
8
8
 
9
9
  namespace duckdb {
10
10
 
11
+ string GetColumnsStringValue(ParsedExpression &expr) {
12
+ if (expr.type == ExpressionType::COLUMN_REF) {
13
+ auto &colref = expr.Cast<ColumnRefExpression>();
14
+ return colref.GetColumnName();
15
+ } else {
16
+ return expr.ToString();
17
+ }
18
+ }
19
+
11
20
  bool Binder::FindStarExpression(unique_ptr<ParsedExpression> &expr, StarExpression **star, bool is_root,
12
21
  bool in_columns) {
13
22
  bool has_star = false;
@@ -33,7 +42,7 @@ bool Binder::FindStarExpression(unique_ptr<ParsedExpression> &expr, StarExpressi
33
42
  vector<Value> values;
34
43
  values.reserve(star_list.size());
35
44
  for (auto &expr : star_list) {
36
- values.emplace_back(expr->ToString());
45
+ values.emplace_back(GetColumnsStringValue(*expr));
37
46
  }
38
47
  D_ASSERT(!values.empty());
39
48
 
@@ -139,17 +148,26 @@ void Binder::ExpandStarExpression(unique_ptr<ParsedExpression> expr,
139
148
  }
140
149
  auto &children = ListValue::GetChildren(val);
141
150
  vector<unique_ptr<ParsedExpression>> new_list;
151
+ // scan the list for all selected columns and construct a lookup table
152
+ case_insensitive_map_t<bool> selected_set;
142
153
  for (auto &child : children) {
143
- auto qname = QualifiedName::Parse(StringValue::Get(child));
144
- vector<string> names;
145
- if (!qname.catalog.empty()) {
146
- names.push_back(qname.catalog);
154
+ selected_set.insert(make_pair(StringValue::Get(child), false));
155
+ }
156
+ // now check the list of all possible expressions and select which ones make it in
157
+ for (auto &expr : star_list) {
158
+ auto str = GetColumnsStringValue(*expr);
159
+ auto entry = selected_set.find(str);
160
+ if (entry != selected_set.end()) {
161
+ new_list.push_back(std::move(expr));
162
+ entry->second = true;
147
163
  }
148
- if (!qname.schema.empty()) {
149
- names.push_back(qname.schema);
164
+ }
165
+ // check if all expressions found a match
166
+ for (auto &entry : selected_set) {
167
+ if (!entry.second) {
168
+ throw BinderException("Column \"%s\" was selected but was not found in the FROM clause",
169
+ entry.first);
150
170
  }
151
- names.push_back(qname.name);
152
- new_list.push_back(make_uniq<ColumnRefExpression>(std::move(names)));
153
171
  }
154
172
  star_list = std::move(new_list);
155
173
  } else {
@@ -129,10 +129,15 @@ BoundStatement Binder::BindCopyTo(CopyStatement &stmt) {
129
129
  if (per_thread_output && !partition_cols.empty()) {
130
130
  throw NotImplementedException("Can't combine PER_THREAD_OUTPUT and PARTITION_BY for COPY");
131
131
  }
132
- bool is_file_and_exists = config.file_system->FileExists(stmt.info->file_path);
133
- bool is_stdout = stmt.info->file_path == "/dev/stdout";
134
- if (!user_set_use_tmp_file) {
135
- use_tmp_file = is_file_and_exists && !per_thread_output && partition_cols.empty() && !is_stdout;
132
+ bool is_remote_file = config.file_system->IsRemoteFile(stmt.info->file_path);
133
+ if (is_remote_file) {
134
+ use_tmp_file = false;
135
+ } else {
136
+ bool is_file_and_exists = config.file_system->FileExists(stmt.info->file_path);
137
+ bool is_stdout = stmt.info->file_path == "/dev/stdout";
138
+ if (!user_set_use_tmp_file) {
139
+ use_tmp_file = is_file_and_exists && !per_thread_output && partition_cols.empty() && !is_stdout;
140
+ }
136
141
  }
137
142
 
138
143
  auto unique_column_names = GetUniqueNames(select_node.names);
@@ -455,7 +455,7 @@ static bool AnyConstraintReferencesGeneratedColumn(CreateTableInfo &table_info)
455
455
  unique_ptr<LogicalOperator> DuckCatalog::BindCreateIndex(Binder &binder, CreateStatement &stmt,
456
456
  TableCatalogEntry &table, unique_ptr<LogicalOperator> plan) {
457
457
  D_ASSERT(plan->type == LogicalOperatorType::LOGICAL_GET);
458
- auto &base = (CreateIndexInfo &)*stmt.info;
458
+ auto &base = stmt.info->Cast<CreateIndexInfo>();
459
459
 
460
460
  auto &get = plan->Cast<LogicalGet>();
461
461
  // bind the index expressions
@@ -614,6 +614,7 @@ BoundStatement Binder::Bind(CreateStatement &stmt) {
614
614
  // CREATE TYPE mood AS ENUM (SELECT 'happy')
615
615
  auto query_obj = Bind(*create_type_info.query);
616
616
  auto query = std::move(query_obj.plan);
617
+ create_type_info.query.reset();
617
618
 
618
619
  auto &sql_types = query_obj.types;
619
620
  if (sql_types.size() != 1) {
@@ -256,6 +256,7 @@ unique_ptr<BoundCreateTableInfo> Binder::BindCreateTableInfo(unique_ptr<CreateIn
256
256
  if (base.query) {
257
257
  // construct the result object
258
258
  auto query_obj = Bind(*base.query);
259
+ base.query.reset();
259
260
  result->query = std::move(query_obj.plan);
260
261
 
261
262
  // construct the set of columns based on the names and types of the query
@@ -94,7 +94,7 @@ unique_ptr<BoundTableRef> Binder::Bind(BaseTableRef &ref) {
94
94
  for (auto &scan : config.replacement_scans) {
95
95
  auto replacement_function = scan.function(context, table_name, scan.data.get());
96
96
  if (replacement_function) {
97
- replacement_function->alias = ref.alias.empty() ? ref.table_name : ref.alias;
97
+ replacement_function->alias = ref.alias.empty() ? replacement_function->alias : ref.alias;
98
98
  if (replacement_function->type == TableReferenceType::TABLE_FUNCTION) {
99
99
  auto &table_function = replacement_function->Cast<TableFunctionRef>();
100
100
  table_function.column_name_alias = ref.column_name_alias;
@@ -344,10 +344,9 @@ unique_ptr<LogicalOperator> LogicalOperator::Deserialize(Deserializer &deseriali
344
344
  case LogicalOperatorType::LOGICAL_ATTACH:
345
345
  case LogicalOperatorType::LOGICAL_TRANSACTION:
346
346
  case LogicalOperatorType::LOGICAL_DROP:
347
+ case LogicalOperatorType::LOGICAL_DETACH:
347
348
  result = LogicalSimple::Deserialize(state, reader);
348
349
  break;
349
- case LogicalOperatorType::LOGICAL_DETACH:
350
- throw SerializationException("Logical Detach does not support serialization");
351
350
  case LogicalOperatorType::LOGICAL_EXTENSION_OPERATOR:
352
351
  result = LogicalExtensionOperator::Deserialize(state, reader);
353
352
  break;
@@ -7,43 +7,34 @@
7
7
  namespace duckdb {
8
8
 
9
9
  void LogicalCreateIndex::Serialize(FieldWriter &writer) const {
10
-
11
10
  writer.WriteOptional(info);
12
- table.Serialize(writer.GetSerializer());
11
+ writer.WriteString(table.catalog.GetName());
12
+ writer.WriteString(table.schema.name);
13
+ writer.WriteString(table.name);
13
14
  FunctionSerializer::SerializeBase<TableFunction>(writer, function, bind_data.get());
14
15
  writer.WriteSerializableList(unbound_expressions);
15
-
16
- writer.Finalize();
17
16
  }
18
17
 
19
18
  unique_ptr<LogicalOperator> LogicalCreateIndex::Deserialize(LogicalDeserializationState &state, FieldReader &reader) {
20
-
21
19
  auto &context = state.gstate.context;
22
- auto catalog_info = TableCatalogEntry::Deserialize(reader.GetSource(), context);
23
-
24
- auto &table =
25
- Catalog::GetEntry<TableCatalogEntry>(context, catalog_info->catalog, catalog_info->schema, catalog_info->table);
26
- auto unbound_expressions = reader.ReadRequiredSerializableList<Expression>(state.gstate);
27
-
28
- auto create_info = reader.ReadOptional<CreateInfo>(nullptr);
29
- if (create_info->type != CatalogType::INDEX_ENTRY) {
30
- throw InternalException("Unexpected type: '%s', expected '%s'", CatalogTypeToString(create_info->type),
31
- CatalogTypeToString(CatalogType::INDEX_ENTRY));
32
- }
33
-
34
- CreateInfo *raw_create_info_ptr = create_info.release();
35
- CreateIndexInfo *raw_create_index_info_ptr = static_cast<CreateIndexInfo *>(raw_create_info_ptr);
36
- unique_ptr<CreateIndexInfo> uptr_create_index_info = unique_ptr<CreateIndexInfo> {raw_create_index_info_ptr};
37
- auto info = unique_ptr<CreateIndexInfo> {static_cast<CreateIndexInfo *>(create_info.release())};
38
20
 
21
+ auto info = reader.ReadOptional<CreateInfo>(nullptr);
22
+ auto catalog = reader.ReadRequired<string>();
23
+ auto schema = reader.ReadRequired<string>();
24
+ auto table_name = reader.ReadRequired<string>();
39
25
  unique_ptr<FunctionData> bind_data;
40
26
  bool has_deserialize;
41
27
  auto function = FunctionSerializer::DeserializeBaseInternal<TableFunction, TableFunctionCatalogEntry>(
42
28
  reader, state.gstate, CatalogType::TABLE_FUNCTION_ENTRY, bind_data, has_deserialize);
43
-
44
- reader.Finalize();
45
- return make_uniq<LogicalCreateIndex>(std::move(bind_data), std::move(info), std::move(unbound_expressions), table,
46
- std::move(function));
29
+ auto unbound_expressions = reader.ReadRequiredSerializableList<Expression>(state.gstate);
30
+ if (info->type != CatalogType::INDEX_ENTRY) {
31
+ throw InternalException("Unexpected type: '%s', expected '%s'", CatalogTypeToString(info->type),
32
+ CatalogTypeToString(CatalogType::INDEX_ENTRY));
33
+ }
34
+ auto index_info = unique_ptr_cast<CreateInfo, CreateIndexInfo>(std::move(info));
35
+ auto &table = Catalog::GetEntry<TableCatalogEntry>(context, catalog, schema, table_name);
36
+ return make_uniq<LogicalCreateIndex>(std::move(bind_data), std::move(index_info), std::move(unbound_expressions),
37
+ table, std::move(function));
47
38
  }
48
39
 
49
40
  } // namespace duckdb
@@ -25,6 +25,16 @@ void LogicalInsert::Serialize(FieldWriter &writer) const {
25
25
  writer.WriteField(return_chunk);
26
26
  writer.WriteSerializableList(bound_defaults);
27
27
  writer.WriteField(action_type);
28
+ writer.WriteRegularSerializableList(expected_set_types);
29
+ writer.WriteList<column_t>(on_conflict_filter);
30
+ writer.WriteOptional(on_conflict_condition);
31
+ writer.WriteOptional(do_update_condition);
32
+ writer.WriteIndexList(set_columns);
33
+ writer.WriteRegularSerializableList(set_types);
34
+ writer.WriteField(excluded_table_index);
35
+ writer.WriteList<column_t>(columns_to_fetch);
36
+ writer.WriteList<column_t>(source_columns);
37
+ writer.WriteSerializableList<Expression>(expressions);
28
38
  }
29
39
 
30
40
  unique_ptr<LogicalOperator> LogicalInsert::Deserialize(LogicalDeserializationState &state, FieldReader &reader) {
@@ -42,6 +52,16 @@ unique_ptr<LogicalOperator> LogicalInsert::Deserialize(LogicalDeserializationSta
42
52
  auto return_chunk = reader.ReadRequired<bool>();
43
53
  auto bound_defaults = reader.ReadRequiredSerializableList<Expression>(state.gstate);
44
54
  auto action_type = reader.ReadRequired<OnConflictAction>();
55
+ auto expected_set_types = reader.ReadRequiredSerializableList<LogicalType, LogicalType>();
56
+ auto on_conflict_filter = reader.ReadRequiredSet<column_t, unordered_set<column_t>>();
57
+ auto on_conflict_condition = reader.ReadOptional<Expression>(nullptr, state.gstate);
58
+ auto do_update_condition = reader.ReadOptional<Expression>(nullptr, state.gstate);
59
+ auto set_columns = reader.ReadRequiredIndexList<PhysicalIndex>();
60
+ auto set_types = reader.ReadRequiredSerializableList<LogicalType, LogicalType>();
61
+ auto excluded_table_index = reader.ReadRequired<idx_t>();
62
+ auto columns_to_fetch = reader.ReadRequiredList<column_t>();
63
+ auto source_columns = reader.ReadRequiredList<column_t>();
64
+ auto expressions = reader.ReadRequiredSerializableList<Expression>(state.gstate);
45
65
 
46
66
  auto &catalog = Catalog::GetCatalog(context, info->catalog);
47
67
 
@@ -54,6 +74,16 @@ unique_ptr<LogicalOperator> LogicalInsert::Deserialize(LogicalDeserializationSta
54
74
  result->expected_types = expected_types;
55
75
  result->bound_defaults = std::move(bound_defaults);
56
76
  result->action_type = action_type;
77
+ result->expected_set_types = std::move(expected_set_types);
78
+ result->on_conflict_filter = std::move(on_conflict_filter);
79
+ result->on_conflict_condition = std::move(on_conflict_condition);
80
+ result->do_update_condition = std::move(do_update_condition);
81
+ result->set_columns = std::move(set_columns);
82
+ result->set_types = std::move(set_types);
83
+ result->excluded_table_index = excluded_table_index;
84
+ result->columns_to_fetch = std::move(columns_to_fetch);
85
+ result->source_columns = std::move(source_columns);
86
+ result->expressions = std::move(expressions);
57
87
  return std::move(result);
58
88
  }
59
89
 
@@ -1,7 +1,11 @@
1
1
  #include "duckdb/planner/operator/logical_simple.hpp"
2
2
  #include "duckdb/parser/parsed_data/alter_info.hpp"
3
+ #include "duckdb/parser/parsed_data/attach_info.hpp"
3
4
  #include "duckdb/parser/parsed_data/drop_info.hpp"
4
5
  #include "duckdb/parser/parsed_data/load_info.hpp"
6
+ #include "duckdb/parser/parsed_data/transaction_info.hpp"
7
+ #include "duckdb/parser/parsed_data/vacuum_info.hpp"
8
+ #include "duckdb/parser/parsed_data/detach_info.hpp"
5
9
 
6
10
  namespace duckdb {
7
11
 
@@ -9,16 +13,28 @@ void LogicalSimple::Serialize(FieldWriter &writer) const {
9
13
  writer.WriteField<LogicalOperatorType>(type);
10
14
  switch (type) {
11
15
  case LogicalOperatorType::LOGICAL_ALTER:
12
- static_cast<const AlterInfo &>(*info).Serialize(writer.GetSerializer());
16
+ info->Cast<AlterInfo>().Serialize(writer.GetSerializer());
13
17
  break;
14
18
  case LogicalOperatorType::LOGICAL_DROP:
15
- static_cast<const DropInfo &>(*info).Serialize(writer.GetSerializer());
19
+ info->Cast<DropInfo>().Serialize(writer.GetSerializer());
16
20
  break;
17
21
  case LogicalOperatorType::LOGICAL_LOAD:
18
- static_cast<const LoadInfo &>(*info).Serialize(writer.GetSerializer());
22
+ info->Cast<LoadInfo>().Serialize(writer.GetSerializer());
23
+ break;
24
+ case LogicalOperatorType::LOGICAL_VACUUM:
25
+ info->Cast<VacuumInfo>().Serialize(writer.GetSerializer());
26
+ break;
27
+ case LogicalOperatorType::LOGICAL_ATTACH:
28
+ info->Cast<AttachInfo>().Serialize(writer.GetSerializer());
29
+ break;
30
+ case LogicalOperatorType::LOGICAL_DETACH:
31
+ info->Cast<DetachInfo>().Serialize(writer.GetSerializer());
32
+ break;
33
+ case LogicalOperatorType::LOGICAL_TRANSACTION:
34
+ info->Cast<TransactionInfo>().Serialize(writer.GetSerializer());
19
35
  break;
20
36
  default:
21
- throw NotImplementedException(LogicalOperatorToString(type));
37
+ throw InternalException(LogicalOperatorToString(type));
22
38
  }
23
39
  }
24
40
 
@@ -35,8 +51,20 @@ unique_ptr<LogicalOperator> LogicalSimple::Deserialize(LogicalDeserializationSta
35
51
  case LogicalOperatorType::LOGICAL_LOAD:
36
52
  parse_info = LoadInfo::Deserialize(reader.GetSource());
37
53
  break;
54
+ case LogicalOperatorType::LOGICAL_VACUUM:
55
+ parse_info = VacuumInfo::Deserialize(reader.GetSource());
56
+ break;
57
+ case LogicalOperatorType::LOGICAL_ATTACH:
58
+ parse_info = AttachInfo::Deserialize(reader.GetSource());
59
+ break;
60
+ case LogicalOperatorType::LOGICAL_DETACH:
61
+ parse_info = DetachInfo::Deserialize(reader.GetSource());
62
+ break;
63
+ case LogicalOperatorType::LOGICAL_TRANSACTION:
64
+ parse_info = TransactionInfo::Deserialize(reader.GetSource());
65
+ break;
38
66
  default:
39
- throw NotImplementedException(LogicalOperatorToString(state.type));
67
+ throw InternalException(LogicalOperatorToString(state.type));
40
68
  }
41
69
  return make_uniq<LogicalSimple>(type, std::move(parse_info));
42
70
  }
@@ -6,25 +6,15 @@
6
6
  namespace duckdb {
7
7
  void BoundCreateTableInfo::Serialize(Serializer &serializer) const {
8
8
  serializer.WriteOptional(base);
9
- serializer.WriteList(constraints);
10
- serializer.WriteList(bound_constraints);
11
- serializer.WriteList(bound_defaults);
12
- serializer.WriteOptional(query);
13
9
  }
14
10
 
15
11
  unique_ptr<BoundCreateTableInfo> BoundCreateTableInfo::Deserialize(Deserializer &source,
16
12
  PlanDeserializationState &state) {
17
- auto create_info_base = source.ReadOptional<CreateInfo>();
18
- // Get schema from the catalog to create BoundCreateTableInfo
19
- auto schema_name = create_info_base->schema;
20
- auto catalog = create_info_base->catalog;
21
- auto &schema_catalog_entry = Catalog::GetSchema(state.context, catalog, schema_name);
22
-
23
- auto result = make_uniq<BoundCreateTableInfo>(schema_catalog_entry, std::move(create_info_base));
24
- source.ReadList<Constraint>(result->constraints);
25
- source.ReadList<BoundConstraint>(result->bound_constraints);
26
- source.ReadList<Expression>(result->bound_defaults, state);
27
- result->query = source.ReadOptional<LogicalOperator>(state);
28
- return result;
13
+ auto info = source.ReadOptional<CreateInfo>();
14
+ auto schema_name = info->schema;
15
+ auto catalog = info->catalog;
16
+ auto binder = Binder::CreateBinder(state.context);
17
+ auto bound_info = binder->BindCreateTableInfo(std::move(info));
18
+ return bound_info;
29
19
  }
30
20
  } // namespace duckdb
@@ -143,24 +143,11 @@ void Planner::CreatePlan(unique_ptr<SQLStatement> statement) {
143
143
 
144
144
  static bool OperatorSupportsSerialization(LogicalOperator &op) {
145
145
  switch (op.type) {
146
- case LogicalOperatorType::LOGICAL_INSERT:
147
- case LogicalOperatorType::LOGICAL_UPDATE:
148
- case LogicalOperatorType::LOGICAL_DELETE:
149
146
  case LogicalOperatorType::LOGICAL_PREPARE:
150
147
  case LogicalOperatorType::LOGICAL_EXECUTE:
151
- case LogicalOperatorType::LOGICAL_ALTER:
152
- case LogicalOperatorType::LOGICAL_CREATE_TABLE:
153
- case LogicalOperatorType::LOGICAL_CREATE_INDEX:
154
- case LogicalOperatorType::LOGICAL_CREATE_SEQUENCE:
155
- case LogicalOperatorType::LOGICAL_CREATE_VIEW:
156
- case LogicalOperatorType::LOGICAL_CREATE_SCHEMA:
157
- case LogicalOperatorType::LOGICAL_CREATE_MACRO:
158
148
  case LogicalOperatorType::LOGICAL_PRAGMA:
159
- case LogicalOperatorType::LOGICAL_TRANSACTION:
160
- case LogicalOperatorType::LOGICAL_CREATE_TYPE:
161
149
  case LogicalOperatorType::LOGICAL_EXPLAIN:
162
150
  case LogicalOperatorType::LOGICAL_COPY_TO_FILE:
163
- case LogicalOperatorType::LOGICAL_VACUUM:
164
151
  // unsupported (for now)
165
152
  return false;
166
153
  default:
@@ -175,6 +162,10 @@ static bool OperatorSupportsSerialization(LogicalOperator &op) {
175
162
  }
176
163
 
177
164
  void Planner::VerifyPlan(ClientContext &context, unique_ptr<LogicalOperator> &op, bound_parameter_map_t *map) {
165
+ #ifdef DUCKDB_ALTERNATIVE_VERIFY
166
+ // if alternate verification is enabled we run the original operator
167
+ return;
168
+ #endif
178
169
  if (!op || !ClientConfig::GetConfig(context).verify_serializer) {
179
170
  return;
180
171
  }
@@ -337,7 +337,6 @@ void CheckpointWriter::WriteIndex(IndexCatalogEntry &index_catalog) {
337
337
  }
338
338
 
339
339
  void CheckpointReader::ReadIndex(ClientContext &context, MetaBlockReader &reader) {
340
-
341
340
  // deserialize the index metadata
342
341
  auto info = IndexCatalogEntry::Deserialize(reader, context);
343
342
 
@@ -361,10 +360,17 @@ void CheckpointReader::ReadIndex(ClientContext &context, MetaBlockReader &reader
361
360
  }
362
361
 
363
362
  // bind the parsed expressions
363
+ // add the table to the bind context
364
364
  auto binder = Binder::CreateBinder(context);
365
- auto &table_ref = info->table->Cast<TableRef>();
366
- auto bound_table = binder->Bind(table_ref);
367
- D_ASSERT(bound_table->type == TableReferenceType::BASE_TABLE);
365
+ vector<LogicalType> column_types;
366
+ vector<string> column_names;
367
+ for (auto &col : table_catalog.GetColumns().Logical()) {
368
+ column_types.push_back(col.Type());
369
+ column_names.push_back(col.Name());
370
+ }
371
+ vector<column_t> column_ids;
372
+ binder->bind_context.AddBaseTable(0, info->table->table_name, column_names, column_types, column_ids,
373
+ &table_catalog);
368
374
  IndexBinder idx_binder(*binder, context);
369
375
  unbound_expressions.reserve(parsed_expressions.size());
370
376
  for (auto &expr : parsed_expressions) {
@@ -419,7 +425,7 @@ void CheckpointWriter::WriteMacro(ScalarMacroCatalogEntry &macro) {
419
425
  }
420
426
 
421
427
  void CheckpointReader::ReadMacro(ClientContext &context, MetaBlockReader &reader) {
422
- auto info = ScalarMacroCatalogEntry::Deserialize(reader, context);
428
+ auto info = MacroCatalogEntry::Deserialize(reader, context);
423
429
  catalog.CreateFunction(context, *info);
424
430
  }
425
431
 
@@ -428,7 +434,7 @@ void CheckpointWriter::WriteTableMacro(TableMacroCatalogEntry &macro) {
428
434
  }
429
435
 
430
436
  void CheckpointReader::ReadTableMacro(ClientContext &context, MetaBlockReader &reader) {
431
- auto info = TableMacroCatalogEntry::Deserialize(reader, context);
437
+ auto info = MacroCatalogEntry::Deserialize(reader, context);
432
438
  catalog.CreateFunction(context, *info);
433
439
  }
434
440
 
@@ -241,10 +241,6 @@ void SingleFileBlockManager::Initialize(DatabaseHeader &header) {
241
241
  }
242
242
 
243
243
  void SingleFileBlockManager::LoadFreeList() {
244
- if (options.read_only) {
245
- // no need to load free list for read only db
246
- return;
247
- }
248
244
  if (free_list_id == INVALID_BLOCK) {
249
245
  // no free list
250
246
  return;
@@ -2,7 +2,7 @@
2
2
 
3
3
  namespace duckdb {
4
4
 
5
- const uint64_t VERSION_NUMBER = 50;
5
+ const uint64_t VERSION_NUMBER = 51;
6
6
 
7
7
  struct StorageVersionInfo {
8
8
  const char *version_name;