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 1380103fc6Sdan# focus of this script is testing collation sequences. 140202b29eSdanielk1977# 150202b29eSdanielk1977 160202b29eSdanielk1977set testdir [file dirname $argv0] 170202b29eSdanielk1977source $testdir/tester.tcl 1880103fc6Sdanset testprefix collate1 190202b29eSdanielk1977 200202b29eSdanielk1977# 210202b29eSdanielk1977# Tests are roughly organised as follows: 220202b29eSdanielk1977# 230202b29eSdanielk1977# collate1-1.* - Single-field ORDER BY with an explicit COLLATE clause. 240202b29eSdanielk1977# collate1-2.* - Multi-field ORDER BY with an explicit COLLATE clause. 250202b29eSdanielk1977# collate1-3.* - ORDER BY using a default collation type. Also that an 260202b29eSdanielk1977# explict collate type overrides a default collate type. 270202b29eSdanielk1977# collate1-4.* - ORDER BY using a data type. 280202b29eSdanielk1977# 290202b29eSdanielk1977 300202b29eSdanielk1977# 310202b29eSdanielk1977# Collation type 'HEX'. If an argument can be interpreted as a hexadecimal 320202b29eSdanielk1977# number, then it is converted to one before the comparison is performed. 330202b29eSdanielk1977# Numbers are less than other strings. If neither argument is a number, 340202b29eSdanielk1977# [string compare] is used. 350202b29eSdanielk1977# 360202b29eSdanielk1977db collate HEX hex_collate 370202b29eSdanielk1977proc hex_collate {lhs rhs} { 380202b29eSdanielk1977 set lhs_ishex [regexp {^(0x|)[1234567890abcdefABCDEF]+$} $lhs] 390202b29eSdanielk1977 set rhs_ishex [regexp {^(0x|)[1234567890abcdefABCDEF]+$} $rhs] 400202b29eSdanielk1977 if {$lhs_ishex && $rhs_ishex} { 410202b29eSdanielk1977 set lhsx [scan $lhs %x] 420202b29eSdanielk1977 set rhsx [scan $rhs %x] 430202b29eSdanielk1977 if {$lhs < $rhs} {return -1} 440202b29eSdanielk1977 if {$lhs == $rhs} {return 0} 450202b29eSdanielk1977 if {$lhs > $rhs} {return 1} 460202b29eSdanielk1977 } 470202b29eSdanielk1977 if {$lhs_ishex} { 480202b29eSdanielk1977 return -1; 490202b29eSdanielk1977 } 500202b29eSdanielk1977 if {$rhs_ishex} { 510202b29eSdanielk1977 return 1; 520202b29eSdanielk1977 } 530202b29eSdanielk1977 return [string compare $lhs $rhs] 540202b29eSdanielk1977} 550202b29eSdanielk1977db function hex {format 0x%X} 560202b29eSdanielk1977 570202b29eSdanielk1977# Mimic the SQLite 2 collation type NUMERIC. 580202b29eSdanielk1977db collate numeric numeric_collate 590202b29eSdanielk1977proc numeric_collate {lhs rhs} { 600202b29eSdanielk1977 if {$lhs == $rhs} {return 0} 610202b29eSdanielk1977 return [expr ($lhs>$rhs)?1:-1] 620202b29eSdanielk1977} 630202b29eSdanielk1977 640202b29eSdanielk1977do_test collate1-1.0 { 650202b29eSdanielk1977 execsql { 660202b29eSdanielk1977 CREATE TABLE collate1t1(c1, c2); 670202b29eSdanielk1977 INSERT INTO collate1t1 VALUES(45, hex(45)); 680202b29eSdanielk1977 INSERT INTO collate1t1 VALUES(NULL, NULL); 690202b29eSdanielk1977 INSERT INTO collate1t1 VALUES(281, hex(281)); 700202b29eSdanielk1977 } 710202b29eSdanielk1977} {} 720202b29eSdanielk1977do_test collate1-1.1 { 730202b29eSdanielk1977 execsql { 740202b29eSdanielk1977 SELECT c2 FROM collate1t1 ORDER BY 1; 750202b29eSdanielk1977 } 760202b29eSdanielk1977} {{} 0x119 0x2D} 770202b29eSdanielk1977do_test collate1-1.2 { 780202b29eSdanielk1977 execsql { 790202b29eSdanielk1977 SELECT c2 FROM collate1t1 ORDER BY 1 COLLATE hex; 800202b29eSdanielk1977 } 810202b29eSdanielk1977} {{} 0x2D 0x119} 820202b29eSdanielk1977do_test collate1-1.3 { 830202b29eSdanielk1977 execsql { 840202b29eSdanielk1977 SELECT c2 FROM collate1t1 ORDER BY 1 COLLATE hex DESC; 850202b29eSdanielk1977 } 860202b29eSdanielk1977} {0x119 0x2D {}} 870202b29eSdanielk1977do_test collate1-1.4 { 880202b29eSdanielk1977 execsql { 890202b29eSdanielk1977 SELECT c2 FROM collate1t1 ORDER BY 1 COLLATE hex ASC; 900202b29eSdanielk1977 } 910202b29eSdanielk1977} {{} 0x2D 0x119} 920202b29eSdanielk1977do_test collate1-1.5 { 930202b29eSdanielk1977 execsql { 948b4c40d8Sdrh SELECT c2 COLLATE hex FROM collate1t1 ORDER BY 1 958b4c40d8Sdrh } 968b4c40d8Sdrh} {{} 0x2D 0x119} 978b4c40d8Sdrhdo_test collate1-1.6 { 988b4c40d8Sdrh execsql { 998b4c40d8Sdrh SELECT c2 COLLATE hex FROM collate1t1 ORDER BY 1 ASC 1008b4c40d8Sdrh } 1018b4c40d8Sdrh} {{} 0x2D 0x119} 1028b4c40d8Sdrhdo_test collate1-1.7 { 1038b4c40d8Sdrh execsql { 1048b4c40d8Sdrh SELECT c2 COLLATE hex FROM collate1t1 ORDER BY 1 DESC 1058b4c40d8Sdrh } 1068b4c40d8Sdrh} {0x119 0x2D {}} 1078b4c40d8Sdrhdo_test collate1-1.99 { 1088b4c40d8Sdrh execsql { 1090202b29eSdanielk1977 DROP TABLE collate1t1; 1100202b29eSdanielk1977 } 1110202b29eSdanielk1977} {} 1120202b29eSdanielk1977 1130202b29eSdanielk1977do_test collate1-2.0 { 1140202b29eSdanielk1977 execsql { 1150202b29eSdanielk1977 CREATE TABLE collate1t1(c1, c2); 1160202b29eSdanielk1977 INSERT INTO collate1t1 VALUES('5', '0x11'); 1170202b29eSdanielk1977 INSERT INTO collate1t1 VALUES('5', '0xA'); 1180202b29eSdanielk1977 INSERT INTO collate1t1 VALUES(NULL, NULL); 1190202b29eSdanielk1977 INSERT INTO collate1t1 VALUES('7', '0xA'); 1200202b29eSdanielk1977 INSERT INTO collate1t1 VALUES('11', '0x11'); 1210202b29eSdanielk1977 INSERT INTO collate1t1 VALUES('11', '0x101'); 1220202b29eSdanielk1977 } 1230202b29eSdanielk1977} {} 1240202b29eSdanielk1977do_test collate1-2.2 { 1250202b29eSdanielk1977 execsql { 1260202b29eSdanielk1977 SELECT c1, c2 FROM collate1t1 ORDER BY 1 COLLATE numeric, 2 COLLATE hex; 1270202b29eSdanielk1977 } 1280202b29eSdanielk1977} {{} {} 5 0xA 5 0x11 7 0xA 11 0x11 11 0x101} 1290202b29eSdanielk1977do_test collate1-2.3 { 1300202b29eSdanielk1977 execsql { 1310202b29eSdanielk1977 SELECT c1, c2 FROM collate1t1 ORDER BY 1 COLLATE binary, 2 COLLATE hex; 1320202b29eSdanielk1977 } 1330202b29eSdanielk1977} {{} {} 11 0x11 11 0x101 5 0xA 5 0x11 7 0xA} 1340202b29eSdanielk1977do_test collate1-2.4 { 1350202b29eSdanielk1977 execsql { 1360202b29eSdanielk1977 SELECT c1, c2 FROM collate1t1 ORDER BY 1 COLLATE binary DESC, 2 COLLATE hex; 1370202b29eSdanielk1977 } 1380202b29eSdanielk1977} {7 0xA 5 0xA 5 0x11 11 0x11 11 0x101 {} {}} 1390202b29eSdanielk1977do_test collate1-2.5 { 1400202b29eSdanielk1977 execsql { 1410202b29eSdanielk1977 SELECT c1, c2 FROM collate1t1 1420202b29eSdanielk1977 ORDER BY 1 COLLATE binary DESC, 2 COLLATE hex DESC; 1430202b29eSdanielk1977 } 1440202b29eSdanielk1977} {7 0xA 5 0x11 5 0xA 11 0x101 11 0x11 {} {}} 1450202b29eSdanielk1977do_test collate1-2.6 { 1460202b29eSdanielk1977 execsql { 1470202b29eSdanielk1977 SELECT c1, c2 FROM collate1t1 1480202b29eSdanielk1977 ORDER BY 1 COLLATE binary ASC, 2 COLLATE hex ASC; 1490202b29eSdanielk1977 } 1500202b29eSdanielk1977} {{} {} 11 0x11 11 0x101 5 0xA 5 0x11 7 0xA} 1518b4c40d8Sdrhdo_test collate1-2.12.1 { 1528b4c40d8Sdrh execsql { 1538b4c40d8Sdrh SELECT c1 COLLATE numeric, c2 FROM collate1t1 1548b4c40d8Sdrh ORDER BY 1, 2 COLLATE hex; 1558b4c40d8Sdrh } 1568b4c40d8Sdrh} {{} {} 5 0xA 5 0x11 7 0xA 11 0x11 11 0x101} 1578b4c40d8Sdrhdo_test collate1-2.12.2 { 1588b4c40d8Sdrh execsql { 1598b4c40d8Sdrh SELECT c1 COLLATE hex, c2 FROM collate1t1 1608b4c40d8Sdrh ORDER BY 1 COLLATE numeric, 2 COLLATE hex; 1618b4c40d8Sdrh } 1628b4c40d8Sdrh} {{} {} 5 0xA 5 0x11 7 0xA 11 0x11 11 0x101} 1638b4c40d8Sdrhdo_test collate1-2.12.3 { 1648b4c40d8Sdrh execsql { 1658b4c40d8Sdrh SELECT c1, c2 COLLATE hex FROM collate1t1 1668b4c40d8Sdrh ORDER BY 1 COLLATE numeric, 2; 1678b4c40d8Sdrh } 1688b4c40d8Sdrh} {{} {} 5 0xA 5 0x11 7 0xA 11 0x11 11 0x101} 1698b4c40d8Sdrhdo_test collate1-2.12.4 { 1708b4c40d8Sdrh execsql { 1718b4c40d8Sdrh SELECT c1 COLLATE numeric, c2 COLLATE hex 1728b4c40d8Sdrh FROM collate1t1 1738b4c40d8Sdrh ORDER BY 1, 2; 1748b4c40d8Sdrh } 1758b4c40d8Sdrh} {{} {} 5 0xA 5 0x11 7 0xA 11 0x11 11 0x101} 1768b4c40d8Sdrhdo_test collate1-2.13 { 1778b4c40d8Sdrh execsql { 1788b4c40d8Sdrh SELECT c1 COLLATE binary, c2 COLLATE hex 1798b4c40d8Sdrh FROM collate1t1 1808b4c40d8Sdrh ORDER BY 1, 2; 1818b4c40d8Sdrh } 1828b4c40d8Sdrh} {{} {} 11 0x11 11 0x101 5 0xA 5 0x11 7 0xA} 1838b4c40d8Sdrhdo_test collate1-2.14 { 1848b4c40d8Sdrh execsql { 1858b4c40d8Sdrh SELECT c1, c2 1868b4c40d8Sdrh FROM collate1t1 ORDER BY 1 COLLATE binary DESC, 2 COLLATE hex; 1878b4c40d8Sdrh } 1888b4c40d8Sdrh} {7 0xA 5 0xA 5 0x11 11 0x11 11 0x101 {} {}} 1898b4c40d8Sdrhdo_test collate1-2.15 { 1908b4c40d8Sdrh execsql { 1918b4c40d8Sdrh SELECT c1 COLLATE binary, c2 COLLATE hex 1928b4c40d8Sdrh FROM collate1t1 1938b4c40d8Sdrh ORDER BY 1 DESC, 2 DESC; 1948b4c40d8Sdrh } 1958b4c40d8Sdrh} {7 0xA 5 0x11 5 0xA 11 0x101 11 0x11 {} {}} 1968b4c40d8Sdrhdo_test collate1-2.16 { 1978b4c40d8Sdrh execsql { 1988b4c40d8Sdrh SELECT c1 COLLATE hex, c2 COLLATE binary 1998b4c40d8Sdrh FROM collate1t1 2008b4c40d8Sdrh ORDER BY 1 COLLATE binary ASC, 2 COLLATE hex ASC; 2018b4c40d8Sdrh } 2028b4c40d8Sdrh} {{} {} 11 0x11 11 0x101 5 0xA 5 0x11 7 0xA} 2038b4c40d8Sdrhdo_test collate1-2.99 { 2040202b29eSdanielk1977 execsql { 2050202b29eSdanielk1977 DROP TABLE collate1t1; 2060202b29eSdanielk1977 } 2070202b29eSdanielk1977} {} 2080202b29eSdanielk1977 2090202b29eSdanielk1977# 2100202b29eSdanielk1977# These tests ensure that the default collation type for a column is used 2110202b29eSdanielk1977# by an ORDER BY clause correctly. The focus is all the different ways 2120202b29eSdanielk1977# the column can be referenced. i.e. a, collate2t1.a, main.collate2t1.a etc. 2130202b29eSdanielk1977# 2140202b29eSdanielk1977do_test collate1-3.0 { 2150202b29eSdanielk1977 execsql { 2160202b29eSdanielk1977 CREATE TABLE collate1t1(a COLLATE hex, b); 2170202b29eSdanielk1977 INSERT INTO collate1t1 VALUES( '0x5', 5 ); 2180202b29eSdanielk1977 INSERT INTO collate1t1 VALUES( '1', 1 ); 2190202b29eSdanielk1977 INSERT INTO collate1t1 VALUES( '0x45', 69 ); 2200202b29eSdanielk1977 INSERT INTO collate1t1 VALUES( NULL, NULL ); 2210202b29eSdanielk1977 SELECT * FROM collate1t1 ORDER BY a; 2220202b29eSdanielk1977 } 2230202b29eSdanielk1977} {{} {} 1 1 0x5 5 0x45 69} 2240202b29eSdanielk1977 2250202b29eSdanielk1977do_test collate1-3.1 { 2260202b29eSdanielk1977 execsql { 2270202b29eSdanielk1977 SELECT * FROM collate1t1 ORDER BY 1; 2280202b29eSdanielk1977 } 2290202b29eSdanielk1977} {{} {} 1 1 0x5 5 0x45 69} 2300202b29eSdanielk1977do_test collate1-3.2 { 2310202b29eSdanielk1977 execsql { 2320202b29eSdanielk1977 SELECT * FROM collate1t1 ORDER BY collate1t1.a; 2330202b29eSdanielk1977 } 2340202b29eSdanielk1977} {{} {} 1 1 0x5 5 0x45 69} 2350202b29eSdanielk1977do_test collate1-3.3 { 2360202b29eSdanielk1977 execsql { 2370202b29eSdanielk1977 SELECT * FROM collate1t1 ORDER BY main.collate1t1.a; 2380202b29eSdanielk1977 } 2390202b29eSdanielk1977} {{} {} 1 1 0x5 5 0x45 69} 2400202b29eSdanielk1977do_test collate1-3.4 { 2410202b29eSdanielk1977 execsql { 2420202b29eSdanielk1977 SELECT a as c1, b as c2 FROM collate1t1 ORDER BY c1; 2430202b29eSdanielk1977 } 2440202b29eSdanielk1977} {{} {} 1 1 0x5 5 0x45 69} 2450202b29eSdanielk1977do_test collate1-3.5 { 2460202b29eSdanielk1977 execsql { 2470202b29eSdanielk1977 SELECT a as c1, b as c2 FROM collate1t1 ORDER BY c1 COLLATE binary; 2480202b29eSdanielk1977 } 2490202b29eSdanielk1977} {{} {} 0x45 69 0x5 5 1 1} 2508b4c40d8Sdrhdo_test collate1-3.5.1 { 2518b4c40d8Sdrh execsql { 2528b4c40d8Sdrh SELECT a COLLATE binary as c1, b as c2 2538b4c40d8Sdrh FROM collate1t1 ORDER BY c1; 2548b4c40d8Sdrh } 2558b4c40d8Sdrh} {{} {} 0x45 69 0x5 5 1 1} 2560202b29eSdanielk1977do_test collate1-3.6 { 2570202b29eSdanielk1977 execsql { 2580202b29eSdanielk1977 DROP TABLE collate1t1; 2590202b29eSdanielk1977 } 2600202b29eSdanielk1977} {} 2610202b29eSdanielk1977 2620202b29eSdanielk1977# Update for SQLite version 3. The collate1-4.* test cases were written 2630202b29eSdanielk1977# before manifest types were introduced. The following test cases still 2640202b29eSdanielk1977# work, due to the 'affinity' mechanism, but they don't prove anything 2650202b29eSdanielk1977# about collation sequences. 2660202b29eSdanielk1977# 2670202b29eSdanielk1977do_test collate1-4.0 { 2680202b29eSdanielk1977 execsql { 2690202b29eSdanielk1977 CREATE TABLE collate1t1(c1 numeric, c2 text); 2700202b29eSdanielk1977 INSERT INTO collate1t1 VALUES(1, 1); 2710202b29eSdanielk1977 INSERT INTO collate1t1 VALUES(12, 12); 2720202b29eSdanielk1977 INSERT INTO collate1t1 VALUES(NULL, NULL); 2730202b29eSdanielk1977 INSERT INTO collate1t1 VALUES(101, 101); 2740202b29eSdanielk1977 } 2750202b29eSdanielk1977} {} 2760202b29eSdanielk1977do_test collate1-4.1 { 2770202b29eSdanielk1977 execsql { 2780202b29eSdanielk1977 SELECT c1 FROM collate1t1 ORDER BY 1; 2790202b29eSdanielk1977 } 2800202b29eSdanielk1977} {{} 1 12 101} 2810202b29eSdanielk1977do_test collate1-4.2 { 2820202b29eSdanielk1977 execsql { 2830202b29eSdanielk1977 SELECT c2 FROM collate1t1 ORDER BY 1; 2840202b29eSdanielk1977 } 2850202b29eSdanielk1977} {{} 1 101 12} 2860202b29eSdanielk1977do_test collate1-4.3 { 2870202b29eSdanielk1977 execsql { 2880202b29eSdanielk1977 SELECT c2+0 FROM collate1t1 ORDER BY 1; 2890202b29eSdanielk1977 } 2908df447f0Sdrh} {{} 1 12 101} 2910202b29eSdanielk1977do_test collate1-4.4 { 2920202b29eSdanielk1977 execsql { 2930202b29eSdanielk1977 SELECT c1||'' FROM collate1t1 ORDER BY 1; 2940202b29eSdanielk1977 } 2950202b29eSdanielk1977} {{} 1 101 12} 2968b4c40d8Sdrhdo_test collate1-4.4.1 { 2978b4c40d8Sdrh execsql { 2988b4c40d8Sdrh SELECT (c1||'') COLLATE numeric FROM collate1t1 ORDER BY 1; 2998b4c40d8Sdrh } 3008b4c40d8Sdrh} {{} 1 12 101} 3010202b29eSdanielk1977do_test collate1-4.5 { 3020202b29eSdanielk1977 execsql { 3030202b29eSdanielk1977 DROP TABLE collate1t1; 3040202b29eSdanielk1977 } 3050202b29eSdanielk1977} {} 3060202b29eSdanielk1977 30709081862Sdrh# A problem reported on the mailing list: A CREATE TABLE statement 30809081862Sdrh# is allowed to have two or more COLLATE clauses on the same column. 30909081862Sdrh# That probably ought to be an error, but we allow it for backwards 31009081862Sdrh# compatibility. Just make sure it works and doesn't leak memory. 31109081862Sdrh# 31209081862Sdrhdo_test collate1-5.1 { 31309081862Sdrh execsql { 31409081862Sdrh CREATE TABLE c5( 31509081862Sdrh id INTEGER PRIMARY KEY, 31609081862Sdrh a TEXT COLLATE binary COLLATE nocase COLLATE rtrim, 31709081862Sdrh b TEXT COLLATE nocase COLLATE binary, 31809081862Sdrh c TEXT COLLATE rtrim COLLATE binary COLLATE rtrim COLLATE nocase 31909081862Sdrh ); 32009081862Sdrh INSERT INTO c5 VALUES(1, 'abc','abc','abc'); 32109081862Sdrh INSERT INTO c5 VALUES(2, 'abc ','ABC','ABC'); 32209081862Sdrh SELECT id FROM c5 WHERE a='abc' ORDER BY id; 32309081862Sdrh } 32409081862Sdrh} {1 2} 32509081862Sdrhdo_test collate1-5.2 { 32609081862Sdrh execsql { 32709081862Sdrh SELECT id FROM c5 WHERE b='abc' ORDER BY id; 32809081862Sdrh } 32909081862Sdrh} {1} 33009081862Sdrhdo_test collate1-5.3 { 33109081862Sdrh execsql { 33209081862Sdrh SELECT id FROM c5 WHERE c='abc' ORDER BY id; 33309081862Sdrh } 33409081862Sdrh} {1 2} 33509081862Sdrh 33680103fc6Sdan 33780103fc6Sdan 33880103fc6Sdan#------------------------------------------------------------------------- 33980103fc6Sdan# Fix problems with handling collation sequences named '"""'. 34080103fc6Sdan# 341*7d44b22dSdrhsqlite3_db_config db SQLITE_DBCONFIG_DQS_DML 1 34280103fc6Sdando_execsql_test 6.1 { 34380103fc6Sdan SELECT """"""""; 34480103fc6Sdan} {\"\"\"} 34580103fc6Sdan 34680103fc6Sdando_catchsql_test 6.2 { 34780103fc6Sdan CREATE TABLE x1(a); 34880103fc6Sdan SELECT a FROM x1 ORDER BY a COLLATE """"""""; 34980103fc6Sdan} {1 {no such collation sequence: """}} 35080103fc6Sdan 35180103fc6Sdando_catchsql_test 6.3 { 35280103fc6Sdan SELECT a FROM x1 ORDER BY 1 COLLATE """"""""; 35380103fc6Sdan} {1 {no such collation sequence: """}} 35480103fc6Sdan 35580103fc6Sdando_catchsql_test 6.4 { 35680103fc6Sdan SELECT 0 UNION SELECT 0 ORDER BY 1 COLLATE """"""""; 35780103fc6Sdan} {1 {no such collation sequence: """}} 35880103fc6Sdan 35980103fc6Sdandb collate {"""} [list string compare -nocase] 36080103fc6Sdan 36180103fc6Sdando_execsql_test 6.5 { 36280103fc6Sdan PRAGMA foreign_keys = ON; 36380103fc6Sdan CREATE TABLE p1(a PRIMARY KEY COLLATE '"""'); 36480103fc6Sdan CREATE TABLE c1(x, y REFERENCES p1); 36580103fc6Sdan} {} 36680103fc6Sdan 36780103fc6Sdando_execsql_test 6.6 { 36880103fc6Sdan INSERT INTO p1 VALUES('abc'); 36980103fc6Sdan INSERT INTO c1 VALUES(1, 'ABC'); 37080103fc6Sdan} 37180103fc6Sdan 37280103fc6Sdanifcapable foreignkey { 37380103fc6Sdan do_catchsql_test 6.7 { 37480103fc6Sdan DELETE FROM p1 WHERE rowid = 1 37580103fc6Sdan } {1 {FOREIGN KEY constraint failed}} 37680103fc6Sdan} 37780103fc6Sdan 37880103fc6Sdando_execsql_test 6.8 { 37980103fc6Sdan INSERT INTO p1 VALUES('abb'); 38080103fc6Sdan INSERT INTO p1 VALUES('wxz'); 38180103fc6Sdan INSERT INTO p1 VALUES('wxy'); 38280103fc6Sdan 38380103fc6Sdan INSERT INTO c1 VALUES(2, 'abb'); 38480103fc6Sdan INSERT INTO c1 VALUES(3, 'wxz'); 38580103fc6Sdan INSERT INTO c1 VALUES(4, 'WXY'); 38680103fc6Sdan SELECT x, y FROM c1 ORDER BY y COLLATE """"""""; 38780103fc6Sdan} {2 abb 1 ABC 4 WXY 3 wxz} 38880103fc6Sdan 3896456b771Sdrh# 2015-04-15: Nested COLLATE operators 3906456b771Sdrh# 3916456b771Sdrhdo_execsql_test 7.0 { 3926456b771Sdrh SELECT 'abc' UNION ALL SELECT 'DEF' 3936456b771Sdrh ORDER BY 1 COLLATE nocase COLLATE nocase COLLATE nocase COLLATE nocase; 3946456b771Sdrh} {abc DEF} 3956456b771Sdrhdo_execsql_test 7.1 { 3966456b771Sdrh SELECT 'abc' UNION ALL SELECT 'DEF' 3976456b771Sdrh ORDER BY 1 COLLATE nocase COLLATE nocase COLLATE nocase COLLATE binary; 3986456b771Sdrh} {DEF abc} 3996456b771Sdrhdo_execsql_test 7.2 { 4006456b771Sdrh SELECT 'abc' UNION ALL SELECT 'DEF' 4016456b771Sdrh ORDER BY 1 COLLATE binary COLLATE binary COLLATE binary COLLATE nocase; 4026456b771Sdrh} {abc DEF} 4036456b771Sdrh 404821afa44Sdrh# 2019-06-14 405821afa44Sdrh# https://sqlite.org/src/info/f1580ba1b574e9e9 406821afa44Sdrh# 407821afa44Sdrhdo_execsql_test 8.0 { 408821afa44Sdrh SELECT ' ' > char(20) COLLATE rtrim; 409821afa44Sdrh} 0 410821afa44Sdrhdo_execsql_test 8.1 { 411821afa44Sdrh SELECT '' < char(20) COLLATE rtrim; 412821afa44Sdrh} 1 413821afa44Sdrhdo_execsql_test 8.2 { 414821afa44Sdrh DROP TABLE IF EXISTS t0; 415821afa44Sdrh CREATE TABLE t0(c0 COLLATE RTRIM, c1 BLOB UNIQUE, 416821afa44Sdrh PRIMARY KEY (c0, c1)) WITHOUT ROWID; 417821afa44Sdrh INSERT INTO t0 VALUES (123, 3), (' ', 1), (' ', 2), ('', 4); 418821afa44Sdrh SELECT * FROM t0 WHERE c1 = 1; 419821afa44Sdrh} {{ } 1} 4206456b771Sdrh 42192a2824cSdrh# 2019-10-09 42292a2824cSdrh# ALWAYS() macro fails following OOM 42392a2824cSdrh# Problem detected by dbsqlfuzz. 42492a2824cSdrh# 42592a2824cSdrhdo_execsql_test 9.0 { 42692a2824cSdrh CREATE TABLE t1(a, b); 42792a2824cSdrh CREATE TABLE t2(c, d); 42892a2824cSdrh} 42992a2824cSdrh 43092a2824cSdrhdo_faultsim_test 9.1 -faults oom* -body { 43192a2824cSdrh execsql { 43292a2824cSdrh SELECT * FROM ( 43392a2824cSdrh SELECT b COLLATE nocase IN (SELECT c FROM t2) FROM t1 43492a2824cSdrh ); 43592a2824cSdrh } 43692a2824cSdrh} -test { 43792a2824cSdrh faultsim_test_result {0 {}} 43892a2824cSdrh} 43992a2824cSdrh 4404c983b2fSdrh# 2020-01-03 dbsqlfuzz find 4414c983b2fSdrh# 4424c983b2fSdrhreset_db 4434c983b2fSdrhdo_catchsql_test 10.0 { 4444c983b2fSdrh CREATE TABLE t1(a INTEGER PRIMARY KEY,b); 4454c983b2fSdrh INSERT INTO t1 VALUES(0,NULL); 4464c983b2fSdrh CREATE TABLE t2(x UNIQUE); 4474c983b2fSdrh CREATE VIEW v1a(z,y) AS SELECT x COLLATE x FROM t2; 4484c983b2fSdrh SELECT a,b,z,y,'' FROM t1 JOIN v1a ON b IS NOT FALSE; 4494c983b2fSdrh} {1 {no such collation sequence: x}} 4504c983b2fSdrh 4514c983b2fSdrh 4520202b29eSdanielk1977finish_test 453