| 1 | //===----------------------------------------------------------------------===// |
| 2 | // DuckDB |
| 3 | // |
| 4 | // duckdb/function/copy_function.hpp |
| 5 | // |
| 6 | // |
| 7 | //===----------------------------------------------------------------------===// |
| 8 | |
| 9 | #pragma once |
| 10 | |
| 11 | #include "duckdb/function/function.hpp" |
| 12 | #include "duckdb/function/table_function.hpp" |
| 13 | #include "duckdb/parser/parsed_data/copy_info.hpp" |
| 14 | #include "duckdb/parser/statement/copy_statement.hpp" |
| 15 | |
| 16 | namespace duckdb { |
| 17 | |
| 18 | class Binder; |
| 19 | struct BoundStatement; |
| 20 | class ColumnDataCollection; |
| 21 | class ExecutionContext; |
| 22 | |
| 23 | struct LocalFunctionData { |
| 24 | virtual ~LocalFunctionData() { |
| 25 | } |
| 26 | |
| 27 | template <class TARGET> |
| 28 | TARGET &Cast() { |
| 29 | D_ASSERT(dynamic_cast<TARGET *>(this)); |
| 30 | return reinterpret_cast<TARGET &>(*this); |
| 31 | } |
| 32 | template <class TARGET> |
| 33 | const TARGET &Cast() const { |
| 34 | D_ASSERT(dynamic_cast<const TARGET *>(this)); |
| 35 | return reinterpret_cast<const TARGET &>(*this); |
| 36 | } |
| 37 | }; |
| 38 | |
| 39 | struct GlobalFunctionData { |
| 40 | virtual ~GlobalFunctionData() { |
| 41 | } |
| 42 | |
| 43 | template <class TARGET> |
| 44 | TARGET &Cast() { |
| 45 | D_ASSERT(dynamic_cast<TARGET *>(this)); |
| 46 | return reinterpret_cast<TARGET &>(*this); |
| 47 | } |
| 48 | template <class TARGET> |
| 49 | const TARGET &Cast() const { |
| 50 | D_ASSERT(dynamic_cast<const TARGET *>(this)); |
| 51 | return reinterpret_cast<const TARGET &>(*this); |
| 52 | } |
| 53 | }; |
| 54 | |
| 55 | struct PreparedBatchData { |
| 56 | virtual ~PreparedBatchData() { |
| 57 | } |
| 58 | |
| 59 | template <class TARGET> |
| 60 | TARGET &Cast() { |
| 61 | D_ASSERT(dynamic_cast<TARGET *>(this)); |
| 62 | return reinterpret_cast<TARGET &>(*this); |
| 63 | } |
| 64 | template <class TARGET> |
| 65 | const TARGET &Cast() const { |
| 66 | D_ASSERT(dynamic_cast<const TARGET *>(this)); |
| 67 | return reinterpret_cast<const TARGET &>(*this); |
| 68 | } |
| 69 | }; |
| 70 | |
| 71 | enum class CopyFunctionExecutionMode { REGULAR_COPY_TO_FILE, PARALLEL_COPY_TO_FILE, BATCH_COPY_TO_FILE }; |
| 72 | |
| 73 | typedef BoundStatement (*copy_to_plan_t)(Binder &binder, CopyStatement &stmt); |
| 74 | typedef unique_ptr<FunctionData> (*copy_to_bind_t)(ClientContext &context, CopyInfo &info, vector<string> &names, |
| 75 | vector<LogicalType> &sql_types); |
| 76 | typedef unique_ptr<LocalFunctionData> (*copy_to_initialize_local_t)(ExecutionContext &context, FunctionData &bind_data); |
| 77 | typedef unique_ptr<GlobalFunctionData> (*copy_to_initialize_global_t)(ClientContext &context, FunctionData &bind_data, |
| 78 | const string &file_path); |
| 79 | typedef void (*copy_to_sink_t)(ExecutionContext &context, FunctionData &bind_data, GlobalFunctionData &gstate, |
| 80 | LocalFunctionData &lstate, DataChunk &input); |
| 81 | typedef void (*copy_to_combine_t)(ExecutionContext &context, FunctionData &bind_data, GlobalFunctionData &gstate, |
| 82 | LocalFunctionData &lstate); |
| 83 | typedef void (*copy_to_finalize_t)(ClientContext &context, FunctionData &bind_data, GlobalFunctionData &gstate); |
| 84 | |
| 85 | typedef void (*copy_to_serialize_t)(FieldWriter &writer, const FunctionData &bind_data, const CopyFunction &function); |
| 86 | |
| 87 | typedef unique_ptr<FunctionData> (*copy_to_deserialize_t)(ClientContext &context, FieldReader &reader, |
| 88 | CopyFunction &function); |
| 89 | |
| 90 | typedef unique_ptr<FunctionData> (*copy_from_bind_t)(ClientContext &context, CopyInfo &info, |
| 91 | vector<string> &expected_names, |
| 92 | vector<LogicalType> &expected_types); |
| 93 | typedef CopyFunctionExecutionMode (*copy_to_execution_mode_t)(bool preserve_insertion_order, bool supports_batch_index); |
| 94 | |
| 95 | typedef unique_ptr<PreparedBatchData> (*copy_prepare_batch_t)(ClientContext &context, FunctionData &bind_data, |
| 96 | GlobalFunctionData &gstate, |
| 97 | unique_ptr<ColumnDataCollection> collection); |
| 98 | typedef void (*copy_flush_batch_t)(ClientContext &context, FunctionData &bind_data, GlobalFunctionData &gstate, |
| 99 | PreparedBatchData &batch); |
| 100 | typedef idx_t (*copy_desired_batch_size_t)(ClientContext &context, FunctionData &bind_data); |
| 101 | |
| 102 | class CopyFunction : public Function { |
| 103 | public: |
| 104 | explicit CopyFunction(string name) |
| 105 | : Function(name), plan(nullptr), copy_to_bind(nullptr), copy_to_initialize_local(nullptr), |
| 106 | copy_to_initialize_global(nullptr), copy_to_sink(nullptr), copy_to_combine(nullptr), |
| 107 | copy_to_finalize(nullptr), execution_mode(nullptr), prepare_batch(nullptr), flush_batch(nullptr), |
| 108 | desired_batch_size(nullptr), serialize(nullptr), deserialize(nullptr), copy_from_bind(nullptr) { |
| 109 | } |
| 110 | |
| 111 | //! Plan rewrite copy function |
| 112 | copy_to_plan_t plan; |
| 113 | |
| 114 | copy_to_bind_t copy_to_bind; |
| 115 | copy_to_initialize_local_t copy_to_initialize_local; |
| 116 | copy_to_initialize_global_t copy_to_initialize_global; |
| 117 | copy_to_sink_t copy_to_sink; |
| 118 | copy_to_combine_t copy_to_combine; |
| 119 | copy_to_finalize_t copy_to_finalize; |
| 120 | copy_to_execution_mode_t execution_mode; |
| 121 | |
| 122 | copy_prepare_batch_t prepare_batch; |
| 123 | copy_flush_batch_t flush_batch; |
| 124 | copy_desired_batch_size_t desired_batch_size; |
| 125 | |
| 126 | copy_to_serialize_t serialize; |
| 127 | copy_to_deserialize_t deserialize; |
| 128 | |
| 129 | copy_from_bind_t copy_from_bind; |
| 130 | TableFunction copy_from_function; |
| 131 | |
| 132 | string extension; |
| 133 | }; |
| 134 | |
| 135 | } // namespace duckdb |
| 136 | |