try using a user-defined collation function I included in the post. here it
is again.

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;
}


add this code to src/main.c.
in the same file, don't forget to add createCollation() line for "TWOCASE" -
just like the line for "NOCASE".

I tried it on 3.6.2 (works) and 3.6.16 (fails).

thanks for looking into this.

On Wed, Nov 18, 2009 at 9:31 PM, Dan Kennedy <danielk1...@gmail.com> wrote:

>
>
>
> On Nov 19, 2009, at 6:40 AM, Vasu Nori wrote:
>
> > 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
>
> Could not reproduce this with 3.6.20 or 3.6.18 (see below). Do you
> have a C program you can post that demonstrates the problem?
>
> Dan.
>
>
>
> ~/sqlite/tipbld$ ./sqlite3
> SQLite version 3.6.20
> Enter ".help" for instructions
> Enter SQL statements terminated with a ";"
> sqlite> CREATE TABLE foo(i text);
> sqlite> INSERT INTO foo VALUES('a');
> sqlite> INSERT INTO foo VALUES('B');
> sqlite> INSERT INTO foo VALUES('c');
> sqlite> CREATE VIEW foo_view AS SELECT i FROM foo;
> sqlite> SELECT i FROM foo ORDER BY i COLLATE nocase;
> a
> B
> c
> sqlite> SELECT i FROM foo_view ORDER BY i COLLATE nocase;
> a
> B
> c
> sqlite> SELECT i FROM foo ORDER BY i;
> B
> a
> c
> sqlite> SELECT i FROM foo_view ORDER BY i;
> B
> a
> c
> sqlite>
>
>
>
> _______________________________________________
> 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