Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions bindings/pkgs/@duckdb/node-bindings/duckdb.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -796,7 +796,10 @@ export function is_null_value(value: Value): boolean;
export function create_null_value(): Value;

// DUCKDB_API idx_t duckdb_get_list_size(duckdb_value value);
export function get_list_size(value: Value): number;

// DUCKDB_API duckdb_value duckdb_get_list_child(duckdb_value value, idx_t index);
export function get_list_child(value: Value, index: number): Value;

// DUCKDB_API duckdb_value duckdb_create_enum_value(duckdb_logical_type type, uint64_t value);
export function create_enum_value(logical_type: LogicalType, value: number): Value;
Expand All @@ -805,6 +808,7 @@ export function create_enum_value(logical_type: LogicalType, value: number): Val
export function get_enum_value(value: Value): number;

// DUCKDB_API duckdb_value duckdb_get_struct_child(duckdb_value value, idx_t index);
export function get_struct_child(value: Value, index: number): Value;

// DUCKDB_API duckdb_logical_type duckdb_create_logical_type(duckdb_type type);
export function create_logical_type(type: Type): LogicalType;
Expand Down
42 changes: 40 additions & 2 deletions bindings/src/duckdb_node_bindings.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1213,8 +1213,11 @@ class DuckDBNodeAddon : public Napi::Addon<DuckDBNodeAddon> {
InstanceMethod("get_map_value", &DuckDBNodeAddon::get_map_value),
InstanceMethod("is_null_value", &DuckDBNodeAddon::is_null_value),
InstanceMethod("create_null_value", &DuckDBNodeAddon::create_null_value),
InstanceMethod("get_list_size", &DuckDBNodeAddon::get_list_size),
InstanceMethod("get_list_child", &DuckDBNodeAddon::get_list_child),
InstanceMethod("create_enum_value", &DuckDBNodeAddon::create_enum_value),
InstanceMethod("get_enum_value", &DuckDBNodeAddon::get_enum_value),
InstanceMethod("get_struct_child", &DuckDBNodeAddon::get_struct_child),

InstanceMethod("create_logical_type", &DuckDBNodeAddon::create_logical_type),
InstanceMethod("logical_type_get_alias", &DuckDBNodeAddon::logical_type_get_alias),
Expand Down Expand Up @@ -2978,6 +2981,9 @@ class DuckDBNodeAddon : public Napi::Addon<DuckDBNodeAddon> {
auto value = GetValueFromExternal(env, info[0]);
auto index = info[1].As<Napi::Number>().Uint32Value();
auto output_key = duckdb_get_map_key(value, index);
if (!output_key) {
throw Napi::Error::New(env, "Failed to get map key");
}
return CreateExternalForValue(env, output_key);
}

Expand All @@ -2988,6 +2994,9 @@ class DuckDBNodeAddon : public Napi::Addon<DuckDBNodeAddon> {
auto value = GetValueFromExternal(env, info[0]);
auto index = info[1].As<Napi::Number>().Uint32Value();
auto output_value = duckdb_get_map_value(value, index);
if (!output_value) {
throw Napi::Error::New(env, "Failed to get map value");
}
return CreateExternalForValue(env, output_value);
}

Expand All @@ -3009,7 +3018,26 @@ class DuckDBNodeAddon : public Napi::Addon<DuckDBNodeAddon> {
}

// DUCKDB_API idx_t duckdb_get_list_size(duckdb_value value);
// function get_list_size(value: Value): number
Napi::Value get_list_size(const Napi::CallbackInfo& info) {
auto env = info.Env();
auto value = GetValueFromExternal(env, info[0]);
auto size = duckdb_get_list_size(value);
return Napi::Number::New(env, size);
}

// DUCKDB_API duckdb_value duckdb_get_list_child(duckdb_value value, idx_t index);
// function get_list_child(value: Value, index: number): Value
Napi::Value get_list_child(const Napi::CallbackInfo& info) {
auto env = info.Env();
auto value = GetValueFromExternal(env, info[0]);
auto index = info[1].As<Napi::Number>().Uint32Value();
auto output_value = duckdb_get_list_child(value, index);
if (!output_value) {
throw Napi::Error::New(env, "Failed to get list child");
}
return CreateExternalForValue(env, output_value);
}

// DUCKDB_API duckdb_value duckdb_create_enum_value(duckdb_logical_type type, uint64_t value);
// function create_enum_value(logical_type: LogicalType, value: number): Value
Expand All @@ -3034,6 +3062,17 @@ class DuckDBNodeAddon : public Napi::Addon<DuckDBNodeAddon> {
}

// DUCKDB_API duckdb_value duckdb_get_struct_child(duckdb_value value, idx_t index);
// function get_struct_child(value: Value, index: number): Value
Napi::Value get_struct_child(const Napi::CallbackInfo& info) {
auto env = info.Env();
auto value = GetValueFromExternal(env, info[0]);
auto index = info[1].As<Napi::Number>().Uint32Value();
auto output_value = duckdb_get_struct_child(value, index);
if (!output_value) {
throw Napi::Error::New(env, "Failed to get struct child");
}
return CreateExternalForValue(env, output_value);
}

// DUCKDB_API duckdb_logical_type duckdb_create_logical_type(duckdb_type type);
// function create_logical_type(type: Type): LogicalType
Expand Down Expand Up @@ -4144,10 +4183,9 @@ NODE_API_ADDON(DuckDBNodeAddon)
---
411 total functions

234 instance methods
237 instance methods
3 unimplemented instance cache functions
1 unimplemented logical type function
3 unimplemented value inspection functions
13 unimplemented scalar function functions
4 unimplemented scalar function set functions
12 unimplemented aggregate function functions
Expand Down
26 changes: 21 additions & 5 deletions bindings/test/values.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -221,13 +221,21 @@ suite('values', () => {
});
test('struct', () => {
const int_type = duckdb.create_logical_type(duckdb.Type.INTEGER);
const struct_type = duckdb.create_struct_type([int_type], ['a']);
const varchar_type = duckdb.create_logical_type(duckdb.Type.VARCHAR);
const struct_type = duckdb.create_struct_type([int_type, varchar_type], ['a', 'b']);
const int32_value = duckdb.create_int32(42);
const struct_value = duckdb.create_struct_value(struct_type, [int32_value]);
const varchar_value = duckdb.create_varchar('duck');
const struct_value = duckdb.create_struct_value(struct_type, [int32_value, varchar_value]);
expectLogicalType(
duckdb.get_value_type(struct_value),
STRUCT(ENTRY('a', INTEGER))
STRUCT(ENTRY('a', INTEGER), ENTRY('b', VARCHAR))
);
const struct_child_0 = duckdb.get_struct_child(struct_value, 0);
expectLogicalType(duckdb.get_value_type(struct_child_0), INTEGER);
expect(duckdb.get_int32(struct_child_0)).toBe(42);
const struct_child_1 = duckdb.get_struct_child(struct_value, 1);
expectLogicalType(duckdb.get_value_type(struct_child_1), VARCHAR);
expect(duckdb.get_varchar(struct_child_1)).toBe('duck');
});
test('empty struct', () => {
const struct_type = duckdb.create_struct_type([], []);
Expand All @@ -244,9 +252,17 @@ suite('values', () => {
});
test('list', () => {
const int_type = duckdb.create_logical_type(duckdb.Type.INTEGER);
const int32_value = duckdb.create_int32(42);
const list_value = duckdb.create_list_value(int_type, [int32_value]);
const int32_value_0 = duckdb.create_int32(42);
const int32_value_1 = duckdb.create_int32(12345);
const list_value = duckdb.create_list_value(int_type, [int32_value_0, int32_value_1]);
expectLogicalType(duckdb.get_value_type(list_value), LIST(INTEGER));
expect(duckdb.get_list_size(list_value)).toBe(2);
const list_child_0 = duckdb.get_list_child(list_value, 0);
expectLogicalType(duckdb.get_value_type(list_child_0), INTEGER);
expect(duckdb.get_int32(list_child_0)).toBe(42);
const list_child_1 = duckdb.get_list_child(list_value, 1);
expectLogicalType(duckdb.get_value_type(list_child_1), INTEGER);
expect(duckdb.get_int32(list_child_1)).toBe(12345);
});
test('empty list', () => {
const int_type = duckdb.create_logical_type(duckdb.Type.INTEGER);
Expand Down