duckdb 0.7.1-dev11.0 → 0.7.1-dev137.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 (80) hide show
  1. package/package.json +1 -1
  2. package/src/duckdb/extension/json/buffered_json_reader.cpp +29 -5
  3. package/src/duckdb/extension/json/include/buffered_json_reader.hpp +5 -1
  4. package/src/duckdb/extension/json/include/json_scan.hpp +17 -2
  5. package/src/duckdb/extension/json/json_functions/json_transform.cpp +19 -0
  6. package/src/duckdb/extension/json/json_functions/read_json.cpp +30 -28
  7. package/src/duckdb/extension/json/json_functions.cpp +6 -0
  8. package/src/duckdb/extension/json/json_scan.cpp +111 -23
  9. package/src/duckdb/extension/parquet/parquet-extension.cpp +3 -2
  10. package/src/duckdb/src/common/enums/logical_operator_type.cpp +2 -0
  11. package/src/duckdb/src/common/enums/physical_operator_type.cpp +2 -0
  12. package/src/duckdb/src/common/enums/statement_type.cpp +2 -0
  13. package/src/duckdb/src/common/file_system.cpp +14 -0
  14. package/src/duckdb/src/common/operator/cast_operators.cpp +14 -8
  15. package/src/duckdb/src/common/printer.cpp +1 -1
  16. package/src/duckdb/src/common/types/time.cpp +1 -1
  17. package/src/duckdb/src/common/types/timestamp.cpp +35 -4
  18. package/src/duckdb/src/common/types.cpp +36 -10
  19. package/src/duckdb/src/execution/column_binding_resolver.cpp +5 -2
  20. package/src/duckdb/src/execution/operator/persistent/base_csv_reader.cpp +6 -11
  21. package/src/duckdb/src/execution/operator/persistent/buffered_csv_reader.cpp +7 -13
  22. package/src/duckdb/src/execution/operator/persistent/parallel_csv_reader.cpp +1 -1
  23. package/src/duckdb/src/execution/operator/schema/physical_detach.cpp +37 -0
  24. package/src/duckdb/src/execution/operator/schema/physical_drop.cpp +0 -5
  25. package/src/duckdb/src/execution/physical_plan/plan_simple.cpp +4 -0
  26. package/src/duckdb/src/execution/physical_plan_generator.cpp +1 -0
  27. package/src/duckdb/src/function/pragma/pragma_queries.cpp +36 -9
  28. package/src/duckdb/src/function/table/read_csv.cpp +15 -4
  29. package/src/duckdb/src/function/table/version/pragma_version.cpp +2 -2
  30. package/src/duckdb/src/include/duckdb/common/enums/logical_operator_type.hpp +1 -0
  31. package/src/duckdb/src/include/duckdb/common/enums/physical_operator_type.hpp +1 -0
  32. package/src/duckdb/src/include/duckdb/common/enums/statement_type.hpp +2 -1
  33. package/src/duckdb/src/include/duckdb/common/exception.hpp +10 -0
  34. package/src/duckdb/src/include/duckdb/common/file_system.hpp +1 -0
  35. package/src/duckdb/src/include/duckdb/common/types/timestamp.hpp +5 -1
  36. package/src/duckdb/src/include/duckdb/execution/operator/persistent/base_csv_reader.hpp +1 -3
  37. package/src/duckdb/src/include/duckdb/execution/operator/persistent/buffered_csv_reader.hpp +0 -2
  38. package/src/duckdb/src/include/duckdb/execution/operator/persistent/csv_reader_options.hpp +2 -0
  39. package/src/duckdb/src/include/duckdb/execution/operator/schema/physical_detach.hpp +32 -0
  40. package/src/duckdb/src/include/duckdb/main/client_data.hpp +2 -2
  41. package/src/duckdb/src/include/duckdb/main/config.hpp +0 -3
  42. package/src/duckdb/src/include/duckdb/parser/parsed_data/create_database_info.hpp +0 -4
  43. package/src/duckdb/src/include/duckdb/parser/parsed_data/detach_info.hpp +32 -0
  44. package/src/duckdb/src/include/duckdb/parser/statement/detach_statement.hpp +29 -0
  45. package/src/duckdb/src/include/duckdb/parser/statement/list.hpp +1 -0
  46. package/src/duckdb/src/include/duckdb/parser/tokens.hpp +1 -0
  47. package/src/duckdb/src/include/duckdb/parser/transformer.hpp +1 -0
  48. package/src/duckdb/src/include/duckdb/planner/binder.hpp +1 -0
  49. package/src/duckdb/src/include/duckdb/planner/operator/logical_execute.hpp +1 -5
  50. package/src/duckdb/src/include/duckdb/planner/operator/logical_show.hpp +1 -2
  51. package/src/duckdb/src/include/duckdb/storage/storage_extension.hpp +7 -0
  52. package/src/duckdb/src/include/duckdb/storage/table/update_segment.hpp +2 -0
  53. package/src/duckdb/src/parser/statement/copy_statement.cpp +2 -13
  54. package/src/duckdb/src/parser/statement/detach_statement.cpp +15 -0
  55. package/src/duckdb/src/parser/statement/insert_statement.cpp +3 -0
  56. package/src/duckdb/src/parser/transform/expression/transform_case.cpp +3 -3
  57. package/src/duckdb/src/parser/transform/statement/transform_create_database.cpp +0 -1
  58. package/src/duckdb/src/parser/transform/statement/transform_detach.cpp +19 -0
  59. package/src/duckdb/src/parser/transformer.cpp +2 -0
  60. package/src/duckdb/src/planner/binder/statement/bind_create.cpp +16 -14
  61. package/src/duckdb/src/planner/binder/statement/bind_detach.cpp +19 -0
  62. package/src/duckdb/src/planner/binder/statement/bind_drop.cpp +29 -4
  63. package/src/duckdb/src/planner/binder/statement/bind_insert.cpp +22 -1
  64. package/src/duckdb/src/planner/binder/tableref/bind_joinref.cpp +2 -1
  65. package/src/duckdb/src/planner/binder.cpp +2 -0
  66. package/src/duckdb/src/planner/expression_binder/lateral_binder.cpp +21 -5
  67. package/src/duckdb/src/planner/logical_operator.cpp +4 -0
  68. package/src/duckdb/src/planner/planner.cpp +1 -0
  69. package/src/duckdb/src/storage/storage_info.cpp +2 -1
  70. package/src/duckdb/src/storage/table/column_data.cpp +4 -2
  71. package/src/duckdb/src/storage/table/update_segment.cpp +15 -0
  72. package/src/duckdb/third_party/libpg_query/include/nodes/nodes.hpp +1 -0
  73. package/src/duckdb/third_party/libpg_query/include/nodes/parsenodes.hpp +14 -0
  74. package/src/duckdb/third_party/libpg_query/include/parser/gram.hpp +530 -1006
  75. package/src/duckdb/third_party/libpg_query/src_backend_parser_gram.cpp +17659 -17626
  76. package/src/duckdb/ub_src_execution_operator_schema.cpp +2 -0
  77. package/src/duckdb/ub_src_parser_statement.cpp +2 -0
  78. package/src/duckdb/ub_src_parser_transform_statement.cpp +2 -0
  79. package/src/duckdb/ub_src_planner_binder_statement.cpp +2 -0
  80. package/src/duckdb/src/include/duckdb/function/create_database_extension.hpp +0 -37
