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

Giorgi / DuckDB.NET / 22921736195

10 Mar 2026 07:24PM UTC coverage: 89.526% (+0.08%) from 89.45%
22921736195

push

github

Giorgi
Update global.json

1255 of 1463 branches covered (85.78%)

Branch coverage included in aggregate %.

2651 of 2900 relevant lines covered (91.41%)

447643.55 hits per line

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

94.4
/DuckDB.NET.Data/PreparedStatement/ClrToDuckDBConverter.cs
1
namespace DuckDB.NET.Data.PreparedStatement;
2

3
internal static class ClrToDuckDBConverter
4
{
5
    private static readonly Dictionary<DbType, Func<object, DuckDBValue>> ValueCreators = new()
3✔
6
    {
3✔
7
        { DbType.Guid, value => NativeMethods.Value.DuckDBCreateUuid(((Guid)value).ToHugeInt(false)) },
3✔
8
        { DbType.Currency, value => DecimalToDuckDBValue((decimal)value) },
33✔
9
        { DbType.Boolean, value => NativeMethods.Value.DuckDBCreateBool((bool)value) },
3✔
10
        { DbType.SByte, value => NativeMethods.Value.DuckDBCreateInt8((sbyte)value) },
3✔
11
        { DbType.Int16, value => NativeMethods.Value.DuckDBCreateInt16((short)value) },
3✔
12
        { DbType.Int32, value => NativeMethods.Value.DuckDBCreateInt32((int)value) },
18✔
13
        { DbType.Int64, value => NativeMethods.Value.DuckDBCreateInt64((long)value) },
3✔
14
        { DbType.Byte, value => NativeMethods.Value.DuckDBCreateUInt8((byte)value) },
3✔
15
        { DbType.UInt16, value => NativeMethods.Value.DuckDBCreateUInt16((ushort)value) },
3✔
16
        { DbType.UInt32, value => NativeMethods.Value.DuckDBCreateUInt32((uint)value) },
3✔
17
        { DbType.UInt64, value => NativeMethods.Value.DuckDBCreateUInt64((ulong)value) },
3✔
18
        { DbType.Single, value => NativeMethods.Value.DuckDBCreateFloat((float)value) },
12✔
19
        { DbType.Double, value => NativeMethods.Value.DuckDBCreateDouble((double)value) },
12✔
20
        { DbType.String, value => NativeMethods.Value.DuckDBCreateVarchar((string?)value) },
12✔
21
        { DbType.VarNumeric, value => NativeMethods.Value.DuckDBCreateHugeInt(new((BigInteger)value)) },
3✔
22
        { DbType.Binary, value =>
3✔
23
            {
3✔
24
                var bytes = (byte[])value;
×
25
                return NativeMethods.Value.DuckDBCreateBlob(bytes, bytes.Length);
×
26
            }
3✔
27
        },
3✔
28
        { DbType.Date, value =>
3✔
29
            {
3✔
30
                var date = (value is DateOnly dateOnly ? (DuckDBDateOnly)dateOnly : (DuckDBDateOnly)value).ToDuckDBDate();
3!
31
                return NativeMethods.Value.DuckDBCreateDate(date);
3✔
32
            }
3✔
33
        },
3✔
34
        { DbType.Time, value =>
3✔
35
            {
3✔
36
                var time = NativeMethods.DateTimeHelpers.DuckDBToTime(value is TimeOnly timeOnly ? (DuckDBTimeOnly)timeOnly : (DuckDBTimeOnly)value);
3!
37
                return NativeMethods.Value.DuckDBCreateTime(time);
3✔
38
            }
3✔
39
        },
3✔
40
        { DbType.DateTime, value =>
3✔
41
            {
3✔
42
                var dateTime = (value is DateTime dt ? (DuckDBTimestamp)dt : (DuckDBTimestamp)value).ToDuckDBTimestampStruct();
33✔
43
                return NativeMethods.Value.DuckDBCreateTimestamp(dateTime);
33✔
44
            }
3✔
45
        },
3✔
46
        { DbType.DateTimeOffset, value => NativeMethods.Value.DuckDBCreateTimestampTz(((DateTimeOffset)value).ToTimestampStruct()) },
3✔
47
    };
3✔
48

49
    public static DuckDBValue ToDuckDBValue(this object? item, DuckDBLogicalType logicalType, DuckDBType duckDBType, DbType dbType)
50
    {
51
        if (item.IsNull())
11,089✔
52
        {
53
            return NativeMethods.Value.DuckDBCreateNullValue();
4,041✔
54
        }
55

56
        return (duckDBType, item) switch
7,048✔
57
        {
7,048✔
58
            (DuckDBType.Boolean, bool value) => NativeMethods.Value.DuckDBCreateBool(value),
248✔
59

7,048✔
60
            (DuckDBType.TinyInt, _) => TryConvertTo<sbyte>(out var result) ? NativeMethods.Value.DuckDBCreateInt8(result) : NativeMethods.Value.DuckDBCreateVarchar(item.ToString()),
261!
61
            (DuckDBType.SmallInt, _) => TryConvertTo<short>(out var result) ? NativeMethods.Value.DuckDBCreateInt16(result) : NativeMethods.Value.DuckDBCreateVarchar(item.ToString()),
253!
62
            (DuckDBType.Integer, _) => TryConvertTo<int>(out var result) ? NativeMethods.Value.DuckDBCreateInt32(result) : NativeMethods.Value.DuckDBCreateVarchar(item.ToString()),
267✔
63
            (DuckDBType.BigInt, _) => TryConvertTo<long>(out var result) ? NativeMethods.Value.DuckDBCreateInt64(result) : NativeMethods.Value.DuckDBCreateVarchar(item.ToString()),
173!
64

7,048✔
65
            (DuckDBType.UnsignedTinyInt, _) => TryConvertTo<byte>(out var result) ? NativeMethods.Value.DuckDBCreateUInt8(result) : NativeMethods.Value.DuckDBCreateVarchar(item.ToString()),
286!
66
            (DuckDBType.UnsignedSmallInt, _) => TryConvertTo<ushort>(out var result) ? NativeMethods.Value.DuckDBCreateUInt16(result) : NativeMethods.Value.DuckDBCreateVarchar(item.ToString()),
252!
67
            (DuckDBType.UnsignedInteger, _) => TryConvertTo<uint>(out var result) ? NativeMethods.Value.DuckDBCreateUInt32(result) : NativeMethods.Value.DuckDBCreateVarchar(item.ToString()),
242!
68
            (DuckDBType.UnsignedBigInt, _) => TryConvertTo<ulong>(out var result) ? NativeMethods.Value.DuckDBCreateUInt64(result) : NativeMethods.Value.DuckDBCreateVarchar(item.ToString()),
189!
69

7,048✔
70
            (DuckDBType.Float, float value) => NativeMethods.Value.DuckDBCreateFloat(value),
180✔
71
            (DuckDBType.Double, double value) => NativeMethods.Value.DuckDBCreateDouble(value),
223✔
72

7,048✔
73
            (DuckDBType.Decimal, decimal value) => DecimalToDuckDBValue(value),
329✔
74
            (DuckDBType.HugeInt, BigInteger value) => NativeMethods.Value.DuckDBCreateHugeInt(new DuckDBHugeInt(value)),
180✔
75

7,048✔
76
            (DuckDBType.Varchar, string value) => NativeMethods.Value.DuckDBCreateVarchar(value),
261✔
77
            (DuckDBType.Uuid, Guid value) => NativeMethods.Value.DuckDBCreateUuid(value.ToHugeInt(false)),
154✔
78

7,048✔
79
            (DuckDBType.Timestamp, DateTime value) => NativeMethods.Value.DuckDBCreateTimestamp(value.ToTimestampStruct(duckDBType)),
36✔
80
            (DuckDBType.TimestampS, DateTime value) => NativeMethods.Value.DuckDBCreateTimestampS(value.ToTimestampStruct(duckDBType)),
18✔
81
            (DuckDBType.TimestampMs, DateTime value) => NativeMethods.Value.DuckDBCreateTimestampMs(value.ToTimestampStruct(duckDBType)),
18✔
82
            (DuckDBType.TimestampNs, DateTime value) => NativeMethods.Value.DuckDBCreateTimestampNs(value.ToTimestampStruct(duckDBType)),
18✔
83
            (DuckDBType.TimestampTz, DateTime value) => NativeMethods.Value.DuckDBCreateTimestampTz(value.ToTimestampStruct(duckDBType)),
18✔
84
            (DuckDBType.TimestampTz, DateTimeOffset value) => NativeMethods.Value.DuckDBCreateTimestampTz(value.ToTimestampStruct()),
18✔
85
            (DuckDBType.Interval, TimeSpan value) => NativeMethods.Value.DuckDBCreateInterval(value),
334✔
86
            (DuckDBType.Date, DateTime value) => NativeMethods.Value.DuckDBCreateDate(((DuckDBDateOnly)value).ToDuckDBDate()),
613✔
87
            (DuckDBType.Date, DuckDBDateOnly value) => NativeMethods.Value.DuckDBCreateDate(value.ToDuckDBDate()),
247✔
88
            (DuckDBType.Time, DateTime value) => NativeMethods.Value.DuckDBCreateTime(NativeMethods.DateTimeHelpers.DuckDBToTime((DuckDBTimeOnly)value)),
18✔
89
            (DuckDBType.Time, DuckDBTimeOnly value) => NativeMethods.Value.DuckDBCreateTime(NativeMethods.DateTimeHelpers.DuckDBToTime(value)),
303✔
90
            (DuckDBType.Date, DateOnly value) => NativeMethods.Value.DuckDBCreateDate(((DuckDBDateOnly)value).ToDuckDBDate()),
286✔
91
            (DuckDBType.Time, TimeOnly value) => NativeMethods.Value.DuckDBCreateTime(NativeMethods.DateTimeHelpers.DuckDBToTime(value)),
520✔
92
            (DuckDBType.TimeTz, DateTimeOffset value) => NativeMethods.Value.DuckDBCreateTimeTz(value.ToTimeTzStruct()),
545✔
93
            (DuckDBType.Blob, byte[] value) => NativeMethods.Value.DuckDBCreateBlob(value, value.Length),
3✔
94
            (DuckDBType.List, ICollection value) => CreateCollectionValue(logicalType, value, true, dbType),
330✔
95
            (DuckDBType.Array, ICollection value) => CreateCollectionValue(logicalType, value, false, dbType),
66✔
96
            _ when ValueCreators.TryGetValue(dbType, out var converter) => converter(item),
318!
97
            _ => NativeMethods.Value.DuckDBCreateVarchar(item.ToString())
×
98
        };
7,048✔
99

100
        bool TryConvertTo<T>(out T result) where T : struct
101
        {
102
            try
103
            {
104
                if (item is T parsable)
1,923✔
105
                {
106
                    result = parsable;
1,908✔
107
                    return true;
1,908✔
108
                }
109

110
                result = (T)Convert.ChangeType(item, typeof(T));
15✔
111
                return true;
6✔
112
            }
113
            catch (Exception)
9✔
114
            {
115
                result = default;
9✔
116
                return false;
9✔
117
            }
118
        }
1,923✔
119
    }
120

121
    private static DuckDBValue CreateCollectionValue(DuckDBLogicalType logicalType, ICollection collection, bool isList, DbType dbType)
122
    {
123
        using var collectionItemType = isList ? NativeMethods.LogicalType.DuckDBListTypeChildType(logicalType) :
396✔
124
                                                NativeMethods.LogicalType.DuckDBArrayTypeChildType(logicalType);
396✔
125

126
        var duckDBType = NativeMethods.LogicalType.DuckDBGetTypeId(collectionItemType);
396✔
127

128
        var values = new DuckDBValue[collection.Count];
396✔
129

130
        var index = 0;
396✔
131
        foreach (var item in collection)
20,822✔
132
        {
133
            var duckDBValue = item.ToDuckDBValue(collectionItemType, duckDBType, dbType);
10,015✔
134
            values[index] = duckDBValue;
10,015✔
135
            index++;
10,015✔
136
        }
137

138
        return isList ? NativeMethods.Value.DuckDBCreateListValue(collectionItemType, values, collection.Count)
396✔
139
                      : NativeMethods.Value.DuckDBCreateArrayValue(collectionItemType, values, collection.Count);
396✔
140
    }
396✔
141

142
    private static DuckDBValue DecimalToDuckDBValue(decimal value)
143
    {
144
        var mantissa = value.GetMantissa();
362✔
145

146
        var width = mantissa.IsZero
362✔
147
            ? value.Scale + 1
362✔
148
            : Math.Max((int)BigInteger.Log10(BigInteger.Abs(mantissa)) + 1, value.Scale + 1);
362✔
149

150
        return NativeMethods.Value.DuckDBCreateDecimal(new DuckDBDecimal((byte)width, value.Scale, new DuckDBHugeInt(mantissa)));
362✔
151
    }
152
}
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