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