Skip to content

Commit 9fbcf17

Browse files
authored
read dataTypeID and tableID as unsigned uint (#3347)
* read dataTypeID and tableID as unsigned uint this is causing issues in other projects, like sequelize/sequelize#15466 * added tests for oids larger than 2^31
1 parent 373093d commit 9fbcf17

File tree

3 files changed

+36
-2
lines changed

3 files changed

+36
-2
lines changed

packages/pg-protocol/src/buffer-reader.ts

+6
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,12 @@ export class BufferReader {
3131
return result
3232
}
3333

34+
public uint32(): number {
35+
const result = this.buffer.readUInt32BE(this.offset)
36+
this.offset += 4
37+
return result
38+
}
39+
3440
public string(length: number): string {
3541
const result = this.buffer.toString(this.encoding, this.offset, this.offset + length)
3642
this.offset += length

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

+28
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,17 @@ var twoRowBuf = buffers.rowDescription([
3939
},
4040
])
4141

42+
var rowWithBigOids = {
43+
name: 'bigoid',
44+
tableID: 3000000001,
45+
attributeNumber: 2,
46+
dataTypeID: 3000000003,
47+
dataTypeSize: 4,
48+
typeModifier: 5,
49+
formatCode: 0,
50+
}
51+
var bigOidDescBuff = buffers.rowDescription([rowWithBigOids])
52+
4253
var emptyRowFieldBuf = new BufferList().addInt16(0).join(true, 'D')
4354

4455
var emptyRowFieldBuf = buffers.dataRow([])
@@ -132,6 +143,22 @@ var expectedTwoRowMessage = {
132143
},
133144
],
134145
}
146+
var expectedBigOidMessage = {
147+
name: 'rowDescription',
148+
length: 31,
149+
fieldCount: 1,
150+
fields: [
151+
{
152+
name: 'bigoid',
153+
tableID: 3000000001,
154+
columnID: 2,
155+
dataTypeID: 3000000003,
156+
dataTypeSize: 4,
157+
dataTypeModifier: 5,
158+
format: 'text',
159+
},
160+
],
161+
}
135162

136163
var emptyParameterDescriptionBuffer = new BufferList()
137164
.addInt16(0) // number of parameters
@@ -261,6 +288,7 @@ describe('PgPacketStream', function () {
261288
testForMessage(emptyRowDescriptionBuffer, expectedEmptyRowDescriptionMessage)
262289
testForMessage(oneRowDescBuff, expectedOneRowMessage)
263290
testForMessage(twoRowBuf, expectedTwoRowMessage)
291+
testForMessage(bigOidDescBuff, expectedBigOidMessage)
264292
})
265293

266294
describe('parameterDescription messages', function () {

packages/pg-protocol/src/parser.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -258,9 +258,9 @@ export class Parser {
258258

259259
private parseField(): Field {
260260
const name = this.reader.cstring()
261-
const tableID = this.reader.int32()
261+
const tableID = this.reader.uint32()
262262
const columnID = this.reader.int16()
263-
const dataTypeID = this.reader.int32()
263+
const dataTypeID = this.reader.uint32()
264264
const dataTypeSize = this.reader.int16()
265265
const dataTypeModifier = this.reader.int32()
266266
const mode = this.reader.int16() === 0 ? 'text' : 'binary'

0 commit comments

Comments
 (0)