• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

Giorgi / DuckDB.NET / 13181075586

06 Feb 2025 02:31PM UTC coverage: 89.958% (+0.02%) from 89.937%
13181075586

push

github

Giorgi
Merge branch 'develop'

1081 of 1235 branches covered (87.53%)

Branch coverage included in aggregate %.

322 of 345 new or added lines in 20 files covered. (93.33%)

2 existing lines in 1 file now uncovered.

2108 of 2310 relevant lines covered (91.26%)

760504.66 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

98.76
/DuckDB.NET.Data/PreparedStatement/ClrToDuckDBConverter.cs
1
using DuckDB.NET.Data.Extensions;
2
using DuckDB.NET.Native;
3
using System;
4
using System.Collections;
5
using System.Globalization;
6
using System.Numerics;
7

8
namespace DuckDB.NET.Data.PreparedStatement;
9

10
internal static class ClrToDuckDBConverter
11
{
12
    public static DuckDBValue ToDuckDBValue(this object? item, DuckDBLogicalType logicalType, DuckDBType duckDBType)
13
    {
14
        if (item.IsNull())
10,192✔
15
        {
16
            return NativeMethods.Value.DuckDBCreateNullValue();
3,706✔
17
        }
18

19
        return (duckDBType, item) switch
6,486✔
20
        {
6,486✔
21
            (DuckDBType.Boolean, bool value) => NativeMethods.Value.DuckDBCreateBool(value),
139✔
22

6,486✔
23
            (DuckDBType.TinyInt, _) => NativeMethods.Value.DuckDBCreateInt8(ConvertTo<sbyte>()),
302✔
24
            (DuckDBType.SmallInt, _) => NativeMethods.Value.DuckDBCreateInt16(ConvertTo<short>()),
212✔
25
            (DuckDBType.Integer, _) => NativeMethods.Value.DuckDBCreateInt32(ConvertTo<int>()),
381✔
26
            (DuckDBType.BigInt, _) => NativeMethods.Value.DuckDBCreateInt64(ConvertTo<long>()),
252✔
27

6,486✔
28
            (DuckDBType.UnsignedTinyInt, _) => NativeMethods.Value.DuckDBCreateUInt8(ConvertTo<byte>()),
132✔
29
            (DuckDBType.UnsignedSmallInt, _) => NativeMethods.Value.DuckDBCreateUInt16(ConvertTo<ushort>()),
174✔
30
            (DuckDBType.UnsignedInteger, _) => NativeMethods.Value.DuckDBCreateUInt32(ConvertTo<uint>()),
236✔
31
            (DuckDBType.UnsignedBigInt, _) => NativeMethods.Value.DuckDBCreateUInt64(ConvertTo<ulong>()),
318✔
32

6,486✔
33
            (DuckDBType.Float, float value) => NativeMethods.Value.DuckDBCreateFloat(value),
159✔
34
            (DuckDBType.Double, double value) => NativeMethods.Value.DuckDBCreateDouble(value),
244✔
35

6,486✔
36
            (DuckDBType.Decimal, decimal value) => DecimalToDuckDBValue(value),
271✔
37
            (DuckDBType.HugeInt, BigInteger value) => NativeMethods.Value.DuckDBCreateHugeInt(new DuckDBHugeInt(value)),
187✔
38

6,486✔
39
            (DuckDBType.Varchar, string value) => StringToDuckDBValue(value),
281✔
40
            (DuckDBType.Uuid, Guid value) => GuidToDuckDBValue(value),
189✔
41

6,486✔
42
            (DuckDBType.Timestamp, DateTime value) => NativeMethods.Value.DuckDBCreateTimestamp(value.ToTimestampStruct(duckDBType)),
36✔
43
            (DuckDBType.TimestampS, DateTime value) => NativeMethods.Value.DuckDBCreateTimestampS(value.ToTimestampStruct(duckDBType)),
18✔
44
            (DuckDBType.TimestampMs, DateTime value) => NativeMethods.Value.DuckDBCreateTimestampMs(value.ToTimestampStruct(duckDBType)),
18✔
45
            (DuckDBType.TimestampNs, DateTime value) => NativeMethods.Value.DuckDBCreateTimestampNs(value.ToTimestampStruct(duckDBType)),
18✔
46
            (DuckDBType.TimestampTz, DateTime value) => NativeMethods.Value.DuckDBCreateTimestampTz(value.ToTimestampStruct(duckDBType)),
18✔
47
            (DuckDBType.TimestampTz, DateTimeOffset value) => NativeMethods.Value.DuckDBCreateTimestampTz(value.ToTimestampStruct()),
18✔
48
            (DuckDBType.Interval, TimeSpan value) => NativeMethods.Value.DuckDBCreateInterval(value),
310✔
49
            (DuckDBType.Date, DateTime value) => NativeMethods.Value.DuckDBCreateDate(NativeMethods.DateTimeHelpers.DuckDBToDate((DuckDBDateOnly)value)),
411✔
50
            (DuckDBType.Date, DuckDBDateOnly value) => NativeMethods.Value.DuckDBCreateDate(NativeMethods.DateTimeHelpers.DuckDBToDate(value)),
217✔
51
            (DuckDBType.Time, DateTime value) => NativeMethods.Value.DuckDBCreateTime(NativeMethods.DateTimeHelpers.DuckDBToTime((DuckDBTimeOnly)value)),
18✔
52
            (DuckDBType.Time, DuckDBTimeOnly value) => NativeMethods.Value.DuckDBCreateTime(NativeMethods.DateTimeHelpers.DuckDBToTime(value)),
240✔
53
#if NET6_0_OR_GREATER
6,486✔
54
            (DuckDBType.Date, DateOnly value) => NativeMethods.Value.DuckDBCreateDate(NativeMethods.DateTimeHelpers.DuckDBToDate(value)),
200✔
55
            (DuckDBType.Time, TimeOnly value) => NativeMethods.Value.DuckDBCreateTime(NativeMethods.DateTimeHelpers.DuckDBToTime(value)),
520✔
56
#endif
6,486✔
57
            (DuckDBType.TimeTz, DateTimeOffset value) => NativeMethods.Value.DuckDBCreateTimeTz(value.ToTimeTzStruct()),
556✔
58
            (DuckDBType.Blob, byte[] value) => NativeMethods.Value.DuckDBCreateBlob(value, value.Length),
3✔
59
            (DuckDBType.List, ICollection value) => CreateCollectionValue(logicalType, value, true),
330✔
60
            (DuckDBType.Array, ICollection value) => CreateCollectionValue(logicalType, value, false),
66✔
61
            _ => throw new InvalidOperationException($"Cannot bind parameter type {item!.GetType().FullName} to column of type {duckDBType}")
12✔
62
        };
6,486✔
63

64
        T ConvertTo<T>()
65
        {
66
            try
67
            {
68
                return (T)Convert.ChangeType(item, typeof(T));
2,007✔
69
            }
NEW
70
            catch (Exception)
×
71
            {
NEW
72
                throw new ArgumentOutOfRangeException($"Cannot bind parameter '{item}' type {item!.GetType().FullName} to column of type {duckDBType}");
×
73
            }
74
        }
2,007✔
75
    }
76

77
    private static DuckDBValue CreateCollectionValue(DuckDBLogicalType logicalType, ICollection collection, bool isList)
78
    {
79
        using var collectionItemType = isList ? NativeMethods.LogicalType.DuckDBListTypeChildType(logicalType) :
396✔
80
                                                NativeMethods.LogicalType.DuckDBArrayTypeChildType(logicalType);
396✔
81

82
        var duckDBType = NativeMethods.LogicalType.DuckDBGetTypeId(collectionItemType);
396✔
83

84
        var values = new DuckDBValue[collection.Count];
396✔
85

86
        var index = 0;
396✔
87
        foreach (var item in collection)
19,430✔
88
        {
89
            var duckDBValue = item.ToDuckDBValue(collectionItemType, duckDBType);
9,319✔
90
            values[index] = duckDBValue;
9,319✔
91
            index++;
9,319✔
92
        }
93

94
        return isList ? NativeMethods.Value.DuckDBCreateListValue(collectionItemType, values, collection.Count)
396✔
95
                      : NativeMethods.Value.DuckDBCreateArrayValue(collectionItemType, values, collection.Count);
396✔
96
    }
396✔
97

98
    private static DuckDBValue GuidToDuckDBValue(Guid value)
99
    {
100
        using var handle = value.ToString().ToUnmanagedString();
189✔
101
        return NativeMethods.Value.DuckDBCreateVarchar(handle);
189✔
102
    }
189✔
103

104
    private static DuckDBValue StringToDuckDBValue(string value)
105
    {
106
        using var handle = value.ToUnmanagedString();
281✔
107
        return NativeMethods.Value.DuckDBCreateVarchar(handle);
281✔
108
    }
281✔
109

110
    private static DuckDBValue DecimalToDuckDBValue(decimal value)
111
    {
112
        using var handle = value.ToString(CultureInfo.InvariantCulture).ToUnmanagedString();
271✔
113
        return NativeMethods.Value.DuckDBCreateVarchar(handle);
271✔
114
    }
271✔
115
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc