Protocolgrdb 7.3.0GRDB
DatabaseAggregate
The protocol for custom SQLite aggregates.
protocol DatabaseAggregate
Browse conforming typesFor example:
struct MySum : DatabaseAggregate {
var sum: Int = 0
mutating func step(_ dbValues: [DatabaseValue]) {
if let int = Int.fromDatabaseValue(dbValues[0]) {
sum += int
}
}
func finalize() -> (any DatabaseValueConvertible)? {
return sum
}
}
let dbQueue = try DatabaseQueue()
let mySum = DatabaseFunction("mySum", argumentCount: 1, aggregate: MySum.self)
try dbQueue.write { db in
db.add(function: mySum)
try db.execute(sql: "CREATE TABLE test(i)")
try db.execute(sql: "INSERT INTO test(i) VALUES (1)")
try db.execute(sql: "INSERT INTO test(i) VALUES (2)")
try Int.fetchOne(db, sql: "SELECT mysum(i) FROM test")! // 3
}