Skip to content

Commit 6216f60

Browse files
author
Ricky Ng-Adam
committed
test to reproduce behavior of issue brianc#549
a fix was provided in 5079c1e; test is modeled on query-error-handling-tests.js; test both kill query and disconnection on prepared statement execution; make connection error string message consistent between native and non-native; disable test server-side kill for native as it hangs; sync can cause error to be emitted so we catch that; we also move _ending state before _send is called.
1 parent 1047aeb commit 6216f60

File tree

3 files changed

+87
-3
lines changed

3 files changed

+87
-3
lines changed

lib/client.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -176,13 +176,13 @@ Client.prototype.connect = function(callback) {
176176
con.once('end', function() {
177177
if ( callback ) {
178178
// haven't received a connection message yet !
179-
var err = new Error("Stream unexpectedly ended before getting ready for query execution");
179+
var err = new Error('Connection was ended during query');
180180
callback(err);
181181
callback = null;
182182
return;
183183
}
184184
if(self.activeQuery) {
185-
var disconnectError = new Error('Stream unexpectedly ended during query execution');
185+
var disconnectError = new Error('Connection was ended during query');
186186
self.activeQuery.handleError(disconnectError, con);
187187
self.activeQuery = null;
188188
}

lib/connection.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -285,14 +285,15 @@ Connection.prototype.sync = function() {
285285
this.writer.flush(0);
286286

287287
this.writer.add(emptyBuffer);
288+
this._ending = true;
288289
this._send(0x53);
289290
};
290291

291292
Connection.prototype.end = function() {
292293
//0x58 = 'X'
293294
this.writer.add(emptyBuffer);
294-
this._send(0x58);
295295
this._ending = true;
296+
this._send(0x58);
296297
};
297298

298299
Connection.prototype.describe = function(msg, more) {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
var helper = require(__dirname + '/test-helper');
2+
var util = require('util');
3+
4+
function killIdleQuery(targetQuery) {
5+
var client2 = new Client(helper.args);
6+
var pidColName = 'procpid'
7+
var queryColName = 'current_query';
8+
client2.connect(assert.success(function() {
9+
helper.versionGTE(client2, '9.2.0', assert.success(function(isGreater) {
10+
if(isGreater) {
11+
pidColName = 'pid';
12+
queryColName = 'query';
13+
}
14+
var killIdleQuery = "SELECT " + pidColName + ", (SELECT pg_terminate_backend(" + pidColName + ")) AS killed FROM pg_stat_activity WHERE " + queryColName + " = $1";
15+
client2.query(killIdleQuery, [targetQuery], assert.calls(function(err, res) {
16+
assert.ifError(err);
17+
assert.equal(res.rows.length, 1);
18+
client2.end();
19+
assert.emits(client2, 'end');
20+
}));
21+
}));
22+
}));
23+
}
24+
25+
test('query killed during query execution of prepared statement', function() {
26+
if(helper.args.native) {
27+
return false;
28+
}
29+
var client = new Client(helper.args);
30+
client.connect(assert.success(function() {
31+
var sleepQuery = 'select pg_sleep($1)';
32+
var query1 = client.query({
33+
name: 'sleep query',
34+
text: sleepQuery,
35+
values: [5] },
36+
assert.calls(function(err, result) {
37+
assert.equal(err.message, 'terminating connection due to administrator command');
38+
}));
39+
40+
query1.on('error', function(err) {
41+
assert.fail('Prepared statement should not emit error');
42+
});
43+
44+
query1.on('row', function(row) {
45+
assert.fail('Prepared statement should not emit row');
46+
});
47+
48+
query1.on('end', function(err) {
49+
assert.fail('Prepared statement when executed should not return before being killed');
50+
});
51+
52+
killIdleQuery(sleepQuery);
53+
}));
54+
});
55+
56+
57+
test('client end during query execution of prepared statement', function() {
58+
var client = new Client(helper.args);
59+
client.connect(assert.success(function() {
60+
var sleepQuery = 'select pg_sleep($1)';
61+
var query1 = client.query({
62+
name: 'sleep query',
63+
text: sleepQuery,
64+
values: [5] },
65+
assert.calls(function(err, result) {
66+
assert.equal(err.message, 'Connection was ended during query');
67+
}));
68+
69+
query1.on('error', function(err) {
70+
assert.fail('Prepared statement should not emit error');
71+
});
72+
73+
query1.on('row', function(row) {
74+
assert.fail('Prepared statement should not emit row');
75+
});
76+
77+
query1.on('end', function(err) {
78+
assert.fail('Prepared statement when executed should not return before being killed');
79+
});
80+
81+
client.end();
82+
}));
83+
});

0 commit comments

Comments
 (0)