Skip to content

Commit 39de666

Browse files
committed
Don't modify the format of columns in a SimpleQuery
1 parent ffa0dc6 commit 39de666

File tree

3 files changed

+25
-13
lines changed

3 files changed

+25
-13
lines changed

Sources/PostgresNIO/New/Connection State Machine/SimpleQueryStateMachine.swift

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -108,23 +108,14 @@ struct SimpleQueryStateMachine {
108108
return self.setAndFireError(.unexpectedBackendMessage(.rowDescription(rowDescription)))
109109
}
110110

111-
// In Postgres extended queries we always request the response rows to be returned in
112-
// `.binary` format.
113-
// However, this is a simple query and almost all responses will be in text format anyway.
114-
let columns = rowDescription.columns.map { column -> RowDescription.Column in
115-
var column = column
116-
// FIXME: .binary is not valid in a simple-query
117-
column.format = .binary
118-
return column
119-
}
120-
121111
guard !self.isCancelled else {
122112
self.state = .drain(rowDescription.columns)
123113
return .failQuery(queryContext.promise, with: .queryCancelled)
124114
}
125115

126116
self.avoidingStateMachineCoW { state in
127-
state = .rowDescriptionReceived(queryContext, columns)
117+
// In a simple query almost all responses/columns will be in text format.
118+
state = .rowDescriptionReceived(queryContext, rowDescription.columns)
128119
}
129120

130121
return .wait

Tests/IntegrationTests/AsyncTests.swift

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,27 @@ final class AsyncPostgresConnectionTests: XCTestCase {
7979
}
8080
}
8181

82+
func testSelect10kRowsSimpleQuery() async throws {
83+
let eventLoopGroup = MultiThreadedEventLoopGroup(numberOfThreads: 1)
84+
defer { XCTAssertNoThrow(try eventLoopGroup.syncShutdownGracefully()) }
85+
let eventLoop = eventLoopGroup.next()
86+
87+
let start = 1
88+
let end = 10000
89+
90+
try await withTestConnection(on: eventLoop) { connection in
91+
let rows = try await connection.__simpleQuery("SELECT generate_series(\(start), \(end));", logger: .psqlTest)
92+
var counter = 0
93+
for try await row in rows {
94+
let element = try row.decode(Int.self)
95+
XCTAssertEqual(element, counter + 1)
96+
counter += 1
97+
}
98+
99+
XCTAssertEqual(counter, end)
100+
}
101+
}
102+
82103
func testSelectActiveConnection() async throws {
83104
let eventLoopGroup = MultiThreadedEventLoopGroup(numberOfThreads: 1)
84105
defer { XCTAssertNoThrow(try eventLoopGroup.syncShutdownGracefully()) }

Tests/PostgresNIOTests/New/Connection State Machine/SimpleQueryStateMachineTests.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ class SimpleQueryStateMachineTests: XCTestCase {
5959
]
6060
let expected: [RowDescription.Column] = input.map {
6161
.init(name: $0.name, tableOID: $0.tableOID, columnAttributeNumber: $0.columnAttributeNumber, dataType: $0.dataType,
62-
dataTypeSize: $0.dataTypeSize, dataTypeModifier: $0.dataTypeModifier, format: .binary)
62+
dataTypeSize: $0.dataTypeSize, dataTypeModifier: $0.dataTypeModifier, format: .text)
6363
}
6464

6565
XCTAssertEqual(state.rowDescriptionReceived(.init(columns: input)), .wait)
@@ -202,7 +202,7 @@ class SimpleQueryStateMachineTests: XCTestCase {
202202
]
203203
let expected: [RowDescription.Column] = input.map {
204204
.init(name: $0.name, tableOID: $0.tableOID, columnAttributeNumber: $0.columnAttributeNumber, dataType: $0.dataType,
205-
dataTypeSize: $0.dataTypeSize, dataTypeModifier: $0.dataTypeModifier, format: .binary)
205+
dataTypeSize: $0.dataTypeSize, dataTypeModifier: $0.dataTypeModifier, format: .text)
206206
}
207207

208208
XCTAssertEqual(state.rowDescriptionReceived(.init(columns: input)), .wait)

0 commit comments

Comments
 (0)