Skip to content

Commit b917185

Browse files
committed
Add test cases for list and array
1 parent 08be2d4 commit b917185

File tree

2 files changed

+34
-3
lines changed

2 files changed

+34
-3
lines changed

DuckDB.NET.Data/Internal/Writer/ListVectorDataWriter.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,11 @@ private void ResizeVector(int rowIndex, ulong count)
111111
vectorReservedSize = (ulong)Math.Max(vectorReservedSize * factor, offset + count);
112112
var state = NativeMethods.Vectors.DuckDBListVectorReserve(Vector, vectorReservedSize);
113113

114+
if (!state.IsSuccess())
115+
{
116+
throw new DuckDBException($"Failed to reserve {vectorReservedSize} for the list vector");
117+
}
118+
114119
listItemWriter.FetchDataPointer();
115120
}
116121
}

DuckDB.NET.Test/DuckDBManagedAppenderListTests.cs

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,12 @@ public void ListValuesBool()
1414
ListValuesInternal("Bool", faker => faker.Random.Bool());
1515
}
1616

17+
[Fact]
18+
public void ListValuesString()
19+
{
20+
ListValuesInternal("Varchar", faker => faker.Random.Utf16String());
21+
}
22+
1723
[Fact]
1824
public void ListValuesSByte()
1925
{
@@ -26,26 +32,34 @@ public void ListValuesInt()
2632
ListValuesInternal("Integer", faker => faker.Random.Int());
2733
}
2834

35+
[Fact]
36+
public void ArrayValuesInt()
37+
{
38+
ListValuesInternal("Integer", faker => faker.Random.Int(), 5);
39+
}
40+
2941
[Fact]
3042
public void ListValuesLong()
3143
{
3244
ListValuesInternal("BigInt", faker => faker.Random.Long());
3345
}
3446

35-
public void ListValuesInternal<T>(string typeName, Func<Faker, T> generator)
47+
48+
public void ListValuesInternal<T>(string typeName, Func<Faker, T> generator, int? length = null)
3649
{
3750
var rows = 2000;
3851
var table = $"managedAppender{typeName}Lists";
3952

40-
Command.CommandText = $"CREATE TABLE {table} (a Integer, b {typeName}[], c {typeName}[][]);";
53+
var columnLength = length.HasValue ? length.Value.ToString() : "";
54+
Command.CommandText = $"CREATE TABLE {table} (a Integer, b {typeName}[{columnLength}], c {typeName}[][]);";
4155
Command.ExecuteNonQuery();
4256

4357
var lists = new List<List<T>>();
4458
var nestedLists = new List<List<List<T>>>();
4559

4660
for (var i = 0; i < rows; i++)
4761
{
48-
lists.Add(GetRandomList(generator, Random.Shared.Next(0, 200)));
62+
lists.Add(GetRandomList(generator, length ?? Random.Shared.Next(0, 200)));
4963

5064
var item = new List<List<T>>();
5165
nestedLists.Add(item);
@@ -78,5 +92,17 @@ public void ListValuesInternal<T>(string typeName, Func<Faker, T> generator)
7892

7993
index++;
8094
}
95+
96+
//Test for appending an array with wrong length
97+
if (length.HasValue)
98+
{
99+
var appender = Connection.CreateAppender(table);
100+
101+
appender.Invoking(app => app.CreateRow().AppendValue(0).AppendValue(GetRandomList(generator, length + 1)))
102+
.Should().Throw<InvalidOperationException>().Where(exception => exception.Message.Contains(length.ToString()));
103+
104+
appender.Invoking(app => app.CreateRow().AppendValue(0).AppendValue(GetRandomList(generator, length - 1)))
105+
.Should().Throw<InvalidOperationException>().Where(exception => exception.Message.Contains(length.ToString()));
106+
}
81107
}
82108
}

0 commit comments

Comments
 (0)