@@ -0,0 +1,32 @@
1
+ //===----------------------------------------------------------------------===//
2
+ // DuckDB
3
+ //
4
+ // duckdb/execution/operator/schema/physical_detach.hpp
5
+ //
6
+ //
7
+ //===----------------------------------------------------------------------===//
8
+
9
+ #pragma once
10
+
11
+ #include "duckdb/execution/physical_operator.hpp"
12
+ #include "duckdb/parser/parsed_data/detach_info.hpp"
13
+
14
+ namespace duckdb {
15
+
16
+ class PhysicalDetach : public PhysicalOperator {
17
+ public:
18
+ explicit PhysicalDetach(unique_ptr<DetachInfo> info, idx_t estimated_cardinality)
19
+ : PhysicalOperator(PhysicalOperatorType::DETACH, {LogicalType::BOOLEAN}, estimated_cardinality),
20
+ info(std::move(info)) {
21
+ }
22
+
23
+ unique_ptr<DetachInfo> info;
24
+
25
+ public:
26
+ // Source interface
27
+ unique_ptr<GlobalSourceState> GetGlobalSourceState(ClientContext &context) const override;
28
+ void GetData(ExecutionContext &context, DataChunk &chunk, GlobalSourceState &gstate,
29
+ LocalSourceState &lstate) const override;
30
+ };
31
+
32
+ } // namespace duckdb
@@ -11,7 +11,7 @@
11
11
  #include "duckdb/common/common.hpp"
