Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
48 commits
Select commit Hold shift + click to select a range
f55ce82
Add arrow support for structured types
sfc-gh-ext-simba-lf May 21, 2025
a1750f1
Merge branch 'master' of https://github.com/snowflakedb/snowflake-con…
sfc-gh-ext-simba-lf May 21, 2025
5499f89
Revert commented lines
sfc-gh-ext-simba-lf May 21, 2025
938d36a
Remove bracket
sfc-gh-ext-simba-lf May 21, 2025
3464096
Merge branch 'master' of https://github.com/snowflakedb/snowflake-con…
sfc-gh-ext-simba-lf Jun 3, 2025
ac0a7db
Fix formatting
sfc-gh-ext-simba-lf Jun 5, 2025
5add0a3
Revert "SNOW-2115047 Log http calls time (#1180)"
sfc-gh-ext-simba-lf Jun 5, 2025
d131faf
Reapply "SNOW-2115047 Log http calls time (#1180)"
sfc-gh-ext-simba-lf Jun 5, 2025
25201de
Merge branch 'master' of https://github.com/snowflakedb/snowflake-con…
sfc-gh-ext-simba-lf Jun 16, 2025
493264c
Add native arrow format result
sfc-gh-ext-simba-lf Jun 20, 2025
16247c3
Add support for native arrow formats
sfc-gh-ext-simba-lf Jun 20, 2025
79b059f
Merge branch 'master' into SNOW-1488703-Arrow-Support-For-Structured-…
sfc-gh-ext-simba-hx Jul 16, 2025
eae55dd
Merge branch 'master' of https://github.com/snowflakedb/snowflake-con…
sfc-gh-ext-simba-lf Jul 16, 2025
ac9fb99
Merge branch 'master' of https://github.com/snowflakedb/snowflake-con…
sfc-gh-ext-simba-lf Jul 22, 2025
76c7f04
Use JsonSerializer to escape special characters
sfc-gh-ext-simba-lf Jul 22, 2025
8a42858
Merge branch 'SNOW-1488703-Arrow-Support-For-Structured-Types' of htt…
sfc-gh-ext-simba-lf Jul 22, 2025
10dcf1b
Add converter for native arrow array types
sfc-gh-ext-simba-lf Sep 2, 2025
0a245d3
Merge branch 'master' of https://github.com/snowflakedb/snowflake-con…
sfc-gh-ext-simba-lf Sep 8, 2025
d1da946
Modify test to compare GetString result from arrow and json
sfc-gh-ext-simba-lf Sep 10, 2025
4eae30c
Use converter that supports .NET Framework
sfc-gh-ext-simba-lf Sep 17, 2025
43c012c
Merge branch 'master' of https://github.com/snowflakedb/snowflake-con…
sfc-gh-ext-simba-lf Oct 7, 2025
85c7a10
Add case for boolean
sfc-gh-ext-simba-lf Oct 17, 2025
8517d9e
Merge branch 'master' of https://github.com/snowflakedb/snowflake-con…
sfc-gh-ext-simba-lf Oct 21, 2025
4322592
Update CHANGELOG.md
sfc-gh-ext-simba-lf Oct 31, 2025
29bdea5
Add other cases
sfc-gh-ext-simba-lf Oct 31, 2025
4563a00
Merge branch 'master' into SNOW-1488703-Arrow-Support-For-Structured-…
sfc-gh-ext-simba-lf Oct 31, 2025
7093415
Refactor to switch case
sfc-gh-ext-simba-lf Nov 3, 2025
56d0410
Refactor to switch case
sfc-gh-ext-simba-lf Nov 3, 2025
673ec13
Refactor function
sfc-gh-ext-simba-lf Nov 3, 2025
4acdec4
Refactor to switch case
sfc-gh-ext-simba-lf Nov 3, 2025
74c0ac5
Move if check outside the for loop
sfc-gh-ext-simba-lf Nov 4, 2025
a843589
Merge branch 'master' into SNOW-1488703-Arrow-Support-For-Structured-…
sfc-gh-ext-simba-lf Nov 4, 2025
ef3179f
Fix indentation
sfc-gh-ext-simba-lf Nov 4, 2025
87c1457
Merge branch 'SNOW-1488703-Arrow-Support-For-Structured-Types' of htt…
sfc-gh-ext-simba-lf Nov 4, 2025
22140ec
Add type validation
sfc-gh-ext-simba-lf Nov 5, 2025
98cfe02
Check if type has more than 2 arguments
sfc-gh-ext-simba-lf Nov 5, 2025
b6c9959
Revert type check
sfc-gh-ext-simba-lf Nov 5, 2025
7a90867
Re-add type check
sfc-gh-ext-simba-lf Nov 5, 2025
1123430
Use ObjectBuilder to get properties
sfc-gh-ext-simba-lf Nov 6, 2025
7433fbe
Revert last and use FirstOrDefault to get custom attributes
sfc-gh-ext-simba-lf Nov 6, 2025
47acd9a
Fix if check
sfc-gh-ext-simba-lf Nov 6, 2025
2b5cdb4
Get properties in order of metadata
sfc-gh-ext-simba-lf Nov 7, 2025
461c1f9
Fix whitespace
sfc-gh-ext-simba-lf Nov 7, 2025
165c28b
Merge branch 'master' of https://github.com/snowflakedb/snowflake-con…
sfc-gh-ext-simba-lf Nov 7, 2025
888c1f3
Remove unsupported case of structured types
sfc-gh-ext-simba-lf Nov 12, 2025
b775286
Fix getting value from Date32Array
sfc-gh-ext-simba-lf Nov 12, 2025
4909f52
Add tests for more array types
sfc-gh-ext-simba-lf Nov 12, 2025
d9521a2
Merge branch 'master' into SNOW-1488703-Arrow-Support-For-Structured-…
sfc-gh-ext-simba-lf Nov 14, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
- v5.1.0
- Added `APPLICATION_PATH` to `CLIENT_ENVIRONMENT` sent during authentication to identify the application connecting to Snowflake.
- Renew idle sessions in the pool if keep alive is enabled.
- Added support for native arrow structured types.
- Added `CRLDOWNLOADMAXSIZE` connection parameter to limit the maximum size of CRL files downloaded during certificate revocation checks.
- AWS WIF will now also check the application config and AWS profile credential store when determining the current AWS region
- Allow users to configure the maximum amount of connections via `SERVICE_POINT_CONNECTION_LIMIT` property.
Expand Down
159 changes: 137 additions & 22 deletions Snowflake.Data.Tests/IntegrationTests/StructuredArraysIT.cs

