duckdb 0.7.1-dev14.0 → 0.7.1-dev157.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.
- package/package.json +1 -1
- package/src/duckdb/extension/json/buffered_json_reader.cpp +29 -5
- package/src/duckdb/extension/json/include/buffered_json_reader.hpp +5 -1
- package/src/duckdb/extension/json/include/json_scan.hpp +17 -2
- package/src/duckdb/extension/json/json_functions/json_transform.cpp +19 -0
- package/src/duckdb/extension/json/json_functions/read_json.cpp +30 -28
- package/src/duckdb/extension/json/json_functions.cpp +6 -0
- package/src/duckdb/extension/json/json_scan.cpp +111 -23
- package/src/duckdb/extension/parquet/parquet-extension.cpp +3 -2
- package/src/duckdb/src/common/enums/logical_operator_type.cpp +2 -0
- package/src/duckdb/src/common/enums/physical_operator_type.cpp +2 -0
- package/src/duckdb/src/common/enums/statement_type.cpp +2 -0
- package/src/duckdb/src/common/file_system.cpp +14 -0
- package/src/duckdb/src/common/operator/cast_operators.cpp +14 -8
- package/src/duckdb/src/common/printer.cpp +1 -1
- package/src/duckdb/src/common/types/time.cpp +1 -1
- package/src/duckdb/src/common/types/timestamp.cpp +35 -4
- package/src/duckdb/src/common/types.cpp +36 -10
- package/src/duckdb/src/execution/column_binding_resolver.cpp +5 -2
- package/src/duckdb/src/execution/operator/join/physical_iejoin.cpp +7 -9
- package/src/duckdb/src/execution/operator/persistent/base_csv_reader.cpp +6 -11
- package/src/duckdb/src/execution/operator/persistent/buffered_csv_reader.cpp +7 -13
- package/src/duckdb/src/execution/operator/persistent/parallel_csv_reader.cpp +1 -1
- package/src/duckdb/src/execution/operator/schema/physical_detach.cpp +37 -0
- package/src/duckdb/src/execution/operator/schema/physical_drop.cpp +0 -5
- package/src/duckdb/src/execution/physical_plan/plan_simple.cpp +4 -0
- package/src/duckdb/src/execution/physical_plan_generator.cpp +1 -0
- package/src/duckdb/src/function/pragma/pragma_queries.cpp +36 -9
- package/src/duckdb/src/function/table/read_csv.cpp +15 -4
- package/src/duckdb/src/function/table/version/pragma_version.cpp +2 -2
- package/src/duckdb/src/include/duckdb/common/enums/logical_operator_type.hpp +1 -0
- package/src/duckdb/src/include/duckdb/common/enums/physical_operator_type.hpp +1 -0
- package/src/duckdb/src/include/duckdb/common/enums/statement_type.hpp +2 -1
- package/src/duckdb/src/include/duckdb/common/exception.hpp +10 -0
- package/src/duckdb/src/include/duckdb/common/file_system.hpp +1 -0
- package/src/duckdb/src/include/duckdb/common/types/timestamp.hpp +5 -1
- package/src/duckdb/src/include/duckdb/execution/operator/persistent/base_csv_reader.hpp +1 -3
- package/src/duckdb/src/include/duckdb/execution/operator/persistent/buffered_csv_reader.hpp +0 -2
- package/src/duckdb/src/include/duckdb/execution/operator/persistent/csv_reader_options.hpp +2 -0
- package/src/duckdb/src/include/duckdb/execution/operator/schema/physical_detach.hpp +32 -0
- package/src/duckdb/src/include/duckdb/main/client_data.hpp +2 -2
- package/src/duckdb/src/include/duckdb/main/config.hpp +0 -3
- package/src/duckdb/src/include/duckdb/parser/parsed_data/create_database_info.hpp +0 -4
- package/src/duckdb/src/include/duckdb/parser/parsed_data/detach_info.hpp +32 -0
- package/src/duckdb/src/include/duckdb/parser/statement/detach_statement.hpp +29 -0
- package/src/duckdb/src/include/duckdb/parser/statement/list.hpp +1 -0
- package/src/duckdb/src/include/duckdb/parser/tokens.hpp +1 -0
- package/src/duckdb/src/include/duckdb/parser/transformer.hpp +1 -0
- package/src/duckdb/src/include/duckdb/planner/binder.hpp +1 -0
- package/src/duckdb/src/include/duckdb/planner/operator/logical_execute.hpp +1 -5
- package/src/duckdb/src/include/duckdb/planner/operator/logical_show.hpp +1 -2
- package/src/duckdb/src/include/duckdb/storage/storage_extension.hpp +7 -0
- package/src/duckdb/src/include/duckdb/storage/table/update_segment.hpp +2 -0
- package/src/duckdb/src/main/client_context.cpp +2 -0
- package/src/duckdb/src/main/extension/extension_alias.cpp +2 -1
- package/src/duckdb/src/parser/statement/copy_statement.cpp +2 -13
- package/src/duckdb/src/parser/statement/delete_statement.cpp +3 -0
- package/src/duckdb/src/parser/statement/detach_statement.cpp +15 -0
- package/src/duckdb/src/parser/statement/insert_statement.cpp +9 -0
- package/src/duckdb/src/parser/statement/update_statement.cpp +3 -0
- package/src/duckdb/src/parser/transform/expression/transform_case.cpp +3 -3
- package/src/duckdb/src/parser/transform/statement/transform_create_database.cpp +0 -1
- package/src/duckdb/src/parser/transform/statement/transform_detach.cpp +19 -0
- package/src/duckdb/src/parser/transformer.cpp +2 -0
- package/src/duckdb/src/planner/binder/statement/bind_create.cpp +16 -14
- package/src/duckdb/src/planner/binder/statement/bind_detach.cpp +19 -0
- package/src/duckdb/src/planner/binder/statement/bind_drop.cpp +29 -4
- package/src/duckdb/src/planner/binder/statement/bind_insert.cpp +22 -1
- package/src/duckdb/src/planner/binder/tableref/bind_joinref.cpp +2 -1
- package/src/duckdb/src/planner/binder.cpp +2 -0
- package/src/duckdb/src/planner/expression_binder/lateral_binder.cpp +21 -5
- package/src/duckdb/src/planner/logical_operator.cpp +4 -0
- package/src/duckdb/src/planner/planner.cpp +1 -0
- package/src/duckdb/src/storage/storage_info.cpp +2 -1
- package/src/duckdb/src/storage/table/column_data.cpp +4 -2
- package/src/duckdb/src/storage/table/update_segment.cpp +15 -0
- package/src/duckdb/third_party/libpg_query/include/nodes/nodes.hpp +1 -0
- package/src/duckdb/third_party/libpg_query/include/nodes/parsenodes.hpp +14 -0
- package/src/duckdb/third_party/libpg_query/include/parser/gram.hpp +530 -1006
- package/src/duckdb/third_party/libpg_query/src_backend_parser_gram.cpp +17659 -17626
- package/src/duckdb/ub_src_execution_operator_schema.cpp +2 -0
- package/src/duckdb/ub_src_parser_statement.cpp +2 -0
- package/src/duckdb/ub_src_parser_transform_statement.cpp +2 -0
- package/src/duckdb/ub_src_planner_binder_statement.cpp +2 -0
- package/src/duckdb/src/include/duckdb/function/create_database_extension.hpp +0 -37
|
@@ -201,6 +201,7 @@ public:
|
|
|
201
201
|
|
|
202
202
|
//! Whether or not a sub-system can handle a specific file path
|
|
203
203
|
DUCKDB_API virtual bool CanHandleFile(const string &fpath);
|
|
204
|
+
DUCKDB_API static IOException MissingFileException(const string &file_path, ClientContext &context);
|
|
204
205
|
|
|
205
206
|
//! Set the file pointer of a file handle to a specified location. Reads and writes will happen from this location
|
|
206
207
|
DUCKDB_API virtual void Seek(FileHandle &handle, idx_t location);
|
|
@@ -93,6 +93,8 @@ struct timestamp_ns_t : public timestamp_t {}; // NOLINT
|
|
|
93
93
|
struct timestamp_ms_t : public timestamp_t {}; // NOLINT
|
|
94
94
|
struct timestamp_sec_t : public timestamp_t {}; // NOLINT
|
|
95
95
|
|
|
96
|
+
enum class TimestampCastResult : uint8_t { SUCCESS, ERROR_INCORRECT_FORMAT, ERROR_NON_UTC_TIMEZONE };
|
|
97
|
+
|
|
96
98
|
//! The Timestamp class is a static class that holds helper functions for the Timestamp
|
|
97
99
|
//! type.
|
|
98
100
|
class Timestamp {
|
|
@@ -110,7 +112,7 @@ public:
|
|
|
110
112
|
//! If the tz is not empty, the result is still an instant, but the parts can be extracted and applied to the TZ
|
|
111
113
|
DUCKDB_API static bool TryConvertTimestampTZ(const char *str, idx_t len, timestamp_t &result, bool &has_offset,
|
|
112
114
|
string_t &tz);
|
|
113
|
-
DUCKDB_API static
|
|
115
|
+
DUCKDB_API static TimestampCastResult TryConvertTimestamp(const char *str, idx_t len, timestamp_t &result);
|
|
114
116
|
DUCKDB_API static timestamp_t FromCString(const char *str, idx_t len);
|
|
115
117
|
//! Convert a date object to a string in the format "YYYY-MM-DD hh:mm:ss"
|
|
116
118
|
DUCKDB_API static string ToString(timestamp_t timestamp);
|
|
@@ -161,6 +163,8 @@ public:
|
|
|
161
163
|
|
|
162
164
|
DUCKDB_API static string ConversionError(const string &str);
|
|
163
165
|
DUCKDB_API static string ConversionError(string_t str);
|
|
166
|
+
DUCKDB_API static string UnsupportedTimezoneError(const string &str);
|
|
167
|
+
DUCKDB_API static string UnsupportedTimezoneError(string_t str);
|
|
164
168
|
};
|
|
165
169
|
|
|
166
170
|
} // namespace duckdb
|
|
@@ -35,11 +35,9 @@ class BaseCSVReader {
|
|
|
35
35
|
public:
|
|
36
36
|
BaseCSVReader(ClientContext &context, BufferedCSVReaderOptions options,
|
|
37
37
|
const vector<LogicalType> &requested_types = vector<LogicalType>());
|
|
38
|
-
|
|
39
|
-
BaseCSVReader(FileSystem &fs, Allocator &allocator, FileOpener *opener, BufferedCSVReaderOptions options,
|
|
40
|
-
const vector<LogicalType> &requested_types = vector<LogicalType>());
|
|
41
38
|
~BaseCSVReader();
|
|
42
39
|
|
|
40
|
+
ClientContext &context;
|
|
43
41
|
FileSystem &fs;
|
|
44
42
|
Allocator &allocator;
|
|
45
43
|
FileOpener *opener;
|
|
@@ -55,8 +55,6 @@ class BufferedCSVReader : public BaseCSVReader {
|
|
|
55
55
|
public:
|
|
56
56
|
BufferedCSVReader(ClientContext &context, BufferedCSVReaderOptions options,
|
|
57
57
|
const vector<LogicalType> &requested_types = vector<LogicalType>());
|
|
58
|
-
BufferedCSVReader(FileSystem &fs, Allocator &allocator, FileOpener *opener, BufferedCSVReaderOptions options,
|
|
59
|
-
const vector<LogicalType> &requested_types = vector<LogicalType>());
|
|
60
58
|
BufferedCSVReader(ClientContext &context, string filename, BufferedCSVReaderOptions options,
|
|
61
59
|
const vector<LogicalType> &requested_types = vector<LogicalType>());
|
|
62
60
|
~BufferedCSVReader();
|
|
@@ -75,6 +75,8 @@ struct BufferedCSVReaderOptions {
|
|
|
75
75
|
case_insensitive_map_t<idx_t> sql_types_per_column;
|
|
76
76
|
//! User-defined SQL type list
|
|
77
77
|
vector<LogicalType> sql_type_list;
|
|
78
|
+
//! User-defined name list
|
|
79
|
+
vector<string> name_list;
|
|
78
80
|
//===--------------------------------------------------------------------===//
|
|
79
81
|
// ReadCSVOptions
|
|
80
82
|
//===--------------------------------------------------------------------===//
|
|
@@ -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/
|
|
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
|
-
|
|
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"
|
|
@@ -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
|
-
|
|
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
|
|
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;
|
|
@@ -665,6 +665,7 @@ unique_ptr<PendingQueryResult> ClientContext::PendingStatementOrPreparedStatemen
|
|
|
665
665
|
statement = std::move(copied_statement);
|
|
666
666
|
break;
|
|
667
667
|
}
|
|
668
|
+
#ifndef DUCKDB_ALTERNATIVE_VERIFY
|
|
668
669
|
case StatementType::COPY_STATEMENT:
|
|
669
670
|
case StatementType::INSERT_STATEMENT:
|
|
670
671
|
case StatementType::DELETE_STATEMENT:
|
|
@@ -685,6 +686,7 @@ unique_ptr<PendingQueryResult> ClientContext::PendingStatementOrPreparedStatemen
|
|
|
685
686
|
statement = std::move(parser.statements[0]);
|
|
686
687
|
break;
|
|
687
688
|
}
|
|
689
|
+
#endif
|
|
688
690
|
default:
|
|
689
691
|
statement = std::move(copied_statement);
|
|
690
692
|
break;
|
|
@@ -24,8 +24,9 @@ ExtensionAlias ExtensionHelper::GetExtensionAlias(idx_t index) {
|
|
|
24
24
|
}
|
|
25
25
|
|
|
26
26
|
string ExtensionHelper::ApplyExtensionAlias(string extension_name) {
|
|
27
|
+
auto lname = StringUtil::Lower(extension_name);
|
|
27
28
|
for (idx_t index = 0; internal_aliases[index].alias; index++) {
|
|
28
|
-
if (
|
|
29
|
+
if (lname == internal_aliases[index].alias) {
|
|
29
30
|
return internal_aliases[index].extension;
|
|
30
31
|
}
|
|
31
32
|
}
|
|
@@ -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 +=
|
|
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 +=
|
|
45
|
+
result += values[i].ToSQLString();
|
|
57
46
|
}
|
|
58
47
|
result += " )";
|
|
59
48
|
}
|
|
@@ -13,6 +13,9 @@ DeleteStatement::DeleteStatement(const DeleteStatement &other) : SQLStatement(ot
|
|
|
13
13
|
for (const auto &using_clause : other.using_clauses) {
|
|
14
14
|
using_clauses.push_back(using_clause->Copy());
|
|
15
15
|
}
|
|
16
|
+
for (auto &expr : other.returning_list) {
|
|
17
|
+
returning_list.emplace_back(expr->Copy());
|
|
18
|
+
}
|
|
16
19
|
cte_map = other.cte_map.Copy();
|
|
17
20
|
}
|
|
18
21
|
|
|
@@ -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
|
|
@@ -13,6 +13,9 @@ OnConflictInfo::OnConflictInfo(const OnConflictInfo &other)
|
|
|
13
13
|
if (other.set_info) {
|
|
14
14
|
set_info = other.set_info->Copy();
|
|
15
15
|
}
|
|
16
|
+
if (other.condition) {
|
|
17
|
+
condition = other.condition->Copy();
|
|
18
|
+
}
|
|
16
19
|
}
|
|
17
20
|
|
|
18
21
|
unique_ptr<OnConflictInfo> OnConflictInfo::Copy() const {
|
|
@@ -28,6 +31,12 @@ InsertStatement::InsertStatement(const InsertStatement &other)
|
|
|
28
31
|
select_statement(unique_ptr_cast<SQLStatement, SelectStatement>(other.select_statement->Copy())),
|
|
29
32
|
columns(other.columns), table(other.table), schema(other.schema), catalog(other.catalog) {
|
|
30
33
|
cte_map = other.cte_map.Copy();
|
|
34
|
+
for (auto &expr : other.returning_list) {
|
|
35
|
+
returning_list.emplace_back(expr->Copy());
|
|
36
|
+
}
|
|
37
|
+
if (other.table_ref) {
|
|
38
|
+
table_ref = other.table_ref->Copy();
|
|
39
|
+
}
|
|
31
40
|
if (other.on_conflict_info) {
|
|
32
41
|
on_conflict_info = other.on_conflict_info->Copy();
|
|
33
42
|
}
|
|
@@ -27,6 +27,9 @@ UpdateStatement::UpdateStatement(const UpdateStatement &other)
|
|
|
27
27
|
if (other.from_table) {
|
|
28
28
|
from_table = other.from_table->Copy();
|
|
29
29
|
}
|
|
30
|
+
for (auto &expr : other.returning_list) {
|
|
31
|
+
returning_list.emplace_back(expr->Copy());
|
|
32
|
+
}
|
|
30
33
|
cte_map = other.cte_map.Copy();
|
|
31
34
|
}
|
|
32
35
|
|
|
@@ -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
|
-
|
|
19
|
-
if (arg) {
|
|
19
|
+
if (root_arg) {
|
|
20
20
|
case_check.when_expr =
|
|
21
|
-
make_unique<ComparisonExpression>(ExpressionType::COMPARE_EQUAL,
|
|
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
|
-
|
|
660
|
-
|
|
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
|
-
|
|
48
|
-
|
|
49
|
-
|
|
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
|
}
|