• 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

78.43
/DuckDB.NET.Data/DataChunk/Reader/MapVectorDataReader.cs
1
namespace DuckDB.NET.Data.DataChunk.Reader;
2

3
internal sealed class MapVectorDataReader : VectorDataReaderBase
4
{
5
    private readonly VectorDataReaderBase keyReader;
6
    private readonly VectorDataReaderBase valueReader;
7

8
    internal unsafe MapVectorDataReader(IntPtr vector, void* dataPointer, ulong* validityMaskPointer, DuckDBType columnType, DuckDBLogicalType logicalColumnType, string columnName) 
9
                    : base(dataPointer, validityMaskPointer, columnType, columnName)
186✔
10
    {
11
        using var keyTypeLogical = NativeMethods.LogicalType.DuckDBMapTypeKeyType(logicalColumnType);
186✔
12
        using var valueTypeLogical = NativeMethods.LogicalType.DuckDBMapTypeValueType(logicalColumnType);
186✔
13

14
        var childVector = NativeMethods.Vectors.DuckDBListVectorGetChild(vector);
186✔
15

16
        var keyVector = NativeMethods.Vectors.DuckDBStructVectorGetChild(childVector, 0);
186✔
17
        var valueVector = NativeMethods.Vectors.DuckDBStructVectorGetChild(childVector, 1);
186✔
18

19
        keyReader = VectorDataReaderFactory.CreateReader(keyVector, keyTypeLogical, columnName);
186✔
20
        valueReader = VectorDataReaderFactory.CreateReader(valueVector, valueTypeLogical, columnName);
186✔
21
    }
372✔
22

23
    protected override Type GetColumnType()
24
    {
25
        return typeof(Dictionary<,>).MakeGenericType(keyReader.ClrType, valueReader.ClrType);
15✔
26
    }
27

28
    protected override Type GetColumnProviderSpecificType()
29
    {
30
        return typeof(Dictionary<,>).MakeGenericType(keyReader.ProviderSpecificClrType, valueReader.ProviderSpecificClrType);
×
31
    }
32

33
    internal override unsafe object GetValue(ulong offset, Type targetType)
34
    {
35
        if (DuckDBType != DuckDBType.Map)
39!
36
        {
37
            return base.GetValue(offset, targetType);
×
38
        }
39

40
        if (Activator.CreateInstance(targetType) is not IDictionary instance)
39✔
41
        {
42
            throw new InvalidOperationException($"Cannot read Map column {ColumnName} in a non-dictionary type");
3✔
43
        }
44

45
        var arguments = targetType.GetGenericArguments();
36✔
46

47
        var allowsNullValues = arguments.Length == 2 && arguments[1].AllowsNullValue(out _, out _);
36!
48

49
        var listData = (DuckDBListEntry*)DataPointer + offset;
36✔
50

51
        for (ulong i = 0; i < listData->Length; i++)
216✔
52
        {
53
            var childOffset = i + listData->Offset;
75✔
54

55
            var key = keyReader.GetValue(childOffset);
75✔
56
            var value = valueReader.IsValid(childOffset) ? valueReader.GetValue(childOffset) : null;
75✔
57

58
            if (allowsNullValues || value != null)
75✔
59
            {
60
                instance.Add(key, value);
72✔
61
            }
62
            else
63
            {
64
                throw new InvalidCastException($"The Map in column {ColumnName} contains null value but dictionary does not allow null values");
3✔
65
            }
66
        }
67

68
        return instance;
33✔
69
    }
70

71
    internal override void Reset(IntPtr vector)
72
    {
73
        base.Reset(vector);
×
74
        var childVector = NativeMethods.Vectors.DuckDBListVectorGetChild(vector);
×
75
        var keyVector = NativeMethods.Vectors.DuckDBStructVectorGetChild(childVector, 0);
×
76
        var valueVector = NativeMethods.Vectors.DuckDBStructVectorGetChild(childVector, 1);
×
77
        keyReader.Reset(keyVector);
×
78
        valueReader.Reset(valueVector);
×
79
    }
×
80

81
    public override void Dispose()
82
    {
83
        keyReader.Dispose();
3✔
84
        valueReader.Dispose();
3✔
85
        base.Dispose();
3✔
86
    }
3✔
87
}
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