Annotation of embedaddon/sqlite3/test/collate3.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 script is page cache subsystem.
        !            13: #
        !            14: # $Id: collate3.test,v 1.13 2008/08/20 16:35:10 drh Exp $
        !            15: 
        !            16: set testdir [file dirname $argv0]
        !            17: source $testdir/tester.tcl
        !            18: 
        !            19: #
        !            20: # Tests are organised as follows:
        !            21: #
        !            22: # collate3.1.* - Errors related to unknown collation sequences.
        !            23: # collate3.2.* - Errors related to undefined collation sequences.
        !            24: # collate3.3.* - Writing to a table that has an index with an undefined c.s.
        !            25: # collate3.4.* - Misc errors.
        !            26: # collate3.5.* - Collation factory.
        !            27: #
        !            28: 
        !            29: #
        !            30: # These tests ensure that when a user executes a statement with an 
        !            31: # unknown collation sequence an error is returned.
        !            32: #
        !            33: do_test collate3-1.0 {
        !            34:   execsql {
        !            35:     CREATE TABLE collate3t1(c1);
        !            36:   }
        !            37: } {}
        !            38: do_test collate3-1.1 {
        !            39:   catchsql {
        !            40:     SELECT * FROM collate3t1 ORDER BY 1 collate garbage;
        !            41:   }
        !            42: } {1 {no such collation sequence: garbage}}
        !            43: do_test collate3-1.2 {
        !            44:   catchsql {
        !            45:     CREATE TABLE collate3t2(c1 collate garbage);
        !            46:   }
        !            47: } {1 {no such collation sequence: garbage}}
        !            48: do_test collate3-1.3 {
        !            49:   catchsql {
        !            50:     CREATE INDEX collate3i1 ON collate3t1(c1 COLLATE garbage);
        !            51:   }
        !            52: } {1 {no such collation sequence: garbage}}
        !            53: 
        !            54: execsql {
        !            55:   DROP TABLE collate3t1;
        !            56: }
        !            57: 
        !            58: #
        !            59: # Create a table with a default collation sequence, then close
        !            60: # and re-open the database without re-registering the collation
        !            61: # sequence. Then make sure the library stops us from using
        !            62: # the collation sequence in:
        !            63: # * an explicitly collated ORDER BY
        !            64: # * an ORDER BY that uses the default collation sequence
        !            65: # * an expression (=)
        !            66: # * a CREATE TABLE statement
        !            67: # * a CREATE INDEX statement that uses a default collation sequence
        !            68: # * a GROUP BY that uses the default collation sequence
        !            69: # * a SELECT DISTINCT that uses the default collation sequence
        !            70: # * Compound SELECTs that uses the default collation sequence
        !            71: # * An ORDER BY on a compound SELECT with an explicit ORDER BY.
        !            72: #
        !            73: do_test collate3-2.0 {
        !            74:   db collate string_compare {string compare}
        !            75:   execsql {
        !            76:     CREATE TABLE collate3t1(c1 COLLATE string_compare, c2);
        !            77:   }
        !            78:   db close
        !            79:   sqlite3 db test.db
        !            80:   expr 0
        !            81: } 0
        !            82: do_test collate3-2.1 {
        !            83:   catchsql {
        !            84:     SELECT * FROM collate3t1 ORDER BY 1 COLLATE string_compare;
        !            85:   }
        !            86: } {1 {no such collation sequence: string_compare}} 
        !            87: do_test collate3-2.2 {
        !            88:   catchsql {
        !            89:     SELECT * FROM collate3t1 ORDER BY c1;
        !            90:   }
        !            91: } {1 {no such collation sequence: string_compare}} 
        !            92: do_test collate3-2.3 {
        !            93:   catchsql {
        !            94:     SELECT * FROM collate3t1 WHERE c1 = 'xxx';
        !            95:   }
        !            96: } {1 {no such collation sequence: string_compare}} 
        !            97: do_test collate3-2.4 {
        !            98:   catchsql {
        !            99:     CREATE TABLE collate3t2(c1 COLLATE string_compare);
        !           100:   }
        !           101: } {1 {no such collation sequence: string_compare}} 
        !           102: do_test collate3-2.5 {
        !           103:   catchsql {
        !           104:     CREATE INDEX collate3t1_i1 ON collate3t1(c1);
        !           105:   }
        !           106: } {1 {no such collation sequence: string_compare}}
        !           107: do_test collate3-2.6 {
        !           108:   catchsql {
        !           109:     SELECT * FROM collate3t1;
        !           110:   }
        !           111: } {0 {}}
        !           112: do_test collate3-2.7.1 {
        !           113:   catchsql {
        !           114:     SELECT count(*) FROM collate3t1 GROUP BY c1;
        !           115:   }
        !           116: } {1 {no such collation sequence: string_compare}} 
        !           117: # do_test collate3-2.7.2 {
        !           118: #   catchsql {
        !           119: #     SELECT * FROM collate3t1 GROUP BY c1;
        !           120: #   }
        !           121: # } {1 {GROUP BY may only be used on aggregate queries}}
        !           122: do_test collate3-2.7.2 {
        !           123:   catchsql {
        !           124:     SELECT * FROM collate3t1 GROUP BY c1;
        !           125:   }
        !           126: } {1 {no such collation sequence: string_compare}} 
        !           127: do_test collate3-2.8 {
        !           128:   catchsql {
        !           129:     SELECT DISTINCT c1 FROM collate3t1;
        !           130:   }
        !           131: } {1 {no such collation sequence: string_compare}} 
        !           132: 
        !           133: ifcapable compound {
        !           134:   do_test collate3-2.9 {
        !           135:     catchsql {
        !           136:       SELECT c1 FROM collate3t1 UNION SELECT c1 FROM collate3t1;
        !           137:     }
        !           138:   } {1 {no such collation sequence: string_compare}} 
        !           139:   do_test collate3-2.10 {
        !           140:     catchsql {
        !           141:       SELECT c1 FROM collate3t1 EXCEPT SELECT c1 FROM collate3t1;
        !           142:     }
        !           143:   } {1 {no such collation sequence: string_compare}} 
        !           144:   do_test collate3-2.11 {
        !           145:     catchsql {
        !           146:       SELECT c1 FROM collate3t1 INTERSECT SELECT c1 FROM collate3t1;
        !           147:     }
        !           148:   } {1 {no such collation sequence: string_compare}} 
        !           149:   do_test collate3-2.12 {
        !           150:     catchsql {
        !           151:       SELECT c1 FROM collate3t1 UNION ALL SELECT c1 FROM collate3t1;
        !           152:     }
        !           153:   } {0 {}}
        !           154:   do_test collate3-2.13 {
        !           155:     catchsql {
        !           156:       SELECT 10 UNION ALL SELECT 20 ORDER BY 1 COLLATE string_compare;
        !           157:     }
        !           158:   } {1 {no such collation sequence: string_compare}} 
        !           159:   do_test collate3-2.14 {
        !           160:     catchsql {
        !           161:       SELECT 10 INTERSECT SELECT 20 ORDER BY 1 COLLATE string_compare;
        !           162:     }
        !           163:   } {1 {no such collation sequence: string_compare}} 
        !           164:   do_test collate3-2.15 {
        !           165:     catchsql {
        !           166:       SELECT 10 EXCEPT SELECT 20 ORDER BY 1 COLLATE string_compare;
        !           167:     }
        !           168:   } {1 {no such collation sequence: string_compare}} 
        !           169:   do_test collate3-2.16 {
        !           170:     catchsql {
        !           171:       SELECT 10 UNION SELECT 20 ORDER BY 1 COLLATE string_compare;
        !           172:     }
        !           173:   } {1 {no such collation sequence: string_compare}} 
        !           174:   do_test collate3-2.17 {
        !           175:     catchsql {
        !           176:       SELECT c1 FROM collate3t1 UNION ALL SELECT c1 FROM collate3t1 ORDER BY 1;
        !           177:     }
        !           178:   } {1 {no such collation sequence: string_compare}} 
        !           179: } ;# ifcapable compound
        !           180: 
        !           181: #
        !           182: # Create an index that uses a collation sequence then close and
        !           183: # re-open the database without re-registering the collation
        !           184: # sequence. Then check that for the table with the index 
        !           185: # * An INSERT fails,
        !           186: # * An UPDATE on the column with the index fails,
        !           187: # * An UPDATE on a different column succeeds.
        !           188: # * A DELETE with a WHERE clause fails
        !           189: # * A DELETE without a WHERE clause succeeds
        !           190: #
        !           191: # Also, ensure that the restrictions tested by collate3-2.* still
        !           192: # apply after the index has been created.
        !           193: #
        !           194: do_test collate3-3.0 {
        !           195:   db collate string_compare {string compare}
        !           196:   execsql {
        !           197:     CREATE INDEX collate3t1_i1 ON collate3t1(c1);
        !           198:     INSERT INTO collate3t1 VALUES('xxx', 'yyy');
        !           199:   }
        !           200:   db close
        !           201:   sqlite3 db test.db
        !           202:   expr 0
        !           203: } 0
        !           204: db eval {select * from collate3t1}
        !           205: do_test collate3-3.1 {
        !           206:   catchsql {
        !           207:     INSERT INTO collate3t1 VALUES('xxx', 0);
        !           208:   }
        !           209: } {1 {no such collation sequence: string_compare}} 
        !           210: do_test collate3-3.2 {
        !           211:   catchsql {
        !           212:     UPDATE collate3t1 SET c1 = 'xxx';
        !           213:   }
        !           214: } {1 {no such collation sequence: string_compare}} 
        !           215: do_test collate3-3.3 {
        !           216:   catchsql {
        !           217:     UPDATE collate3t1 SET c2 = 'xxx';
        !           218:   }
        !           219: } {0 {}}
        !           220: do_test collate3-3.4 {
        !           221:   catchsql {
        !           222:     DELETE FROM collate3t1 WHERE 1;
        !           223:   }
        !           224: } {1 {no such collation sequence: string_compare}} 
        !           225: do_test collate3-3.5 {
        !           226:   catchsql {
        !           227:     SELECT * FROM collate3t1;
        !           228:   }
        !           229: } {0 {xxx xxx}}
        !           230: do_test collate3-3.6 {
        !           231:   catchsql {
        !           232:     DELETE FROM collate3t1;
        !           233:   }
        !           234: } {0 {}}
        !           235: ifcapable {integrityck} {
        !           236:   do_test collate3-3.8 {
        !           237:     catchsql {
        !           238:       PRAGMA integrity_check
        !           239:     }
        !           240:   } {1 {no such collation sequence: string_compare}}
        !           241: }
        !           242: do_test collate3-3.9 {
        !           243:   catchsql {
        !           244:     SELECT * FROM collate3t1;
        !           245:   }
        !           246: } {0 {}}
        !           247: do_test collate3-3.10 {
        !           248:   catchsql {
        !           249:     SELECT * FROM collate3t1 ORDER BY 1 COLLATE string_compare;
        !           250:   }
        !           251: } {1 {no such collation sequence: string_compare}} 
        !           252: do_test collate3-3.11 {
        !           253:   catchsql {
        !           254:     SELECT * FROM collate3t1 ORDER BY c1;
        !           255:   }
        !           256: } {1 {no such collation sequence: string_compare}} 
        !           257: do_test collate3-3.12 {
        !           258:   catchsql {
        !           259:     SELECT * FROM collate3t1 WHERE c1 = 'xxx';
        !           260:   }
        !           261: } {1 {no such collation sequence: string_compare}} 
        !           262: do_test collate3-3.13 {
        !           263:   catchsql {
        !           264:     CREATE TABLE collate3t2(c1 COLLATE string_compare);
        !           265:   }
        !           266: } {1 {no such collation sequence: string_compare}} 
        !           267: do_test collate3-3.14 {
        !           268:   catchsql {
        !           269:     CREATE INDEX collate3t1_i2 ON collate3t1(c1);
        !           270:   }
        !           271: } {1 {no such collation sequence: string_compare}} 
        !           272: do_test collate3-3.15 {
        !           273:   execsql {
        !           274:     DROP TABLE collate3t1;
        !           275:   }
        !           276: } {}
        !           277: 
        !           278: # Check we can create an index that uses an explicit collation 
        !           279: # sequence and then close and re-open the database.
        !           280: do_test collate3-4.6 {
        !           281:   db collate user_defined "string compare"
        !           282:   execsql {
        !           283:     CREATE TABLE collate3t1(a, b);
        !           284:     INSERT INTO collate3t1 VALUES('hello', NULL);
        !           285:     CREATE INDEX collate3i1 ON collate3t1(a COLLATE user_defined);
        !           286:   }
        !           287: } {}
        !           288: do_test collate3-4.7 {
        !           289:   db close
        !           290:   sqlite3 db test.db
        !           291:   catchsql {
        !           292:     SELECT * FROM collate3t1 ORDER BY a COLLATE user_defined;
        !           293:   }
        !           294: } {1 {no such collation sequence: user_defined}}
        !           295: do_test collate3-4.8.1 {
        !           296:   db collate user_defined "string compare"
        !           297:   catchsql {
        !           298:     SELECT * FROM collate3t1 ORDER BY a COLLATE user_defined;
        !           299:   }
        !           300: } {0 {hello {}}}
        !           301: do_test collate3-4.8.2 {
        !           302:   db close
        !           303:   lindex [catch {
        !           304:     sqlite3 db test.db
        !           305:   }] 0
        !           306: } {0}
        !           307: do_test collate3-4.8.3 {
        !           308:   execsql {
        !           309:     DROP TABLE collate3t1;
        !           310:   }
        !           311: } {}
        !           312: 
        !           313: # Compare strings as numbers.
        !           314: proc numeric_compare {lhs rhs} {
        !           315:   if {$rhs > $lhs} {
        !           316:     set res -1
        !           317:   } else {
        !           318:     set res [expr ($lhs > $rhs)?1:0]
        !           319:   }
        !           320:   return $res
        !           321: }
        !           322: 
        !           323: # Check we can create a view that uses an explicit collation 
        !           324: # sequence and then close and re-open the database.
        !           325: ifcapable view {
        !           326: do_test collate3-4.9 {
        !           327:   db collate user_defined numeric_compare
        !           328:   execsql {
        !           329:     CREATE TABLE collate3t1(a, b);
        !           330:     INSERT INTO collate3t1 VALUES('2', NULL);
        !           331:     INSERT INTO collate3t1 VALUES('101', NULL);
        !           332:     INSERT INTO collate3t1 VALUES('12', NULL);
        !           333:     CREATE VIEW collate3v1 AS SELECT * FROM collate3t1 
        !           334:         ORDER BY 1 COLLATE user_defined;
        !           335:     SELECT * FROM collate3v1;
        !           336:   }
        !           337: } {2 {} 12 {} 101 {}}
        !           338: do_test collate3-4.10 {
        !           339:   db close
        !           340:   sqlite3 db test.db
        !           341:   catchsql {
        !           342:     SELECT * FROM collate3v1;
        !           343:   }
        !           344: } {1 {no such collation sequence: user_defined}}
        !           345: do_test collate3-4.11 {
        !           346:   db collate user_defined numeric_compare
        !           347:   catchsql {
        !           348:     SELECT * FROM collate3v1;
        !           349:   }
        !           350: } {0 {2 {} 12 {} 101 {}}}
        !           351: do_test collate3-4.12 {
        !           352:   execsql {
        !           353:     DROP TABLE collate3t1;
        !           354:   }
        !           355: } {}
        !           356: } ;# ifcapable view
        !           357: 
        !           358: #
        !           359: # Test the collation factory. In the code, the "no such collation sequence"
        !           360: # message is only generated in two places. So these tests just test that
        !           361: # the collation factory can be called once from each of those points.
        !           362: #
        !           363: do_test collate3-5.0 {
        !           364:   catchsql {
        !           365:     CREATE TABLE collate3t1(a);
        !           366:     INSERT INTO collate3t1 VALUES(10);
        !           367:     SELECT a FROM collate3t1 ORDER BY 1 COLLATE unk;
        !           368:   }
        !           369: } {1 {no such collation sequence: unk}}
        !           370: do_test collate3-5.1 {
        !           371:   set ::cfact_cnt 0
        !           372:   proc cfact {nm} {
        !           373:     db collate $nm {string compare}
        !           374:     incr ::cfact_cnt
        !           375:   }
        !           376:   db collation_needed cfact
        !           377: } {}
        !           378: do_test collate3-5.2 {
        !           379:   catchsql {
        !           380:     SELECT a FROM collate3t1 ORDER BY 1 COLLATE unk;
        !           381:   }
        !           382: } {0 10}
        !           383: do_test collate3-5.3 {
        !           384:   set ::cfact_cnt
        !           385: } {1}
        !           386: do_test collate3-5.4 {
        !           387:   catchsql {
        !           388:     SELECT a FROM collate3t1 ORDER BY 1 COLLATE unk;
        !           389:   }
        !           390: } {0 10}
        !           391: do_test collate3-5.5 {
        !           392:   set ::cfact_cnt
        !           393: } {1}
        !           394: do_test collate3-5.6 {
        !           395:   catchsql {
        !           396:     SELECT a FROM collate3t1 ORDER BY 1 COLLATE unk;
        !           397:   }
        !           398: } {0 10}
        !           399: do_test collate3-5.7 {
        !           400:   execsql {
        !           401:     DROP TABLE collate3t1;
        !           402:     CREATE TABLE collate3t1(a COLLATE unk);
        !           403:   }
        !           404:   db close
        !           405:   sqlite3 db test.db
        !           406:   catchsql {
        !           407:     SELECT a FROM collate3t1 ORDER BY 1;
        !           408:   }
        !           409: } {1 {no such collation sequence: unk}}
        !           410: do_test collate3-5.8 {
        !           411:   set ::cfact_cnt 0
        !           412:   proc cfact {nm} {
        !           413:     db collate $nm {string compare}
        !           414:     incr ::cfact_cnt
        !           415:   }
        !           416:   db collation_needed cfact
        !           417:   catchsql {
        !           418:     SELECT a FROM collate3t1 ORDER BY 1;
        !           419:   }
        !           420: } {0 {}}
        !           421: 
        !           422: do_test collate3-5.9 {
        !           423:   execsql {
        !           424:     DROP TABLE collate3t1;
        !           425:   }
        !           426: } {}
        !           427: 
        !           428: finish_test

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