@@ -5,8 +5,11 @@ const sequelizeErrors = require('../../errors');
5
5
const _ = require ( 'lodash' ) ;
6
6
const { logger } = require ( '../../utils/logger' ) ;
7
7
8
- const debug = logger . debugContext ( 'sql:mysql' ) ;
8
+ const ER_DUP_ENTRY = 1062 ;
9
+ const ER_ROW_IS_REFERENCED = 1451 ;
10
+ const ER_NO_REFERENCED_ROW = 1452 ;
9
11
12
+ const debug = logger . debugContext ( 'sql:mysql' ) ;
10
13
11
14
class Query extends AbstractQuery {
12
15
constructor ( connection , sequelize , options ) {
@@ -15,9 +18,9 @@ class Query extends AbstractQuery {
15
18
16
19
static formatBindParameters ( sql , values , dialect ) {
17
20
const bindParam = [ ] ;
18
- const replacementFunc = ( match , key , values ) => {
19
- if ( values [ key ] !== undefined ) {
20
- bindParam . push ( values [ key ] ) ;
21
+ const replacementFunc = ( match , key , values_ ) => {
22
+ if ( values_ [ key ] !== undefined ) {
23
+ bindParam . push ( values_ [ key ] ) ;
21
24
return '?' ;
22
25
}
23
26
return undefined ;
@@ -30,37 +33,46 @@ class Query extends AbstractQuery {
30
33
this . sql = sql ;
31
34
const { connection, options } = this ;
32
35
33
- //do we need benchmark for this query execution
34
36
const showWarnings = this . sequelize . options . showWarnings || options . showWarnings ;
35
37
36
38
const complete = this . _logQuery ( sql , debug , parameters ) ;
37
39
38
- const query = parameters && parameters . length
39
- ? new Promise ( ( resolve , reject ) => connection . execute ( sql , parameters , ( error , result ) => error ? reject ( error ) : resolve ( result ) ) . setMaxListeners ( 100 ) )
40
- : new Promise ( ( resolve , reject ) => connection . query ( { sql } , ( error , result ) => error ? reject ( error ) : resolve ( result ) ) . setMaxListeners ( 100 ) ) ;
40
+ if ( parameters ) {
41
+ debug ( 'parameters(%j)' , parameters ) ;
42
+ }
41
43
42
44
let results ;
43
45
44
46
try {
45
- results = await query ;
47
+ if ( parameters && parameters . length ) {
48
+ results = await new Promise ( ( resolve , reject ) => {
49
+ connection
50
+ . execute ( sql , parameters , ( error , result ) => error ? reject ( error ) : resolve ( result ) )
51
+ . setMaxListeners ( 100 ) ;
52
+ } ) ;
53
+ } else {
54
+ results = await new Promise ( ( resolve , reject ) => {
55
+ connection
56
+ . query ( { sql } , ( error , result ) => error ? reject ( error ) : resolve ( result ) )
57
+ . setMaxListeners ( 100 ) ;
58
+ } ) ;
59
+ }
46
60
} catch ( err ) {
47
61
// MySQL automatically rolls-back transactions in the event of a deadlock
48
62
if ( options . transaction && err . errno === 1213 ) {
49
63
options . transaction . finished = 'rollback' ;
50
64
}
65
+
51
66
err . sql = sql ;
52
67
err . parameters = parameters ;
53
-
54
68
throw this . formatError ( err ) ;
55
69
}
56
70
57
71
complete ( ) ;
58
72
59
- // Log warnings if we've got them.
60
73
if ( showWarnings && results && results . warningStatus > 0 ) {
61
74
await this . logWarnings ( results ) ;
62
75
}
63
- // Return formatted results...
64
76
return this . formatResults ( results ) ;
65
77
}
66
78
@@ -88,7 +100,7 @@ class Query extends AbstractQuery {
88
100
this . handleInsertQuery ( data ) ;
89
101
90
102
if ( ! this . instance ) {
91
- // handle bulkCreate AI primiary key
103
+ // handle bulkCreate AI primary key
92
104
if (
93
105
data . constructor . name === 'ResultSetHeader'
94
106
&& this . model
@@ -123,7 +135,8 @@ class Query extends AbstractQuery {
123
135
allowNull : _result . Null === 'YES' ,
124
136
defaultValue : _result . Default ,
125
137
primaryKey : _result . Key === 'PRI' ,
126
- autoIncrement : Object . prototype . hasOwnProperty . call ( _result , 'Extra' ) && _result . Extra . toLowerCase ( ) === 'auto_increment' ,
138
+ autoIncrement : Object . prototype . hasOwnProperty . call ( _result , 'Extra' )
139
+ && _result . Extra . toLowerCase ( ) === 'auto_increment' ,
127
140
comment : _result . Comment ? _result . Comment : null
128
141
} ;
129
142
}
@@ -166,7 +179,9 @@ class Query extends AbstractQuery {
166
179
const warningMessage = `MySQL Warnings (${ this . connection . uuid || 'default' } ): ` ;
167
180
const messages = [ ] ;
168
181
for ( const _warningRow of warningResults ) {
169
- if ( _warningRow === undefined || typeof _warningRow [ Symbol . iterator ] !== 'function' ) continue ;
182
+ if ( _warningRow === undefined || typeof _warningRow [ Symbol . iterator ] !== 'function' ) {
183
+ continue ;
184
+ }
170
185
for ( const _warningResult of _warningRow ) {
171
186
if ( Object . prototype . hasOwnProperty . call ( _warningResult , 'Message' ) ) {
172
187
messages . push ( _warningResult . Message ) ;
@@ -187,7 +202,7 @@ class Query extends AbstractQuery {
187
202
const errCode = err . errno || err . code ;
188
203
189
204
switch ( errCode ) {
190
- case 1062 : {
205
+ case ER_DUP_ENTRY : {
191
206
const match = err . message . match ( / D u p l i c a t e e n t r y ' ( [ \s \S ] * ) ' f o r k e y ' ? ( ( .| \s ) * ?) ' ? $ / ) ;
192
207
let fields = { } ;
193
208
let message = 'Validation error' ;
@@ -218,15 +233,17 @@ class Query extends AbstractQuery {
218
233
return new sequelizeErrors . UniqueConstraintError ( { message, errors, parent : err , fields } ) ;
219
234
}
220
235
221
- case 1451 :
222
- case 1452 : {
236
+ case ER_ROW_IS_REFERENCED :
237
+ case ER_NO_REFERENCED_ROW : {
223
238
// e.g. CONSTRAINT `example_constraint_name` FOREIGN KEY (`example_id`) REFERENCES `examples` (`id`)
224
- const match = err . message . match ( / C O N S T R A I N T ( [ ` " ] ) ( .* ) \1 F O R E I G N K E Y \( \1( .* ) \1\) R E F E R E N C E S \1( .* ) \1 \( \1( .* ) \1\) / ) ;
239
+ const match = err . message . match (
240
+ / C O N S T R A I N T ( [ ` " ] ) ( .* ) \1 F O R E I G N K E Y \( \1( .* ) \1\) R E F E R E N C E S \1( .* ) \1 \( \1( .* ) \1\) /
241
+ ) ;
225
242
const quoteChar = match ? match [ 1 ] : '`' ;
226
243
const fields = match ? match [ 3 ] . split ( new RegExp ( `${ quoteChar } , *${ quoteChar } ` ) ) : undefined ;
227
244
228
245
return new sequelizeErrors . ForeignKeyConstraintError ( {
229
- reltype : String ( errCode ) === '1451' ? 'parent' : 'child' ,
246
+ reltype : String ( errCode ) === String ( ER_ROW_IS_REFERENCED ) ? 'parent' : 'child' ,
230
247
table : match ? match [ 4 ] : undefined ,
231
248
fields,
232
249
value : fields && fields . length && this . instance && this . instance [ fields [ 0 ] ] || undefined ,
0 commit comments