Re: [sqlite] glob and like not using index in newest sqlite

2010-11-26 Thread Richard Hipp
On Fri, Nov 26, 2010 at 6:23 AM, Spiros Ioannou wrote:

> Hello, I recently updated from 3.4.2 to 3.7.3 and the glob and like
> operators are now not using the indexes.
> My table "dict" has a column named "word" without defined type, containing
> utf-8 words. The index is:
> CREATE INDEX wordidx on dicts (word);
>
> explain query plan SELECT * from dicts where word like '%'  limit
> 1;
> 0|0|TABLE dicts
>
>
> sqlite> explain query plan SELECT * from dicts where word glob '*'
> limit 1;
> 0|0|TABLE dicts
>
> BUT:
> sqlite> explain query plan SELECT * from dicts where word > ''  limit
> 1;
> 0|0|TABLE dicts WITH INDEX wordidx
>
> using collate binary before the "limit" in glob or like doesn't help. using
> PRAGMA case_sensitive_like = 0/1 didn't help either.
> Is this a bug?
>

This is not a bug but a bug fix.  Version 3.4.2 was wrong.  Version 3.7.3 is
right.  The LIKE/GLOB indexing optimization can only be (safely) applied to
a column that has TEXT affinity.  Using the LIKE/GLOB indexing optimization
on any other column can result in an incorrect answer.  See

http://www.sqlite.org/cvstrac/tktview?tn=3901

Your fix is to declare column "word" to have type TEXT.




> ___
> sqlite-users mailing list
> sqlite-users@sqlite.org
> http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
>



-- 
D. Richard Hipp
d...@sqlite.org
___
sqlite-users mailing list
sqlite-users@sqlite.org
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users


[sqlite] glob and like not using index in newest sqlite

2010-11-26 Thread Spiros Ioannou
Hello, I recently updated from 3.4.2 to 3.7.3 and the glob and like
operators are now not using the indexes.
My table "dict" has a column named "word" without defined type, containing
utf-8 words. The index is:
CREATE INDEX wordidx on dicts (word);

explain query plan SELECT * from dicts where word like '%'  limit
1;
0|0|TABLE dicts


sqlite> explain query plan SELECT * from dicts where word glob '*'
limit 1;
0|0|TABLE dicts

BUT:
sqlite> explain query plan SELECT * from dicts where word > ''  limit
1;
0|0|TABLE dicts WITH INDEX wordidx

using collate binary before the "limit" in glob or like doesn't help. using
PRAGMA case_sensitive_like = 0/1 didn't help either.
Is this a bug?
___
sqlite-users mailing list
sqlite-users@sqlite.org
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users