Annotation of embedaddon/sqlite3/test/sort.test, revision 1.1.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>