• 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

92.13
/DuckDB.NET.Data/PreparedStatement/PreparedStatement.cs
1
using System.Linq;
2
using DuckDB.NET.Data.Connection;
3

4
namespace DuckDB.NET.Data.PreparedStatement;
5

6
internal sealed class PreparedStatement : IDisposable
7
{
8
    private readonly DuckDBPreparedStatement statement;
9

10
    private PreparedStatement(DuckDBPreparedStatement statement)
158,169✔
11
    {
12
        this.statement = statement;
158,169✔
13
    }
158,169✔
14

15
    public static IEnumerable<DuckDBResult> PrepareMultiple(DuckDBNativeConnection connection, string query, DuckDBParameterCollection parameters, bool useStreamingMode)
16
    {
17
        var statementCount = NativeMethods.ExtractStatements.DuckDBExtractStatements(connection, query, out var extractedStatements);
158,076✔
18

19
        using (extractedStatements)
158,076✔
20
        {
21
            if (statementCount <= 0)
158,076✔
22
            {
23
                var error = NativeMethods.ExtractStatements.DuckDBExtractStatementsError(extractedStatements);
3✔
24
                throw new DuckDBException(error);
3✔
25
            }
26

27
            for (int index = 0; index < statementCount; index++)
553,506✔
28
            {
29
                var status = NativeMethods.ExtractStatements.DuckDBPrepareExtractedStatement(connection, extractedStatements, index, out var statement);
158,184✔
30

31
                if (status.IsSuccess())
158,184✔
32
                {
33
                    using var preparedStatement = new PreparedStatement(statement);
158,169✔
34
                    yield return preparedStatement.Execute(parameters, useStreamingMode, connection);
158,169✔
35
                }
118,680✔
36
                else
37
                {
38
                    var errorMessage = NativeMethods.PreparedStatements.DuckDBPrepareError(statement);
15✔
39

40
                    if (string.IsNullOrEmpty(errorMessage))
15!
41
                    {
42
                        errorMessage = "DuckDBQuery failed";
×
43
                    }
44

45
                    throw new DuckDBException(errorMessage, UdfExceptionStore.Retrieve(connection));
15✔
46
                }
47
            }
48
        }
118,569✔
49
    }
118,569✔
50

51
    private DuckDBResult Execute(DuckDBParameterCollection parameterCollection, bool useStreamingMode, DuckDBNativeConnection connection)
52
    {
53
        BindParameters(statement, parameterCollection);
158,169✔
54

55
        var status = useStreamingMode
158,151✔
56
            ? NativeMethods.PreparedStatements.DuckDBExecutePreparedStreaming(statement, out var queryResult)
158,151✔
57
            : NativeMethods.PreparedStatements.DuckDBExecutePrepared(statement, out queryResult);
158,151✔
58

59
        if (!status.IsSuccess())
158,151✔
60
        {
61
            var errorMessage = NativeMethods.Query.DuckDBResultError(ref queryResult);
60✔
62
            var errorType = NativeMethods.Query.DuckDBResultErrorType(ref queryResult);
60✔
63
            queryResult.Close();
60✔
64

65
            if (string.IsNullOrEmpty(errorMessage))
60!
66
            {
67
                errorMessage = "DuckDB execution failed";
×
68
            }
69

70
            if (errorType == DuckDBErrorType.Interrupt)
60✔
71
            {
72
                throw new OperationCanceledException();
12✔
73
            }
74

75
            var innerException = UdfExceptionStore.Retrieve(connection);
48✔
76
            throw innerException != null
48✔
77
                ? new DuckDBException(errorMessage, innerException)
48✔
78
                : new DuckDBException(errorMessage, errorType);
48✔
79
        }
80

81
        return queryResult;
158,091✔
82
    }
83

84
    private static void BindParameters(DuckDBPreparedStatement preparedStatement, DuckDBParameterCollection parameterCollection)
85
    {
86
        var expectedParameters = NativeMethods.PreparedStatements.DuckDBParams(preparedStatement);
158,169✔
87
        if (parameterCollection.Count < expectedParameters)
158,169✔
88
        {
89
            throw new InvalidOperationException($"Invalid number of parameters. Expected {expectedParameters}, got {parameterCollection.Count}");
18✔
90
        }
91

92
        if (parameterCollection.OfType<DuckDBParameter>().Any(p => !string.IsNullOrEmpty(p.ParameterName)))
159,726✔
93
        {
94
            foreach (DuckDBParameter param in parameterCollection)
672✔
95
            {
96
                var state = NativeMethods.PreparedStatements.DuckDBBindParameterIndex(preparedStatement, out var index, param.ParameterName);
204✔
97
                if (state.IsSuccess())
204✔
98
                {
99
                    BindParameter(preparedStatement, index, param);
174✔
100
                }
101
            }
102
        }
103
        else
104
        {
105
            for (var i = 0; i < expectedParameters; ++i)
317,838✔
106
            {
107
                var param = parameterCollection[i];
900✔
108
                BindParameter(preparedStatement, i + 1, param);
900✔
109
            }
110
        }
111
    }
158,151✔
112

113
    private static void BindParameter(DuckDBPreparedStatement preparedStatement, long index, DuckDBParameter parameter)
114
    {
115
        using var parameterLogicalType = NativeMethods.PreparedStatements.DuckDBParamLogicalType(preparedStatement, index);
1,074✔
116
        var duckDBType = NativeMethods.LogicalType.DuckDBGetTypeId(parameterLogicalType);
1,074✔
117

118
        using var duckDBValue = parameter.Value.ToDuckDBValue(parameterLogicalType, duckDBType, parameter.DbType);
1,074✔
119

120
        var result = NativeMethods.PreparedStatements.DuckDBBindValue(preparedStatement, index, duckDBValue);
1,074✔
121

122
        if (!result.IsSuccess())
1,074!
123
        {
124
            var errorMessage = NativeMethods.PreparedStatements.DuckDBPrepareError(preparedStatement);
×
125
            throw new InvalidOperationException($"Unable to bind parameter {index}: {errorMessage}");
×
126
        }
127
    }
2,148✔
128

129
    public void Dispose()
130
    {
131
        statement.Dispose();
157,509✔
132
    }
157,509✔
133
}
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