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

Giorgi / DuckDB.NET / 20383681089

19 Dec 2025 10:02PM UTC coverage: 89.294% (+0.03%) from 89.262%
20383681089

push

github

Giorgi
Drop .Net Standard support

1183 of 1379 branches covered (85.79%)

Branch coverage included in aggregate %.

19 of 22 new or added lines in 13 files covered. (86.36%)

16 existing lines in 9 files now uncovered.

2295 of 2516 relevant lines covered (91.22%)

567948.85 hits per line

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

93.94
/DuckDB.NET.Data/DuckDBAppenderRow.cs
1
using DuckDB.NET.Data.DataChunk.Writer;
2
using DuckDB.NET.Native;
3
using System;
4
using System.Collections.Generic;
5
using System.Numerics;
6

7
namespace DuckDB.NET.Data;
8

9
public class DuckDBAppenderRow : IDuckDBAppenderRow
10
{
11
    private int columnIndex = 0;
12
    private readonly string qualifiedTableName;
13
    private readonly VectorDataWriterBase[] vectorWriters;
14
    private readonly ulong rowIndex;
15
    private readonly DuckDBDataChunk dataChunk;
16
    private readonly Native.DuckDBAppender nativeAppender;
17

18
    internal DuckDBAppenderRow(string qualifiedTableName, VectorDataWriterBase[] vectorWriters,
354,990✔
19
                               ulong rowIndex, DuckDBDataChunk dataChunk, Native.DuckDBAppender nativeAppender)
354,990✔
20
    {
21
        this.qualifiedTableName = qualifiedTableName;
354,990✔
22
        this.vectorWriters = vectorWriters;
354,990✔
23
        this.rowIndex = rowIndex;
354,990✔
24
        this.dataChunk = dataChunk;
354,990✔
25
        this.nativeAppender = nativeAppender;
354,990✔
26
    }
354,990✔
27

28
    public void EndRow()
29
    {
30
        if (columnIndex < vectorWriters.Length)
354,972✔
31
        {
32
            throw new InvalidOperationException($"The table {qualifiedTableName} has {vectorWriters.Length} columns but you specified only {columnIndex} values");
3✔
33
        }
34
    }
354,969✔
35

36
    public IDuckDBAppenderRow AppendNullValue() => AppendValueInternal<int?>(null); //Doesn't matter what type T we pass to Append when passing null.
81✔
37

38
    public IDuckDBAppenderRow AppendValue(bool? value) => AppendValueInternal(value);
69✔
39

40
    public IDuckDBAppenderRow AppendValue(byte[]? value) => AppendSpan(value);
6✔
41

42
    public IDuckDBAppenderRow AppendValue(Span<byte> value) => AppendSpan(value);
3✔
43

44
    public IDuckDBAppenderRow AppendValue(string? value) => AppendValueInternal(value);
45,120✔
45

46
    public IDuckDBAppenderRow AppendValue(decimal? value) => AppendValueInternal(value);
270✔
47

48
    public IDuckDBAppenderRow AppendValue(Guid? value) => AppendValueInternal(value);
105,003✔
49

50
    public IDuckDBAppenderRow AppendValue(BigInteger? value) => AppendValueInternal(value);
60✔
51

52
    #region Append Signed Int
53

54
    public IDuckDBAppenderRow AppendValue(sbyte? value) => AppendValueInternal(value);
84✔
55

56
    public IDuckDBAppenderRow AppendValue(short? value) => AppendValueInternal(value);
60✔
57

58
    public IDuckDBAppenderRow AppendValue(int? value) => AppendValueInternal(value);
249,810✔
59

60
    public IDuckDBAppenderRow AppendValue(long? value) => AppendValueInternal(value);
60✔
61

62
    #endregion
63

64
    #region Append Unsigned Int
65

66
    public IDuckDBAppenderRow AppendValue(byte? value) => AppendValueInternal(value);
66✔
67

68
    public IDuckDBAppenderRow AppendValue(ushort? value) => AppendValueInternal(value);
60✔
69

70
    public IDuckDBAppenderRow AppendValue(uint? value) => AppendValueInternal(value);
60✔
71

72
    public IDuckDBAppenderRow AppendValue(ulong? value) => AppendValueInternal(value);
60✔
73

74
    #endregion
75

76
    #region Append Enum
77

78
    public IDuckDBAppenderRow AppendValue<TEnum>(TEnum? value) where TEnum : Enum => AppendValueInternal(value);
15✔
79

80
    #endregion
81

82
    #region Append Float
83

84
    public IDuckDBAppenderRow AppendValue(float? value) => AppendValueInternal(value);
66✔
85

86
    public IDuckDBAppenderRow AppendValue(double? value) => AppendValueInternal(value);
120✔
87

88
    #endregion
89

90
    #region Append Temporal
UNCOV
91
    public IDuckDBAppenderRow AppendValue(DateOnly? value) => AppendValueInternal(value);
×
92

93
    public IDuckDBAppenderRow AppendValue(TimeOnly? value) => AppendValueInternal(value);
×
94

95
    public IDuckDBAppenderRow AppendValue(DuckDBDateOnly? value) => AppendValueInternal(value);
120✔
96

97
    public IDuckDBAppenderRow AppendValue(DuckDBTimeOnly? value) => AppendValueInternal(value);
60✔
98

99

100
    public IDuckDBAppenderRow AppendValue(DateTime? value) => AppendValueInternal(value);
15,336✔
101

102
    public IDuckDBAppenderRow AppendValue(DateTimeOffset? value) => AppendValueInternal(value);
120✔
103

104
    public IDuckDBAppenderRow AppendValue(TimeSpan? value)
105
    {
106
        return AppendValueInternal(value);
60✔
107
    }
108

109
    #endregion
110

111
    #region Composite Types
112

113
    public IDuckDBAppenderRow AppendValue<T>(IEnumerable<T>? value) => AppendValueInternal(value);
498,006✔
114

115
    #endregion
116

117
    public IDuckDBAppenderRow AppendDefault()
118
    {
119
        CheckColumnAccess();
15✔
120

121
        var state = NativeMethods.Appender.DuckDBAppendDefaultToChunk(nativeAppender, dataChunk, columnIndex, rowIndex);
15✔
122

123
        if (state == DuckDBState.Error)
15!
124
        {
125
            DuckDBAppender.ThrowLastError(nativeAppender);
×
126
        }
127

128
        columnIndex++;
15✔
129
        return this;
15✔
130
    }
131

132
    private DuckDBAppenderRow AppendValueInternal<T>(T? value)
133
    {
134
        CheckColumnAccess();
914,766✔
135

136
        vectorWriters[columnIndex].WriteValue(value, rowIndex);
914,763✔
137

138
        columnIndex++;
914,748✔
139

140
        return this;
914,748✔
141
    }
142

143
    private unsafe IDuckDBAppenderRow AppendSpan(Span<byte> val)
144
    {
145
        if (val == null)
9✔
146
        {
147
            return AppendNullValue();
3✔
148
        }
149

150
        CheckColumnAccess();
6✔
151

152
        fixed (byte* pSource = val)
6✔
153
        {
154
            vectorWriters[columnIndex].AppendBlob(pSource, val.Length, rowIndex);
6✔
155
        }
156

157
        columnIndex++;
6✔
158
        return this;
6✔
159
    }
160

161
    private void CheckColumnAccess()
162
    {
163
        if (columnIndex >= vectorWriters.Length)
914,787✔
164
        {
165
            throw new IndexOutOfRangeException($"The table {qualifiedTableName} has {vectorWriters.Length} columns but you are trying to append value for column {columnIndex + 1}");
3✔
166
        }
167
    }
914,784✔
168
}
169

