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

Giorgi / DuckDB.NET / 22262881094

21 Feb 2026 07:26PM UTC coverage: 89.666% (-0.1%) from 89.769%
22262881094

push

github

Giorgi
Reuse vector readers across chunks via Reset

Avoid recreating VectorDataReaderBase instances for each
chunk by adding a virtual Reset method that updates data
and validity pointers in place. Composite readers (Struct,
List, Map, Decimal) override Reset to propagate to nested
readers. Readers are now only disposed on result-set
boundaries in InitNextReader.

1231 of 1429 branches covered (86.14%)

Branch coverage included in aggregate %.

40 of 47 new or added lines in 6 files covered. (85.11%)

2526 of 2761 relevant lines covered (91.49%)

316455.97 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)
124✔
10
    {
11
        using var keyTypeLogical = NativeMethods.LogicalType.DuckDBMapTypeKeyType(logicalColumnType);
124✔
12
        using var valueTypeLogical = NativeMethods.LogicalType.DuckDBMapTypeValueType(logicalColumnType);
124✔
13

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

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

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

23
    protected override Type GetColumnType()
24
    {
25
        return typeof(Dictionary<,>).MakeGenericType(keyReader.ClrType, valueReader.ClrType);
10✔
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)
26!
36
        {
37
            return base.GetValue(offset, targetType);
×
38
        }
39

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

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

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

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

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

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

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

68
        return instance;
22✔
69
    }
70

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

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