Annotation of embedaddon/sqlite3/test/pragma.test, revision 1.1

1.1     ! misho       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.73 2009/01/12 14:01:45 danielk1977 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>