Skip to content

Commit e1b6cd4

Browse files
authored
Add correct code page for Kazakh collation (#584)
1 parent 1be606c commit e1b6cd4

File tree

3 files changed

+61
-0
lines changed

3 files changed

+61
-0
lines changed

src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/TdsParser.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4268,6 +4268,9 @@ internal int GetCodePage(SqlCollation collation, TdsParserStateObject stateObj)
42684268
{
42694269
}
42704270
break;
4271+
case 0x43f:
4272+
codePage = 1251; // Kazakh code page based on SQL Server
4273+
break;
42714274
default:
42724275
break;
42734276
}

src/Microsoft.Data.SqlClient/netfx/src/Microsoft/Data/SqlClient/TdsParser.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4730,6 +4730,9 @@ internal int GetCodePage(SqlCollation collation, TdsParserStateObject stateObj)
47304730
ADP.TraceExceptionWithoutRethrow(e);
47314731
}
47324732
break;
4733+
case 0x43f:
4734+
codePage = 1251; // Kazakh code page based on SQL Server
4735+
break;
47334736
default:
47344737
break;
47354738
}

src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/DataReaderTest/DataReaderTest.cs

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
using System.Collections.Generic;
66
using System.Data;
77
using System.Text;
8+
using System.Threading;
89
using Xunit;
910

1011
namespace Microsoft.Data.SqlClient.ManualTesting.Tests
@@ -145,6 +146,60 @@ public static void CheckSparseColumnBit()
145146
}
146147
}
147148

149+
[ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup), nameof(DataTestUtility.IsNotAzureServer))]
150+
public static void CollatedDataReaderTest()
151+
{
152+
var databaseName = DataTestUtility.GetUniqueName("DB");
153+
// Remove square brackets
154+
var dbName = databaseName.Substring(1, databaseName.Length - 2);
155+
156+
SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(DataTestUtility.TCPConnectionString)
157+
{
158+
InitialCatalog = dbName,
159+
Pooling = false
160+
};
161+
162+
using (SqlConnection con = new SqlConnection(DataTestUtility.TCPConnectionString))
163+
using (SqlCommand cmd = con.CreateCommand())
164+
{
165+
try
166+
{
167+
con.Open();
168+
169+
// Create collated database
170+
cmd.CommandText = $"CREATE DATABASE {databaseName} COLLATE KAZAKH_90_CI_AI";
171+
cmd.ExecuteNonQuery();
172+
173+
//Create connection without pooling in order to delete database later.
174+
using (SqlConnection dbCon = new SqlConnection(builder.ConnectionString))
175+
using (SqlCommand dbCmd = dbCon.CreateCommand())
176+
{
177+
var data = "TestData";
178+
179+
dbCon.Open();
180+
dbCmd.CommandText = $"SELECT '{data}'";
181+
using (SqlDataReader reader = dbCmd.ExecuteReader())
182+
{
183+
reader.Read();
184+
Assert.Equal(data, reader.GetString(0));
185+
}
186+
}
187+
188+
// Let connection close safely before dropping database for slow servers.
189+
Thread.Sleep(500);
190+
}
191+
catch (SqlException e)
192+
{
193+
Assert.True(false, $"Unexpected Exception occurred: {e.Message}");
194+
}
195+
finally
196+
{
197+
cmd.CommandText = $"DROP DATABASE {databaseName}";
198+
cmd.ExecuteNonQuery();
199+
}
200+
}
201+
}
202+
148203
private static bool IsColumnBitSet(SqlConnection con, string selectQuery, int indexOfColumnSet)
149204
{
150205
bool columnSetPresent = false;

0 commit comments

Comments
 (0)