@@ -13,6 +13,9 @@ import (
13
13
"unsafe"
14
14
)
15
15
16
+ // secondsPerDay to calculate the days since 1970-01-01.
17
+ const secondsPerDay = 24 * 60 * 60
18
+
16
19
// vector storage of a DuckDB column.
17
20
type vector struct {
18
21
// The underlying DuckDB vector.
@@ -63,7 +66,7 @@ func (vec *vector) tryCast(val any) (any, error) {
63
66
case C .DUCKDB_TYPE_BLOB :
64
67
return tryPrimitiveCast [[]byte ](val , reflect .TypeOf ([]byte {}).String ())
65
68
case C .DUCKDB_TYPE_TIMESTAMP , C .DUCKDB_TYPE_TIMESTAMP_S , C .DUCKDB_TYPE_TIMESTAMP_MS ,
66
- C .DUCKDB_TYPE_TIMESTAMP_NS , C .DUCKDB_TYPE_TIMESTAMP_TZ :
69
+ C .DUCKDB_TYPE_TIMESTAMP_NS , C .DUCKDB_TYPE_TIMESTAMP_TZ , C . DUCKDB_TYPE_DATE :
67
70
return tryPrimitiveCast [time.Time ](val , reflect .TypeOf (time.Time {}).String ())
68
71
case C .DUCKDB_TYPE_UUID :
69
72
return tryPrimitiveCast [UUID ](val , reflect .TypeOf (UUID {}).String ())
@@ -215,6 +218,8 @@ func (vec *vector) init(logicalType C.duckdb_logical_type, colIdx int) error {
215
218
vec .initTS (duckdbType )
216
219
case C .DUCKDB_TYPE_UUID :
217
220
vec .initUUID ()
221
+ case C .DUCKDB_TYPE_DATE :
222
+ vec .initDate ()
218
223
case C .DUCKDB_TYPE_LIST :
219
224
return vec .initList (logicalType , colIdx )
220
225
case C .DUCKDB_TYPE_STRUCT :
@@ -295,6 +300,12 @@ func (vec *vector) setTime(rowIdx C.idx_t, ticks int64) {
295
300
setPrimitive [C.duckdb_timestamp ](vec , rowIdx , ts )
296
301
}
297
302
303
+ func (vec * vector ) setDate (rowIdx C.idx_t , days int32 ) {
304
+ var date C.duckdb_date
305
+ date .days = C .int32_t (days )
306
+ setPrimitive [C.duckdb_date ](vec , rowIdx , date )
307
+ }
308
+
298
309
func (vec * vector ) setList (rowIdx C.idx_t , val any ) {
299
310
if val == nil {
300
311
vec .setNull (rowIdx )
@@ -384,6 +395,21 @@ func (vec *vector) initUUID() {
384
395
vec .duckdbType = C .DUCKDB_TYPE_UUID
385
396
}
386
397
398
+ func (vec * vector ) initDate () {
399
+ vec .fn = func (vec * vector , rowIdx C.idx_t , val any ) {
400
+ if val == nil {
401
+ vec .setNull (rowIdx )
402
+ return
403
+ }
404
+
405
+ v := val .(time.Time )
406
+ // Days since 1970-01-01.
407
+ days := int32 (v .UTC ().Unix () / secondsPerDay )
408
+ vec .setDate (rowIdx , days )
409
+ }
410
+ vec .duckdbType = C .DUCKDB_TYPE_DATE
411
+ }
412
+
387
413
func (vec * vector ) initList (logicalType C.duckdb_logical_type , colIdx int ) error {
388
414
// Get the child vector type.
389
415
childType := C .duckdb_list_type_child_type (logicalType )
0 commit comments