Skip to content

Commit 1d37934

Browse files
grennisfabianfett
andauthored
Support AWS Redshift queries - SELECT Metadata without row number (vapor#167)
- Allow only one part in metadata response (Support AWS Redshift) Co-authored-by: Fabian Fett <fabianfett@apple.com>
1 parent e18b7f8 commit 1d37934

File tree

2 files changed

+25
-1
lines changed

2 files changed

+25
-1
lines changed

Diff for: Sources/PostgresNIO/PostgresDatabase+Query.swift

+7-1
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,13 @@ public struct PostgresQueryMetadata {
7474
self.command = .init(parts[0])
7575
self.oid = Int(parts[1])
7676
self.rows = Int(parts[2])
77-
case "DELETE", "UPDATE", "SELECT", "MOVE", "FETCH", "COPY":
77+
case "SELECT" where parts.count == 1:
78+
// AWS Redshift does not return the actual row count as defined in the postgres wire spec for SELECT:
79+
// https://www.postgresql.org/docs/13/protocol-message-formats.html in section `CommandComplete`
80+
self.command = "SELECT"
81+
self.oid = nil
82+
self.rows = nil
83+
case "SELECT", "DELETE", "UPDATE", "MOVE", "FETCH", "COPY":
7884
// <cmd> rows
7985
guard parts.count == 2 else {
8086
return nil

Diff for: Tests/PostgresNIOTests/New/PSQLMetadataTests.swift

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import NIO
2+
import XCTest
3+
@testable import PostgresNIO
4+
5+
class PSQLMetadataTests: XCTestCase {
6+
func testSelect() {
7+
XCTAssertEqual(100, PostgresQueryMetadata(string: "SELECT 100")?.rows)
8+
XCTAssertNotNil(PostgresQueryMetadata(string: "SELECT"))
9+
XCTAssertNil(PostgresQueryMetadata(string: "SELECT")?.rows)
10+
XCTAssertNil(PostgresQueryMetadata(string: "SELECT 100 100"))
11+
}
12+
13+
func testUpdate() {
14+
XCTAssertEqual(100, PostgresQueryMetadata(string: "UPDATE 100")?.rows)
15+
XCTAssertNil(PostgresQueryMetadata(string: "UPDATE"))
16+
XCTAssertNil(PostgresQueryMetadata(string: "UPDATE 100 100"))
17+
}
18+
}

0 commit comments

Comments
 (0)