Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit e564bba

Browse files
fix(pg): fix binary format buffer handling
- change Parser.parseDataRowMessage() to produce a buffer slice instead of a string - change Result.parseRow() and _parseRowAsArray() to create the string from the buffer slice if not in binary mode
1 parent 1a25d12 commit e564bba

File tree

4 files changed

+31
-5
lines changed

4 files changed

+31
-5
lines changed

‎packages/pg-protocol/src/inbound-parser.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -301,7 +301,7 @@ describe('PgPacketStream', function () {
301301
testForMessage(oneFieldBuf, {
302302
name: 'dataRow',
303303
fieldCount: 1,
304-
fields: ['test'],
304+
fields: [Buffer.from('test')],
305305
})
306306
})
307307
})
@@ -524,7 +524,7 @@ describe('PgPacketStream', function () {
524524
name: 'dataRow',
525525
fieldCount: 1,
526526
length: 11,
527-
fields: ['!'],
527+
fields: [Buffer.from('!')],
528528
})
529529
assert.equal(messages[0].fields[0], '!')
530530
assert.deepEqual(messages[1], {

‎packages/pg-protocol/src/parser.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -284,7 +284,7 @@ export class Parser {
284284
for (let i = 0; i < fieldCount; i++) {
285285
const len = this.reader.int32()
286286
// a -1 for length means the value of the field is null
287-
fields[i] = len === -1 ? null : this.reader.string(len)
287+
fields[i] = len === -1 ? null : this.reader.bytes(len)
288288
}
289289
return new DataRowMessage(length, fields)
290290
}

‎packages/pg/lib/result.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,8 @@ class Result {
5252
for (let i = 0, len = rowData.length; i < len; i++) {
5353
const rawValue = rowData[i]
5454
if (rawValue !== null) {
55-
row[i] = this._parsers[i](rawValue)
55+
const v = this.fields[i].format !== 'binary' ? rawValue.toString('utf8') : rawValue
56+
row[i] = this._parsers[i](v)
5657
} else {
5758
row[i] = null
5859
}
@@ -66,7 +67,7 @@ class Result {
6667
const rawValue = rowData[i]
6768
const field = this.fields[i].name
6869
if (rawValue !== null) {
69-
const v = this.fields[i].format === 'binary' ? Buffer.from(rawValue) : rawValue
70+
const v = this.fields[i].format !== 'binary' ? rawValue.toString('utf8') : rawValue
7071
row[field] = this._parsers[i](v)
7172
} else {
7273
row[field] = null
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
const helper = require('../test-helper')
2+
const assert = require('assert')
3+
4+
const suite = new helper.Suite()
5+
6+
suite.testAsync('binary format mode parses integers correctly', async () => {
7+
const client = new helper.pg.Client()
8+
await client.connect()
9+
10+
const r1 = await client.query({
11+
text: 'SELECT 1::int as a, 1000::int as b, 1ドル::int as c',
12+
values: [3000],
13+
binary: false,
14+
})
15+
assert.deepEqual([1, 1000, 3000], [r1.rows[0].a, r1.rows[0].b, r1.rows[0].c])
16+
17+
const r2 = await client.query({
18+
text: 'SELECT 1::int as a, 1000::int as b, 1ドル::int as c',
19+
values: [3000],
20+
binary: true,
21+
})
22+
assert.deepEqual([1, 1000, 3000], [r2.rows[0].a, r2.rows[0].b, r2.rows[0].c])
23+
24+
await client.end()
25+
})

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /