When going forward (positive offset), reaching the position just after the last row will make relative() return true (as if the result set was positioned on a row).
When going backward (negative offset), trying to reach a row before the first will never work: the result set will appear "stuck" on the first row.
According to the ResultSet interface's Javadoc (java.sql.ResultSet#relative):
Attempting to move beyond the first/last row in the
result set positions the cursor before/after the
the first/last row.
@return <code>true</code> if the cursor is on a row; <code>false</code> otherwise
So the current behavior is incorrect.
PR with test cases (and hopefully a fix) coming soon.