diff --git a/Experiments/Debugging tSQLt.tdf b/Experiments/Debugging tSQLt.tdf new file mode 100644 index 000000000..86a69c6de Binary files /dev/null and b/Experiments/Debugging tSQLt.tdf differ diff --git a/Experiments/Experiments.ssmssqlproj b/Experiments/Experiments.ssmssqlproj index 73eb07cae..7ea928e3d 100644 --- a/Experiments/Experiments.ssmssqlproj +++ b/Experiments/Experiments.ssmssqlproj @@ -66,6 +66,12 @@ LIKE4000.sql + + + + + MSSQL Defect Try-Catch Invalidates Transaction.sql + diff --git a/Experiments/MSSQL Defect Try-Catch Invalidates Transaction.sql b/Experiments/MSSQL Defect Try-Catch Invalidates Transaction.sql new file mode 100644 index 000000000..6497e537a --- /dev/null +++ b/Experiments/MSSQL Defect Try-Catch Invalidates Transaction.sql @@ -0,0 +1,20 @@ +PRINT 'No TRY...CATCH:'; +EXEC ('BEGIN TRAN'); +SELECT XACT_STATE() AS [XACT_STATE()],@@TRANCOUNT AS [@@TRANCOUNT]; +GO +IF(XACT_STATE()<>0)ROLLBACK; +GO + + + +GO +PRINT 'In TRY...CATCH:'; +BEGIN TRY +EXEC ('BEGIN TRAN'); +END TRY +BEGIN CATCH +END CATCH; +SELECT XACT_STATE() AS [XACT_STATE()],@@TRANCOUNT AS [@@TRANCOUNT]; +GO +IF(XACT_STATE()<>0)ROLLBACK; +GO diff --git a/Experiments/SM query.sql b/Experiments/SM query - read trace table.sql similarity index 100% rename from Experiments/SM query.sql rename to Experiments/SM query - read trace table.sql diff --git a/Source/Run_Methods.sql b/Source/Run_Methods.sql index fc2a97683..2395b8896 100644 --- a/Source/Run_Methods.sql +++ b/Source/Run_Methods.sql @@ -81,6 +81,7 @@ BEGIN BEGIN EXEC @SetUp; END; + EXEC (@TestExecutionCmd); IF(EXISTS(SELECT 1 FROM #ExpectException WHERE ExpectException = 1)) diff --git a/Tests/Run_Methods_Tests.class.sql b/Tests/Run_Methods_Tests.class.sql index 741decb42..a05898d83 100644 --- a/Tests/Run_Methods_Tests.class.sql +++ b/Tests/Run_Methods_Tests.class.sql @@ -2441,33 +2441,42 @@ GO /*-----------------------------------------------------------------------------------------------*/ GO ----[@tSQLt:SkipTest]('TODO: need to review handling of unexpected changes to the tSQLt transaction') CREATE PROCEDURE Run_Methods_Tests.[test produces meaningful error when pre and post transactions counts don't match] AS BEGIN - EXEC tSQLt.NewTestClass 'MyInnerTests' + EXEC tSQLt.NewTestClass 'MyInnerTestsA' + EXEC('CREATE PROCEDURE MyInnerTestsA.[test should execute outside of transaction] AS BEGIN TRAN;'); + + EXEC tSQLt.ExpectException @ExpectedMessage = 'SOMETHING RATHER', @ExpectedSeverity = NULL, @ExpectedState = NULL; + EXEC tSQLt.Run 'MyInnerTestsA.[test should execute outside of transaction]'; + +END; +GO +/*-----------------------------------------------------------------------------------------------*/ +GO + +--[@tSQLt:SkipTest]('TODO: need to review handling of unexpected changes to the tSQLt transaction for NoTransaction tests') +CREATE PROCEDURE Run_Methods_Tests.[test produces meaningful error when pre and post transactions counts don't match in NoTransaction test] +AS +BEGIN + EXEC tSQLt.NewTestClass 'MyInnerTestsB' EXEC(' --[@'+'tSQLt:NoTransaction](DEFAULT) -CREATE PROCEDURE MyInnerTests.[test should execute outside of transaction] AS BEGIN TRAN;SELECT * FROM fn_dblog(NULL,NULL) WHERE [Transaction ID] = (SELECT LL.[Transaction ID] FROM fn_dblog(NULL,NULL) LL JOIN sys.dm_tran_current_transaction AS DTCT ON DTCT.transaction_id = LL.[Xact ID]); +CREATE PROCEDURE MyInnerTestsB.[test should execute outside of transaction] AS BEGIN TRAN;SELECT * FROM fn_dblog(NULL,NULL) WHERE [Transaction ID] = (SELECT LL.[Transaction ID] FROM fn_dblog(NULL,NULL) LL JOIN sys.dm_tran_current_transaction AS DTCT ON DTCT.transaction_id = LL.[Xact ID]); '); EXEC tSQLt.ExpectException @ExpectedMessage = 'SOMETHING RATHER', @ExpectedSeverity = NULL, @ExpectedState = NULL; BEGIN TRY - EXEC tSQLt.Run 'MyInnerTests.[test should execute outside of transaction]'; + EXEC tSQLt.Run 'MyInnerTestsB.[test should execute outside of transaction]'; END TRY BEGIN CATCH - SELECT * FROM fn_dblog(NULL,NULL) WHERE [Transaction ID] = (SELECT LL.[Transaction ID] FROM fn_dblog(NULL,NULL) LL JOIN sys.dm_tran_current_transaction AS DTCT ON DTCT.transaction_id = LL.[Xact ID]); + SELECT * FROM fn_dblog(NULL,NULL) WHERE [Transaction ID] = (SELECT LL.[Transaction ID] FROM fn_dblog(NULL,NULL) LL JOIN sys.dm_tran_current_transaction AS DTCT ON DTCT.transaction_id = LL.[Xact ID]); END CATCH; - - END; GO /*-----------------------------------------------------------------------------------------------*/ GO -EXEC tSQLt.Run 'Run_Methods_Tests.[test produces meaningful error when pre and post transactions counts don''t match]'; -GO -SELECT * FROM tSQLt.TestResult; /*-- Transaction Tests