Skip to content

Commit dddb196

Browse files
authored
Fix prepare(query:) when no data returned (vapor#123)
* Updated prepared query handling to work when no results are returned * Added test for issue 122
1 parent 7c195a4 commit dddb196

File tree

2 files changed

+27
-4
lines changed

2 files changed

+27
-4
lines changed

Sources/PostgresNIO/Connection/PostgresDatabase+PreparedQuery.swift

+9-4
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ extension PostgresDatabase {
55
let name = "nio-postgres-\(UUID().uuidString)"
66
let prepare = PrepareQueryRequest(query, as: name)
77
return self.send(prepare, logger: self.logger).map { () -> (PreparedQuery) in
8-
let prepared = PreparedQuery(database: self, name: name, rowDescription: prepare.rowLookupTable!)
8+
let prepared = PreparedQuery(database: self, name: name, rowDescription: prepare.rowLookupTable)
99
return prepared
1010
}
1111
}
@@ -25,9 +25,9 @@ extension PostgresDatabase {
2525
public struct PreparedQuery {
2626
let database: PostgresDatabase
2727
let name: String
28-
let rowLookupTable: PostgresRow.LookupTable
28+
let rowLookupTable: PostgresRow.LookupTable?
2929

30-
init(database: PostgresDatabase, name: String, rowDescription: PostgresRow.LookupTable) {
30+
init(database: PostgresDatabase, name: String, rowDescription: PostgresRow.LookupTable?) {
3131
self.database = database
3232
self.name = name
3333
self.rowLookupTable = rowDescription
@@ -74,6 +74,8 @@ private final class PrepareQueryRequest: PostgresRequest {
7474
resultFormat: self.resultFormatCodes
7575
)
7676
return []
77+
case .noData:
78+
return []
7779
case .parseComplete, .parameterDescription:
7880
return []
7981
case .readyForQuery:
@@ -125,7 +127,10 @@ private final class ExecutePreparedQuery: PostgresRequest {
125127
return []
126128
case .dataRow:
127129
let data = try PostgresMessage.DataRow(message: message)
128-
let row = PostgresRow(dataRow: data, lookupTable: query.rowLookupTable)
130+
guard let rowLookupTable = query.rowLookupTable else {
131+
fatalError("row lookup was requested but never set")
132+
}
133+
let row = PostgresRow(dataRow: data, lookupTable: rowLookupTable)
129134
try onRow(row)
130135
return []
131136
case .noData:

Tests/PostgresNIOTests/PostgresNIOTests.swift

+18
Original file line numberDiff line numberDiff line change
@@ -849,6 +849,24 @@ final class PostgresNIOTests: XCTestCase {
849849
XCTAssertEqual(rows[2][0].column("foo")?.string, "c")
850850
}
851851

852+
// https://github.com/vapor/postgres-nio/issues/122
853+
func testPreparedQueryNoResults() throws {
854+
let conn = try PostgresConnection.test(on: eventLoop).wait()
855+
defer { try! conn.close().wait() }
856+
857+
_ = try conn.simpleQuery("DROP TABLE IF EXISTS \"table_no_results\"").wait()
858+
_ = try conn.simpleQuery("""
859+
CREATE TABLE table_no_results (
860+
"id" int8 NOT NULL,
861+
"stringValue" text,
862+
PRIMARY KEY ("id")
863+
);
864+
""").wait()
865+
defer { _ = try! conn.simpleQuery("DROP TABLE \"table_no_results\"").wait() }
866+
867+
_ = try conn.prepare(query: "DELETE FROM \"table_no_results\" WHERE id = $1").wait()
868+
}
869+
852870

853871
// https://github.com/vapor/postgres-nio/issues/71
854872
func testChar1Serialization() throws {

0 commit comments

Comments
 (0)