Skip to content

Commit 8e5b40d

Browse files
committed
use Int64 for date math, fixes vapor#53
1 parent 9b488cd commit 8e5b40d

File tree

2 files changed

+25
-2
lines changed

2 files changed

+25
-2
lines changed

Sources/PostgreSQL/Data/PostgreSQLData+Date.swift

+2-2
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ extension Date: PostgreSQLDataConvertible {
1818
case .time, .timetz: throw PostgreSQLError.decode(Date.self, from: data)
1919
case .date:
2020
let days = value.as(Int32.self, default: 0).bigEndian
21-
let seconds = days * _secondsInDay
21+
let seconds = Int64(days) * _secondsInDay
2222
return Date(timeInterval: Double(seconds), since: _psqlDateStart)
2323
default: throw PostgreSQLError.decode(Date.self, from: data)
2424
}
@@ -35,7 +35,7 @@ extension Date: PostgreSQLDataConvertible {
3535
// MARK: Private
3636

3737
private let _microsecondsPerSecond: Int64 = 1_000_000
38-
private let _secondsInDay: Int32 = 24 * 60 * 60
38+
private let _secondsInDay: Int64 = 24 * 60 * 60
3939
private let _psqlDateStart = Date(timeIntervalSince1970: 946_684_800) // values are stored as seconds before or after midnight 2000-01-01
4040

4141
private extension String {

Tests/PostgreSQLTests/PostgreSQLConnectionTests.swift

+23
Original file line numberDiff line numberDiff line change
@@ -546,6 +546,28 @@ class PostgreSQLConnectionTests: XCTestCase {
546546
.run(decoding: Planet.self).wait()
547547
XCTAssertNotEqual(planetsA, planetsB)
548548
}
549+
550+
// https://github.com/vapor/postgresql/issues/53
551+
func testInvalidDate() throws {
552+
let conn = try PostgreSQLConnection.makeTest(transport: .cleartext)
553+
_ = try conn.simpleQuery(.createTable(.init(
554+
name: "timetest",
555+
columns: [.column("date", .date)]
556+
))).wait()
557+
defer { _ = try? conn.simpleQuery(.drop(table: "timetest")).wait() }
558+
559+
struct Time: PostgreSQLTable, Equatable {
560+
static let postgreSQLTable = "timetest"
561+
var date: Date
562+
}
563+
564+
_ = try conn.simpleQuery(.raw(query: "INSERT INTO timetest (date) VALUES ('0214-02-05')", binds: [])).wait()
565+
let fetch: [Time] = try conn.select().all().from(Time.self).run(decoding: Time.self).wait()
566+
switch fetch.count {
567+
case 1: XCTAssertEqual(fetch[0].date.timeIntervalSince1970, -55410998400)
568+
default: XCTFail("invalid row count")
569+
}
570+
}
549571

550572
static var allTests = [
551573
("testVersion", testVersion),
@@ -566,6 +588,7 @@ class PostgreSQLConnectionTests: XCTestCase {
566588
("testListen", testListen),
567589
("testSum", testSum),
568590
("testOrderBy", testOrderBy),
591+
("testInvalidDate", testInvalidDate),
569592
]
570593
}
571594

0 commit comments

Comments
 (0)