170
public interface IDuckDBAppenderRow
171
{
172
    void EndRow();
173
    IDuckDBAppenderRow AppendNullValue();
174
    IDuckDBAppenderRow AppendValue(bool? value);
175
    IDuckDBAppenderRow AppendValue(byte[]? value);
176
    IDuckDBAppenderRow AppendValue(Span<byte> value);
177
    IDuckDBAppenderRow AppendValue(string? value);
178
    IDuckDBAppenderRow AppendValue(decimal? value);
179
    IDuckDBAppenderRow AppendValue(Guid? value);
180
    IDuckDBAppenderRow AppendValue(BigInteger? value);
181
    IDuckDBAppenderRow AppendValue(sbyte? value);
182
    IDuckDBAppenderRow AppendValue(short? value);
183
    IDuckDBAppenderRow AppendValue(int? value);
184
    IDuckDBAppenderRow AppendValue(long? value);
185
    IDuckDBAppenderRow AppendValue(byte? value);
186
    IDuckDBAppenderRow AppendValue(ushort? value);
187
    IDuckDBAppenderRow AppendValue(uint? value);
188
    IDuckDBAppenderRow AppendValue(ulong? value);
189
    IDuckDBAppenderRow AppendValue<TEnum>(TEnum? value) where TEnum : Enum;
190
    IDuckDBAppenderRow AppendValue(float? value);
191
    IDuckDBAppenderRow AppendValue(double? value);
192
    IDuckDBAppenderRow AppendValue(DuckDBDateOnly? value);
193
    IDuckDBAppenderRow AppendValue(DuckDBTimeOnly? value);
194
    IDuckDBAppenderRow AppendValue(DateTime? value);
195
    IDuckDBAppenderRow AppendValue(DateTimeOffset? value);
196
    IDuckDBAppenderRow AppendValue(TimeSpan? value);
197
    IDuckDBAppenderRow AppendValue<T>(IEnumerable<T>? value);
198
    IDuckDBAppenderRow AppendDefault();
199
}
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

© 2025 Coveralls, Inc