Annotation of embedaddon/sqlite3/test/collate9.test, revision 1.1.1.1

1.1       misho       1: #
                      2: # 2007 November 12
                      3: #
                      4: # The author disclaims copyright to this source code.  In place of
                      5: # a legal notice, here is a blessing:
                      6: #
                      7: #    May you do good and not evil.
                      8: #    May you find forgiveness for yourself and forgive others.
                      9: #    May you share freely, never taking more than you give.
                     10: #
                     11: #***********************************************************************
                     12: # This file implements regression tests for SQLite library.  The
                     13: # focus of this script is making sure that the names of collation
                     14: # sequences may be quoted using double quotes in SQL statements.
                     15: #
                     16: # $Id: collate9.test,v 1.2 2008/07/10 00:32:42 drh Exp $
                     17: 
                     18: set testdir [file dirname $argv0]
                     19: source $testdir/tester.tcl
                     20: 
                     21: proc reverse_sort {lhs rhs} {
                     22:   return [string compare $rhs $lhs]
                     23: }
                     24: db collate "reverse sort" reverse_sort
                     25: 
                     26: # This procedure executes the SQL.  Then it checks to see if the OP_Sort
                     27: # opcode was executed.  If an OP_Sort did occur, then "sort" is appended
                     28: # to the result.  If no OP_Sort happened, then "nosort" is appended.
                     29: #
                     30: # This procedure is used to check to make sure sorting is or is not
                     31: # occurring as expected.
                     32: #
                     33: proc cksort {sql} {
                     34:   set ::sqlite_sort_count 0
                     35:   set data [execsql $sql]
                     36:   if {$::sqlite_sort_count} {set x sort} {set x nosort}
                     37:   lappend data $x
                     38:   return $data
                     39: }
                     40: 
                     41: # Test plan:
                     42: #
                     43: #     collate9-1.* - Test collation sequences attached to table columns
                     44: #     collate9-2.* - Test collation sequences attached to expressions
                     45: #     collate9-3.* - Test collation sequences attached to an index
                     46: #     collate9-4.* - Test collation sequences as an argument to REINDEX
                     47: #
                     48: 
                     49: do_test collate9-1.1 {
                     50:   execsql {
                     51:     CREATE TABLE xy(x COLLATE "reverse sort", y COLLATE binary);
                     52:     INSERT INTO xy VALUES('one', 'one');
                     53:     INSERT INTO xy VALUES('two', 'two');
                     54:     INSERT INTO xy VALUES('three', 'three');
                     55:   }
                     56: } {}
                     57: do_test collate9-1.2 {
                     58:   execsql { 
                     59:     SELECT x FROM xy ORDER BY x
                     60:   }
                     61: } {two three one}
                     62: do_test collate9-1.3 {
                     63:   execsql { 
                     64:     SELECT y FROM xy ORDER BY y
                     65:   }
                     66: } {one three two}
                     67: do_test collate9-1.4 {
                     68:   cksort { 
                     69:     SELECT x FROM xy ORDER BY x
                     70:   }
                     71: } {two three one sort}
                     72: do_test collate9-1.5 {
                     73:   execsql { 
                     74:     CREATE INDEX xy_i ON xy(x)
                     75:   }
                     76: } {}
                     77: do_test collate9-1.6 {
                     78:   cksort { 
                     79:     SELECT x FROM xy ORDER BY x
                     80:   }
                     81: } {two three one nosort}
                     82: 
                     83: do_test collate9-2.1 {
                     84:   execsql { 
                     85:     SELECT x, x < 'seven' FROM xy ORDER BY x
                     86:   }
                     87: } {two 1 three 1 one 0}
                     88: do_test collate9-2.2 {
                     89:   execsql { 
                     90:     SELECT y, y < 'seven' FROM xy ORDER BY x
                     91:   }
                     92: } {two 0 three 0 one 1}
                     93: do_test collate9-2.3 {
                     94:   execsql { 
                     95:     SELECT y, y COLLATE "reverse sort" < 'seven' FROM xy ORDER BY x
                     96:   }
                     97: } {two 1 three 1 one 0}
                     98: do_test collate9-2.4 {
                     99:   execsql {
                    100:     SELECT y FROM xy ORDER BY y
                    101:   }
                    102: } {one three two}
                    103: do_test collate9-2.5 {
                    104:   execsql {
                    105:     SELECT y FROM xy ORDER BY y COLLATE "reverse sort"
                    106:   }
                    107: } {two three one}
                    108: do_test collate9-2.6 {
                    109:   execsql {
                    110:     SELECT y COLLATE "reverse sort" AS aaa FROM xy ORDER BY aaa
                    111:   }
                    112: } {two three one}
                    113: 
                    114: do_test collate9-3.1 {
                    115:   execsql {
                    116:     CREATE INDEX xy_i2 ON xy(y COLLATE "reverse sort");
                    117:   }
                    118: } {}
                    119: do_test collate9-3.2 {
                    120:   cksort { 
                    121:     SELECT y FROM xy ORDER BY y 
                    122:   }
                    123: } {one three two sort}
                    124: do_test collate9-3.3 {
                    125:   cksort { 
                    126:     SELECT y FROM xy ORDER BY y COLLATE "reverse sort"
                    127:   }
                    128: } {two three one nosort}
                    129: do_test collate9-3.4 {
                    130:   cksort { 
                    131:     SELECT y AS aaa FROM xy ORDER BY aaa
                    132:   }
                    133: } {one three two sort}
                    134: do_test collate9-3.5 {
                    135:   cksort { 
                    136:     SELECT y COLLATE "reverse sort" AS aaa FROM xy ORDER BY aaa
                    137:   }
                    138: } {two three one nosort}
                    139: 
                    140: ifcapable reindex {
                    141:   do_test collate9-4.1 {
                    142:     execsql {
                    143:       REINDEX "reverse sort"
                    144:     }
                    145:   } {}
                    146: 
                    147:   # Modify the "reverse sort" collation so that it now sorts in the same
                    148:   # order as binary.
                    149:   proc reverse_sort {lhs rhs} {
                    150:     return [string compare $lhs $rhs]
                    151:   }
                    152: 
                    153:   # The integrity check should now fail because the indexes created using
                    154:   # "reverse sort" are no longer in sync with the collation sequence
                    155:   # implementation.
                    156:   do_test collate9-4.2 {
                    157:     expr {"ok" eq [execsql { PRAGMA integrity_check }]}
                    158:   } {0}
                    159: 
                    160:   do_test collate9-4.3 {
                    161:     execsql {
                    162:       REINDEX "reverse sort"
                    163:     }
                    164:   } {}
                    165: 
                    166:   # Integrity check should now pass.
                    167:   do_test collate9-4.4 {
                    168:     expr {"ok" eq [execsql { PRAGMA integrity_check }]}
                    169:   } {1}
                    170: 
                    171:   do_test collate9-4.5 {
                    172:     cksort {
                    173:       SELECT x FROM xy ORDER BY x COLLATE "reverse sort"
                    174:     }
                    175:   } {one three two nosort}
                    176: }
                    177: 
                    178: finish_test

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>