On 3/6/15, Dominique Devienne <ddevienne at gmail.com> wrote: > > Sure. But SQLite knows whether LIKE is overriden by the application or not, > so shouldn't it only hide LIKE from the virtual table when it detects it, > instead of wholesale preventing the vtable from optimizing the "normal > semantic" LIKE case?
It's more complicated than that. The optimization in question is to convert WHERE clause terms of the form: xyz LIKE 'abc%' Into: xyz>='abc' AND xyz<'abd' But this optimization is only valid if (1) xyz is a text value, not a numeric value and (2) xyz has the "nocase" collating sequence. We typically do not know either for a virtual table. You might know (2) if the expression has an explicit COLLATE clause: xyz LIKE 'abc%' COLLATE nocase But SQLite does not have a mechanism whereby a virtual table can tell the query planner that the value of a column will never be numeric. Yikes! Actually (1) cannot be determined for normal (non-virtual) tables either because the value could be a BLOB even if the column affinity is TEXT. And so the current LIKE optimization is not valid *ever*. See ticket https://www.sqlite.org/src/tktview/05f43be8fdda9f I don't yet know how we will fix this... -- D. Richard Hipp drh at sqlite.org