@@ -605,6 +605,60 @@ integrated into a comprehensive development
605
605
}
606
606
}
607
607
608
+ [ ConditionalFact ( typeof ( DataTestUtility ) , nameof ( DataTestUtility . AreConnStringsSetup ) ) ]
609
+ public static async Task CanReadSequentialDecreasingChunks ( )
610
+ {
611
+ // pattern repeat input allows you to more easily identify if chunks are incorrectly
612
+ // related to each other by seeing the start and end of sequential chunks and checking
613
+ // if they correctly move to the next char while debugging
614
+ // simply repeating a single char can't tell you where in the string it went wrong.
615
+ const string baseString = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" ;
616
+ StringBuilder inputBuilder = new StringBuilder ( ) ;
617
+ while ( inputBuilder . Length < ( 64 * 1024 ) )
618
+ {
619
+ inputBuilder . Append ( baseString ) ;
620
+ inputBuilder . Append ( ' ' ) ;
621
+ }
622
+
623
+ string input = inputBuilder . ToString ( ) ;
624
+
625
+ StringBuilder resultBuilder = new StringBuilder ( ) ;
626
+ CancellationTokenSource cts = new CancellationTokenSource ( ) ;
627
+ using ( var connection = new SqlConnection ( DataTestUtility . TCPConnectionString ) )
628
+ {
629
+ await connection . OpenAsync ( cts . Token ) ;
630
+
631
+ using ( var command = connection . CreateCommand ( ) )
632
+ {
633
+ command . CommandText = "SELECT CONVERT(varchar(max),@str) as a" ;
634
+ command . Parameters . AddWithValue ( "@str" , input ) ;
635
+
636
+ using ( var reader = await command . ExecuteReaderAsync ( CommandBehavior . SequentialAccess , cts . Token ) )
637
+ {
638
+ if ( await reader . ReadAsync ( cts . Token ) )
639
+ {
640
+ using ( var textReader = reader . GetTextReader ( 0 ) )
641
+ {
642
+ var buffer = new char [ 4096 ] ;
643
+ var charsReadCount = - 1 ;
644
+ var start = 0 ;
645
+ while ( charsReadCount != 0 )
646
+ {
647
+ charsReadCount = await textReader . ReadAsync ( buffer , start , buffer . Length - start ) ;
648
+ resultBuilder . Append ( buffer , start , charsReadCount ) ;
649
+ start ++ ;
650
+ }
651
+ }
652
+ }
653
+ }
654
+ }
655
+ }
656
+
657
+ string result = resultBuilder . ToString ( ) ;
658
+
659
+ Assert . Equal ( input , result ) ;
660
+ }
661
+
608
662
[ ConditionalFact ( typeof ( DataTestUtility ) , nameof ( DataTestUtility . AreConnStringsSetup ) ) ]
609
663
public static async Task CanReadBinaryData ( )
610
664
{
0 commit comments