15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 2003 April 6 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The author disclaims copyright to this source code. In place of 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** a legal notice, here is a blessing: 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** May you do good and not evil. 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** May you find forgiveness for yourself and forgive others. 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** May you share freely, never taking more than you give. 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)************************************************************************* 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This file contains code used to implement the PRAGMA command. 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sqliteInt.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Ignore this whole file if pragmas are disabled 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(SQLITE_OMIT_PRAGMA) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Interpret the given string as a safety level. Return 0 for OFF, 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 1 for ON or NORMAL and 2 for FULL. Return 1 for an empty or 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** unrecognized string argument. 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Note that the values returned are one less that the values that 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** should be passed into sqlite3BtreeSetSafetyLevel(). The is done 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** to support legacy SQL code. The safety level used to be boolean 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** and older scripts may have used numbers 0 for OFF and 1 for ON. 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static u8 getSafetyLevel(const char *z){ 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 123456789 123456789 */ 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const char zText[] = "onoffalseyestruefull"; 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const u8 iOffset[] = {0, 1, 2, 4, 9, 12, 16}; 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const u8 iLength[] = {2, 2, 3, 5, 3, 4, 4}; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const u8 iValue[] = {1, 0, 0, 0, 1, 1, 2}; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i, n; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3Isdigit(*z) ){ 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (u8)sqlite3Atoi(z); 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) n = sqlite3Strlen30(z); 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0; i<ArraySize(iLength); i++){ 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( iLength[i]==n && sqlite3StrNICmp(&zText[iOffset[i]],z,n)==0 ){ 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return iValue[i]; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 1; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Interpret the given string as a boolean value. 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static u8 getBoolean(const char *z){ 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return getSafetyLevel(z)&1; 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Interpret the given string as a locking mode value. 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int getLockingMode(const char *z){ 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( z ){ 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( 0==sqlite3StrICmp(z, "exclusive") ) return PAGER_LOCKINGMODE_EXCLUSIVE; 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( 0==sqlite3StrICmp(z, "normal") ) return PAGER_LOCKINGMODE_NORMAL; 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PAGER_LOCKINGMODE_QUERY; 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_AUTOVACUUM 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Interpret the given string as an auto-vacuum mode value. 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The following strings, "none", "full" and "incremental" are 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** acceptable, as are their numeric equivalents: 0, 1 and 2 respectively. 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int getAutoVacuum(const char *z){ 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( 0==sqlite3StrICmp(z, "none") ) return BTREE_AUTOVACUUM_NONE; 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( 0==sqlite3StrICmp(z, "full") ) return BTREE_AUTOVACUUM_FULL; 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( 0==sqlite3StrICmp(z, "incremental") ) return BTREE_AUTOVACUUM_INCR; 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i = sqlite3Atoi(z); 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (u8)((i>=0&&i<=2)?i:0); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* ifndef SQLITE_OMIT_AUTOVACUUM */ 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_PAGER_PRAGMAS 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Interpret the given string as a temp db location. Return 1 for file 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** backed temporary databases, 2 for the Red-Black tree in memory database 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** and 0 to use the compile-time default. 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int getTempStore(const char *z){ 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( z[0]>='0' && z[0]<='2' ){ 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return z[0] - '0'; 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else if( sqlite3StrICmp(z, "file")==0 ){ 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 1; 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else if( sqlite3StrICmp(z, "memory")==0 ){ 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 2; 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* SQLITE_PAGER_PRAGMAS */ 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_PAGER_PRAGMAS 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Invalidate temp storage, either when the temp storage is changed 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** from default, or when 'file' and the temp_store_directory has changed 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int invalidateTempStorage(Parse *pParse){ 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3 *db = pParse->db; 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( db->aDb[1].pBt!=0 ){ 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( !db->autoCommit || sqlite3BtreeIsInReadTrans(db->aDb[1].pBt) ){ 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ErrorMsg(pParse, "temporary storage cannot be changed " 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "from within a transaction"); 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return SQLITE_ERROR; 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3BtreeClose(db->aDb[1].pBt); 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db->aDb[1].pBt = 0; 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ResetInternalSchema(db, -1); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return SQLITE_OK; 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* SQLITE_PAGER_PRAGMAS */ 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_PAGER_PRAGMAS 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If the TEMP database is open, close it and mark the database schema 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** as needing reloading. This must be done when using the SQLITE_TEMP_STORE 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** or DEFAULT_TEMP_STORE pragmas. 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int changeTempStorage(Parse *pParse, const char *zStorageType){ 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ts = getTempStore(zStorageType); 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3 *db = pParse->db; 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( db->temp_store==ts ) return SQLITE_OK; 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( invalidateTempStorage( pParse ) != SQLITE_OK ){ 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return SQLITE_ERROR; 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db->temp_store = (u8)ts; 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return SQLITE_OK; 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* SQLITE_PAGER_PRAGMAS */ 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Generate code to return a single integer value. 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void returnSingleInt(Parse *pParse, const char *zLabel, i64 value){ 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Vdbe *v = sqlite3GetVdbe(pParse); 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int mem = ++pParse->nMem; 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i64 *pI64 = sqlite3DbMallocRaw(pParse->db, sizeof(value)); 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pI64 ){ 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memcpy(pI64, &value, sizeof(value)); 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp4(v, OP_Int64, 0, mem, 0, (char*)pI64, P4_INT64); 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeSetNumCols(v, 1); 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeSetColName(v, 0, COLNAME_NAME, zLabel, SQLITE_STATIC); 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_ResultRow, mem, 1); 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_FLAG_PRAGMAS 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Check to see if zRight and zLeft refer to a pragma that queries 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** or changes one of the flags in db->flags. Return 1 if so and 0 if not. 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Also, implement the pragma. 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int flagPragma(Parse *pParse, const char *zLeft, const char *zRight){ 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const struct sPragmaType { 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *zName; /* Name of the pragma */ 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int mask; /* Mask for the db->flags value */ 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } aPragma[] = { 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "full_column_names", SQLITE_FullColNames }, 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "short_column_names", SQLITE_ShortColNames }, 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "count_changes", SQLITE_CountRows }, 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "empty_result_callbacks", SQLITE_NullCallback }, 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "legacy_file_format", SQLITE_LegacyFileFmt }, 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "fullfsync", SQLITE_FullFSync }, 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "checkpoint_fullfsync", SQLITE_CkptFullFSync }, 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "reverse_unordered_selects", SQLITE_ReverseOrder }, 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_AUTOMATIC_INDEX 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "automatic_index", SQLITE_AutoIndex }, 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SQLITE_DEBUG 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "sql_trace", SQLITE_SqlTrace }, 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "vdbe_listing", SQLITE_VdbeListing }, 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "vdbe_trace", SQLITE_VdbeTrace }, 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_CHECK 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "ignore_check_constraints", SQLITE_IgnoreChecks }, 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* The following is VERY experimental */ 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "writable_schema", SQLITE_WriteSchema|SQLITE_RecoveryMode }, 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "omit_readlock", SQLITE_NoReadlock }, 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* TODO: Maybe it shouldn't be possible to change the ReadUncommitted 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** flag if there are any active statements. */ 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "read_uncommitted", SQLITE_ReadUncommitted }, 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "recursive_triggers", SQLITE_RecTriggers }, 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* This flag may only be set if both foreign-key and trigger support 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** are present in the build. */ 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(SQLITE_OMIT_FOREIGN_KEY) && !defined(SQLITE_OMIT_TRIGGER) 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "foreign_keys", SQLITE_ForeignKeys }, 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const struct sPragmaType *p; 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0, p=aPragma; i<ArraySize(aPragma); i++, p++){ 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3StrICmp(zLeft, p->zName)==0 ){ 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3 *db = pParse->db; 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Vdbe *v; 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v = sqlite3GetVdbe(pParse); 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( v!=0 ); /* Already allocated by sqlite3Pragma() */ 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( ALWAYS(v) ){ 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( zRight==0 ){ 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) returnSingleInt(pParse, p->zName, (db->flags & p->mask)!=0 ); 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int mask = p->mask; /* Mask of bits to set or clear. */ 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( db->autoCommit==0 ){ 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Foreign key support may not be enabled or disabled while not 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** in auto-commit mode. */ 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mask &= ~(SQLITE_ForeignKeys); 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( getBoolean(zRight) ){ 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db->flags |= mask; 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db->flags &= ~mask; 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Many of the flag-pragmas modify the code generated by the SQL 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** compiler (eg. count_changes). So add an opcode to expire all 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** compiled SQL statements after modifying a pragma value. 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Expire, 0, 0); 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 1; 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* SQLITE_OMIT_FLAG_PRAGMAS */ 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return a human-readable name for a constraint resolution action. 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_FOREIGN_KEY 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const char *actionName(u8 action){ 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *zName; 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch( action ){ 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case OE_SetNull: zName = "SET NULL"; break; 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case OE_SetDflt: zName = "SET DEFAULT"; break; 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case OE_Cascade: zName = "CASCADE"; break; 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case OE_Restrict: zName = "RESTRICT"; break; 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: zName = "NO ACTION"; 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( action==OE_None ); break; 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return zName; 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Parameter eMode must be one of the PAGER_JOURNALMODE_XXX constants 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** defined in pager.h. This function returns the associated lowercase 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** journal-mode name. 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char *sqlite3JournalModename(int eMode){ 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static char * const azModeName[] = { 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "delete", "persist", "off", "truncate", "memory" 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_WAL 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) , "wal" 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( PAGER_JOURNALMODE_DELETE==0 ); 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( PAGER_JOURNALMODE_PERSIST==1 ); 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( PAGER_JOURNALMODE_OFF==2 ); 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( PAGER_JOURNALMODE_TRUNCATE==3 ); 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( PAGER_JOURNALMODE_MEMORY==4 ); 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( PAGER_JOURNALMODE_WAL==5 ); 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( eMode>=0 && eMode<=ArraySize(azModeName) ); 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( eMode==ArraySize(azModeName) ) return 0; 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return azModeName[eMode]; 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Process a pragma statement. 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Pragmas are of this form: 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** PRAGMA [database.]id [= value] 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The identifier might also be a string. The value is a string, and 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** identifier, or a number. If minusFlag is true, then the value is 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** a number that was preceded by a minus sign. 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If the left side is "database.id" then pId1 is the database name 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** and pId2 is the id. If the left side is just "id" then pId1 is the 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** id and pId2 is any empty string. 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3Pragma( 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Parse *pParse, 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Token *pId1, /* First part of [database.]id field */ 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Token *pId2, /* Second part of [database.]id field, or NULL */ 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Token *pValue, /* Token for <value>, or NULL */ 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int minusFlag /* True if a '-' sign preceded <value> */ 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *zLeft = 0; /* Nul-terminated UTF-8 string <id> */ 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *zRight = 0; /* Nul-terminated UTF-8 string <value>, or NULL */ 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *zDb = 0; /* The database name */ 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Token *pId; /* Pointer to <id> token */ 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iDb; /* Database index for <database> */ 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3 *db = pParse->db; 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Db *pDb; 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Vdbe *v = pParse->pVdbe = sqlite3VdbeCreate(db); 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( v==0 ) return; 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeRunOnlyOnce(v); 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pParse->nMem = 2; 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Interpret the [database.] part of the pragma statement. iDb is the 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** index of the database this pragma is being applied to in db.aDb[]. */ 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iDb = sqlite3TwoPartName(pParse, pId1, pId2, &pId); 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( iDb<0 ) return; 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pDb = &db->aDb[iDb]; 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* If the temp database has been explicitly named as part of the 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** pragma, make sure it is open. 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( iDb==1 && sqlite3OpenTempDatabase(pParse) ){ 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zLeft = sqlite3NameFromToken(db, pId); 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( !zLeft ) return; 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( minusFlag ){ 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zRight = sqlite3MPrintf(db, "-%T", pValue); 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zRight = sqlite3NameFromToken(db, pValue); 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pId2 ); 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zDb = pId2->n>0 ? pDb->zName : 0; 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3AuthCheck(pParse, SQLITE_PRAGMA, zLeft, zRight, zDb) ){ 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto pragma_out; 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_PAGER_PRAGMAS 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** PRAGMA [database.]default_cache_size 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** PRAGMA [database.]default_cache_size=N 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** The first form reports the current persistent setting for the 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** page cache size. The value returned is the maximum number of 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** pages in the page cache. The second form sets both the current 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** page cache size value and the persistent page cache size value 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** stored in the database file. 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** Older versions of SQLite would set the default cache size to a 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** negative number to indicate synchronous=OFF. These days, synchronous 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** is always on by default regardless of the sign of the default cache 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** size. But continue to take the absolute value of the default cache 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** size of historical compatibility. 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3StrICmp(zLeft,"default_cache_size")==0 ){ 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const VdbeOpList getCacheSize[] = { 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { OP_Transaction, 0, 0, 0}, /* 0 */ 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { OP_ReadCookie, 0, 1, BTREE_DEFAULT_CACHE_SIZE}, /* 1 */ 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { OP_IfPos, 1, 7, 0}, 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { OP_Integer, 0, 2, 0}, 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { OP_Subtract, 1, 2, 1}, 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { OP_IfPos, 1, 7, 0}, 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { OP_Integer, 0, 1, 0}, /* 6 */ 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { OP_ResultRow, 1, 1, 0}, 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int addr; 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3ReadSchema(pParse) ) goto pragma_out; 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeUsesBtree(v, iDb); 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( !zRight ){ 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeSetNumCols(v, 1); 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "cache_size", SQLITE_STATIC); 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pParse->nMem += 2; 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) addr = sqlite3VdbeAddOpList(v, ArraySize(getCacheSize), getCacheSize); 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeChangeP1(v, addr, iDb); 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeChangeP1(v, addr+1, iDb); 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeChangeP1(v, addr+6, SQLITE_DEFAULT_CACHE_SIZE); 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int size = sqlite3AbsInt32(sqlite3Atoi(zRight)); 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3BeginWriteOperation(pParse, 0, iDb); 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Integer, size, 1); 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp3(v, OP_SetCookie, iDb, BTREE_DEFAULT_CACHE_SIZE, 1); 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pDb->pSchema->cache_size = size; 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3BtreeSetCacheSize(pDb->pBt, pDb->pSchema->cache_size); 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** PRAGMA [database.]page_size 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** PRAGMA [database.]page_size=N 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** The first form reports the current setting for the 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** database page size in bytes. The second form sets the 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** database page size value. The value can only be set if 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** the database has not yet been created. 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3StrICmp(zLeft,"page_size")==0 ){ 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Btree *pBt = pDb->pBt; 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pBt!=0 ); 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( !zRight ){ 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int size = ALWAYS(pBt) ? sqlite3BtreeGetPageSize(pBt) : 0; 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) returnSingleInt(pParse, "page_size", size); 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Malloc may fail when setting the page-size, as there is an internal 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** buffer that the pager module resizes using sqlite3_realloc(). 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db->nextPagesize = sqlite3Atoi(zRight); 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( SQLITE_NOMEM==sqlite3BtreeSetPageSize(pBt, db->nextPagesize, -1, 0) ){ 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db->mallocFailed = 1; 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** PRAGMA [database.]secure_delete 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** PRAGMA [database.]secure_delete=ON/OFF 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** The first form reports the current setting for the 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** secure_delete flag. The second form changes the secure_delete 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** flag setting and reports thenew value. 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3StrICmp(zLeft,"secure_delete")==0 ){ 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Btree *pBt = pDb->pBt; 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int b = -1; 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pBt!=0 ); 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( zRight ){ 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) b = getBoolean(zRight); 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pId2->n==0 && b>=0 ){ 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ii; 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(ii=0; ii<db->nDb; ii++){ 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3BtreeSecureDelete(db->aDb[ii].pBt, b); 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) b = sqlite3BtreeSecureDelete(pBt, b); 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) returnSingleInt(pParse, "secure_delete", b); 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** PRAGMA [database.]max_page_count 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** PRAGMA [database.]max_page_count=N 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** The first form reports the current setting for the 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** maximum number of pages in the database file. The 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** second form attempts to change this setting. Both 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** forms return the current setting. 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** PRAGMA [database.]page_count 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** Return the number of pages in the specified database. 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3StrICmp(zLeft,"page_count")==0 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) || sqlite3StrICmp(zLeft,"max_page_count")==0 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ){ 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iReg; 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3ReadSchema(pParse) ) goto pragma_out; 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3CodeVerifySchema(pParse, iDb); 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iReg = ++pParse->nMem; 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( zLeft[0]=='p' ){ 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Pagecount, iDb, iReg); 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp3(v, OP_MaxPgcnt, iDb, iReg, sqlite3Atoi(zRight)); 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_ResultRow, iReg, 1); 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeSetNumCols(v, 1); 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeSetColName(v, 0, COLNAME_NAME, zLeft, SQLITE_TRANSIENT); 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** PRAGMA [database.]locking_mode 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** PRAGMA [database.]locking_mode = (normal|exclusive) 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3StrICmp(zLeft,"locking_mode")==0 ){ 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *zRet = "normal"; 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int eMode = getLockingMode(zRight); 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pId2->n==0 && eMode==PAGER_LOCKINGMODE_QUERY ){ 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Simple "PRAGMA locking_mode;" statement. This is a query for 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** the current default locking mode (which may be different to 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** the locking-mode of the main database). 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) eMode = db->dfltLockMode; 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Pager *pPager; 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pId2->n==0 ){ 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* This indicates that no database name was specified as part 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** of the PRAGMA command. In this case the locking-mode must be 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** set on all attached databases, as well as the main db file. 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** Also, the sqlite3.dfltLockMode variable is set so that 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** any subsequently attached databases also use the specified 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** locking mode. 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ii; 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert(pDb==&db->aDb[0]); 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(ii=2; ii<db->nDb; ii++){ 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pPager = sqlite3BtreePager(db->aDb[ii].pBt); 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3PagerLockingMode(pPager, eMode); 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db->dfltLockMode = (u8)eMode; 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pPager = sqlite3BtreePager(pDb->pBt); 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) eMode = sqlite3PagerLockingMode(pPager, eMode); 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert(eMode==PAGER_LOCKINGMODE_NORMAL||eMode==PAGER_LOCKINGMODE_EXCLUSIVE); 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( eMode==PAGER_LOCKINGMODE_EXCLUSIVE ){ 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zRet = "exclusive"; 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeSetNumCols(v, 1); 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "locking_mode", SQLITE_STATIC); 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp4(v, OP_String8, 0, 1, 0, zRet, 0); 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 1); 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** PRAGMA [database.]journal_mode 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** PRAGMA [database.]journal_mode = 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** (delete|persist|off|truncate|memory|wal|off) 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3StrICmp(zLeft,"journal_mode")==0 ){ 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int eMode; /* One of the PAGER_JOURNALMODE_XXX symbols */ 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ii; /* Loop counter */ 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Force the schema to be loaded on all databases. This cases all 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** database files to be opened and the journal_modes set. */ 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3ReadSchema(pParse) ){ 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto pragma_out; 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeSetNumCols(v, 1); 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "journal_mode", SQLITE_STATIC); 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( zRight==0 ){ 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* If there is no "=MODE" part of the pragma, do a query for the 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** current mode */ 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) eMode = PAGER_JOURNALMODE_QUERY; 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *zMode; 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int n = sqlite3Strlen30(zRight); 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(eMode=0; (zMode = sqlite3JournalModename(eMode))!=0; eMode++){ 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3StrNICmp(zRight, zMode, n)==0 ) break; 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( !zMode ){ 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* If the "=MODE" part does not match any known journal mode, 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** then do a query */ 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) eMode = PAGER_JOURNALMODE_QUERY; 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( eMode==PAGER_JOURNALMODE_QUERY && pId2->n==0 ){ 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Convert "PRAGMA journal_mode" into "PRAGMA main.journal_mode" */ 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iDb = 0; 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pId2->n = 1; 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(ii=db->nDb-1; ii>=0; ii--){ 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( db->aDb[ii].pBt && (ii==iDb || pId2->n==0) ){ 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeUsesBtree(v, ii); 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp3(v, OP_JournalMode, ii, 1, eMode); 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 1); 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** PRAGMA [database.]journal_size_limit 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** PRAGMA [database.]journal_size_limit=N 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** Get or set the size limit on rollback journal files. 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3StrICmp(zLeft,"journal_size_limit")==0 ){ 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Pager *pPager = sqlite3BtreePager(pDb->pBt); 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i64 iLimit = -2; 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( zRight ){ 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3Atoi64(zRight, &iLimit, 1000000, SQLITE_UTF8); 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( iLimit<-1 ) iLimit = -1; 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iLimit = sqlite3PagerJournalSizeLimit(pPager, iLimit); 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) returnSingleInt(pParse, "journal_size_limit", iLimit); 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* SQLITE_OMIT_PAGER_PRAGMAS */ 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** PRAGMA [database.]auto_vacuum 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** PRAGMA [database.]auto_vacuum=N 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** Get or set the value of the database 'auto-vacuum' parameter. 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** The value is one of: 0 NONE 1 FULL 2 INCREMENTAL 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_AUTOVACUUM 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3StrICmp(zLeft,"auto_vacuum")==0 ){ 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Btree *pBt = pDb->pBt; 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pBt!=0 ); 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3ReadSchema(pParse) ){ 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto pragma_out; 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( !zRight ){ 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int auto_vacuum; 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( ALWAYS(pBt) ){ 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) auto_vacuum = sqlite3BtreeGetAutoVacuum(pBt); 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) auto_vacuum = SQLITE_DEFAULT_AUTOVACUUM; 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) returnSingleInt(pParse, "auto_vacuum", auto_vacuum); 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int eAuto = getAutoVacuum(zRight); 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( eAuto>=0 && eAuto<=2 ); 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db->nextAutovac = (u8)eAuto; 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( ALWAYS(eAuto>=0) ){ 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Call SetAutoVacuum() to set initialize the internal auto and 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** incr-vacuum flags. This is required in case this connection 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** creates the database file. It is important that it is created 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** as an auto-vacuum capable db. 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rc = sqlite3BtreeSetAutoVacuum(pBt, eAuto); 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( rc==SQLITE_OK && (eAuto==1 || eAuto==2) ){ 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* When setting the auto_vacuum mode to either "full" or 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** "incremental", write the value of meta[6] in the database 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** file. Before writing to meta[6], check that meta[3] indicates 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** that this really is an auto-vacuum capable database. 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const VdbeOpList setMeta6[] = { 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { OP_Transaction, 0, 1, 0}, /* 0 */ 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { OP_ReadCookie, 0, 1, BTREE_LARGEST_ROOT_PAGE}, 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { OP_If, 1, 0, 0}, /* 2 */ 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { OP_Halt, SQLITE_OK, OE_Abort, 0}, /* 3 */ 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { OP_Integer, 0, 1, 0}, /* 4 */ 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { OP_SetCookie, 0, BTREE_INCR_VACUUM, 1}, /* 5 */ 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iAddr; 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iAddr = sqlite3VdbeAddOpList(v, ArraySize(setMeta6), setMeta6); 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeChangeP1(v, iAddr, iDb); 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeChangeP1(v, iAddr+1, iDb); 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeChangeP2(v, iAddr+2, iAddr+4); 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeChangeP1(v, iAddr+4, eAuto-1); 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeChangeP1(v, iAddr+5, iDb); 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeUsesBtree(v, iDb); 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** PRAGMA [database.]incremental_vacuum(N) 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** Do N steps of incremental vacuuming on a database. 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_AUTOVACUUM 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3StrICmp(zLeft,"incremental_vacuum")==0 ){ 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iLimit, addr; 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3ReadSchema(pParse) ){ 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto pragma_out; 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( zRight==0 || !sqlite3GetInt32(zRight, &iLimit) || iLimit<=0 ){ 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iLimit = 0x7fffffff; 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3BeginWriteOperation(pParse, 0, iDb); 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Integer, iLimit, 1); 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) addr = sqlite3VdbeAddOp1(v, OP_IncrVacuum, iDb); 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp1(v, OP_ResultRow, 1); 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_AddImm, 1, -1); 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_IfPos, 1, addr); 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeJumpHere(v, addr); 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_PAGER_PRAGMAS 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** PRAGMA [database.]cache_size 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** PRAGMA [database.]cache_size=N 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** The first form reports the current local setting for the 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** page cache size. The local setting can be different from 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** the persistent cache size value that is stored in the database 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** file itself. The value returned is the maximum number of 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** pages in the page cache. The second form sets the local 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** page cache size value. It does not change the persistent 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** cache size stored on the disk so the cache size will revert 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** to its default value when the database is closed and reopened. 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** N should be a positive integer. 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3StrICmp(zLeft,"cache_size")==0 ){ 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3ReadSchema(pParse) ) goto pragma_out; 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( !zRight ){ 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) returnSingleInt(pParse, "cache_size", pDb->pSchema->cache_size); 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int size = sqlite3AbsInt32(sqlite3Atoi(zRight)); 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pDb->pSchema->cache_size = size; 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3BtreeSetCacheSize(pDb->pBt, pDb->pSchema->cache_size); 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** PRAGMA temp_store 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** PRAGMA temp_store = "default"|"memory"|"file" 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** Return or set the local value of the temp_store flag. Changing 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** the local value does not make changes to the disk file and the default 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** value will be restored the next time the database is opened. 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** Note that it is possible for the library compile-time options to 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** override this setting 7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3StrICmp(zLeft, "temp_store")==0 ){ 7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( !zRight ){ 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) returnSingleInt(pParse, "temp_store", db->temp_store); 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) changeTempStorage(pParse, zRight); 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** PRAGMA temp_store_directory 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** PRAGMA temp_store_directory = ""|"directory_name" 7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** Return or set the local value of the temp_store_directory flag. Changing 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** the value sets a specific directory to be used for temporary files. 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** Setting to a null string reverts to the default temporary directory search. 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** If temporary directory is changed, then invalidateTempStorage. 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3StrICmp(zLeft, "temp_store_directory")==0 ){ 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( !zRight ){ 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3_temp_directory ){ 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeSetNumCols(v, 1); 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeSetColName(v, 0, COLNAME_NAME, 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "temp_store_directory", SQLITE_STATIC); 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp4(v, OP_String8, 0, 1, 0, sqlite3_temp_directory, 0); 7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 1); 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_WSD 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( zRight[0] ){ 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rc; 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int res; 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = sqlite3OsAccess(db->pVfs, zRight, SQLITE_ACCESS_READWRITE, &res); 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( rc!=SQLITE_OK || res==0 ){ 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ErrorMsg(pParse, "not a writable directory"); 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto pragma_out; 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( SQLITE_TEMP_STORE==0 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) || (SQLITE_TEMP_STORE==1 && db->temp_store<=1) 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) || (SQLITE_TEMP_STORE==2 && db->temp_store==1) 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ){ 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) invalidateTempStorage(pParse); 7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_free(sqlite3_temp_directory); 7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( zRight[0] ){ 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_temp_directory = sqlite3_mprintf("%s", zRight); 7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_temp_directory = 0; 7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* SQLITE_OMIT_WSD */ 7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else 7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(SQLITE_ENABLE_LOCKING_STYLE) 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# if defined(__APPLE__) 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define SQLITE_ENABLE_LOCKING_STYLE 1 7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# else 7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define SQLITE_ENABLE_LOCKING_STYLE 0 7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# endif 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if SQLITE_ENABLE_LOCKING_STYLE 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** PRAGMA [database.]lock_proxy_file 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** PRAGMA [database.]lock_proxy_file = ":auto:"|"lock_file_path" 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** Return or set the value of the lock_proxy_file flag. Changing 7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** the value sets a specific file to be used for database access locks. 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3StrICmp(zLeft, "lock_proxy_file")==0 ){ 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( !zRight ){ 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Pager *pPager = sqlite3BtreePager(pDb->pBt); 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *proxy_file_path = NULL; 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_file *pFile = sqlite3PagerFile(pPager); 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3OsFileControl(pFile, SQLITE_GET_LOCKPROXYFILE, 7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &proxy_file_path); 7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( proxy_file_path ){ 7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeSetNumCols(v, 1); 7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeSetColName(v, 0, COLNAME_NAME, 7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lock_proxy_file", SQLITE_STATIC); 7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp4(v, OP_String8, 0, 1, 0, proxy_file_path, 0); 7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 1); 7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Pager *pPager = sqlite3BtreePager(pDb->pBt); 8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_file *pFile = sqlite3PagerFile(pPager); 8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int res; 8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( zRight[0] ){ 8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) res=sqlite3OsFileControl(pFile, SQLITE_SET_LOCKPROXYFILE, 8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zRight); 8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) res=sqlite3OsFileControl(pFile, SQLITE_SET_LOCKPROXYFILE, 8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL); 8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( res!=SQLITE_OK ){ 8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ErrorMsg(pParse, "failed to set lock proxy file"); 8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto pragma_out; 8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else 8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* SQLITE_ENABLE_LOCKING_STYLE */ 8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** PRAGMA [database.]synchronous 8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** PRAGMA [database.]synchronous=OFF|ON|NORMAL|FULL 8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** Return or set the local value of the synchronous flag. Changing 8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** the local value does not make changes to the disk file and the 8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** default value will be restored the next time the database is 8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** opened. 8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3StrICmp(zLeft,"synchronous")==0 ){ 8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3ReadSchema(pParse) ) goto pragma_out; 8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( !zRight ){ 8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) returnSingleInt(pParse, "synchronous", pDb->safety_level-1); 8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( !db->autoCommit ){ 8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ErrorMsg(pParse, 8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Safety level may not be changed inside a transaction"); 8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pDb->safety_level = getSafetyLevel(zRight)+1; 8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else 8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* SQLITE_OMIT_PAGER_PRAGMAS */ 8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_FLAG_PRAGMAS 8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( flagPragma(pParse, zLeft, zRight) ){ 8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* The flagPragma() subroutine also generates any necessary code 8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** there is nothing more to do here */ 8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else 8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* SQLITE_OMIT_FLAG_PRAGMAS */ 8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_SCHEMA_PRAGMAS 8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** PRAGMA table_info(<table>) 8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** Return a single row for each column of the named table. The columns of 8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** the returned data set are: 8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** cid: Column id (numbered from left to right, starting at 0) 8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** name: Column name 8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** type: Column declaration type. 8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** notnull: True if 'NOT NULL' is part of column declaration 8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** dflt_value: The default value for the column, if any. 8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3StrICmp(zLeft, "table_info")==0 && zRight ){ 8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Table *pTab; 8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3ReadSchema(pParse) ) goto pragma_out; 8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pTab = sqlite3FindTable(db, zRight, zDb); 8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pTab ){ 8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nHidden = 0; 8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Column *pCol; 8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeSetNumCols(v, 6); 8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pParse->nMem = 6; 8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "cid", SQLITE_STATIC); 8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeSetColName(v, 1, COLNAME_NAME, "name", SQLITE_STATIC); 8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeSetColName(v, 2, COLNAME_NAME, "type", SQLITE_STATIC); 8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeSetColName(v, 3, COLNAME_NAME, "notnull", SQLITE_STATIC); 8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeSetColName(v, 4, COLNAME_NAME, "dflt_value", SQLITE_STATIC); 8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeSetColName(v, 5, COLNAME_NAME, "pk", SQLITE_STATIC); 8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ViewGetColumnNames(pParse, pTab); 8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0, pCol=pTab->aCol; i<pTab->nCol; i++, pCol++){ 8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( IsHiddenColumn(pCol) ){ 8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nHidden++; 8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Integer, i-nHidden, 1); 8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp4(v, OP_String8, 0, 2, 0, pCol->zName, 0); 8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp4(v, OP_String8, 0, 3, 0, 8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pCol->zType ? pCol->zType : "", 0); 8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Integer, (pCol->notNull ? 1 : 0), 4); 8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pCol->zDflt ){ 8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp4(v, OP_String8, 0, 5, 0, (char*)pCol->zDflt, 0); 8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Null, 0, 5); 8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Integer, pCol->isPrimKey, 6); 8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 6); 8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else 9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3StrICmp(zLeft, "index_info")==0 && zRight ){ 9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Index *pIdx; 9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Table *pTab; 9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3ReadSchema(pParse) ) goto pragma_out; 9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pIdx = sqlite3FindIndex(db, zRight, zDb); 9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pIdx ){ 9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pTab = pIdx->pTable; 9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeSetNumCols(v, 3); 9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pParse->nMem = 3; 9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "seqno", SQLITE_STATIC); 9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeSetColName(v, 1, COLNAME_NAME, "cid", SQLITE_STATIC); 9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeSetColName(v, 2, COLNAME_NAME, "name", SQLITE_STATIC); 9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0; i<pIdx->nColumn; i++){ 9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int cnum = pIdx->aiColumn[i]; 9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Integer, i, 1); 9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Integer, cnum, 2); 9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pTab->nCol>cnum ); 9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp4(v, OP_String8, 0, 3, 0, pTab->aCol[cnum].zName, 0); 9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 3); 9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else 9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3StrICmp(zLeft, "index_list")==0 && zRight ){ 9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Index *pIdx; 9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Table *pTab; 9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3ReadSchema(pParse) ) goto pragma_out; 9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pTab = sqlite3FindTable(db, zRight, zDb); 9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pTab ){ 9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v = sqlite3GetVdbe(pParse); 9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pIdx = pTab->pIndex; 9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pIdx ){ 9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i = 0; 9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeSetNumCols(v, 3); 9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pParse->nMem = 3; 9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "seq", SQLITE_STATIC); 9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeSetColName(v, 1, COLNAME_NAME, "name", SQLITE_STATIC); 9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeSetColName(v, 2, COLNAME_NAME, "unique", SQLITE_STATIC); 9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while(pIdx){ 9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Integer, i, 1); 9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp4(v, OP_String8, 0, 2, 0, pIdx->zName, 0); 9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Integer, pIdx->onError!=OE_None, 3); 9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 3); 9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++i; 9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pIdx = pIdx->pNext; 9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else 9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3StrICmp(zLeft, "database_list")==0 ){ 9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3ReadSchema(pParse) ) goto pragma_out; 9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeSetNumCols(v, 3); 9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pParse->nMem = 3; 9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "seq", SQLITE_STATIC); 9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeSetColName(v, 1, COLNAME_NAME, "name", SQLITE_STATIC); 9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeSetColName(v, 2, COLNAME_NAME, "file", SQLITE_STATIC); 9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0; i<db->nDb; i++){ 9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( db->aDb[i].pBt==0 ) continue; 9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( db->aDb[i].zName!=0 ); 9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Integer, i, 1); 9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp4(v, OP_String8, 0, 2, 0, db->aDb[i].zName, 0); 9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp4(v, OP_String8, 0, 3, 0, 9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3BtreeGetFilename(db->aDb[i].pBt), 0); 9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 3); 9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else 9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3StrICmp(zLeft, "collation_list")==0 ){ 9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i = 0; 9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HashElem *p; 9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeSetNumCols(v, 2); 9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pParse->nMem = 2; 9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "seq", SQLITE_STATIC); 9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeSetColName(v, 1, COLNAME_NAME, "name", SQLITE_STATIC); 9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(p=sqliteHashFirst(&db->aCollSeq); p; p=sqliteHashNext(p)){ 9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CollSeq *pColl = (CollSeq *)sqliteHashData(p); 9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Integer, i++, 1); 9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp4(v, OP_String8, 0, 2, 0, pColl->zName, 0); 9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 2); 9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else 9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* SQLITE_OMIT_SCHEMA_PRAGMAS */ 9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_FOREIGN_KEY 9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3StrICmp(zLeft, "foreign_key_list")==0 && zRight ){ 9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FKey *pFK; 9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Table *pTab; 9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3ReadSchema(pParse) ) goto pragma_out; 9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pTab = sqlite3FindTable(db, zRight, zDb); 9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pTab ){ 9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v = sqlite3GetVdbe(pParse); 9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pFK = pTab->pFKey; 9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pFK ){ 9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i = 0; 9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeSetNumCols(v, 8); 9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pParse->nMem = 8; 10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "id", SQLITE_STATIC); 10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeSetColName(v, 1, COLNAME_NAME, "seq", SQLITE_STATIC); 10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeSetColName(v, 2, COLNAME_NAME, "table", SQLITE_STATIC); 10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeSetColName(v, 3, COLNAME_NAME, "from", SQLITE_STATIC); 10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeSetColName(v, 4, COLNAME_NAME, "to", SQLITE_STATIC); 10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeSetColName(v, 5, COLNAME_NAME, "on_update", SQLITE_STATIC); 10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeSetColName(v, 6, COLNAME_NAME, "on_delete", SQLITE_STATIC); 10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeSetColName(v, 7, COLNAME_NAME, "match", SQLITE_STATIC); 10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while(pFK){ 10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int j; 10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(j=0; j<pFK->nCol; j++){ 10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *zCol = pFK->aCol[j].zCol; 10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *zOnDelete = (char *)actionName(pFK->aAction[0]); 10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *zOnUpdate = (char *)actionName(pFK->aAction[1]); 10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Integer, i, 1); 10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Integer, j, 2); 10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp4(v, OP_String8, 0, 3, 0, pFK->zTo, 0); 10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp4(v, OP_String8, 0, 4, 0, 10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pTab->aCol[pFK->aCol[j].iFrom].zName, 0); 10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp4(v, zCol ? OP_String8 : OP_Null, 0, 5, 0, zCol, 0); 10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp4(v, OP_String8, 0, 6, 0, zOnUpdate, 0); 10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp4(v, OP_String8, 0, 7, 0, zOnDelete, 0); 10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp4(v, OP_String8, 0, 8, 0, "NONE", 0); 10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 8); 10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++i; 10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pFK = pFK->pNextFrom; 10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else 10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* !defined(SQLITE_OMIT_FOREIGN_KEY) */ 10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef NDEBUG 10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3StrICmp(zLeft, "parser_trace")==0 ){ 10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( zRight ){ 10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( getBoolean(zRight) ){ 10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ParserTrace(stderr, "parser: "); 10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ParserTrace(0, 0); 10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else 10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Reinstall the LIKE and GLOB functions. The variant of LIKE 10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** used will be case sensitive or not depending on the RHS. 10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3StrICmp(zLeft, "case_sensitive_like")==0 ){ 10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( zRight ){ 10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3RegisterLikeFunctions(db, getBoolean(zRight)); 10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else 10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_INTEGRITY_CHECK_ERROR_MAX 10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define SQLITE_INTEGRITY_CHECK_ERROR_MAX 100 10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_INTEGRITY_CHECK 10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Pragma "quick_check" is an experimental reduced version of 10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** integrity_check designed to detect most database corruption 10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** without most of the overhead of a full integrity-check. 10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3StrICmp(zLeft, "integrity_check")==0 10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) || sqlite3StrICmp(zLeft, "quick_check")==0 10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ){ 10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i, j, addr, mxErr; 10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Code that appears at the end of the integrity check. If no error 10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** messages have been generated, output OK. Otherwise output the 10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** error message 10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const VdbeOpList endCode[] = { 10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { OP_AddImm, 1, 0, 0}, /* 0 */ 10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { OP_IfNeg, 1, 0, 0}, /* 1 */ 10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { OP_String8, 0, 3, 0}, /* 2 */ 10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { OP_ResultRow, 3, 1, 0}, 10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int isQuick = (zLeft[0]=='q'); 10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Initialize the VDBE program */ 10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3ReadSchema(pParse) ) goto pragma_out; 10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pParse->nMem = 6; 10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeSetNumCols(v, 1); 10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "integrity_check", SQLITE_STATIC); 10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Set the maximum error count */ 10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mxErr = SQLITE_INTEGRITY_CHECK_ERROR_MAX; 10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( zRight ){ 10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3GetInt32(zRight, &mxErr); 10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( mxErr<=0 ){ 10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mxErr = SQLITE_INTEGRITY_CHECK_ERROR_MAX; 10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Integer, mxErr, 1); /* reg[1] holds errors left */ 10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Do an integrity check on each database file */ 10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0; i<db->nDb; i++){ 10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HashElem *x; 11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Hash *pTbls; 11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int cnt = 0; 11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( OMIT_TEMPDB && i==1 ) continue; 11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3CodeVerifySchema(pParse, i); 11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) addr = sqlite3VdbeAddOp1(v, OP_IfPos, 1); /* Halt if out of errors */ 11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Halt, 0, 0); 11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeJumpHere(v, addr); 11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Do an integrity check of the B-Tree 11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** Begin by filling registers 2, 3, ... with the root pages numbers 11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** for all tables and indices in the database. 11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); 11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pTbls = &db->aDb[i].pSchema->tblHash; 11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(x=sqliteHashFirst(pTbls); x; x=sqliteHashNext(x)){ 11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Table *pTab = sqliteHashData(x); 11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Index *pIdx; 11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Integer, pTab->tnum, 2+cnt); 11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cnt++; 11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){ 11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Integer, pIdx->tnum, 2+cnt); 11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cnt++; 11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Make sure sufficient number of registers have been allocated */ 11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pParse->nMem < cnt+4 ){ 11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pParse->nMem = cnt+4; 11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Do the b-tree integrity checks */ 11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp3(v, OP_IntegrityCk, 2, cnt, 1); 11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeChangeP5(v, (u8)i); 11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) addr = sqlite3VdbeAddOp1(v, OP_IsNull, 2); 11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp4(v, OP_String8, 0, 3, 0, 11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3MPrintf(db, "*** in database %s ***\n", db->aDb[i].zName), 11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) P4_DYNAMIC); 11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp3(v, OP_Move, 2, 4, 1); 11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp3(v, OP_Concat, 4, 3, 2); 11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_ResultRow, 2, 1); 11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeJumpHere(v, addr); 11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Make sure all the indices are constructed correctly. 11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(x=sqliteHashFirst(pTbls); x && !isQuick; x=sqliteHashNext(x)){ 11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Table *pTab = sqliteHashData(x); 11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Index *pIdx; 11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int loopTop; 11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pTab->pIndex==0 ) continue; 11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) addr = sqlite3VdbeAddOp1(v, OP_IfPos, 1); /* Stop if out of errors */ 11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Halt, 0, 0); 11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeJumpHere(v, addr); 11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3OpenTableAndIndices(pParse, pTab, 1, OP_OpenRead); 11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Integer, 0, 2); /* reg(2) will count entries */ 11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) loopTop = sqlite3VdbeAddOp2(v, OP_Rewind, 1, 0); 11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_AddImm, 2, 1); /* increment entry count */ 11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(j=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, j++){ 11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int jmp2; 11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int r1; 11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const VdbeOpList idxErr[] = { 11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { OP_AddImm, 1, -1, 0}, 11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { OP_String8, 0, 3, 0}, /* 1 */ 11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { OP_Rowid, 1, 4, 0}, 11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { OP_String8, 0, 5, 0}, /* 3 */ 11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { OP_String8, 0, 6, 0}, /* 4 */ 11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { OP_Concat, 4, 3, 3}, 11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { OP_Concat, 5, 3, 3}, 11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { OP_Concat, 6, 3, 3}, 11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { OP_ResultRow, 3, 1, 0}, 11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { OP_IfPos, 1, 0, 0}, /* 9 */ 11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { OP_Halt, 0, 0, 0}, 11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r1 = sqlite3GenerateIndexKey(pParse, pIdx, 1, 3, 0); 11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) jmp2 = sqlite3VdbeAddOp4Int(v, OP_Found, j+2, 0, r1, pIdx->nColumn+1); 11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) addr = sqlite3VdbeAddOpList(v, ArraySize(idxErr), idxErr); 11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeChangeP4(v, addr+1, "rowid ", P4_STATIC); 11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeChangeP4(v, addr+3, " missing from index ", P4_STATIC); 11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeChangeP4(v, addr+4, pIdx->zName, P4_TRANSIENT); 11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeJumpHere(v, addr+9); 11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeJumpHere(v, jmp2); 11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Next, 1, loopTop+1); 11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeJumpHere(v, loopTop); 11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(j=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, j++){ 11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const VdbeOpList cntIdx[] = { 11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { OP_Integer, 0, 3, 0}, 11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { OP_Rewind, 0, 0, 0}, /* 1 */ 11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { OP_AddImm, 3, 1, 0}, 11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { OP_Next, 0, 0, 0}, /* 3 */ 11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { OP_Eq, 2, 0, 3}, /* 4 */ 11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { OP_AddImm, 1, -1, 0}, 11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { OP_String8, 0, 2, 0}, /* 6 */ 11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { OP_String8, 0, 3, 0}, /* 7 */ 11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { OP_Concat, 3, 2, 2}, 11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { OP_ResultRow, 2, 1, 0}, 11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) addr = sqlite3VdbeAddOp1(v, OP_IfPos, 1); 12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Halt, 0, 0); 12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeJumpHere(v, addr); 12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) addr = sqlite3VdbeAddOpList(v, ArraySize(cntIdx), cntIdx); 12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeChangeP1(v, addr+1, j+2); 12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeChangeP2(v, addr+1, addr+4); 12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeChangeP1(v, addr+3, j+2); 12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeChangeP2(v, addr+3, addr+2); 12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeJumpHere(v, addr+4); 12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeChangeP4(v, addr+6, 12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "wrong # of entries in index ", P4_STATIC); 12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeChangeP4(v, addr+7, pIdx->zName, P4_TRANSIENT); 12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) addr = sqlite3VdbeAddOpList(v, ArraySize(endCode), endCode); 12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeChangeP2(v, addr, -mxErr); 12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeJumpHere(v, addr+1); 12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeChangeP4(v, addr+2, "ok", P4_STATIC); 12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else 12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* SQLITE_OMIT_INTEGRITY_CHECK */ 12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_UTF16 12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** PRAGMA encoding 12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** PRAGMA encoding = "utf-8"|"utf-16"|"utf-16le"|"utf-16be" 12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** In its first form, this pragma returns the encoding of the main 12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** database. If the database is not initialized, it is initialized now. 12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** The second form of this pragma is a no-op if the main database file 12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** has not already been initialized. In this case it sets the default 12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** encoding that will be used for the main database file if a new file 12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** is created. If an existing main database file is opened, then the 12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** default text encoding for the existing database is used. 12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** In all cases new databases created using the ATTACH command are 12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** created to use the same default text encoding as the main database. If 12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** the main database has not been initialized and/or created when ATTACH 12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** is executed, this is done before the ATTACH operation. 12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** In the second form this pragma sets the text encoding to be used in 12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** new database files created using this database handle. It is only 12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** useful if invoked immediately after the main database i 12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3StrICmp(zLeft, "encoding")==0 ){ 12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const struct EncName { 12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *zName; 12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) u8 enc; 12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } encnames[] = { 12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "UTF8", SQLITE_UTF8 }, 12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "UTF-8", SQLITE_UTF8 }, /* Must be element [1] */ 12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "UTF-16le", SQLITE_UTF16LE }, /* Must be element [2] */ 12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "UTF-16be", SQLITE_UTF16BE }, /* Must be element [3] */ 12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "UTF16le", SQLITE_UTF16LE }, 12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "UTF16be", SQLITE_UTF16BE }, 12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "UTF-16", 0 }, /* SQLITE_UTF16NATIVE */ 12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "UTF16", 0 }, /* SQLITE_UTF16NATIVE */ 12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 0, 0 } 12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const struct EncName *pEnc; 12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( !zRight ){ /* "PRAGMA encoding" */ 12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3ReadSchema(pParse) ) goto pragma_out; 12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeSetNumCols(v, 1); 12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "encoding", SQLITE_STATIC); 12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_String8, 0, 1); 12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( encnames[SQLITE_UTF8].enc==SQLITE_UTF8 ); 12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( encnames[SQLITE_UTF16LE].enc==SQLITE_UTF16LE ); 12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( encnames[SQLITE_UTF16BE].enc==SQLITE_UTF16BE ); 12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeChangeP4(v, -1, encnames[ENC(pParse->db)].zName, P4_STATIC); 12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 1); 12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ /* "PRAGMA encoding = XXX" */ 12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Only change the value of sqlite.enc if the database handle is not 12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** initialized. If the main database exists, the new sqlite.enc value 12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** will be overwritten when the schema is next loaded. If it does not 12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** already exists, it will be created to use the new encoding value. 12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( 12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !(DbHasProperty(db, 0, DB_SchemaLoaded)) || 12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DbHasProperty(db, 0, DB_Empty) 12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ){ 12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(pEnc=&encnames[0]; pEnc->zName; pEnc++){ 12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( 0==sqlite3StrICmp(zRight, pEnc->zName) ){ 12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ENC(pParse->db) = pEnc->enc ? pEnc->enc : SQLITE_UTF16NATIVE; 12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( !pEnc->zName ){ 12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ErrorMsg(pParse, "unsupported encoding: %s", zRight); 12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else 12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* SQLITE_OMIT_UTF16 */ 12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS 12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** PRAGMA [database.]schema_version 12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** PRAGMA [database.]schema_version = <integer> 12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** PRAGMA [database.]user_version 13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** PRAGMA [database.]user_version = <integer> 13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** The pragma's schema_version and user_version are used to set or get 13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** the value of the schema-version and user-version, respectively. Both 13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** the schema-version and the user-version are 32-bit signed integers 13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** stored in the database header. 13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** The schema-cookie is usually only manipulated internally by SQLite. It 13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** is incremented by SQLite whenever the database schema is modified (by 13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** creating or dropping a table or index). The schema version is used by 13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** SQLite each time a query is executed to ensure that the internal cache 13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** of the schema used when compiling the SQL query matches the schema of 13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** the database against which the compiled query is actually executed. 13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** Subverting this mechanism by using "PRAGMA schema_version" to modify 13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** the schema-version is potentially dangerous and may lead to program 13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** crashes or database corruption. Use with caution! 13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** The user-version is not used internally by SQLite. It may be used by 13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** applications for any purpose. 13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3StrICmp(zLeft, "schema_version")==0 13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) || sqlite3StrICmp(zLeft, "user_version")==0 13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) || sqlite3StrICmp(zLeft, "freelist_count")==0 13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ){ 13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iCookie; /* Cookie index. 1 for schema-cookie, 6 for user-cookie. */ 13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeUsesBtree(v, iDb); 13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch( zLeft[0] ){ 13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case 'f': case 'F': 13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iCookie = BTREE_FREE_PAGE_COUNT; 13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case 's': case 'S': 13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iCookie = BTREE_SCHEMA_VERSION; 13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iCookie = BTREE_USER_VERSION; 13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( zRight && iCookie!=BTREE_FREE_PAGE_COUNT ){ 13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Write the specified cookie value */ 13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const VdbeOpList setCookie[] = { 13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { OP_Transaction, 0, 1, 0}, /* 0 */ 13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { OP_Integer, 0, 1, 0}, /* 1 */ 13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { OP_SetCookie, 0, 0, 1}, /* 2 */ 13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int addr = sqlite3VdbeAddOpList(v, ArraySize(setCookie), setCookie); 13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeChangeP1(v, addr, iDb); 13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeChangeP1(v, addr+1, sqlite3Atoi(zRight)); 13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeChangeP1(v, addr+2, iDb); 13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeChangeP2(v, addr+2, iCookie); 13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Read the specified cookie value */ 13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const VdbeOpList readCookie[] = { 13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { OP_Transaction, 0, 0, 0}, /* 0 */ 13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { OP_ReadCookie, 0, 1, 0}, /* 1 */ 13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { OP_ResultRow, 1, 1, 0} 13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int addr = sqlite3VdbeAddOpList(v, ArraySize(readCookie), readCookie); 13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeChangeP1(v, addr, iDb); 13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeChangeP1(v, addr+1, iDb); 13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeChangeP3(v, addr+1, iCookie); 13625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeSetNumCols(v, 1); 13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeSetColName(v, 0, COLNAME_NAME, zLeft, SQLITE_TRANSIENT); 13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else 13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS */ 13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_COMPILEOPTION_DIAGS 13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** PRAGMA compile_options 13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** Return the names of all compile-time options used in this build, 13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** one option per row. 13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3StrICmp(zLeft, "compile_options")==0 ){ 13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i = 0; 13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *zOpt; 13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeSetNumCols(v, 1); 13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pParse->nMem = 1; 13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "compile_option", SQLITE_STATIC); 13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while( (zOpt = sqlite3_compileoption_get(i++))!=0 ){ 13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp4(v, OP_String8, 0, 1, 0, zOpt, 0); 13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 1); 13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else 13865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* SQLITE_OMIT_COMPILEOPTION_DIAGS */ 13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_WAL 13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** PRAGMA [database.]wal_checkpoint = passive|full|restart 13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 13925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** Checkpoint the database. 13935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 13945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3StrICmp(zLeft, "wal_checkpoint")==0 ){ 13955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iBt = (pId2->z?iDb:SQLITE_MAX_ATTACHED); 13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int eMode = SQLITE_CHECKPOINT_PASSIVE; 13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( zRight ){ 13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3StrICmp(zRight, "full")==0 ){ 13995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) eMode = SQLITE_CHECKPOINT_FULL; 14005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else if( sqlite3StrICmp(zRight, "restart")==0 ){ 14015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) eMode = SQLITE_CHECKPOINT_RESTART; 14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3ReadSchema(pParse) ) goto pragma_out; 14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeSetNumCols(v, 3); 14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pParse->nMem = 3; 14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "busy", SQLITE_STATIC); 14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeSetColName(v, 1, COLNAME_NAME, "log", SQLITE_STATIC); 14095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeSetColName(v, 2, COLNAME_NAME, "checkpointed", SQLITE_STATIC); 14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp3(v, OP_Checkpoint, iBt, eMode, 1); 14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 3); 14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else 14145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** PRAGMA wal_autocheckpoint 14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** PRAGMA wal_autocheckpoint = N 14185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** Configure a database connection to automatically checkpoint a database 14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** after accumulating N frames in the log. Or query for the current value 14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** of N. 14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3StrICmp(zLeft, "wal_autocheckpoint")==0 ){ 14245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( zRight ){ 14255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_wal_autocheckpoint(db, sqlite3Atoi(zRight)); 14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) returnSingleInt(pParse, "wal_autocheckpoint", 14285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db->xWalCallback==sqlite3WalDefaultHook ? 14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SQLITE_PTR_TO_INT(db->pWalArg) : 0); 14305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else 14315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 14325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(SQLITE_DEBUG) || defined(SQLITE_TEST) 14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 14355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** Report the current state of file logs for all databases 14365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 14375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3StrICmp(zLeft, "lock_status")==0 ){ 14385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const char *const azLockName[] = { 14395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "unlocked", "shared", "reserved", "pending", "exclusive" 14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 14415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeSetNumCols(v, 2); 14435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pParse->nMem = 2; 14445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "database", SQLITE_STATIC); 14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeSetColName(v, 1, COLNAME_NAME, "status", SQLITE_STATIC); 14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0; i<db->nDb; i++){ 14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Btree *pBt; 14485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Pager *pPager; 14495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *zState = "unknown"; 14505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int j; 14515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( db->aDb[i].zName==0 ) continue; 14525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp4(v, OP_String8, 0, 1, 0, db->aDb[i].zName, P4_STATIC); 14535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pBt = db->aDb[i].pBt; 14545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pBt==0 || (pPager = sqlite3BtreePager(pBt))==0 ){ 14555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zState = "closed"; 14565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else if( sqlite3_file_control(db, i ? db->aDb[i].zName : 0, 14575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SQLITE_FCNTL_LOCKSTATE, &j)==SQLITE_OK ){ 14585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zState = azLockName[j]; 14595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp4(v, OP_String8, 0, 2, 0, zState, P4_STATIC); 14615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 2); 14625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else 14655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 14665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SQLITE_HAS_CODEC 14685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3StrICmp(zLeft, "key")==0 && zRight ){ 14695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_key(db, zRight, sqlite3Strlen30(zRight)); 14705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else 14715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3StrICmp(zLeft, "rekey")==0 && zRight ){ 14725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_rekey(db, zRight, sqlite3Strlen30(zRight)); 14735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else 14745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( zRight && (sqlite3StrICmp(zLeft, "hexkey")==0 || 14755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3StrICmp(zLeft, "hexrekey")==0) ){ 14765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i, h1, h2; 14775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char zKey[40]; 14785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0; (h1 = zRight[i])!=0 && (h2 = zRight[i+1])!=0; i+=2){ 14795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) h1 += 9*(1&(h1>>6)); 14805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) h2 += 9*(1&(h2>>6)); 14815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zKey[i/2] = (h2 & 0x0f) | ((h1 & 0xf)<<4); 14825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( (zLeft[3] & 0xf)==0xb ){ 14845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_key(db, zKey, i/2); 14855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 14865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_rekey(db, zKey, i/2); 14875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else 14895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 14905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(SQLITE_HAS_CODEC) || defined(SQLITE_ENABLE_CEROD) 14915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3StrICmp(zLeft, "activate_extensions")==0 ){ 14925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SQLITE_HAS_CODEC 14935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3StrNICmp(zRight, "see-", 4)==0 ){ 14945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_activate_see(&zRight[4]); 14955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 14975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SQLITE_ENABLE_CEROD 14985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3StrNICmp(zRight, "cerod-", 6)==0 ){ 14995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_activate_cerod(&zRight[6]); 15005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 15025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else 15035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 15045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {/* Empty ELSE clause */} 15075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 15095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** Reset the safety level, in case the fullfsync flag or synchronous 15105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** setting changed. 15115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 15125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_PAGER_PRAGMAS 15135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( db->autoCommit ){ 15145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3BtreeSetSafetyLevel(pDb->pBt, pDb->safety_level, 15155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (db->flags&SQLITE_FullFSync)!=0, 15165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (db->flags&SQLITE_CkptFullFSync)!=0); 15175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 15195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)pragma_out: 15205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3DbFree(db, zLeft); 15215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3DbFree(db, zRight); 15225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* SQLITE_OMIT_PRAGMA */ 1525