Annotation of embedaddon/sqlite3/test/sort.test, revision 1.1
1.1 ! misho 1: # 2001 September 15.
! 2: #
! 3: # The author disclaims copyright to this source code. In place of
! 4: # a legal notice, here is a blessing:
! 5: #
! 6: # May you do good and not evil.
! 7: # May you find forgiveness for yourself and forgive others.
! 8: # May you share freely, never taking more than you give.
! 9: #
! 10: #***********************************************************************
! 11: # This file implements regression tests for SQLite library. The
! 12: # focus of this file is testing the CREATE TABLE statement.
! 13: #
! 14: # $Id: sort.test,v 1.25 2005/11/14 22:29:06 drh Exp $
! 15:
! 16: set testdir [file dirname $argv0]
! 17: source $testdir/tester.tcl
! 18:
! 19: # Create a bunch of data to sort against
! 20: #
! 21: do_test sort-1.0 {
! 22: execsql {
! 23: CREATE TABLE t1(
! 24: n int,
! 25: v varchar(10),
! 26: log int,
! 27: roman varchar(10),
! 28: flt real
! 29: );
! 30: INSERT INTO t1 VALUES(1,'one',0,'I',3.141592653);
! 31: INSERT INTO t1 VALUES(2,'two',1,'II',2.15);
! 32: INSERT INTO t1 VALUES(3,'three',1,'III',4221.0);
! 33: INSERT INTO t1 VALUES(4,'four',2,'IV',-0.0013442);
! 34: INSERT INTO t1 VALUES(5,'five',2,'V',-11);
! 35: INSERT INTO t1 VALUES(6,'six',2,'VI',0.123);
! 36: INSERT INTO t1 VALUES(7,'seven',2,'VII',123.0);
! 37: INSERT INTO t1 VALUES(8,'eight',3,'VIII',-1.6);
! 38: }
! 39: execsql {SELECT count(*) FROM t1}
! 40: } {8}
! 41:
! 42: do_test sort-1.1 {
! 43: execsql {SELECT n FROM t1 ORDER BY n}
! 44: } {1 2 3 4 5 6 7 8}
! 45: do_test sort-1.1.1 {
! 46: execsql {SELECT n FROM t1 ORDER BY n ASC}
! 47: } {1 2 3 4 5 6 7 8}
! 48: do_test sort-1.1.1 {
! 49: execsql {SELECT ALL n FROM t1 ORDER BY n ASC}
! 50: } {1 2 3 4 5 6 7 8}
! 51: do_test sort-1.2 {
! 52: execsql {SELECT n FROM t1 ORDER BY n DESC}
! 53: } {8 7 6 5 4 3 2 1}
! 54: do_test sort-1.3a {
! 55: execsql {SELECT v FROM t1 ORDER BY v}
! 56: } {eight five four one seven six three two}
! 57: do_test sort-1.3b {
! 58: execsql {SELECT n FROM t1 ORDER BY v}
! 59: } {8 5 4 1 7 6 3 2}
! 60: do_test sort-1.4 {
! 61: execsql {SELECT n FROM t1 ORDER BY v DESC}
! 62: } {2 3 6 7 1 4 5 8}
! 63: do_test sort-1.5 {
! 64: execsql {SELECT flt FROM t1 ORDER BY flt}
! 65: } {-11.0 -1.6 -0.0013442 0.123 2.15 3.141592653 123.0 4221.0}
! 66: do_test sort-1.6 {
! 67: execsql {SELECT flt FROM t1 ORDER BY flt DESC}
! 68: } {4221.0 123.0 3.141592653 2.15 0.123 -0.0013442 -1.6 -11.0}
! 69: do_test sort-1.7 {
! 70: execsql {SELECT roman FROM t1 ORDER BY roman}
! 71: } {I II III IV V VI VII VIII}
! 72: do_test sort-1.8 {
! 73: execsql {SELECT n FROM t1 ORDER BY log, flt}
! 74: } {1 2 3 5 4 6 7 8}
! 75: do_test sort-1.8.1 {
! 76: execsql {SELECT n FROM t1 ORDER BY log asc, flt}
! 77: } {1 2 3 5 4 6 7 8}
! 78: do_test sort-1.8.2 {
! 79: execsql {SELECT n FROM t1 ORDER BY log, flt ASC}
! 80: } {1 2 3 5 4 6 7 8}
! 81: do_test sort-1.8.3 {
! 82: execsql {SELECT n FROM t1 ORDER BY log ASC, flt asc}
! 83: } {1 2 3 5 4 6 7 8}
! 84: do_test sort-1.9 {
! 85: execsql {SELECT n FROM t1 ORDER BY log, flt DESC}
! 86: } {1 3 2 7 6 4 5 8}
! 87: do_test sort-1.9.1 {
! 88: execsql {SELECT n FROM t1 ORDER BY log ASC, flt DESC}
! 89: } {1 3 2 7 6 4 5 8}
! 90: do_test sort-1.10 {
! 91: execsql {SELECT n FROM t1 ORDER BY log DESC, flt}
! 92: } {8 5 4 6 7 2 3 1}
! 93: do_test sort-1.11 {
! 94: execsql {SELECT n FROM t1 ORDER BY log DESC, flt DESC}
! 95: } {8 7 6 4 5 3 2 1}
! 96:
! 97: # These tests are designed to reach some hard-to-reach places
! 98: # inside the string comparison routines.
! 99: #
! 100: # (Later) The sorting behavior changed in 2.7.0. But we will
! 101: # keep these tests. You can never have too many test cases!
! 102: #
! 103: do_test sort-2.1.1 {
! 104: execsql {
! 105: UPDATE t1 SET v='x' || -flt;
! 106: UPDATE t1 SET v='x-2b' where v=='x-0.123';
! 107: SELECT v FROM t1 ORDER BY v;
! 108: }
! 109: } {x-123.0 x-2.15 x-2b x-3.141592653 x-4221.0 x0.0013442 x1.6 x11.0}
! 110: do_test sort-2.1.2 {
! 111: execsql {
! 112: SELECT v FROM t1 ORDER BY substr(v,2,999);
! 113: }
! 114: } {x-123.0 x-2.15 x-2b x-3.141592653 x-4221.0 x0.0013442 x1.6 x11.0}
! 115: do_test sort-2.1.3 {
! 116: execsql {
! 117: SELECT v FROM t1 ORDER BY substr(v,2,999)+0.0;
! 118: }
! 119: } {x-4221.0 x-123.0 x-3.141592653 x-2.15 x-2b x0.0013442 x1.6 x11.0}
! 120: do_test sort-2.1.4 {
! 121: execsql {
! 122: SELECT v FROM t1 ORDER BY substr(v,2,999) DESC;
! 123: }
! 124: } {x11.0 x1.6 x0.0013442 x-4221.0 x-3.141592653 x-2b x-2.15 x-123.0}
! 125: do_test sort-2.1.5 {
! 126: execsql {
! 127: SELECT v FROM t1 ORDER BY substr(v,2,999)+0.0 DESC;
! 128: }
! 129: } {x11.0 x1.6 x0.0013442 x-2b x-2.15 x-3.141592653 x-123.0 x-4221.0}
! 130:
! 131: # This is a bug fix for 2.2.4.
! 132: # Strings are normally mapped to upper-case for a caseless comparison.
! 133: # But this can cause problems for characters in between 'Z' and 'a'.
! 134: #
! 135: do_test sort-3.1 {
! 136: execsql {
! 137: CREATE TABLE t2(a,b);
! 138: INSERT INTO t2 VALUES('AGLIENTU',1);
! 139: INSERT INTO t2 VALUES('AGLIE`',2);
! 140: INSERT INTO t2 VALUES('AGNA',3);
! 141: SELECT a, b FROM t2 ORDER BY a;
! 142: }
! 143: } {AGLIENTU 1 AGLIE` 2 AGNA 3}
! 144: do_test sort-3.2 {
! 145: execsql {
! 146: SELECT a, b FROM t2 ORDER BY a DESC;
! 147: }
! 148: } {AGNA 3 AGLIE` 2 AGLIENTU 1}
! 149: do_test sort-3.3 {
! 150: execsql {
! 151: DELETE FROM t2;
! 152: INSERT INTO t2 VALUES('aglientu',1);
! 153: INSERT INTO t2 VALUES('aglie`',2);
! 154: INSERT INTO t2 VALUES('agna',3);
! 155: SELECT a, b FROM t2 ORDER BY a;
! 156: }
! 157: } {aglie` 2 aglientu 1 agna 3}
! 158: do_test sort-3.4 {
! 159: execsql {
! 160: SELECT a, b FROM t2 ORDER BY a DESC;
! 161: }
! 162: } {agna 3 aglientu 1 aglie` 2}
! 163:
! 164: # Version 2.7.0 testing.
! 165: #
! 166: do_test sort-4.1 {
! 167: execsql {
! 168: INSERT INTO t1 VALUES(9,'x2.7',3,'IX',4.0e5);
! 169: INSERT INTO t1 VALUES(10,'x5.0e10',3,'X',-4.0e5);
! 170: INSERT INTO t1 VALUES(11,'x-4.0e9',3,'XI',4.1e4);
! 171: INSERT INTO t1 VALUES(12,'x01234567890123456789',3,'XII',-4.2e3);
! 172: SELECT n FROM t1 ORDER BY n;
! 173: }
! 174: } {1 2 3 4 5 6 7 8 9 10 11 12}
! 175: do_test sort-4.2 {
! 176: execsql {
! 177: SELECT n||'' FROM t1 ORDER BY 1;
! 178: }
! 179: } {1 10 11 12 2 3 4 5 6 7 8 9}
! 180: do_test sort-4.3 {
! 181: execsql {
! 182: SELECT n+0 FROM t1 ORDER BY 1;
! 183: }
! 184: } {1 2 3 4 5 6 7 8 9 10 11 12}
! 185: do_test sort-4.4 {
! 186: execsql {
! 187: SELECT n||'' FROM t1 ORDER BY 1 DESC;
! 188: }
! 189: } {9 8 7 6 5 4 3 2 12 11 10 1}
! 190: do_test sort-4.5 {
! 191: execsql {
! 192: SELECT n+0 FROM t1 ORDER BY 1 DESC;
! 193: }
! 194: } {12 11 10 9 8 7 6 5 4 3 2 1}
! 195: do_test sort-4.6 {
! 196: execsql {
! 197: SELECT v FROM t1 ORDER BY 1;
! 198: }
! 199: } {x-123.0 x-2.15 x-2b x-3.141592653 x-4.0e9 x-4221.0 x0.0013442 x01234567890123456789 x1.6 x11.0 x2.7 x5.0e10}
! 200: do_test sort-4.7 {
! 201: execsql {
! 202: SELECT v FROM t1 ORDER BY 1 DESC;
! 203: }
! 204: } {x5.0e10 x2.7 x11.0 x1.6 x01234567890123456789 x0.0013442 x-4221.0 x-4.0e9 x-3.141592653 x-2b x-2.15 x-123.0}
! 205: do_test sort-4.8 {
! 206: execsql {
! 207: SELECT substr(v,2,99) FROM t1 ORDER BY 1;
! 208: }
! 209: } {-123.0 -2.15 -2b -3.141592653 -4.0e9 -4221.0 0.0013442 01234567890123456789 1.6 11.0 2.7 5.0e10}
! 210: #do_test sort-4.9 {
! 211: # execsql {
! 212: # SELECT substr(v,2,99)+0.0 FROM t1 ORDER BY 1;
! 213: # }
! 214: #} {-4000000000 -4221 -123 -3.141592653 -2.15 -2 0.0013442 1.6 2.7 11 50000000000 1.23456789012346e+18}
! 215:
! 216: do_test sort-5.1 {
! 217: execsql {
! 218: create table t3(a,b);
! 219: insert into t3 values(5,NULL);
! 220: insert into t3 values(6,NULL);
! 221: insert into t3 values(3,NULL);
! 222: insert into t3 values(4,'cd');
! 223: insert into t3 values(1,'ab');
! 224: insert into t3 values(2,NULL);
! 225: select a from t3 order by b, a;
! 226: }
! 227: } {2 3 5 6 1 4}
! 228: do_test sort-5.2 {
! 229: execsql {
! 230: select a from t3 order by b, a desc;
! 231: }
! 232: } {6 5 3 2 1 4}
! 233: do_test sort-5.3 {
! 234: execsql {
! 235: select a from t3 order by b desc, a;
! 236: }
! 237: } {4 1 2 3 5 6}
! 238: do_test sort-5.4 {
! 239: execsql {
! 240: select a from t3 order by b desc, a desc;
! 241: }
! 242: } {4 1 6 5 3 2}
! 243:
! 244: do_test sort-6.1 {
! 245: execsql {
! 246: create index i3 on t3(b,a);
! 247: select a from t3 order by b, a;
! 248: }
! 249: } {2 3 5 6 1 4}
! 250: do_test sort-6.2 {
! 251: execsql {
! 252: select a from t3 order by b, a desc;
! 253: }
! 254: } {6 5 3 2 1 4}
! 255: do_test sort-6.3 {
! 256: execsql {
! 257: select a from t3 order by b desc, a;
! 258: }
! 259: } {4 1 2 3 5 6}
! 260: do_test sort-6.4 {
! 261: execsql {
! 262: select a from t3 order by b desc, a desc;
! 263: }
! 264: } {4 1 6 5 3 2}
! 265:
! 266: do_test sort-7.1 {
! 267: execsql {
! 268: CREATE TABLE t4(
! 269: a INTEGER,
! 270: b VARCHAR(30)
! 271: );
! 272: INSERT INTO t4 VALUES(1,1);
! 273: INSERT INTO t4 VALUES(2,2);
! 274: INSERT INTO t4 VALUES(11,11);
! 275: INSERT INTO t4 VALUES(12,12);
! 276: SELECT a FROM t4 ORDER BY 1;
! 277: }
! 278: } {1 2 11 12}
! 279: do_test sort-7.2 {
! 280: execsql {
! 281: SELECT b FROM t4 ORDER BY 1
! 282: }
! 283: } {1 11 12 2}
! 284:
! 285: # Omit tests sort-7.3 to sort-7.8 if view support was disabled at
! 286: # compilatation time.
! 287: ifcapable view {
! 288: do_test sort-7.3 {
! 289: execsql {
! 290: CREATE VIEW v4 AS SELECT * FROM t4;
! 291: SELECT a FROM v4 ORDER BY 1;
! 292: }
! 293: } {1 2 11 12}
! 294: do_test sort-7.4 {
! 295: execsql {
! 296: SELECT b FROM v4 ORDER BY 1;
! 297: }
! 298: } {1 11 12 2}
! 299:
! 300: ifcapable compound {
! 301: do_test sort-7.5 {
! 302: execsql {
! 303: SELECT a FROM t4 UNION SELECT a FROM v4 ORDER BY 1;
! 304: }
! 305: } {1 2 11 12}
! 306: do_test sort-7.6 {
! 307: execsql {
! 308: SELECT b FROM t4 UNION SELECT a FROM v4 ORDER BY 1;
! 309: }
! 310: } {1 2 11 12 1 11 12 2} ;# text from t4.b and numeric from v4.a
! 311: do_test sort-7.7 {
! 312: execsql {
! 313: SELECT a FROM t4 UNION SELECT b FROM v4 ORDER BY 1;
! 314: }
! 315: } {1 2 11 12 1 11 12 2} ;# numeric from t4.a and text from v4.b
! 316: do_test sort-7.8 {
! 317: execsql {
! 318: SELECT b FROM t4 UNION SELECT b FROM v4 ORDER BY 1;
! 319: }
! 320: } {1 11 12 2}
! 321: } ;# ifcapable compound
! 322: } ;# ifcapable view
! 323:
! 324: #### Version 3 works differently here:
! 325: #do_test sort-7.9 {
! 326: # execsql {
! 327: # SELECT b FROM t4 UNION SELECT b FROM v4 ORDER BY 1 COLLATE numeric;
! 328: # }
! 329: #} {1 2 11 12}
! 330: #do_test sort-7.10 {
! 331: # execsql {
! 332: # SELECT b FROM t4 UNION SELECT b FROM v4 ORDER BY 1 COLLATE integer;
! 333: # }
! 334: #} {1 2 11 12}
! 335: #do_test sort-7.11 {
! 336: # execsql {
! 337: # SELECT b FROM t4 UNION SELECT b FROM v4 ORDER BY 1 COLLATE text;
! 338: # }
! 339: #} {1 11 12 2}
! 340: #do_test sort-7.12 {
! 341: # execsql {
! 342: # SELECT b FROM t4 UNION SELECT b FROM v4 ORDER BY 1 COLLATE blob;
! 343: # }
! 344: #} {1 11 12 2}
! 345: #do_test sort-7.13 {
! 346: # execsql {
! 347: # SELECT b FROM t4 UNION SELECT b FROM v4 ORDER BY 1 COLLATE clob;
! 348: # }
! 349: #} {1 11 12 2}
! 350: #do_test sort-7.14 {
! 351: # execsql {
! 352: # SELECT b FROM t4 UNION SELECT b FROM v4 ORDER BY 1 COLLATE varchar;
! 353: # }
! 354: #} {1 11 12 2}
! 355:
! 356: # Ticket #297
! 357: #
! 358: do_test sort-8.1 {
! 359: execsql {
! 360: CREATE TABLE t5(a real, b text);
! 361: INSERT INTO t5 VALUES(100,'A1');
! 362: INSERT INTO t5 VALUES(100.0,'A2');
! 363: SELECT * FROM t5 ORDER BY a, b;
! 364: }
! 365: } {100.0 A1 100.0 A2}
! 366:
! 367:
! 368: ifcapable {bloblit} {
! 369: # BLOBs should sort after TEXT
! 370: #
! 371: do_test sort-9.1 {
! 372: execsql {
! 373: CREATE TABLE t6(x, y);
! 374: INSERT INTO t6 VALUES(1,1);
! 375: INSERT INTO t6 VALUES(2,'1');
! 376: INSERT INTO t6 VALUES(3,x'31');
! 377: INSERT INTO t6 VALUES(4,NULL);
! 378: SELECT x FROM t6 ORDER BY y;
! 379: }
! 380: } {4 1 2 3}
! 381: do_test sort-9.2 {
! 382: execsql {
! 383: SELECT x FROM t6 ORDER BY y DESC;
! 384: }
! 385: } {3 2 1 4}
! 386: do_test sort-9.3 {
! 387: execsql {
! 388: SELECT x FROM t6 WHERE y<1
! 389: }
! 390: } {}
! 391: do_test sort-9.4 {
! 392: execsql {
! 393: SELECT x FROM t6 WHERE y<'1'
! 394: }
! 395: } {1}
! 396: do_test sort-9.5 {
! 397: execsql {
! 398: SELECT x FROM t6 WHERE y<x'31'
! 399: }
! 400: } {1 2}
! 401: do_test sort-9.6 {
! 402: execsql {
! 403: SELECT x FROM t6 WHERE y>1
! 404: }
! 405: } {2 3}
! 406: do_test sort-9.7 {
! 407: execsql {
! 408: SELECT x FROM t6 WHERE y>'1'
! 409: }
! 410: } {3}
! 411: } ;# endif bloblit
! 412:
! 413: # Ticket #1092 - ORDER BY on rowid fields.
! 414: do_test sort-10.1 {
! 415: execsql {
! 416: CREATE TABLE t7(c INTEGER PRIMARY KEY);
! 417: INSERT INTO t7 VALUES(1);
! 418: INSERT INTO t7 VALUES(2);
! 419: INSERT INTO t7 VALUES(3);
! 420: INSERT INTO t7 VALUES(4);
! 421: }
! 422: } {}
! 423: do_test sort-10.2 {
! 424: execsql {
! 425: SELECT c FROM t7 WHERE c<=3 ORDER BY c DESC;
! 426: }
! 427: } {3 2 1}
! 428: do_test sort-10.3 {
! 429: execsql {
! 430: SELECT c FROM t7 WHERE c<3 ORDER BY c DESC;
! 431: }
! 432: } {2 1}
! 433:
! 434: # ticket #1358. Just because one table in a join gives a unique
! 435: # result does not mean they all do. We cannot disable sorting unless
! 436: # all tables in the join give unique results.
! 437: #
! 438: do_test sort-11.1 {
! 439: execsql {
! 440: create table t8(a unique, b, c);
! 441: insert into t8 values(1,2,3);
! 442: insert into t8 values(2,3,4);
! 443: create table t9(x,y);
! 444: insert into t9 values(2,4);
! 445: insert into t9 values(2,3);
! 446: select y from t8, t9 where a=1 order by a, y;
! 447: }
! 448: } {3 4}
! 449:
! 450: # Trouble reported on the mailing list. Check for overly aggressive
! 451: # (which is to say, incorrect) optimization of order-by with a rowid
! 452: # in a join.
! 453: #
! 454: do_test sort-12.1 {
! 455: execsql {
! 456: create table a (id integer primary key);
! 457: create table b (id integer primary key, aId integer, text);
! 458: insert into a values (1);
! 459: insert into b values (2, 1, 'xxx');
! 460: insert into b values (1, 1, 'zzz');
! 461: insert into b values (3, 1, 'yyy');
! 462: select a.id, b.id, b.text from a join b on (a.id = b.aId)
! 463: order by a.id, b.text;
! 464: }
! 465: } {1 2 xxx 1 3 yyy 1 1 zzz}
! 466:
! 467: finish_test
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>