xref: /sqlite-3.40.0/test/collate4.test (revision b1d607de)
10202b29eSdanielk1977#
2dc1bdc4fSdanielk1977# 2001 September 15
30202b29eSdanielk1977#
4dc1bdc4fSdanielk1977# The author disclaims copyright to this source code.  In place of
5dc1bdc4fSdanielk1977# a legal notice, here is a blessing:
6dc1bdc4fSdanielk1977#
7dc1bdc4fSdanielk1977#    May you do good and not evil.
8dc1bdc4fSdanielk1977#    May you find forgiveness for yourself and forgive others.
9dc1bdc4fSdanielk1977#    May you share freely, never taking more than you give.
10dc1bdc4fSdanielk1977#
11dc1bdc4fSdanielk1977#***********************************************************************
120202b29eSdanielk1977# This file implements regression tests for SQLite library.  The
13dc1bdc4fSdanielk1977# focus of this script is page cache subsystem.
140202b29eSdanielk1977#
15a9d1ccb9Sdanielk1977# $Id: collate4.test,v 1.9 2008/01/05 17:39:30 danielk1977 Exp $
160202b29eSdanielk1977
170202b29eSdanielk1977set testdir [file dirname $argv0]
180202b29eSdanielk1977source $testdir/tester.tcl
190202b29eSdanielk1977
200202b29eSdanielk1977db collate TEXT text_collate
210202b29eSdanielk1977proc text_collate {a b} {
220202b29eSdanielk1977  return [string compare $a $b]
230202b29eSdanielk1977}
240202b29eSdanielk1977
250202b29eSdanielk1977# Do an SQL statement.  Append the search count to the end of the result.
260202b29eSdanielk1977#
270202b29eSdanielk1977proc count sql {
280202b29eSdanielk1977  set ::sqlite_search_count 0
290202b29eSdanielk1977  return [concat [execsql $sql] $::sqlite_search_count]
300202b29eSdanielk1977}
310202b29eSdanielk1977
320202b29eSdanielk1977# This procedure executes the SQL.  Then it checks the generated program
330202b29eSdanielk1977# for the SQL and appends a "nosort" to the result if the program contains the
340202b29eSdanielk1977# SortCallback opcode.  If the program does not contain the SortCallback
350202b29eSdanielk1977# opcode it appends "sort"
360202b29eSdanielk1977#
370202b29eSdanielk1977proc cksort {sql} {
386bf89570Sdrh  set ::sqlite_sort_count 0
390202b29eSdanielk1977  set data [execsql $sql]
406bf89570Sdrh  if {$::sqlite_sort_count} {set x sort} {set x nosort}
410202b29eSdanielk1977  lappend data $x
420202b29eSdanielk1977  return $data
430202b29eSdanielk1977}
440202b29eSdanielk1977
450202b29eSdanielk1977#
460202b29eSdanielk1977# Test cases are organized roughly as follows:
470202b29eSdanielk1977#
480202b29eSdanielk1977# collate4-1.*      ORDER BY.
490202b29eSdanielk1977# collate4-2.*      WHERE clauses.
500202b29eSdanielk1977# collate4-3.*      constraints (primary key, unique).
510202b29eSdanielk1977# collate4-4.*      simple min() or max() queries.
520202b29eSdanielk1977# collate4-5.*      REINDEX command
530202b29eSdanielk1977# collate4-6.*      INTEGER PRIMARY KEY indices.
540202b29eSdanielk1977#
550202b29eSdanielk1977
560202b29eSdanielk1977#
570202b29eSdanielk1977# These tests - collate4-1.* - check that indices are correctly
580202b29eSdanielk1977# selected or not selected to implement ORDER BY clauses when
590202b29eSdanielk1977# user defined collation sequences are involved.
600202b29eSdanielk1977#
610202b29eSdanielk1977# Because these tests also exercise all the different ways indices
620202b29eSdanielk1977# can be created, they also serve to verify that indices are correctly
6348864df9Smistachkin# initialized with user-defined collation sequences when they are
640202b29eSdanielk1977# created.
650202b29eSdanielk1977#
660202b29eSdanielk1977# Tests named collate4-1.1.* use indices with a single column. Tests
670202b29eSdanielk1977# collate4-1.2.* use indices with two columns.
680202b29eSdanielk1977#
690202b29eSdanielk1977do_test collate4-1.1.0 {
700202b29eSdanielk1977  execsql {
710202b29eSdanielk1977    CREATE TABLE collate4t1(a COLLATE NOCASE, b COLLATE TEXT);
720202b29eSdanielk1977    INSERT INTO collate4t1 VALUES( 'a', 'a' );
730202b29eSdanielk1977    INSERT INTO collate4t1 VALUES( 'b', 'b' );
740202b29eSdanielk1977    INSERT INTO collate4t1 VALUES( NULL, NULL );
750202b29eSdanielk1977    INSERT INTO collate4t1 VALUES( 'B', 'B' );
760202b29eSdanielk1977    INSERT INTO collate4t1 VALUES( 'A', 'A' );
770202b29eSdanielk1977    CREATE INDEX collate4i1 ON collate4t1(a);
780202b29eSdanielk1977    CREATE INDEX collate4i2 ON collate4t1(b);
790202b29eSdanielk1977  }
800202b29eSdanielk1977} {}
810202b29eSdanielk1977do_test collate4-1.1.1 {
820202b29eSdanielk1977  cksort {SELECT a FROM collate4t1 ORDER BY a}
830202b29eSdanielk1977} {{} a A b B nosort}
840202b29eSdanielk1977do_test collate4-1.1.2 {
850202b29eSdanielk1977  cksort {SELECT a FROM collate4t1 ORDER BY a COLLATE NOCASE}
860202b29eSdanielk1977} {{} a A b B nosort}
870202b29eSdanielk1977do_test collate4-1.1.3 {
880202b29eSdanielk1977  cksort {SELECT a FROM collate4t1 ORDER BY a COLLATE TEXT}
890202b29eSdanielk1977} {{} A B a b sort}
900202b29eSdanielk1977do_test collate4-1.1.4 {
910202b29eSdanielk1977  cksort {SELECT b FROM collate4t1 ORDER BY b}
920202b29eSdanielk1977} {{} A B a b nosort}
930202b29eSdanielk1977do_test collate4-1.1.5 {
940202b29eSdanielk1977  cksort {SELECT b FROM collate4t1 ORDER BY b COLLATE TEXT}
950202b29eSdanielk1977} {{} A B a b nosort}
960202b29eSdanielk1977do_test collate4-1.1.6 {
973f4d1d1bSdrh  cksort {SELECT b FROM collate4t1 ORDER BY b COLLATE NOCASE, rowid}
98495c09a4Sdrh} {{} a A b B sort}
990202b29eSdanielk1977
1000202b29eSdanielk1977do_test collate4-1.1.7 {
1010202b29eSdanielk1977  execsql {
1020202b29eSdanielk1977    CREATE TABLE collate4t2(
1030202b29eSdanielk1977      a PRIMARY KEY COLLATE NOCASE,
1040202b29eSdanielk1977      b UNIQUE COLLATE TEXT
1050202b29eSdanielk1977    );
1060202b29eSdanielk1977    INSERT INTO collate4t2 VALUES( 'a', 'a' );
1070202b29eSdanielk1977    INSERT INTO collate4t2 VALUES( NULL, NULL );
1080202b29eSdanielk1977    INSERT INTO collate4t2 VALUES( 'B', 'B' );
1090202b29eSdanielk1977  }
1100202b29eSdanielk1977} {}
1110202b29eSdanielk1977do_test collate4-1.1.8 {
1120202b29eSdanielk1977  cksort {SELECT a FROM collate4t2 ORDER BY a}
1130202b29eSdanielk1977} {{} a B nosort}
1140202b29eSdanielk1977do_test collate4-1.1.9 {
1150202b29eSdanielk1977  cksort {SELECT a FROM collate4t2 ORDER BY a COLLATE NOCASE}
1160202b29eSdanielk1977} {{} a B nosort}
1170202b29eSdanielk1977do_test collate4-1.1.10 {
1180202b29eSdanielk1977  cksort {SELECT a FROM collate4t2 ORDER BY a COLLATE TEXT}
1190202b29eSdanielk1977} {{} B a sort}
1200202b29eSdanielk1977do_test collate4-1.1.11 {
1210202b29eSdanielk1977  cksort {SELECT b FROM collate4t2 ORDER BY b}
1220202b29eSdanielk1977} {{} B a nosort}
1230202b29eSdanielk1977do_test collate4-1.1.12 {
1240202b29eSdanielk1977  cksort {SELECT b FROM collate4t2 ORDER BY b COLLATE TEXT}
1250202b29eSdanielk1977} {{} B a nosort}
1260202b29eSdanielk1977do_test collate4-1.1.13 {
1270202b29eSdanielk1977  cksort {SELECT b FROM collate4t2 ORDER BY b COLLATE NOCASE}
1280202b29eSdanielk1977} {{} a B sort}
1290202b29eSdanielk1977
1300202b29eSdanielk1977do_test collate4-1.1.14 {
1310202b29eSdanielk1977  execsql {
1320202b29eSdanielk1977    CREATE TABLE collate4t3(
1330202b29eSdanielk1977      b COLLATE TEXT,
1340202b29eSdanielk1977      a COLLATE NOCASE,
1350202b29eSdanielk1977      UNIQUE(a), PRIMARY KEY(b)
1360202b29eSdanielk1977    );
1370202b29eSdanielk1977    INSERT INTO collate4t3 VALUES( 'a', 'a' );
1380202b29eSdanielk1977    INSERT INTO collate4t3 VALUES( NULL, NULL );
1390202b29eSdanielk1977    INSERT INTO collate4t3 VALUES( 'B', 'B' );
1400202b29eSdanielk1977  }
1410202b29eSdanielk1977} {}
1420202b29eSdanielk1977do_test collate4-1.1.15 {
1430202b29eSdanielk1977  cksort {SELECT a FROM collate4t3 ORDER BY a}
1440202b29eSdanielk1977} {{} a B nosort}
1450202b29eSdanielk1977do_test collate4-1.1.16 {
1460202b29eSdanielk1977  cksort {SELECT a FROM collate4t3 ORDER BY a COLLATE NOCASE}
1470202b29eSdanielk1977} {{} a B nosort}
1480202b29eSdanielk1977do_test collate4-1.1.17 {
1490202b29eSdanielk1977  cksort {SELECT a FROM collate4t3 ORDER BY a COLLATE TEXT}
1500202b29eSdanielk1977} {{} B a sort}
1510202b29eSdanielk1977do_test collate4-1.1.18 {
1520202b29eSdanielk1977  cksort {SELECT b FROM collate4t3 ORDER BY b}
1530202b29eSdanielk1977} {{} B a nosort}
1540202b29eSdanielk1977do_test collate4-1.1.19 {
1550202b29eSdanielk1977  cksort {SELECT b FROM collate4t3 ORDER BY b COLLATE TEXT}
1560202b29eSdanielk1977} {{} B a nosort}
1570202b29eSdanielk1977do_test collate4-1.1.20 {
1580202b29eSdanielk1977  cksort {SELECT b FROM collate4t3 ORDER BY b COLLATE NOCASE}
1590202b29eSdanielk1977} {{} a B sort}
1600202b29eSdanielk1977
1610202b29eSdanielk1977do_test collate4-1.1.21 {
1620202b29eSdanielk1977  execsql {
1630202b29eSdanielk1977    CREATE TABLE collate4t4(a COLLATE NOCASE, b COLLATE TEXT);
1640202b29eSdanielk1977    INSERT INTO collate4t4 VALUES( 'a', 'a' );
1650202b29eSdanielk1977    INSERT INTO collate4t4 VALUES( 'b', 'b' );
1660202b29eSdanielk1977    INSERT INTO collate4t4 VALUES( NULL, NULL );
1670202b29eSdanielk1977    INSERT INTO collate4t4 VALUES( 'B', 'B' );
1680202b29eSdanielk1977    INSERT INTO collate4t4 VALUES( 'A', 'A' );
1690202b29eSdanielk1977    CREATE INDEX collate4i3 ON collate4t4(a COLLATE TEXT);
1700202b29eSdanielk1977    CREATE INDEX collate4i4 ON collate4t4(b COLLATE NOCASE);
1710202b29eSdanielk1977  }
1720202b29eSdanielk1977} {}
1730202b29eSdanielk1977do_test collate4-1.1.22 {
1743f4d1d1bSdrh  cksort {SELECT a FROM collate4t4 ORDER BY a, rowid}
175495c09a4Sdrh} {{} a A b B sort}
1760202b29eSdanielk1977do_test collate4-1.1.23 {
1773f4d1d1bSdrh  cksort {SELECT a FROM collate4t4 ORDER BY a COLLATE NOCASE, rowid}
178495c09a4Sdrh} {{} a A b B sort}
1790202b29eSdanielk1977do_test collate4-1.1.24 {
1803f4d1d1bSdrh  cksort {SELECT a FROM collate4t4 ORDER BY a COLLATE TEXT, rowid}
1810202b29eSdanielk1977} {{} A B a b nosort}
1820202b29eSdanielk1977do_test collate4-1.1.25 {
1830202b29eSdanielk1977  cksort {SELECT b FROM collate4t4 ORDER BY b}
1840202b29eSdanielk1977} {{} A B a b sort}
1850202b29eSdanielk1977do_test collate4-1.1.26 {
1860202b29eSdanielk1977  cksort {SELECT b FROM collate4t4 ORDER BY b COLLATE TEXT}
1870202b29eSdanielk1977} {{} A B a b sort}
1880202b29eSdanielk1977do_test collate4-1.1.27 {
1890202b29eSdanielk1977  cksort {SELECT b FROM collate4t4 ORDER BY b COLLATE NOCASE}
1900202b29eSdanielk1977} {{} a A b B nosort}
1910202b29eSdanielk1977
1920202b29eSdanielk1977do_test collate4-1.1.30 {
1930202b29eSdanielk1977  execsql {
1940202b29eSdanielk1977    DROP TABLE collate4t1;
1950202b29eSdanielk1977    DROP TABLE collate4t2;
1960202b29eSdanielk1977    DROP TABLE collate4t3;
1970202b29eSdanielk1977    DROP TABLE collate4t4;
1980202b29eSdanielk1977  }
1990202b29eSdanielk1977} {}
2000202b29eSdanielk1977
2010202b29eSdanielk1977do_test collate4-1.2.0 {
2020202b29eSdanielk1977  execsql {
2030202b29eSdanielk1977    CREATE TABLE collate4t1(a COLLATE NOCASE, b COLLATE TEXT);
2040202b29eSdanielk1977    INSERT INTO collate4t1 VALUES( 'a', 'a' );
2050202b29eSdanielk1977    INSERT INTO collate4t1 VALUES( 'b', 'b' );
2060202b29eSdanielk1977    INSERT INTO collate4t1 VALUES( NULL, NULL );
2070202b29eSdanielk1977    INSERT INTO collate4t1 VALUES( 'B', 'B' );
2080202b29eSdanielk1977    INSERT INTO collate4t1 VALUES( 'A', 'A' );
2090202b29eSdanielk1977    CREATE INDEX collate4i1 ON collate4t1(a, b);
2100202b29eSdanielk1977  }
2110202b29eSdanielk1977} {}
2120202b29eSdanielk1977do_test collate4-1.2.1 {
2130202b29eSdanielk1977  cksort {SELECT a FROM collate4t1 ORDER BY a}
2140202b29eSdanielk1977} {{} A a B b nosort}
2150202b29eSdanielk1977do_test collate4-1.2.2 {
2160202b29eSdanielk1977  cksort {SELECT a FROM collate4t1 ORDER BY a COLLATE nocase}
2170202b29eSdanielk1977} {{} A a B b nosort}
2180202b29eSdanielk1977do_test collate4-1.2.3 {
2190202b29eSdanielk1977  cksort {SELECT a FROM collate4t1 ORDER BY a COLLATE text}
2200202b29eSdanielk1977} {{} A B a b sort}
2210202b29eSdanielk1977do_test collate4-1.2.4 {
2220202b29eSdanielk1977  cksort {SELECT a FROM collate4t1 ORDER BY a, b}
2230202b29eSdanielk1977} {{} A a B b nosort}
2240202b29eSdanielk1977do_test collate4-1.2.5 {
2253f4d1d1bSdrh  cksort {SELECT a FROM collate4t1 ORDER BY a, b COLLATE nocase, rowid}
226495c09a4Sdrh} {{} a A b B sort}
2270202b29eSdanielk1977do_test collate4-1.2.6 {
2280202b29eSdanielk1977  cksort {SELECT a FROM collate4t1 ORDER BY a, b COLLATE text}
2290202b29eSdanielk1977} {{} A a B b nosort}
2300202b29eSdanielk1977
2310202b29eSdanielk1977do_test collate4-1.2.7 {
2320202b29eSdanielk1977  execsql {
2330202b29eSdanielk1977    CREATE TABLE collate4t2(
2340202b29eSdanielk1977      a COLLATE NOCASE,
2350202b29eSdanielk1977      b COLLATE TEXT,
2360202b29eSdanielk1977      PRIMARY KEY(a, b)
2370202b29eSdanielk1977    );
2380202b29eSdanielk1977    INSERT INTO collate4t2 VALUES( 'a', 'a' );
2390202b29eSdanielk1977    INSERT INTO collate4t2 VALUES( NULL, NULL );
2400202b29eSdanielk1977    INSERT INTO collate4t2 VALUES( 'B', 'B' );
2410202b29eSdanielk1977  }
2420202b29eSdanielk1977} {}
2430202b29eSdanielk1977do_test collate4-1.2.8 {
2440202b29eSdanielk1977  cksort {SELECT a FROM collate4t2 ORDER BY a}
2450202b29eSdanielk1977} {{} a B nosort}
2460202b29eSdanielk1977do_test collate4-1.2.9 {
2470202b29eSdanielk1977  cksort {SELECT a FROM collate4t2 ORDER BY a COLLATE nocase}
2480202b29eSdanielk1977} {{} a B nosort}
2490202b29eSdanielk1977do_test collate4-1.2.10 {
2500202b29eSdanielk1977  cksort {SELECT a FROM collate4t2 ORDER BY a COLLATE text}
2510202b29eSdanielk1977} {{} B a sort}
2520202b29eSdanielk1977do_test collate4-1.2.11 {
2530202b29eSdanielk1977  cksort {SELECT a FROM collate4t2 ORDER BY a, b}
2540202b29eSdanielk1977} {{} a B nosort}
2550202b29eSdanielk1977do_test collate4-1.2.12 {
2560202b29eSdanielk1977  cksort {SELECT a FROM collate4t2 ORDER BY a, b COLLATE nocase}
2570202b29eSdanielk1977} {{} a B sort}
2580202b29eSdanielk1977do_test collate4-1.2.13 {
2590202b29eSdanielk1977  cksort {SELECT a FROM collate4t2 ORDER BY a, b COLLATE text}
2600202b29eSdanielk1977} {{} a B nosort}
2610202b29eSdanielk1977
2620202b29eSdanielk1977do_test collate4-1.2.14 {
2630202b29eSdanielk1977  execsql {
2640202b29eSdanielk1977    CREATE TABLE collate4t3(a COLLATE NOCASE, b COLLATE TEXT);
2650202b29eSdanielk1977    INSERT INTO collate4t3 VALUES( 'a', 'a' );
2660202b29eSdanielk1977    INSERT INTO collate4t3 VALUES( 'b', 'b' );
2670202b29eSdanielk1977    INSERT INTO collate4t3 VALUES( NULL, NULL );
2680202b29eSdanielk1977    INSERT INTO collate4t3 VALUES( 'B', 'B' );
2690202b29eSdanielk1977    INSERT INTO collate4t3 VALUES( 'A', 'A' );
2700202b29eSdanielk1977    CREATE INDEX collate4i2 ON collate4t3(a COLLATE TEXT, b COLLATE NOCASE);
2710202b29eSdanielk1977  }
2720202b29eSdanielk1977} {}
2730202b29eSdanielk1977do_test collate4-1.2.15 {
2743f4d1d1bSdrh  cksort {SELECT a FROM collate4t3 ORDER BY a, rowid}
275495c09a4Sdrh} {{} a A b B sort}
2760202b29eSdanielk1977do_test collate4-1.2.16 {
2773f4d1d1bSdrh  cksort {SELECT a FROM collate4t3 ORDER BY a COLLATE nocase, rowid}
278495c09a4Sdrh} {{} a A b B sort}
2790202b29eSdanielk1977do_test collate4-1.2.17 {
2800202b29eSdanielk1977  cksort {SELECT a FROM collate4t3 ORDER BY a COLLATE text}
2810202b29eSdanielk1977} {{} A B a b nosort}
2820202b29eSdanielk1977do_test collate4-1.2.18 {
2830202b29eSdanielk1977  cksort {SELECT a FROM collate4t3 ORDER BY a COLLATE text, b}
2840202b29eSdanielk1977} {{} A B a b sort}
2850202b29eSdanielk1977do_test collate4-1.2.19 {
2860202b29eSdanielk1977  cksort {SELECT a FROM collate4t3 ORDER BY a COLLATE text, b COLLATE nocase}
2870202b29eSdanielk1977} {{} A B a b nosort}
2880202b29eSdanielk1977do_test collate4-1.2.20 {
2890202b29eSdanielk1977  cksort {SELECT a FROM collate4t3 ORDER BY a COLLATE text, b COLLATE text}
2900202b29eSdanielk1977} {{} A B a b sort}
2910202b29eSdanielk1977do_test collate4-1.2.21 {
2920202b29eSdanielk1977  cksort {SELECT a FROM collate4t3 ORDER BY a COLLATE text DESC}
2930202b29eSdanielk1977} {b a B A {} nosort}
2940202b29eSdanielk1977do_test collate4-1.2.22 {
2950202b29eSdanielk1977  cksort {SELECT a FROM collate4t3 ORDER BY a COLLATE text DESC, b}
2960202b29eSdanielk1977} {b a B A {} sort}
2970202b29eSdanielk1977do_test collate4-1.2.23 {
2980202b29eSdanielk1977  cksort {SELECT a FROM collate4t3
2990202b29eSdanielk1977            ORDER BY a COLLATE text DESC, b COLLATE nocase}
3000202b29eSdanielk1977} {b a B A {} sort}
3010202b29eSdanielk1977do_test collate4-1.2.24 {
3020202b29eSdanielk1977  cksort {SELECT a FROM collate4t3
3030202b29eSdanielk1977            ORDER BY a COLLATE text DESC, b COLLATE nocase DESC}
3040202b29eSdanielk1977} {b a B A {} nosort}
3050202b29eSdanielk1977
3060202b29eSdanielk1977do_test collate4-1.2.25 {
3070202b29eSdanielk1977  execsql {
3080202b29eSdanielk1977    DROP TABLE collate4t1;
3090202b29eSdanielk1977    DROP TABLE collate4t2;
3100202b29eSdanielk1977    DROP TABLE collate4t3;
3110202b29eSdanielk1977  }
3120202b29eSdanielk1977} {}
3130202b29eSdanielk1977
3140202b29eSdanielk1977#
3150202b29eSdanielk1977# These tests - collate4-2.* - check that indices are correctly
3160202b29eSdanielk1977# selected or not selected to implement WHERE clauses when user
3170202b29eSdanielk1977# defined collation sequences are involved.
3180202b29eSdanielk1977#
3190202b29eSdanielk1977# Indices may optimise WHERE clauses using <, >, <=, >=, = or IN
3200202b29eSdanielk1977# operators.
3210202b29eSdanielk1977#
3220202b29eSdanielk1977do_test collate4-2.1.0 {
3230202b29eSdanielk1977  execsql {
324c6339081Sdrh    PRAGMA automatic_index=OFF;
3250202b29eSdanielk1977    CREATE TABLE collate4t1(a COLLATE NOCASE);
3260202b29eSdanielk1977    CREATE TABLE collate4t2(b COLLATE TEXT);
3270202b29eSdanielk1977
3280202b29eSdanielk1977    INSERT INTO collate4t1 VALUES('a');
3290202b29eSdanielk1977    INSERT INTO collate4t1 VALUES('A');
3300202b29eSdanielk1977    INSERT INTO collate4t1 VALUES('b');
3310202b29eSdanielk1977    INSERT INTO collate4t1 VALUES('B');
3320202b29eSdanielk1977    INSERT INTO collate4t1 VALUES('c');
3330202b29eSdanielk1977    INSERT INTO collate4t1 VALUES('C');
3340202b29eSdanielk1977    INSERT INTO collate4t1 VALUES('d');
3350202b29eSdanielk1977    INSERT INTO collate4t1 VALUES('D');
3360202b29eSdanielk1977    INSERT INTO collate4t1 VALUES('e');
3370202b29eSdanielk1977    INSERT INTO collate4t1 VALUES('D');
3380202b29eSdanielk1977
3390202b29eSdanielk1977    INSERT INTO collate4t2 VALUES('A');
3400202b29eSdanielk1977    INSERT INTO collate4t2 VALUES('Z');
3410202b29eSdanielk1977  }
3420202b29eSdanielk1977} {}
3430202b29eSdanielk1977do_test collate4-2.1.1 {
3440202b29eSdanielk1977  count {
345c6339081Sdrh    SELECT * FROM collate4t2, collate4t1 WHERE a = b;
3460202b29eSdanielk1977  }
3470202b29eSdanielk1977} {A a A A 19}
3480202b29eSdanielk1977do_test collate4-2.1.2 {
3490202b29eSdanielk1977  execsql {
3500202b29eSdanielk1977    CREATE INDEX collate4i1 ON collate4t1(a);
3510202b29eSdanielk1977  }
3520202b29eSdanielk1977  count {
3530202b29eSdanielk1977    SELECT * FROM collate4t2, collate4t1 WHERE a = b;
3540202b29eSdanielk1977  }
355*b1d607deSdrh} {A a A A 4}
3560202b29eSdanielk1977do_test collate4-2.1.3 {
3570202b29eSdanielk1977  count {
3580202b29eSdanielk1977    SELECT * FROM collate4t2, collate4t1 WHERE b = a;
3590202b29eSdanielk1977  }
360c6339081Sdrh} {A A 19}
3610202b29eSdanielk1977do_test collate4-2.1.4 {
3620202b29eSdanielk1977  execsql {
3630202b29eSdanielk1977    DROP INDEX collate4i1;
3640202b29eSdanielk1977    CREATE INDEX collate4i1 ON collate4t1(a COLLATE TEXT);
3650202b29eSdanielk1977  }
3660202b29eSdanielk1977  count {
3673f4d1d1bSdrh    SELECT * FROM collate4t2, collate4t1 WHERE a = b
3683f4d1d1bSdrh     ORDER BY collate4t2.rowid, collate4t1.rowid
3690202b29eSdanielk1977  }
370c6339081Sdrh} {A a A A 19}
3710202b29eSdanielk1977do_test collate4-2.1.5 {
3720202b29eSdanielk1977  count {
3730202b29eSdanielk1977    SELECT * FROM collate4t2, collate4t1 WHERE b = a;
3740202b29eSdanielk1977  }
375*b1d607deSdrh} {A A 3}
3763e8c37e7Sdanielk1977ifcapable subquery {
3770202b29eSdanielk1977  do_test collate4-2.1.6 {
3780202b29eSdanielk1977    count {
3793f4d1d1bSdrh      SELECT a FROM collate4t1 WHERE a IN (SELECT * FROM collate4t2)
3803f4d1d1bSdrh       ORDER BY rowid
3810202b29eSdanielk1977    }
3820202b29eSdanielk1977  } {a A 10}
3830202b29eSdanielk1977  do_test collate4-2.1.7 {
3840202b29eSdanielk1977    execsql {
3850202b29eSdanielk1977      DROP INDEX collate4i1;
3860202b29eSdanielk1977      CREATE INDEX collate4i1 ON collate4t1(a);
3870202b29eSdanielk1977    }
3880202b29eSdanielk1977    count {
3893f4d1d1bSdrh      SELECT a FROM collate4t1 WHERE a IN (SELECT * FROM collate4t2)
3903f4d1d1bSdrh       ORDER BY rowid
3910202b29eSdanielk1977    }
392*b1d607deSdrh  } {a A 5}
3930202b29eSdanielk1977  do_test collate4-2.1.8 {
3940202b29eSdanielk1977    count {
3950202b29eSdanielk1977      SELECT a FROM collate4t1 WHERE a IN ('z', 'a');
3960202b29eSdanielk1977    }
397*b1d607deSdrh  } {a A 4}
3980202b29eSdanielk1977  do_test collate4-2.1.9 {
3990202b29eSdanielk1977    execsql {
4000202b29eSdanielk1977      DROP INDEX collate4i1;
4010202b29eSdanielk1977      CREATE INDEX collate4i1 ON collate4t1(a COLLATE TEXT);
4020202b29eSdanielk1977    }
4030202b29eSdanielk1977    count {
4043f4d1d1bSdrh      SELECT a FROM collate4t1 WHERE a IN ('z', 'a') ORDER BY rowid;
4050202b29eSdanielk1977    }
4060202b29eSdanielk1977  } {a A 9}
4073e8c37e7Sdanielk1977}
4080202b29eSdanielk1977do_test collate4-2.1.10 {
4090202b29eSdanielk1977  execsql {
4100202b29eSdanielk1977    DROP TABLE collate4t1;
4110202b29eSdanielk1977    DROP TABLE collate4t2;
4120202b29eSdanielk1977  }
4130202b29eSdanielk1977} {}
4140202b29eSdanielk1977
4150202b29eSdanielk1977do_test collate4-2.2.0 {
4160202b29eSdanielk1977  execsql {
4170202b29eSdanielk1977    CREATE TABLE collate4t1(a COLLATE nocase, b COLLATE text, c);
4180202b29eSdanielk1977    CREATE TABLE collate4t2(a COLLATE nocase, b COLLATE text, c COLLATE TEXT);
4190202b29eSdanielk1977
4200202b29eSdanielk1977    INSERT INTO collate4t1 VALUES('0', '0', '0');
4210202b29eSdanielk1977    INSERT INTO collate4t1 VALUES('0', '0', '1');
4220202b29eSdanielk1977    INSERT INTO collate4t1 VALUES('0', '1', '0');
4230202b29eSdanielk1977    INSERT INTO collate4t1 VALUES('0', '1', '1');
4240202b29eSdanielk1977    INSERT INTO collate4t1 VALUES('1', '0', '0');
4250202b29eSdanielk1977    INSERT INTO collate4t1 VALUES('1', '0', '1');
4260202b29eSdanielk1977    INSERT INTO collate4t1 VALUES('1', '1', '0');
4270202b29eSdanielk1977    INSERT INTO collate4t1 VALUES('1', '1', '1');
4280202b29eSdanielk1977    insert into collate4t2 SELECT * FROM collate4t1;
4290202b29eSdanielk1977  }
4300202b29eSdanielk1977} {}
4310202b29eSdanielk1977do_test collate4-2.2.1 {
4320202b29eSdanielk1977  count {
433a21a64ddSdrh    SELECT * FROM collate4t2 NOT INDEXED NATURAL JOIN collate4t1 NOT INDEXED;
4340202b29eSdanielk1977  }
4350202b29eSdanielk1977} {0 0 0 0 0 1 0 1 0 0 1 1 1 0 0 1 0 1 1 1 0 1 1 1 63}
4369012bcbcSdrhdo_test collate4-2.2.1b {
4370202b29eSdanielk1977  execsql {
4380202b29eSdanielk1977    CREATE INDEX collate4i1 ON collate4t1(a, b, c);
4390202b29eSdanielk1977  }
4400202b29eSdanielk1977  count {
4410202b29eSdanielk1977    SELECT * FROM collate4t2 NATURAL JOIN collate4t1;
4420202b29eSdanielk1977  }
4439012bcbcSdrh} {0 0 0 0 0 1 0 1 0 0 1 1 1 0 0 1 0 1 1 1 0 1 1 1 29}
4440202b29eSdanielk1977do_test collate4-2.2.2 {
4450202b29eSdanielk1977  execsql {
4460202b29eSdanielk1977    DROP INDEX collate4i1;
4470202b29eSdanielk1977    CREATE INDEX collate4i1 ON collate4t1(a, b, c COLLATE text);
4480202b29eSdanielk1977  }
4490202b29eSdanielk1977  count {
4500202b29eSdanielk1977    SELECT * FROM collate4t2 NATURAL JOIN collate4t1;
4510202b29eSdanielk1977  }
4520202b29eSdanielk1977} {0 0 0 0 0 1 0 1 0 0 1 1 1 0 0 1 0 1 1 1 0 1 1 1 22}
4530202b29eSdanielk1977
4540202b29eSdanielk1977do_test collate4-2.2.10 {
4550202b29eSdanielk1977  execsql {
4560202b29eSdanielk1977    DROP TABLE collate4t1;
4570202b29eSdanielk1977    DROP TABLE collate4t2;
4580202b29eSdanielk1977  }
4590202b29eSdanielk1977} {}
4600202b29eSdanielk1977
4610202b29eSdanielk1977#
4620202b29eSdanielk1977# These tests - collate4-3.* verify that indices that implement
4630202b29eSdanielk1977# UNIQUE and PRIMARY KEY constraints operate correctly with user
4640202b29eSdanielk1977# defined collation sequences.
4650202b29eSdanielk1977#
4660202b29eSdanielk1977do_test collate4-3.0 {
4670202b29eSdanielk1977  execsql {
4680202b29eSdanielk1977    CREATE TABLE collate4t1(a PRIMARY KEY COLLATE NOCASE);
4690202b29eSdanielk1977  }
4700202b29eSdanielk1977} {}
4710202b29eSdanielk1977do_test collate4-3.1 {
4720202b29eSdanielk1977  catchsql {
4730202b29eSdanielk1977    INSERT INTO collate4t1 VALUES('abc');
4740202b29eSdanielk1977    INSERT INTO collate4t1 VALUES('ABC');
4750202b29eSdanielk1977  }
476f9c8ce3cSdrh} {1 {UNIQUE constraint failed: collate4t1.a}}
4770202b29eSdanielk1977do_test collate4-3.2 {
4780202b29eSdanielk1977  execsql {
4790202b29eSdanielk1977    SELECT * FROM collate4t1;
4800202b29eSdanielk1977  }
4810202b29eSdanielk1977} {abc}
4820202b29eSdanielk1977do_test collate4-3.3 {
4830202b29eSdanielk1977  catchsql {
4840202b29eSdanielk1977    INSERT INTO collate4t1 SELECT upper(a) FROM collate4t1;
4850202b29eSdanielk1977  }
486f9c8ce3cSdrh} {1 {UNIQUE constraint failed: collate4t1.a}}
4870202b29eSdanielk1977do_test collate4-3.4 {
4880202b29eSdanielk1977  catchsql {
4890202b29eSdanielk1977    INSERT INTO collate4t1 VALUES(1);
4900202b29eSdanielk1977    UPDATE collate4t1 SET a = 'abc';
4910202b29eSdanielk1977  }
492f9c8ce3cSdrh} {1 {UNIQUE constraint failed: collate4t1.a}}
4930202b29eSdanielk1977do_test collate4-3.5 {
4940202b29eSdanielk1977  execsql {
4950202b29eSdanielk1977    DROP TABLE collate4t1;
4960202b29eSdanielk1977    CREATE TABLE collate4t1(a COLLATE NOCASE UNIQUE);
4970202b29eSdanielk1977  }
4980202b29eSdanielk1977} {}
4990202b29eSdanielk1977do_test collate4-3.6 {
5000202b29eSdanielk1977  catchsql {
5010202b29eSdanielk1977    INSERT INTO collate4t1 VALUES('abc');
5020202b29eSdanielk1977    INSERT INTO collate4t1 VALUES('ABC');
5030202b29eSdanielk1977  }
504f9c8ce3cSdrh} {1 {UNIQUE constraint failed: collate4t1.a}}
5050202b29eSdanielk1977do_test collate4-3.7 {
5060202b29eSdanielk1977  execsql {
5070202b29eSdanielk1977    SELECT * FROM collate4t1;
5080202b29eSdanielk1977  }
5090202b29eSdanielk1977} {abc}
5100202b29eSdanielk1977do_test collate4-3.8 {
5110202b29eSdanielk1977  catchsql {
5120202b29eSdanielk1977    INSERT INTO collate4t1 SELECT upper(a) FROM collate4t1;
5130202b29eSdanielk1977  }
514f9c8ce3cSdrh} {1 {UNIQUE constraint failed: collate4t1.a}}
5150202b29eSdanielk1977do_test collate4-3.9 {
5160202b29eSdanielk1977  catchsql {
5170202b29eSdanielk1977    INSERT INTO collate4t1 VALUES(1);
5180202b29eSdanielk1977    UPDATE collate4t1 SET a = 'abc';
5190202b29eSdanielk1977  }
520f9c8ce3cSdrh} {1 {UNIQUE constraint failed: collate4t1.a}}
5210202b29eSdanielk1977do_test collate4-3.10 {
5220202b29eSdanielk1977  execsql {
5230202b29eSdanielk1977    DROP TABLE collate4t1;
5240202b29eSdanielk1977    CREATE TABLE collate4t1(a);
5250202b29eSdanielk1977    CREATE UNIQUE INDEX collate4i1 ON collate4t1(a COLLATE NOCASE);
5260202b29eSdanielk1977  }
5270202b29eSdanielk1977} {}
5280202b29eSdanielk1977do_test collate4-3.11 {
5290202b29eSdanielk1977  catchsql {
5300202b29eSdanielk1977    INSERT INTO collate4t1 VALUES('abc');
5310202b29eSdanielk1977    INSERT INTO collate4t1 VALUES('ABC');
5320202b29eSdanielk1977  }
533f9c8ce3cSdrh} {1 {UNIQUE constraint failed: collate4t1.a}}
5340202b29eSdanielk1977do_test collate4-3.12 {
5350202b29eSdanielk1977  execsql {
5360202b29eSdanielk1977    SELECT * FROM collate4t1;
5370202b29eSdanielk1977  }
5380202b29eSdanielk1977} {abc}
5390202b29eSdanielk1977do_test collate4-3.13 {
5400202b29eSdanielk1977  catchsql {
5410202b29eSdanielk1977    INSERT INTO collate4t1 SELECT upper(a) FROM collate4t1;
5420202b29eSdanielk1977  }
543f9c8ce3cSdrh} {1 {UNIQUE constraint failed: collate4t1.a}}
5440202b29eSdanielk1977do_test collate4-3.14 {
5450202b29eSdanielk1977  catchsql {
5460202b29eSdanielk1977    INSERT INTO collate4t1 VALUES(1);
5470202b29eSdanielk1977    UPDATE collate4t1 SET a = 'abc';
5480202b29eSdanielk1977  }
549f9c8ce3cSdrh} {1 {UNIQUE constraint failed: collate4t1.a}}
5500202b29eSdanielk1977
5510202b29eSdanielk1977do_test collate4-3.15 {
5520202b29eSdanielk1977  execsql {
5530202b29eSdanielk1977    DROP TABLE collate4t1;
5540202b29eSdanielk1977  }
5550202b29eSdanielk1977} {}
5560202b29eSdanielk1977
557dc1bdc4fSdanielk1977# Mimic the SQLite 2 collation type NUMERIC.
558dc1bdc4fSdanielk1977db collate numeric numeric_collate
559dc1bdc4fSdanielk1977proc numeric_collate {lhs rhs} {
560dc1bdc4fSdanielk1977  if {$lhs == $rhs} {return 0}
561dc1bdc4fSdanielk1977  return [expr ($lhs>$rhs)?1:-1]
562dc1bdc4fSdanielk1977}
563dc1bdc4fSdanielk1977
5640202b29eSdanielk1977#
5650202b29eSdanielk1977# These tests - collate4-4.* check that min() and max() only ever
5660202b29eSdanielk1977# use indices constructed with built-in collation type numeric.
5670202b29eSdanielk1977#
5680202b29eSdanielk1977# CHANGED:  min() and max() now use the collation type. If there
5690202b29eSdanielk1977# is an indice that can be used, it is used.
5700202b29eSdanielk1977#
5710202b29eSdanielk1977do_test collate4-4.0 {
5720202b29eSdanielk1977  execsql {
5730202b29eSdanielk1977    CREATE TABLE collate4t1(a COLLATE TEXT);
574dc1bdc4fSdanielk1977    INSERT INTO collate4t1 VALUES('2');
575dc1bdc4fSdanielk1977    INSERT INTO collate4t1 VALUES('10');
576dc1bdc4fSdanielk1977    INSERT INTO collate4t1 VALUES('20');
577dc1bdc4fSdanielk1977    INSERT INTO collate4t1 VALUES('104');
5780202b29eSdanielk1977  }
5790202b29eSdanielk1977} {}
5800202b29eSdanielk1977do_test collate4-4.1 {
5810202b29eSdanielk1977  count {
5820202b29eSdanielk1977    SELECT max(a) FROM collate4t1
5830202b29eSdanielk1977  }
5840202b29eSdanielk1977} {20 3}
5850202b29eSdanielk1977do_test collate4-4.2 {
5860202b29eSdanielk1977  count {
5870202b29eSdanielk1977    SELECT min(a) FROM collate4t1
5880202b29eSdanielk1977  }
5890202b29eSdanielk1977} {10 3}
5900202b29eSdanielk1977do_test collate4-4.3 {
5910202b29eSdanielk1977  # Test that the index with collation type TEXT is used.
5920202b29eSdanielk1977  execsql {
5930202b29eSdanielk1977    CREATE INDEX collate4i1 ON collate4t1(a);
5940202b29eSdanielk1977  }
5950202b29eSdanielk1977  count {
5960202b29eSdanielk1977    SELECT min(a) FROM collate4t1;
5970202b29eSdanielk1977  }
598a9d1ccb9Sdanielk1977} {10 1}
5990202b29eSdanielk1977do_test collate4-4.4 {
6000202b29eSdanielk1977  count {
6010202b29eSdanielk1977    SELECT max(a) FROM collate4t1;
6020202b29eSdanielk1977  }
603a9d1ccb9Sdanielk1977} {20 0}
6040202b29eSdanielk1977do_test collate4-4.5 {
6050202b29eSdanielk1977  # Test that the index with collation type NUMERIC is not used.
6060202b29eSdanielk1977  execsql {
6070202b29eSdanielk1977    DROP INDEX collate4i1;
6080202b29eSdanielk1977    CREATE INDEX collate4i1 ON collate4t1(a COLLATE NUMERIC);
6090202b29eSdanielk1977  }
6100202b29eSdanielk1977  count {
6110202b29eSdanielk1977    SELECT min(a) FROM collate4t1;
6120202b29eSdanielk1977  }
6130202b29eSdanielk1977} {10 3}
6140202b29eSdanielk1977do_test collate4-4.6 {
6150202b29eSdanielk1977  count {
6160202b29eSdanielk1977    SELECT max(a) FROM collate4t1;
6170202b29eSdanielk1977  }
6180202b29eSdanielk1977} {20 3}
6190202b29eSdanielk1977do_test collate4-4.7 {
6200202b29eSdanielk1977  execsql {
6210202b29eSdanielk1977    DROP TABLE collate4t1;
6220202b29eSdanielk1977  }
6230202b29eSdanielk1977} {}
6240202b29eSdanielk1977
6250202b29eSdanielk1977# Also test the scalar min() and max() functions.
6260202b29eSdanielk1977#
6270202b29eSdanielk1977do_test collate4-4.8 {
6280202b29eSdanielk1977  execsql {
629dc1bdc4fSdanielk1977    CREATE TABLE collate4t1(a COLLATE TEXT, b COLLATE NUMERIC);
630dc1bdc4fSdanielk1977    INSERT INTO collate4t1 VALUES('11', '101');
631dc1bdc4fSdanielk1977    INSERT INTO collate4t1 VALUES('101', '11')
6320202b29eSdanielk1977  }
6330202b29eSdanielk1977} {}
6340202b29eSdanielk1977do_test collate4-4.9 {
6350202b29eSdanielk1977  execsql {
6360202b29eSdanielk1977    SELECT max(a, b) FROM collate4t1;
6370202b29eSdanielk1977  }
638dc1bdc4fSdanielk1977} {11 11}
639dc1bdc4fSdanielk1977do_test collate4-4.10 {
640dc1bdc4fSdanielk1977  execsql {
641dc1bdc4fSdanielk1977    SELECT max(b, a) FROM collate4t1;
642dc1bdc4fSdanielk1977  }
643dc1bdc4fSdanielk1977} {101 101}
644dc1bdc4fSdanielk1977do_test collate4-4.11 {
645dc1bdc4fSdanielk1977  execsql {
646dc1bdc4fSdanielk1977    SELECT max(a, '101') FROM collate4t1;
647dc1bdc4fSdanielk1977  }
648dc1bdc4fSdanielk1977} {11 101}
6490202b29eSdanielk1977do_test collate4-4.12 {
6500202b29eSdanielk1977  execsql {
651dc1bdc4fSdanielk1977    SELECT max('101', a) FROM collate4t1;
6520202b29eSdanielk1977  }
653dc1bdc4fSdanielk1977} {11 101}
6540202b29eSdanielk1977do_test collate4-4.13 {
6550202b29eSdanielk1977  execsql {
656dc1bdc4fSdanielk1977    SELECT max(b, '101') FROM collate4t1;
6570202b29eSdanielk1977  }
658dc1bdc4fSdanielk1977} {101 101}
6590202b29eSdanielk1977do_test collate4-4.14 {
6600202b29eSdanielk1977  execsql {
661dc1bdc4fSdanielk1977    SELECT max('101', b) FROM collate4t1;
6620202b29eSdanielk1977  }
663dc1bdc4fSdanielk1977} {101 101}
664dc1bdc4fSdanielk1977
6650202b29eSdanielk1977do_test collate4-4.15 {
6660202b29eSdanielk1977  execsql {
6670202b29eSdanielk1977    DROP TABLE collate4t1;
6680202b29eSdanielk1977  }
6690202b29eSdanielk1977} {}
6700202b29eSdanielk1977
6710202b29eSdanielk1977#
6720202b29eSdanielk1977# These tests - collate4.6.* - ensure that implict INTEGER PRIMARY KEY
6730202b29eSdanielk1977# indices do not confuse collation sequences.
6740202b29eSdanielk1977#
6750202b29eSdanielk1977# These indices are never used for sorting in SQLite. And you can't
6760202b29eSdanielk1977# create another index on an INTEGER PRIMARY KEY column, so we don't have
6770202b29eSdanielk1977# to test that.
678b6c29897Sdrh# (Revised 2004-Nov-22):  The ROWID can be used for sorting now.
6790202b29eSdanielk1977#
6800202b29eSdanielk1977do_test collate4-6.0 {
6810202b29eSdanielk1977  execsql {
6820202b29eSdanielk1977    CREATE TABLE collate4t1(a INTEGER PRIMARY KEY);
6830202b29eSdanielk1977    INSERT INTO collate4t1 VALUES(101);
6840202b29eSdanielk1977    INSERT INTO collate4t1 VALUES(10);
6850202b29eSdanielk1977    INSERT INTO collate4t1 VALUES(15);
6860202b29eSdanielk1977  }
6870202b29eSdanielk1977} {}
6880202b29eSdanielk1977do_test collate4-6.1 {
6890202b29eSdanielk1977  cksort {
6900202b29eSdanielk1977    SELECT * FROM collate4t1 ORDER BY 1;
6910202b29eSdanielk1977  }
692b6c29897Sdrh} {10 15 101 nosort}
6930202b29eSdanielk1977do_test collate4-6.2 {
6940202b29eSdanielk1977  cksort {
6950202b29eSdanielk1977    SELECT * FROM collate4t1 ORDER BY oid;
6960202b29eSdanielk1977  }
697b6c29897Sdrh} {10 15 101 nosort}
6980202b29eSdanielk1977do_test collate4-6.3 {
6990202b29eSdanielk1977  cksort {
7000202b29eSdanielk1977    SELECT * FROM collate4t1 ORDER BY oid||'' COLLATE TEXT;
7010202b29eSdanielk1977  }
7020202b29eSdanielk1977} {10 101 15 sort}
7030202b29eSdanielk1977
7040202b29eSdanielk1977finish_test
705