xref: /sqlite-3.40.0/test/collate1.test (revision 7d44b22d)
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