@@ -17,10 +17,11 @@ import (
1717)
1818
1919type mysqlStmt struct {
20- mc * mysqlConn
21- id uint32
22- paramCount int
23- columns []mysqlField
20+ mc * mysqlConn
21+ id uint32
22+ paramCount int
23+ columns []mysqlField
24+ initialQuery string
2425}
2526
2627func (stmt * mysqlStmt ) Close () error {
@@ -52,16 +53,53 @@ func (stmt *mysqlStmt) CheckNamedValue(nv *driver.NamedValue) (err error) {
5253}
5354
5455func (stmt * mysqlStmt ) Exec (args []driver.Value ) (driver.Result , error ) {
55- if stmt .mc .closed .Load () {
56+ mc := stmt .mc
57+ if mc .closed .Load () {
5658 return nil , driver .ErrBadConn
5759 }
60+
61+ var prepareSequence uint8
62+ var prepareCompressSequence uint8
63+
64+ if mc .clientExtCapabilities & clientStmtBulkOperations != 0 {
65+ // Send command
66+ err := mc .writeCommandPacketStr (comStmtPrepare , stmt .initialQuery )
67+ if err != nil {
68+ mc .log (err )
69+ return nil , driver .ErrBadConn
70+ }
71+ prepareSequence = mc .sequence
72+ prepareCompressSequence = mc .compressSequence
73+ }
74+
5875 // Send command
5976 err := stmt .writeExecutePacket (args )
6077 if err != nil {
6178 return nil , stmt .mc .markBadConn (err )
6279 }
6380
64- mc := stmt .mc
81+ if stmt .mc .clientExtCapabilities & clientStmtBulkOperations != 0 {
82+ // Read Prepare Result
83+ var executeSequence uint8
84+ var executeCompressSequence uint8
85+ executeSequence = mc .sequence
86+ executeCompressSequence = mc .compressSequence
87+
88+ mc .sequence = prepareSequence
89+ mc .compressSequence = prepareCompressSequence
90+
91+ err = mc .readPrepareResult (stmt )
92+
93+ mc .sequence = executeSequence
94+ mc .compressSequence = executeCompressSequence
95+ if err != nil {
96+ // skip executeResult (will return an error)
97+ handleOk := stmt .mc .clearResult ()
98+ _ , _ , _ = handleOk .readResultSetHeaderPacket ()
99+ return nil , err
100+ }
101+ }
102+
65103 handleOk := stmt .mc .clearResult ()
66104
67105 // Read Result
@@ -98,13 +136,48 @@ func (stmt *mysqlStmt) query(args []driver.Value) (*binaryRows, error) {
98136 if stmt .mc .closed .Load () {
99137 return nil , driver .ErrBadConn
100138 }
139+
140+ mc := stmt .mc
141+ var prepareSequence uint8
142+ var prepareCompressSequence uint8
143+
144+ if mc .clientExtCapabilities & clientStmtBulkOperations != 0 {
145+ // Send command
146+ err := mc .writeCommandPacketStr (comStmtPrepare , stmt .initialQuery )
147+ if err != nil {
148+ mc .log (err )
149+ return nil , driver .ErrBadConn
150+ }
151+ prepareSequence = mc .sequence
152+ prepareCompressSequence = mc .compressSequence
153+ }
101154 // Send command
102155 err := stmt .writeExecutePacket (args )
103156 if err != nil {
104157 return nil , stmt .mc .markBadConn (err )
105158 }
106159
107- mc := stmt .mc
160+ if stmt .mc .clientExtCapabilities & clientStmtBulkOperations != 0 {
161+ // Read Prepare Result
162+ var executeSequence uint8
163+ var executeCompressSequence uint8
164+ executeSequence = mc .sequence
165+ executeCompressSequence = mc .compressSequence
166+
167+ mc .sequence = prepareSequence
168+ mc .compressSequence = prepareCompressSequence
169+
170+ err = mc .readPrepareResult (stmt )
171+
172+ mc .sequence = executeSequence
173+ mc .compressSequence = executeCompressSequence
174+ if err != nil {
175+ // skip executeResult (will return an error)
176+ handleOk := stmt .mc .clearResult ()
177+ _ , _ , _ = handleOk .readResultSetHeaderPacket ()
178+ return nil , err
179+ }
180+ }
108181
109182 // Read Result
110183 handleOk := stmt .mc .clearResult ()
0 commit comments