Skip to content

Commit 55cc324

Browse files
committed
MySQLTable: Fix bug in .insert() where sqlString was ignored if data was an array
1 parent f4c9d92 commit 55cc324

File tree

2 files changed

+66
-22
lines changed

2 files changed

+66
-22
lines changed

lib/MySQLTable.js

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -170,9 +170,12 @@ class MySQLTable {
170170
}
171171

172172
if (data instanceof Array) {
173+
data = data.length > 1
174+
? ' (' + this._db.escapeId(data[0]) + ') VALUES ' + this._db.escape(data[1])
175+
: ' VALUES ' + this._db.escape(data[0]);
176+
173177
return this._db.pquery(
174-
'INSERT INTO ' + this._escapedName + (data.length > 1 ? ' (??)' : '') + ' VALUES ?',
175-
data,
178+
'INSERT INTO ' + this._escapedName + data + ' ' + sqlString,
176179
cb
177180
);
178181
}

test/unit/MySQLTable.test.js

Lines changed: 61 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -237,23 +237,47 @@ describe('MySQLTable', () => {
237237

238238
it('should insert the specified data into the table with an ON DUPLICATE KEY UPDATE clause', done => {
239239
const data = {id: 1, email: 'one@email.com'};
240-
const onDuplicateKey = "ON DUPLICATE KEY UPDATE `email` = 'one2@email.com'";
241-
testTable.insert(data, onDuplicateKey, (err, result) => {
240+
const onDuplicateKey1 = "ON DUPLICATE KEY UPDATE `email` = 'one2@email.com'";
241+
242+
testTable.insert(data, onDuplicateKey1, (err, result1) => {
242243
if (err) throw err;
243-
result.affectedRows.should.equal(2); // Updated rows are affected twice
244-
result.insertId.should.equal(1);
245-
done();
244+
result1.affectedRows.should.equal(2); // Updated rows are affected twice
245+
result1.insertId.should.equal(1);
246+
247+
const columns = Object.keys(data);
248+
const rows = [
249+
[data[columns[0]], data[columns[1]]],
250+
];
251+
const onDuplicateKey2 = "ON DUPLICATE KEY UPDATE `email` = 'one2b@email.com'";
252+
253+
testTable.insert([columns, rows], onDuplicateKey2, (err, result2) => {
254+
if (err) throw err;
255+
result2.affectedRows.should.equal(2);
256+
result2.insertId.should.equal(1);
257+
done();
258+
});
246259
});
247260
});
248261

249262
it('should insert data with question marks into the table when using the `sqlString` and `values` parameters', done => {
250263
const data = {id: 1, email: '??one?@email.com'};
251264
const onDuplicateKey = 'ON DUPLICATE KEY UPDATE ?? = ?';
252-
testTable.insert(data, onDuplicateKey, ['email', 'one3@email.com'], (err, result) => {
265+
266+
testTable.insert(data, onDuplicateKey, ['email', 'one3@email.com'], (err, result1) => {
253267
if (err) throw err;
254-
result.affectedRows.should.equal(2); // Updated rows are affected twice
255-
result.insertId.should.equal(1);
256-
done();
268+
result1.affectedRows.should.equal(2); // Updated rows are affected twice
269+
result1.insertId.should.equal(1);
270+
271+
const columns = Object.keys(data);
272+
const rows = [
273+
[data[columns[0]], data[columns[1]]],
274+
];
275+
testTable.insert([columns, rows], onDuplicateKey, ['email', 'one4@email.com'], (err, result2) => {
276+
if (err) throw err;
277+
result2.affectedRows.should.equal(2);
278+
result2.insertId.should.equal(1);
279+
done();
280+
});
257281
});
258282
});
259283

@@ -311,24 +335,41 @@ describe('MySQLTable', () => {
311335

312336
it('should insert the specified data into the table with an ON DUPLICATE KEY UPDATE clause', () => {
313337
const data = {id: 1, email: 'one@email.com'};
314-
const onDuplicateKey = "ON DUPLICATE KEY UPDATE `email` = 'one2@email.com'";
338+
const columns = Object.keys(data);
339+
const rows = [
340+
[data[columns[0]], data[columns[1]]],
341+
];
342+
const onDuplicateKey1 = "ON DUPLICATE KEY UPDATE `email` = 'one2@email.com'";
343+
const onDuplicateKey2 = "ON DUPLICATE KEY UPDATE `email` = 'one2b@email.com'";
315344

316-
return testTable.insert(data, onDuplicateKey)
317-
.then(result => {
318-
result.affectedRows.should.equal(2); // Updated rows are affected twice
319-
result.insertId.should.equal(1);
320-
});
345+
return Promise.all([
346+
testTable.insert(data, onDuplicateKey1),
347+
testTable.insert([columns, rows], onDuplicateKey2),
348+
]).then(results => {
349+
results[0].affectedRows.should.equal(2); // Updated rows are affected twice
350+
results[0].insertId.should.equal(1);
351+
results[1].affectedRows.should.equal(2);
352+
results[1].insertId.should.equal(1);
353+
});
321354
});
322355

323356
it('should insert data with question marks into the table when using the `sqlString` and `values` parameters', () => {
324357
const data = {id: 1, email: '??one?@email.com'};
358+
const columns = Object.keys(data);
359+
const rows = [
360+
[data[columns[0]], data[columns[1]]],
361+
];
325362
const onDuplicateKey = 'ON DUPLICATE KEY UPDATE ?? = ?';
326363

327-
return testTable.insert(data, onDuplicateKey, ['email', 'one3@email.com'])
328-
.then(result => {
329-
result.affectedRows.should.equal(2); // Updated rows are affected twice
330-
result.insertId.should.equal(1);
331-
});
364+
return Promise.all([
365+
testTable.insert(data, onDuplicateKey, ['email', 'one3@email.com']),
366+
testTable.insert([columns, rows], onDuplicateKey, ['email', 'one3b@email.com']),
367+
]).then(results => {
368+
results[0].affectedRows.should.equal(2); // Updated rows are affected twice
369+
results[0].insertId.should.equal(1);
370+
results[1].affectedRows.should.equal(2);
371+
results[1].insertId.should.equal(1);
372+
});
332373
});
333374

334375
it('should be able to perform bulk inserts', () => {

0 commit comments

Comments
 (0)