1: # 2002 March 6
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.
12: #
13: # This file implements tests for the PRAGMA command.
14: #
15: # $Id: pragma.test,v 1.1.1.1 2012/02/21 17:04:16 misho Exp $
16:
17: set testdir [file dirname $argv0]
18: source $testdir/tester.tcl
19:
20: # Do not use a codec for tests in this file, as the database file is
21: # manipulated directly using tcl scripts (using the [hexio_write] command).
22: #
23: do_not_use_codec
24:
25: # Test organization:
26: #
27: # pragma-1.*: Test cache_size, default_cache_size and synchronous on main db.
28: # pragma-2.*: Test synchronous on attached db.
29: # pragma-3.*: Test detection of table/index inconsistency by integrity_check.
30: # pragma-4.*: Test cache_size and default_cache_size on attached db.
31: # pragma-5.*: Test that pragma synchronous may not be used inside of a
32: # transaction.
33: # pragma-6.*: Test schema-query pragmas.
34: # pragma-7.*: Miscellaneous tests.
35: # pragma-8.*: Test user_version and schema_version pragmas.
36: # pragma-9.*: Test temp_store and temp_store_directory.
37: # pragma-10.*: Test the count_changes pragma in the presence of triggers.
38: # pragma-11.*: Test the collation_list pragma.
39: # pragma-14.*: Test the page_count pragma.
40: # pragma-15.*: Test that the value set using the cache_size pragma is not
41: # reset when the schema is reloaded.
42: # pragma-16.*: Test proxy locking
43: #
44:
45: ifcapable !pragma {
46: finish_test
47: return
48: }
49:
50: # Delete the preexisting database to avoid the special setup
51: # that the "all.test" script does.
52: #
53: db close
54: delete_file test.db test.db-journal
55: delete_file test3.db test3.db-journal
56: sqlite3 db test.db; set DB [sqlite3_connection_pointer db]
57:
58:
59: ifcapable pager_pragmas {
60: set DFLT_CACHE_SZ [db one {PRAGMA default_cache_size}]
61: set TEMP_CACHE_SZ [db one {PRAGMA temp.default_cache_size}]
62: do_test pragma-1.1 {
63: execsql {
64: PRAGMA cache_size;
65: PRAGMA default_cache_size;
66: PRAGMA synchronous;
67: }
68: } [list $DFLT_CACHE_SZ $DFLT_CACHE_SZ 2]
69: do_test pragma-1.2 {
70: execsql {
71: PRAGMA synchronous=OFF;
72: PRAGMA cache_size=1234;
73: PRAGMA cache_size;
74: PRAGMA default_cache_size;
75: PRAGMA synchronous;
76: }
77: } [list 1234 $DFLT_CACHE_SZ 0]
78: do_test pragma-1.3 {
79: db close
80: sqlite3 db test.db
81: execsql {
82: PRAGMA cache_size;
83: PRAGMA default_cache_size;
84: PRAGMA synchronous;
85: }
86: } [list $DFLT_CACHE_SZ $DFLT_CACHE_SZ 2]
87: do_test pragma-1.4 {
88: execsql {
89: PRAGMA synchronous=OFF;
90: PRAGMA cache_size;
91: PRAGMA default_cache_size;
92: PRAGMA synchronous;
93: }
94: } [list $DFLT_CACHE_SZ $DFLT_CACHE_SZ 0]
95: do_test pragma-1.5 {
96: execsql {
97: PRAGMA cache_size=-4321;
98: PRAGMA cache_size;
99: PRAGMA default_cache_size;
100: PRAGMA synchronous;
101: }
102: } [list -4321 $DFLT_CACHE_SZ 0]
103: do_test pragma-1.6 {
104: execsql {
105: PRAGMA synchronous=ON;
106: PRAGMA cache_size;
107: PRAGMA default_cache_size;
108: PRAGMA synchronous;
109: }
110: } [list -4321 $DFLT_CACHE_SZ 1]
111: do_test pragma-1.7 {
112: db close
113: sqlite3 db test.db
114: execsql {
115: PRAGMA cache_size;
116: PRAGMA default_cache_size;
117: PRAGMA synchronous;
118: }
119: } [list $DFLT_CACHE_SZ $DFLT_CACHE_SZ 2]
120: do_test pragma-1.8 {
121: execsql {
122: PRAGMA default_cache_size=-123;
123: PRAGMA cache_size;
124: PRAGMA default_cache_size;
125: PRAGMA synchronous;
126: }
127: } {123 123 2}
128: do_test pragma-1.9.1 {
129: db close
130: sqlite3 db test.db; set ::DB [sqlite3_connection_pointer db]
131: execsql {
132: PRAGMA cache_size;
133: PRAGMA default_cache_size;
134: PRAGMA synchronous;
135: }
136: } {123 123 2}
137: ifcapable vacuum {
138: do_test pragma-1.9.2 {
139: execsql {
140: VACUUM;
141: PRAGMA cache_size;
142: PRAGMA default_cache_size;
143: PRAGMA synchronous;
144: }
145: } {123 123 2}
146: }
147: do_test pragma-1.10 {
148: execsql {
149: PRAGMA synchronous=NORMAL;
150: PRAGMA cache_size;
151: PRAGMA default_cache_size;
152: PRAGMA synchronous;
153: }
154: } {123 123 1}
155: do_test pragma-1.11 {
156: execsql {
157: PRAGMA synchronous=FULL;
158: PRAGMA cache_size;
159: PRAGMA default_cache_size;
160: PRAGMA synchronous;
161: }
162: } {123 123 2}
163: do_test pragma-1.12 {
164: db close
165: sqlite3 db test.db; set ::DB [sqlite3_connection_pointer db]
166: execsql {
167: PRAGMA cache_size;
168: PRAGMA default_cache_size;
169: PRAGMA synchronous;
170: }
171: } {123 123 2}
172:
173: # Make sure the pragma handler understands numeric values in addition
174: # to keywords like "off" and "full".
175: #
176: do_test pragma-1.13 {
177: execsql {
178: PRAGMA synchronous=0;
179: PRAGMA synchronous;
180: }
181: } {0}
182: do_test pragma-1.14 {
183: execsql {
184: PRAGMA synchronous=2;
185: PRAGMA synchronous;
186: }
187: } {2}
188: } ;# ifcapable pager_pragmas
189:
190: # Test turning "flag" pragmas on and off.
191: #
192: ifcapable debug {
193: # Pragma "vdbe_listing" is only available if compiled with SQLITE_DEBUG
194: #
195: do_test pragma-1.15 {
196: execsql {
197: PRAGMA vdbe_listing=YES;
198: PRAGMA vdbe_listing;
199: }
200: } {1}
201: do_test pragma-1.16 {
202: execsql {
203: PRAGMA vdbe_listing=NO;
204: PRAGMA vdbe_listing;
205: }
206: } {0}
207: }
208:
209: do_test pragma-1.17 {
210: execsql {
211: PRAGMA parser_trace=ON;
212: PRAGMA parser_trace=OFF;
213: }
214: } {}
215: do_test pragma-1.18 {
216: execsql {
217: PRAGMA bogus = -1234; -- Parsing of negative values
218: }
219: } {}
220:
221: # Test modifying the safety_level of an attached database.
222: ifcapable pager_pragmas&&attach {
223: do_test pragma-2.1 {
224: forcedelete test2.db
225: forcedelete test2.db-journal
226: execsql {
227: ATTACH 'test2.db' AS aux;
228: }
229: } {}
230: do_test pragma-2.2 {
231: execsql {
232: pragma aux.synchronous;
233: }
234: } {2}
235: do_test pragma-2.3 {
236: execsql {
237: pragma aux.synchronous = OFF;
238: pragma aux.synchronous;
239: pragma synchronous;
240: }
241: } {0 2}
242: do_test pragma-2.4 {
243: execsql {
244: pragma aux.synchronous = ON;
245: pragma synchronous;
246: pragma aux.synchronous;
247: }
248: } {2 1}
249: } ;# ifcapable pager_pragmas
250:
251: # Construct a corrupted index and make sure the integrity_check
252: # pragma finds it.
253: #
254: # These tests won't work if the database is encrypted
255: #
256: do_test pragma-3.1 {
257: db close
258: forcedelete test.db test.db-journal
259: sqlite3 db test.db
260: execsql {
261: PRAGMA auto_vacuum=OFF;
262: BEGIN;
263: CREATE TABLE t2(a,b,c);
264: CREATE INDEX i2 ON t2(a);
265: INSERT INTO t2 VALUES(11,2,3);
266: INSERT INTO t2 VALUES(22,3,4);
267: COMMIT;
268: SELECT rowid, * from t2;
269: }
270: } {1 11 2 3 2 22 3 4}
271: ifcapable attach {
272: if {![sqlite3 -has-codec] && $sqlite_options(integrityck)} {
273: do_test pragma-3.2 {
274: db eval {SELECT rootpage FROM sqlite_master WHERE name='i2'} break
275: set pgsz [db eval {PRAGMA page_size}]
276: # overwrite the header on the rootpage of the index in order to
277: # make the index appear to be empty.
278: #
279: set offset [expr {$pgsz*($rootpage-1)}]
280: hexio_write test.db $offset 0a00000000040000000000
281: db close
282: sqlite3 db test.db
283: execsql {PRAGMA integrity_check}
284: } {{rowid 1 missing from index i2} {rowid 2 missing from index i2} {wrong # of entries in index i2}}
285: do_test pragma-3.3 {
286: execsql {PRAGMA integrity_check=1}
287: } {{rowid 1 missing from index i2}}
288: do_test pragma-3.4 {
289: execsql {
290: ATTACH DATABASE 'test.db' AS t2;
291: PRAGMA integrity_check
292: }
293: } {{rowid 1 missing from index i2} {rowid 2 missing from index i2} {wrong # of entries in index i2} {rowid 1 missing from index i2} {rowid 2 missing from index i2} {wrong # of entries in index i2}}
294: do_test pragma-3.5 {
295: execsql {
296: PRAGMA integrity_check=4
297: }
298: } {{rowid 1 missing from index i2} {rowid 2 missing from index i2} {wrong # of entries in index i2} {rowid 1 missing from index i2}}
299: do_test pragma-3.6 {
300: execsql {
301: PRAGMA integrity_check=xyz
302: }
303: } {{rowid 1 missing from index i2} {rowid 2 missing from index i2} {wrong # of entries in index i2} {rowid 1 missing from index i2} {rowid 2 missing from index i2} {wrong # of entries in index i2}}
304: do_test pragma-3.7 {
305: execsql {
306: PRAGMA integrity_check=0
307: }
308: } {{rowid 1 missing from index i2} {rowid 2 missing from index i2} {wrong # of entries in index i2} {rowid 1 missing from index i2} {rowid 2 missing from index i2} {wrong # of entries in index i2}}
309:
310: # Add additional corruption by appending unused pages to the end of
311: # the database file testerr.db
312: #
313: do_test pragma-3.8 {
314: execsql {DETACH t2}
315: forcedelete testerr.db testerr.db-journal
316: set out [open testerr.db w]
317: fconfigure $out -translation binary
318: set in [open test.db r]
319: fconfigure $in -translation binary
320: puts -nonewline $out [read $in]
321: seek $in 0
322: puts -nonewline $out [read $in]
323: close $in
324: close $out
325: hexio_write testerr.db 28 00000000
326: execsql {REINDEX t2}
327: execsql {PRAGMA integrity_check}
328: } {ok}
329: do_test pragma-3.8.1 {
330: execsql {PRAGMA quick_check}
331: } {ok}
332: do_test pragma-3.8.2 {
333: execsql {PRAGMA QUICK_CHECK}
334: } {ok}
335: do_test pragma-3.9 {
336: execsql {
337: ATTACH 'testerr.db' AS t2;
338: PRAGMA integrity_check
339: }
340: } {{*** in database t2 ***
341: Page 4 is never used
342: Page 5 is never used
343: Page 6 is never used} {rowid 1 missing from index i2} {rowid 2 missing from index i2} {wrong # of entries in index i2}}
344: do_test pragma-3.10 {
345: execsql {
346: PRAGMA integrity_check=1
347: }
348: } {{*** in database t2 ***
349: Page 4 is never used}}
350: do_test pragma-3.11 {
351: execsql {
352: PRAGMA integrity_check=5
353: }
354: } {{*** in database t2 ***
355: Page 4 is never used
356: Page 5 is never used
357: Page 6 is never used} {rowid 1 missing from index i2} {rowid 2 missing from index i2}}
358: do_test pragma-3.12 {
359: execsql {
360: PRAGMA integrity_check=4
361: }
362: } {{*** in database t2 ***
363: Page 4 is never used
364: Page 5 is never used
365: Page 6 is never used} {rowid 1 missing from index i2}}
366: do_test pragma-3.13 {
367: execsql {
368: PRAGMA integrity_check=3
369: }
370: } {{*** in database t2 ***
371: Page 4 is never used
372: Page 5 is never used
373: Page 6 is never used}}
374: do_test pragma-3.14 {
375: execsql {
376: PRAGMA integrity_check(2)
377: }
378: } {{*** in database t2 ***
379: Page 4 is never used
380: Page 5 is never used}}
381: do_test pragma-3.15 {
382: execsql {
383: ATTACH 'testerr.db' AS t3;
384: PRAGMA integrity_check
385: }
386: } {{*** in database t2 ***
387: Page 4 is never used
388: Page 5 is never used
389: Page 6 is never used} {rowid 1 missing from index i2} {rowid 2 missing from index i2} {wrong # of entries in index i2} {*** in database t3 ***
390: Page 4 is never used
391: Page 5 is never used
392: Page 6 is never used} {rowid 1 missing from index i2} {rowid 2 missing from index i2} {wrong # of entries in index i2}}
393: do_test pragma-3.16 {
394: execsql {
395: PRAGMA integrity_check(10)
396: }
397: } {{*** in database t2 ***
398: Page 4 is never used
399: Page 5 is never used
400: Page 6 is never used} {rowid 1 missing from index i2} {rowid 2 missing from index i2} {wrong # of entries in index i2} {*** in database t3 ***
401: Page 4 is never used
402: Page 5 is never used
403: Page 6 is never used} {rowid 1 missing from index i2}}
404: do_test pragma-3.17 {
405: execsql {
406: PRAGMA integrity_check=8
407: }
408: } {{*** in database t2 ***
409: Page 4 is never used
410: Page 5 is never used
411: Page 6 is never used} {rowid 1 missing from index i2} {rowid 2 missing from index i2} {wrong # of entries in index i2} {*** in database t3 ***
412: Page 4 is never used
413: Page 5 is never used}}
414: do_test pragma-3.18 {
415: execsql {
416: PRAGMA integrity_check=4
417: }
418: } {{*** in database t2 ***
419: Page 4 is never used
420: Page 5 is never used
421: Page 6 is never used} {rowid 1 missing from index i2}}
422: }
423: do_test pragma-3.19 {
424: catch {db close}
425: forcedelete test.db test.db-journal
426: sqlite3 db test.db
427: db eval {PRAGMA integrity_check}
428: } {ok}
429: }
430: #exit
431:
432: # Test modifying the cache_size of an attached database.
433: ifcapable pager_pragmas&&attach {
434: do_test pragma-4.1 {
435: execsql {
436: ATTACH 'test2.db' AS aux;
437: pragma aux.cache_size;
438: pragma aux.default_cache_size;
439: }
440: } [list $DFLT_CACHE_SZ $DFLT_CACHE_SZ]
441: do_test pragma-4.2 {
442: execsql {
443: pragma aux.cache_size = 50;
444: pragma aux.cache_size;
445: pragma aux.default_cache_size;
446: }
447: } [list 50 $DFLT_CACHE_SZ]
448: do_test pragma-4.3 {
449: execsql {
450: pragma aux.default_cache_size = 456;
451: pragma aux.cache_size;
452: pragma aux.default_cache_size;
453: }
454: } {456 456}
455: do_test pragma-4.4 {
456: execsql {
457: pragma cache_size;
458: pragma default_cache_size;
459: }
460: } [list $DFLT_CACHE_SZ $DFLT_CACHE_SZ]
461: do_test pragma-4.5 {
462: execsql {
463: DETACH aux;
464: ATTACH 'test3.db' AS aux;
465: pragma aux.cache_size;
466: pragma aux.default_cache_size;
467: }
468: } [list $DFLT_CACHE_SZ $DFLT_CACHE_SZ]
469: do_test pragma-4.6 {
470: execsql {
471: DETACH aux;
472: ATTACH 'test2.db' AS aux;
473: pragma aux.cache_size;
474: pragma aux.default_cache_size;
475: }
476: } {456 456}
477: } ;# ifcapable pager_pragmas
478:
479: # Test that modifying the sync-level in the middle of a transaction is
480: # disallowed.
481: ifcapable pager_pragmas {
482: do_test pragma-5.0 {
483: execsql {
484: pragma synchronous;
485: }
486: } {2}
487: do_test pragma-5.1 {
488: catchsql {
489: BEGIN;
490: pragma synchronous = OFF;
491: }
492: } {1 {Safety level may not be changed inside a transaction}}
493: do_test pragma-5.2 {
494: execsql {
495: pragma synchronous;
496: }
497: } {2}
498: catchsql {COMMIT;}
499: } ;# ifcapable pager_pragmas
500:
501: # Test schema-query pragmas
502: #
503: ifcapable schema_pragmas {
504: ifcapable tempdb&&attach {
505: do_test pragma-6.1 {
506: set res {}
507: execsql {SELECT * FROM sqlite_temp_master}
508: foreach {idx name file} [execsql {pragma database_list}] {
509: lappend res $idx $name
510: }
511: set res
512: } {0 main 1 temp 2 aux}
513: }
514: do_test pragma-6.2 {
515: execsql {
516: CREATE TABLE t2(a,b,c);
517: pragma table_info(t2)
518: }
519: } {0 a {} 0 {} 0 1 b {} 0 {} 0 2 c {} 0 {} 0}
520: do_test pragma-6.2.1 {
521: execsql {
522: pragma table_info;
523: }
524: } {}
525: db nullvalue <<NULL>>
526: do_test pragma-6.2.2 {
527: execsql {
528: CREATE TABLE t5(
529: a TEXT DEFAULT CURRENT_TIMESTAMP,
530: b DEFAULT (5+3),
531: c TEXT,
532: d INTEGER DEFAULT NULL,
533: e TEXT DEFAULT ''
534: );
535: PRAGMA table_info(t5);
536: }
537: } {0 a TEXT 0 CURRENT_TIMESTAMP 0 1 b {} 0 5+3 0 2 c TEXT 0 <<NULL>> 0 3 d INTEGER 0 NULL 0 4 e TEXT 0 '' 0}
538: db nullvalue {}
539: ifcapable {foreignkey} {
540: do_test pragma-6.3.1 {
541: execsql {
542: CREATE TABLE t3(a int references t2(b), b UNIQUE);
543: pragma foreign_key_list(t3);
544: }
545: } {0 0 t2 a b {NO ACTION} {NO ACTION} NONE}
546: do_test pragma-6.3.2 {
547: execsql {
548: pragma foreign_key_list;
549: }
550: } {}
551: do_test pragma-6.3.3 {
552: execsql {
553: pragma foreign_key_list(t3_bogus);
554: }
555: } {}
556: do_test pragma-6.3.4 {
557: execsql {
558: pragma foreign_key_list(t5);
559: }
560: } {}
561: do_test pragma-6.4 {
562: execsql {
563: pragma index_list(t3);
564: }
565: } {0 sqlite_autoindex_t3_1 1}
566: }
567: ifcapable {!foreignkey} {
568: execsql {CREATE TABLE t3(a,b UNIQUE)}
569: }
570: do_test pragma-6.5.1 {
571: execsql {
572: CREATE INDEX t3i1 ON t3(a,b);
573: pragma index_info(t3i1);
574: }
575: } {0 0 a 1 1 b}
576: do_test pragma-6.5.2 {
577: execsql {
578: pragma index_info(t3i1_bogus);
579: }
580: } {}
581:
582: ifcapable tempdb {
583: # Test for ticket #3320. When a temp table of the same name exists, make
584: # sure the schema of the main table can still be queried using
585: # "pragma table_info":
586: do_test pragma-6.6.1 {
587: execsql {
588: CREATE TABLE trial(col_main);
589: CREATE TEMP TABLE trial(col_temp);
590: }
591: } {}
592: do_test pragma-6.6.2 {
593: execsql {
594: PRAGMA table_info(trial);
595: }
596: } {0 col_temp {} 0 {} 0}
597: do_test pragma-6.6.3 {
598: execsql {
599: PRAGMA temp.table_info(trial);
600: }
601: } {0 col_temp {} 0 {} 0}
602: do_test pragma-6.6.4 {
603: execsql {
604: PRAGMA main.table_info(trial);
605: }
606: } {0 col_main {} 0 {} 0}
607: }
608:
609: do_test pragma-6.7 {
610: execsql {
611: CREATE TABLE test_table(
612: one INT NOT NULL DEFAULT -1,
613: two text,
614: three VARCHAR(45, 65) DEFAULT 'abcde',
615: four REAL DEFAULT X'abcdef',
616: five DEFAULT CURRENT_TIME
617: );
618: PRAGMA table_info(test_table);
619: }
620: } [concat \
621: {0 one INT 1 -1 0} \
622: {1 two text 0 {} 0} \
623: {2 three {VARCHAR(45, 65)} 0 'abcde' 0} \
624: {3 four REAL 0 X'abcdef' 0} \
625: {4 five {} 0 CURRENT_TIME 0} \
626: ]
627: } ;# ifcapable schema_pragmas
628: # Miscellaneous tests
629: #
630: ifcapable schema_pragmas {
631: do_test pragma-7.1.1 {
632: # Make sure a pragma knows to read the schema if it needs to
633: db close
634: sqlite3 db test.db
635: execsql {
636: pragma index_list(t3);
637: }
638: } {0 t3i1 0 1 sqlite_autoindex_t3_1 1}
639: do_test pragma-7.1.2 {
640: execsql {
641: pragma index_list(t3_bogus);
642: }
643: } {}
644: } ;# ifcapable schema_pragmas
645: ifcapable {utf16} {
646: if {[permutation] == ""} {
647: do_test pragma-7.2 {
648: db close
649: sqlite3 db test.db
650: catchsql {
651: pragma encoding=bogus;
652: }
653: } {1 {unsupported encoding: bogus}}
654: }
655: }
656: ifcapable tempdb {
657: do_test pragma-7.3 {
658: db close
659: sqlite3 db test.db
660: execsql {
661: pragma lock_status;
662: }
663: } {main unlocked temp closed}
664: } else {
665: do_test pragma-7.3 {
666: db close
667: sqlite3 db test.db
668: execsql {
669: pragma lock_status;
670: }
671: } {main unlocked}
672: }
673:
674:
675: #----------------------------------------------------------------------
676: # Test cases pragma-8.* test the "PRAGMA schema_version" and "PRAGMA
677: # user_version" statements.
678: #
679: # pragma-8.1: PRAGMA schema_version
680: # pragma-8.2: PRAGMA user_version
681: #
682:
683: ifcapable schema_version {
684:
685: # First check that we can set the schema version and then retrieve the
686: # same value.
687: do_test pragma-8.1.1 {
688: execsql {
689: PRAGMA schema_version = 105;
690: }
691: } {}
692: do_test pragma-8.1.2 {
693: execsql2 {
694: PRAGMA schema_version;
695: }
696: } {schema_version 105}
697: do_test pragma-8.1.3 {
698: execsql {
699: PRAGMA schema_version = 106;
700: }
701: } {}
702: do_test pragma-8.1.4 {
703: execsql {
704: PRAGMA schema_version;
705: }
706: } 106
707:
708: # Check that creating a table modifies the schema-version (this is really
709: # to verify that the value being read is in fact the schema version).
710: do_test pragma-8.1.5 {
711: execsql {
712: CREATE TABLE t4(a, b, c);
713: INSERT INTO t4 VALUES(1, 2, 3);
714: SELECT * FROM t4;
715: }
716: } {1 2 3}
717: do_test pragma-8.1.6 {
718: execsql {
719: PRAGMA schema_version;
720: }
721: } 107
722:
723: # Now open a second connection to the database. Ensure that changing the
724: # schema-version using the first connection forces the second connection
725: # to reload the schema. This has to be done using the C-API test functions,
726: # because the TCL API accounts for SCHEMA_ERROR and retries the query.
727: do_test pragma-8.1.7 {
728: sqlite3 db2 test.db; set ::DB2 [sqlite3_connection_pointer db2]
729: execsql {
730: SELECT * FROM t4;
731: } db2
732: } {1 2 3}
733: do_test pragma-8.1.8 {
734: execsql {
735: PRAGMA schema_version = 108;
736: }
737: } {}
738: do_test pragma-8.1.9 {
739: set ::STMT [sqlite3_prepare $::DB2 "SELECT * FROM t4" -1 DUMMY]
740: sqlite3_step $::STMT
741: } SQLITE_ERROR
742: do_test pragma-8.1.10 {
743: sqlite3_finalize $::STMT
744: } SQLITE_SCHEMA
745:
746: # Make sure the schema-version can be manipulated in an attached database.
747: forcedelete test2.db
748: forcedelete test2.db-journal
749: ifcapable attach {
750: do_test pragma-8.1.11 {
751: execsql {
752: ATTACH 'test2.db' AS aux;
753: CREATE TABLE aux.t1(a, b, c);
754: PRAGMA aux.schema_version = 205;
755: }
756: } {}
757: do_test pragma-8.1.12 {
758: execsql {
759: PRAGMA aux.schema_version;
760: }
761: } 205
762: }
763: do_test pragma-8.1.13 {
764: execsql {
765: PRAGMA schema_version;
766: }
767: } 108
768:
769: # And check that modifying the schema-version in an attached database
770: # forces the second connection to reload the schema.
771: ifcapable attach {
772: do_test pragma-8.1.14 {
773: sqlite3 db2 test.db; set ::DB2 [sqlite3_connection_pointer db2]
774: execsql {
775: ATTACH 'test2.db' AS aux;
776: SELECT * FROM aux.t1;
777: } db2
778: } {}
779: do_test pragma-8.1.15 {
780: execsql {
781: PRAGMA aux.schema_version = 206;
782: }
783: } {}
784: do_test pragma-8.1.16 {
785: set ::STMT [sqlite3_prepare $::DB2 "SELECT * FROM aux.t1" -1 DUMMY]
786: sqlite3_step $::STMT
787: } SQLITE_ERROR
788: do_test pragma-8.1.17 {
789: sqlite3_finalize $::STMT
790: } SQLITE_SCHEMA
791: do_test pragma-8.1.18 {
792: db2 close
793: } {}
794: }
795:
796: # Now test that the user-version can be read and written (and that we aren't
797: # accidentally manipulating the schema-version instead).
798: do_test pragma-8.2.1 {
799: execsql2 {
800: PRAGMA user_version;
801: }
802: } {user_version 0}
803: do_test pragma-8.2.2 {
804: execsql {
805: PRAGMA user_version = 2;
806: }
807: } {}
808: do_test pragma-8.2.3.1 {
809: execsql2 {
810: PRAGMA user_version;
811: }
812: } {user_version 2}
813: do_test pragma-8.2.3.2 {
814: db close
815: sqlite3 db test.db
816: execsql {
817: PRAGMA user_version;
818: }
819: } {2}
820: do_test pragma-8.2.4.1 {
821: execsql {
822: PRAGMA schema_version;
823: }
824: } {108}
825: ifcapable vacuum {
826: do_test pragma-8.2.4.2 {
827: execsql {
828: VACUUM;
829: PRAGMA user_version;
830: }
831: } {2}
832: do_test pragma-8.2.4.3 {
833: execsql {
834: PRAGMA schema_version;
835: }
836: } {109}
837: }
838:
839: ifcapable attach {
840: db eval {ATTACH 'test2.db' AS aux}
841:
842: # Check that the user-version in the auxilary database can be manipulated (
843: # and that we aren't accidentally manipulating the same in the main db).
844: do_test pragma-8.2.5 {
845: execsql {
846: PRAGMA aux.user_version;
847: }
848: } {0}
849: do_test pragma-8.2.6 {
850: execsql {
851: PRAGMA aux.user_version = 3;
852: }
853: } {}
854: do_test pragma-8.2.7 {
855: execsql {
856: PRAGMA aux.user_version;
857: }
858: } {3}
859: do_test pragma-8.2.8 {
860: execsql {
861: PRAGMA main.user_version;
862: }
863: } {2}
864:
865: # Now check that a ROLLBACK resets the user-version if it has been modified
866: # within a transaction.
867: do_test pragma-8.2.9 {
868: execsql {
869: BEGIN;
870: PRAGMA aux.user_version = 10;
871: PRAGMA user_version = 11;
872: }
873: } {}
874: do_test pragma-8.2.10 {
875: execsql {
876: PRAGMA aux.user_version;
877: }
878: } {10}
879: do_test pragma-8.2.11 {
880: execsql {
881: PRAGMA main.user_version;
882: }
883: } {11}
884: do_test pragma-8.2.12 {
885: execsql {
886: ROLLBACK;
887: PRAGMA aux.user_version;
888: }
889: } {3}
890: do_test pragma-8.2.13 {
891: execsql {
892: PRAGMA main.user_version;
893: }
894: } {2}
895: }
896:
897: # Try a negative value for the user-version
898: do_test pragma-8.2.14 {
899: execsql {
900: PRAGMA user_version = -450;
901: }
902: } {}
903: do_test pragma-8.2.15 {
904: execsql {
905: PRAGMA user_version;
906: }
907: } {-450}
908: } ; # ifcapable schema_version
909:
910: # Check to see if TEMP_STORE is memory or disk. Return strings
911: # "memory" or "disk" as appropriate.
912: #
913: proc check_temp_store {} {
914: db eval {CREATE TEMP TABLE IF NOT EXISTS a(b)}
915: db eval {PRAGMA database_list} {
916: if {$name=="temp"} {
917: set bt [btree_from_db db 1]
918: if {[btree_ismemdb $bt]} {
919: return "memory"
920: }
921: return "disk"
922: }
923: }
924: return "unknown"
925: }
926:
927:
928: # Test temp_store and temp_store_directory pragmas
929: #
930: ifcapable pager_pragmas {
931: do_test pragma-9.1 {
932: db close
933: sqlite3 db test.db
934: execsql {
935: PRAGMA temp_store;
936: }
937: } {0}
938: if {$TEMP_STORE<=1} {
939: do_test pragma-9.1.1 {
940: check_temp_store
941: } {disk}
942: } else {
943: do_test pragma-9.1.1 {
944: check_temp_store
945: } {memory}
946: }
947:
948: do_test pragma-9.2 {
949: db close
950: sqlite3 db test.db
951: execsql {
952: PRAGMA temp_store=file;
953: PRAGMA temp_store;
954: }
955: } {1}
956: if {$TEMP_STORE==3} {
957: # When TEMP_STORE is 3, always use memory regardless of pragma settings.
958: do_test pragma-9.2.1 {
959: check_temp_store
960: } {memory}
961: } else {
962: do_test pragma-9.2.1 {
963: check_temp_store
964: } {disk}
965: }
966:
967: do_test pragma-9.3 {
968: db close
969: sqlite3 db test.db
970: execsql {
971: PRAGMA temp_store=memory;
972: PRAGMA temp_store;
973: }
974: } {2}
975: if {$TEMP_STORE==0} {
976: # When TEMP_STORE is 0, always use the disk regardless of pragma settings.
977: do_test pragma-9.3.1 {
978: check_temp_store
979: } {disk}
980: } else {
981: do_test pragma-9.3.1 {
982: check_temp_store
983: } {memory}
984: }
985:
986: do_test pragma-9.4 {
987: execsql {
988: PRAGMA temp_store_directory;
989: }
990: } {}
991: ifcapable wsd {
992: do_test pragma-9.5 {
993: set pwd [string map {' ''} [file nativename [pwd]]]
994: execsql "
995: PRAGMA temp_store_directory='$pwd';
996: "
997: } {}
998: do_test pragma-9.6 {
999: execsql {
1000: PRAGMA temp_store_directory;
1001: }
1002: } [list [file nativename [pwd]]]
1003: do_test pragma-9.7 {
1004: catchsql {
1005: PRAGMA temp_store_directory='/NON/EXISTENT/PATH/FOOBAR';
1006: }
1007: } {1 {not a writable directory}}
1008: do_test pragma-9.8 {
1009: execsql {
1010: PRAGMA temp_store_directory='';
1011: }
1012: } {}
1013: if {![info exists TEMP_STORE] || $TEMP_STORE<=1} {
1014: ifcapable tempdb {
1015: do_test pragma-9.9 {
1016: execsql {
1017: PRAGMA temp_store_directory;
1018: PRAGMA temp_store=FILE;
1019: CREATE TEMP TABLE temp_store_directory_test(a integer);
1020: INSERT INTO temp_store_directory_test values (2);
1021: SELECT * FROM temp_store_directory_test;
1022: }
1023: } {2}
1024: do_test pragma-9.10 {
1025: catchsql "
1026: PRAGMA temp_store_directory='$pwd';
1027: SELECT * FROM temp_store_directory_test;
1028: "
1029: } {1 {no such table: temp_store_directory_test}}
1030: }
1031: }
1032: }
1033: do_test pragma-9.11 {
1034: execsql {
1035: PRAGMA temp_store = 0;
1036: PRAGMA temp_store;
1037: }
1038: } {0}
1039: do_test pragma-9.12 {
1040: execsql {
1041: PRAGMA temp_store = 1;
1042: PRAGMA temp_store;
1043: }
1044: } {1}
1045: do_test pragma-9.13 {
1046: execsql {
1047: PRAGMA temp_store = 2;
1048: PRAGMA temp_store;
1049: }
1050: } {2}
1051: do_test pragma-9.14 {
1052: execsql {
1053: PRAGMA temp_store = 3;
1054: PRAGMA temp_store;
1055: }
1056: } {0}
1057: do_test pragma-9.15 {
1058: catchsql {
1059: BEGIN EXCLUSIVE;
1060: CREATE TEMP TABLE temp_table(t);
1061: INSERT INTO temp_table VALUES('valuable data');
1062: PRAGMA temp_store = 1;
1063: }
1064: } {1 {temporary storage cannot be changed from within a transaction}}
1065: do_test pragma-9.16 {
1066: execsql {
1067: SELECT * FROM temp_table;
1068: COMMIT;
1069: }
1070: } {{valuable data}}
1071:
1072: do_test pragma-9.17 {
1073: execsql {
1074: INSERT INTO temp_table VALUES('valuable data II');
1075: SELECT * FROM temp_table;
1076: }
1077: } {{valuable data} {valuable data II}}
1078:
1079: do_test pragma-9.18 {
1080: set rc [catch {
1081: db eval {SELECT t FROM temp_table} {
1082: execsql {pragma temp_store = 1}
1083: }
1084: } msg]
1085: list $rc $msg
1086: } {1 {temporary storage cannot be changed from within a transaction}}
1087:
1088: } ;# ifcapable pager_pragmas
1089:
1090: ifcapable trigger {
1091:
1092: do_test pragma-10.0 {
1093: catchsql {
1094: DROP TABLE main.t1;
1095: }
1096: execsql {
1097: PRAGMA count_changes = 1;
1098:
1099: CREATE TABLE t1(a PRIMARY KEY);
1100: CREATE TABLE t1_mirror(a);
1101: CREATE TABLE t1_mirror2(a);
1102: CREATE TRIGGER t1_bi BEFORE INSERT ON t1 BEGIN
1103: INSERT INTO t1_mirror VALUES(new.a);
1104: END;
1105: CREATE TRIGGER t1_ai AFTER INSERT ON t1 BEGIN
1106: INSERT INTO t1_mirror2 VALUES(new.a);
1107: END;
1108: CREATE TRIGGER t1_bu BEFORE UPDATE ON t1 BEGIN
1109: UPDATE t1_mirror SET a = new.a WHERE a = old.a;
1110: END;
1111: CREATE TRIGGER t1_au AFTER UPDATE ON t1 BEGIN
1112: UPDATE t1_mirror2 SET a = new.a WHERE a = old.a;
1113: END;
1114: CREATE TRIGGER t1_bd BEFORE DELETE ON t1 BEGIN
1115: DELETE FROM t1_mirror WHERE a = old.a;
1116: END;
1117: CREATE TRIGGER t1_ad AFTER DELETE ON t1 BEGIN
1118: DELETE FROM t1_mirror2 WHERE a = old.a;
1119: END;
1120: }
1121: } {}
1122:
1123: do_test pragma-10.1 {
1124: execsql {
1125: INSERT INTO t1 VALUES(randstr(10,10));
1126: }
1127: } {1}
1128: do_test pragma-10.2 {
1129: execsql {
1130: UPDATE t1 SET a = randstr(10,10);
1131: }
1132: } {1}
1133: do_test pragma-10.3 {
1134: execsql {
1135: DELETE FROM t1;
1136: }
1137: } {1}
1138:
1139: } ;# ifcapable trigger
1140:
1141: ifcapable schema_pragmas {
1142: do_test pragma-11.1 {
1143: execsql2 {
1144: pragma collation_list;
1145: }
1146: } {seq 0 name NOCASE seq 1 name RTRIM seq 2 name BINARY}
1147: do_test pragma-11.2 {
1148: db collate New_Collation blah...
1149: execsql {
1150: pragma collation_list;
1151: }
1152: } {0 New_Collation 1 NOCASE 2 RTRIM 3 BINARY}
1153: }
1154:
1155: ifcapable schema_pragmas&&tempdb {
1156: do_test pragma-12.1 {
1157: sqlite3 db2 test.db
1158: execsql {
1159: PRAGMA temp.table_info('abc');
1160: } db2
1161: } {}
1162: db2 close
1163:
1164: do_test pragma-12.2 {
1165: sqlite3 db2 test.db
1166: execsql {
1167: PRAGMA temp.default_cache_size = 200;
1168: PRAGMA temp.default_cache_size;
1169: } db2
1170: } {200}
1171: db2 close
1172:
1173: do_test pragma-12.3 {
1174: sqlite3 db2 test.db
1175: execsql {
1176: PRAGMA temp.cache_size = 400;
1177: PRAGMA temp.cache_size;
1178: } db2
1179: } {400}
1180: db2 close
1181: }
1182:
1183: ifcapable bloblit {
1184:
1185: do_test pragma-13.1 {
1186: execsql {
1187: DROP TABLE IF EXISTS t4;
1188: PRAGMA vdbe_trace=on;
1189: PRAGMA vdbe_listing=on;
1190: PRAGMA sql_trace=on;
1191: CREATE TABLE t4(a INTEGER PRIMARY KEY,b);
1192: INSERT INTO t4(b) VALUES(x'0123456789abcdef0123456789abcdef0123456789');
1193: INSERT INTO t4(b) VALUES(randstr(30,30));
1194: INSERT INTO t4(b) VALUES(1.23456);
1195: INSERT INTO t4(b) VALUES(NULL);
1196: INSERT INTO t4(b) VALUES(0);
1197: INSERT INTO t4(b) SELECT b||b||b||b FROM t4;
1198: SELECT * FROM t4;
1199: }
1200: execsql {
1201: PRAGMA vdbe_trace=off;
1202: PRAGMA vdbe_listing=off;
1203: PRAGMA sql_trace=off;
1204: }
1205: } {}
1206:
1207: } ;# ifcapable bloblit
1208:
1209: ifcapable pager_pragmas {
1210: db close
1211: forcedelete test.db
1212: sqlite3 db test.db
1213:
1214: do_test pragma-14.1 {
1215: execsql { pragma auto_vacuum = 0 }
1216: execsql { pragma page_count }
1217: } {0}
1218:
1219: do_test pragma-14.2 {
1220: execsql {
1221: CREATE TABLE abc(a, b, c);
1222: PRAGMA page_count;
1223: }
1224: } {2}
1225: do_test pragma-14.2uc {
1226: execsql {pragma PAGE_COUNT}
1227: } {2}
1228:
1229: do_test pragma-14.3 {
1230: execsql {
1231: BEGIN;
1232: CREATE TABLE def(a, b, c);
1233: PRAGMA page_count;
1234: }
1235: } {3}
1236: do_test pragma-14.3uc {
1237: execsql {pragma PAGE_COUNT}
1238: } {3}
1239:
1240: do_test pragma-14.4 {
1241: set page_size [db one {pragma page_size}]
1242: expr [file size test.db] / $page_size
1243: } {2}
1244:
1245: do_test pragma-14.5 {
1246: execsql {
1247: ROLLBACK;
1248: PRAGMA page_count;
1249: }
1250: } {2}
1251:
1252: do_test pragma-14.6 {
1253: forcedelete test2.db
1254: sqlite3 db2 test2.db
1255: execsql {
1256: PRAGMA auto_vacuum = 0;
1257: CREATE TABLE t1(a, b, c);
1258: CREATE TABLE t2(a, b, c);
1259: CREATE TABLE t3(a, b, c);
1260: CREATE TABLE t4(a, b, c);
1261: } db2
1262: db2 close
1263: execsql {
1264: ATTACH 'test2.db' AS aux;
1265: PRAGMA aux.page_count;
1266: }
1267: } {5}
1268: do_test pragma-14.6uc {
1269: execsql {pragma AUX.PAGE_COUNT}
1270: } {5}
1271: }
1272:
1273: # Test that the value set using the cache_size pragma is not reset when the
1274: # schema is reloaded.
1275: #
1276: ifcapable pager_pragmas {
1277: db close
1278: sqlite3 db test.db
1279: do_test pragma-15.1 {
1280: execsql {
1281: PRAGMA cache_size=59;
1282: PRAGMA cache_size;
1283: }
1284: } {59}
1285: do_test pragma-15.2 {
1286: sqlite3 db2 test.db
1287: execsql {
1288: CREATE TABLE newtable(a, b, c);
1289: } db2
1290: db2 close
1291: } {}
1292: do_test pragma-15.3 {
1293: # Evaluating this statement will cause the schema to be reloaded (because
1294: # the schema was changed by another connection in pragma-15.2). At one
1295: # point there was a bug that reset the cache_size to its default value
1296: # when this happened.
1297: execsql { SELECT * FROM sqlite_master }
1298: execsql { PRAGMA cache_size }
1299: } {59}
1300: }
1301:
1302: # Reset the sqlite3_temp_directory variable for the next run of tests:
1303: sqlite3 dbX :memory:
1304: dbX eval {PRAGMA temp_store_directory = ""}
1305: dbX close
1306:
1307: ifcapable lock_proxy_pragmas&&prefer_proxy_locking {
1308: set sqlite_hostid_num 1
1309:
1310: set using_proxy 0
1311: foreach {name value} [array get env SQLITE_FORCE_PROXY_LOCKING] {
1312: set using_proxy $value
1313: }
1314:
1315: # Test the lock_proxy_file pragmas.
1316: #
1317: db close
1318: set env(SQLITE_FORCE_PROXY_LOCKING) "0"
1319:
1320: sqlite3 db test.db
1321: do_test pragma-16.1 {
1322: execsql {
1323: PRAGMA lock_proxy_file="mylittleproxy";
1324: select * from sqlite_master;
1325: }
1326: execsql {
1327: PRAGMA lock_proxy_file;
1328: }
1329: } {mylittleproxy}
1330:
1331: do_test pragma-16.2 {
1332: sqlite3 db2 test.db
1333: execsql {
1334: PRAGMA lock_proxy_file="mylittleproxy";
1335: } db2
1336: } {}
1337:
1338: db2 close
1339: do_test pragma-16.2.1 {
1340: sqlite3 db2 test.db
1341: execsql {
1342: PRAGMA lock_proxy_file=":auto:";
1343: select * from sqlite_master;
1344: } db2
1345: execsql {
1346: PRAGMA lock_proxy_file;
1347: } db2
1348: } {mylittleproxy}
1349:
1350: db2 close
1351: do_test pragma-16.3 {
1352: sqlite3 db2 test.db
1353: execsql {
1354: PRAGMA lock_proxy_file="myotherproxy";
1355: } db2
1356: catchsql {
1357: select * from sqlite_master;
1358: } db2
1359: } {1 {database is locked}}
1360:
1361: do_test pragma-16.4 {
1362: db2 close
1363: db close
1364: sqlite3 db2 test.db
1365: execsql {
1366: PRAGMA lock_proxy_file="myoriginalproxy";
1367: PRAGMA lock_proxy_file="myotherproxy";
1368: PRAGMA lock_proxy_file;
1369: } db2
1370: } {myotherproxy}
1371:
1372: db2 close
1373: set env(SQLITE_FORCE_PROXY_LOCKING) "1"
1374: do_test pragma-16.5 {
1375: sqlite3 db2 test.db
1376: execsql {
1377: PRAGMA lock_proxy_file=":auto:";
1378: PRAGMA lock_proxy_file;
1379: } db2
1380: } {myotherproxy}
1381:
1382: do_test pragma-16.6 {
1383: db2 close
1384: sqlite3 db2 test2.db
1385: set lockpath [execsql {
1386: PRAGMA lock_proxy_file=":auto:";
1387: PRAGMA lock_proxy_file;
1388: } db2]
1389: string match "*test2.db:auto:" $lockpath
1390: } {1}
1391:
1392: set sqlite_hostid_num 2
1393: do_test pragma-16.7 {
1394: list [catch {
1395: sqlite3 db test2.db
1396: execsql {
1397: PRAGMA lock_proxy_file=":auto:";
1398: select * from sqlite_master;
1399: }
1400: } msg] $msg
1401: } {1 {database is locked}}
1402: db close
1403:
1404: do_test pragma-16.8 {
1405: list [catch {
1406: sqlite3 db test2.db
1407: execsql { select * from sqlite_master }
1408: } msg] $msg
1409: } {1 {database is locked}}
1410:
1411: db2 close
1412: do_test pragma-16.8.1 {
1413: execsql {
1414: PRAGMA lock_proxy_file="yetanotherproxy";
1415: PRAGMA lock_proxy_file;
1416: }
1417: } {yetanotherproxy}
1418: do_test pragma-16.8.2 {
1419: execsql {
1420: create table mine(x);
1421: }
1422: } {}
1423:
1424: db close
1425: do_test pragma-16.9 {
1426: sqlite3 db proxytest.db
1427: set lockpath2 [execsql {
1428: PRAGMA lock_proxy_file=":auto:";
1429: PRAGMA lock_proxy_file;
1430: } db]
1431: string match "*proxytest.db:auto:" $lockpath2
1432: } {1}
1433:
1434: set env(SQLITE_FORCE_PROXY_LOCKING) $using_proxy
1435: set sqlite_hostid_num 0
1436: }
1437:
1438: # Parsing of auto_vacuum settings.
1439: #
1440: foreach {autovac_setting val} {
1441: 0 0
1442: 1 1
1443: 2 2
1444: 3 0
1445: -1 0
1446: none 0
1447: NONE 0
1448: NoNe 0
1449: full 1
1450: FULL 1
1451: incremental 2
1452: INCREMENTAL 2
1453: -1234 0
1454: 1234 0
1455: } {
1456: do_test pragma-17.1.$autovac_setting {
1457: catch {db close}
1458: sqlite3 db :memory:
1459: execsql "
1460: PRAGMA auto_vacuum=$::autovac_setting;
1461: PRAGMA auto_vacuum;
1462: "
1463: } $val
1464: }
1465:
1466: # Parsing of temp_store settings.
1467: #
1468: foreach {temp_setting val} {
1469: 0 0
1470: 1 1
1471: 2 2
1472: 3 0
1473: -1 0
1474: file 1
1475: FILE 1
1476: fIlE 1
1477: memory 2
1478: MEMORY 2
1479: MeMoRy 2
1480: } {
1481: do_test pragma-18.1.$temp_setting {
1482: catch {db close}
1483: sqlite3 db :memory:
1484: execsql "
1485: PRAGMA temp_store=$::temp_setting;
1486: PRAGMA temp_store=$::temp_setting;
1487: PRAGMA temp_store;
1488: "
1489: } $val
1490: }
1491:
1492: finish_test
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>