From 6e1ff6244d516b2a17229450a4205f005d938e01 Mon Sep 17 00:00:00 2001 From: Wraith2 Date: Sun, 15 Jun 2025 23:48:15 +0100 Subject: [PATCH 1/4] change TryReadString to use TryReadBytesWithContinue --- .../src/Microsoft/Data/SqlClient/TdsParser.cs | 44 +----------- .../src/Microsoft/Data/SqlClient/TdsParser.cs | 44 +----------- .../Data/SqlClient/TdsParserStateObject.cs | 52 +++++++++++--- .../SQL/DataReaderTest/DataReaderTest.cs | 70 +++++++++++++++++++ 4 files changed, 115 insertions(+), 95 deletions(-) diff --git a/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/TdsParser.cs b/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/TdsParser.cs index 5320d1e51f..7eaee4e150 100644 --- a/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/TdsParser.cs +++ b/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/TdsParser.cs @@ -6374,7 +6374,7 @@ internal TdsOperationStatus TryReadSqlValue(SqlBuffer value, } else { - result = TryReadByteArrayWithContinue(stateObj, length, out b); + result = stateObj.TryReadByteArrayWithContinue(length, out b); if (result != TdsOperationStatus.Done) { return result; @@ -6495,48 +6495,6 @@ internal TdsOperationStatus TryReadSqlValue(SqlBuffer value, return TdsOperationStatus.Done; } - private TdsOperationStatus TryReadByteArrayWithContinue(TdsParserStateObject stateObj, int length, out byte[] bytes) - { - bytes = null; - int offset = 0; - byte[] temp = null; - (bool canContinue, bool isStarting, bool isContinuing) = stateObj.GetSnapshotStatuses(); - if (canContinue) - { - if (isContinuing || isStarting) - { - temp = stateObj.TryTakeSnapshotStorage() as byte[]; - Debug.Assert(bytes == null || bytes.Length == length, "stored buffer length must be null or must have been created with the correct length"); - } - if (temp != null) - { - offset = stateObj.GetSnapshotTotalSize(); - } - } - - - if (temp == null) - { - temp = new byte[length]; - } - - TdsOperationStatus result = stateObj.TryReadByteArray(temp, length, out _, offset, isStarting || isContinuing); - - if (result == TdsOperationStatus.Done) - { - bytes = temp; - } - else if (result == TdsOperationStatus.NeedMoreData) - { - if (isStarting || isContinuing) - { - stateObj.SetSnapshotStorage(temp); - } - } - - return result; - } - private TdsOperationStatus TryReadSqlDateTime(SqlBuffer value, byte tdsType, int length, byte scale, TdsParserStateObject stateObj) { Span datetimeBuffer = ((uint)length <= 16) ? stackalloc byte[16] : new byte[length]; diff --git a/src/Microsoft.Data.SqlClient/netfx/src/Microsoft/Data/SqlClient/TdsParser.cs b/src/Microsoft.Data.SqlClient/netfx/src/Microsoft/Data/SqlClient/TdsParser.cs index 46f5748dc9..08b5bfc625 100644 --- a/src/Microsoft.Data.SqlClient/netfx/src/Microsoft/Data/SqlClient/TdsParser.cs +++ b/src/Microsoft.Data.SqlClient/netfx/src/Microsoft/Data/SqlClient/TdsParser.cs @@ -6570,7 +6570,7 @@ internal TdsOperationStatus TryReadSqlValue(SqlBuffer value, } else { - result = TryReadByteArrayWithContinue(stateObj, length, out b); + result = stateObj.TryReadByteArrayWithContinue(length, out b); if (result != TdsOperationStatus.Done) { return result; @@ -6691,48 +6691,6 @@ internal TdsOperationStatus TryReadSqlValue(SqlBuffer value, return TdsOperationStatus.Done; } - private TdsOperationStatus TryReadByteArrayWithContinue(TdsParserStateObject stateObj, int length, out byte[] bytes) - { - bytes = null; - int offset = 0; - byte[] temp = null; - (bool canContinue, bool isStarting, bool isContinuing) = stateObj.GetSnapshotStatuses(); - if (canContinue) - { - if (isContinuing || isStarting) - { - temp = stateObj.TryTakeSnapshotStorage() as byte[]; - Debug.Assert(bytes == null || bytes.Length == length, "stored buffer length must be null or must have been created with the correct length"); - } - if (temp != null) - { - offset = stateObj.GetSnapshotTotalSize(); - } - } - - - if (temp == null) - { - temp = new byte[length]; - } - - TdsOperationStatus result = stateObj.TryReadByteArray(temp, length, out _, offset, isStarting || isContinuing); - - if (result == TdsOperationStatus.Done) - { - bytes = temp; - } - else if (result == TdsOperationStatus.NeedMoreData) - { - if (isStarting || isContinuing) - { - stateObj.SetSnapshotStorage(temp); - } - } - - return result; - } - private TdsOperationStatus TryReadSqlDateTime(SqlBuffer value, byte tdsType, int length, byte scale, TdsParserStateObject stateObj) { Span datetimeBuffer = ((uint)length <= 16) ? stackalloc byte[16] : new byte[length]; diff --git a/src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/TdsParserStateObject.cs b/src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/TdsParserStateObject.cs index ea3e4a9ce6..a1b820bb0d 100644 --- a/src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/TdsParserStateObject.cs +++ b/src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/TdsParserStateObject.cs @@ -1497,6 +1497,48 @@ public TdsOperationStatus TryReadByteArray(Span buff, int len, out int tot return TdsOperationStatus.Done; } + public TdsOperationStatus TryReadByteArrayWithContinue(int length, out byte[] bytes) + { + bytes = null; + int offset = 0; + byte[] temp = null; + (bool canContinue, bool isStarting, bool isContinuing) = GetSnapshotStatuses(); + if (canContinue) + { + if (isContinuing || isStarting) + { + temp = TryTakeSnapshotStorage() as byte[]; + Debug.Assert(bytes == null || bytes.Length == length, "stored buffer length must be null or must have been created with the correct length"); + } + if (temp != null) + { + offset = GetSnapshotTotalSize(); + } + } + + + if (temp == null) + { + temp = new byte[length]; + } + + TdsOperationStatus result = TryReadByteArray(temp, length, out _, offset, isStarting || isContinuing); + + if (result == TdsOperationStatus.Done) + { + bytes = temp; + } + else if (result == TdsOperationStatus.NeedMoreData) + { + if (isStarting || isContinuing) + { + SetSnapshotStorage(temp); + } + } + + return result; + } + // Takes no arguments and returns a byte from the buffer. If the buffer is empty, it is filled // before the byte is returned. internal TdsOperationStatus TryReadByte(out byte value) @@ -1843,21 +1885,13 @@ internal TdsOperationStatus TryReadString(int length, out string value) if (((_inBytesUsed + cBytes) > _inBytesRead) || (_inBytesPacket < cBytes)) { - if (_bTmp == null || _bTmp.Length < cBytes) - { - _bTmp = new byte[cBytes]; - } - - TdsOperationStatus result = TryReadByteArray(_bTmp, cBytes); + TdsOperationStatus result = TryReadByteArrayWithContinue(cBytes, out buf); if (result != TdsOperationStatus.Done) { value = null; return result; } - // assign local to point to parser scratch buffer - buf = _bTmp; - AssertValidState(); } else diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/DataReaderTest/DataReaderTest.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/DataReaderTest/DataReaderTest.cs index 4e56acf2c5..1b56d845c2 100644 --- a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/DataReaderTest/DataReaderTest.cs +++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/DataReaderTest/DataReaderTest.cs @@ -790,6 +790,76 @@ static char[] Resize(char[] buffer) } } + [ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup))] + public static async Task CanReadLargeNTextColumn() + { + string stringValue = "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NAoFbTozNjIKBm06NDkwMAoLbTo5OTk4MDMxNDQKBW06Mzk2CgZtOjQ5MzQKBG06NzUKC206OTk5ODA2MDA0CgZtOjYxNDAKBm06NjEzOQoGbTo2MTIwCgVtOjExOAoEbTo3OAoGbTo5MTIxCgZtOjYxMjEKBm06NjEyOAoGbTo2MTMwCgZtOjYxMzEKBm06NjEzMgoGbTo2MTI5CgZtOjYxMjYKBm06NjEyNAoGbTo2MTI1CgZtOjkxNTkKBm06NjEyMwoGbTo2MTIyCgZtOjYxMzMKBW06MTY2CgVtOjE2NwoFbToxNjgKBG06MTcKBm06NTEwOQoGbTo1MTE4CgZtOjUxMTAKBW06MTcxCgVtOjE3MgoGbTo2NDA0CgZtOjkwNDkKBm06OTE2NAoGbTo5MDQ3CgZtOjkxNjIKBm06OTA0OAoGbTo5MTYzCgZtOjkwNTUKBm06OTA1NgoGbTo5MDU3CgZtOjkwNTgKBm06OTA1OQoGbTo5MDYwCgZtOjkxNzQKBm06OTE3MgoGbTo5MTczCgZtOjkxMTMKCm06OTk5ODAyMjkKBW06MzEzCgZtOjQ2MTMKBm06OTEwNgoEbTo3MQoFbTo0MTkKBm06NTYzMwoFbToxMjEKBW06MjE5CgVtOjIxOAoFbToyMjEKBW06MjIwCgVtOjIyMwoFbToyMjIKBm06NDU5OQoGbTo0NTk4CgVtOjI2MAoGbTo0MTA3CgZtOjkwNTMKBW06MjYxCgZtOjQxMDgKBm06OTA1NAoGbTo0NTkzCgZtOjQ1OTIKBm06NDU5MQoGbTo0NTkwCgZtOjQ1ODkKBm06NDU4OAoGbTo0NTk1CgZtOjQ1OTQKBm06NDU5NwoGbTo0NTk2CgZtOjQzNTAKBW06MjU2CgZtOjQxMDMKBm06NDYwMQoGbTo0NjAwCgZtOjkwODcKBm06OTA4OAoFbToyOTQKBm06NDM2OQoGbTo2MTQ1CgZtOjYxNDYKBW06Mjc2CgZtOjQxMjMKBG06NzQKBG06NzMKBm06OTA1MgoGbTo5MTY3CgZtOjkwNTAKBm06OTE2NQoGbTo5MDUxCgZtOjkxNjYKBW06MTYzCgVtOjE2NAoFbToxNjUKBm06OTA2MQoGbTo5MDYyCgZtOjkwNjMKBm06OTA2NAoGbTo5MDY1CgZtOjkwNjYKBm06OTA2OQoGbTo5MDcwCgZtOjkwNDEKBm06OTA0MgoGbTo5MDQzCgZtOjkwNDQKBm06OTA0NQoGbTo5MDQ2CgZtOjYxMTkKBG06MjIKBG06MjMKBG06MjQKBm06NDM2NQoGbTo5MDgzCgZtOjQzNjYKBm06OTA4NAoKbTo5OTk4MDEzNQoFbTo0MTcKBm06NTM3NwoFbToyMDAKBG06NjkKBm06OTE2MAoGbTo5MTYxCgZtOjQ1ODYKBm06NDU4NQoGbTo2NDAyCgZtOjY0MDMKC206OTk5ODAzMTIwCgZtOjYxMzcKBW06MjAxCgVtOjIxNQoGbTo5MTU2CgZtOjkxNTUKBm06OTE1MgoGbTo5MTUxCgZtOjkxNTgKBm06OTE0OAoGbTo5MTU0CgZtOjkxNTMKBm06OTE0NwoGbTo5MTQ2CgZtOjkxNTcKBW06MTc4CgVtOjE3NwoGbTo2MTM0CgZtOjkxNTAKBm06OTE0OQoGbTo2MTM1CgZtOjYxMzYKBW06MjEwCgRtOjc2CgRtOjc3CgRtOjgyCgZtOjUwOTgKBm06NjEyNwoEbTozMgoGbTo1MzcwCgZtOjkxMzgKBm06OTE0MAoGbTo5MTM5CgZtOjUzNzMKBG06ODAKBW06NDM4CgVtOjQzNwoFbTo0MzYKBW06NDM1CgZtOjY0MDEKBm06NjQwNgoGbTo2NDA1CgZtOjkxNzcKBm06OTE3NQoGbTo5MTc2CgZtOjEwMDAKBm06MTAwMQoEbTo2NAoKbTo5OTk4MDEzNgoFbToxOTUKBW06MTE3CgttOjk5OTgwNDAwNQoFbTo0MTYKBm06NTEyNAoFbTo0MTUKBm06NTEyMwoGbTo5MTcwCgZtOjkxNjgKBm06OTE2OQoGbTo5MTcxCgZtOjY0MDcKBm06NjQwOAoFbTozMjkKBm06NDg2NwoGbTo0OTI4CgVtOjM4OQoGbTo5MTI3CgZtOjUxMDQKBW06NDE4CgZtOjUzNzgKBW06MjUxCgZtOjkwODkKBm06OTA5MAoFbToyOTYKBW06Mjk3CgVtOjI2MgoFbToyNjMKBm06OTA3MQoGbTo5MDcyCgZtOjkwOTUKBm06OTA5NgoFbTozMDIKBW06MzAzCgVtOjI2OAoFbToyNjkKBW06MjUwCgVtOjI3OAoFbToyNzkKBW06MjUzCgZtOjkwOTEKBm06OTA5MgoFbToyOTgKBW06Mjk5CgVtOjI2NAoFbToyNjUKBm06OTA3MwoGbTo5MDc0CgZtOjkwOTcKBm06OTA5OAoFbTozMDQKBW06MzA1CgVtOjI3MAoFbToyNzEKBW06MjUyCgVtOjI4MAoFbToyODEKBW06MjU1CgZtOjkwOTMKBm06OTA5NAoFbTozMDAKBW06MzAxCgVtOjI2NgoFbToyNjcKBm06OTA3NQoGbTo5MDc2CgZtOjkwOTkKBm06OTEwMAoFbTozMDYKBW06MzA3CgVtOjI3MgoFbToyNzMKBW06MjU0CgVtOjI4MgoFbToyODMKBm06NDA5OAoGbTo0MzcxCgZtOjQzNzIKBm06NDEwOQoGbTo0MTEwCgZtOjQzNzcKBm06NDM3OAoGbTo0MTE1CgZtOjQxMTYKBm06NDA5NwoGbTo0MzUzCgZtOjQzNTQKBm06NDEwMAoGbTo0MzczCgZtOjQzNzQKBm06NDExMQoGbTo0MTEyCgZtOjQzNzkKBm06NDM4MAoGbTo0MTE3CgZtOjQxMTgKBm06NDA5OQoGbTo0MzU1CgZtOjQzNTYKBm06NDEwMgoGbTo0Mzc1CgZtOjQzNzYKBm06NDExMwoGbTo0MTE0CgZtOjQzODEKBm06NDM4MgoGbTo0MTE5CgZtOjQxMjAKBm06NDEwMQoGbTo0MzU3CgZtOjQzNTgKBW06Mzc3CgZtOjQ5MTUKBm06OTE5OQoGbTo5MTk4CgVtOjQyNgoGbTo1ODk0CgVtOjQyNQoGbTo1ODkzCgVtOjEzNwoFbToxMzUKBW06MTM2CgZtOjkxMzUKBm06OTEzNAoGbTo5MTM2CgNkOjcKA2Q6NAoDZDoxCgNkOjgKA2Q6OQoDZDoyCgNkOjUKA2Q6MwoDZDo2CgRkcDoyCgVkcDozNgoFZHA6MjkKBWRwOjE3CgRkcDo4CgVkcDozMAoEZHA6NwoEZHA6MwoFZHA6MjgKBWRwOjMyCgVkcDoxMAoFZHA6MjcKBWRwOjMzCgVkcDoyMQoFZHA6MTMKBWRwOjI2CgVkcDozOAoFZHA6MTgKBWRwOjI0CgRkcDo5CgVkcDozMQoFZHA6MTYKBWRwOjExCgVkcDoxOQoFZHA6MjIKBWRwOjIzCgVkcDoyMAoFZHA6MzQKBWRwOjM1CgRkcDo2CgVkcDozNwoEZHA6NQoFZHA6MTUKBWRwOjI1CgRkcDo0CgRkcDoxCgVkcDoxMgoFZHA6MTQKBGk6MjYKBWk6MTY0CgVpOjIyMQoFaToyMjIKBGk6MTQKBWk6MTgxCgNpOjQKBGk6MTAKBGk6MTYKBWk6MTUxCgRpOjE3CgVpOjE0OQoEaTo5NAoEaTo5MwoFaToyMjUKBWk6MjE4CgVpOjIxNgoFaToyNjQKBWk6MjY1CgVpOjI1OQoFaToxODUKBGk6OTEKBGk6OTIKBGk6MjEKBWk6Mjc4CgRpOjcwCgRpOjcxCgRpOjU2CgRpOjU1CgVpOjI4MgoFaToyMDIKBWk6MjA2CgRpOjc0CgRpOjUwCgRpOjgzCgRpOjgyCgRpOjgxCgVpOjI4OQoEaTozNAoFaToyNzIKBWk6MjE3CgVpOjI0NwoFaToyNDYKBWk6MTYxCgRpOjg4CgVpOjIwNwoFaToyMDgKBGk6NDMKBGk6NjYKBWk6MjUzCgVpOjI1NAoEaToxMQoEaToxMgoEaTo5MAoEaTo1MwoEaTozOAoFaToyODEKBWk6MTc5CgVpOjE4OQoFaToyMjYKBWk6MjAxCgRpOjI0CgRpOjI1CgVpOjE1MwoDaToxCgRpOjk2CgRpOjk1CgVpOjEzMQoFaToxMzMKBWk6MTMyCgVpOjE5NQoFaToyNTgKBGk6MzAKBGk6NzcKBGk6MzUKBGk6MjcKBGk6NDkKBGk6MzkKBWk6MjYzCgRpOjQ1CgRpOjQ2CgRpOjQ0CgVpOjI4NQoFaToyODQKBWk6MTQyCgVpOjE0NQoFaToxNTIKBWk6MTY2CgVpOjE2NQoFaToxNTgKBWk6MTYzCgVpOjE0NAoFaToxNDMKBWk6MjczCgVpOjI3NAoFaToyNzUKBWk6MjQyCgVpOjEwMwoFaToxNzIKBWk6MTcxCgVpOjI3MQoFaToxMDAKBWk6MTAxCgRpOjk4CgRpOjk5CgRpOjg3CgVpOjEyOAoFaToxMTAKBWk6MTA5CgVpOjEwNgoFaToxMjMKBWk6MTI3CgVpOjExMgoFaToxMDgKBWk6MTExCgVpOjExNgoFaToxMTUKBWk6MTI5CgVpOjEwNwoFaToxMTkKBWk6MTEzCgVpOjExNAoFaToxMTcKBWk6MTIwCgVpOjExOAoFaToxMjEKBWk6MTIyCgVpOjEyNgoFaToxMjQKBWk6MTI1CgRpOjc1CgVpOjI2OAoFaToyNjkKBWk6MTU5CgVpOjI2NgoFaToyNzAKBWk6MTY4CgRpOjEzCgVpOjE1MAoFaToxNjcKBWk6MjU3CgVpOjIxOQoEaTo2MAoEaTo1OQoFaToxMzcKBWk6MTM4CgVpOjIyNwoDaTo5CgVpOjI0MwoEaTo2NQoFaToyMjMKBWk6MjI0CgRpOjY4CgRpOjY0CgVpOjE2MAoFaToyMDMKBGk6ODAKBWk6MTk3CgVpOjE4MgoEaToyOAoEaTo3OQoEaTo4NQoFaToyNjcKBGk6NTEKBGk6NzMKBGk6NzgKBGk6ODQKBGk6ODkKBWk6MTM0CgVpOjE3MwoFaToxMDQKA2k6NwoEaToyMgoEaTo1MgoFaToxNDYKBWk6MTk0CgRpOjM2CgRpOjQwCgVpOjE2MgoFaToyNDUKBWk6MTk5CgRpOjY5CgRpOjY3CgVpOjE1NAoFaToxNzYKBWk6MjIwCgVpOjIzMwoFaToxNTYKBWk6MTkzCgRpOjg2CgVpOjE5OAoFaToyNzcKBWk6MjA5CgVpOjIxMAoFaToyMzIKBWk6MjE1CgRpOjYyCgRpOjMyCgVpOjE3MAoFaToxNTcKBWk6MjUyCgRpOjU0CgRpOjQxCgVpOjE1NQoFaToyNzkKBWk6MTY5CgVpOjE0NwoFaToxNDgKBGk6MzcKBGk6MjkKBWk6MTc4CgVpOjE3NwoFaToyMTMKBGk6MzMKBWk6MjgzCgVpOjE3NQoEaTo1OAoEaToyMAoEaTo2MwoEaToxNQoDaTozCgVpOjIwMAoDaToyCgVpOjI2MQoFaToyODYKBWk6MTM1CgVpOjEzNgoFaToyNzYKBGk6NDcKA2k6OAoEaTo5NwoFaToyODgKBWk6MTM5CgVpOjI4NwoFaToxOTAKBWk6MTkyCgVpOjE5MQoEaToxOAoEaTo3NgoFaToxMzAKBWk6MjA0CgVpOjI2MAoFaToyMzEKBWk6MjE0CgRpOjYxCgVpOjE0MQoFaToyODAKBWk6MjI4CgVpOjIyOQoFaToyMzQKBWk6MjM1CgVpOjI1MAoFaToyNTEKBWk6MTg2CgVpOjE4OAoFaToxODcKBWk6MjMwCgRpOjQyCgVpOjE5NgoFaToyNDAKBWk6MjM5CgVpOjE0MAoEaToyMwoFaToyNDEKBWk6MTc0CgRpOjcyCgVpOjIwNQoFaToyNTYKBWk6MjU1CgRpOjE5CgRpOjQ4CgNpOjYKBWk6MTAyCgVpOjIxMQoFaToyMTIKBGk6NTcKBWk6MjYyCgVpOjI0NAoFaToyMzYKBWk6MjM3CgVpOjIzOAoDaTo1CgVpOjEwNQoFaToyNDgKBWk6MjQ5CgVpOjE4MwoFaToxODQKBGk6MzEKBWk6MTgwCgN0OjMKBHQ6MTEKBHQ6MTAKBHQ6MjEKA3Q6NAoDdDo2CgN0OjkKA3Q6NwoDdDo4CgR0OjEzCgR0OjE4CgR0OjEyCgR0OjE5CgR0OjE3CgN0OjUKBHQ6MTUKA3Q6MQoEdDoyMAoDdDoyCgR0OjE2CgR0OjE0"; + + using (var cn = new Microsoft.Data.SqlClient.SqlConnection(DataTestUtility.TCPConnectionString)) + { + await cn.OpenAsync(); + + using (var cmd = cn.CreateCommand()) + { + cmd.CommandText = $""" + if exists (select * + from sysobjects + where name = 'Expl_User_Global_Sets_' + and xtype = 'U') + + begin + drop table dbo.Expl_User_Global_Sets_ + end + + create table dbo.Expl_User_Global_Sets_ + ( + User_ID varchar(22) not null, + StringName varchar(255) not null, + IsGlobal bit not null, + List ntext, + UseProtoSerializer bit, + ModuleNameForUse tinyint, + IsReadOnly bit not null, + VersionNumber smallint not null, + UserGlobalSet_ID uniqueidentifier not null, + IsProtoCorrected bit default 1 + ) + + insert into dbo.Expl_User_Global_Sets_(User_ID, StringName, IsGlobal, List, UseProtoSerializer, ModuleNameForUse, + IsReadOnly, VersionNumber, UserGlobalSet_ID, IsProtoCorrected) + values ('80004Q4WZ1350KO8NT59RM', '_', 1, '{stringValue}', 1, 2, 1, 1, newid(), 1); + + """; + + await cmd.ExecuteNonQueryAsync(); + + cmd.CommandText = $"""" + SELECT + --[gs].[UserGlobalSet_ID], + --[gs].[User_ID], + --[gs].[StringName], + --[gs].[IsGlobal], + [gs].[List], + [gs].[UseProtoSerializer]--, + --[gs].[ModuleNameForUse], + --[gs].[IsReadOnly], + --[gs].[VersionNumber], + --[gs].[IsProtoCorrected] + FROM + [dbo].[Expl_User_Global_Sets_] [gs] + WHERE + ([gs].[IsGlobal] = 1 OR [gs].[User_ID] = '{"80004Q4WZ1350KO8NT59RM"}') AND + ([gs].[ModuleNameForUse] IS NULL OR [gs].[ModuleNameForUse] = {2}) + + """"; + + var l = (string)await cmd.ExecuteScalarAsync(); + Assert.Equal(stringValue, l); + + } + } + } + // Synapse: Cannot find data type 'rowversion'. [ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup), nameof(DataTestUtility.IsNotAzureSynapse))] public static void CheckLegacyNullRowVersionIsEmptyArray() From 7325828d8b7587554133df5a7a3a5eac11150f48 Mon Sep 17 00:00:00 2001 From: Wraith2 Date: Mon, 16 Jun 2025 21:31:36 +0100 Subject: [PATCH 2/4] review feedback --- .../SQL/DataReaderTest/DataReaderTest.cs | 37 ++++++++++++++----- 1 file changed, 28 insertions(+), 9 deletions(-) diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/DataReaderTest/DataReaderTest.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/DataReaderTest/DataReaderTest.cs index 1b56d845c2..1f7cad5ed0 100644 --- a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/DataReaderTest/DataReaderTest.cs +++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/DataReaderTest/DataReaderTest.cs @@ -799,9 +799,13 @@ public static async Task CanReadLargeNTextColumn() { await cn.OpenAsync(); - using (var cmd = cn.CreateCommand()) + string tableName = DataTestUtility.GenerateObjectName(); + + try { - cmd.CommandText = $""" + using (var cmd = cn.CreateCommand()) + { + cmd.CommandText = $""" if exists (select * from sysobjects where name = 'Expl_User_Global_Sets_' @@ -811,7 +815,7 @@ from sysobjects drop table dbo.Expl_User_Global_Sets_ end - create table dbo.Expl_User_Global_Sets_ + create table {tableName} ( User_ID varchar(22) not null, StringName varchar(255) not null, @@ -825,15 +829,15 @@ StringName varchar(255) not null, IsProtoCorrected bit default 1 ) - insert into dbo.Expl_User_Global_Sets_(User_ID, StringName, IsGlobal, List, UseProtoSerializer, ModuleNameForUse, + insert into {tableName}(User_ID, StringName, IsGlobal, List, UseProtoSerializer, ModuleNameForUse, IsReadOnly, VersionNumber, UserGlobalSet_ID, IsProtoCorrected) values ('80004Q4WZ1350KO8NT59RM', '_', 1, '{stringValue}', 1, 2, 1, 1, newid(), 1); """; - await cmd.ExecuteNonQueryAsync(); + await cmd.ExecuteNonQueryAsync(); - cmd.CommandText = $"""" + cmd.CommandText = $"""" SELECT --[gs].[UserGlobalSet_ID], --[gs].[User_ID], @@ -846,16 +850,31 @@ insert into dbo.Expl_User_Global_Sets_(User_ID, StringName, IsGlobal, List, UseP --[gs].[VersionNumber], --[gs].[IsProtoCorrected] FROM - [dbo].[Expl_User_Global_Sets_] [gs] + {tableName} [gs] WHERE ([gs].[IsGlobal] = 1 OR [gs].[User_ID] = '{"80004Q4WZ1350KO8NT59RM"}') AND ([gs].[ModuleNameForUse] IS NULL OR [gs].[ModuleNameForUse] = {2}) """"; - var l = (string)await cmd.ExecuteScalarAsync(); - Assert.Equal(stringValue, l); + var l = (string)await cmd.ExecuteScalarAsync(); + Assert.Equal(stringValue, l); + } + } + finally + { + try + { + using (var dropCommand = cn.CreateCommand()) + { + dropCommand.CommandText = $"DROP TABLE IF EXISTS [{tableName}]"; + dropCommand.ExecuteNonQuery(); + } + } + catch + { + } } } } From 6f6645742354e70f794bf0c5139bb0c4a54483c9 Mon Sep 17 00:00:00 2001 From: Wraith2 Date: Sat, 21 Jun 2025 11:09:40 +0100 Subject: [PATCH 3/4] tidy up sql --- .../SQL/DataReaderTest/DataReaderTest.cs | 25 +++---------------- 1 file changed, 4 insertions(+), 21 deletions(-) diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/DataReaderTest/DataReaderTest.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/DataReaderTest/DataReaderTest.cs index 1f7cad5ed0..5651ea25ca 100644 --- a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/DataReaderTest/DataReaderTest.cs +++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/DataReaderTest/DataReaderTest.cs @@ -806,16 +806,7 @@ public static async Task CanReadLargeNTextColumn() using (var cmd = cn.CreateCommand()) { cmd.CommandText = $""" - if exists (select * - from sysobjects - where name = 'Expl_User_Global_Sets_' - and xtype = 'U') - - begin - drop table dbo.Expl_User_Global_Sets_ - end - - create table {tableName} + create table [{tableName}] ( User_ID varchar(22) not null, StringName varchar(255) not null, @@ -829,7 +820,7 @@ StringName varchar(255) not null, IsProtoCorrected bit default 1 ) - insert into {tableName}(User_ID, StringName, IsGlobal, List, UseProtoSerializer, ModuleNameForUse, + insert into [{tableName}](User_ID, StringName, IsGlobal, List, UseProtoSerializer, ModuleNameForUse, IsReadOnly, VersionNumber, UserGlobalSet_ID, IsProtoCorrected) values ('80004Q4WZ1350KO8NT59RM', '_', 1, '{stringValue}', 1, 2, 1, 1, newid(), 1); @@ -839,18 +830,10 @@ StringName varchar(255) not null, cmd.CommandText = $"""" SELECT - --[gs].[UserGlobalSet_ID], - --[gs].[User_ID], - --[gs].[StringName], - --[gs].[IsGlobal], [gs].[List], - [gs].[UseProtoSerializer]--, - --[gs].[ModuleNameForUse], - --[gs].[IsReadOnly], - --[gs].[VersionNumber], - --[gs].[IsProtoCorrected] + [gs].[UseProtoSerializer], FROM - {tableName} [gs] + [{tableName}] [gs] WHERE ([gs].[IsGlobal] = 1 OR [gs].[User_ID] = '{"80004Q4WZ1350KO8NT59RM"}') AND ([gs].[ModuleNameForUse] IS NULL OR [gs].[ModuleNameForUse] = {2}) From a8862a9b72c53ceddbc09c3efc49298fcfe57c26 Mon Sep 17 00:00:00 2001 From: Cheena Malhotra <13396919+cheenamalhotra@users.noreply.github.com> Date: Mon, 23 Jun 2025 12:30:42 -0700 Subject: [PATCH 4/4] Update src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/DataReaderTest/DataReaderTest.cs --- .../tests/ManualTests/SQL/DataReaderTest/DataReaderTest.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/DataReaderTest/DataReaderTest.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/DataReaderTest/DataReaderTest.cs index 5651ea25ca..0d024170b6 100644 --- a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/DataReaderTest/DataReaderTest.cs +++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/DataReaderTest/DataReaderTest.cs @@ -831,7 +831,7 @@ StringName varchar(255) not null, cmd.CommandText = $"""" SELECT [gs].[List], - [gs].[UseProtoSerializer], + [gs].[UseProtoSerializer] FROM [{tableName}] [gs] WHERE