xref: /sqlite-3.40.0/ext/rbu/rbupartial.test (revision dff1d5b6)
1# 2019 April 11
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#
12
13source [file join [file dirname [info script]] rbu_common.tcl]
14set ::testprefix rbupartial
15
16db close
17sqlite3_shutdown
18sqlite3_config_uri 1
19
20foreach {tn without_rowid a b c d} {
21  1 ""              a b c d
22  2 "WITHOUT ROWID" aaa bbb ccc ddd
23  3 "WITHOUT ROWID" "\"hello\"" {"one'two"}  {[c]} ddd
24  4 "WITHOUT ROWID" {`a b`} {"one'two"}  {[c c c]} ddd
25  5 "" a b c {"d""d"}
26  6 "" {'one''two'} b {"c""c"} {"d""d"}
27} {
28  eval [string map [list \
29    %WITHOUT_ROWID% $without_rowid %A% $a %B% $b %C% $c %D% $d
30  ] {
31  reset_db
32  do_execsql_test $tn.1.0 {
33    CREATE TABLE t1(%A% PRIMARY KEY, %B%, %C%, %D%) %WITHOUT_ROWID% ;
34    CREATE INDEX i1b  ON t1(%B%);
35    CREATE INDEX i1b2 ON t1(%B%) WHERE %C%<5;
36    CREATE INDEX i1b3 ON t1(%B%) WHERE %C%>=5;
37
38    CREATE INDEX i1c  ON t1(%C%);
39    CREATE INDEX i1c2 ON t1(%C%) WHERE %C% IS NULL;
40    CREATE INDEX i1c3 ON t1(%C%) WHERE %C% IS NOT NULL;
41
42    CREATE INDEX i1c4 ON t1(%C%) WHERE %D% < 'd';
43    CREATE INDEX i1c5 ON t1(
44        %C%                   -- for (c = ... expressions
45    ) WHERE %D% < 'd';
46    CREATE INDEX i1c6 ON t1(
47        %C% /* Again, for (c=... expr */, %D%
48    ) WHERE %D% < 'd';
49
50    CREATE INDEX i1c7 ON t1(
51        %C% /* As before, for (c=... "expr */) WHERE %D% < 'd';
52  }
53
54  do_execsql_test $tn.1.1 {
55    INSERT INTO t1 VALUES(0, NULL, NULL, 'a');
56    INSERT INTO t1 VALUES(1, 2, 3, 'b');
57    INSERT INTO t1 VALUES(4, 5, 6, 'c');
58    INSERT INTO t1 VALUES(7, 8, 9, 'd');
59  }
60
61  forcedelete rbu.db
62  do_test $tn.1.2 {
63    sqlite3 rbu rbu.db
64    rbu eval {
65      CREATE TABLE data_t1(%A%, %B%, %C%, %D%, rbu_control);
66
67      INSERT INTO data_t1 VALUES(10, 11, 12, 'e', 0);
68      INSERT INTO data_t1 VALUES(13, 14, NULL, 'f', 0);
69
70      INSERT INTO data_t1 VALUES(0, NULL, NULL, NULL, 1);
71      INSERT INTO data_t1 VALUES(4, NULL, NULL, NULL, 1);
72
73      INSERT INTO data_t1 VALUES(7, NULL, 4, NULL, '..x.');
74      INSERT INTO data_t1 VALUES(1, 10, NULL, NULL, '.xx.');
75    }
76    rbu close
77  } {}
78
79  do_test $tn.1.3 {
80    run_rbu test.db rbu.db
81    execsql { PRAGMA integrity_check }
82  } {ok}
83
84  do_execsql_test $tn.1.4 {
85    SELECT * FROM t1 ORDER BY %A%;
86  } {
87    1 10 {} b   7 8 4 d   10 11 12 e   13 14 {} f
88  }
89
90  set step 0
91  do_rbu_vacuum_test $tn.1.5 0
92
93  do_test $tn.1.6 {
94    execsql { PRAGMA integrity_check }
95  } {ok}
96  }]
97}
98
99finish_test
100