12
12
  #include "duckdb/common/enums/output_type.hpp"
13
13
  #include "duckdb/common/types/value.hpp"
14
- #include "duckdb/common/unordered_map.hpp"
14
+ #include "duckdb/common/case_insensitive_map.hpp"
15
15
  #include "duckdb/common/atomic.hpp"
16
16
 
17
17
  namespace duckdb {
@@ -39,7 +39,7 @@ struct ClientData {
39
39
  //! The set of temporary objects that belong to this client
40
40
  shared_ptr<AttachedDatabase> temporary_objects;
41
41
  //! The set of bound prepared statements that belong to this client
42
- unordered_map<string, shared_ptr<PreparedStatementData>> prepared_statements;
42
+ case_insensitive_map_t<shared_ptr<PreparedStatementData>> prepared_statements;
43
43
 
44
44
  //! The writer used to log queries (if logging is enabled)
45
45
  unique_ptr<BufferedFileWriter> log_query_writer;
@@ -25,7 +25,6 @@
25
25
  #include "duckdb/storage/compression/bitpacking.hpp"
26
26
  #include "duckdb/function/cast/default_casts.hpp"
27
27
  #include "duckdb/function/replacement_scan.hpp"
28
- #include "duckdb/function/create_database_extension.hpp"
29
28
  #include "duckdb/optimizer/optimizer_extension.hpp"
30
29
  #include "duckdb/parser/parser_extension.hpp"
31
30
  #include "duckdb/planner/operator_extension.hpp"
@@ -185,8 +184,6 @@ public:
185
184
  vector<std::unique_ptr<OperatorExtension>> operator_extensions;
186
185
  //! Extensions made to storage
187
186
  case_insensitive_map_t<std::unique_ptr<StorageExtension>> storage_extensions;
188
- //! Extensions made to binder to implement the create_database functionality
189
- vector<CreateDatabaseExtension> create_database_extensions;
190
187
 
191
188
  public:
192
189
  DUCKDB_API static DBConfig &GetConfig(ClientContext &context);
@@ -16,9 +16,6 @@ struct CreateDatabaseInfo : public CreateInfo {
16
16
  CreateDatabaseInfo() : CreateInfo(CatalogType::DATABASE_ENTRY) {
17
17
  }
18
18
 
19
- //! Extension name which creates databases
20
- string extension_name;
21
-
22
19
  //! Name of the database
23
20
  string name;
24
21
 
@@ -29,7 +26,6 @@ public:
29
26
  unique_ptr<CreateInfo> Copy() const override {
30
27
  auto result = make_unique<CreateDatabaseInfo>();
31
28
  CopyProperties(*result);
32
- result->extension_name = extension_name;
33
29
  result->name = name;
34
30
  result->path = path;
35
31
  return unique_ptr<CreateInfo>(result.release());
@@ -0,0 +1,32 @@
1
+ //===----------------------------------------------------------------------===//
2
+ // DuckDB
3
+ //
4
+ // duckdb/parser/parsed_data/detach_info.hpp
5
+ //
6
+ //
7
+ //===----------------------------------------------------------------------===//
8
+
9
+ #pragma once
10
+
11
+ #include "duckdb/parser/parsed_data/parse_info.hpp"
12
+
13
+ namespace duckdb {
14
+
15
+ struct DetachInfo : public ParseInfo {
16
+ DetachInfo() {
17
+ }
18
+
19
+ //! The alias of the attached database
20
+ string name;
21
+ //! Whether to throw an exception if alias is not found
22
+ bool if_exists;
23
+
24
+ public:
25
+ unique_ptr<DetachInfo> Copy() const {
26
+ auto result = make_unique<DetachInfo>();
27
+ result->name = name;
28
+ result->if_exists = if_exists;
29
+ return result;
30
+ }
31
+ };
32
+ } // namespace duckdb
@@ -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,
@@ -32,11 +32,7 @@ protected:
32
32
  // already resolved
33
33
  }
34
34
  vector<ColumnBinding> GetColumnBindings() override {
35
- vector<ColumnBinding> bindings;
36
- for (idx_t i = 0; i < types.size(); i++) {
37
- bindings.push_back(ColumnBinding(0, i));
38
- }
39
- return bindings;
35
+ return GenerateColumnBindings(0, types.size());
40
36
  }
41
37
  };
42
38
  } // namespace duckdb
@@ -33,8 +33,7 @@ protected:
33
33
  LogicalType::VARCHAR, LogicalType::VARCHAR, LogicalType::VARCHAR};
