aboutsummaryrefslogtreecommitdiff
path: root/ext/session/session_gen.test
blob: e9de4beabaa6a23085d25ea3753ae5153690fbed (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
# 2025 Jan 28
#
# The author disclaims copyright to this source code.  In place of
# a legal notice, here is a blessing:
#
#    May you do good and not evil.
#    May you find forgiveness for yourself and forgive others.
#    May you share freely, never taking more than you give.
#
#***********************************************************************
# This file implements regression tests for SQLite library.
#

if {![info exists testdir]} {
  set testdir [file join [file dirname [info script]] .. .. test]
} 
source [file join [file dirname [info script]] session_common.tcl]
source $testdir/tester.tcl
ifcapable !session {finish_test; return}

set testprefix session_gen


foreach {otn sct} {
  1  VIRTUAL
  2  STORED
} {
eval [string map [list %TYPE% $sct] {
  reset_db
  set testprefix $testprefix-$otn

do_execsql_test 1.0 {
  CREATE TABLE t1(a INTEGER PRIMARY KEY, b);

  CREATE TABLE t2(a INTEGER PRIMARY KEY, b AS (c+1) %TYPE%, c);

  CREATE TABLE t3(
    a, 
    b AS (a+10) %TYPE%, 
    c, 
    d AS (c+1) %TYPE%, 
    e, 
    PRIMARY KEY(c, e)
  ) WITHOUT ROWID;

  CREATE TABLE t4(a AS (c*100) %TYPE%, b INTEGER PRIMARY KEY, c);

  CREATE TABLE t5(x, y);
}

foreach {tn sql changeset} {
  
  0.1 {
    INSERT INTO t5 VALUES('abc', 'def');
  } {
    {INSERT t5 0 X.. {} {i 1 t abc t def}}
  }
  0.2 {
    UPDATE t5 SET y='xyz' WHERE rowid=1;
  } {
    {UPDATE t5 0 X.. {i 1 {} {} t def} {{} {} {} {} t xyz}}
  }
  0.3 {
    DELETE FROM t5;
  } {
    {DELETE t5 0 X.. {i 1 t abc t xyz} {}}
  }

  1.1 {
    INSERT INTO t2 VALUES(1, 2);
    INSERT INTO t2 VALUES(2, 123);
  } {
    {INSERT t2 0 X. {} {i 1 i 2}}
    {INSERT t2 0 X. {} {i 2 i 123}}
  }
  1.2 {
    UPDATE t2 SET c=456 WHERE a=1
  } {
    {UPDATE t2 0 X. {i 1 i 2} {{} {} i 456}}
  }

  1.3 {
    DELETE FROM t2 WHERE a=2
  } {
    {DELETE t2 0 X. {i 2 i 123} {}}
  }

  1.4 {
    UPDATE t2 SET a=15
  } {
    {INSERT t2 0 X. {} {i 15 i 456}} 
    {DELETE t2 0 X. {i 1 i 456} {}}
  }

  2.1 {
    INSERT INTO t3 VALUES(5, 6, 7);
    INSERT INTO t3 VALUES(8, 9, 10);
  } {
    {INSERT t3 0 .XX {} {i 8 i 9 i 10}}
    {INSERT t3 0 .XX {} {i 5 i 6 i 7}}
  }

  2.2 {
    UPDATE t3 SET a = 505 WHERE (c, e) = (6, 7);
  } {
    {UPDATE t3 0 .XX {i 5 i 6 i 7} {i 505 {} {} {} {}}}
  }

  2.3 {
    DELETE FROM t3 WHERE (c, e) = (9, 10);
  } {
    {DELETE t3 0 .XX {i 8 i 9 i 10} {}}
  }

  2.4 {
    UPDATE t3 SET c=1000
  } {
    {DELETE t3 0 .XX {i 505 i 6 i 7} {}}
    {INSERT t3 0 .XX {} {i 505 i 1000 i 7}}
  }

  3.1 {
    INSERT INTO t4 VALUES(100, 100);
  } {
    {INSERT t4 0 X. {} {i 100 i 100}}
  }

} {
  do_test 1.$tn.1 {
    sqlite3session S db main
  S object_config rowid 1
    S attach *
    execsql $sql
  } {}

  do_changeset_test 1.$tn.2 S $changeset

  S delete
}
#-------------------------------------------------------------------------
reset_db

forcedelete test.db2
sqlite3 db2 test.db2

do_common_sql {
  CREATE TABLE t0(x INTEGER PRIMARY KEY, y);
  INSERT INTO t0 VALUES(1, 'one');
  INSERT INTO t0 VALUES(2, 'two');

  CREATE TABLE t1(a AS (c*10) %TYPE%, b INTEGER PRIMARY KEY, c);
  INSERT INTO t1 VALUES(1, 5);
  INSERT INTO t1 VALUES(2, 10);
  INSERT INTO t1 VALUES(3, 5);

  CREATE TABLE t2(
    a, b, c AS (a*b) %TYPE%,
    'k 1', 'k 2', PRIMARY KEY('k 1', 'k 2')
  ) WITHOUT ROWID;
  INSERT INTO t2 VALUES('a', 'b', 1, 11);
  INSERT INTO t2 VALUES('A', 'B', 2, 22);
  INSERT INTO t2 VALUES('Aa', 'Bb', 3, 33);
}

foreach {tn sql} {
  1.1 { INSERT INTO t0 VALUES(4, 15) }
  1.2 { INSERT INTO t1 VALUES(4, 15) }
  1.3 { INSERT INTO t2 VALUES(1, 2, 3, 4) }

  2.1 { UPDATE t1 SET c=100 WHERE b=2 }
  2.2 { UPDATE t2 SET a=11 }

  3.1 { DELETE FROM t2 WHERE (t2.'k 1') = 2 }
  3.2 { DELETE FROM t1 }
} {
  do_test 2.$tn.1 {
  # execsql { PRAGMA vdbe_listing = 1 } db2
    do_then_apply_sql $sql
  } {}
  do_test 2.$tn.2 {
    compare_db db db2
  } {}
}
db2 close

}]}




finish_test