@@ -1733,3 +1733,146 @@ func TestMSSQLMarkBeginBadConn(t *testing.T) {
1733
1733
testFn (next .label , next .fn )
1734
1734
}
1735
1735
}
1736
+
1737
+ func testMSSQLNextResultSet (t * testing.T , verifyBatch func (rows * sql.Rows )) {
1738
+ db , sc , err := mssqlConnect ()
1739
+ if err != nil {
1740
+ t .Fatal (err )
1741
+ }
1742
+ defer closeDB (t , db , sc , sc )
1743
+
1744
+ db .Exec ("drop table dbo.temp" )
1745
+ exec (t , db , `create table dbo.temp (name varchar(50))` )
1746
+ exec (t , db , `insert into dbo.temp (name) values ('russ')` )
1747
+ exec (t , db , `insert into dbo.temp (name) values ('brad')` )
1748
+
1749
+ rows , err := db .Query (`
1750
+ select name from dbo.temp where name = 'russ';
1751
+ select name from dbo.temp where name = 'brad';
1752
+ ` )
1753
+ if err != nil {
1754
+ t .Fatal (err )
1755
+ }
1756
+ defer rows .Close ()
1757
+
1758
+ verifyBatch (rows )
1759
+
1760
+ exec (t , db , "drop table dbo.temp" )
1761
+ }
1762
+
1763
+ func TestMSSQLNextResultSet (t * testing.T ) {
1764
+ checkName := func (rows * sql.Rows , name string ) {
1765
+ if ! rows .Next () {
1766
+ if err := rows .Err (); err != nil {
1767
+ t .Fatalf ("executing Next for %q failed: %v" , name , err )
1768
+ }
1769
+ t .Fatalf ("checking %q: at least one row expected" , name )
1770
+ }
1771
+ var have string
1772
+ err := rows .Scan (& have )
1773
+ if err != nil {
1774
+ t .Fatalf ("executing Scan for %q failed: %v" , name , err )
1775
+ }
1776
+ if name != have {
1777
+ t .Fatalf ("want %q, but %q found" , name , have )
1778
+ }
1779
+ }
1780
+ testMSSQLNextResultSet (t ,
1781
+ func (rows * sql.Rows ) {
1782
+ checkName (rows , "russ" )
1783
+ if ! rows .NextResultSet () {
1784
+ if err := rows .Err (); err != nil {
1785
+ t .Fatal (err )
1786
+ }
1787
+ t .Fatal ("more result sets expected" )
1788
+ }
1789
+ checkName (rows , "brad" )
1790
+ if rows .NextResultSet () {
1791
+ if ! isFreeTDS () { // not sure why it does not work on FreeTDS
1792
+ t .Fatal ("unexpected result set found" )
1793
+ }
1794
+ } else {
1795
+ if err := rows .Err (); err != nil {
1796
+ t .Fatal (err )
1797
+ }
1798
+ }
1799
+ })
1800
+ }
1801
+
1802
+ func TestMSSQLHasNextResultSet (t * testing.T ) {
1803
+ checkName := func (rows * sql.Rows , name string ) {
1804
+ var reccount int
1805
+ for rows .Next () { // reading till the end of data set to trigger call into HasNextResultSet
1806
+ var have string
1807
+ err := rows .Scan (& have )
1808
+ if err != nil {
1809
+ t .Fatalf ("executing Scan for %q failed: %v" , name , err )
1810
+ }
1811
+ if name != have {
1812
+ t .Fatalf ("want %q, but %q found" , name , have )
1813
+ }
1814
+ reccount ++
1815
+ }
1816
+ if err := rows .Err (); err != nil {
1817
+ t .Fatalf ("executing Next for %q failed: %v" , name , err )
1818
+ }
1819
+ if reccount != 1 {
1820
+ t .Fatalf ("checking %q: expected 1 row returned, but %v found" , name , reccount )
1821
+ }
1822
+ }
1823
+ testMSSQLNextResultSet (t ,
1824
+ func (rows * sql.Rows ) {
1825
+ checkName (rows , "russ" )
1826
+ if ! rows .NextResultSet () {
1827
+ if err := rows .Err (); err != nil {
1828
+ t .Fatal (err )
1829
+ }
1830
+ t .Fatal ("more result sets expected" )
1831
+ }
1832
+ checkName (rows , "brad" )
1833
+ if rows .NextResultSet () {
1834
+ t .Fatal ("unexpected result set found" )
1835
+ } else {
1836
+ if err := rows .Err (); err != nil {
1837
+ t .Fatal (err )
1838
+ }
1839
+ }
1840
+ })
1841
+ }
1842
+
1843
+ func TestMSSQLIssue127 (t * testing.T ) {
1844
+ db , sc , err := mssqlConnect ()
1845
+ if err != nil {
1846
+ t .Fatal (err )
1847
+ }
1848
+ defer closeDB (t , db , sc , sc )
1849
+
1850
+ db .Exec ("drop table dbo.temp" )
1851
+ exec (t , db , "create table dbo.temp (id int, a varchar(255))" )
1852
+
1853
+ tx , err := db .Begin ()
1854
+ if err != nil {
1855
+ t .Fatal (err )
1856
+ }
1857
+
1858
+ stmt , err := tx .Prepare (`
1859
+ DECLARE @id INT, @a VARCHAR(255)
1860
+ SELECT @id = ?, @a = ?
1861
+ UPDATE dbo.temp SET a = @a WHERE id = @id
1862
+ IF @@ROWCOUNT = 0
1863
+ INSERT INTO dbo.temp (id, a) VALUES (@id, @a)
1864
+ ` )
1865
+ if err != nil {
1866
+ t .Fatal (err )
1867
+ }
1868
+ if _ , err = stmt .Exec (1 , "test" ); err != nil {
1869
+ t .Errorf ("Failed to insert record with ID 1: %s" , err )
1870
+ }
1871
+ if _ , err = stmt .Exec (1 , "test2" ); err != nil {
1872
+ t .Errorf ("Failed to update record with ID 1: %s" , err )
1873
+ }
1874
+
1875
+ if err = tx .Commit (); err != nil {
1876
+ t .Fatal (err )
1877
+ }
1878
+ }
0 commit comments