Skip to content

Commit 302dd1d

Browse files
authored
Merge pull request #935 from otegami/add-alias-to-logical-type
Add alias to logical type
2 parents e145c40 + 02e115f commit 302dd1d

File tree

4 files changed

+62
-4
lines changed

4 files changed

+62
-4
lines changed

CHANGELOG.md

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,11 @@ All notable changes to this project will be documented in this file.
44
# Unreleased
55
- add `DuckDB::PreparedStatement#bind_uint8`, `DuckDB::PreparedStatement#bind_uint16`,
66
`DuckDB::PreparedStatement#bind_uint32`, `DuckDB::PreparedStatement#bind_uint64`.
7-
- support Enum type in `DuckDB::LogicalType` class.
8-
- `DuckDB::LogicalType#internal_type`, `DuckDB::LogicalType#dictionary_size`,
9-
`DuckDB::LogicalType#dictionary_value_at`, and `DuckDB::LogicalType#each_dictionary_value` are
10-
available.
7+
- add `DuckDB::LogicalType` class.
8+
- `DuckDB::LogicalType` class is under construction. `DuckDB::LogicalType#internal_type`,
9+
`DuckDB::LogicalType#dictionary_size`, `DuckDB::LogicalType#dictionary_value_at`,
10+
`DuckDB::LogicalType#each_dictionary_value`, `DuckDB::LogicalType#alias`, and
11+
`DuckDB::LogicalType#alias=`are available.
1112

1213
# 1.2.1.0 - 2025-03-30
1314
- bump duckdb v1.2.1 on CI.

ext/duckdb/logical_type.c

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ static VALUE duckdb_logical_type_member_type_at(VALUE self, VALUE midx);
2121
static VALUE duckdb_logical_type__internal_type(VALUE self);
2222
static VALUE duckdb_logical_type_dictionary_size(VALUE self);
2323
static VALUE duckdb_logical_type_dictionary_value_at(VALUE self, VALUE didx);
24+
static VALUE duckdb_logical_type__get_alias(VALUE self);
25+
static VALUE duckdb_logical_type__set_alias(VALUE self, VALUE aname);
2426

2527
static const rb_data_type_t logical_type_data_type = {
2628
"DuckDB/LogicalType",
@@ -357,6 +359,49 @@ static VALUE duckdb_logical_type_dictionary_value_at(VALUE self, VALUE didx) {
357359
return dvalue;
358360
}
359361

362+
/*
363+
* call-seq:
364+
* col.logical_type.alias -> String
365+
*
366+
* Returns the alias of the logical type.
367+
*
368+
*/
369+
static VALUE duckdb_logical_type__get_alias(VALUE self) {
370+
rubyDuckDBLogicalType *ctx;
371+
VALUE alias = Qnil;
372+
const char *_alias;
373+
374+
TypedData_Get_Struct(self, rubyDuckDBLogicalType, &logical_type_data_type, ctx);
375+
376+
_alias = duckdb_logical_type_get_alias(ctx->logical_type);
377+
if (_alias != NULL) {
378+
alias = rb_utf8_str_new_cstr(_alias);
379+
}
380+
duckdb_free((void *)_alias);
381+
return alias;
382+
}
383+
384+
/*
385+
* call-seq:
386+
* col.logical_type.alias(alias) -> String
387+
*
388+
* Return the set alias of the logical type.
389+
*
390+
*/
391+
static VALUE duckdb_logical_type__set_alias(VALUE self, VALUE aname) {
392+
rubyDuckDBLogicalType *ctx;
393+
VALUE alias = Qnil;
394+
const char *_alias = StringValuePtr(aname);
395+
396+
TypedData_Get_Struct(self, rubyDuckDBLogicalType, &logical_type_data_type, ctx);
397+
duckdb_logical_type_set_alias(ctx->logical_type, _alias);
398+
if (_alias != NULL) {
399+
alias = rb_utf8_str_new_cstr(_alias);
400+
}
401+
402+
return alias;
403+
}
404+
360405
VALUE rbduckdb_create_logical_type(duckdb_logical_type logical_type) {
361406
VALUE obj;
362407
rubyDuckDBLogicalType *ctx;
@@ -392,4 +437,6 @@ void rbduckdb_init_duckdb_logical_type(void) {
392437
rb_define_method(cDuckDBLogicalType, "_internal_type", duckdb_logical_type__internal_type, 0);
393438
rb_define_method(cDuckDBLogicalType, "dictionary_size", duckdb_logical_type_dictionary_size, 0);
394439
rb_define_method(cDuckDBLogicalType, "dictionary_value_at", duckdb_logical_type_dictionary_value_at, 1);
440+
rb_define_method(cDuckDBLogicalType, "get_alias", duckdb_logical_type__get_alias, 0);
441+
rb_define_method(cDuckDBLogicalType, "set_alias", duckdb_logical_type__set_alias, 1);
395442
}

lib/duckdb/logical_type.rb

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22

33
module DuckDB
44
class LogicalType
5+
alias :alias get_alias
6+
alias :alias= set_alias
7+
58
# returns logical type's type symbol
69
# `:unknown` means that the logical type's type is unknown/unsupported by ruby-duckdb.
710
# `:invalid` means that the logical type's type is invalid in duckdb.

test/duckdb_test/logical_type_test.rb

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,13 @@ def test_type
118118
assert_equal(EXPECTED_TYPES, logical_types.map(&:type))
119119
end
120120

121+
def test_alias
122+
enum_column = @columns.find { |column| column.type == :enum }
123+
enum_logical_type = enum_column.logical_type
124+
assert_equal("mood", enum_logical_type.alias=("mood"))
125+
assert_equal("mood", enum_logical_type.alias)
126+
end
127+
121128
def test_decimal_internal_type
122129
decimal_column = @columns.find { |column| column.type == :decimal }
123130
assert_equal(:integer, decimal_column.logical_type.internal_type)

0 commit comments

Comments
 (0)