1515using Xtensive . Orm . Tests . ObjectModel ;
1616using Xtensive . Orm . Tests . ObjectModel . ChinookDO ;
1717using System . Threading . Tasks ;
18+ using Xtensive . Orm . Configuration ;
1819
1920namespace Xtensive . Orm . Tests . Linq . LocalCollectionsTest_Model
2021{
@@ -910,6 +911,40 @@ public void ClosureCacheTest()
910911 } ) ;
911912 }
912913
914+ [ Test ]
915+ public void TempTableCleanupAfterTimeout ( )
916+ {
917+ Require . ProviderIs ( StorageProvider . PostgreSql | StorageProvider . SqlServer , "Uses database-specific syntax." ) ;
918+
919+ var localItems = GetLocalItems ( 100 ) ;
920+
921+ var sessionConfig = new SessionConfiguration ( SessionOptions . Default | SessionOptions . AutoActivation ) ;
922+ sessionConfig . BatchSize = 1 ;
923+ sessionConfig . DefaultCommandTimeout = 10 ;
924+
925+ using ( var session = Domain . OpenSession ( sessionConfig ) )
926+ using ( var tx = session . OpenTransaction ( ) ) {
927+ session . Events . DbCommandExecuting += Events_DbCommandExecuting ;
928+
929+ var storeQueryable = session . Query . Store ( localItems ) ;
930+ _ = Assert . Throws < OperationTimeoutException > ( ( ) => session . Query . All < Invoice > ( )
931+ . Where ( invoice => invoice . Commission > storeQueryable . Max ( poco => poco . Value2 ) ) . ToArray ( ) ) ;
932+
933+ session . Events . DbCommandExecuting -= Events_DbCommandExecuting ;
934+ }
935+
936+ static void Events_DbCommandExecuting ( object sender , DbCommandEventArgs e )
937+ {
938+ // makes query to delay more than current setting of command timeout
939+ var originalCommandText = e . Command . CommandText ;
940+ if ( originalCommandText . Contains ( "Select" , StringComparison . OrdinalIgnoreCase ) ) {
941+ var session = ( ( SessionEventAccessor ) sender ) . Session ;
942+ e . Command . CommandText = GetFakeDelayedCommandTest ( session , originalCommandText ) ;
943+ }
944+ }
945+ }
946+
947+
913948 [ Test ]
914949 [ Ignore ( "Very long" ) ]
915950 public void VeryLongTest ( )
@@ -935,7 +970,18 @@ private IEnumerable<Poco<int, decimal, string>> GetLocalItems(int count)
935970 Value3 = Guid . NewGuid ( ) . ToString ( )
936971 }
937972 )
938- . ToList ( ) ;
973+ . ToList ( count ) ;
974+ }
975+
976+ private static string GetFakeDelayedCommandTest ( Session session , string originalCommandText )
977+ {
978+ var currentCommandTimeout = session . CommandTimeout . Value ;
979+
980+ return StorageProviderInfo . Instance . Provider switch {
981+ StorageProvider . SqlServer => $ "WAITFOR DELAY '{ TimeSpan . FromSeconds ( currentCommandTimeout + 2 ) . ToString ( "hh:mm.ss" ) } '" + originalCommandText ,
982+ StorageProvider . PostgreSql => $ "SELECT pg_sleep({ currentCommandTimeout + 2 } );" + originalCommandText ,
983+ _ => throw new ArgumentOutOfRangeException ( )
984+ } ;
939985 }
940986 }
941987}
0 commit comments