3
3
package mysql
4
4
5
5
import (
6
+ "database/sql"
7
+ "fmt"
6
8
"reflect"
7
9
"testing"
8
10
)
9
11
10
12
func TestMultiResultSet (t * testing.T ) {
11
- runTests (t , dsn , func (dbt * DBTest ) {
12
- type result struct {
13
- values [][]int
14
- columns []string
15
- }
16
-
13
+ type result struct {
14
+ values [][]int
15
+ columns []string
16
+ }
17
+
18
+ // checkRows is a helper test function to validate rows containing 3 result
19
+ // sets with specific values and columns. The basic query would look like this:
20
+ //
21
+ // SELECT 1 AS col1, 2 AS col2 UNION SELECT 3, 4;
22
+ // SELECT 0 UNION SELECT 1;
23
+ // SELECT 1 AS col1, 2 AS col2, 3 AS col3 UNION SELECT 4, 5, 6;
24
+ //
25
+ // to distinguish test cases the first string argument is put in front of
26
+ // every error or fatal message.
27
+ checkRows := func (desc string , rows * sql.Rows , dbt * DBTest ) {
17
28
expected := []result {
18
29
{
19
30
values : [][]int {{1 , 2 }, {3 , 4 }},
@@ -25,14 +36,6 @@ func TestMultiResultSet(t *testing.T) {
25
36
},
26
37
}
27
38
28
- query := `
29
- SELECT 1 AS col1, 2 AS col2 UNION SELECT 3, 4;
30
- SELECT 0 UNION SELECT 1; -- ignore this result set
31
- SELECT 1 AS col1, 2 AS col2, 3 AS col3 UNION SELECT 4, 5, 6;`
32
-
33
- rows := dbt .mustQuery (query )
34
- defer rows .Close ()
35
-
36
39
var res1 result
37
40
for rows .Next () {
38
41
var res [2 ]int
@@ -42,49 +45,115 @@ SELECT 1 AS col1, 2 AS col2, 3 AS col3 UNION SELECT 4, 5, 6;`
42
45
res1 .values = append (res1 .values , res [:])
43
46
}
44
47
45
- if rows .Next () {
46
- dbt .Error ("unexpected row" )
47
- }
48
-
49
48
cols , err := rows .Columns ()
50
49
if err != nil {
51
- dbt .Fatal (err )
50
+ dbt .Fatal (desc , err )
52
51
}
53
52
res1 .columns = cols
54
53
55
54
if ! reflect .DeepEqual (expected [0 ], res1 ) {
56
- dbt .Error ("want =" , expected [0 ], "got =" , res1 )
55
+ dbt .Error (desc , "want =" , expected [0 ], "got =" , res1 )
57
56
}
58
57
59
58
if ! rows .NextResultSet () {
60
- dbt .Fatal ("expected next result set" )
59
+ dbt .Fatal (desc , "expected next result set" )
61
60
}
62
61
63
62
// ignoring one result set
64
63
65
64
if ! rows .NextResultSet () {
66
- dbt .Fatal ("expected next result set" )
65
+ dbt .Fatal (desc , "expected next result set" )
67
66
}
68
67
69
68
var res2 result
70
69
cols , err = rows .Columns ()
71
70
if err != nil {
72
- dbt .Fatal (err )
71
+ dbt .Fatal (desc , err )
73
72
}
74
73
res2 .columns = cols
75
74
76
75
for rows .Next () {
77
76
var res [3 ]int
78
77
if err := rows .Scan (& res [0 ], & res [1 ], & res [2 ]); err != nil {
79
- dbt .Fatal (err )
78
+ dbt .Fatal (desc , err )
80
79
}
81
80
res2 .values = append (res2 .values , res [:])
82
81
}
83
82
84
83
if ! reflect .DeepEqual (expected [1 ], res2 ) {
85
- dbt .Error ("want =" , expected [1 ], "got =" , res2 )
84
+ dbt .Error (desc , "want =" , expected [1 ], "got =" , res2 )
85
+ }
86
+
87
+ if rows .NextResultSet () {
88
+ dbt .Error (desc , "unexpected next result set" )
89
+ }
90
+
91
+ if err := rows .Err (); err != nil {
92
+ dbt .Error (desc , err )
93
+ }
94
+ }
95
+
96
+ runTestsWithMultiStatement (t , dsn , func (dbt * DBTest ) {
97
+ rows := dbt .mustQuery (`DO 1;
98
+ SELECT 1 AS col1, 2 AS col2 UNION SELECT 3, 4;
99
+ DO 1;
100
+ SELECT 0 UNION SELECT 1;
101
+ SELECT 1 AS col1, 2 AS col2, 3 AS col3 UNION SELECT 4, 5, 6;` )
102
+ defer rows .Close ()
103
+ checkRows ("query: " , rows , dbt )
104
+ })
105
+
106
+ runTestsWithMultiStatement (t , dsn , func (dbt * DBTest ) {
107
+ queries := []string {
108
+ `
109
+ DROP PROCEDURE IF EXISTS test_mrss;
110
+ CREATE PROCEDURE test_mrss()
111
+ BEGIN
112
+ DO 1;
113
+ SELECT 1 AS col1, 2 AS col2 UNION SELECT 3, 4;
114
+ DO 1;
115
+ SELECT 0 UNION SELECT 1;
116
+ SELECT 1 AS col1, 2 AS col2, 3 AS col3 UNION SELECT 4, 5, 6;
117
+ END
118
+ ` ,
119
+ `
120
+ DROP PROCEDURE IF EXISTS test_mrss;
121
+ CREATE PROCEDURE test_mrss()
122
+ BEGIN
123
+ SELECT 1 AS col1, 2 AS col2 UNION SELECT 3, 4;
124
+ SELECT 0 UNION SELECT 1;
125
+ SELECT 1 AS col1, 2 AS col2, 3 AS col3 UNION SELECT 4, 5, 6;
126
+ END
127
+ ` ,
86
128
}
87
129
130
+ defer dbt .mustExec ("DROP PROCEDURE IF EXISTS test_mrss" )
131
+
132
+ for i , query := range queries {
133
+ dbt .mustExec (query )
134
+
135
+ stmt , err := dbt .db .Prepare ("CALL test_mrss()" )
136
+ if err != nil {
137
+ dbt .Fatalf ("%v (i=%d)" , err , i )
138
+ }
139
+ defer stmt .Close ()
140
+
141
+ for j := 0 ; j < 2 ; j ++ {
142
+ rows , err := stmt .Query ()
143
+ if err != nil {
144
+ dbt .Fatalf ("%v (i=%d) (j=%d)" , err , i , j )
145
+ }
146
+ checkRows (fmt .Sprintf ("prepared stmt query (i=%d) (j=%d): " , i , j ), rows , dbt )
147
+ }
148
+ }
149
+ })
150
+ }
151
+
152
+ func TestMultiResultSetNoSelect (t * testing.T ) {
153
+ runTestsWithMultiStatement (t , dsn , func (dbt * DBTest ) {
154
+ rows := dbt .mustQuery ("DO 1; DO 2;" )
155
+ defer rows .Close ()
156
+
88
157
if rows .Next () {
89
158
dbt .Error ("unexpected row" )
90
159
}
@@ -94,7 +163,7 @@ SELECT 1 AS col1, 2 AS col2, 3 AS col3 UNION SELECT 4, 5, 6;`
94
163
}
95
164
96
165
if err := rows .Err (); err != nil {
97
- dbt .Error (err )
166
+ dbt .Error ("expected nil; got " , err )
98
167
}
99
168
})
100
169
}
0 commit comments