xref: /sqlite-3.40.0/ext/rbu/rbu10.test (revision fd779e2f)
1# 2014 August 30
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
13if {![info exists testdir]} {
14  set testdir [file join [file dirname [info script]] .. .. test]
15}
16source $testdir/tester.tcl
17set ::testprefix rbu10
18
19
20#--------------------------------------------------------------------
21# Test that UPDATE commands work even if the input columns are in a
22# different order to the output columns.
23#
24do_execsql_test 1.0 {
25  CREATE TABLE t1(a INTEGER PRIMARY KEY, b, c);
26  INSERT INTO t1 VALUES(1, 'b', 'c');
27}
28
29proc apply_rbu {sql} {
30  forcedelete rbu.db
31  sqlite3 db2 rbu.db
32  db2 eval $sql
33  db2 close
34  sqlite3rbu rbu test.db rbu.db
35  while { [rbu step]=="SQLITE_OK" } {}
36  rbu close
37}
38
39do_test 1.1 {
40  apply_rbu {
41    CREATE TABLE data_t1(a, c, b, rbu_control);
42    INSERT INTO data_t1 VALUES(1, 'xxx', NULL, '.x.');
43  }
44  db eval { SELECT * FROM t1 }
45} {1 b xxx}
46
47#--------------------------------------------------------------------
48# Test that the hidden languageid column of an fts4 table can be
49# written.
50#
51ifcapable fts3 {
52  do_execsql_test 2.0 {
53    create virtual TABLE ft USING fts4(a, b, languageid='langid');
54  }
55  do_test 2.1 {
56    apply_rbu {
57      CREATE TABLE data_ft(a, b, rbu_rowid, langid, rbu_control);
58      INSERT INTO data_ft VALUES('a', 'b', 22, 1, 0);    -- insert
59      INSERT INTO data_ft VALUES('a', 'b', 23, 10, 0);   -- insert
60      INSERT INTO data_ft VALUES('a', 'b', 24, 100, 0);  -- insert
61    }
62    db eval { SELECT a, b, rowid, langid FROM ft }
63  } [list {*}{
64    a b 22 1
65    a b 23 10
66    a b 24 100
67  }]
68
69  # Or not - this data_xxx table has no langid column, so langid
70  # defaults to 0.
71  #
72  do_test 2.2 {
73    apply_rbu {
74      CREATE TABLE data_ft(a, b, rbu_rowid, rbu_control);
75      INSERT INTO data_ft VALUES('a', 'b', 25, 0);    -- insert
76    }
77    db eval { SELECT a, b, rowid, langid FROM ft }
78  } [list {*}{
79    a b 22 1
80    a b 23 10
81    a b 24 100
82    a b 25 0
83  }]
84
85  # Update langid.
86  #
87  do_test 2.3 {
88    apply_rbu {
89      CREATE TABLE data_ft(a, b, rbu_rowid, langid, rbu_control);
90      INSERT INTO data_ft VALUES(NULL, NULL, 23, 50, '..x');
91      INSERT INTO data_ft VALUES(NULL, NULL, 25, 500, '..x');
92    }
93    db eval { SELECT a, b, rowid, langid FROM ft }
94  } [list {*}{
95    a b 22 1
96    a b 23 50
97    a b 24 100
98    a b 25 500
99  }]
100}
101
102#--------------------------------------------------------------------
103# Test that if writing a hidden virtual table column is an error,
104# attempting to do so via rbu is also an error.
105#
106ifcapable fts3 {
107  do_execsql_test 3.0 {
108    CREATE VIRTUAL TABLE xt USING fts4(a);
109  }
110  do_test 3.1 {
111    list [catch {
112      apply_rbu {
113        CREATE TABLE data_xt(a, xt, rbu_rowid, rbu_control);
114        INSERT INTO data_xt VALUES('a', 'b', 1, 0);
115      }
116    } msg] $msg
117  } {1 {SQLITE_ERROR - SQL logic error}}
118}
119
120#--------------------------------------------------------------------
121# Test that it is not possible to violate a NOT NULL constraint by
122# applying an RBU update.
123#
124do_execsql_test 4.1 {
125  CREATE TABLE t2(a INTEGER NOT NULL, b TEXT NOT NULL, c PRIMARY KEY);
126  CREATE TABLE t3(a INTEGER NOT NULL, b TEXT NOT NULL, c INTEGER PRIMARY KEY);
127  CREATE TABLE t4(a, b, PRIMARY KEY(a, b)) WITHOUT ROWID;
128
129  INSERT INTO t2 VALUES(10, 10, 10);
130  INSERT INTO t3 VALUES(10, 10, 10);
131  INSERT INTO t4 VALUES(10, 10);
132}
133
134foreach {tn error rbu} {
135  2 {SQLITE_CONSTRAINT - NOT NULL constraint failed: t2.a} {
136    INSERT INTO data_t2 VALUES(NULL, 'abc', 1, 0);
137  }
138  3 {SQLITE_CONSTRAINT - NOT NULL constraint failed: t2.b} {
139    INSERT INTO data_t2 VALUES(2, NULL, 1, 0);
140  }
141  4 {SQLITE_CONSTRAINT - NOT NULL constraint failed: t2.c} {
142    INSERT INTO data_t2 VALUES(1, 'abc', NULL, 0);
143  }
144
145  5 {SQLITE_MISMATCH - datatype mismatch} {
146    INSERT INTO data_t3 VALUES(1, 'abc', NULL, 0);
147  }
148
149  6 {SQLITE_CONSTRAINT - NOT NULL constraint failed: t4.b} {
150    INSERT INTO data_t4 VALUES('a', NULL, 0);
151  }
152  7 {SQLITE_CONSTRAINT - NOT NULL constraint failed: t4.a} {
153    INSERT INTO data_t4 VALUES(NULL, 'a', 0);
154  }
155  8  {SQLITE_CONSTRAINT - NOT NULL constraint failed: t2.a} {
156    INSERT INTO data_t2 VALUES(NULL, 0, 10, 'x..');
157  }
158  9  {SQLITE_CONSTRAINT - NOT NULL constraint failed: t3.b} {
159    INSERT INTO data_t3 VALUES(10, NULL, 10, '.x.');
160  }
161
162  10 {SQLITE_MISMATCH - datatype mismatch} {
163    INSERT INTO data_t3 VALUES(1, 'abc', 'text', 0);
164  }
165} {
166  set rbu "
167    CREATE TABLE data_t2(a, b, c, rbu_control);
168    CREATE TABLE data_t3(a, b, c, rbu_control);
169    CREATE TABLE data_t4(a, b, rbu_control);
170    $rbu
171  "
172  do_test 4.2.$tn {
173    list [catch { apply_rbu $rbu } msg] $msg
174  } [list 1 $error]
175}
176
177do_test 4.3 {
178  set rbu {
179    CREATE TABLE data_t3(a, b, c, rbu_control);
180    INSERT INTO data_t3 VALUES(1, 'abc', '5', 0);
181    INSERT INTO data_t3 VALUES(1, 'abc', '-6.0', 0);
182  }
183  list [catch { apply_rbu $rbu } msg] $msg
184} {0 SQLITE_DONE}
185
186
187finish_test
188