Ja albo jestem jakiś nawiedzony, albo nie wiem co - wszędzie widzę wpływy Kohany

nie wmówisz mi, że kohanowa klasa Database nie była źródłem natchnienia

Kod przejrzałem i co mi się rzuciło w oczy:
Linia 71.
public function select($columns = '')
Dobrze by było jako domyślną wartość podstawiać '*', a nie ''.
Linia 73.
Czy to przypadkiem nie wywali błędu gdy $column będzie tablicą?
trim() na tablicy?
Linia 389.
public function limit($limit, $offset = '')
Domyślną wartością dla $offset ładniej by wyglądał NULL, a nie pusty ciąg.
Metody
execute(), count(), first() tworzą nowe obiekty
QueryResults wykonując za każdym razem zapytanie. Czyli by je wykonać i pobrać liczbę rekordów trzeba 2x wykonać to samo zapytanie.
Brak linii bo się numerowanie skończyło

:
public function __toString()
{
return (string) $this->expression;
}
Nie rzutuj zwracanej wartości na stringa. Zwróć dokładnie to, co dostałeś. Wstawiasz inta to zwróć inta, a nie string (WHERE id = 1 jest DUŻO szybsze od WHERE id = '1').
* Teraz zauważyłem: numerowanie linii się rozjeżdża z racji różnicy wielkości czcionek :/