diff --git a/Project.toml b/Project.toml index 4f4cd11..355f8f3 100644 --- a/Project.toml +++ b/Project.toml @@ -1,7 +1,7 @@ name = "DuckDB" uuid = "d2f5444f-75bc-4fdf-ac35-56f514c445e1" authors = ["Kimmo Linna "] -version = "0.2.1" +version = "0.2.2" [deps] DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" diff --git a/src/DuckDB.jl b/src/DuckDB.jl index 5797d2d..4979544 100644 --- a/src/DuckDB.jl +++ b/src/DuckDB.jl @@ -21,7 +21,7 @@ function toDataFrame(result) print("invalid type for column - \""*name*"\"") else mask = unsafe_wrap(Array,columns[i].nullmask,rows) - data = unsafe_wrap(Array,(Ptr{DUCKDB_TYPES[type]}(columns[i].data)),rows) + data = unsafe_wrap(Array,Ptr{DUCKDB_TYPES[type]}(columns[i].data),rows) bmask=reinterpret(Bool,mask) if 0!=sum(mask) @@ -33,6 +33,8 @@ function toDataFrame(result) data = Dates.Time.(Dates.Nanosecond.(data.*1000)) elseif type == DUCKDB_TYPE_TIMESTAMP data = Dates.epochms2datetime.((data./1000).+62167219200000) + elseif type == DUCKDB_TYPE_INTERVAL + data = map(x -> Dates.CompoundPeriod(Dates.Month(x.months),Dates.Day(x.days),Dates.Microsecond(x.micros)),data) elseif type == DUCKDB_TYPE_VARCHAR data = unsafe_string.(data) end diff --git a/src/consts.jl b/src/consts.jl index 9bc3591..9460ece 100644 --- a/src/consts.jl +++ b/src/consts.jl @@ -70,7 +70,7 @@ end struct duckdb_interval months::Int32 days::Int32 - micros::Int32 + micros::Int64 end """ @@ -121,8 +121,8 @@ DUCKDB_TYPES = Dict( DUCKDB_TYPE_TIMESTAMP => Int64, DUCKDB_TYPE_DATE => Int32, DUCKDB_TYPE_TIME => Int64, - DUCKDB_TYPE_INTERVAL => Ref{duckdb_interval}, - DUCKDB_TYPE_HUGEINT => Ref{duckdb_hugeint}, + DUCKDB_TYPE_INTERVAL => duckdb_interval, + DUCKDB_TYPE_HUGEINT => duckdb_hugeint, DUCKDB_TYPE_VARCHAR => Ptr{UInt8}, - DUCKDB_TYPE_BLOB => Ref{duckdb_blob} + DUCKDB_TYPE_BLOB => duckdb_blob ) \ No newline at end of file diff --git a/test/runtests.jl b/test/runtests.jl index 9f09870..8eb4bb6 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -1,10 +1,28 @@ import DuckDB con = DuckDB.connect(":memory:") -res = DuckDB.execute(con,"CREATE TABLE integers(date DATE, data INTEGER);") -res = DuckDB.execute(con,"INSERT INTO integers VALUES ('2021-09-27', 4), ('2021-09-28', 6), ('2021-09-29', 8);") -res = DuckDB.execute(con,"SELECT * FROM integers;") + +res = DuckDB.execute(con,"CREATE TABLE interval(interval INTERVAL);") +res = DuckDB.execute(con,""" +INSERT INTO interval VALUES +(INTERVAL 5 HOUR), +(INTERVAL 12 MONTH), +(INTERVAL 12 MICROSECOND), +(INTERVAL 1 YEAR); +""") +res = DuckDB.execute(con,"SELECT * FROM interval;") res = DuckDB.toDataFrame(res) + +res = DuckDB.execute(con,"CREATE TABLE timestamp(timestamp TIMESTAMP, data HUGEINT);") +res = DuckDB.execute(con,""" + INSERT INTO timestamp VALUES + ('2021-09-27 11:30:00.000', -170141183460469231731687303715884105727), + ('2021-09-28 12:30:00.000', 0), + ('2021-09-29 13:30:00.000', 170141183460469231731687303715884105727); + """) +res = DuckDB.execute(con,"SELECT * FROM timestamp;") +res = DuckDB.toDataFrame(res) + res = DuckDB.execute(con,"CREATE TABLE timestamp(timestamp TIMESTAMP , data INTEGER);") res = DuckDB.execute(con,"INSERT INTO timestamp VALUES ('2021-09-27 11:30:00.000', 4), ('2021-09-28 12:30:00.000', 6), ('2021-09-29 13:30:00.000', 8);") res = DuckDB.execute(con,"SELECT * FROM timestamp;") @@ -13,4 +31,11 @@ res = DuckDB.toDataFrame(res) res = DuckDB.execute(con, "CREATE TABLE items(item VARCHAR, value DECIMAL(10,2), count INTEGER);") res = DuckDB.execute(con, "INSERT INTO items VALUES ('jeans', 20.0, 1), ('hammer', 42.2, 2);") res = DuckDB.execute(con, "SELECT * FROM items;") -res = DuckDB.toDataFrame(res) \ No newline at end of file +res = DuckDB.toDataFrame(res) + +res = DuckDB.execute(con,"CREATE TABLE integers(date DATE, data INTEGER);") +res = DuckDB.execute(con,"INSERT INTO integers VALUES ('2021-09-27', 4), ('2021-09-28', 6), ('2021-09-29', 8);") +res = DuckDB.execute(con,"SELECT * FROM integers;") +res = DuckDB.toDataFrame(res) + +DuckDB.disconnect(con) \ No newline at end of file