Skip to content

Commit 08c3cf1

Browse files
committed
always pass handshakeInitializationPacket to ChangeUser
If the queue is empty before calling a ChangeUser sequence, the sequence will be started without being passed the handshake packet. This makes sure it gets passed. Additionally, validateEnqueue now has a test that handeshake() was called before changeUser(). fixes mysqljs#374
1 parent 112bc97 commit 08c3cf1

File tree

2 files changed

+34
-5
lines changed

2 files changed

+34
-5
lines changed

lib/protocol/Protocol.js

+14-5
Original file line numberDiff line numberDiff line change
@@ -106,25 +106,34 @@ Protocol.prototype._enqueue = function(sequence) {
106106

107107
if (this._queue.length === 1) {
108108
this._parser.resetPacketNumber();
109-
sequence.start();
109+
if (sequence.constructor == Sequences.ChangeUser) {
110+
sequence.start(this._handshakeInitializationPacket);
111+
} else {
112+
sequence.start();
113+
}
110114
}
111115

112116
return sequence;
113117
};
114118

115119
Protocol.prototype._validateEnqueue = function(sequence) {
116120
var err;
117-
var prefix = 'Cannot enqueue ' + sequence.constructor.name + ' after ';
121+
var prefix = 'Cannot enqueue ' + sequence.constructor.name;
122+
var prefixBefore = prefix + ' before ';
123+
var prefixAfter = prefix + ' after ';
118124

119125
if (this._quitSequence) {
120-
err = new Error(prefix + 'invoking quit.');
126+
err = new Error(prefixAfter + 'invoking quit.');
121127
err.code = 'PROTOCOL_ENQUEUE_AFTER_QUIT';
122128
} else if (this._destroyed) {
123-
err = new Error(prefix + 'being destroyed.');
129+
err = new Error(prefixAfter + 'being destroyed.');
124130
err.code = 'PROTOCOL_ENQUEUE_AFTER_DESTROY';
125131
} else if (this._handshakeSequence && sequence.constructor === Sequences.Handshake) {
126-
err = new Error(prefix + 'already enqueuing a Handshake.');
132+
err = new Error(prefixAfter + 'already enqueuing a Handshake.');
127133
err.code = 'PROTOCOL_ENQUEUE_HANDSHAKE_TWICE';
134+
} else if (!this._handshakeSequence && sequence.constructor === Sequences.ChangeUser) {
135+
err = new Error(prefixBefore + 'a Handshake.');
136+
err.code = 'PROTOCOL_ENQUEUE_BEFORE_HANDSHAKE';
128137
} else {
129138
return true;
130139
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
var common = require('../../common');
2+
var connection = common.createConnection();
3+
var assert = require('assert');
4+
5+
if (common.isTravis()) {
6+
return console.log('skipping - travis mysql does not support this test');
7+
}
8+
9+
connection.query('CREATE DATABASE ' + common.testDatabase, function(err) {
10+
if (err && err.code !== 'ER_DB_CREATE_EXISTS') throw err;
11+
12+
// wait till protocol._queue is empty
13+
setTimeout(function() {
14+
connection.changeUser({database: common.testDatabase}, function(err) {
15+
assert.ifError(err);
16+
});
17+
18+
connection.end();
19+
}, 2000);
20+
});

0 commit comments

Comments
 (0)