         
         return QueryImpl(dataset: ErasedTable(name: dataset.name, columns: columns),
                          predicate: predicate,
-                         order: order)
+                         order: order,
+                         limit: nil)
     }
 }
 

    var dataset:DS {get}
    var predicate:Predicate {get}
    var order:Any {get}
}

public protocol Renderable {

    public func zip<B : Table, Q : Query>(with query:Q) -> QueryImpl<Join<DS, B>> where Q.DS == B {
        let join:Join<DS, B> = .cross(left: dataset, right: query.dataset)
        //TODO: glue predicated with AND
        return QueryImpl(dataset: join, predicate: predicate, order: order, limit: limit)
    }
    
    public func zip<B : Table, Q : Query>(with query:Q, _ condition: JoinCondition) -> QueryImpl<Join<DS, B>> where Q.DS == B {
        let join:Join<DS, B> = .inner(left: dataset, right: query.dataset, condition: condition)
        //TODO: glue predicated with AND
        return QueryImpl(dataset: join, predicate: predicate, order: order, limit: limit)
    }
    
    public func zip<B : Table, Q : Query>(with query:Q, outer direction: JoinDirection, _ condition: JoinCondition) -> QueryImpl<Join<DS, B>> where Q.DS == B {
        let join:Join<DS, B> = .outer(left: dataset, right: query.dataset, condition: condition, direction: direction)
        //TODO: glue predicated with AND
        return QueryImpl(dataset: join, predicate: predicate, order: order, limit: limit)
    }
}

