I am noticing a behavior change in processing of  "collate" from 3.6.2 to
versions 3.6.16 & beyond.
it *could* make sense but I find some inconsistencies.. let me explain.

1. create a simple collation function which compares two input strings based
on just the second char (code is at the end of this email)
2. call this function "twocase"
3. create a table and populate with this sample data

sqlite>create table foo(i text);
sqlite>insert into foo values("a2");
sqlite>insert into foo values("b1");
sqlite>insert into foo values("c5");
sqlite>insert into foo values("d4");
sqlite>insert into foo values("e3");

4.  select from the table using orderby and collate

sqlite> select * from foo order by i collate twocase;

b1

a2
e3
d4
c5

5. notice that the above are sorted on the 2nd char
6. create a view on the above table and select from the view with order by
and collate

sqlite>create view foo_view as select i from foo;
sqlite>select * from foo_view;
sqlite>select * from foo_view order by i collate twocase;
a2
b1
c5
d4
e3

7. collate "twocase" func DOES NOT get called in the above and the result
ordering is not the same as the data in step#4
8.  the above "bug" doesn't appear if I declare the the original table like
this

create table foo(i text collate twocase);   <-- column has collation
declaration

9. both the following sql statements return data collated by "twocase" func

select * from foo_view order by i collate twocase;
select * from foo_view order by i ;


this almost makes sense because collation is tied to the columns.

is this an intentional behavior change from 3.6.2 to 3.6.16?
*this is not backwards compatible change though. apps based on 3.6.2 and
earlier now break when they run into this.*

twocase collate func code is here

static int  twocaseCollatingFunc(void *NotUsed, int n1, const void *v1, int
n2, const void *v2) {
  if (n1 < 2 || n2 < 2) {
    printf ("lengths are smaller than 2: n1 = %d, n2 = %d\n", n1, n2);
    return 0;
  }
  char c1 = ((char *)v1)[1];
  char c2 = ((char *)v2)[1];
  int rslt;
  if (c1 < c2)
    rslt = -1;
  else if (c1 > c2)
    rslt = 1;
  else rslt = 0;
  return rslt;
}
_______________________________________________
sqlite-users mailing list
sqlite-users@sqlite.org
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to