On 03/18/16 00:24 , Keith Medcalf wrote:
> The column data is case sensitive and the comparison is case
> sensitive.  There is no case sensitive index.
>
> You either need (a) to make the column collate nocase (in which case
> any index on the column is also in the same nocase collation and thus
> you do not need it in the create index), or (b) specify that the
> comparison is using collation nocase.

I guess, OP suggested: following queries:

   SELECT * FROM t WHERE a = b;

and

   SELECT * FROM t WHERE (a COLLATE NOCASE = b) AND a = b;

gives same result (if (a = b) is true, then (a COLLATE NOCASE = b) is
true too).

If only NOCASE index is present, SQLite could've converted first query to
second automatically (probably, unless ANALYZE says NOCASE index is
"bad"/unspecific?)

I'm not *totally* sure, but I think this maybe apply to any collation that
obey rules from create_collation.html (`a COLLATE BINARY = b` always
implies `a COLLATE WHATEVER = b`).
Anyway, it is certainly true for SQLite's NOCASE.

Note this works with equality, but does not work with other comparisons:
('b' COLLATE BINARY > 'B') is true, but ('b' COLLATE NOCASE > 'B') is
false, so you cannot use non-BINARY collation to accelerate BINARY
BETWEEN/ORDER/etc.

Of course, it works with BINARY equality and non-BINARY collation
index, but does not work with two arbitrary non-binary collations (you
cannot use `COLLATE foo` index to accelerate `a COLLATE bar = b`).

(BTW, for `BINARY` `GROUP BY`, you, of course, cannot directly use
`COLLATE foobar` index, but it may be still advantageous to walk by this
index, instead of original table order, as it splits large table into
smaller definitely-non-equal subgroups; it may require adding some
[non-trivial] code to sqlite3 to take advantage of this property,
though; not low-hanging fruit).

>> -----Original Message-----
>> From: sqlite-users-bounces at mailinglists.sqlite.org [mailto:sqlite-users-
>> bounces at mailinglists.sqlite.org] On Behalf Of Domingo Alvarez Duarte
>> Sent: Thursday, 17 March, 2016 12:06
>> To: SQLite mailing list
>> Subject: [sqlite] Sqlite do not use index collate nocase
>> 
>> Hello !
>> 
>> In one database I created an index with collate nocase but it seems that
>> sqlite do not recognize it as a candidate index for a select.
>> 
>> Bellow is the schema, the real database has more than a million rows. If I
>> alter the table to include the collation or remove the collation from the
>> index then sqlite does use the index.
>> 
>> I expect an index collate nocase to be valid to queries like the one
>> bellow.
>> 
>> 
>> Cheers !
>> 
>> Schema:
>> 
>> PRAGMA foreign_keys=OFF;
>> BEGIN TRANSACTION;
>> CREATE TABLE 'items' (
>> ??? 'id' integer PRIMARY KEY,
>> ??? 'parent' INTEGER,
>> ??? 'by' text,
>> ??? 'score' integer DEFAULT 0,
>> ??? 'title' text,
>> ??? 'type' text,
>> ??? 'url' text,
>> ??? 'deleted' BOOLEAN DEFAULT 0,
>> ??? 'dead' BOOLEAN DEFAULT 0,
>> ??? 'comment' TEXT DEFAULT null,
>> ??? 'time' integer NOT NULL
>> );
>> CREATE INDEX "items_user_idx" ON "items"("by" COLLATE NOCASE);
>> COMMIT;
>> 
>> explain query plan select * from items? where by='doppp';
>> 
>> SCAN TABLE items

Reply via email to