1#include "duckdb/execution/operator/scan/physical_column_data_scan.hpp"
2#include "duckdb/execution/physical_plan_generator.hpp"
3#include "duckdb/parser/parsed_data/show_select_info.hpp"
4#include "duckdb/planner/operator/logical_show.hpp"
5
6namespace duckdb {
7
8unique_ptr<PhysicalOperator> PhysicalPlanGenerator::CreatePlan(LogicalShow &op) {
9 DataChunk output;
10 output.Initialize(allocator&: Allocator::Get(context), types: op.types);
11
12 auto collection = make_uniq<ColumnDataCollection>(args&: context, args&: op.types);
13 ColumnDataAppendState append_state;
14 collection->InitializeAppend(state&: append_state);
15 for (idx_t column_idx = 0; column_idx < op.types_select.size(); column_idx++) {
16 auto type = op.types_select[column_idx];
17 auto &name = op.aliases[column_idx];
18
19 // "name", TypeId::VARCHAR
20 output.SetValue(col_idx: 0, index: output.size(), val: Value(name));
21 // "type", TypeId::VARCHAR
22 output.SetValue(col_idx: 1, index: output.size(), val: Value(type.ToString()));
23 // "null", TypeId::VARCHAR
24 output.SetValue(col_idx: 2, index: output.size(), val: Value("YES"));
25 // "pk", TypeId::BOOL
26 output.SetValue(col_idx: 3, index: output.size(), val: Value());
27 // "dflt_value", TypeId::VARCHAR
28 output.SetValue(col_idx: 4, index: output.size(), val: Value());
29 // "extra", TypeId::VARCHAR
30 output.SetValue(col_idx: 5, index: output.size(), val: Value());
31
32 output.SetCardinality(output.size() + 1);
33 if (output.size() == STANDARD_VECTOR_SIZE) {
34 collection->Append(state&: append_state, new_chunk&: output);
35 output.Reset();
36 }
37 }
38
39 collection->Append(state&: append_state, new_chunk&: output);
40
41 // create a chunk scan to output the result
42 auto chunk_scan = make_uniq<PhysicalColumnDataScan>(args&: op.types, args: PhysicalOperatorType::COLUMN_DATA_SCAN,
43 args&: op.estimated_cardinality, args: std::move(collection));
44 return std::move(chunk_scan);
45}
46
47} // namespace duckdb
48