@@ -595,6 +595,103 @@ func TestEmptyQueryWithRequestID(t *testing.T) {
595
595
})
596
596
}
597
597
598
+ func TestRequestIDFromTwoDifferentSessions (t * testing.T ) {
599
+ db , err := sql .Open ("snowflake" , dsn )
600
+ assertNilF (t , err )
601
+ db .SetMaxOpenConns (10 )
602
+
603
+ conn , err := db .Conn (context .Background ())
604
+ assertNilF (t , err )
605
+ defer conn .Close ()
606
+ _ , err = conn .ExecContext (context .Background (), forceJSON )
607
+ assertNilF (t , err )
608
+
609
+ conn2 , err := db .Conn (context .Background ())
610
+ assertNilF (t , err )
611
+ defer conn2 .Close ()
612
+ _ , err = conn2 .ExecContext (context .Background (), forceJSON )
613
+ assertNilF (t , err )
614
+
615
+ // creating table
616
+ reqIDForCreate := NewUUID ()
617
+ _ , err = conn .ExecContext (WithRequestID (context .Background (), reqIDForCreate ), "CREATE TABLE req_id_testing (id INTEGER)" )
618
+ assertNilF (t , err )
619
+ defer func () {
620
+ _ , err = db .Exec ("DROP TABLE IF EXISTS req_id_testing" )
621
+ assertNilE (t , err )
622
+ }()
623
+ _ , err = conn .ExecContext (WithRequestID (context .Background (), reqIDForCreate ), "CREATE TABLE req_id_testing (id INTEGER)" )
624
+ assertNilF (t , err )
625
+ defer func () {
626
+ _ , err = db .Exec ("DROP TABLE IF EXISTS req_id_testing" )
627
+ assertNilE (t , err )
628
+ }()
629
+
630
+ // should fail as API v1 does not allow reusing requestID across sessions for DML statements
631
+ _ , err = conn2 .ExecContext (WithRequestID (context .Background (), reqIDForCreate ), "CREATE TABLE req_id_testing (id INTEGER)" )
632
+ assertNotNilE (t , err )
633
+ assertStringContainsE (t , err .Error (), "already exists" )
634
+
635
+ // inserting a record
636
+ reqIDForInsert := NewUUID ()
637
+ execResult , err := conn .ExecContext (WithRequestID (context .Background (), reqIDForInsert ), "INSERT INTO req_id_testing VALUES (1)" )
638
+ assertNilF (t , err )
639
+ rowsInserted , err := execResult .RowsAffected ()
640
+ assertNilF (t , err )
641
+ assertEqualE (t , rowsInserted , int64 (1 ))
642
+
643
+ _ , err = conn2 .ExecContext (WithRequestID (context .Background (), reqIDForInsert ), "INSERT INTO req_id_testing VALUES (1)" )
644
+ assertNilF (t , err )
645
+ rowsInserted2 , err := execResult .RowsAffected ()
646
+ assertNilF (t , err )
647
+ assertEqualE (t , rowsInserted2 , int64 (1 ))
648
+
649
+ // selecting data
650
+ reqIDForSelect := NewUUID ()
651
+ rows , err := conn .QueryContext (WithRequestID (context .Background (), reqIDForSelect ), "SELECT * FROM req_id_testing" )
652
+ assertNilF (t , err )
653
+ defer rows .Close ()
654
+ var i int
655
+ assertTrueE (t , rows .Next ())
656
+ assertNilF (t , rows .Scan (& i ))
657
+ assertEqualE (t , i , 1 )
658
+ i = 0
659
+ assertTrueE (t , rows .Next ())
660
+ assertNilF (t , rows .Scan (& i ))
661
+ assertEqualE (t , i , 1 )
662
+ assertFalseE (t , rows .Next ())
663
+
664
+ rows2 , err := conn .QueryContext (WithRequestID (context .Background (), reqIDForSelect ), "SELECT * FROM req_id_testing" )
665
+ assertNilF (t , err )
666
+ defer rows2 .Close ()
667
+ assertTrueE (t , rows2 .Next ())
668
+ assertNilF (t , rows2 .Scan (& i ))
669
+ assertEqualE (t , i , 1 )
670
+ i = 0
671
+ assertTrueE (t , rows2 .Next ())
672
+ assertNilF (t , rows2 .Scan (& i ))
673
+ assertEqualE (t , i , 1 )
674
+ assertFalseE (t , rows2 .Next ())
675
+
676
+ // insert another data
677
+ _ , err = conn .ExecContext (context .Background (), "INSERT INTO req_id_testing VALUES (1)" )
678
+ assertNilF (t , err )
679
+
680
+ // selecting using old request id
681
+ rows3 , err := conn .QueryContext (WithRequestID (context .Background (), reqIDForSelect ), "SELECT * FROM req_id_testing" )
682
+ assertNilF (t , err )
683
+ defer rows3 .Close ()
684
+ assertTrueE (t , rows3 .Next ())
685
+ assertNilF (t , rows3 .Scan (& i ))
686
+ assertEqualE (t , i , 1 )
687
+ i = 0
688
+ assertTrueE (t , rows3 .Next ())
689
+ assertNilF (t , rows3 .Scan (& i ))
690
+ assertEqualE (t , i , 1 )
691
+ i = 0
692
+ assertFalseF (t , rows3 .Next ())
693
+ }
694
+
598
695
func TestCRUD (t * testing.T ) {
599
696
runDBTest (t , func (dbt * DBTest ) {
600
697
// Create Table
0 commit comments