| OLD | NEW |
| 1 /* | 1 /* |
| 2 ** 2003 April 6 | 2 ** 2003 April 6 |
| 3 ** | 3 ** |
| 4 ** The author disclaims copyright to this source code. In place of | 4 ** The author disclaims copyright to this source code. In place of |
| 5 ** a legal notice, here is a blessing: | 5 ** a legal notice, here is a blessing: |
| 6 ** | 6 ** |
| 7 ** May you do good and not evil. | 7 ** May you do good and not evil. |
| 8 ** May you find forgiveness for yourself and forgive others. | 8 ** May you find forgiveness for yourself and forgive others. |
| 9 ** May you share freely, never taking more than you give. | 9 ** May you share freely, never taking more than you give. |
| 10 ** | 10 ** |
| 11 ************************************************************************* | 11 ************************************************************************* |
| 12 ** This file contains code used to implement the PRAGMA command. | 12 ** This file contains code used to implement the PRAGMA command. |
| 13 ** | |
| 14 ** $Id: pragma.c,v 1.214 2009/07/02 07:47:33 danielk1977 Exp $ | |
| 15 */ | 13 */ |
| 16 #include "sqliteInt.h" | 14 #include "sqliteInt.h" |
| 17 | 15 |
| 18 /* Ignore this whole file if pragmas are disabled | 16 /* Ignore this whole file if pragmas are disabled |
| 19 */ | 17 */ |
| 20 #if !defined(SQLITE_OMIT_PRAGMA) | 18 #if !defined(SQLITE_OMIT_PRAGMA) |
| 21 | 19 |
| 22 /* | 20 /* |
| 23 ** Interpret the given string as a safety level. Return 0 for OFF, | 21 ** Interpret the given string as a safety level. Return 0 for OFF, |
| 24 ** 1 for ON or NORMAL and 2 for FULL. Return 1 for an empty or | 22 ** 1 for ON or NORMAL and 2 for FULL. Return 1 for an empty or |
| 25 ** unrecognized string argument. | 23 ** unrecognized string argument. |
| 26 ** | 24 ** |
| 27 ** Note that the values returned are one less that the values that | 25 ** Note that the values returned are one less that the values that |
| 28 ** should be passed into sqlite3BtreeSetSafetyLevel(). The is done | 26 ** should be passed into sqlite3BtreeSetSafetyLevel(). The is done |
| 29 ** to support legacy SQL code. The safety level used to be boolean | 27 ** to support legacy SQL code. The safety level used to be boolean |
| 30 ** and older scripts may have used numbers 0 for OFF and 1 for ON. | 28 ** and older scripts may have used numbers 0 for OFF and 1 for ON. |
| 31 */ | 29 */ |
| 32 static u8 getSafetyLevel(const char *z){ | 30 static u8 getSafetyLevel(const char *z){ |
| 33 /* 123456789 123456789 */ | 31 /* 123456789 123456789 */ |
| 34 static const char zText[] = "onoffalseyestruefull"; | 32 static const char zText[] = "onoffalseyestruefull"; |
| 35 static const u8 iOffset[] = {0, 1, 2, 4, 9, 12, 16}; | 33 static const u8 iOffset[] = {0, 1, 2, 4, 9, 12, 16}; |
| 36 static const u8 iLength[] = {2, 2, 3, 5, 3, 4, 4}; | 34 static const u8 iLength[] = {2, 2, 3, 5, 3, 4, 4}; |
| 37 static const u8 iValue[] = {1, 0, 0, 0, 1, 1, 2}; | 35 static const u8 iValue[] = {1, 0, 0, 0, 1, 1, 2}; |
| 38 int i, n; | 36 int i, n; |
| 39 if( sqlite3Isdigit(*z) ){ | 37 if( sqlite3Isdigit(*z) ){ |
| 40 return (u8)atoi(z); | 38 return (u8)sqlite3Atoi(z); |
| 41 } | 39 } |
| 42 n = sqlite3Strlen30(z); | 40 n = sqlite3Strlen30(z); |
| 43 for(i=0; i<ArraySize(iLength); i++){ | 41 for(i=0; i<ArraySize(iLength); i++){ |
| 44 if( iLength[i]==n && sqlite3StrNICmp(&zText[iOffset[i]],z,n)==0 ){ | 42 if( iLength[i]==n && sqlite3StrNICmp(&zText[iOffset[i]],z,n)==0 ){ |
| 45 return iValue[i]; | 43 return iValue[i]; |
| 46 } | 44 } |
| 47 } | 45 } |
| 48 return 1; | 46 return 1; |
| 49 } | 47 } |
| 50 | 48 |
| (...skipping 20 matching lines...) Expand all Loading... |
| 71 ** Interpret the given string as an auto-vacuum mode value. | 69 ** Interpret the given string as an auto-vacuum mode value. |
| 72 ** | 70 ** |
| 73 ** The following strings, "none", "full" and "incremental" are | 71 ** The following strings, "none", "full" and "incremental" are |
| 74 ** acceptable, as are their numeric equivalents: 0, 1 and 2 respectively. | 72 ** acceptable, as are their numeric equivalents: 0, 1 and 2 respectively. |
| 75 */ | 73 */ |
| 76 static int getAutoVacuum(const char *z){ | 74 static int getAutoVacuum(const char *z){ |
| 77 int i; | 75 int i; |
| 78 if( 0==sqlite3StrICmp(z, "none") ) return BTREE_AUTOVACUUM_NONE; | 76 if( 0==sqlite3StrICmp(z, "none") ) return BTREE_AUTOVACUUM_NONE; |
| 79 if( 0==sqlite3StrICmp(z, "full") ) return BTREE_AUTOVACUUM_FULL; | 77 if( 0==sqlite3StrICmp(z, "full") ) return BTREE_AUTOVACUUM_FULL; |
| 80 if( 0==sqlite3StrICmp(z, "incremental") ) return BTREE_AUTOVACUUM_INCR; | 78 if( 0==sqlite3StrICmp(z, "incremental") ) return BTREE_AUTOVACUUM_INCR; |
| 81 i = atoi(z); | 79 i = sqlite3Atoi(z); |
| 82 return (u8)((i>=0&&i<=2)?i:0); | 80 return (u8)((i>=0&&i<=2)?i:0); |
| 83 } | 81 } |
| 84 #endif /* ifndef SQLITE_OMIT_AUTOVACUUM */ | 82 #endif /* ifndef SQLITE_OMIT_AUTOVACUUM */ |
| 85 | 83 |
| 86 #ifndef SQLITE_OMIT_PAGER_PRAGMAS | 84 #ifndef SQLITE_OMIT_PAGER_PRAGMAS |
| 87 /* | 85 /* |
| 88 ** Interpret the given string as a temp db location. Return 1 for file | 86 ** Interpret the given string as a temp db location. Return 1 for file |
| 89 ** backed temporary databases, 2 for the Red-Black tree in memory database | 87 ** backed temporary databases, 2 for the Red-Black tree in memory database |
| 90 ** and 0 to use the compile-time default. | 88 ** and 0 to use the compile-time default. |
| 91 */ | 89 */ |
| (...skipping 18 matching lines...) Expand all Loading... |
| 110 static int invalidateTempStorage(Parse *pParse){ | 108 static int invalidateTempStorage(Parse *pParse){ |
| 111 sqlite3 *db = pParse->db; | 109 sqlite3 *db = pParse->db; |
| 112 if( db->aDb[1].pBt!=0 ){ | 110 if( db->aDb[1].pBt!=0 ){ |
| 113 if( !db->autoCommit || sqlite3BtreeIsInReadTrans(db->aDb[1].pBt) ){ | 111 if( !db->autoCommit || sqlite3BtreeIsInReadTrans(db->aDb[1].pBt) ){ |
| 114 sqlite3ErrorMsg(pParse, "temporary storage cannot be changed " | 112 sqlite3ErrorMsg(pParse, "temporary storage cannot be changed " |
| 115 "from within a transaction"); | 113 "from within a transaction"); |
| 116 return SQLITE_ERROR; | 114 return SQLITE_ERROR; |
| 117 } | 115 } |
| 118 sqlite3BtreeClose(db->aDb[1].pBt); | 116 sqlite3BtreeClose(db->aDb[1].pBt); |
| 119 db->aDb[1].pBt = 0; | 117 db->aDb[1].pBt = 0; |
| 120 sqlite3ResetInternalSchema(db, 0); | 118 sqlite3ResetInternalSchema(db, -1); |
| 121 } | 119 } |
| 122 return SQLITE_OK; | 120 return SQLITE_OK; |
| 123 } | 121 } |
| 124 #endif /* SQLITE_PAGER_PRAGMAS */ | 122 #endif /* SQLITE_PAGER_PRAGMAS */ |
| 125 | 123 |
| 126 #ifndef SQLITE_OMIT_PAGER_PRAGMAS | 124 #ifndef SQLITE_OMIT_PAGER_PRAGMAS |
| 127 /* | 125 /* |
| 128 ** If the TEMP database is open, close it and mark the database schema | 126 ** If the TEMP database is open, close it and mark the database schema |
| 129 ** as needing reloading. This must be done when using the SQLITE_TEMP_STORE | 127 ** as needing reloading. This must be done when using the SQLITE_TEMP_STORE |
| 130 ** or DEFAULT_TEMP_STORE pragmas. | 128 ** or DEFAULT_TEMP_STORE pragmas. |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 167 static const struct sPragmaType { | 165 static const struct sPragmaType { |
| 168 const char *zName; /* Name of the pragma */ | 166 const char *zName; /* Name of the pragma */ |
| 169 int mask; /* Mask for the db->flags value */ | 167 int mask; /* Mask for the db->flags value */ |
| 170 } aPragma[] = { | 168 } aPragma[] = { |
| 171 { "full_column_names", SQLITE_FullColNames }, | 169 { "full_column_names", SQLITE_FullColNames }, |
| 172 { "short_column_names", SQLITE_ShortColNames }, | 170 { "short_column_names", SQLITE_ShortColNames }, |
| 173 { "count_changes", SQLITE_CountRows }, | 171 { "count_changes", SQLITE_CountRows }, |
| 174 { "empty_result_callbacks", SQLITE_NullCallback }, | 172 { "empty_result_callbacks", SQLITE_NullCallback }, |
| 175 { "legacy_file_format", SQLITE_LegacyFileFmt }, | 173 { "legacy_file_format", SQLITE_LegacyFileFmt }, |
| 176 { "fullfsync", SQLITE_FullFSync }, | 174 { "fullfsync", SQLITE_FullFSync }, |
| 175 { "checkpoint_fullfsync", SQLITE_CkptFullFSync }, |
| 177 { "reverse_unordered_selects", SQLITE_ReverseOrder }, | 176 { "reverse_unordered_selects", SQLITE_ReverseOrder }, |
| 177 #ifndef SQLITE_OMIT_AUTOMATIC_INDEX |
| 178 { "automatic_index", SQLITE_AutoIndex }, |
| 179 #endif |
| 178 #ifdef SQLITE_DEBUG | 180 #ifdef SQLITE_DEBUG |
| 179 { "sql_trace", SQLITE_SqlTrace }, | 181 { "sql_trace", SQLITE_SqlTrace }, |
| 180 { "vdbe_listing", SQLITE_VdbeListing }, | 182 { "vdbe_listing", SQLITE_VdbeListing }, |
| 181 { "vdbe_trace", SQLITE_VdbeTrace }, | 183 { "vdbe_trace", SQLITE_VdbeTrace }, |
| 182 #endif | 184 #endif |
| 183 #ifndef SQLITE_OMIT_CHECK | 185 #ifndef SQLITE_OMIT_CHECK |
| 184 { "ignore_check_constraints", SQLITE_IgnoreChecks }, | 186 { "ignore_check_constraints", SQLITE_IgnoreChecks }, |
| 185 #endif | 187 #endif |
| 186 /* The following is VERY experimental */ | 188 /* The following is VERY experimental */ |
| 187 { "writable_schema", SQLITE_WriteSchema|SQLITE_RecoveryMode }, | 189 { "writable_schema", SQLITE_WriteSchema|SQLITE_RecoveryMode }, |
| 188 { "omit_readlock", SQLITE_NoReadlock }, | 190 { "omit_readlock", SQLITE_NoReadlock }, |
| 189 | 191 |
| 190 /* TODO: Maybe it shouldn't be possible to change the ReadUncommitted | 192 /* TODO: Maybe it shouldn't be possible to change the ReadUncommitted |
| 191 ** flag if there are any active statements. */ | 193 ** flag if there are any active statements. */ |
| 192 { "read_uncommitted", SQLITE_ReadUncommitted }, | 194 { "read_uncommitted", SQLITE_ReadUncommitted }, |
| 193 { "recursive_triggers", SQLITE_RecTriggers }, | 195 { "recursive_triggers", SQLITE_RecTriggers }, |
| 196 |
| 197 /* This flag may only be set if both foreign-key and trigger support |
| 198 ** are present in the build. */ |
| 199 #if !defined(SQLITE_OMIT_FOREIGN_KEY) && !defined(SQLITE_OMIT_TRIGGER) |
| 200 { "foreign_keys", SQLITE_ForeignKeys }, |
| 201 #endif |
| 194 }; | 202 }; |
| 195 int i; | 203 int i; |
| 196 const struct sPragmaType *p; | 204 const struct sPragmaType *p; |
| 197 for(i=0, p=aPragma; i<ArraySize(aPragma); i++, p++){ | 205 for(i=0, p=aPragma; i<ArraySize(aPragma); i++, p++){ |
| 198 if( sqlite3StrICmp(zLeft, p->zName)==0 ){ | 206 if( sqlite3StrICmp(zLeft, p->zName)==0 ){ |
| 199 sqlite3 *db = pParse->db; | 207 sqlite3 *db = pParse->db; |
| 200 Vdbe *v; | 208 Vdbe *v; |
| 201 v = sqlite3GetVdbe(pParse); | 209 v = sqlite3GetVdbe(pParse); |
| 202 assert( v!=0 ); /* Already allocated by sqlite3Pragma() */ | 210 assert( v!=0 ); /* Already allocated by sqlite3Pragma() */ |
| 203 if( ALWAYS(v) ){ | 211 if( ALWAYS(v) ){ |
| 204 if( zRight==0 ){ | 212 if( zRight==0 ){ |
| 205 returnSingleInt(pParse, p->zName, (db->flags & p->mask)!=0 ); | 213 returnSingleInt(pParse, p->zName, (db->flags & p->mask)!=0 ); |
| 206 }else{ | 214 }else{ |
| 215 int mask = p->mask; /* Mask of bits to set or clear. */ |
| 216 if( db->autoCommit==0 ){ |
| 217 /* Foreign key support may not be enabled or disabled while not |
| 218 ** in auto-commit mode. */ |
| 219 mask &= ~(SQLITE_ForeignKeys); |
| 220 } |
| 221 |
| 207 if( getBoolean(zRight) ){ | 222 if( getBoolean(zRight) ){ |
| 208 db->flags |= p->mask; | 223 db->flags |= mask; |
| 209 }else{ | 224 }else{ |
| 210 db->flags &= ~p->mask; | 225 db->flags &= ~mask; |
| 211 } | 226 } |
| 212 | 227 |
| 213 /* Many of the flag-pragmas modify the code generated by the SQL | 228 /* Many of the flag-pragmas modify the code generated by the SQL |
| 214 ** compiler (eg. count_changes). So add an opcode to expire all | 229 ** compiler (eg. count_changes). So add an opcode to expire all |
| 215 ** compiled SQL statements after modifying a pragma value. | 230 ** compiled SQL statements after modifying a pragma value. |
| 216 */ | 231 */ |
| 217 sqlite3VdbeAddOp2(v, OP_Expire, 0, 0); | 232 sqlite3VdbeAddOp2(v, OP_Expire, 0, 0); |
| 218 } | 233 } |
| 219 } | 234 } |
| 220 | 235 |
| 221 return 1; | 236 return 1; |
| 222 } | 237 } |
| 223 } | 238 } |
| 224 return 0; | 239 return 0; |
| 225 } | 240 } |
| 226 #endif /* SQLITE_OMIT_FLAG_PRAGMAS */ | 241 #endif /* SQLITE_OMIT_FLAG_PRAGMAS */ |
| 227 | 242 |
| 228 /* | 243 /* |
| 229 ** Return a human-readable name for a constraint resolution action. | 244 ** Return a human-readable name for a constraint resolution action. |
| 230 */ | 245 */ |
| 246 #ifndef SQLITE_OMIT_FOREIGN_KEY |
| 231 static const char *actionName(u8 action){ | 247 static const char *actionName(u8 action){ |
| 232 const char *zName; | 248 const char *zName; |
| 233 switch( action ){ | 249 switch( action ){ |
| 234 case OE_SetNull: zName = "SET NULL"; break; | 250 case OE_SetNull: zName = "SET NULL"; break; |
| 235 case OE_SetDflt: zName = "SET DEFAULT"; break; | 251 case OE_SetDflt: zName = "SET DEFAULT"; break; |
| 236 case OE_Cascade: zName = "CASCADE"; break; | 252 case OE_Cascade: zName = "CASCADE"; break; |
| 237 default: zName = "RESTRICT"; | 253 case OE_Restrict: zName = "RESTRICT"; break; |
| 238 assert( action==OE_Restrict ); break; | 254 default: zName = "NO ACTION"; |
| 255 assert( action==OE_None ); break; |
| 239 } | 256 } |
| 240 return zName; | 257 return zName; |
| 241 } | 258 } |
| 259 #endif |
| 260 |
| 261 |
| 262 /* |
| 263 ** Parameter eMode must be one of the PAGER_JOURNALMODE_XXX constants |
| 264 ** defined in pager.h. This function returns the associated lowercase |
| 265 ** journal-mode name. |
| 266 */ |
| 267 const char *sqlite3JournalModename(int eMode){ |
| 268 static char * const azModeName[] = { |
| 269 "delete", "persist", "off", "truncate", "memory" |
| 270 #ifndef SQLITE_OMIT_WAL |
| 271 , "wal" |
| 272 #endif |
| 273 }; |
| 274 assert( PAGER_JOURNALMODE_DELETE==0 ); |
| 275 assert( PAGER_JOURNALMODE_PERSIST==1 ); |
| 276 assert( PAGER_JOURNALMODE_OFF==2 ); |
| 277 assert( PAGER_JOURNALMODE_TRUNCATE==3 ); |
| 278 assert( PAGER_JOURNALMODE_MEMORY==4 ); |
| 279 assert( PAGER_JOURNALMODE_WAL==5 ); |
| 280 assert( eMode>=0 && eMode<=ArraySize(azModeName) ); |
| 281 |
| 282 if( eMode==ArraySize(azModeName) ) return 0; |
| 283 return azModeName[eMode]; |
| 284 } |
| 242 | 285 |
| 243 /* | 286 /* |
| 244 ** Process a pragma statement. | 287 ** Process a pragma statement. |
| 245 ** | 288 ** |
| 246 ** Pragmas are of this form: | 289 ** Pragmas are of this form: |
| 247 ** | 290 ** |
| 248 ** PRAGMA [database.]id [= value] | 291 ** PRAGMA [database.]id [= value] |
| 249 ** | 292 ** |
| 250 ** The identifier might also be a string. The value is a string, and | 293 ** The identifier might also be a string. The value is a string, and |
| 251 ** identifier, or a number. If minusFlag is true, then the value is | 294 ** identifier, or a number. If minusFlag is true, then the value is |
| (...skipping 12 matching lines...) Expand all Loading... |
| 264 ){ | 307 ){ |
| 265 char *zLeft = 0; /* Nul-terminated UTF-8 string <id> */ | 308 char *zLeft = 0; /* Nul-terminated UTF-8 string <id> */ |
| 266 char *zRight = 0; /* Nul-terminated UTF-8 string <value>, or NULL */ | 309 char *zRight = 0; /* Nul-terminated UTF-8 string <value>, or NULL */ |
| 267 const char *zDb = 0; /* The database name */ | 310 const char *zDb = 0; /* The database name */ |
| 268 Token *pId; /* Pointer to <id> token */ | 311 Token *pId; /* Pointer to <id> token */ |
| 269 int iDb; /* Database index for <database> */ | 312 int iDb; /* Database index for <database> */ |
| 270 sqlite3 *db = pParse->db; | 313 sqlite3 *db = pParse->db; |
| 271 Db *pDb; | 314 Db *pDb; |
| 272 Vdbe *v = pParse->pVdbe = sqlite3VdbeCreate(db); | 315 Vdbe *v = pParse->pVdbe = sqlite3VdbeCreate(db); |
| 273 if( v==0 ) return; | 316 if( v==0 ) return; |
| 317 sqlite3VdbeRunOnlyOnce(v); |
| 274 pParse->nMem = 2; | 318 pParse->nMem = 2; |
| 275 | 319 |
| 276 /* Interpret the [database.] part of the pragma statement. iDb is the | 320 /* Interpret the [database.] part of the pragma statement. iDb is the |
| 277 ** index of the database this pragma is being applied to in db.aDb[]. */ | 321 ** index of the database this pragma is being applied to in db.aDb[]. */ |
| 278 iDb = sqlite3TwoPartName(pParse, pId1, pId2, &pId); | 322 iDb = sqlite3TwoPartName(pParse, pId1, pId2, &pId); |
| 279 if( iDb<0 ) return; | 323 if( iDb<0 ) return; |
| 280 pDb = &db->aDb[iDb]; | 324 pDb = &db->aDb[iDb]; |
| 281 | 325 |
| 282 /* If the temp database has been explicitly named as part of the | 326 /* If the temp database has been explicitly named as part of the |
| 283 ** pragma, make sure it is open. | 327 ** pragma, make sure it is open. |
| (...skipping 20 matching lines...) Expand all Loading... |
| 304 /* | 348 /* |
| 305 ** PRAGMA [database.]default_cache_size | 349 ** PRAGMA [database.]default_cache_size |
| 306 ** PRAGMA [database.]default_cache_size=N | 350 ** PRAGMA [database.]default_cache_size=N |
| 307 ** | 351 ** |
| 308 ** The first form reports the current persistent setting for the | 352 ** The first form reports the current persistent setting for the |
| 309 ** page cache size. The value returned is the maximum number of | 353 ** page cache size. The value returned is the maximum number of |
| 310 ** pages in the page cache. The second form sets both the current | 354 ** pages in the page cache. The second form sets both the current |
| 311 ** page cache size value and the persistent page cache size value | 355 ** page cache size value and the persistent page cache size value |
| 312 ** stored in the database file. | 356 ** stored in the database file. |
| 313 ** | 357 ** |
| 314 ** The default cache size is stored in meta-value 2 of page 1 of the | 358 ** Older versions of SQLite would set the default cache size to a |
| 315 ** database file. The cache size is actually the absolute value of | 359 ** negative number to indicate synchronous=OFF. These days, synchronous |
| 316 ** this memory location. The sign of meta-value 2 determines the | 360 ** is always on by default regardless of the sign of the default cache |
| 317 ** synchronous setting. A negative value means synchronous is off | 361 ** size. But continue to take the absolute value of the default cache |
| 318 ** and a positive value means synchronous is on. | 362 ** size of historical compatibility. |
| 319 */ | 363 */ |
| 320 if( sqlite3StrICmp(zLeft,"default_cache_size")==0 ){ | 364 if( sqlite3StrICmp(zLeft,"default_cache_size")==0 ){ |
| 321 static const VdbeOpList getCacheSize[] = { | 365 static const VdbeOpList getCacheSize[] = { |
| 322 { OP_Transaction, 0, 0, 0}, /* 0 */ | 366 { OP_Transaction, 0, 0, 0}, /* 0 */ |
| 323 { OP_ReadCookie, 0, 1, BTREE_DEFAULT_CACHE_SIZE}, /* 1 */ | 367 { OP_ReadCookie, 0, 1, BTREE_DEFAULT_CACHE_SIZE}, /* 1 */ |
| 324 { OP_IfPos, 1, 7, 0}, | 368 { OP_IfPos, 1, 7, 0}, |
| 325 { OP_Integer, 0, 2, 0}, | 369 { OP_Integer, 0, 2, 0}, |
| 326 { OP_Subtract, 1, 2, 1}, | 370 { OP_Subtract, 1, 2, 1}, |
| 327 { OP_IfPos, 1, 7, 0}, | 371 { OP_IfPos, 1, 7, 0}, |
| 328 { OP_Integer, 0, 1, 0}, /* 6 */ | 372 { OP_Integer, 0, 1, 0}, /* 6 */ |
| 329 { OP_ResultRow, 1, 1, 0}, | 373 { OP_ResultRow, 1, 1, 0}, |
| 330 }; | 374 }; |
| 331 int addr; | 375 int addr; |
| 332 if( sqlite3ReadSchema(pParse) ) goto pragma_out; | 376 if( sqlite3ReadSchema(pParse) ) goto pragma_out; |
| 333 sqlite3VdbeUsesBtree(v, iDb); | 377 sqlite3VdbeUsesBtree(v, iDb); |
| 334 if( !zRight ){ | 378 if( !zRight ){ |
| 335 sqlite3VdbeSetNumCols(v, 1); | 379 sqlite3VdbeSetNumCols(v, 1); |
| 336 sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "cache_size", SQLITE_STATIC); | 380 sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "cache_size", SQLITE_STATIC); |
| 337 pParse->nMem += 2; | 381 pParse->nMem += 2; |
| 338 addr = sqlite3VdbeAddOpList(v, ArraySize(getCacheSize), getCacheSize); | 382 addr = sqlite3VdbeAddOpList(v, ArraySize(getCacheSize), getCacheSize); |
| 339 sqlite3VdbeChangeP1(v, addr, iDb); | 383 sqlite3VdbeChangeP1(v, addr, iDb); |
| 340 sqlite3VdbeChangeP1(v, addr+1, iDb); | 384 sqlite3VdbeChangeP1(v, addr+1, iDb); |
| 341 sqlite3VdbeChangeP1(v, addr+6, SQLITE_DEFAULT_CACHE_SIZE); | 385 sqlite3VdbeChangeP1(v, addr+6, SQLITE_DEFAULT_CACHE_SIZE); |
| 342 }else{ | 386 }else{ |
| 343 int size = atoi(zRight); | 387 int size = sqlite3AbsInt32(sqlite3Atoi(zRight)); |
| 344 if( size<0 ) size = -size; | |
| 345 sqlite3BeginWriteOperation(pParse, 0, iDb); | 388 sqlite3BeginWriteOperation(pParse, 0, iDb); |
| 346 sqlite3VdbeAddOp2(v, OP_Integer, size, 1); | 389 sqlite3VdbeAddOp2(v, OP_Integer, size, 1); |
| 347 sqlite3VdbeAddOp3(v, OP_ReadCookie, iDb, 2, BTREE_DEFAULT_CACHE_SIZE); | |
| 348 addr = sqlite3VdbeAddOp2(v, OP_IfPos, 2, 0); | |
| 349 sqlite3VdbeAddOp2(v, OP_Integer, -size, 1); | |
| 350 sqlite3VdbeJumpHere(v, addr); | |
| 351 sqlite3VdbeAddOp3(v, OP_SetCookie, iDb, BTREE_DEFAULT_CACHE_SIZE, 1); | 390 sqlite3VdbeAddOp3(v, OP_SetCookie, iDb, BTREE_DEFAULT_CACHE_SIZE, 1); |
| 391 assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); |
| 352 pDb->pSchema->cache_size = size; | 392 pDb->pSchema->cache_size = size; |
| 353 sqlite3BtreeSetCacheSize(pDb->pBt, pDb->pSchema->cache_size); | 393 sqlite3BtreeSetCacheSize(pDb->pBt, pDb->pSchema->cache_size); |
| 354 } | 394 } |
| 355 }else | 395 }else |
| 356 | 396 |
| 357 /* | 397 /* |
| 358 ** PRAGMA [database.]page_size | 398 ** PRAGMA [database.]page_size |
| 359 ** PRAGMA [database.]page_size=N | 399 ** PRAGMA [database.]page_size=N |
| 360 ** | 400 ** |
| 361 ** The first form reports the current setting for the | 401 ** The first form reports the current setting for the |
| 362 ** database page size in bytes. The second form sets the | 402 ** database page size in bytes. The second form sets the |
| 363 ** database page size value. The value can only be set if | 403 ** database page size value. The value can only be set if |
| 364 ** the database has not yet been created. | 404 ** the database has not yet been created. |
| 365 */ | 405 */ |
| 366 if( sqlite3StrICmp(zLeft,"page_size")==0 ){ | 406 if( sqlite3StrICmp(zLeft,"page_size")==0 ){ |
| 367 Btree *pBt = pDb->pBt; | 407 Btree *pBt = pDb->pBt; |
| 368 assert( pBt!=0 ); | 408 assert( pBt!=0 ); |
| 369 if( !zRight ){ | 409 if( !zRight ){ |
| 370 int size = ALWAYS(pBt) ? sqlite3BtreeGetPageSize(pBt) : 0; | 410 int size = ALWAYS(pBt) ? sqlite3BtreeGetPageSize(pBt) : 0; |
| 371 returnSingleInt(pParse, "page_size", size); | 411 returnSingleInt(pParse, "page_size", size); |
| 372 }else{ | 412 }else{ |
| 373 /* Malloc may fail when setting the page-size, as there is an internal | 413 /* Malloc may fail when setting the page-size, as there is an internal |
| 374 ** buffer that the pager module resizes using sqlite3_realloc(). | 414 ** buffer that the pager module resizes using sqlite3_realloc(). |
| 375 */ | 415 */ |
| 376 db->nextPagesize = atoi(zRight); | 416 db->nextPagesize = sqlite3Atoi(zRight); |
| 377 if( SQLITE_NOMEM==sqlite3BtreeSetPageSize(pBt, db->nextPagesize, -1, 0) ){ | 417 if( SQLITE_NOMEM==sqlite3BtreeSetPageSize(pBt, db->nextPagesize, -1, 0) ){ |
| 378 db->mallocFailed = 1; | 418 db->mallocFailed = 1; |
| 379 } | 419 } |
| 380 } | 420 } |
| 381 }else | 421 }else |
| 382 | 422 |
| 383 /* | 423 /* |
| 424 ** PRAGMA [database.]secure_delete |
| 425 ** PRAGMA [database.]secure_delete=ON/OFF |
| 426 ** |
| 427 ** The first form reports the current setting for the |
| 428 ** secure_delete flag. The second form changes the secure_delete |
| 429 ** flag setting and reports thenew value. |
| 430 */ |
| 431 if( sqlite3StrICmp(zLeft,"secure_delete")==0 ){ |
| 432 Btree *pBt = pDb->pBt; |
| 433 int b = -1; |
| 434 assert( pBt!=0 ); |
| 435 if( zRight ){ |
| 436 b = getBoolean(zRight); |
| 437 } |
| 438 if( pId2->n==0 && b>=0 ){ |
| 439 int ii; |
| 440 for(ii=0; ii<db->nDb; ii++){ |
| 441 sqlite3BtreeSecureDelete(db->aDb[ii].pBt, b); |
| 442 } |
| 443 } |
| 444 b = sqlite3BtreeSecureDelete(pBt, b); |
| 445 returnSingleInt(pParse, "secure_delete", b); |
| 446 }else |
| 447 |
| 448 /* |
| 384 ** PRAGMA [database.]max_page_count | 449 ** PRAGMA [database.]max_page_count |
| 385 ** PRAGMA [database.]max_page_count=N | 450 ** PRAGMA [database.]max_page_count=N |
| 386 ** | 451 ** |
| 387 ** The first form reports the current setting for the | 452 ** The first form reports the current setting for the |
| 388 ** maximum number of pages in the database file. The | 453 ** maximum number of pages in the database file. The |
| 389 ** second form attempts to change this setting. Both | 454 ** second form attempts to change this setting. Both |
| 390 ** forms return the current setting. | 455 ** forms return the current setting. |
| 391 */ | 456 ** |
| 392 if( sqlite3StrICmp(zLeft,"max_page_count")==0 ){ | |
| 393 Btree *pBt = pDb->pBt; | |
| 394 int newMax = 0; | |
| 395 assert( pBt!=0 ); | |
| 396 if( zRight ){ | |
| 397 newMax = atoi(zRight); | |
| 398 } | |
| 399 if( ALWAYS(pBt) ){ | |
| 400 newMax = sqlite3BtreeMaxPageCount(pBt, newMax); | |
| 401 } | |
| 402 returnSingleInt(pParse, "max_page_count", newMax); | |
| 403 }else | |
| 404 | |
| 405 /* | |
| 406 ** PRAGMA [database.]page_count | 457 ** PRAGMA [database.]page_count |
| 407 ** | 458 ** |
| 408 ** Return the number of pages in the specified database. | 459 ** Return the number of pages in the specified database. |
| 409 */ | 460 */ |
| 410 if( sqlite3StrICmp(zLeft,"page_count")==0 ){ | 461 if( sqlite3StrICmp(zLeft,"page_count")==0 |
| 462 || sqlite3StrICmp(zLeft,"max_page_count")==0 |
| 463 ){ |
| 411 int iReg; | 464 int iReg; |
| 412 if( sqlite3ReadSchema(pParse) ) goto pragma_out; | 465 if( sqlite3ReadSchema(pParse) ) goto pragma_out; |
| 413 sqlite3CodeVerifySchema(pParse, iDb); | 466 sqlite3CodeVerifySchema(pParse, iDb); |
| 414 iReg = ++pParse->nMem; | 467 iReg = ++pParse->nMem; |
| 415 sqlite3VdbeAddOp2(v, OP_Pagecount, iDb, iReg); | 468 if( zLeft[0]=='p' ){ |
| 469 sqlite3VdbeAddOp2(v, OP_Pagecount, iDb, iReg); |
| 470 }else{ |
| 471 sqlite3VdbeAddOp3(v, OP_MaxPgcnt, iDb, iReg, sqlite3Atoi(zRight)); |
| 472 } |
| 416 sqlite3VdbeAddOp2(v, OP_ResultRow, iReg, 1); | 473 sqlite3VdbeAddOp2(v, OP_ResultRow, iReg, 1); |
| 417 sqlite3VdbeSetNumCols(v, 1); | 474 sqlite3VdbeSetNumCols(v, 1); |
| 418 sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "page_count", SQLITE_STATIC); | 475 sqlite3VdbeSetColName(v, 0, COLNAME_NAME, zLeft, SQLITE_TRANSIENT); |
| 419 }else | 476 }else |
| 420 | 477 |
| 421 /* | 478 /* |
| 422 ** PRAGMA [database.]locking_mode | 479 ** PRAGMA [database.]locking_mode |
| 423 ** PRAGMA [database.]locking_mode = (normal|exclusive) | 480 ** PRAGMA [database.]locking_mode = (normal|exclusive) |
| 424 */ | 481 */ |
| 425 if( sqlite3StrICmp(zLeft,"locking_mode")==0 ){ | 482 if( sqlite3StrICmp(zLeft,"locking_mode")==0 ){ |
| 426 const char *zRet = "normal"; | 483 const char *zRet = "normal"; |
| 427 int eMode = getLockingMode(zRight); | 484 int eMode = getLockingMode(zRight); |
| 428 | 485 |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 460 zRet = "exclusive"; | 517 zRet = "exclusive"; |
| 461 } | 518 } |
| 462 sqlite3VdbeSetNumCols(v, 1); | 519 sqlite3VdbeSetNumCols(v, 1); |
| 463 sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "locking_mode", SQLITE_STATIC); | 520 sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "locking_mode", SQLITE_STATIC); |
| 464 sqlite3VdbeAddOp4(v, OP_String8, 0, 1, 0, zRet, 0); | 521 sqlite3VdbeAddOp4(v, OP_String8, 0, 1, 0, zRet, 0); |
| 465 sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 1); | 522 sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 1); |
| 466 }else | 523 }else |
| 467 | 524 |
| 468 /* | 525 /* |
| 469 ** PRAGMA [database.]journal_mode | 526 ** PRAGMA [database.]journal_mode |
| 470 ** PRAGMA [database.]journal_mode = (delete|persist|off|truncate|memory) | 527 ** PRAGMA [database.]journal_mode = |
| 528 ** (delete|persist|off|truncate|memory|wal|off) |
| 471 */ | 529 */ |
| 472 if( sqlite3StrICmp(zLeft,"journal_mode")==0 ){ | 530 if( sqlite3StrICmp(zLeft,"journal_mode")==0 ){ |
| 473 int eMode; | 531 int eMode; /* One of the PAGER_JOURNALMODE_XXX symbols */ |
| 474 static char * const azModeName[] = { | 532 int ii; /* Loop counter */ |
| 475 "delete", "persist", "off", "truncate", "memory" | 533 |
| 476 }; | 534 /* Force the schema to be loaded on all databases. This cases all |
| 535 ** database files to be opened and the journal_modes set. */ |
| 536 if( sqlite3ReadSchema(pParse) ){ |
| 537 goto pragma_out; |
| 538 } |
| 539 |
| 540 sqlite3VdbeSetNumCols(v, 1); |
| 541 sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "journal_mode", SQLITE_STATIC); |
| 477 | 542 |
| 478 if( zRight==0 ){ | 543 if( zRight==0 ){ |
| 544 /* If there is no "=MODE" part of the pragma, do a query for the |
| 545 ** current mode */ |
| 479 eMode = PAGER_JOURNALMODE_QUERY; | 546 eMode = PAGER_JOURNALMODE_QUERY; |
| 480 }else{ | 547 }else{ |
| 548 const char *zMode; |
| 481 int n = sqlite3Strlen30(zRight); | 549 int n = sqlite3Strlen30(zRight); |
| 482 eMode = sizeof(azModeName)/sizeof(azModeName[0]) - 1; | 550 for(eMode=0; (zMode = sqlite3JournalModename(eMode))!=0; eMode++){ |
| 483 while( eMode>=0 && sqlite3StrNICmp(zRight, azModeName[eMode], n)!=0 ){ | 551 if( sqlite3StrNICmp(zRight, zMode, n)==0 ) break; |
| 484 eMode--; | 552 } |
| 553 if( !zMode ){ |
| 554 /* If the "=MODE" part does not match any known journal mode, |
| 555 ** then do a query */ |
| 556 eMode = PAGER_JOURNALMODE_QUERY; |
| 485 } | 557 } |
| 486 } | 558 } |
| 487 if( pId2->n==0 && eMode==PAGER_JOURNALMODE_QUERY ){ | 559 if( eMode==PAGER_JOURNALMODE_QUERY && pId2->n==0 ){ |
| 488 /* Simple "PRAGMA journal_mode;" statement. This is a query for | 560 /* Convert "PRAGMA journal_mode" into "PRAGMA main.journal_mode" */ |
| 489 ** the current default journal mode (which may be different to | 561 iDb = 0; |
| 490 ** the journal-mode of the main database). | 562 pId2->n = 1; |
| 491 */ | 563 } |
| 492 eMode = db->dfltJournalMode; | 564 for(ii=db->nDb-1; ii>=0; ii--){ |
| 493 }else{ | 565 if( db->aDb[ii].pBt && (ii==iDb || pId2->n==0) ){ |
| 494 Pager *pPager; | 566 sqlite3VdbeUsesBtree(v, ii); |
| 495 if( pId2->n==0 ){ | 567 sqlite3VdbeAddOp3(v, OP_JournalMode, ii, 1, eMode); |
| 496 /* This indicates that no database name was specified as part | |
| 497 ** of the PRAGMA command. In this case the journal-mode must be | |
| 498 ** set on all attached databases, as well as the main db file. | |
| 499 ** | |
| 500 ** Also, the sqlite3.dfltJournalMode variable is set so that | |
| 501 ** any subsequently attached databases also use the specified | |
| 502 ** journal mode. | |
| 503 */ | |
| 504 int ii; | |
| 505 assert(pDb==&db->aDb[0]); | |
| 506 for(ii=1; ii<db->nDb; ii++){ | |
| 507 if( db->aDb[ii].pBt ){ | |
| 508 pPager = sqlite3BtreePager(db->aDb[ii].pBt); | |
| 509 sqlite3PagerJournalMode(pPager, eMode); | |
| 510 } | |
| 511 } | |
| 512 db->dfltJournalMode = (u8)eMode; | |
| 513 } | 568 } |
| 514 pPager = sqlite3BtreePager(pDb->pBt); | |
| 515 eMode = sqlite3PagerJournalMode(pPager, eMode); | |
| 516 } | 569 } |
| 517 assert( eMode==PAGER_JOURNALMODE_DELETE | |
| 518 || eMode==PAGER_JOURNALMODE_TRUNCATE | |
| 519 || eMode==PAGER_JOURNALMODE_PERSIST | |
| 520 || eMode==PAGER_JOURNALMODE_OFF | |
| 521 || eMode==PAGER_JOURNALMODE_MEMORY ); | |
| 522 sqlite3VdbeSetNumCols(v, 1); | |
| 523 sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "journal_mode", SQLITE_STATIC); | |
| 524 sqlite3VdbeAddOp4(v, OP_String8, 0, 1, 0, | |
| 525 azModeName[eMode], P4_STATIC); | |
| 526 sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 1); | 570 sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 1); |
| 527 }else | 571 }else |
| 528 | 572 |
| 529 /* | 573 /* |
| 530 ** PRAGMA [database.]journal_size_limit | 574 ** PRAGMA [database.]journal_size_limit |
| 531 ** PRAGMA [database.]journal_size_limit=N | 575 ** PRAGMA [database.]journal_size_limit=N |
| 532 ** | 576 ** |
| 533 ** Get or set the size limit on rollback journal files. | 577 ** Get or set the size limit on rollback journal files. |
| 534 */ | 578 */ |
| 535 if( sqlite3StrICmp(zLeft,"journal_size_limit")==0 ){ | 579 if( sqlite3StrICmp(zLeft,"journal_size_limit")==0 ){ |
| 536 Pager *pPager = sqlite3BtreePager(pDb->pBt); | 580 Pager *pPager = sqlite3BtreePager(pDb->pBt); |
| 537 i64 iLimit = -2; | 581 i64 iLimit = -2; |
| 538 if( zRight ){ | 582 if( zRight ){ |
| 539 sqlite3Atoi64(zRight, &iLimit); | 583 sqlite3Atoi64(zRight, &iLimit, 1000000, SQLITE_UTF8); |
| 540 if( iLimit<-1 ) iLimit = -1; | 584 if( iLimit<-1 ) iLimit = -1; |
| 541 } | 585 } |
| 542 iLimit = sqlite3PagerJournalSizeLimit(pPager, iLimit); | 586 iLimit = sqlite3PagerJournalSizeLimit(pPager, iLimit); |
| 543 returnSingleInt(pParse, "journal_size_limit", iLimit); | 587 returnSingleInt(pParse, "journal_size_limit", iLimit); |
| 544 }else | 588 }else |
| 545 | 589 |
| 546 #endif /* SQLITE_OMIT_PAGER_PRAGMAS */ | 590 #endif /* SQLITE_OMIT_PAGER_PRAGMAS */ |
| 547 | 591 |
| 548 /* | 592 /* |
| 549 ** PRAGMA [database.]auto_vacuum | 593 ** PRAGMA [database.]auto_vacuum |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 640 ** the persistent cache size value that is stored in the database | 684 ** the persistent cache size value that is stored in the database |
| 641 ** file itself. The value returned is the maximum number of | 685 ** file itself. The value returned is the maximum number of |
| 642 ** pages in the page cache. The second form sets the local | 686 ** pages in the page cache. The second form sets the local |
| 643 ** page cache size value. It does not change the persistent | 687 ** page cache size value. It does not change the persistent |
| 644 ** cache size stored on the disk so the cache size will revert | 688 ** cache size stored on the disk so the cache size will revert |
| 645 ** to its default value when the database is closed and reopened. | 689 ** to its default value when the database is closed and reopened. |
| 646 ** N should be a positive integer. | 690 ** N should be a positive integer. |
| 647 */ | 691 */ |
| 648 if( sqlite3StrICmp(zLeft,"cache_size")==0 ){ | 692 if( sqlite3StrICmp(zLeft,"cache_size")==0 ){ |
| 649 if( sqlite3ReadSchema(pParse) ) goto pragma_out; | 693 if( sqlite3ReadSchema(pParse) ) goto pragma_out; |
| 694 assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); |
| 650 if( !zRight ){ | 695 if( !zRight ){ |
| 651 returnSingleInt(pParse, "cache_size", pDb->pSchema->cache_size); | 696 returnSingleInt(pParse, "cache_size", pDb->pSchema->cache_size); |
| 652 }else{ | 697 }else{ |
| 653 int size = atoi(zRight); | 698 int size = sqlite3AbsInt32(sqlite3Atoi(zRight)); |
| 654 if( size<0 ) size = -size; | |
| 655 pDb->pSchema->cache_size = size; | 699 pDb->pSchema->cache_size = size; |
| 656 sqlite3BtreeSetCacheSize(pDb->pBt, pDb->pSchema->cache_size); | 700 sqlite3BtreeSetCacheSize(pDb->pBt, pDb->pSchema->cache_size); |
| 657 } | 701 } |
| 658 }else | 702 }else |
| 659 | 703 |
| 660 /* | 704 /* |
| 661 ** PRAGMA temp_store | 705 ** PRAGMA temp_store |
| 662 ** PRAGMA temp_store = "default"|"memory"|"file" | 706 ** PRAGMA temp_store = "default"|"memory"|"file" |
| 663 ** | 707 ** |
| 664 ** Return or set the local value of the temp_store flag. Changing | 708 ** Return or set the local value of the temp_store flag. Changing |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 707 } | 751 } |
| 708 } | 752 } |
| 709 if( SQLITE_TEMP_STORE==0 | 753 if( SQLITE_TEMP_STORE==0 |
| 710 || (SQLITE_TEMP_STORE==1 && db->temp_store<=1) | 754 || (SQLITE_TEMP_STORE==1 && db->temp_store<=1) |
| 711 || (SQLITE_TEMP_STORE==2 && db->temp_store==1) | 755 || (SQLITE_TEMP_STORE==2 && db->temp_store==1) |
| 712 ){ | 756 ){ |
| 713 invalidateTempStorage(pParse); | 757 invalidateTempStorage(pParse); |
| 714 } | 758 } |
| 715 sqlite3_free(sqlite3_temp_directory); | 759 sqlite3_free(sqlite3_temp_directory); |
| 716 if( zRight[0] ){ | 760 if( zRight[0] ){ |
| 717 sqlite3_temp_directory = sqlite3DbStrDup(0, zRight); | 761 sqlite3_temp_directory = sqlite3_mprintf("%s", zRight); |
| 718 }else{ | 762 }else{ |
| 719 sqlite3_temp_directory = 0; | 763 sqlite3_temp_directory = 0; |
| 720 } | 764 } |
| 721 #endif /* SQLITE_OMIT_WSD */ | 765 #endif /* SQLITE_OMIT_WSD */ |
| 722 } | 766 } |
| 723 }else | 767 }else |
| 724 | 768 |
| 725 #if !defined(SQLITE_ENABLE_LOCKING_STYLE) | 769 #if !defined(SQLITE_ENABLE_LOCKING_STYLE) |
| 726 # if defined(__APPLE__) | 770 # if defined(__APPLE__) |
| 727 # define SQLITE_ENABLE_LOCKING_STYLE 1 | 771 # define SQLITE_ENABLE_LOCKING_STYLE 1 |
| (...skipping 230 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 958 sqlite3VdbeSetColName(v, 2, COLNAME_NAME, "table", SQLITE_STATIC); | 1002 sqlite3VdbeSetColName(v, 2, COLNAME_NAME, "table", SQLITE_STATIC); |
| 959 sqlite3VdbeSetColName(v, 3, COLNAME_NAME, "from", SQLITE_STATIC); | 1003 sqlite3VdbeSetColName(v, 3, COLNAME_NAME, "from", SQLITE_STATIC); |
| 960 sqlite3VdbeSetColName(v, 4, COLNAME_NAME, "to", SQLITE_STATIC); | 1004 sqlite3VdbeSetColName(v, 4, COLNAME_NAME, "to", SQLITE_STATIC); |
| 961 sqlite3VdbeSetColName(v, 5, COLNAME_NAME, "on_update", SQLITE_STATIC); | 1005 sqlite3VdbeSetColName(v, 5, COLNAME_NAME, "on_update", SQLITE_STATIC); |
| 962 sqlite3VdbeSetColName(v, 6, COLNAME_NAME, "on_delete", SQLITE_STATIC); | 1006 sqlite3VdbeSetColName(v, 6, COLNAME_NAME, "on_delete", SQLITE_STATIC); |
| 963 sqlite3VdbeSetColName(v, 7, COLNAME_NAME, "match", SQLITE_STATIC); | 1007 sqlite3VdbeSetColName(v, 7, COLNAME_NAME, "match", SQLITE_STATIC); |
| 964 while(pFK){ | 1008 while(pFK){ |
| 965 int j; | 1009 int j; |
| 966 for(j=0; j<pFK->nCol; j++){ | 1010 for(j=0; j<pFK->nCol; j++){ |
| 967 char *zCol = pFK->aCol[j].zCol; | 1011 char *zCol = pFK->aCol[j].zCol; |
| 968 char *zOnUpdate = (char *)actionName(pFK->updateConf); | 1012 char *zOnDelete = (char *)actionName(pFK->aAction[0]); |
| 969 char *zOnDelete = (char *)actionName(pFK->deleteConf); | 1013 char *zOnUpdate = (char *)actionName(pFK->aAction[1]); |
| 970 sqlite3VdbeAddOp2(v, OP_Integer, i, 1); | 1014 sqlite3VdbeAddOp2(v, OP_Integer, i, 1); |
| 971 sqlite3VdbeAddOp2(v, OP_Integer, j, 2); | 1015 sqlite3VdbeAddOp2(v, OP_Integer, j, 2); |
| 972 sqlite3VdbeAddOp4(v, OP_String8, 0, 3, 0, pFK->zTo, 0); | 1016 sqlite3VdbeAddOp4(v, OP_String8, 0, 3, 0, pFK->zTo, 0); |
| 973 sqlite3VdbeAddOp4(v, OP_String8, 0, 4, 0, | 1017 sqlite3VdbeAddOp4(v, OP_String8, 0, 4, 0, |
| 974 pTab->aCol[pFK->aCol[j].iFrom].zName, 0); | 1018 pTab->aCol[pFK->aCol[j].iFrom].zName, 0); |
| 975 sqlite3VdbeAddOp4(v, zCol ? OP_String8 : OP_Null, 0, 5, 0, zCol, 0); | 1019 sqlite3VdbeAddOp4(v, zCol ? OP_String8 : OP_Null, 0, 5, 0, zCol, 0); |
| 976 sqlite3VdbeAddOp4(v, OP_String8, 0, 6, 0, zOnUpdate, 0); | 1020 sqlite3VdbeAddOp4(v, OP_String8, 0, 6, 0, zOnUpdate, 0); |
| 977 sqlite3VdbeAddOp4(v, OP_String8, 0, 7, 0, zOnDelete, 0); | 1021 sqlite3VdbeAddOp4(v, OP_String8, 0, 7, 0, zOnDelete, 0); |
| 978 sqlite3VdbeAddOp4(v, OP_String8, 0, 8, 0, "NONE", 0); | 1022 sqlite3VdbeAddOp4(v, OP_String8, 0, 8, 0, "NONE", 0); |
| 979 sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 8); | 1023 sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 8); |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1036 | 1080 |
| 1037 /* Initialize the VDBE program */ | 1081 /* Initialize the VDBE program */ |
| 1038 if( sqlite3ReadSchema(pParse) ) goto pragma_out; | 1082 if( sqlite3ReadSchema(pParse) ) goto pragma_out; |
| 1039 pParse->nMem = 6; | 1083 pParse->nMem = 6; |
| 1040 sqlite3VdbeSetNumCols(v, 1); | 1084 sqlite3VdbeSetNumCols(v, 1); |
| 1041 sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "integrity_check", SQLITE_STATIC); | 1085 sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "integrity_check", SQLITE_STATIC); |
| 1042 | 1086 |
| 1043 /* Set the maximum error count */ | 1087 /* Set the maximum error count */ |
| 1044 mxErr = SQLITE_INTEGRITY_CHECK_ERROR_MAX; | 1088 mxErr = SQLITE_INTEGRITY_CHECK_ERROR_MAX; |
| 1045 if( zRight ){ | 1089 if( zRight ){ |
| 1046 mxErr = atoi(zRight); | 1090 sqlite3GetInt32(zRight, &mxErr); |
| 1047 if( mxErr<=0 ){ | 1091 if( mxErr<=0 ){ |
| 1048 mxErr = SQLITE_INTEGRITY_CHECK_ERROR_MAX; | 1092 mxErr = SQLITE_INTEGRITY_CHECK_ERROR_MAX; |
| 1049 } | 1093 } |
| 1050 } | 1094 } |
| 1051 sqlite3VdbeAddOp2(v, OP_Integer, mxErr, 1); /* reg[1] holds errors left */ | 1095 sqlite3VdbeAddOp2(v, OP_Integer, mxErr, 1); /* reg[1] holds errors left */ |
| 1052 | 1096 |
| 1053 /* Do an integrity check on each database file */ | 1097 /* Do an integrity check on each database file */ |
| 1054 for(i=0; i<db->nDb; i++){ | 1098 for(i=0; i<db->nDb; i++){ |
| 1055 HashElem *x; | 1099 HashElem *x; |
| 1056 Hash *pTbls; | 1100 Hash *pTbls; |
| 1057 int cnt = 0; | 1101 int cnt = 0; |
| 1058 | 1102 |
| 1059 if( OMIT_TEMPDB && i==1 ) continue; | 1103 if( OMIT_TEMPDB && i==1 ) continue; |
| 1060 | 1104 |
| 1061 sqlite3CodeVerifySchema(pParse, i); | 1105 sqlite3CodeVerifySchema(pParse, i); |
| 1062 addr = sqlite3VdbeAddOp1(v, OP_IfPos, 1); /* Halt if out of errors */ | 1106 addr = sqlite3VdbeAddOp1(v, OP_IfPos, 1); /* Halt if out of errors */ |
| 1063 sqlite3VdbeAddOp2(v, OP_Halt, 0, 0); | 1107 sqlite3VdbeAddOp2(v, OP_Halt, 0, 0); |
| 1064 sqlite3VdbeJumpHere(v, addr); | 1108 sqlite3VdbeJumpHere(v, addr); |
| 1065 | 1109 |
| 1066 /* Do an integrity check of the B-Tree | 1110 /* Do an integrity check of the B-Tree |
| 1067 ** | 1111 ** |
| 1068 ** Begin by filling registers 2, 3, ... with the root pages numbers | 1112 ** Begin by filling registers 2, 3, ... with the root pages numbers |
| 1069 ** for all tables and indices in the database. | 1113 ** for all tables and indices in the database. |
| 1070 */ | 1114 */ |
| 1115 assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); |
| 1071 pTbls = &db->aDb[i].pSchema->tblHash; | 1116 pTbls = &db->aDb[i].pSchema->tblHash; |
| 1072 for(x=sqliteHashFirst(pTbls); x; x=sqliteHashNext(x)){ | 1117 for(x=sqliteHashFirst(pTbls); x; x=sqliteHashNext(x)){ |
| 1073 Table *pTab = sqliteHashData(x); | 1118 Table *pTab = sqliteHashData(x); |
| 1074 Index *pIdx; | 1119 Index *pIdx; |
| 1075 sqlite3VdbeAddOp2(v, OP_Integer, pTab->tnum, 2+cnt); | 1120 sqlite3VdbeAddOp2(v, OP_Integer, pTab->tnum, 2+cnt); |
| 1076 cnt++; | 1121 cnt++; |
| 1077 for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){ | 1122 for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){ |
| 1078 sqlite3VdbeAddOp2(v, OP_Integer, pIdx->tnum, 2+cnt); | 1123 sqlite3VdbeAddOp2(v, OP_Integer, pIdx->tnum, 2+cnt); |
| 1079 cnt++; | 1124 cnt++; |
| 1080 } | 1125 } |
| (...skipping 26 matching lines...) Expand all Loading... |
| 1107 if( pTab->pIndex==0 ) continue; | 1152 if( pTab->pIndex==0 ) continue; |
| 1108 addr = sqlite3VdbeAddOp1(v, OP_IfPos, 1); /* Stop if out of errors */ | 1153 addr = sqlite3VdbeAddOp1(v, OP_IfPos, 1); /* Stop if out of errors */ |
| 1109 sqlite3VdbeAddOp2(v, OP_Halt, 0, 0); | 1154 sqlite3VdbeAddOp2(v, OP_Halt, 0, 0); |
| 1110 sqlite3VdbeJumpHere(v, addr); | 1155 sqlite3VdbeJumpHere(v, addr); |
| 1111 sqlite3OpenTableAndIndices(pParse, pTab, 1, OP_OpenRead); | 1156 sqlite3OpenTableAndIndices(pParse, pTab, 1, OP_OpenRead); |
| 1112 sqlite3VdbeAddOp2(v, OP_Integer, 0, 2); /* reg(2) will count entries */ | 1157 sqlite3VdbeAddOp2(v, OP_Integer, 0, 2); /* reg(2) will count entries */ |
| 1113 loopTop = sqlite3VdbeAddOp2(v, OP_Rewind, 1, 0); | 1158 loopTop = sqlite3VdbeAddOp2(v, OP_Rewind, 1, 0); |
| 1114 sqlite3VdbeAddOp2(v, OP_AddImm, 2, 1); /* increment entry count */ | 1159 sqlite3VdbeAddOp2(v, OP_AddImm, 2, 1); /* increment entry count */ |
| 1115 for(j=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, j++){ | 1160 for(j=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, j++){ |
| 1116 int jmp2; | 1161 int jmp2; |
| 1162 int r1; |
| 1117 static const VdbeOpList idxErr[] = { | 1163 static const VdbeOpList idxErr[] = { |
| 1118 { OP_AddImm, 1, -1, 0}, | 1164 { OP_AddImm, 1, -1, 0}, |
| 1119 { OP_String8, 0, 3, 0}, /* 1 */ | 1165 { OP_String8, 0, 3, 0}, /* 1 */ |
| 1120 { OP_Rowid, 1, 4, 0}, | 1166 { OP_Rowid, 1, 4, 0}, |
| 1121 { OP_String8, 0, 5, 0}, /* 3 */ | 1167 { OP_String8, 0, 5, 0}, /* 3 */ |
| 1122 { OP_String8, 0, 6, 0}, /* 4 */ | 1168 { OP_String8, 0, 6, 0}, /* 4 */ |
| 1123 { OP_Concat, 4, 3, 3}, | 1169 { OP_Concat, 4, 3, 3}, |
| 1124 { OP_Concat, 5, 3, 3}, | 1170 { OP_Concat, 5, 3, 3}, |
| 1125 { OP_Concat, 6, 3, 3}, | 1171 { OP_Concat, 6, 3, 3}, |
| 1126 { OP_ResultRow, 3, 1, 0}, | 1172 { OP_ResultRow, 3, 1, 0}, |
| 1127 { OP_IfPos, 1, 0, 0}, /* 9 */ | 1173 { OP_IfPos, 1, 0, 0}, /* 9 */ |
| 1128 { OP_Halt, 0, 0, 0}, | 1174 { OP_Halt, 0, 0, 0}, |
| 1129 }; | 1175 }; |
| 1130 sqlite3GenerateIndexKey(pParse, pIdx, 1, 3, 1); | 1176 r1 = sqlite3GenerateIndexKey(pParse, pIdx, 1, 3, 0); |
| 1131 jmp2 = sqlite3VdbeAddOp3(v, OP_Found, j+2, 0, 3); | 1177 jmp2 = sqlite3VdbeAddOp4Int(v, OP_Found, j+2, 0, r1, pIdx->nColumn+1); |
| 1132 addr = sqlite3VdbeAddOpList(v, ArraySize(idxErr), idxErr); | 1178 addr = sqlite3VdbeAddOpList(v, ArraySize(idxErr), idxErr); |
| 1133 sqlite3VdbeChangeP4(v, addr+1, "rowid ", P4_STATIC); | 1179 sqlite3VdbeChangeP4(v, addr+1, "rowid ", P4_STATIC); |
| 1134 sqlite3VdbeChangeP4(v, addr+3, " missing from index ", P4_STATIC); | 1180 sqlite3VdbeChangeP4(v, addr+3, " missing from index ", P4_STATIC); |
| 1135 sqlite3VdbeChangeP4(v, addr+4, pIdx->zName, P4_STATIC); | 1181 sqlite3VdbeChangeP4(v, addr+4, pIdx->zName, P4_TRANSIENT); |
| 1136 sqlite3VdbeJumpHere(v, addr+9); | 1182 sqlite3VdbeJumpHere(v, addr+9); |
| 1137 sqlite3VdbeJumpHere(v, jmp2); | 1183 sqlite3VdbeJumpHere(v, jmp2); |
| 1138 } | 1184 } |
| 1139 sqlite3VdbeAddOp2(v, OP_Next, 1, loopTop+1); | 1185 sqlite3VdbeAddOp2(v, OP_Next, 1, loopTop+1); |
| 1140 sqlite3VdbeJumpHere(v, loopTop); | 1186 sqlite3VdbeJumpHere(v, loopTop); |
| 1141 for(j=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, j++){ | 1187 for(j=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, j++){ |
| 1142 static const VdbeOpList cntIdx[] = { | 1188 static const VdbeOpList cntIdx[] = { |
| 1143 { OP_Integer, 0, 3, 0}, | 1189 { OP_Integer, 0, 3, 0}, |
| 1144 { OP_Rewind, 0, 0, 0}, /* 1 */ | 1190 { OP_Rewind, 0, 0, 0}, /* 1 */ |
| 1145 { OP_AddImm, 3, 1, 0}, | 1191 { OP_AddImm, 3, 1, 0}, |
| 1146 { OP_Next, 0, 0, 0}, /* 3 */ | 1192 { OP_Next, 0, 0, 0}, /* 3 */ |
| 1147 { OP_Eq, 2, 0, 3}, /* 4 */ | 1193 { OP_Eq, 2, 0, 3}, /* 4 */ |
| 1148 { OP_AddImm, 1, -1, 0}, | 1194 { OP_AddImm, 1, -1, 0}, |
| 1149 { OP_String8, 0, 2, 0}, /* 6 */ | 1195 { OP_String8, 0, 2, 0}, /* 6 */ |
| 1150 { OP_String8, 0, 3, 0}, /* 7 */ | 1196 { OP_String8, 0, 3, 0}, /* 7 */ |
| 1151 { OP_Concat, 3, 2, 2}, | 1197 { OP_Concat, 3, 2, 2}, |
| 1152 { OP_ResultRow, 2, 1, 0}, | 1198 { OP_ResultRow, 2, 1, 0}, |
| 1153 }; | 1199 }; |
| 1154 addr = sqlite3VdbeAddOp1(v, OP_IfPos, 1); | 1200 addr = sqlite3VdbeAddOp1(v, OP_IfPos, 1); |
| 1155 sqlite3VdbeAddOp2(v, OP_Halt, 0, 0); | 1201 sqlite3VdbeAddOp2(v, OP_Halt, 0, 0); |
| 1156 sqlite3VdbeJumpHere(v, addr); | 1202 sqlite3VdbeJumpHere(v, addr); |
| 1157 addr = sqlite3VdbeAddOpList(v, ArraySize(cntIdx), cntIdx); | 1203 addr = sqlite3VdbeAddOpList(v, ArraySize(cntIdx), cntIdx); |
| 1158 sqlite3VdbeChangeP1(v, addr+1, j+2); | 1204 sqlite3VdbeChangeP1(v, addr+1, j+2); |
| 1159 sqlite3VdbeChangeP2(v, addr+1, addr+4); | 1205 sqlite3VdbeChangeP2(v, addr+1, addr+4); |
| 1160 sqlite3VdbeChangeP1(v, addr+3, j+2); | 1206 sqlite3VdbeChangeP1(v, addr+3, j+2); |
| 1161 sqlite3VdbeChangeP2(v, addr+3, addr+2); | 1207 sqlite3VdbeChangeP2(v, addr+3, addr+2); |
| 1162 sqlite3VdbeJumpHere(v, addr+4); | 1208 sqlite3VdbeJumpHere(v, addr+4); |
| 1163 sqlite3VdbeChangeP4(v, addr+6, | 1209 sqlite3VdbeChangeP4(v, addr+6, |
| 1164 "wrong # of entries in index ", P4_STATIC); | 1210 "wrong # of entries in index ", P4_STATIC); |
| 1165 sqlite3VdbeChangeP4(v, addr+7, pIdx->zName, P4_STATIC); | 1211 sqlite3VdbeChangeP4(v, addr+7, pIdx->zName, P4_TRANSIENT); |
| 1166 } | 1212 } |
| 1167 } | 1213 } |
| 1168 } | 1214 } |
| 1169 addr = sqlite3VdbeAddOpList(v, ArraySize(endCode), endCode); | 1215 addr = sqlite3VdbeAddOpList(v, ArraySize(endCode), endCode); |
| 1170 sqlite3VdbeChangeP2(v, addr, -mxErr); | 1216 sqlite3VdbeChangeP2(v, addr, -mxErr); |
| 1171 sqlite3VdbeJumpHere(v, addr+1); | 1217 sqlite3VdbeJumpHere(v, addr+1); |
| 1172 sqlite3VdbeChangeP4(v, addr+2, "ok", P4_STATIC); | 1218 sqlite3VdbeChangeP4(v, addr+2, "ok", P4_STATIC); |
| 1173 }else | 1219 }else |
| 1174 #endif /* SQLITE_OMIT_INTEGRITY_CHECK */ | 1220 #endif /* SQLITE_OMIT_INTEGRITY_CHECK */ |
| 1175 | 1221 |
| (...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1292 | 1338 |
| 1293 if( zRight && iCookie!=BTREE_FREE_PAGE_COUNT ){ | 1339 if( zRight && iCookie!=BTREE_FREE_PAGE_COUNT ){ |
| 1294 /* Write the specified cookie value */ | 1340 /* Write the specified cookie value */ |
| 1295 static const VdbeOpList setCookie[] = { | 1341 static const VdbeOpList setCookie[] = { |
| 1296 { OP_Transaction, 0, 1, 0}, /* 0 */ | 1342 { OP_Transaction, 0, 1, 0}, /* 0 */ |
| 1297 { OP_Integer, 0, 1, 0}, /* 1 */ | 1343 { OP_Integer, 0, 1, 0}, /* 1 */ |
| 1298 { OP_SetCookie, 0, 0, 1}, /* 2 */ | 1344 { OP_SetCookie, 0, 0, 1}, /* 2 */ |
| 1299 }; | 1345 }; |
| 1300 int addr = sqlite3VdbeAddOpList(v, ArraySize(setCookie), setCookie); | 1346 int addr = sqlite3VdbeAddOpList(v, ArraySize(setCookie), setCookie); |
| 1301 sqlite3VdbeChangeP1(v, addr, iDb); | 1347 sqlite3VdbeChangeP1(v, addr, iDb); |
| 1302 sqlite3VdbeChangeP1(v, addr+1, atoi(zRight)); | 1348 sqlite3VdbeChangeP1(v, addr+1, sqlite3Atoi(zRight)); |
| 1303 sqlite3VdbeChangeP1(v, addr+2, iDb); | 1349 sqlite3VdbeChangeP1(v, addr+2, iDb); |
| 1304 sqlite3VdbeChangeP2(v, addr+2, iCookie); | 1350 sqlite3VdbeChangeP2(v, addr+2, iCookie); |
| 1305 }else{ | 1351 }else{ |
| 1306 /* Read the specified cookie value */ | 1352 /* Read the specified cookie value */ |
| 1307 static const VdbeOpList readCookie[] = { | 1353 static const VdbeOpList readCookie[] = { |
| 1308 { OP_Transaction, 0, 0, 0}, /* 0 */ | 1354 { OP_Transaction, 0, 0, 0}, /* 0 */ |
| 1309 { OP_ReadCookie, 0, 1, 0}, /* 1 */ | 1355 { OP_ReadCookie, 0, 1, 0}, /* 1 */ |
| 1310 { OP_ResultRow, 1, 1, 0} | 1356 { OP_ResultRow, 1, 1, 0} |
| 1311 }; | 1357 }; |
| 1312 int addr = sqlite3VdbeAddOpList(v, ArraySize(readCookie), readCookie); | 1358 int addr = sqlite3VdbeAddOpList(v, ArraySize(readCookie), readCookie); |
| 1313 sqlite3VdbeChangeP1(v, addr, iDb); | 1359 sqlite3VdbeChangeP1(v, addr, iDb); |
| 1314 sqlite3VdbeChangeP1(v, addr+1, iDb); | 1360 sqlite3VdbeChangeP1(v, addr+1, iDb); |
| 1315 sqlite3VdbeChangeP3(v, addr+1, iCookie); | 1361 sqlite3VdbeChangeP3(v, addr+1, iCookie); |
| 1316 sqlite3VdbeSetNumCols(v, 1); | 1362 sqlite3VdbeSetNumCols(v, 1); |
| 1317 sqlite3VdbeSetColName(v, 0, COLNAME_NAME, zLeft, SQLITE_TRANSIENT); | 1363 sqlite3VdbeSetColName(v, 0, COLNAME_NAME, zLeft, SQLITE_TRANSIENT); |
| 1318 } | 1364 } |
| 1319 }else | 1365 }else |
| 1320 #endif /* SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS */ | 1366 #endif /* SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS */ |
| 1321 | 1367 |
| 1368 #ifndef SQLITE_OMIT_COMPILEOPTION_DIAGS |
| 1369 /* |
| 1370 ** PRAGMA compile_options |
| 1371 ** |
| 1372 ** Return the names of all compile-time options used in this build, |
| 1373 ** one option per row. |
| 1374 */ |
| 1375 if( sqlite3StrICmp(zLeft, "compile_options")==0 ){ |
| 1376 int i = 0; |
| 1377 const char *zOpt; |
| 1378 sqlite3VdbeSetNumCols(v, 1); |
| 1379 pParse->nMem = 1; |
| 1380 sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "compile_option", SQLITE_STATIC); |
| 1381 while( (zOpt = sqlite3_compileoption_get(i++))!=0 ){ |
| 1382 sqlite3VdbeAddOp4(v, OP_String8, 0, 1, 0, zOpt, 0); |
| 1383 sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 1); |
| 1384 } |
| 1385 }else |
| 1386 #endif /* SQLITE_OMIT_COMPILEOPTION_DIAGS */ |
| 1387 |
| 1388 #ifndef SQLITE_OMIT_WAL |
| 1389 /* |
| 1390 ** PRAGMA [database.]wal_checkpoint = passive|full|restart |
| 1391 ** |
| 1392 ** Checkpoint the database. |
| 1393 */ |
| 1394 if( sqlite3StrICmp(zLeft, "wal_checkpoint")==0 ){ |
| 1395 int iBt = (pId2->z?iDb:SQLITE_MAX_ATTACHED); |
| 1396 int eMode = SQLITE_CHECKPOINT_PASSIVE; |
| 1397 if( zRight ){ |
| 1398 if( sqlite3StrICmp(zRight, "full")==0 ){ |
| 1399 eMode = SQLITE_CHECKPOINT_FULL; |
| 1400 }else if( sqlite3StrICmp(zRight, "restart")==0 ){ |
| 1401 eMode = SQLITE_CHECKPOINT_RESTART; |
| 1402 } |
| 1403 } |
| 1404 if( sqlite3ReadSchema(pParse) ) goto pragma_out; |
| 1405 sqlite3VdbeSetNumCols(v, 3); |
| 1406 pParse->nMem = 3; |
| 1407 sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "busy", SQLITE_STATIC); |
| 1408 sqlite3VdbeSetColName(v, 1, COLNAME_NAME, "log", SQLITE_STATIC); |
| 1409 sqlite3VdbeSetColName(v, 2, COLNAME_NAME, "checkpointed", SQLITE_STATIC); |
| 1410 |
| 1411 sqlite3VdbeAddOp3(v, OP_Checkpoint, iBt, eMode, 1); |
| 1412 sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 3); |
| 1413 }else |
| 1414 |
| 1415 /* |
| 1416 ** PRAGMA wal_autocheckpoint |
| 1417 ** PRAGMA wal_autocheckpoint = N |
| 1418 ** |
| 1419 ** Configure a database connection to automatically checkpoint a database |
| 1420 ** after accumulating N frames in the log. Or query for the current value |
| 1421 ** of N. |
| 1422 */ |
| 1423 if( sqlite3StrICmp(zLeft, "wal_autocheckpoint")==0 ){ |
| 1424 if( zRight ){ |
| 1425 sqlite3_wal_autocheckpoint(db, sqlite3Atoi(zRight)); |
| 1426 } |
| 1427 returnSingleInt(pParse, "wal_autocheckpoint", |
| 1428 db->xWalCallback==sqlite3WalDefaultHook ? |
| 1429 SQLITE_PTR_TO_INT(db->pWalArg) : 0); |
| 1430 }else |
| 1431 #endif |
| 1432 |
| 1322 #if defined(SQLITE_DEBUG) || defined(SQLITE_TEST) | 1433 #if defined(SQLITE_DEBUG) || defined(SQLITE_TEST) |
| 1323 /* | 1434 /* |
| 1324 ** Report the current state of file logs for all databases | 1435 ** Report the current state of file logs for all databases |
| 1325 */ | 1436 */ |
| 1326 if( sqlite3StrICmp(zLeft, "lock_status")==0 ){ | 1437 if( sqlite3StrICmp(zLeft, "lock_status")==0 ){ |
| 1327 static const char *const azLockName[] = { | 1438 static const char *const azLockName[] = { |
| 1328 "unlocked", "shared", "reserved", "pending", "exclusive" | 1439 "unlocked", "shared", "reserved", "pending", "exclusive" |
| 1329 }; | 1440 }; |
| 1330 int i; | 1441 int i; |
| 1331 sqlite3VdbeSetNumCols(v, 2); | 1442 sqlite3VdbeSetNumCols(v, 2); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 1346 SQLITE_FCNTL_LOCKSTATE, &j)==SQLITE_OK ){ | 1457 SQLITE_FCNTL_LOCKSTATE, &j)==SQLITE_OK ){ |
| 1347 zState = azLockName[j]; | 1458 zState = azLockName[j]; |
| 1348 } | 1459 } |
| 1349 sqlite3VdbeAddOp4(v, OP_String8, 0, 2, 0, zState, P4_STATIC); | 1460 sqlite3VdbeAddOp4(v, OP_String8, 0, 2, 0, zState, P4_STATIC); |
| 1350 sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 2); | 1461 sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 2); |
| 1351 } | 1462 } |
| 1352 | 1463 |
| 1353 }else | 1464 }else |
| 1354 #endif | 1465 #endif |
| 1355 | 1466 |
| 1356 #if SQLITE_HAS_CODEC | 1467 #ifdef SQLITE_HAS_CODEC |
| 1357 if( sqlite3StrICmp(zLeft, "key")==0 && zRight ){ | 1468 if( sqlite3StrICmp(zLeft, "key")==0 && zRight ){ |
| 1358 sqlite3_key(db, zRight, sqlite3Strlen30(zRight)); | 1469 sqlite3_key(db, zRight, sqlite3Strlen30(zRight)); |
| 1359 }else | 1470 }else |
| 1360 if( sqlite3StrICmp(zLeft, "rekey")==0 && zRight ){ | 1471 if( sqlite3StrICmp(zLeft, "rekey")==0 && zRight ){ |
| 1361 sqlite3_rekey(db, zRight, sqlite3Strlen30(zRight)); | 1472 sqlite3_rekey(db, zRight, sqlite3Strlen30(zRight)); |
| 1362 }else | 1473 }else |
| 1363 if( zRight && (sqlite3StrICmp(zLeft, "hexkey")==0 || | 1474 if( zRight && (sqlite3StrICmp(zLeft, "hexkey")==0 || |
| 1364 sqlite3StrICmp(zLeft, "hexrekey")==0) ){ | 1475 sqlite3StrICmp(zLeft, "hexrekey")==0) ){ |
| 1365 int i, h1, h2; | 1476 int i, h1, h2; |
| 1366 char zKey[40]; | 1477 char zKey[40]; |
| 1367 for(i=0; (h1 = zRight[i])!=0 && (h2 = zRight[i+1])!=0; i+=2){ | 1478 for(i=0; (h1 = zRight[i])!=0 && (h2 = zRight[i+1])!=0; i+=2){ |
| 1368 h1 += 9*(1&(h1>>6)); | 1479 h1 += 9*(1&(h1>>6)); |
| 1369 h2 += 9*(1&(h2>>6)); | 1480 h2 += 9*(1&(h2>>6)); |
| 1370 zKey[i/2] = (h2 & 0x0f) | ((h1 & 0xf)<<4); | 1481 zKey[i/2] = (h2 & 0x0f) | ((h1 & 0xf)<<4); |
| 1371 } | 1482 } |
| 1372 if( (zLeft[3] & 0xf)==0xb ){ | 1483 if( (zLeft[3] & 0xf)==0xb ){ |
| 1373 sqlite3_key(db, zKey, i/2); | 1484 sqlite3_key(db, zKey, i/2); |
| 1374 }else{ | 1485 }else{ |
| 1375 sqlite3_rekey(db, zKey, i/2); | 1486 sqlite3_rekey(db, zKey, i/2); |
| 1376 } | 1487 } |
| 1377 }else | 1488 }else |
| 1378 #endif | 1489 #endif |
| 1379 #if SQLITE_HAS_CODEC || defined(SQLITE_ENABLE_CEROD) | 1490 #if defined(SQLITE_HAS_CODEC) || defined(SQLITE_ENABLE_CEROD) |
| 1380 if( sqlite3StrICmp(zLeft, "activate_extensions")==0 ){ | 1491 if( sqlite3StrICmp(zLeft, "activate_extensions")==0 ){ |
| 1381 #if SQLITE_HAS_CODEC | 1492 #ifdef SQLITE_HAS_CODEC |
| 1382 if( sqlite3StrNICmp(zRight, "see-", 4)==0 ){ | 1493 if( sqlite3StrNICmp(zRight, "see-", 4)==0 ){ |
| 1383 extern void sqlite3_activate_see(const char*); | |
| 1384 sqlite3_activate_see(&zRight[4]); | 1494 sqlite3_activate_see(&zRight[4]); |
| 1385 } | 1495 } |
| 1386 #endif | 1496 #endif |
| 1387 #ifdef SQLITE_ENABLE_CEROD | 1497 #ifdef SQLITE_ENABLE_CEROD |
| 1388 if( sqlite3StrNICmp(zRight, "cerod-", 6)==0 ){ | 1498 if( sqlite3StrNICmp(zRight, "cerod-", 6)==0 ){ |
| 1389 extern void sqlite3_activate_cerod(const char*); | |
| 1390 sqlite3_activate_cerod(&zRight[6]); | 1499 sqlite3_activate_cerod(&zRight[6]); |
| 1391 } | 1500 } |
| 1392 #endif | 1501 #endif |
| 1393 }else | 1502 }else |
| 1394 #endif | 1503 #endif |
| 1395 | 1504 |
| 1396 | 1505 |
| 1397 {/* Empty ELSE clause */} | 1506 {/* Empty ELSE clause */} |
| 1398 | 1507 |
| 1399 /* Code an OP_Expire at the end of each PRAGMA program to cause | |
| 1400 ** the VDBE implementing the pragma to expire. Most (all?) pragmas | |
| 1401 ** are only valid for a single execution. | |
| 1402 */ | |
| 1403 sqlite3VdbeAddOp2(v, OP_Expire, 1, 0); | |
| 1404 | |
| 1405 /* | 1508 /* |
| 1406 ** Reset the safety level, in case the fullfsync flag or synchronous | 1509 ** Reset the safety level, in case the fullfsync flag or synchronous |
| 1407 ** setting changed. | 1510 ** setting changed. |
| 1408 */ | 1511 */ |
| 1409 #ifndef SQLITE_OMIT_PAGER_PRAGMAS | 1512 #ifndef SQLITE_OMIT_PAGER_PRAGMAS |
| 1410 if( db->autoCommit ){ | 1513 if( db->autoCommit ){ |
| 1411 sqlite3BtreeSetSafetyLevel(pDb->pBt, pDb->safety_level, | 1514 sqlite3BtreeSetSafetyLevel(pDb->pBt, pDb->safety_level, |
| 1412 (db->flags&SQLITE_FullFSync)!=0); | 1515 (db->flags&SQLITE_FullFSync)!=0, |
| 1516 (db->flags&SQLITE_CkptFullFSync)!=0); |
| 1413 } | 1517 } |
| 1414 #endif | 1518 #endif |
| 1415 pragma_out: | 1519 pragma_out: |
| 1416 sqlite3DbFree(db, zLeft); | 1520 sqlite3DbFree(db, zLeft); |
| 1417 sqlite3DbFree(db, zRight); | 1521 sqlite3DbFree(db, zRight); |
| 1418 } | 1522 } |
| 1419 | 1523 |
| 1420 #endif /* SQLITE_OMIT_PRAGMA */ | 1524 #endif /* SQLITE_OMIT_PRAGMA */ |
| OLD | NEW |