Skip to content

Commit 5c60778

Browse files
AdamVigdougwilson
authored andcommitted
Add sqlMessage property to Error objects
closes #1714
1 parent 5c53e3b commit 5c60778

File tree

4 files changed

+65
-1
lines changed

4 files changed

+65
-1
lines changed

Changes.md

+1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ you spot any mistakes.
77
## HEAD
88

99
* Add `sql` property to query `Error` objects #1462 #1628 #1629
10+
* Add `sqlMessage` property to `Error` objects #1714
1011
* Update `bignumber.js` to 4.0.2
1112
* Update `readable-stream` to 2.2.9
1213
* Use `safe-buffer` for improved Buffer API

Readme.md

+2
Original file line numberDiff line numberDiff line change
@@ -1117,6 +1117,8 @@ object. Additionally they typically come with two extra properties:
11171117
* `err.sql`: String, contains the full SQL of the failed query. This can be
11181118
useful when using a higher level interface like an ORM that is generating
11191119
the queries.
1120+
* `err.sqlMessage`: String, contains the message string that provides a
1121+
textual description of the error. Only populated from [MySQL server error][].
11201122

11211123
[Error]: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error
11221124
[MySQL server error]: http://dev.mysql.com/doc/refman/5.5/en/error-messages-server.html

lib/protocol/sequences/Sequence.js

+3-1
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,9 @@ Sequence.prototype._packetToError = function(packet) {
5252
var err = new Error(code + ': ' + packet.message);
5353
err.code = code;
5454
err.errno = packet.errno;
55-
err.sqlState = packet.sqlState;
55+
56+
err.sqlMessage = packet.message;
57+
err.sqlState = packet.sqlState;
5658

5759
return err;
5860
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
var assert = require('assert');
2+
var common = require('../../common');
3+
4+
var table = 'error_message_test';
5+
var message = 'Name must not contain b.';
6+
7+
common.getTestConnection(function (err, connection) {
8+
assert.ifError(err);
9+
10+
common.useTestDb(connection);
11+
12+
createTestTable(function (err3) {
13+
assert.ifError(err3);
14+
15+
// Violates trigger condition, so it will throw an error on insert
16+
connection.query('INSERT INTO ?? (name) VALUES ?', [table, [['bbbbbbbbbb']]], function (err4) {
17+
// Remove table when insert finishes
18+
connection.query('DROP TABLE IF EXISTS ??', [table], function (err5) {
19+
assert.ifError(err5);
20+
assert.ok(err4);
21+
assert.equal(err4.sqlMessage, message, 'error sqlMessage property is the trigger error message');
22+
connection.end(assert.ifError);
23+
});
24+
});
25+
});
26+
27+
function createTestTable(cb) {
28+
// Must use real table because temporary tables cannot have triggers
29+
connection.query([
30+
'CREATE TABLE ?? (',
31+
'`name` varchar(255)',
32+
') ENGINE=InnoDB DEFAULT CHARSET=utf8'
33+
].join('\n'), [table], function (err1) {
34+
if (err1) {
35+
cb(err1);
36+
} else {
37+
// Create a trigger that throws error when name contains the letter "b"
38+
connection.query([
39+
'CREATE TRIGGER `validateName`',
40+
'BEFORE INSERT ON ??',
41+
'FOR EACH ROW BEGIN',
42+
'IF (NEW.name like \'%b%\') THEN',
43+
'SIGNAL SQLSTATE \'45000\' SET MESSAGE_TEXT = ?;',
44+
'END IF;',
45+
'END;'
46+
].join('\n'), [table, message], function (err2) {
47+
if (!err2) {
48+
cb();
49+
} else {
50+
// Clean up table if create trigger fails
51+
connection.query('DROP TABLE IF EXISTS ??', [table], function () {
52+
cb(err2);
53+
});
54+
}
55+
});
56+
}
57+
});
58+
}
59+
});

0 commit comments

Comments
 (0)