Skip to content

Commit a245f27

Browse files
committed
Add UseStreamingMode to DuckDBCommand
1 parent 32c6957 commit a245f27

File tree

4 files changed

+17
-10
lines changed

4 files changed

+17
-10
lines changed

DuckDB.NET.Data/DuckDBCommand.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ public class DuckDBCommand : DbCommand
2424
public override bool DesignTimeVisible { get; set; }
2525
public override UpdateRowSource UpdatedRowSource { get; set; }
2626

27+
public bool UseStreamingMode { get; set; } = false;
28+
2729
private string commandText = string.Empty;
2830

2931
#if NET6_0_OR_GREATER
@@ -67,7 +69,7 @@ public override int ExecuteNonQuery()
6769
{
6870
EnsureConnectionOpen();
6971

70-
var results = PreparedStatement.PrepareMultiple(connection!.NativeConnection, CommandText, parameters);
72+
var results = PreparedStatement.PrepareMultiple(connection!.NativeConnection, CommandText, parameters, UseStreamingMode);
7173

7274
var count = 0;
7375

@@ -102,7 +104,7 @@ protected override DbDataReader ExecuteDbDataReader(CommandBehavior behavior)
102104
{
103105
EnsureConnectionOpen();
104106

105-
var results = PreparedStatement.PrepareMultiple(connection!.NativeConnection, CommandText, parameters);
107+
var results = PreparedStatement.PrepareMultiple(connection!.NativeConnection, CommandText, parameters, UseStreamingMode);
106108

107109
var reader = new DuckDBDataReader(this, results, behavior);
108110

DuckDB.NET.Data/DuckDBDataReader.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ public class DuckDBDataReader : DbDataReader
2828
private long currentChunkIndex;
2929

3030
private readonly IEnumerator<DuckDBResult> resultEnumerator;
31-
private VectorDataReaderBase[] vectorReaders = Array.Empty<VectorDataReaderBase>();
31+
private VectorDataReaderBase[] vectorReaders = [];
3232

3333
internal DuckDBDataReader(DuckDBCommand command, IEnumerable<DuckDBResult> queryResults, CommandBehavior behavior)
3434
{

DuckDB.NET.Data/Internal/PreparedStatement.cs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ private PreparedStatement(DuckDBPreparedStatement statement)
4141
this.statement = statement;
4242
}
4343

44-
public static IEnumerable<DuckDBResult> PrepareMultiple(DuckDBNativeConnection connection, string query, DuckDBParameterCollection parameters)
44+
public static IEnumerable<DuckDBResult> PrepareMultiple(DuckDBNativeConnection connection, string query, DuckDBParameterCollection parameters, bool useStreamingMode)
4545
{
4646
using var unmanagedQuery = query.ToUnmanagedString();
4747

@@ -62,7 +62,7 @@ public static IEnumerable<DuckDBResult> PrepareMultiple(DuckDBNativeConnection c
6262
using var preparedStatement = new PreparedStatement(statement);
6363
if (status.IsSuccess())
6464
{
65-
using var result = preparedStatement.Execute(parameters);
65+
using var result = preparedStatement.Execute(parameters, useStreamingMode);
6666
yield return result;
6767
}
6868
else
@@ -75,11 +75,14 @@ public static IEnumerable<DuckDBResult> PrepareMultiple(DuckDBNativeConnection c
7575
}
7676
}
7777

78-
public DuckDBResult Execute(DuckDBParameterCollection parameterCollection)
78+
public DuckDBResult Execute(DuckDBParameterCollection parameterCollection, bool useStreamingMode)
7979
{
8080
BindParameters(statement, parameterCollection);
8181

82-
var status = NativeMethods.PreparedStatements.DuckDBExecutePreparedStreaming(statement, out var queryResult);
82+
var status = useStreamingMode
83+
? NativeMethods.PreparedStatements.DuckDBExecutePreparedStreaming(statement, out var queryResult)
84+
: NativeMethods.PreparedStatements.DuckDBExecutePrepared(statement, out queryResult);
85+
8386
if (!status.IsSuccess())
8487
{
8588
var errorMessage = NativeMethods.Query.DuckDBResultError(ref queryResult).ToManagedString(false);

DuckDB.NET.Test/DuckDBDataReaderTests.cs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ public void GetOrdinalReturnsColumnIndex()
1717
Command.ExecuteNonQuery();
1818

1919
Command.CommandText = "select * from GetOrdinalTests";
20+
Command.UseStreamingMode = true;
2021
var reader = Command.ExecuteReader();
2122

2223
reader.GetOrdinal("key").Should().Be(0);
@@ -128,7 +129,7 @@ public void ReadIntervalValues()
128129
reader.Invoking(r => r.GetValue(0)).Should().Throw<ArgumentOutOfRangeException>();
129130

130131
interval.Months.Should().Be(12);
131-
132+
132133
Command.CommandText = "SELECT INTERVAL '28' DAYS;";
133134
reader = Command.ExecuteReader();
134135
reader.Read();
@@ -302,6 +303,7 @@ public void ReadInsertReturningClause()
302303
Command.CommandText = "CREATE TABLE t2 (i INT, j INT);";
303304
Command.ExecuteNonQuery();
304305

306+
Command.UseStreamingMode = true;
305307
Command.CommandText = @"INSERT INTO t2
306308
SELECT 2 AS i, 3 AS j
307309
RETURNING *, i * j AS i_times_j;";
@@ -325,7 +327,7 @@ public void ReadNonQueryAsResult()
325327
}
326328

327329
[Fact]
328-
public void ReadDecimalSchema()
330+
public void ReadDecimalSchema()
329331
{
330332
Command.CommandText = "CREATE TABLE decimaltbl(foo decimal(10,2));";
331333
Command.ExecuteNonQuery();
@@ -342,7 +344,7 @@ public void ReadDecimalSchema()
342344
}
343345

344346
[Fact]
345-
public void ReadDecimalSchemaWithoutTableRow()
347+
public void ReadDecimalSchemaWithoutTableRow()
346348
{
347349
Command.CommandText = "CREATE TABLE decimaltbl(foo decimal(10,2));";
348350
Command.ExecuteNonQuery();

0 commit comments

Comments
 (0)