Skip to content

Commit 664159e

Browse files
committed
Update changelog
1 parent 48c1254 commit 664159e

File tree

2 files changed

+57
-75
lines changed

2 files changed

+57
-75
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
# Changelog
44
- v5.1.1
55
- Fixed CRL validation to reject newly downloaded CRLs if their NextUpdate has already expired.
6+
- Fixed TIMESTAMP_LTZ datatype to honor session TIMEZONE parameter (ALTER SESSION SET TIMEZONE) instead of using local machine timezone.
67
- v5.1.0
78
- Added `APPLICATION_PATH` to `CLIENT_ENVIRONMENT` sent during authentication to identify the application connecting to Snowflake.
89
- Renew idle sessions in the pool if keep alive is enabled.

Snowflake.Data.Tests/IntegrationTests/SFDbDataReaderIT.cs

Lines changed: 56 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -1672,59 +1672,49 @@ public void TestTimestampLtzHonorsSessionTimezone()
16721672
{
16731673
using (var conn = CreateAndOpenConnection())
16741674
{
1675+
CreateOrReplaceTable(conn, "test_timestamp_ltz_timezone", new[] { "val TIMESTAMP_LTZ" });
1676+
16751677
using (var cmd = conn.CreateCommand())
16761678
{
1677-
cmd.CommandText = "CREATE OR REPLACE TABLE test_timestamp_ltz_timezone (val TIMESTAMP_LTZ)";
1679+
cmd.CommandText = "ALTER SESSION SET TIMEZONE = 'Europe/Warsaw'";
16781680
cmd.ExecuteNonQuery();
16791681

1680-
try
1681-
{
1682-
cmd.CommandText = "ALTER SESSION SET TIMEZONE = 'Europe/Warsaw'";
1683-
cmd.ExecuteNonQuery();
1684-
1685-
cmd.CommandText = "INSERT INTO test_timestamp_ltz_timezone VALUES('2023-08-09 10:00:00')";
1686-
cmd.ExecuteNonQuery();
1682+
cmd.CommandText = "INSERT INTO test_timestamp_ltz_timezone VALUES('2023-08-09 10:00:00')";
1683+
cmd.ExecuteNonQuery();
16871684

1688-
cmd.CommandText = "SELECT * FROM test_timestamp_ltz_timezone";
1689-
using (var reader = cmd.ExecuteReader())
1690-
{
1691-
Assert.IsTrue(reader.Read(), "Should read a record");
1692-
var timestamp1 = reader.GetDateTime(0);
1685+
cmd.CommandText = "SELECT * FROM test_timestamp_ltz_timezone";
1686+
using (var reader = cmd.ExecuteReader())
1687+
{
1688+
Assert.IsTrue(reader.Read(), "Should read a record");
1689+
var timestamp1 = reader.GetDateTime(0);
16931690

1694-
var warsawTz = TimeZoneConverter.TZConvert.GetTimeZoneInfo("Europe/Warsaw");
1695-
var expectedTime1 = new DateTime(2023, 8, 9, 10, 0, 0, DateTimeKind.Unspecified);
1696-
var expectedUtc1 = TimeZoneInfo.ConvertTimeToUtc(expectedTime1, warsawTz);
1697-
var expectedInWarsaw = TimeZoneInfo.ConvertTimeFromUtc(expectedUtc1, warsawTz);
1691+
var warsawTz = TimeZoneConverter.TZConvert.GetTimeZoneInfo("Europe/Warsaw");
1692+
var expectedTime1 = new DateTime(2023, 8, 9, 10, 0, 0, DateTimeKind.Unspecified);
1693+
var expectedUtc1 = TimeZoneInfo.ConvertTimeToUtc(expectedTime1, warsawTz);
1694+
var expectedInWarsaw = TimeZoneInfo.ConvertTimeFromUtc(expectedUtc1, warsawTz);
16981695

1699-
Assert.AreEqual(expectedInWarsaw, timestamp1,
1700-
$"Timestamp should be returned in Warsaw timezone. Expected: {expectedInWarsaw}, Got: {timestamp1}");
1701-
}
1696+
Assert.AreEqual(expectedInWarsaw, timestamp1,
1697+
$"Timestamp should be returned in Warsaw timezone. Expected: {expectedInWarsaw}, Got: {timestamp1}");
1698+
}
17021699

1703-
cmd.CommandText = "ALTER SESSION SET TIMEZONE = 'Pacific/Honolulu'";
1704-
cmd.ExecuteNonQuery();
1700+
cmd.CommandText = "ALTER SESSION SET TIMEZONE = 'Pacific/Honolulu'";
1701+
cmd.ExecuteNonQuery();
17051702

1706-
cmd.CommandText = "SELECT * FROM test_timestamp_ltz_timezone";
1707-
using (var reader = cmd.ExecuteReader())
1708-
{
1709-
Assert.IsTrue(reader.Read(), "Should read a record");
1710-
var timestamp2 = reader.GetDateTime(0);
1703+
cmd.CommandText = "SELECT * FROM test_timestamp_ltz_timezone";
1704+
using (var reader = cmd.ExecuteReader())
1705+
{
1706+
Assert.IsTrue(reader.Read(), "Should read a record");
1707+
var timestamp2 = reader.GetDateTime(0);
17111708

1712-
var honoluluTz = TimeZoneConverter.TZConvert.GetTimeZoneInfo("Pacific/Honolulu");
1713-
var warsawTz = TimeZoneConverter.TZConvert.GetTimeZoneInfo("Europe/Warsaw");
1709+
var honoluluTz = TimeZoneConverter.TZConvert.GetTimeZoneInfo("Pacific/Honolulu");
1710+
var warsawTz = TimeZoneConverter.TZConvert.GetTimeZoneInfo("Europe/Warsaw");
17141711

1715-
var originalTimeInWarsaw = new DateTime(2023, 8, 9, 10, 0, 0, DateTimeKind.Unspecified);
1716-
var utcTime = TimeZoneInfo.ConvertTimeToUtc(originalTimeInWarsaw, warsawTz);
1717-
var expectedInHonolulu = TimeZoneInfo.ConvertTimeFromUtc(utcTime, honoluluTz);
1712+
var originalTimeInWarsaw = new DateTime(2023, 8, 9, 10, 0, 0, DateTimeKind.Unspecified);
1713+
var utcTime = TimeZoneInfo.ConvertTimeToUtc(originalTimeInWarsaw, warsawTz);
1714+
var expectedInHonolulu = TimeZoneInfo.ConvertTimeFromUtc(utcTime, honoluluTz);
17181715

1719-
Assert.AreEqual(expectedInHonolulu, timestamp2,
1720-
$"Timestamp should be returned in Honolulu timezone. Expected: {expectedInHonolulu}, Got: {timestamp2}");
1721-
}
1722-
}
1723-
finally
1724-
{
1725-
// Cleanup
1726-
cmd.CommandText = "DROP TABLE IF EXISTS test_timestamp_ltz_timezone";
1727-
cmd.ExecuteNonQuery();
1716+
Assert.AreEqual(expectedInHonolulu, timestamp2,
1717+
$"Timestamp should be returned in Honolulu timezone. Expected: {expectedInHonolulu}, Got: {timestamp2}");
17281718
}
17291719
}
17301720

@@ -1737,53 +1727,44 @@ public void TestTimestampLtzWithMultipleSessionTimezones()
17371727
{
17381728
using (var conn = CreateAndOpenConnection())
17391729
{
1730+
CreateOrReplaceTable(conn, "test_ltz_multi_tz", new[] { "val TIMESTAMP_LTZ" });
1731+
17401732
using (var cmd = conn.CreateCommand())
17411733
{
1742-
cmd.CommandText = "CREATE OR REPLACE TABLE test_ltz_multi_tz (val TIMESTAMP_LTZ)";
1734+
cmd.CommandText = "ALTER SESSION SET TIMEZONE = 'UTC'";
17431735
cmd.ExecuteNonQuery();
17441736

1745-
try
1746-
{
1747-
cmd.CommandText = "ALTER SESSION SET TIMEZONE = 'UTC'";
1748-
cmd.ExecuteNonQuery();
1737+
cmd.CommandText = "INSERT INTO test_ltz_multi_tz VALUES('2024-01-01 00:00:00')";
1738+
cmd.ExecuteNonQuery();
17491739

1750-
cmd.CommandText = "INSERT INTO test_ltz_multi_tz VALUES('2024-01-01 00:00:00')";
1751-
cmd.ExecuteNonQuery();
1740+
var utcBase = new DateTime(2024, 1, 1, 0, 0, 0, DateTimeKind.Utc);
17521741

1753-
var utcBase = new DateTime(2024, 1, 1, 0, 0, 0, DateTimeKind.Utc);
1742+
// Test reading with different timezones
1743+
var timezones = new[]
1744+
{
1745+
"Europe/Warsaw",
1746+
"Asia/Tokyo",
1747+
"America/Los_Angeles"
1748+
};
17541749

1755-
// Test reading with different timezones
1756-
var timezones = new[]
1757-
{
1758-
"Europe/Warsaw",
1759-
"Asia/Tokyo",
1760-
"America/Los_Angeles"
1761-
};
1750+
foreach (var tzName in timezones)
1751+
{
1752+
cmd.CommandText = $"ALTER SESSION SET TIMEZONE = '{tzName}'";
1753+
cmd.ExecuteNonQuery();
17621754

1763-
foreach (var tzName in timezones)
1755+
cmd.CommandText = "SELECT val FROM test_ltz_multi_tz";
1756+
using (var reader = cmd.ExecuteReader())
17641757
{
1765-
cmd.CommandText = $"ALTER SESSION SET TIMEZONE = '{tzName}'";
1766-
cmd.ExecuteNonQuery();
1758+
Assert.IsTrue(reader.Read());
1759+
var timestamp = reader.GetDateTime(0);
17671760

1768-
cmd.CommandText = "SELECT val FROM test_ltz_multi_tz";
1769-
using (var reader = cmd.ExecuteReader())
1770-
{
1771-
Assert.IsTrue(reader.Read());
1772-
var timestamp = reader.GetDateTime(0);
1761+
var tz = TimeZoneConverter.TZConvert.GetTimeZoneInfo(tzName);
1762+
var expected = TimeZoneInfo.ConvertTimeFromUtc(utcBase, tz);
17731763

1774-
var tz = TimeZoneConverter.TZConvert.GetTimeZoneInfo(tzName);
1775-
var expected = TimeZoneInfo.ConvertTimeFromUtc(utcBase, tz);
1776-
1777-
Assert.AreEqual(expected, timestamp,
1778-
$"TIMESTAMP_LTZ should be in {tzName} timezone");
1779-
}
1764+
Assert.AreEqual(expected, timestamp,
1765+
$"TIMESTAMP_LTZ should be in {tzName} timezone");
17801766
}
17811767
}
1782-
finally
1783-
{
1784-
cmd.CommandText = "DROP TABLE IF EXISTS test_ltz_multi_tz";
1785-
cmd.ExecuteNonQuery();
1786-
}
17871768
}
17881769

17891770
CloseConnection(conn);

0 commit comments

Comments
 (0)