34
34
  }
35
35
  vector<ColumnBinding> GetColumnBindings() override {
36
- return {ColumnBinding(0, 0), ColumnBinding(0, 1), ColumnBinding(0, 2),
37
- ColumnBinding(0, 3), ColumnBinding(0, 4), ColumnBinding(0, 5)};
36
+ return GenerateColumnBindings(0, types.size());
38
37
  }
39
38
  };
40
39
  } // namespace duckdb
@@ -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;
@@ -11,16 +11,6 @@ CopyStatement::CopyStatement(const CopyStatement &other) : SQLStatement(other),
11
11
  }
12
12
  }
13
13
 
14
- string ConvertOptionValueToString(const Value &val) {
15
- auto type = val.type().id();
16
- switch (type) {
17
- case LogicalTypeId::VARCHAR:
18
- return KeywordHelper::WriteOptionallyQuoted(val.ToString());
19
- default:
20
- return val.ToString();
21
- }
22
- }
23
-
24
14
  string CopyStatement::CopyOptionsToString(const string &format,
25
15
  const case_insensitive_map_t<vector<Value>> &options) const {
26
16
  if (format.empty() && options.empty()) {
@@ -45,15 +35,14 @@ string CopyStatement::CopyOptionsToString(const string &format,
45
35
  // Options like HEADER don't need an explicit value
46
36
  // just providing the name already sets it to true
47
37
  } else if (values.size() == 1) {
48
- result += ConvertOptionValueToString(values[0]);
38
+ result += values[0].ToSQLString();
49
39
  } else {
50
40
  result += "( ";
51
41
  for (idx_t i = 0; i < values.size(); i++) {
52
- auto &value = values[i];
53
42
  if (i) {
54
43
  result += ", ";
55
44
  }
56
- result += KeywordHelper::WriteOptionallyQuoted(value.ToString());
45
+ result += values[i].ToSQLString();
57
46
  }
58
47
  result += " )";
59
48
  }
@@ -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
@@ -28,6 +28,9 @@ InsertStatement::InsertStatement(const InsertStatement &other)
28
28
  select_statement(unique_ptr_cast<SQLStatement, SelectStatement>(other.select_statement->Copy())),
29
29
  columns(other.columns), table(other.table), schema(other.schema), catalog(other.catalog) {
30
30
  cte_map = other.cte_map.Copy();
31
+ if (other.table_ref) {
32
+ table_ref = other.table_ref->Copy();
33
+ }
31
34
  if (other.on_conflict_info) {
32
35
  on_conflict_info = other.on_conflict_info->Copy();
33
36
  }
@@ -9,16 +9,16 @@ unique_ptr<ParsedExpression> Transformer::TransformCase(duckdb_libpgquery::PGCas
9
9
  D_ASSERT(root);
10
10
 
11
11
  auto case_node = make_unique<CaseExpression>();
12
+ auto root_arg = TransformExpression(reinterpret_cast<duckdb_libpgquery::PGNode *>(root->arg));
12
13
  for (auto cell = root->args->head; cell != nullptr; cell = cell->next) {
13
14
  CaseCheck case_check;
14
15
 
15
16
  auto w = reinterpret_cast<duckdb_libpgquery::PGCaseWhen *>(cell->data.ptr_value);
16
17
  auto test_raw = TransformExpression(reinterpret_cast<duckdb_libpgquery::PGNode *>(w->expr));
17
18
  unique_ptr<ParsedExpression> test;
18
- auto arg = TransformExpression(reinterpret_cast<duckdb_libpgquery::PGNode *>(root->arg));
19
- if (arg) {
19
+ if (root_arg) {
20
20
  case_check.when_expr =
21
- make_unique<ComparisonExpression>(ExpressionType::COMPARE_EQUAL, std::move(arg), std::move(test_raw));
21
+ make_unique<ComparisonExpression>(ExpressionType::COMPARE_EQUAL, root_arg->Copy(), std::move(test_raw));
22
22
  } else {
23
23
  case_check.when_expr = std::move(test_raw);
24
24
  }
@@ -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
  }
@@ -301,7 +301,28 @@ void Binder::BindOnConflictClause(LogicalInsert &insert, TableCatalogEntry &tabl
301
301
  insert.on_conflict_condition = std::move(condition);
302
302
  }
303
303
 
304
- auto projection_index = insert.children[0]->GetTableIndex()[0];
304
+ auto bindings = insert.children[0]->GetColumnBindings();
305
+ idx_t projection_index = DConstants::INVALID_INDEX;
306
+ std::vector<unique_ptr<LogicalOperator>> *insert_child_operators;
307
+ insert_child_operators = &insert.children;
308
+ while (projection_index == DConstants::INVALID_INDEX) {
309
+ if (insert_child_operators->empty()) {
310
+ // No further children to visit
311
+ break;
312
+ }
313
+ D_ASSERT(insert_child_operators->size() >= 1);
314
+ auto &current_child = (*insert_child_operators)[0];
315
+ auto table_indices = current_child->GetTableIndex();
316
+ if (table_indices.empty()) {
317
+ // This operator does not have a table index to refer to, we have to visit its children
318
+ insert_child_operators = &current_child->children;
319
+ continue;
320
+ }
321
+ projection_index = table_indices[0];
322
+ }
323
+ if (projection_index == DConstants::INVALID_INDEX) {
324
+ throw InternalException("Could not locate a table_index from the children of the insert");
325
+ }
305
326
 
306
327
  string unused;
307
328
  auto original_binding = bind_context.GetBinding(table_alias, unused);
@@ -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
 
@@ -57,6 +57,7 @@ void LogicalOperator::ResolveOperatorTypes() {
57
57
 
58
58
  vector<ColumnBinding> LogicalOperator::GenerateColumnBindings(idx_t table_idx, idx_t column_count) {
59
59
  vector<ColumnBinding> result;
60
+ result.reserve(column_count);
60
61
  for (idx_t i = 0; i < column_count; i++) {
61
62
  result.emplace_back(table_idx, i);
62
63
  }
@@ -84,6 +85,7 @@ vector<ColumnBinding> LogicalOperator::MapBindings(const vector<ColumnBinding> &
84
85
  vector<ColumnBinding> result_bindings;
85
86
  result_bindings.reserve(projection_map.size());
86
87
  for (auto index : projection_map) {
88
+ D_ASSERT(index < bindings.size());
87
89
  result_bindings.push_back(bindings[index]);
88
90
  }
89
91
  return result_bindings;
@@ -338,6 +340,8 @@ unique_ptr<LogicalOperator> LogicalOperator::Deserialize(Deserializer &deseriali
338
340
  case LogicalOperatorType::LOGICAL_DROP:
339
341
  result = LogicalSimple::Deserialize(state, reader);
340
342
  break;
343
+ case LogicalOperatorType::LOGICAL_DETACH:
344
+ throw SerializationException("Logical Detach does not support serialization");
341
345
  case LogicalOperatorType::LOGICAL_EXTENSION_OPERATOR:
342
346
  result = LogicalExtensionOperator::Deserialize(state, reader);
343
347
  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},