|Title:||Sub-select in LIMIT clause may access db without locks.|
|Last Modified:||2012-12-07 19:41:22|
|Version Found In:||trunk|
This problem affects a SELECT statement only if all the following are true:
When SQLite processes a SELECT statement for which the FROM clause contains a single sub-select that is not eligible for the flattening optimization, it creates a co-routine that returns one row each time it is invoked to implement the sub-select.
The vdbe code is:
Because of the way the SQL compiler works, the VerifyCookie routine is currently being invoked the first time the co-routine is invoked, not by the start of the main routine. If the main routine attempts to access the database before the co-routine is invoked, then it is an error. This may occur if either the LIMIT or the OFFSET expression of the main SELECT are themselves sub-selects that access the database. For example:
CREATE TABLE abc(a, b, c); CREATE TABLE def(a, b, c); SELECT * FROM (SELECT * FROM def LIMIT 1 OFFSET 1) LIMIT (SELECT 20 FROM abc)