| OLD | NEW | 
 | (Empty) | 
|    1 # |  | 
|    2 # 2001 September 15 |  | 
|    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 collation sequences in concert with triggers. |  | 
|   14 # |  | 
|   15 # $Id: collate6.test,v 1.4 2007/07/30 14:40:48 danielk1977 Exp $ |  | 
|   16  |  | 
|   17 set testdir [file dirname $argv0] |  | 
|   18 source $testdir/tester.tcl |  | 
|   19  |  | 
|   20 # There are no tests in this file that will work without |  | 
|   21 # trigger support. |  | 
|   22 # |  | 
|   23 ifcapable {!trigger} { |  | 
|   24   finish_test |  | 
|   25   return |  | 
|   26 } |  | 
|   27  |  | 
|   28 # Create a case-insensitive collation type NOCASE for use in testing.  |  | 
|   29 # Normally, capital letters are less than their lower-case counterparts. |  | 
|   30 db collate NOCASE nocase_collate |  | 
|   31 proc nocase_collate {a b} { |  | 
|   32   return [string compare -nocase $a $b] |  | 
|   33 } |  | 
|   34  |  | 
|   35 # |  | 
|   36 # Tests are organized as follows: |  | 
|   37 # collate6-1.* - triggers. |  | 
|   38 # |  | 
|   39  |  | 
|   40 do_test collate6-1.0 { |  | 
|   41   execsql { |  | 
|   42     CREATE TABLE collate6log(a, b); |  | 
|   43     CREATE TABLE collate6tab(a COLLATE NOCASE, b COLLATE BINARY); |  | 
|   44   } |  | 
|   45 } {} |  | 
|   46  |  | 
|   47 # Test that the default collation sequence applies to new.* references  |  | 
|   48 # in WHEN clauses. |  | 
|   49 do_test collate6-1.1 { |  | 
|   50   execsql { |  | 
|   51     CREATE TRIGGER collate6trig BEFORE INSERT ON collate6tab  |  | 
|   52       WHEN new.a = 'a' BEGIN |  | 
|   53         INSERT INTO collate6log VALUES(new.a, new.b); |  | 
|   54     END; |  | 
|   55   } |  | 
|   56 } {} |  | 
|   57 do_test collate6-1.2 { |  | 
|   58   execsql { |  | 
|   59     INSERT INTO collate6tab VALUES('a', 'b'); |  | 
|   60     SELECT * FROM collate6log; |  | 
|   61   } |  | 
|   62 } {a b} |  | 
|   63 do_test collate6-1.3 { |  | 
|   64   execsql { |  | 
|   65     INSERT INTO collate6tab VALUES('A', 'B'); |  | 
|   66     SELECT * FROM collate6log; |  | 
|   67   } |  | 
|   68 } {a b A B} |  | 
|   69 do_test collate6-1.4 { |  | 
|   70   execsql { |  | 
|   71     DROP TRIGGER collate6trig; |  | 
|   72     DELETE FROM collate6log; |  | 
|   73   }  |  | 
|   74 } {} |  | 
|   75  |  | 
|   76 # Test that the default collation sequence applies to new.* references  |  | 
|   77 # in the body of triggers. |  | 
|   78 do_test collate6-1.5 { |  | 
|   79   execsql { |  | 
|   80     CREATE TRIGGER collate6trig BEFORE INSERT ON collate6tab BEGIN |  | 
|   81       INSERT INTO collate6log VALUES(new.a='a', new.b='b'); |  | 
|   82     END; |  | 
|   83   } |  | 
|   84 } {} |  | 
|   85 do_test collate6-1.6 { |  | 
|   86   execsql { |  | 
|   87     INSERT INTO collate6tab VALUES('a', 'b'); |  | 
|   88     SELECT * FROM collate6log; |  | 
|   89   } |  | 
|   90 } {1 1} |  | 
|   91 do_test collate6-1.7 { |  | 
|   92   execsql { |  | 
|   93     INSERT INTO collate6tab VALUES('A', 'B'); |  | 
|   94     SELECT * FROM collate6log; |  | 
|   95   } |  | 
|   96 } {1 1 1 0} |  | 
|   97 do_test collate6-1.8 { |  | 
|   98   execsql { |  | 
|   99     DROP TRIGGER collate6trig; |  | 
|  100     DELETE FROM collate6log; |  | 
|  101   }  |  | 
|  102 } {} |  | 
|  103  |  | 
|  104 do_test collate6-1.9 { |  | 
|  105   execsql { |  | 
|  106     DROP TABLE collate6tab; |  | 
|  107   } |  | 
|  108 } {} |  | 
|  109  |  | 
|  110 # Test that an explicit collation sequence overrides an implicit  |  | 
|  111 # one attached to a 'new' reference. |  | 
|  112 # |  | 
|  113 do_test collate6-2.1 { |  | 
|  114   execsql { |  | 
|  115     CREATE TABLE abc(a COLLATE binary, b, c); |  | 
|  116     CREATE TABLE def(a, b, c); |  | 
|  117     CREATE TRIGGER abc_t1 AFTER INSERT ON abc BEGIN |  | 
|  118       INSERT INTO def SELECT * FROM abc WHERE a < new.a COLLATE nocase; |  | 
|  119     END |  | 
|  120   } |  | 
|  121 } {} |  | 
|  122 do_test collate6-2.2 { |  | 
|  123   execsql { |  | 
|  124     INSERT INTO abc VALUES('One', 'Two', 'Three'); |  | 
|  125     INSERT INTO abc VALUES('one', 'two', 'three'); |  | 
|  126     SELECT * FROM def; |  | 
|  127   } |  | 
|  128 } {} |  | 
|  129 do_test collate6-2.3 { |  | 
|  130   execsql { |  | 
|  131     UPDATE abc SET a = 'four' WHERE a = 'one'; |  | 
|  132     CREATE TRIGGER abc_t2 AFTER UPDATE ON abc BEGIN |  | 
|  133       INSERT INTO def SELECT * FROM abc WHERE a < new.a COLLATE nocase; |  | 
|  134     END; |  | 
|  135     SELECT * FROM def; |  | 
|  136   } |  | 
|  137 } {} |  | 
|  138  |  | 
|  139 # At one point the 6-3.2 (but not 6-3.1) was causing an assert() to fail. |  | 
|  140 # |  | 
|  141 do_test collate6-3.1 { |  | 
|  142   execsql { |  | 
|  143     SELECT 1 FROM sqlite_master WHERE name COLLATE nocase = 'hello'; |  | 
|  144   } |  | 
|  145 } {} |  | 
|  146 do_test collate6-3.2 { |  | 
|  147   execsql { |  | 
|  148     SELECT 1 FROM sqlite_master WHERE 'hello' = name COLLATE nocase; |  | 
|  149   } |  | 
|  150 } {} |  | 
|  151  |  | 
|  152  |  | 
|  153 finish_test |  | 
| OLD | NEW |