@@ -845,9 +845,110 @@ LIMIT 1`)
845845 }
846846
847847 registry := tc .Server (0 ).ExecutorConfig ().(sql.ExecutorConfig ).TxnDiagnosticsRecorder
848+ t .Run ("diagnostics" , func (t * testing.T ) {
849+ for _ , testCase := range []struct {
850+ name string
851+ statements []string
852+ }{
853+ {
854+ name : "regular request" ,
855+ statements : txnStatements ,
856+ },
857+ {
858+ name : "with savepoint cockroach_restart" ,
859+ statements : []string {
860+ "SAVEPOINT cockroach_restart" ,
861+ "SELECT 'aaaaaa', 'bbbbbb'" ,
862+ "SELECT 'aaaaaa', 'bbbbbb', 'ccccc' UNION select 'ddddd', 'eeeee', 'fffff'" ,
863+ "RELEASE SAVEPOINT cockroach_restart" ,
864+ },
865+ },
866+ {
867+ name : "with savepoint" ,
868+ statements : []string {
869+ "SAVEPOINT my_savepoint" ,
870+ "SELECT 'aaaaaa', 'bbbbbb'" ,
871+ "SELECT 'aaaaaa', 'bbbbbb', 'ccccc' UNION select 'ddddd', 'eeeee', 'fffff'" ,
872+ "RELEASE SAVEPOINT my_savepoint" ,
873+ },
874+ },
875+ {
876+ name : "with savepoint rollback" ,
877+ statements : []string {
878+ "SAVEPOINT my_savepoint" ,
879+ "SELECT 'aaaaaa', 'bbbbbb'" ,
880+ "SELECT 'aaaaaa', 'bbbbbb', 'ccccc' UNION select 'ddddd', 'eeeee', 'fffff'" ,
881+ "ROLLBACK TO SAVEPOINT my_savepoint" ,
882+ },
883+ },
884+ {
885+ name : "with cockroach_restart and regular savepoint" ,
886+ statements : []string {
887+ "SAVEPOINT cockroach_restart" ,
888+ "SAVEPOINT my_savepoint" ,
889+ "SELECT 'aaaaaa', 'bbbbbb'" ,
890+ "RELEASE SAVEPOINT my_savepoint" ,
891+ "SELECT 'aaaaaa', 'bbbbbb', 'ccccc' UNION select 'ddddd', 'eeeee', 'fffff'" ,
892+ "RELEASE SAVEPOINT cockroach_restart" ,
893+ },
894+ },
895+ {
896+ name : "with cockroach_restart and regular savepoint and rollback" ,
897+ statements : []string {
898+ "SAVEPOINT cockroach_restart" ,
899+ "SELECT 'aaaaaa', 'bbbbbb'" ,
900+ "SAVEPOINT my_savepoint" ,
901+ "ROLLBACK TO SAVEPOINT my_savepoint" ,
902+ "SELECT 'aaaaaa', 'bbbbbb', 'ccccc' UNION select 'ddddd', 'eeeee', 'fffff'" ,
903+ "SHOW SAVEPOINT STATUS" ,
904+ "RELEASE SAVEPOINT cockroach_restart" ,
905+ },
906+ },
907+ {
908+ name : "with show commit timestamp" ,
909+ statements : []string {
910+ "SELECT 'aaaaaa', 'bbbbbb'" ,
911+ "SELECT 'aaaaaa', 'bbbbbb', 'ccccc' UNION select 'ddddd', 'eeeee', 'fffff'" ,
912+ "SHOW COMMIT TIMESTAMP" ,
913+ },
914+ },
915+ } {
916+ t .Run (testCase .name , func (t * testing.T ) {
917+ // Insert a request for the transaction fingerprint
918+ reqId , err := registry .InsertTxnRequestInternal (
919+ ctx ,
920+ txnFingerprintId ,
921+ statementFingerprintIds ,
922+ "testuser" ,
923+ 0 ,
924+ 0 ,
925+ 0 ,
926+ false ,
927+ )
928+ require .NoError (t , err )
848929
849- t .Run ("txn diagnostic request" , func (t * testing.T ) {
850- // Insert a request for the transaction fingerprint
930+ // Ensure that the request shows up in the system.transaction_diagnostics_requests table
931+ var count int
932+ sqlConn .QueryRow (t , "SELECT count(*) FROM system.transaction_diagnostics_requests WHERE completed=false and id=$1" , reqId ).Scan (& count )
933+ require .Equal (t , 1 , count )
934+
935+ // Execute the transaction until the request is marked as complete.
936+ // We use a connection to a different server than the diagnostics request
937+ // was made on to ensure that the request is properly gossiped.
938+ runTxnUntilDiagnosticsCollected (t , tc , sqlutils .MakeSQLRunner (tc .ServerConn (1 )), testCase .statements , reqId )
939+ })
940+ }
941+ })
942+
943+ t .Run ("diagnostics with prepared statement" , func (t * testing.T ) {
944+ // Since you can't create the same named prepared statement, we have this
945+ // in a separate test that is guaranteed to complete on the first try
946+ // by using the same node the request was made on.
947+ statements := []string {
948+ "PREPARE my_statement as SELECT 'aaaaaa', 'bbbbbb'" ,
949+ "EXECUTE my_statement" ,
950+ "SELECT 'aaaaaa', 'bbbbbb', 'ccccc' UNION select 'ddddd', 'eeeee', 'fffff'" ,
951+ }
851952 reqId , err := registry .InsertTxnRequestInternal (
852953 ctx ,
853954 txnFingerprintId ,
@@ -859,19 +960,8 @@ LIMIT 1`)
859960 false ,
860961 )
861962 require .NoError (t , err )
862-
863- // Ensure that the request shows up in the system.transaction_diagnostics_requests table
864- var count int
865- sqlConn .QueryRow (t , "SELECT count(*) FROM system.transaction_diagnostics_requests WHERE completed=false and id=$1" , reqId ).Scan (& count )
866- require .Equal (t , 1 , count )
867-
868- // Execute the transaction until the request is marked as complete.
869- // We use a connection to a different server than the diagnostics request
870- // was made on to ensure that the request is properly gossiped.
871- runTxnUntilDiagnosticsCollected (t , tc , sqlutils .MakeSQLRunner (tc .ServerConn (1 )), txnStatements , reqId )
872-
963+ runTxnUntilDiagnosticsCollected (t , tc , sqlConn , statements , reqId )
873964 })
874-
875965 t .Run ("txn diagnostic with statement diagnostic request" , func (t * testing.T ) {
876966
877967 stmtReqId , err := registry .StmtRegistry .InsertRequestInternal (
0 commit comments