     @warn_unused_result
     public static func fetchAll(statement: SelectStatement, arguments: StatementArguments? = nil) -> [Row] {
         let sqliteStatement = statement.sqliteStatement
-        let statementRef = Unmanaged.passUnretained(statement)
+        let columnNames = statement.columnNames
         let sequence = statement.fetchSequence(arguments: arguments) {
-            Row(copiedFromStatementRef: statementRef, sqliteStatement: sqliteStatement)
+            Row(copiedFromSQLiteStatement: sqliteStatement, columnNames: columnNames)
         }
         return Array(sequence)
     }


/// See Row.init(copiedFromStatementRef:sqliteStatement:)
private struct StatementCopyRowImpl : RowImpl {
    let databaseValues: [DatabaseValue]
    let columnNames: [String]
    
    init(statementRef: Unmanaged<SelectStatement>, sqliteStatement: SQLiteStatement) {
        let sqliteStatement = sqliteStatement
        self.databaseValues = (0..<sqlite3_column_count(sqliteStatement)).map { DatabaseValue(sqliteStatement: sqliteStatement, index: $0) }
        self.columnNames = statementRef.takeUnretainedValue().columnNames
    }
    
    var count: Int {

    let sqliteStatement: SQLiteStatement
    let lowercaseColumnIndexes: [String: Int]
    
    init(sqliteStatement: SQLiteStatement, statementRef: Unmanaged<SelectStatement>) {
        assert(sqliteStatement != nil)
        self.statementRef = statementRef
        self.sqliteStatement = sqliteStatement
        // Optimize row.value(named: "...")
