Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Ensure the database size field in the db header of a backup database is set correctly. Fix for [0cfd98ee201]. |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA1: |
ff6857b6ed6a46671006b75157d8cf85 |
User & Date: | dan 2012-12-21 16:15:35.911 |
Context
2012-12-31
| ||
19:18 | Add the test_regexp.c module containing a cross-platform implementation of the REGEXP operator. (check-in: 46c8c01b75 user: drh tags: trunk) | |
2012-12-21
| ||
16:15 | Ensure the database size field in the db header of a backup database is set correctly. Fix for [0cfd98ee201]. (check-in: ff6857b6ed user: dan tags: trunk) | |
2012-12-20
| ||
01:15 | Add PRAGMA foreign_key_check. Name the child and parent tables as part of a "foreign key mismatch" error. (check-in: e408dc9080 user: drh tags: trunk) | |
Changes
Changes to src/backup.c.
︙ | ︙ | |||
208 209 210 211 212 213 214 | } /* ** Parameter zSrcData points to a buffer containing the data for ** page iSrcPg from the source database. Copy this data into the ** destination database. */ | | > > > > > | 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 | } /* ** Parameter zSrcData points to a buffer containing the data for ** page iSrcPg from the source database. Copy this data into the ** destination database. */ static int backupOnePage( sqlite3_backup *p, /* Backup handle */ Pgno iSrcPg, /* Source database page to backup */ const u8 *zSrcData, /* Source database page data */ int bUpdate /* True for an update, false otherwise */ ){ Pager * const pDestPager = sqlite3BtreePager(p->pDest); const int nSrcPgsz = sqlite3BtreeGetPageSize(p->pSrc); int nDestPgsz = sqlite3BtreeGetPageSize(p->pDest); const int nCopy = MIN(nSrcPgsz, nDestPgsz); const i64 iEnd = (i64)iSrcPg*(i64)nSrcPgsz; #ifdef SQLITE_HAS_CODEC /* Use BtreeGetReserveNoMutex() for the source b-tree, as although it is |
︙ | ︙ | |||
281 282 283 284 285 286 287 288 289 290 291 292 293 294 | ** and the pager code use this trick (clearing the first byte ** of the page 'extra' space to invalidate the Btree layers ** cached parse of the page). MemPage.isInit is marked ** "MUST BE FIRST" for this purpose. */ memcpy(zOut, zIn, nCopy); ((u8 *)sqlite3PagerGetExtra(pDestPg))[0] = 0; } sqlite3PagerUnref(pDestPg); } return rc; } | > > > | 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 | ** and the pager code use this trick (clearing the first byte ** of the page 'extra' space to invalidate the Btree layers ** cached parse of the page). MemPage.isInit is marked ** "MUST BE FIRST" for this purpose. */ memcpy(zOut, zIn, nCopy); ((u8 *)sqlite3PagerGetExtra(pDestPg))[0] = 0; if( iOff==0 && bUpdate==0 ){ sqlite3Put4byte(&zOut[28], sqlite3BtreeLastPage(p->pSrc)); } } sqlite3PagerUnref(pDestPg); } return rc; } |
︙ | ︙ | |||
387 388 389 390 391 392 393 | assert( nSrcPage>=0 ); for(ii=0; (nPage<0 || ii<nPage) && p->iNext<=(Pgno)nSrcPage && !rc; ii++){ const Pgno iSrcPg = p->iNext; /* Source page number */ if( iSrcPg!=PENDING_BYTE_PAGE(p->pSrc->pBt) ){ DbPage *pSrcPg; /* Source page object */ rc = sqlite3PagerGet(pSrcPager, iSrcPg, &pSrcPg); if( rc==SQLITE_OK ){ | | | 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 | assert( nSrcPage>=0 ); for(ii=0; (nPage<0 || ii<nPage) && p->iNext<=(Pgno)nSrcPage && !rc; ii++){ const Pgno iSrcPg = p->iNext; /* Source page number */ if( iSrcPg!=PENDING_BYTE_PAGE(p->pSrc->pBt) ){ DbPage *pSrcPg; /* Source page object */ rc = sqlite3PagerGet(pSrcPager, iSrcPg, &pSrcPg); if( rc==SQLITE_OK ){ rc = backupOnePage(p, iSrcPg, sqlite3PagerGetData(pSrcPg), 0); sqlite3PagerUnref(pSrcPg); } } p->iNext++; } if( rc==SQLITE_OK ){ p->nPagecount = nSrcPage; |
︙ | ︙ | |||
635 636 637 638 639 640 641 | /* The backup process p has already copied page iPage. But now it ** has been modified by a transaction on the source pager. Copy ** the new data into the backup. */ int rc; assert( p->pDestDb ); sqlite3_mutex_enter(p->pDestDb->mutex); | | | 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 | /* The backup process p has already copied page iPage. But now it ** has been modified by a transaction on the source pager. Copy ** the new data into the backup. */ int rc; assert( p->pDestDb ); sqlite3_mutex_enter(p->pDestDb->mutex); rc = backupOnePage(p, iPage, aData, 1); sqlite3_mutex_leave(p->pDestDb->mutex); assert( rc!=SQLITE_BUSY && rc!=SQLITE_LOCKED ); if( rc!=SQLITE_OK ){ p->rc = rc; } } } |
︙ | ︙ |
Changes to test/filefmt.test.
︙ | ︙ | |||
209 210 211 212 213 214 215 216 | sql36231 { DROP TABLE t1 } } {} do_execsql_test filefmt-3.3 { SELECT * FROM sqlite_master; PRAGMA integrity_check; } {ok} finish_test | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 | sql36231 { DROP TABLE t1 } } {} do_execsql_test filefmt-3.3 { SELECT * FROM sqlite_master; PRAGMA integrity_check; } {ok} reset_db do_execsql_test filefmt-4.1 { PRAGMA auto_vacuum = 1; CREATE TABLE t1(x, y); CREATE TABLE t2(x, y); INSERT INTO t1 VALUES(randomblob(100), randomblob(100)); INSERT INTO t1 VALUES(randomblob(100), randomblob(100)); INSERT INTO t1 VALUES(randomblob(100), randomblob(100)); INSERT INTO t1 VALUES(randomblob(100), randomblob(100)); INSERT INTO t1 VALUES(randomblob(100), randomblob(100)); INSERT INTO t1 VALUES(randomblob(100), randomblob(100)); INSERT INTO t2 SELECT randomblob(100), randomblob(100) FROM t1; INSERT INTO t2 SELECT randomblob(100), randomblob(100) FROM t1; INSERT INTO t2 SELECT randomblob(100), randomblob(100) FROM t1; INSERT INTO t2 SELECT randomblob(100), randomblob(100) FROM t1; } do_test filefmt-4.2 { sql36231 { INSERT INTO t2 SELECT * FROM t1 } } {} do_test filefmt-4.3 { forcedelete bak.db db backup bak.db } {} do_test filefmt-4.4 { sqlite3 db2 bak.db db2 eval { PRAGMA integrity_check } } {ok} db2 close finish_test |