Annotation of embedaddon/sqlite3/test/update.test, revision 1.1.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 file is testing the UPDATE statement.
13: #
14: # $Id: update.test,v 1.19 2008/04/10 18:44:36 drh Exp $
15:
16: set testdir [file dirname $argv0]
17: source $testdir/tester.tcl
18:
19: # Try to update an non-existent table
20: #
21: do_test update-1.1 {
22: set v [catch {execsql {UPDATE test1 SET f2=5 WHERE f1<1}} msg]
23: lappend v $msg
24: } {1 {no such table: test1}}
25:
26: # Try to update a read-only table
27: #
28: do_test update-2.1 {
29: set v [catch \
30: {execsql {UPDATE sqlite_master SET name='xyz' WHERE name='123'}} msg]
31: lappend v $msg
32: } {1 {table sqlite_master may not be modified}}
33:
34: # Create a table to work with
35: #
36: do_test update-3.1 {
37: execsql {CREATE TABLE test1(f1 int,f2 int)}
38: for {set i 1} {$i<=10} {incr i} {
39: set sql "INSERT INTO test1 VALUES($i,[expr {1<<$i}])"
40: execsql $sql
41: }
42: execsql {SELECT * FROM test1 ORDER BY f1}
43: } {1 2 2 4 3 8 4 16 5 32 6 64 7 128 8 256 9 512 10 1024}
44:
45: # Unknown column name in an expression
46: #
47: do_test update-3.2 {
48: set v [catch {execsql {UPDATE test1 SET f1=f3*2 WHERE f2==32}} msg]
49: lappend v $msg
50: } {1 {no such column: f3}}
51: do_test update-3.3 {
52: set v [catch {execsql {UPDATE test1 SET f1=test2.f1*2 WHERE f2==32}} msg]
53: lappend v $msg
54: } {1 {no such column: test2.f1}}
55: do_test update-3.4 {
56: set v [catch {execsql {UPDATE test1 SET f3=f1*2 WHERE f2==32}} msg]
57: lappend v $msg
58: } {1 {no such column: f3}}
59:
60: # Actually do some updates
61: #
62: do_test update-3.5 {
63: execsql {UPDATE test1 SET f2=f2*3}
64: } {}
65: do_test update-3.5.1 {
66: db changes
67: } {10}
68:
69: # verify that SELECT does not reset the change counter
70: do_test update-3.5.2 {
71: db eval {SELECT count(*) FROM test1}
72: } {10}
73: do_test update-3.5.3 {
74: db changes
75: } {10}
76:
77: do_test update-3.6 {
78: execsql {SELECT * FROM test1 ORDER BY f1}
79: } {1 6 2 12 3 24 4 48 5 96 6 192 7 384 8 768 9 1536 10 3072}
80: do_test update-3.7 {
81: execsql {PRAGMA count_changes=on}
82: execsql {UPDATE test1 SET f2=f2/3 WHERE f1<=5}
83: } {5}
84: do_test update-3.8 {
85: execsql {SELECT * FROM test1 ORDER BY f1}
86: } {1 2 2 4 3 8 4 16 5 32 6 192 7 384 8 768 9 1536 10 3072}
87: do_test update-3.9 {
88: execsql {UPDATE test1 SET f2=f2/3 WHERE f1>5}
89: } {5}
90: do_test update-3.10 {
91: execsql {SELECT * FROM test1 ORDER BY f1}
92: } {1 2 2 4 3 8 4 16 5 32 6 64 7 128 8 256 9 512 10 1024}
93:
94: # Swap the values of f1 and f2 for all elements
95: #
96: do_test update-3.11 {
97: execsql {UPDATE test1 SET F2=f1, F1=f2}
98: } {10}
99: do_test update-3.12 {
100: execsql {SELECT * FROM test1 ORDER BY F1}
101: } {2 1 4 2 8 3 16 4 32 5 64 6 128 7 256 8 512 9 1024 10}
102: do_test update-3.13 {
103: execsql {PRAGMA count_changes=off}
104: execsql {UPDATE test1 SET F2=f1, F1=f2}
105: } {}
106: do_test update-3.14 {
107: execsql {SELECT * FROM test1 ORDER BY F1}
108: } {1 2 2 4 3 8 4 16 5 32 6 64 7 128 8 256 9 512 10 1024}
109:
110: # Create duplicate entries and make sure updating still
111: # works.
112: #
113: do_test update-4.0 {
114: execsql {
115: DELETE FROM test1 WHERE f1<=5;
116: INSERT INTO test1(f1,f2) VALUES(8,88);
117: INSERT INTO test1(f1,f2) VALUES(8,888);
118: INSERT INTO test1(f1,f2) VALUES(77,128);
119: INSERT INTO test1(f1,f2) VALUES(777,128);
120: }
121: execsql {SELECT * FROM test1 ORDER BY f1,f2}
122: } {6 64 7 128 8 88 8 256 8 888 9 512 10 1024 77 128 777 128}
123: do_test update-4.1 {
124: execsql {UPDATE test1 SET f2=f2+1 WHERE f1==8}
125: execsql {SELECT * FROM test1 ORDER BY f1,f2}
126: } {6 64 7 128 8 89 8 257 8 889 9 512 10 1024 77 128 777 128}
127: do_test update-4.2 {
128: execsql {UPDATE test1 SET f2=f2-1 WHERE f1==8 and f2>800}
129: execsql {SELECT * FROM test1 ORDER BY f1,f2}
130: } {6 64 7 128 8 89 8 257 8 888 9 512 10 1024 77 128 777 128}
131: do_test update-4.3 {
132: execsql {UPDATE test1 SET f2=f2-1 WHERE f1==8 and f2<800}
133: execsql {SELECT * FROM test1 ORDER BY f1,f2}
134: } {6 64 7 128 8 88 8 256 8 888 9 512 10 1024 77 128 777 128}
135: do_test update-4.4 {
136: execsql {UPDATE test1 SET f1=f1+1 WHERE f2==128}
137: execsql {SELECT * FROM test1 ORDER BY f1,f2}
138: } {6 64 8 88 8 128 8 256 8 888 9 512 10 1024 78 128 778 128}
139: do_test update-4.5 {
140: execsql {UPDATE test1 SET f1=f1-1 WHERE f1>100 and f2==128}
141: execsql {SELECT * FROM test1 ORDER BY f1,f2}
142: } {6 64 8 88 8 128 8 256 8 888 9 512 10 1024 78 128 777 128}
143: do_test update-4.6 {
144: execsql {
145: PRAGMA count_changes=on;
146: UPDATE test1 SET f1=f1-1 WHERE f1<=100 and f2==128;
147: }
148: } {2}
149: do_test update-4.7 {
150: execsql {
151: PRAGMA count_changes=off;
152: SELECT * FROM test1 ORDER BY f1,f2
153: }
154: } {6 64 7 128 8 88 8 256 8 888 9 512 10 1024 77 128 777 128}
155:
156: # Repeat the previous sequence of tests with an index.
157: #
158: do_test update-5.0 {
159: execsql {CREATE INDEX idx1 ON test1(f1)}
160: execsql {SELECT * FROM test1 ORDER BY f1,f2}
161: } {6 64 7 128 8 88 8 256 8 888 9 512 10 1024 77 128 777 128}
162: do_test update-5.1 {
163: execsql {UPDATE test1 SET f2=f2+1 WHERE f1==8}
164: execsql {SELECT * FROM test1 ORDER BY f1,f2}
165: } {6 64 7 128 8 89 8 257 8 889 9 512 10 1024 77 128 777 128}
166: do_test update-5.2 {
167: execsql {UPDATE test1 SET f2=f2-1 WHERE f1==8 and f2>800}
168: execsql {SELECT * FROM test1 ORDER BY f1,f2}
169: } {6 64 7 128 8 89 8 257 8 888 9 512 10 1024 77 128 777 128}
170: do_test update-5.3 {
171: execsql {UPDATE test1 SET f2=f2-1 WHERE f1==8 and f2<800}
172: execsql {SELECT * FROM test1 ORDER BY f1,f2}
173: } {6 64 7 128 8 88 8 256 8 888 9 512 10 1024 77 128 777 128}
174: do_test update-5.4 {
175: execsql {UPDATE test1 SET f1=f1+1 WHERE f2==128}
176: execsql {SELECT * FROM test1 ORDER BY f1,f2}
177: } {6 64 8 88 8 128 8 256 8 888 9 512 10 1024 78 128 778 128}
178: do_test update-5.4.1 {
179: execsql {SELECT * FROM test1 WHERE f1==78 ORDER BY f1,f2}
180: } {78 128}
181: do_test update-5.4.2 {
182: execsql {SELECT * FROM test1 WHERE f1==778 ORDER BY f1,f2}
183: } {778 128}
184: do_test update-5.4.3 {
185: execsql {SELECT * FROM test1 WHERE f1==8 ORDER BY f1,f2}
186: } {8 88 8 128 8 256 8 888}
187: do_test update-5.5 {
188: execsql {UPDATE test1 SET f1=f1-1 WHERE f1>100 and f2==128}
189: } {}
190: do_test update-5.5.1 {
191: execsql {SELECT * FROM test1 ORDER BY f1,f2}
192: } {6 64 8 88 8 128 8 256 8 888 9 512 10 1024 78 128 777 128}
193: do_test update-5.5.2 {
194: execsql {SELECT * FROM test1 WHERE f1==78 ORDER BY f1,f2}
195: } {78 128}
196: do_test update-5.5.3 {
197: execsql {SELECT * FROM test1 WHERE f1==778 ORDER BY f1,f2}
198: } {}
199: do_test update-5.5.4 {
200: execsql {SELECT * FROM test1 WHERE f1==777 ORDER BY f1,f2}
201: } {777 128}
202: do_test update-5.5.5 {
203: execsql {SELECT * FROM test1 WHERE f1==8 ORDER BY f1,f2}
204: } {8 88 8 128 8 256 8 888}
205: do_test update-5.6 {
206: execsql {
207: PRAGMA count_changes=on;
208: UPDATE test1 SET f1=f1-1 WHERE f1<=100 and f2==128;
209: }
210: } {2}
211: do_test update-5.6.1 {
212: execsql {
213: PRAGMA count_changes=off;
214: SELECT * FROM test1 ORDER BY f1,f2
215: }
216: } {6 64 7 128 8 88 8 256 8 888 9 512 10 1024 77 128 777 128}
217: do_test update-5.6.2 {
218: execsql {SELECT * FROM test1 WHERE f1==77 ORDER BY f1,f2}
219: } {77 128}
220: do_test update-5.6.3 {
221: execsql {SELECT * FROM test1 WHERE f1==778 ORDER BY f1,f2}
222: } {}
223: do_test update-5.6.4 {
224: execsql {SELECT * FROM test1 WHERE f1==777 ORDER BY f1,f2}
225: } {777 128}
226: do_test update-5.6.5 {
227: execsql {SELECT * FROM test1 WHERE f1==8 ORDER BY f1,f2}
228: } {8 88 8 256 8 888}
229:
230: # Repeat the previous sequence of tests with a different index.
231: #
232: execsql {PRAGMA synchronous=FULL}
233: do_test update-6.0 {
234: execsql {DROP INDEX idx1}
235: execsql {CREATE INDEX idx1 ON test1(f2)}
236: execsql {SELECT * FROM test1 ORDER BY f1,f2}
237: } {6 64 7 128 8 88 8 256 8 888 9 512 10 1024 77 128 777 128}
238: do_test update-6.1 {
239: execsql {UPDATE test1 SET f2=f2+1 WHERE f1==8}
240: execsql {SELECT * FROM test1 ORDER BY f1,f2}
241: } {6 64 7 128 8 89 8 257 8 889 9 512 10 1024 77 128 777 128}
242: do_test update-6.1.1 {
243: execsql {SELECT * FROM test1 WHERE f1==8 ORDER BY f1,f2}
244: } {8 89 8 257 8 889}
245: do_test update-6.1.2 {
246: execsql {SELECT * FROM test1 WHERE f2==89 ORDER BY f1,f2}
247: } {8 89}
248: do_test update-6.1.3 {
249: execsql {SELECT * FROM test1 WHERE f1==88 ORDER BY f1,f2}
250: } {}
251: do_test update-6.2 {
252: execsql {UPDATE test1 SET f2=f2-1 WHERE f1==8 and f2>800}
253: execsql {SELECT * FROM test1 ORDER BY f1,f2}
254: } {6 64 7 128 8 89 8 257 8 888 9 512 10 1024 77 128 777 128}
255: do_test update-6.3 {
256: execsql {UPDATE test1 SET f2=f2-1 WHERE f1==8 and f2<800}
257: execsql {SELECT * FROM test1 ORDER BY f1,f2}
258: } {6 64 7 128 8 88 8 256 8 888 9 512 10 1024 77 128 777 128}
259: do_test update-6.3.1 {
260: execsql {SELECT * FROM test1 WHERE f1==8 ORDER BY f1,f2}
261: } {8 88 8 256 8 888}
262: do_test update-6.3.2 {
263: execsql {SELECT * FROM test1 WHERE f2==89 ORDER BY f1,f2}
264: } {}
265: do_test update-6.3.3 {
266: execsql {SELECT * FROM test1 WHERE f2==88 ORDER BY f1,f2}
267: } {8 88}
268: do_test update-6.4 {
269: execsql {UPDATE test1 SET f1=f1+1 WHERE f2==128}
270: execsql {SELECT * FROM test1 ORDER BY f1,f2}
271: } {6 64 8 88 8 128 8 256 8 888 9 512 10 1024 78 128 778 128}
272: do_test update-6.4.1 {
273: execsql {SELECT * FROM test1 WHERE f1==78 ORDER BY f1,f2}
274: } {78 128}
275: do_test update-6.4.2 {
276: execsql {SELECT * FROM test1 WHERE f1==778 ORDER BY f1,f2}
277: } {778 128}
278: do_test update-6.4.3 {
279: execsql {SELECT * FROM test1 WHERE f1==8 ORDER BY f1,f2}
280: } {8 88 8 128 8 256 8 888}
281: do_test update-6.5 {
282: execsql {UPDATE test1 SET f1=f1-1 WHERE f1>100 and f2==128}
283: execsql {SELECT * FROM test1 ORDER BY f1,f2}
284: } {6 64 8 88 8 128 8 256 8 888 9 512 10 1024 78 128 777 128}
285: do_test update-6.5.1 {
286: execsql {SELECT * FROM test1 WHERE f1==78 ORDER BY f1,f2}
287: } {78 128}
288: do_test update-6.5.2 {
289: execsql {SELECT * FROM test1 WHERE f1==778 ORDER BY f1,f2}
290: } {}
291: do_test update-6.5.3 {
292: execsql {SELECT * FROM test1 WHERE f1==777 ORDER BY f1,f2}
293: } {777 128}
294: do_test update-6.5.4 {
295: execsql {SELECT * FROM test1 WHERE f1==8 ORDER BY f1,f2}
296: } {8 88 8 128 8 256 8 888}
297: do_test update-6.6 {
298: execsql {UPDATE test1 SET f1=f1-1 WHERE f1<=100 and f2==128}
299: execsql {SELECT * FROM test1 ORDER BY f1,f2}
300: } {6 64 7 128 8 88 8 256 8 888 9 512 10 1024 77 128 777 128}
301: do_test update-6.6.1 {
302: execsql {SELECT * FROM test1 WHERE f1==77 ORDER BY f1,f2}
303: } {77 128}
304: do_test update-6.6.2 {
305: execsql {SELECT * FROM test1 WHERE f1==778 ORDER BY f1,f2}
306: } {}
307: do_test update-6.6.3 {
308: execsql {SELECT * FROM test1 WHERE f1==777 ORDER BY f1,f2}
309: } {777 128}
310: do_test update-6.6.4 {
311: execsql {SELECT * FROM test1 WHERE f1==8 ORDER BY f1,f2}
312: } {8 88 8 256 8 888}
313:
314: # Repeat the previous sequence of tests with multiple
315: # indices
316: #
317: do_test update-7.0 {
318: execsql {CREATE INDEX idx2 ON test1(f2)}
319: execsql {CREATE INDEX idx3 ON test1(f1,f2)}
320: execsql {SELECT * FROM test1 ORDER BY f1,f2}
321: } {6 64 7 128 8 88 8 256 8 888 9 512 10 1024 77 128 777 128}
322: do_test update-7.1 {
323: execsql {UPDATE test1 SET f2=f2+1 WHERE f1==8}
324: execsql {SELECT * FROM test1 ORDER BY f1,f2}
325: } {6 64 7 128 8 89 8 257 8 889 9 512 10 1024 77 128 777 128}
326: do_test update-7.1.1 {
327: execsql {SELECT * FROM test1 WHERE f1==8 ORDER BY f1,f2}
328: } {8 89 8 257 8 889}
329: do_test update-7.1.2 {
330: execsql {SELECT * FROM test1 WHERE f2==89 ORDER BY f1,f2}
331: } {8 89}
332: do_test update-7.1.3 {
333: execsql {SELECT * FROM test1 WHERE f1==88 ORDER BY f1,f2}
334: } {}
335: do_test update-7.2 {
336: execsql {UPDATE test1 SET f2=f2-1 WHERE f1==8 and f2>800}
337: execsql {SELECT * FROM test1 ORDER BY f1,f2}
338: } {6 64 7 128 8 89 8 257 8 888 9 512 10 1024 77 128 777 128}
339: do_test update-7.3 {
340: # explain {UPDATE test1 SET f2=f2-1 WHERE f1==8 and F2<300}
341: execsql {UPDATE test1 SET f2=f2-1 WHERE f1==8 and f2<800}
342: execsql {SELECT * FROM test1 ORDER BY f1,f2}
343: } {6 64 7 128 8 88 8 256 8 888 9 512 10 1024 77 128 777 128}
344: do_test update-7.3.1 {
345: execsql {SELECT * FROM test1 WHERE f1==8 ORDER BY f1,f2}
346: } {8 88 8 256 8 888}
347: do_test update-7.3.2 {
348: execsql {SELECT * FROM test1 WHERE f2==89 ORDER BY f1,f2}
349: } {}
350: do_test update-7.3.3 {
351: execsql {SELECT * FROM test1 WHERE f2==88 ORDER BY f1,f2}
352: } {8 88}
353: do_test update-7.4 {
354: execsql {UPDATE test1 SET f1=f1+1 WHERE f2==128}
355: execsql {SELECT * FROM test1 ORDER BY f1,f2}
356: } {6 64 8 88 8 128 8 256 8 888 9 512 10 1024 78 128 778 128}
357: do_test update-7.4.1 {
358: execsql {SELECT * FROM test1 WHERE f1==78 ORDER BY f1,f2}
359: } {78 128}
360: do_test update-7.4.2 {
361: execsql {SELECT * FROM test1 WHERE f1==778 ORDER BY f1,f2}
362: } {778 128}
363: do_test update-7.4.3 {
364: execsql {SELECT * FROM test1 WHERE f1==8 ORDER BY f1,f2}
365: } {8 88 8 128 8 256 8 888}
366: do_test update-7.5 {
367: execsql {UPDATE test1 SET f1=f1-1 WHERE f1>100 and f2==128}
368: execsql {SELECT * FROM test1 ORDER BY f1,f2}
369: } {6 64 8 88 8 128 8 256 8 888 9 512 10 1024 78 128 777 128}
370: do_test update-7.5.1 {
371: execsql {SELECT * FROM test1 WHERE f1==78 ORDER BY f1,f2}
372: } {78 128}
373: do_test update-7.5.2 {
374: execsql {SELECT * FROM test1 WHERE f1==778 ORDER BY f1,f2}
375: } {}
376: do_test update-7.5.3 {
377: execsql {SELECT * FROM test1 WHERE f1==777 ORDER BY f1,f2}
378: } {777 128}
379: do_test update-7.5.4 {
380: execsql {SELECT * FROM test1 WHERE f1==8 ORDER BY f1,f2}
381: } {8 88 8 128 8 256 8 888}
382: do_test update-7.6 {
383: execsql {UPDATE test1 SET f1=f1-1 WHERE f1<=100 and f2==128}
384: execsql {SELECT * FROM test1 ORDER BY f1,f2}
385: } {6 64 7 128 8 88 8 256 8 888 9 512 10 1024 77 128 777 128}
386: do_test update-7.6.1 {
387: execsql {SELECT * FROM test1 WHERE f1==77 ORDER BY f1,f2}
388: } {77 128}
389: do_test update-7.6.2 {
390: execsql {SELECT * FROM test1 WHERE f1==778 ORDER BY f1,f2}
391: } {}
392: do_test update-7.6.3 {
393: execsql {SELECT * FROM test1 WHERE f1==777 ORDER BY f1,f2}
394: } {777 128}
395: do_test update-7.6.4 {
396: execsql {SELECT * FROM test1 WHERE f1==8 ORDER BY f1,f2}
397: } {8 88 8 256 8 888}
398:
399: # Error messages
400: #
401: do_test update-9.1 {
402: set v [catch {execsql {
403: UPDATE test1 SET x=11 WHERE f1=1025
404: }} msg]
405: lappend v $msg
406: } {1 {no such column: x}}
407: do_test update-9.2 {
408: set v [catch {execsql {
409: UPDATE test1 SET f1=x(11) WHERE f1=1025
410: }} msg]
411: lappend v $msg
412: } {1 {no such function: x}}
413: do_test update-9.3 {
414: set v [catch {execsql {
415: UPDATE test1 SET f1=11 WHERE x=1025
416: }} msg]
417: lappend v $msg
418: } {1 {no such column: x}}
419: do_test update-9.4 {
420: set v [catch {execsql {
421: UPDATE test1 SET f1=11 WHERE x(f1)=1025
422: }} msg]
423: lappend v $msg
424: } {1 {no such function: x}}
425:
426: # Try doing updates on a unique column where the value does not
427: # really change.
428: #
429: do_test update-10.1 {
430: execsql {
431: DROP TABLE test1;
432: CREATE TABLE t1(
433: a integer primary key,
434: b UNIQUE,
435: c, d,
436: e, f,
437: UNIQUE(c,d)
438: );
439: INSERT INTO t1 VALUES(1,2,3,4,5,6);
440: INSERT INTO t1 VALUES(2,3,4,4,6,7);
441: SELECT * FROM t1
442: }
443: } {1 2 3 4 5 6 2 3 4 4 6 7}
444: do_test update-10.2 {
445: catchsql {
446: UPDATE t1 SET a=1, e=9 WHERE f=6;
447: SELECT * FROM t1;
448: }
449: } {0 {1 2 3 4 9 6 2 3 4 4 6 7}}
450: do_test update-10.3 {
451: catchsql {
452: UPDATE t1 SET a=1, e=10 WHERE f=7;
453: SELECT * FROM t1;
454: }
455: } {1 {PRIMARY KEY must be unique}}
456: do_test update-10.4 {
457: catchsql {
458: SELECT * FROM t1;
459: }
460: } {0 {1 2 3 4 9 6 2 3 4 4 6 7}}
461: do_test update-10.5 {
462: catchsql {
463: UPDATE t1 SET b=2, e=11 WHERE f=6;
464: SELECT * FROM t1;
465: }
466: } {0 {1 2 3 4 11 6 2 3 4 4 6 7}}
467: do_test update-10.6 {
468: catchsql {
469: UPDATE t1 SET b=2, e=12 WHERE f=7;
470: SELECT * FROM t1;
471: }
472: } {1 {column b is not unique}}
473: do_test update-10.7 {
474: catchsql {
475: SELECT * FROM t1;
476: }
477: } {0 {1 2 3 4 11 6 2 3 4 4 6 7}}
478: do_test update-10.8 {
479: catchsql {
480: UPDATE t1 SET c=3, d=4, e=13 WHERE f=6;
481: SELECT * FROM t1;
482: }
483: } {0 {1 2 3 4 13 6 2 3 4 4 6 7}}
484: do_test update-10.9 {
485: catchsql {
486: UPDATE t1 SET c=3, d=4, e=14 WHERE f=7;
487: SELECT * FROM t1;
488: }
489: } {1 {columns c, d are not unique}}
490: do_test update-10.10 {
491: catchsql {
492: SELECT * FROM t1;
493: }
494: } {0 {1 2 3 4 13 6 2 3 4 4 6 7}}
495:
496: # Make sure we can handle a subquery in the where clause.
497: #
498: ifcapable subquery {
499: do_test update-11.1 {
500: execsql {
501: UPDATE t1 SET e=e+1 WHERE b IN (SELECT b FROM t1);
502: SELECT b,e FROM t1;
503: }
504: } {2 14 3 7}
505: do_test update-11.2 {
506: execsql {
507: UPDATE t1 SET e=e+1 WHERE a IN (SELECT a FROM t1);
508: SELECT a,e FROM t1;
509: }
510: } {1 15 2 8}
511: }
512:
513: integrity_check update-12.1
514:
515: # Ticket 602. Updates should occur in the same order as the records
516: # were discovered in the WHERE clause.
517: #
518: do_test update-13.1 {
519: execsql {
520: BEGIN;
521: CREATE TABLE t2(a);
522: INSERT INTO t2 VALUES(1);
523: INSERT INTO t2 VALUES(2);
524: INSERT INTO t2 SELECT a+2 FROM t2;
525: INSERT INTO t2 SELECT a+4 FROM t2;
526: INSERT INTO t2 SELECT a+8 FROM t2;
527: INSERT INTO t2 SELECT a+16 FROM t2;
528: INSERT INTO t2 SELECT a+32 FROM t2;
529: INSERT INTO t2 SELECT a+64 FROM t2;
530: INSERT INTO t2 SELECT a+128 FROM t2;
531: INSERT INTO t2 SELECT a+256 FROM t2;
532: INSERT INTO t2 SELECT a+512 FROM t2;
533: INSERT INTO t2 SELECT a+1024 FROM t2;
534: COMMIT;
535: SELECT count(*) FROM t2;
536: }
537: } {2048}
538: do_test update-13.2 {
539: execsql {
540: SELECT count(*) FROM t2 WHERE a=rowid;
541: }
542: } {2048}
543: do_test update-13.3 {
544: execsql {
545: UPDATE t2 SET rowid=rowid-1;
546: SELECT count(*) FROM t2 WHERE a=rowid+1;
547: }
548: } {2048}
549: do_test update-13.3 {
550: execsql {
551: UPDATE t2 SET rowid=rowid+10000;
552: UPDATE t2 SET rowid=rowid-9999;
553: SELECT count(*) FROM t2 WHERE a=rowid;
554: }
555: } {2048}
556: do_test update-13.4 {
557: execsql {
558: BEGIN;
559: INSERT INTO t2 SELECT a+2048 FROM t2;
560: INSERT INTO t2 SELECT a+4096 FROM t2;
561: INSERT INTO t2 SELECT a+8192 FROM t2;
562: SELECT count(*) FROM t2 WHERE a=rowid;
563: COMMIT;
564: }
565: } 16384
566: do_test update-13.5 {
567: execsql {
568: UPDATE t2 SET rowid=rowid-1;
569: SELECT count(*) FROM t2 WHERE a=rowid+1;
570: }
571: } 16384
572:
573: integrity_check update-13.6
574:
575: ifcapable {trigger} {
576: # Test for proper detection of malformed WHEN clauses on UPDATE triggers.
577: #
578: do_test update-14.1 {
579: execsql {
580: CREATE TABLE t3(a,b,c);
581: CREATE TRIGGER t3r1 BEFORE UPDATE on t3 WHEN nosuchcol BEGIN
582: SELECT 'illegal WHEN clause';
583: END;
584: }
585: } {}
586: do_test update-14.2 {
587: catchsql {
588: UPDATE t3 SET a=1;
589: }
590: } {1 {no such column: nosuchcol}}
591: do_test update-14.3 {
592: execsql {
593: CREATE TABLE t4(a,b,c);
594: CREATE TRIGGER t4r1 AFTER UPDATE on t4 WHEN nosuchcol BEGIN
595: SELECT 'illegal WHEN clause';
596: END;
597: }
598: } {}
599: do_test update-14.4 {
600: catchsql {
601: UPDATE t4 SET a=1;
602: }
603: } {1 {no such column: nosuchcol}}
604:
605: } ;# ifcapable {trigger}
606:
607:
608: finish_test
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>