From 5c60778d258475b5f92377cd600b5a86342212c2 Mon Sep 17 00:00:00 2001 From: Adam Vigneaux Date: Fri, 5 May 2017 10:08:04 -0400 Subject: [PATCH] Add sqlMessage property to Error objects closes #1714 --- Changes.md | 1 + Readme.md | 2 + lib/protocol/sequences/Sequence.js | 4 +- .../connection/test-error-sqlmessage.js | 59 +++++++++++++++++++ 4 files changed, 65 insertions(+), 1 deletion(-) create mode 100644 test/integration/connection/test-error-sqlmessage.js diff --git a/Changes.md b/Changes.md index 63bcc5909..45ed4d773 100644 --- a/Changes.md +++ b/Changes.md @@ -7,6 +7,7 @@ you spot any mistakes. ## HEAD * Add `sql` property to query `Error` objects #1462 #1628 #1629 +* Add `sqlMessage` property to `Error` objects #1714 * Update `bignumber.js` to 4.0.2 * Update `readable-stream` to 2.2.9 * Use `safe-buffer` for improved Buffer API diff --git a/Readme.md b/Readme.md index b6cdde556..9fab849da 100644 --- a/Readme.md +++ b/Readme.md @@ -1117,6 +1117,8 @@ object. Additionally they typically come with two extra properties: * `err.sql`: String, contains the full SQL of the failed query. This can be useful when using a higher level interface like an ORM that is generating the queries. +* `err.sqlMessage`: String, contains the message string that provides a + textual description of the error. Only populated from [MySQL server error][]. [Error]: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error [MySQL server error]: http://dev.mysql.com/doc/refman/5.5/en/error-messages-server.html diff --git a/lib/protocol/sequences/Sequence.js b/lib/protocol/sequences/Sequence.js index 2c8660768..c9789bb49 100644 --- a/lib/protocol/sequences/Sequence.js +++ b/lib/protocol/sequences/Sequence.js @@ -52,7 +52,9 @@ Sequence.prototype._packetToError = function(packet) { var err = new Error(code + ': ' + packet.message); err.code = code; err.errno = packet.errno; - err.sqlState = packet.sqlState; + + err.sqlMessage = packet.message; + err.sqlState = packet.sqlState; return err; }; diff --git a/test/integration/connection/test-error-sqlmessage.js b/test/integration/connection/test-error-sqlmessage.js new file mode 100644 index 000000000..ab1274e49 --- /dev/null +++ b/test/integration/connection/test-error-sqlmessage.js @@ -0,0 +1,59 @@ +var assert = require('assert'); +var common = require('../../common'); + +var table = 'error_message_test'; +var message = 'Name must not contain b.'; + +common.getTestConnection(function (err, connection) { + assert.ifError(err); + + common.useTestDb(connection); + + createTestTable(function (err3) { + assert.ifError(err3); + + // Violates trigger condition, so it will throw an error on insert + connection.query('INSERT INTO ?? (name) VALUES ?', [table, [['bbbbbbbbbb']]], function (err4) { + // Remove table when insert finishes + connection.query('DROP TABLE IF EXISTS ??', [table], function (err5) { + assert.ifError(err5); + assert.ok(err4); + assert.equal(err4.sqlMessage, message, 'error sqlMessage property is the trigger error message'); + connection.end(assert.ifError); + }); + }); + }); + + function createTestTable(cb) { + // Must use real table because temporary tables cannot have triggers + connection.query([ + 'CREATE TABLE ?? (', + '`name` varchar(255)', + ') ENGINE=InnoDB DEFAULT CHARSET=utf8' + ].join('\n'), [table], function (err1) { + if (err1) { + cb(err1); + } else { + // Create a trigger that throws error when name contains the letter "b" + connection.query([ + 'CREATE TRIGGER `validateName`', + 'BEFORE INSERT ON ??', + 'FOR EACH ROW BEGIN', + 'IF (NEW.name like \'%b%\') THEN', + 'SIGNAL SQLSTATE \'45000\' SET MESSAGE_TEXT = ?;', + 'END IF;', + 'END;' + ].join('\n'), [table, message], function (err2) { + if (!err2) { + cb(); + } else { + // Clean up table if create trigger fails + connection.query('DROP TABLE IF EXISTS ??', [table], function () { + cb(err2); + }); + } + }); + } + }); + } +});