Skip to content

Commit ba90b10

Browse files
authored
duckdb: define virtual columns on c++ side (#7571)
Slightly reduce complexity. Virtual columns aren't dependent on anything, so we don't need to expose extra stuff Signed-off-by: Mikhail Kot <to@myrrc.dev>
1 parent f77cf60 commit ba90b10

5 files changed

Lines changed: 8 additions & 102 deletions

File tree

vortex-duckdb/cpp/include/duckdb_vx/table_function.h

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -38,15 +38,6 @@ void duckdb_vx_tfunc_bind_result_add_column(duckdb_vx_tfunc_bind_result ffi_resu
3838
size_t name_len,
3939
duckdb_logical_type ffi_type);
4040

41-
// Opaque type for the result of get_virtual_columns
42-
typedef struct duckdb_vx_tfunc_virtual_cols_result_ *duckdb_vx_tfunc_virtual_cols_result;
43-
// Push a column into the get_virtual_columns result.
44-
void duckdb_vx_tfunc_virtual_columns_push(duckdb_vx_tfunc_virtual_cols_result ffi_result,
45-
idx_t column_idx,
46-
const char *name_str,
47-
size_t name_len,
48-
duckdb_logical_type ffi_type);
49-
5041
// String map for to_string result
5142
typedef struct duckdb_vx_string_map_ *duckdb_vx_string_map;
5243

@@ -161,8 +152,6 @@ typedef struct {
161152

162153
bool (*pushdown_complex_filter)(void *bind_data, duckdb_vx_expr expr, duckdb_vx_error *error_out);
163154

164-
void (*get_virtual_columns)(void *bind_data, duckdb_vx_tfunc_virtual_cols_result result_out);
165-
166155
void *pushdown_expression;
167156
duckdb_vx_string_map (*to_string)(void *bind_data);
168157
// void *dynamic_to_string;
@@ -179,7 +168,6 @@ typedef struct {
179168
// void *supports_pushdown_type;
180169
// void *get_partition_info;
181170
// void *get_partition_stats;
182-
// void *get_virtual_columns;
183171
// void *get_row_id_columns;
184172

185173
bool projection_pushdown;

vortex-duckdb/cpp/table_function.cpp

Lines changed: 4 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -377,33 +377,6 @@ extern "C" void duckdb_vx_tfunc_bind_result_add_column(duckdb_vx_tfunc_bind_resu
377377
result->return_types.emplace_back(*logical_type);
378378
}
379379

380-
virtual_column_map_t c_get_virtual_columns(ClientContext & /*context*/,
381-
optional_ptr<FunctionData> bind_data) {
382-
auto &bind = bind_data->Cast<CTableBindData>();
383-
384-
auto result = virtual_column_map_t();
385-
bind.info->vtab.get_virtual_columns(bind_data->Cast<CTableBindData>().ffi_data->DataPtr(),
386-
reinterpret_cast<duckdb_vx_tfunc_virtual_cols_result>(&result));
387-
return result;
388-
}
389-
390-
extern "C" void duckdb_vx_tfunc_virtual_columns_push(duckdb_vx_tfunc_virtual_cols_result ffi_result,
391-
idx_t column_idx,
392-
const char *name_str,
393-
size_t name_len,
394-
duckdb_logical_type ffi_type) {
395-
if (!ffi_result || !name_str || !ffi_type) {
396-
return;
397-
}
398-
399-
auto result = reinterpret_cast<virtual_column_map_t *>(ffi_result);
400-
const auto logical_type = reinterpret_cast<LogicalType *>(ffi_type);
401-
const auto name = string(name_str, name_len);
402-
403-
auto table_col = TableColumn(std::move(name), *logical_type);
404-
result->emplace(column_idx, std::move(table_col));
405-
}
406-
407380
OperatorPartitionData c_get_partition_data(ClientContext & /*context*/,
408381
TableFunctionGetPartitionInput &input) {
409382
if (input.partition_info.RequiresPartitionColumns()) {
@@ -463,11 +436,14 @@ extern "C" duckdb_state duckdb_vx_tfunc_register(duckdb_database ffi_db, const d
463436
tf.late_materialization = vtab->late_materialization;
464437
tf.cardinality = c_cardinality;
465438
tf.get_partition_data = c_get_partition_data;
466-
tf.get_virtual_columns = c_get_virtual_columns;
467439
tf.to_string = c_to_string;
468440
tf.table_scan_progress = c_table_scan_progress;
469441
tf.statistics = c_statistics;
470442

443+
tf.get_virtual_columns = [](auto &, auto) -> virtual_column_map_t {
444+
return {{COLUMN_IDENTIFIER_EMPTY, TableColumn("", LogicalTypeId::BOOLEAN)}};
445+
};
446+
471447
// Set up the parameters
472448
tf.arguments.reserve(vtab->parameter_count);
473449
for (size_t i = 0; i < vtab->parameter_count; i++) {

vortex-duckdb/src/datasource.rs

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
//!
66
//! Table functions that resolve to a [`DataSourceRef`] can implement [`DataSourceTableFunction`]
77
//! to get a blanket [`TableFunction`] implementation covering init, scan, progress, filter
8-
//! pushdown, cardinality, partitioning, and virtual columns.
8+
//! pushdown, cardinality, and partitioning.
99
1010
use std::ffi::CString;
1111
use std::fmt::Debug;
@@ -69,7 +69,6 @@ use crate::duckdb::LogicalType;
6969
use crate::duckdb::TableFilterSetRef;
7070
use crate::duckdb::TableFunction;
7171
use crate::duckdb::TableInitInput;
72-
use crate::duckdb::VirtualColumnsResultRef;
7372
use crate::exporter::ArrayExporter;
7473
use crate::exporter::ConversionCache;
7574

@@ -83,17 +82,15 @@ use crate::exporter::ConversionCache;
8382
/// If you define COLUMN_IDENTIFIER_EMPTY, planner takes it, otherwise the
8483
/// first column. As we don't want to fill the output chunk and we can leave
8584
/// it uninitialized in this case, we define COLUMN_IDENTIFIER_EMPTY as a
86-
/// virtual column in our table function vtab's get_virtual_columns.
87-
/// See vortex-duckdb/cpp/include/duckdb_vx/table_function.h
88-
/// See virtual_columns in this file
85+
/// virtual column.
86+
/// See vortex-duckdb/cpp/table_function.cpp
8987
static EMPTY_COLUMN_IDX: u64 = 18446744073709551614;
90-
static EMPTY_COLUMN_NAME: &str = "";
9188

9289
/// A trait for table functions that resolve to a [`DataSourceRef`].
9390
///
9491
/// Implementors only need to define how parameters are declared and how binding produces a
9592
/// data source. All other [`TableFunction`] methods (init, scan, progress, filter pushdown,
96-
/// cardinality, partitioning, virtual columns) are provided by a blanket implementation.
93+
/// cardinality, partitioning) are provided by a blanket implementation.
9794
pub(crate) trait DataSourceTableFunction: Sized + Debug {
9895
/// Returns the positional parameters of the table function.
9996
fn parameters() -> Vec<LogicalType> {
@@ -555,10 +552,6 @@ impl<T: DataSourceTableFunction> TableFunction for T {
555552

556553
Some(result)
557554
}
558-
559-
fn virtual_columns(_bind_data: &Self::BindData, result: &mut VirtualColumnsResultRef) {
560-
result.register(EMPTY_COLUMN_IDX, EMPTY_COLUMN_NAME, &LogicalType::bool());
561-
}
562555
}
563556

564557
// ---------------------------------------------------------------------------

vortex-duckdb/src/duckdb/table_function/mod.rs

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,9 @@ mod partition;
1616
mod pushdown_complex_filter;
1717
mod statistics;
1818
mod table_scan_progress;
19-
mod virtual_columns;
2019

2120
pub use bind::*;
2221
pub use init::*;
23-
pub use virtual_columns::VirtualColumnsResult;
24-
pub use virtual_columns::VirtualColumnsResultRef;
2522

2623
use crate::cpp;
2724
use crate::cpp::duckdb_client_context;
@@ -38,7 +35,6 @@ use crate::duckdb::table_function::partition::get_partition_data_callback;
3835
use crate::duckdb::table_function::pushdown_complex_filter::pushdown_complex_filter_callback;
3936
use crate::duckdb::table_function::statistics::statistics;
4037
use crate::duckdb::table_function::table_scan_progress::table_scan_progress_callback;
41-
use crate::duckdb::table_function::virtual_columns::get_virtual_columns_callback;
4238
use crate::duckdb_try;
4339

4440
#[derive(Debug, Default)]
@@ -157,9 +153,6 @@ pub trait TableFunction: Sized + Debug {
157153
_local_init_data: &mut Self::LocalState,
158154
) -> VortexResult<u64>;
159155

160-
/// Returns the virtual columns of the table function.
161-
fn virtual_columns(_bind_data: &Self::BindData, _result: &mut VirtualColumnsResultRef) {}
162-
163156
/// Returns a vector of key-value pairs for EXPLAIN output
164157
fn to_string(_bind_data: &Self::BindData) -> Option<Vec<(String, String)>> {
165158
None
@@ -209,7 +202,6 @@ impl DatabaseRef {
209202
cardinality: Some(cardinality_callback::<T>),
210203
pushdown_complex_filter: Some(pushdown_complex_filter_callback::<T>),
211204
pushdown_expression: ptr::null_mut::<c_void>(),
212-
get_virtual_columns: Some(get_virtual_columns_callback::<T>),
213205
to_string: Some(to_string_callback::<T>),
214206
table_scan_progress: Some(table_scan_progress_callback::<T>),
215207
get_partition_data: Some(get_partition_data_callback::<T>),

vortex-duckdb/src/duckdb/table_function/virtual_columns.rs

Lines changed: 0 additions & 43 deletions
This file was deleted.

0 commit comments

Comments
 (0)