diff --git a/ext/duckdb/result.c b/ext/duckdb/result.c index e7631b7..0104410 100644 --- a/ext/duckdb/result.c +++ b/ext/duckdb/result.c @@ -636,16 +636,22 @@ static VALUE vector_date(void *vector_data, idx_t row_idx) { } static VALUE vector_timestamp(void* vector_data, idx_t row_idx) { - duckdb_timestamp_struct data = duckdb_from_timestamp(((duckdb_timestamp *)vector_data)[row_idx]); - return rb_funcall(mDuckDBConverter, id__to_time, 7, - INT2FIX(data.date.year), - INT2FIX(data.date.month), - INT2FIX(data.date.day), - INT2FIX(data.time.hour), - INT2FIX(data.time.min), - INT2FIX(data.time.sec), - INT2NUM(data.time.micros) - ); + duckdb_timestamp data = ((duckdb_timestamp *)vector_data)[row_idx]; + VALUE obj = infinite_timestamp_value(data); + + if (obj == Qnil) { + duckdb_timestamp_struct data_st = duckdb_from_timestamp(data); + return rb_funcall(mDuckDBConverter, id__to_time, 7, + INT2FIX(data_st.date.year), + INT2FIX(data_st.date.month), + INT2FIX(data_st.date.day), + INT2FIX(data_st.time.hour), + INT2FIX(data_st.time.min), + INT2FIX(data_st.time.sec), + INT2NUM(data_st.time.micros) + ); + } + return obj; } static VALUE vector_time(void* vector_data, idx_t row_idx) { @@ -751,14 +757,9 @@ static VALUE infinite_timestamp_value(duckdb_timestamp timestamp) { static VALUE vector_timestamp_s(void* vector_data, idx_t row_idx) { duckdb_timestamp data = ((duckdb_timestamp *)vector_data)[row_idx]; - VALUE obj = infinite_timestamp_value(data); - - if (obj == Qnil) { - obj = rb_funcall(mDuckDBConverter, id__to_time_from_duckdb_timestamp_s, 1, - LL2NUM(data.micros) - ); - } - return obj; + return rb_funcall(mDuckDBConverter, id__to_time_from_duckdb_timestamp_s, 1, + LL2NUM(data.micros) + ); } static VALUE vector_timestamp_ms(void* vector_data, idx_t row_idx) { diff --git a/test/duckdb_test/result_chunk_each_test.rb b/test/duckdb_test/result_chunk_each_test.rb index bdc8fb2..4da5660 100644 --- a/test/duckdb_test/result_chunk_each_test.rb +++ b/test/duckdb_test/result_chunk_each_test.rb @@ -42,6 +42,8 @@ def teardown [:ok, 'DOUBLE', 'DOUBLE', 123.456789, Float, 123.456789 ], [:ok, 'TIMESTAMP', 'TIMESTAMP', "'2019-11-03 12:34:56.000001'", Time, Time.local(2019, 11, 3, 12, 34, 56, 1) ], [:ok, 'TIMESTAMP', 'TIMESTAMP', "'2019-11-03 12:34:56.00001'", Time, Time.local(2019, 11, 3, 12, 34, 56, 10) ], + [:ok, 'TIMESTAMP', 'TIMESTAMP', "'infinity'", String, 'infinity' ], + [:ok, 'TIMESTAMP', 'TIMESTAMP', "'-infinity'", String, '-infinity' ], [:ok, 'DATE', 'DATE', "'2019-11-03'", Date, Date.new(2019,11,3) ], [:ng, 'DATE', 'DATE', "'infinity'", String, 'infinity' ], [:ng, 'DATE', 'DATE', "'-infinity'", String, '-infinity' ], @@ -75,8 +77,6 @@ def teardown [:ok, 'DECIMAL', 'DECIMAL(38, 8)', '1.234567898', BigDecimal, BigDecimal('1.23456789') ], [:ok, 'DECIMAL', 'DECIMAL(38, 8)', '0.00123456789', BigDecimal, BigDecimal('0.00123456') ], [:ok, 'TIMESTAMP_S', 'TIMESTAMP_S', "'2019-11-03 12:34:56.123456789'", Time, Time.local(2019, 11, 3, 12, 34, 56) ], - [:ok, 'TIMESTAMP_S', 'TIMESTAMP_S', "'infinity'", String, 'infinity' ], - [:ok, 'TIMESTAMP_S', 'TIMESTAMP_S', "'-infinity'", String, '-infinity' ], [:ok, 'TIMESTAMP_MS', 'TIMESTAMP_MS', "'2019-11-03 12:34:56.123456789'", Time, Time.parse('2019-11-3 12:34:56.123') ], [:ok, 'TIMESTAMP_NS', 'TIMESTAMP_NS', "'2019-11-03 12:34:56.123456789'", Time, Time.parse('2019-11-3 12:34:56.123456') ], [:ok, 'ENUM', 'mood', "'happy'", String, 'happy' ],