sql: refactor VDBE opcode OP_OffsetLimit
OP_OffsetLimit instruction calculates sum of OFFSET and LIMIT values when they are present. This sum serves as a counter of entries to be inserted to temporary space during VDBE execution. Consider query like: SELECT * FROM t ORDER BY x LIMIT 5 OFFSET 2; To perform ordering alongside with applying limit and offset restrictions, first 7 (5 + 2) entries are inserted into temporary space. They are sorted and then first two tuples are skipped according to offset clause. The rest tuples from temporary space get to result set. When sum of LIMIT and OFFSET values is big enough to cause integer overflow, we can't apply this approach. Previously, counter was simply set to -1 which means that all entries from base table will be transferred to ephemeral space. As a result, LIMIT clause was ignored and the result of query would be incorrect. Motivation for this obviously wrong step was that to perform query with such huge limit and offset values too many time is required (like years). What is more, ephemeral spaces support auto-generated IDs in the range up to 2^32, so there's even no opportunity to process such queries in theory. Nevertheless, to make code cleaner let's fix this tricky place and just raise an overflow error if result of addition exceeds integer range. This patch fixes obsolete comments saying that in case of overflow execution won't stop; now limit and offset counter are always >= 0, so removed redundant branching.
Loading
Please register or sign in to comment