Large diffs are not rendered by default.

57 changes: 43 additions & 14 deletions Snowflake.Data.Tests/IntegrationTests/StructuredMapsIT.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using System.Data;
using Newtonsoft.Json.Linq;
using NUnit.Framework;
using Snowflake.Data.Client;
using Snowflake.Data.Core;
Expand All @@ -9,19 +10,33 @@

namespace Snowflake.Data.Tests.IntegrationTests
{
[TestFixture]
[TestFixture(ResultFormat.ARROW, false)]
[TestFixture(ResultFormat.ARROW, true)]
[TestFixture(ResultFormat.JSON, false)]
public class StructuredMapsIT : StructuredTypesIT
{
private readonly ResultFormat _resultFormat;
private readonly bool _nativeArrow;

public StructuredMapsIT(ResultFormat resultFormat, bool nativeArrow)
{
_resultFormat = resultFormat;
_nativeArrow = nativeArrow;
}

[Test]
public void TestDataTableLoadOnStructuredMap()
{
if (_resultFormat != ResultFormat.JSON)
Assert.Ignore("skip test on arrow");

// arrange
using (var connection = new SnowflakeDbConnection(ConnectionString))
{
connection.Open();
using (var command = connection.CreateCommand())
{
EnableStructuredTypes(connection);
EnableStructuredTypes(connection, _resultFormat, _nativeArrow);
var key = "city";
var value = "San Mateo";
var addressAsSFString = $"OBJECT_CONSTRUCT('{key}','{value}')::MAP(VARCHAR, VARCHAR)";
Expand Down Expand Up @@ -50,7 +65,7 @@ public void TestSelectMap()
connection.Open();
using (var command = connection.CreateCommand())
{
EnableStructuredTypes(connection);
EnableStructuredTypes(connection, _resultFormat, _nativeArrow);
var addressAsSFString = "OBJECT_CONSTRUCT('city','San Mateo', 'state', 'CA', 'zip', '01-234')::MAP(VARCHAR, VARCHAR)";
command.CommandText = $"SELECT {addressAsSFString}";
var reader = (SnowflakeDbDataReader)command.ExecuteReader();
Expand All @@ -65,6 +80,17 @@ public void TestSelectMap()
Assert.AreEqual("San Mateo", map["city"]);
Assert.AreEqual("CA", map["state"]);
Assert.AreEqual("01-234", map["zip"]);

if (_nativeArrow)
{
var arrowString = reader.GetString(0);
EnableStructuredTypes(connection, ResultFormat.JSON);
reader = (SnowflakeDbDataReader)command.ExecuteReader();
Assert.IsTrue(reader.Read());
var jsonString = reader.GetString(0);

Assert.IsTrue(JToken.DeepEquals(JObject.Parse(jsonString), JObject.Parse(arrowString)));
}
}
}
}
Expand All @@ -78,7 +104,7 @@ public void TestSelectMapWithIntegerKeys()
connection.Open();
using (var command = connection.CreateCommand())
{
EnableStructuredTypes(connection);
EnableStructuredTypes(connection, _resultFormat, _nativeArrow);
var mapSfString = "OBJECT_CONSTRUCT('5','San Mateo', '8', 'CA', '13', '01-234')::MAP(INTEGER, VARCHAR)";
command.CommandText = $"SELECT {mapSfString}";
var reader = (SnowflakeDbDataReader)command.ExecuteReader();
Expand Down Expand Up @@ -106,7 +132,7 @@ public void TestSelectMapWithLongKeys()
connection.Open();
using (var command = connection.CreateCommand())
{
EnableStructuredTypes(connection);
EnableStructuredTypes(connection, _resultFormat, _nativeArrow);
var mapSfString = "OBJECT_CONSTRUCT('5','San Mateo', '8', 'CA', '13', '01-234')::MAP(INTEGER, VARCHAR)";
command.CommandText = $"SELECT {mapSfString}";
var reader = (SnowflakeDbDataReader)command.ExecuteReader();
Expand Down Expand Up @@ -134,7 +160,7 @@ public void TestSelectMapOfObjects()
connection.Open();
using (var command = connection.CreateCommand())
{
EnableStructuredTypes(connection);
EnableStructuredTypes(connection, _resultFormat, _nativeArrow);
var mapWitObjectValueSFString = @"OBJECT_CONSTRUCT(
'Warsaw', OBJECT_CONSTRUCT('prefix', '01', 'postfix', '234'),
'San Mateo', OBJECT_CONSTRUCT('prefix', '02', 'postfix', '567')
Expand Down Expand Up @@ -164,7 +190,7 @@ public void TestSelectMapOfArrays()
connection.Open();
using (var command = connection.CreateCommand())
{
EnableStructuredTypes(connection);
EnableStructuredTypes(connection, _resultFormat, _nativeArrow);
var mapWithArrayValueSFString = "OBJECT_CONSTRUCT('a', ARRAY_CONSTRUCT('b', 'c'))::MAP(VARCHAR, ARRAY(TEXT))";
command.CommandText = $"SELECT {mapWithArrayValueSFString}";
var reader = (SnowflakeDbDataReader)command.ExecuteReader();
Expand All @@ -190,7 +216,7 @@ public void TestSelectMapOfLists()
connection.Open();
using (var command = connection.CreateCommand())
{
EnableStructuredTypes(connection);
EnableStructuredTypes(connection, _resultFormat, _nativeArrow);
var mapWithArrayValueSFString = "OBJECT_CONSTRUCT('a', ARRAY_CONSTRUCT('b', 'c'))::MAP(VARCHAR, ARRAY(TEXT))";
command.CommandText = $"SELECT {mapWithArrayValueSFString}";
var reader = (SnowflakeDbDataReader)command.ExecuteReader();
Expand All @@ -216,7 +242,7 @@ public void TestSelectMapOfMaps()
connection.Open();
using (var command = connection.CreateCommand())
{
EnableStructuredTypes(connection);
EnableStructuredTypes(connection, _resultFormat, _nativeArrow);
var mapAsSFString = "OBJECT_CONSTRUCT('a', OBJECT_CONSTRUCT('b', 'c'))::MAP(TEXT, MAP(TEXT, TEXT))";
command.CommandText = $"SELECT {mapAsSFString}";
var reader = (SnowflakeDbDataReader)command.ExecuteReader();
Expand Down Expand Up @@ -246,7 +272,7 @@ public void TestSelectSemiStructuredTypesInMap(string valueSfString, string expe
connection.Open();
using (var command = connection.CreateCommand())
{
EnableStructuredTypes(connection);
EnableStructuredTypes(connection, _resultFormat, _nativeArrow);
command.CommandText = $"SELECT {valueSfString}";
var reader = (SnowflakeDbDataReader)command.ExecuteReader();
Assert.IsTrue(reader.Read());
Expand All @@ -271,7 +297,7 @@ public void TestSelectNullMap()
connection.Open();
using (var command = connection.CreateCommand())
{
EnableStructuredTypes(connection);
EnableStructuredTypes(connection, _resultFormat, _nativeArrow);
var nullMapSFString = "NULL::MAP(TEXT,TEXT)";
command.CommandText = $"SELECT {nullMapSFString}";
var reader = (SnowflakeDbDataReader)command.ExecuteReader();
Expand All @@ -295,7 +321,7 @@ public void TestThrowExceptionForInvalidMap()
connection.Open();
using (var command = connection.CreateCommand())
{
EnableStructuredTypes(connection);
EnableStructuredTypes(connection, _resultFormat, _nativeArrow);
var invalidMapSFString = "OBJECT_CONSTRUCT('x', 'y')::OBJECT";
command.CommandText = $"SELECT {invalidMapSFString}";
var reader = (SnowflakeDbDataReader)command.ExecuteReader();
Expand All @@ -321,7 +347,7 @@ public void TestThrowExceptionForInvalidMapElement()
connection.Open();
using (var command = connection.CreateCommand())
{
EnableStructuredTypes(connection);
EnableStructuredTypes(connection, _resultFormat, _nativeArrow);
var invalidMapSFString = @"OBJECT_CONSTRUCT(
'x', 'a76dacad-0e35-497b-bf9b-7cd49262b68b',
'y', 'z76dacad-0e35-497b-bf9b-7cd49262b68b'
Expand All @@ -335,7 +361,10 @@ public void TestThrowExceptionForInvalidMapElement()

// assert
SnowflakeDbExceptionAssert.HasErrorCode(thrown, SFError.STRUCTURED_TYPE_READ_ERROR);
Assert.That(thrown.Message, Does.Contain("Failed to read structured type when reading path $[1]"));
if (_resultFormat == ResultFormat.JSON || !_nativeArrow)
Assert.That(thrown.Message, Does.Contain("Failed to read structured type when reading path $[1]"));
else
Assert.That(thrown.Message, Does.Contain("Failed to read structured type when getting a map."));
}
}
}
Expand Down
Loading
Loading