Dear Igor,

I was reading with great interest your debate with Simon. I have come to 
respect your opinion by reading your comments. I am not a moderator, but trying 
to imply that many SQLite users are on your side reduced your image in my head. 
I left USSR (where such arguments were plenty) and would prefer to stay away 
from it. I block my eyes and ears so that I can not see/hear further arguments 
even if they are correct and even if I would agree with them if I heard them. 
This is my psychological defense.

On the issue. I find Simon's example

        select * from t where x = y;
        select * from t where y = x;

extremely disturbing. One has to remember implied rules to interpret this 
statement and/or to compose it properly. Spelling everything out is long, I 
agree, but makes things clear. However, his example is no different from yours 
because 

select count(*) from t where x = 'a';
select count(*) from t where 'a'=x;

works only thanks to 'a' having not collation attached and SQLite using one 
from x instead. This is exactly the point Simon is making: collations are 
"attached" to values, not to operations. From Simon's description, this 
"attachment" takes place on a higher level in SQLite since deep inside 
(comparisons) it is attached to the operator. Thus SQLite transfers collate 
rules from values to operations somewhere on the high level. This transfer is 
the issue that Simon points out.

Logically, I agree with Simon, collate modifier in table definition describes 
how indices should be built, nothing more. Comparisons, as in these examples 
should specify which collation is to be used and if it is different from one 
used for indexing, then yes, Igor, index can not be used. I believe this is the 
present behavior already.

I do not think Simon asks to change the way collations work. He is asking to 
make clear how they work. I think Simon is asking for clarity so that error 
like "(x collate A) = (y collate B)" can not take place. This is similar to 
JOIN operation, which requires two tables to have common column. Using this 
analogy, I would write:

select * from t WHERE x = y USING NOCASE


Roman
________________________________________
From: sqlite-users-boun...@sqlite.org [sqlite-users-boun...@sqlite.org] on 
behalf of Igor Tandetnik [i...@tandetnik.org]
Sent: Thursday, August 22, 2013 3:53 PM
To: sqlite-users@sqlite.org
Subject: Re: [sqlite] BETWEEN and explicit collation assignment

On 8/22/2013 3:12 PM, Simon Slavin wrote:
>
> On 22 Aug 2013, at 8:04pm, Igor Tandetnik <i...@tandetnik.org> wrote:
>> [snip]
>
> I pretty much agree with everything you wrote there.  But it has nothing to 
> do with my original objection which was the explicit use of a COLLATE 
> operator inside an expression.

If you agree with everything I wrote, then I don't understand what
exactly you find wrong with the explicit use of a COLLATE operator
inside an expression. Is there something that can be done your way but
can't be done the current way? Is there some bad outcome that's possible
the current way but prevented your way? Do you just prefer your (as yet
unspecified) syntax on purely aesthetic grounds?

Let's assume, for the sake of argument, that the case of "(x collate A)
= (y collate B)" and similar instances of mismatched collations are made
an error (I've conceded that it may be a good idea, so there's no reason
to re-tread this ground).
--
Igor Tandetnik

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


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

Reply via email to