/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact 4ee26909f1092239ed39e50d4f4438de11f32275:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
0340: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
0350: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0360: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  Int.h".#include 
0370: 22 77 61 6c 2e 68 22 0a 0a 0a 2f 2a 2a 2a 2a 2a  "wal.h".../*****
0380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e  ************** N
0390: 4f 54 45 53 20 4f 4e 20 54 48 45 20 44 45 53 49  OTES ON THE DESI
03a0: 47 4e 20 4f 46 20 54 48 45 20 50 41 47 45 52 20  GN OF THE PAGER 
03b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
03c0: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  ********.**.** T
03d0: 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62 6c 6f 63  his comment bloc
03e0: 6b 20 64 65 73 63 72 69 62 65 73 20 69 6e 76 61  k describes inva
03f0: 72 69 61 6e 74 73 20 74 68 61 74 20 68 6f 6c 64  riants that hold
0400: 20 77 68 65 6e 20 75 73 69 6e 67 20 61 20 72 6f   when using a ro
0410: 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61  llback.** journa
0420: 6c 2e 20 20 54 68 65 73 65 20 69 6e 76 61 72 69  l.  These invari
0430: 61 6e 74 73 20 64 6f 20 6e 6f 74 20 61 70 70 6c  ants do not appl
0440: 79 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  y for journal_mo
0450: 64 65 3d 57 41 4c 2c 0a 2a 2a 20 6a 6f 75 72 6e  de=WAL,.** journ
0460: 61 6c 5f 6d 6f 64 65 3d 4d 45 4d 4f 52 59 2c 20  al_mode=MEMORY, 
0470: 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  or journal_mode=
0480: 4f 46 46 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69  OFF..**.** Withi
0490: 6e 20 74 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62  n this comment b
04a0: 6c 6f 63 6b 2c 20 61 20 70 61 67 65 20 69 73 20  lock, a page is 
04b0: 64 65 65 6d 65 64 20 74 6f 20 68 61 76 65 20 62  deemed to have b
04c0: 65 65 6e 20 73 79 6e 63 65 64 0a 2a 2a 20 61 75  een synced.** au
04d0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 73  tomatically as s
04e0: 6f 6f 6e 20 61 73 20 69 74 20 69 73 20 77 72 69  oon as it is wri
04f0: 74 74 65 6e 20 77 68 65 6e 20 50 52 41 47 4d 41  tten when PRAGMA
0500: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46   synchronous=OFF
0510: 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
0520: 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
0530: 73 79 6e 63 65 64 20 75 6e 74 69 6c 20 74 68 65  synced until the
0540: 20 78 53 79 6e 63 20 6d 65 74 68 6f 64 20 6f 66   xSync method of
0550: 20 74 68 65 20 56 46 53 0a 2a 2a 20 69 73 20 63   the VFS.** is c
0560: 61 6c 6c 65 64 20 73 75 63 63 65 73 73 66 75 6c  alled successful
0570: 6c 79 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 63  ly on the file c
0580: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 70 61  ontaining the pa
0590: 67 65 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 69 6e 69  ge..**.** Defini
05a0: 74 69 6f 6e 3a 20 20 41 20 70 61 67 65 20 6f 66  tion:  A page of
05b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
05c0: 6c 65 20 69 73 20 73 61 69 64 20 74 6f 20 62 65  le is said to be
05d0: 20 22 6f 76 65 72 77 72 69 74 65 61 62 6c 65 22   "overwriteable"
05e0: 20 69 66 0a 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f   if.** one or mo
05f0: 72 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  re of the follow
0600: 69 6e 67 20 61 72 65 20 74 72 75 65 20 61 62 6f  ing are true abo
0610: 75 74 20 74 68 65 20 70 61 67 65 3a 0a 2a 2a 20  ut the page:.** 
0620: 0a 2a 2a 20 20 20 20 20 28 61 29 20 20 54 68 65  .**     (a)  The
0630: 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e   original conten
0640: 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 73  t of the page as
0650: 20 69 74 20 77 61 73 20 61 74 20 74 68 65 20 62   it was at the b
0660: 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 20  eginning of.**  
0670: 20 20 20 20 20 20 20 20 74 68 65 20 74 72 61 6e          the tran
0680: 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e  saction has been
0690: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
06a0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
06b0: 61 6c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  al and.**       
06c0: 20 20 20 73 79 6e 63 65 64 2e 0a 2a 2a 20 0a 2a     synced..** .*
06d0: 2a 20 20 20 20 20 28 62 29 20 20 54 68 65 20 70  *     (b)  The p
06e0: 61 67 65 20 77 61 73 20 61 20 66 72 65 65 6c 69  age was a freeli
06f0: 73 74 20 6c 65 61 66 20 70 61 67 65 20 61 74 20  st leaf page at 
0700: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
0710: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
0720: 20 0a 2a 2a 20 20 20 20 20 28 63 29 20 20 54 68   .**     (c)  Th
0730: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
0740: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
0750: 65 20 6c 61 72 67 65 73 74 20 70 61 67 65 20 74  e largest page t
0760: 68 61 74 20 65 78 69 73 74 65 64 20 69 6e 0a 2a  hat existed in.*
0770: 2a 20 20 20 20 20 20 20 20 20 20 74 68 65 20 64  *          the d
0780: 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
0790: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
07a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
07b0: 20 0a 2a 2a 20 28 31 29 20 41 20 70 61 67 65 20   .** (1) A page 
07c0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
07d0: 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 6f 76  file is never ov
07e0: 65 72 77 72 69 74 74 65 6e 20 75 6e 6c 65 73 73  erwritten unless
07f0: 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 20   one of the.**  
0800: 20 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65     following are
0810: 20 74 72 75 65 3a 0a 2a 2a 20 0a 2a 2a 20 20 20   true:.** .**   
0820: 20 20 28 61 29 20 54 68 65 20 70 61 67 65 20 61    (a) The page a
0830: 6e 64 20 61 6c 6c 20 6f 74 68 65 72 20 70 61 67  nd all other pag
0840: 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 73  es on the same s
0850: 65 63 74 6f 72 20 61 72 65 20 6f 76 65 72 77 72  ector are overwr
0860: 69 74 65 61 62 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  iteable..** .** 
0870: 20 20 20 20 28 62 29 20 54 68 65 20 61 74 6f 6d      (b) The atom
0880: 69 63 20 70 61 67 65 20 77 72 69 74 65 20 6f 70  ic page write op
0890: 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 65 6e  timization is en
08a0: 61 62 6c 65 64 2c 20 61 6e 64 20 74 68 65 20 65  abled, and the e
08b0: 6e 74 69 72 65 0a 2a 2a 20 20 20 20 20 20 20 20  ntire.**        
08c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 74 68   transaction oth
08d0: 65 72 20 74 68 61 6e 20 74 68 65 20 75 70 64 61  er than the upda
08e0: 74 65 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  te of the transa
08f0: 63 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 0a 2a  ction sequence.*
0900: 2a 20 20 20 20 20 20 20 20 20 6e 75 6d 62 65 72  *         number
0910: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73   consists of a s
0920: 69 6e 67 6c 65 20 70 61 67 65 20 63 68 61 6e 67  ingle page chang
0930: 65 2e 0a 2a 2a 20 0a 2a 2a 20 28 32 29 20 54 68  e..** .** (2) Th
0940: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70  e content of a p
0950: 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  age written into
0960: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
0970: 75 72 6e 61 6c 20 65 78 61 63 74 6c 79 20 6d 61  urnal exactly ma
0980: 74 63 68 65 73 0a 2a 2a 20 20 20 20 20 62 6f 74  tches.**     bot
0990: 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e  h the content in
09a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 68   the database wh
09b0: 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
09c0: 6a 6f 75 72 6e 61 6c 20 77 61 73 20 77 72 69 74  journal was writ
09d0: 74 65 6e 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74  ten.**     and t
09e0: 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e 20 74 68  he content in th
09f0: 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74 68  e database at th
0a00: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
0a10: 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 20 20  he current.**   
0a20: 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a    transaction..*
0a30: 2a 20 0a 2a 2a 20 28 33 29 20 57 72 69 74 65 73  * .** (3) Writes
0a40: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
0a50: 20 66 69 6c 65 20 61 72 65 20 61 6e 20 69 6e 74   file are an int
0a60: 65 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66  eger multiple of
0a70: 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a   the page size.*
0a80: 2a 20 20 20 20 20 69 6e 20 6c 65 6e 67 74 68 20  *     in length 
0a90: 61 6e 64 20 61 72 65 20 61 6c 69 67 6e 65 64 20  and are aligned 
0aa0: 6f 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61  on a page bounda
0ab0: 72 79 2e 0a 2a 2a 20 0a 2a 2a 20 28 34 29 20 52  ry..** .** (4) R
0ac0: 65 61 64 73 20 66 72 6f 6d 20 74 68 65 20 64 61  eads from the da
0ad0: 74 61 62 61 73 65 20 66 69 6c 65 20 61 72 65 20  tabase file are 
0ae0: 65 69 74 68 65 72 20 61 6c 69 67 6e 65 64 20 6f  either aligned o
0af0: 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61 72  n a page boundar
0b00: 79 20 61 6e 64 0a 2a 2a 20 20 20 20 20 61 6e 20  y and.**     an 
0b10: 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65  integer multiple
0b20: 20 6f 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   of the page siz
0b30: 65 20 69 6e 20 6c 65 6e 67 74 68 20 6f 72 20 61  e in length or a
0b40: 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68  re taken from th
0b50: 65 0a 2a 2a 20 20 20 20 20 66 69 72 73 74 20 31  e.**     first 1
0b60: 30 30 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  00 bytes of the 
0b70: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
0b80: 2a 20 0a 2a 2a 20 28 35 29 20 41 6c 6c 20 77 72  * .** (5) All wr
0b90: 69 74 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  ites to the data
0ba0: 62 61 73 65 20 66 69 6c 65 20 61 72 65 20 73 79  base file are sy
0bb0: 6e 63 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  nced prior to th
0bc0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
0bd0: 61 6c 0a 2a 2a 20 20 20 20 20 62 65 69 6e 67 20  al.**     being 
0be0: 64 65 6c 65 74 65 64 2c 20 74 72 75 6e 63 61 74  deleted, truncat
0bf0: 65 64 2c 20 6f 72 20 7a 65 72 6f 65 64 2e 0a 2a  ed, or zeroed..*
0c00: 2a 20 0a 2a 2a 20 28 36 29 20 49 66 20 61 20 6d  * .** (6) If a m
0c10: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
0c20: 6c 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 6e  le is used, then
0c30: 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 74   all writes to t
0c40: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
0c50: 0a 2a 2a 20 20 20 20 20 61 72 65 20 73 79 6e 63  .**     are sync
0c60: 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
0c70: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 62  master journal b
0c80: 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a  eing deleted..**
0c90: 20 0a 2a 2a 20 44 65 66 69 6e 69 74 69 6f 6e 3a   .** Definition:
0ca0: 20 54 77 6f 20 64 61 74 61 62 61 73 65 73 20 28   Two databases (
0cb0: 6f 72 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  or the same data
0cc0: 62 61 73 65 20 61 74 20 74 77 6f 20 70 6f 69 6e  base at two poin
0cd0: 74 73 20 69 74 20 74 69 6d 65 29 0a 2a 2a 20 61  ts it time).** a
0ce0: 72 65 20 73 61 69 64 20 74 6f 20 62 65 20 22 6c  re said to be "l
0cf0: 6f 67 69 63 61 6c 6c 79 20 65 71 75 69 76 61 6c  ogically equival
0d00: 65 6e 74 22 20 69 66 20 74 68 65 79 20 67 69 76  ent" if they giv
0d10: 65 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65  e the same answe
0d20: 72 20 74 6f 0a 2a 2a 20 61 6c 6c 20 71 75 65 72  r to.** all quer
0d30: 69 65 73 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61  ies.  Note in pa
0d40: 72 74 69 63 75 6c 61 72 20 74 68 65 20 74 68 65  rticular the the
0d50: 20 63 6f 6e 74 65 6e 74 20 6f 66 20 66 72 65 65   content of free
0d60: 6c 69 73 74 20 6c 65 61 66 0a 2a 2a 20 70 61 67  list leaf.** pag
0d70: 65 73 20 63 61 6e 20 62 65 20 63 68 61 6e 67 65  es can be change
0d80: 64 20 61 72 62 69 74 61 72 69 6c 79 20 77 69 74  d arbitarily wit
0d90: 68 6f 75 74 20 65 66 66 65 63 74 69 6e 67 20 74  hout effecting t
0da0: 68 65 20 6c 6f 67 69 63 61 6c 20 65 71 75 69 76  he logical equiv
0db0: 61 6c 65 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 65  alence.** of the
0dc0: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 0a 2a   database..** .*
0dd0: 2a 20 28 37 29 20 41 74 20 61 6e 79 20 74 69 6d  * (7) At any tim
0de0: 65 2c 20 69 66 20 61 6e 79 20 73 75 62 73 65 74  e, if any subset
0df0: 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20  , including the 
0e00: 65 6d 70 74 79 20 73 65 74 20 61 6e 64 20 74 68  empty set and th
0e10: 65 20 74 6f 74 61 6c 20 73 65 74 2c 0a 2a 2a 20  e total set,.** 
0e20: 20 20 20 20 6f 66 20 74 68 65 20 75 6e 73 79 6e      of the unsyn
0e30: 63 65 64 20 63 68 61 6e 67 65 73 20 74 6f 20 61  ced changes to a
0e40: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
0e50: 6c 20 61 72 65 20 72 65 6d 6f 76 65 64 20 61 6e  l are removed an
0e60: 64 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 6a 6f  d the .**     jo
0e70: 75 72 6e 61 6c 20 69 73 20 72 6f 6c 6c 65 64 20  urnal is rolled 
0e80: 62 61 63 6b 2c 20 74 68 65 20 72 65 73 75 6c 74  back, the result
0e90: 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c  ing database fil
0ea0: 65 20 77 69 6c 6c 20 62 65 20 6c 6f 67 69 63 61  e will be logica
0eb0: 6c 0a 2a 2a 20 20 20 20 20 65 71 75 69 76 61 6c  l.**     equival
0ec0: 65 6e 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  ent to the datab
0ed0: 61 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 20  ase file at the 
0ee0: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
0ef0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
0f00: 20 0a 2a 2a 20 28 38 29 20 57 68 65 6e 20 61 20   .** (8) When a 
0f10: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
0f20: 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20  olled back, the 
0f30: 78 54 72 75 6e 63 61 74 65 20 6d 65 74 68 6f 64  xTruncate method
0f40: 20 6f 66 20 74 68 65 20 56 46 53 0a 2a 2a 20 20   of the VFS.**  
0f50: 20 20 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20     is called to 
0f60: 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61  restore the data
0f70: 62 61 73 65 20 66 69 6c 65 20 74 6f 20 74 68 65  base file to the
0f80: 20 73 61 6d 65 20 73 69 7a 65 20 69 74 20 77 61   same size it wa
0f90: 73 20 61 74 0a 2a 2a 20 20 20 20 20 74 68 65 20  s at.**     the 
0fa0: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
0fb0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 28   transaction.  (
0fc0: 49 6e 20 73 6f 6d 65 20 56 46 53 65 73 2c 20 74  In some VFSes, t
0fd0: 68 65 20 78 54 72 75 6e 63 61 74 65 0a 2a 2a 20  he xTruncate.** 
0fe0: 20 20 20 20 6d 65 74 68 6f 64 20 69 73 20 61 20      method is a 
0ff0: 6e 6f 2d 6f 70 2c 20 62 75 74 20 74 68 61 74 20  no-op, but that 
1000: 64 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 20  does not change 
1010: 74 68 65 20 66 61 63 74 20 74 68 65 20 53 51 4c  the fact the SQL
1020: 69 74 65 20 77 69 6c 6c 0a 2a 2a 20 20 20 20 20  ite will.**     
1030: 69 6e 76 6f 6b 65 20 69 74 2e 29 0a 2a 2a 20 0a  invoke it.).** .
1040: 2a 2a 20 28 39 29 20 57 68 65 6e 65 76 65 72 20  ** (9) Whenever 
1050: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1060: 65 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 61  e is modified, a
1070: 74 20 6c 65 61 73 74 20 6f 6e 65 20 62 69 74 20  t least one bit 
1080: 69 6e 20 74 68 65 20 72 61 6e 67 65 0a 2a 2a 20  in the range.** 
1090: 20 20 20 20 6f 66 20 62 79 74 65 73 20 66 72 6f      of bytes fro
10a0: 6d 20 32 34 20 74 68 72 6f 75 67 68 20 33 39 20  m 24 through 39 
10b0: 69 6e 63 6c 75 73 69 76 65 20 77 69 6c 6c 20 62  inclusive will b
10c0: 65 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20  e changed prior 
10d0: 74 6f 20 72 65 6c 65 61 73 69 6e 67 0a 2a 2a 20  to releasing.** 
10e0: 20 20 20 20 74 68 65 20 45 58 43 4c 55 53 49 56      the EXCLUSIV
10f0: 45 20 6c 6f 63 6b 2c 20 74 68 75 73 20 73 69 67  E lock, thus sig
1100: 6e 61 6c 69 6e 67 20 6f 74 68 65 72 20 63 6f 6e  naling other con
1110: 6e 65 63 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20  nections on the 
1120: 73 61 6d 65 0a 2a 2a 20 20 20 20 20 64 61 74 61  same.**     data
1130: 62 61 73 65 20 74 6f 20 66 6c 75 73 68 20 74 68  base to flush th
1140: 65 69 72 20 63 61 63 68 65 73 2e 0a 2a 2a 0a 2a  eir caches..**.*
1150: 2a 20 28 31 30 29 20 54 68 65 20 70 61 74 74 65  * (10) The patte
1160: 72 6e 20 6f 66 20 62 69 74 73 20 69 6e 20 62 79  rn of bits in by
1170: 74 65 73 20 32 34 20 74 68 72 6f 75 67 68 20 33  tes 24 through 3
1180: 39 20 73 68 61 6c 6c 20 6e 6f 74 20 72 65 70 65  9 shall not repe
1190: 61 74 20 69 6e 20 6c 65 73 73 0a 2a 2a 20 20 20  at in less.**   
11a0: 20 20 20 74 68 61 6e 20 6f 6e 65 20 62 69 6c 6c     than one bill
11b0: 69 6f 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ion transactions
11c0: 2e 0a 2a 2a 0a 2a 2a 20 28 31 31 29 20 41 20 64  ..**.** (11) A d
11d0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
11e0: 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 61 74 20 74  well-formed at t
11f0: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 61 6e 64  he beginning and
1200: 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69   at the conclusi
1210: 6f 6e 0a 2a 2a 20 20 20 20 20 20 6f 66 20 65 76  on.**      of ev
1220: 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ery transaction.
1230: 0a 2a 2a 0a 2a 2a 20 28 31 32 29 20 41 6e 20 45  .**.** (12) An E
1240: 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73  XCLUSIVE lock is
1250: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
1260: 61 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20  abase file when 
1270: 77 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 20 20  writing to.**   
1280: 20 20 20 74 68 65 20 64 61 74 61 62 61 73 65 20     the database 
1290: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 28 31 33 29  file..**.** (13)
12a0: 20 41 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69   A SHARED lock i
12b0: 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61  s held on the da
12c0: 74 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 6c  tabase file whil
12d0: 65 20 72 65 61 64 69 6e 67 20 61 6e 79 0a 2a 2a  e reading any.**
12e0: 20 20 20 20 20 20 63 6f 6e 74 65 6e 74 20 6f 75        content ou
12f0: 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  t of the databas
1300: 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a  e file..**.*****
1310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1350: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a  *********/../*.*
1360: 2a 20 4d 61 63 72 6f 73 20 66 6f 72 20 74 72 6f  * Macros for tro
1370: 75 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20 20 4e  ubleshooting.  N
1380: 6f 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64 20 6f  ormally turned o
1390: 66 66 0a 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20  ff.*/.#if 0.int 
13a0: 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 61 63  sqlite3PagerTrac
13b0: 65 3d 31 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f  e=1;  /* True to
13c0: 20 65 6e 61 62 6c 65 20 74 72 61 63 69 6e 67 20   enable tracing 
13d0: 2a 2f 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74  */.#define sqlit
13e0: 65 33 44 65 62 75 67 50 72 69 6e 74 66 20 70 72  e3DebugPrintf pr
13f0: 69 6e 74 66 0a 23 64 65 66 69 6e 65 20 50 41 47  intf.#define PAG
1400: 45 52 54 52 41 43 45 28 58 29 20 20 20 20 20 69  ERTRACE(X)     i
1410: 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 54  f( sqlite3PagerT
1420: 72 61 63 65 20 29 7b 20 73 71 6c 69 74 65 33 44  race ){ sqlite3D
1430: 65 62 75 67 50 72 69 6e 74 66 20 58 3b 20 7d 0a  ebugPrintf X; }.
1440: 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 50 41  #else.#define PA
1450: 47 45 52 54 52 41 43 45 28 58 29 0a 23 65 6e 64  GERTRACE(X).#end
1460: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  if../*.** The fo
1470: 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61 63 72  llowing two macr
1480: 6f 73 20 61 72 65 20 75 73 65 64 20 77 69 74 68  os are used with
1490: 69 6e 20 74 68 65 20 50 41 47 45 52 54 52 41 43  in the PAGERTRAC
14a0: 45 28 29 20 6d 61 63 72 6f 73 20 61 62 6f 76 65  E() macros above
14b0: 0a 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f 75 74  .** to print out
14c0: 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72   file-descriptor
14d0: 73 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45 52 49  s. .**.** PAGERI
14e0: 44 28 29 20 74 61 6b 65 73 20 61 20 70 6f 69 6e  D() takes a poin
14f0: 74 65 72 20 74 6f 20 61 20 50 61 67 65 72 20 73  ter to a Pager s
1500: 74 72 75 63 74 20 61 73 20 69 74 73 20 61 72 67  truct as its arg
1510: 75 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20 61 73  ument. The.** as
1520: 73 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 64 65  sociated file-de
1530: 73 63 72 69 70 74 6f 72 20 69 73 20 72 65 74 75  scriptor is retu
1540: 72 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44 4c 45  rned. FILEHANDLE
1550: 49 44 28 29 20 74 61 6b 65 73 20 61 6e 20 73 71  ID() takes an sq
1560: 6c 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20 73 74  lite3_file.** st
1570: 72 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75  ruct as its argu
1580: 6d 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  ment..*/.#define
1590: 20 50 41 47 45 52 49 44 28 70 29 20 28 28 69 6e   PAGERID(p) ((in
15a0: 74 29 28 70 2d 3e 66 64 29 29 0a 23 64 65 66 69  t)(p->fd)).#defi
15b0: 6e 65 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28  ne FILEHANDLEID(
15c0: 66 64 29 20 28 28 69 6e 74 29 66 64 29 0a 0a 2f  fd) ((int)fd)../
15d0: 2a 0a 2a 2a 20 54 68 65 20 50 61 67 65 72 2e 65  *.** The Pager.e
15e0: 53 74 61 74 65 20 76 61 72 69 61 62 6c 65 20 73  State variable s
15f0: 74 6f 72 65 73 20 74 68 65 20 63 75 72 72 65 6e  tores the curren
1600: 74 20 27 73 74 61 74 65 27 20 6f 66 20 61 20 70  t 'state' of a p
1610: 61 67 65 72 2e 20 41 0a 2a 2a 20 70 61 67 65 72  ager. A.** pager
1620: 20 6d 61 79 20 62 65 20 69 6e 20 61 6e 79 20 6f   may be in any o
1630: 6e 65 20 6f 66 20 74 68 65 20 73 65 76 65 6e 20  ne of the seven 
1640: 73 74 61 74 65 73 20 73 68 6f 77 6e 20 69 6e 20  states shown in 
1650: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a  the following.**
1660: 20 73 74 61 74 65 20 64 69 61 67 72 61 6d 2e 0a   state diagram..
1670: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  **.**           
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1690: 20 4f 50 45 4e 20 3c 2d 2d 2d 2d 2d 2d 2b 2d 2d   OPEN <------+--
16a0: 2d 2d 2d 2d 2b 0a 2a 2a 20 20 20 20 20 20 20 20  ----+.**        
16b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c0: 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20        |         
16d0: 7c 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20  |      |.**     
16e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f0: 20 20 20 20 20 20 20 20 20 56 20 20 20 20 20 20           V      
1700: 20 20 20 7c 20 20 20 20 20 20 7c 0a 2a 2a 20 20     |      |.**  
1710: 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 2d 2d               +--
1720: 2d 2d 2d 2d 2d 2d 2d 3e 20 52 45 41 44 45 52 2d  -------> READER-
1730: 2d 2d 2d 2d 2d 2d 2b 20 20 20 20 20 20 7c 0a 2a  ------+      |.*
1740: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1750: 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c  |              |
1760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1770: 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  |.**            
1780: 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20     |            
1790: 20 20 56 20 20 20 20 20 20 20 20 20 20 20 20 20    V             
17a0: 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20     |.**         
17b0: 20 20 20 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d 2d 57        |<-------W
17c0: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 2d 2d 2d 2d  RITER_LOCKED----
17d0: 2d 2d 3e 20 45 52 52 4f 52 0a 2a 2a 20 20 20 20  --> ERROR.**    
17e0: 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20             |    
17f0: 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20            |     
1800: 20 20 20 20 20 20 20 20 20 20 20 5e 20 20 0a 2a             ^  .*
1810: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1820: 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56  |              V
1830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1840: 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  |.**            
1850: 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d 57 52 49 54 45     |<------WRITE
1860: 52 5f 43 41 43 48 45 4d 4f 44 2d 2d 2d 2d 2d 2d  R_CACHEMOD------
1870: 2d 2d 3e 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20  -->|.**         
1880: 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20        |         
1890: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20       |          
18a0: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
18b0: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
18c0: 20 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20          V       
18d0: 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20           |.**   
18e0: 20 20 20 20 20 20 20 20 20 20 20 20 7c 3c 2d 2d              |<--
18f0: 2d 2d 2d 2d 2d 57 52 49 54 45 52 5f 44 42 4d 4f  -----WRITER_DBMO
1900: 44 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 3e 7c 0a 2a 2a  D---------->|.**
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1940: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1950: 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20    |             
1960: 20 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20   V              
1970: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
1980: 20 20 20 20 20 2b 3c 2d 2d 2d 2d 2d 2d 57 52 49       +<------WRI
1990: 54 45 52 5f 46 49 4e 49 53 48 45 44 2d 2d 2d 2d  TER_FINISHED----
19a0: 2d 2d 2d 2d 3e 2b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20  ---->+.**.**.** 
19b0: 4c 69 73 74 20 6f 66 20 73 74 61 74 65 20 74 72  List of state tr
19c0: 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68  ansitions and th
19d0: 65 20 43 20 5b 66 75 6e 63 74 69 6f 6e 5d 20 74  e C [function] t
19e0: 68 61 74 20 70 65 72 66 6f 72 6d 73 20 65 61 63  hat performs eac
19f0: 68 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 4f 50 45 4e  h:.** .**   OPEN
1a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 3e                ->
1a10: 20 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20   READER         
1a20: 20 20 20 20 20 5b 73 71 6c 69 74 65 33 50 61 67       [sqlite3Pag
1a30: 65 72 53 68 61 72 65 64 4c 6f 63 6b 5d 0a 2a 2a  erSharedLock].**
1a40: 20 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20     READER       
1a50: 20 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20       -> OPEN    
1a60: 20 20 20 20 20 20 20 20 20 20 20 20 5b 70 61 67              [pag
1a70: 65 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 0a 2a 2a  er_unlock].**.**
1a80: 20 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20     READER       
1a90: 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 4c       -> WRITER_L
1aa0: 4f 43 4b 45 44 20 20 20 20 20 20 20 5b 73 71 6c  OCKED       [sql
1ab0: 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 5d 0a  ite3PagerBegin].
1ac0: 2a 2a 20 20 20 57 52 49 54 45 52 5f 4c 4f 43 4b  **   WRITER_LOCK
1ad0: 45 44 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52  ED     -> WRITER
1ae0: 5f 43 41 43 48 45 4d 4f 44 20 20 20 20 20 5b 70  _CACHEMOD     [p
1af0: 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  ager_open_journa
1b00: 6c 5d 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 43  l].**   WRITER_C
1b10: 41 43 48 45 4d 4f 44 20 20 20 2d 3e 20 57 52 49  ACHEMOD   -> WRI
1b20: 54 45 52 5f 44 42 4d 4f 44 20 20 20 20 20 20 20  TER_DBMOD       
1b30: 20 5b 73 79 6e 63 4a 6f 75 72 6e 61 6c 5d 0a 2a   [syncJournal].*
1b40: 2a 20 20 20 57 52 49 54 45 52 5f 44 42 4d 4f 44  *   WRITER_DBMOD
1b50: 20 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f        -> WRITER_
1b60: 46 49 4e 49 53 48 45 44 20 20 20 20 20 5b 73 71  FINISHED     [sq
1b70: 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
1b80: 50 68 61 73 65 4f 6e 65 5d 0a 2a 2a 20 20 20 57  PhaseOne].**   W
1b90: 52 49 54 45 52 5f 2a 2a 2a 20 20 20 20 20 20 20  RITER_***       
1ba0: 20 2d 3e 20 52 45 41 44 45 52 20 20 20 20 20 20   -> READER      
1bb0: 20 20 20 20 20 20 20 20 5b 70 61 67 65 72 5f 65          [pager_e
1bc0: 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 5d 0a  nd_transaction].
1bd0: 2a 2a 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 2a  **.**   WRITER_*
1be0: 2a 2a 20 20 20 20 20 20 20 20 2d 3e 20 45 52 52  **        -> ERR
1bf0: 4f 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20  OR              
1c00: 20 5b 70 61 67 65 72 5f 65 72 72 6f 72 5d 0a 2a   [pager_error].*
1c10: 2a 20 20 20 45 52 52 4f 52 20 20 20 20 20 20 20  *   ERROR       
1c20: 20 20 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20        -> OPEN   
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 70 61               [pa
1c40: 67 65 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 20 0a  ger_unlock].** .
1c50: 2a 2a 0a 2a 2a 20 20 4f 50 45 4e 3a 0a 2a 2a 0a  **.**  OPEN:.**.
1c60: 2a 2a 20 20 20 20 54 68 65 20 70 61 67 65 72 20  **    The pager 
1c70: 73 74 61 72 74 73 20 75 70 20 69 6e 20 74 68 69  starts up in thi
1c80: 73 20 73 74 61 74 65 2e 20 4e 6f 74 68 69 6e 67  s state. Nothing
1c90: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 69   is guaranteed i
1ca0: 6e 20 74 68 69 73 0a 2a 2a 20 20 20 20 73 74 61  n this.**    sta
1cb0: 74 65 20 2d 20 74 68 65 20 66 69 6c 65 20 6d 61  te - the file ma
1cc0: 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20  y or may not be 
1cd0: 6c 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 20 64  locked and the d
1ce0: 61 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 0a  atabase size is.
1cf0: 2a 2a 20 20 20 20 75 6e 6b 6e 6f 77 6e 2e 20 54  **    unknown. T
1d00: 68 65 20 64 61 74 61 62 61 73 65 20 6d 61 79 20  he database may 
1d10: 6e 6f 74 20 62 65 20 72 65 61 64 20 6f 72 20 77  not be read or w
1d20: 72 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  ritten..**.**   
1d30: 20 2a 20 4e 6f 20 72 65 61 64 20 6f 72 20 77 72   * No read or wr
1d40: 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
1d50: 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20  is active..**   
1d60: 20 2a 20 41 6e 79 20 6c 6f 63 6b 2c 20 6f 72 20   * Any lock, or 
1d70: 6e 6f 20 6c 6f 63 6b 20 61 74 20 61 6c 6c 2c 20  no lock at all, 
1d80: 6d 61 79 20 62 65 20 68 65 6c 64 20 6f 6e 20 74  may be held on t
1d90: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1da0: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 64 62  ..**    * The db
1db0: 53 69 7a 65 2c 20 64 62 4f 72 69 67 53 69 7a 65  Size, dbOrigSize
1dc0: 20 61 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20   and dbFileSize 
1dd0: 76 61 72 69 61 62 6c 65 73 20 6d 61 79 20 6e 6f  variables may no
1de0: 74 20 62 65 20 74 72 75 73 74 65 64 2e 0a 2a 2a  t be trusted..**
1df0: 0a 2a 2a 20 20 52 45 41 44 45 52 3a 0a 2a 2a 0a  .**  READER:.**.
1e00: 2a 2a 20 20 20 20 49 6e 20 74 68 69 73 20 73 74  **    In this st
1e10: 61 74 65 20 61 6c 6c 20 74 68 65 20 72 65 71 75  ate all the requ
1e20: 69 72 65 6d 65 6e 74 73 20 66 6f 72 20 72 65 61  irements for rea
1e30: 64 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ding the databas
1e40: 65 20 69 6e 20 0a 2a 2a 20 20 20 20 72 6f 6c 6c  e in .**    roll
1e50: 62 61 63 6b 20 28 6e 6f 6e 2d 57 41 4c 29 20 6d  back (non-WAL) m
1e60: 6f 64 65 20 61 72 65 20 6d 65 74 2e 20 55 6e 6c  ode are met. Unl
1e70: 65 73 73 20 74 68 65 20 70 61 67 65 72 20 69 73  ess the pager is
1e80: 20 28 6f 72 20 72 65 63 65 6e 74 6c 79 0a 2a 2a   (or recently.**
1e90: 20 20 20 20 77 61 73 29 20 69 6e 20 65 78 63 6c      was) in excl
1ea0: 75 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f  usive-locking mo
1eb0: 64 65 2c 20 61 20 75 73 65 72 2d 6c 65 76 65 6c  de, a user-level
1ec0: 20 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f   read transactio
1ed0: 6e 20 69 73 20 0a 2a 2a 20 20 20 20 6f 70 65 6e  n is .**    open
1ee0: 2e 20 54 68 65 20 64 61 74 61 62 61 73 65 20 73  . The database s
1ef0: 69 7a 65 20 69 73 20 6b 6e 6f 77 6e 20 69 6e 20  ize is known in 
1f00: 74 68 69 73 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a  this state..**.*
1f10: 2a 20 20 20 20 41 20 63 6f 6e 6e 65 63 74 69 6f  *    A connectio
1f20: 6e 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 6c  n running with l
1f30: 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d  ocking_mode=norm
1f40: 61 6c 20 65 6e 74 65 72 73 20 74 68 69 73 20 73  al enters this s
1f50: 74 61 74 65 20 77 68 65 6e 0a 2a 2a 20 20 20 20  tate when.**    
1f60: 69 74 20 6f 70 65 6e 73 20 61 20 72 65 61 64 2d  it opens a read-
1f70: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74  transaction on t
1f80: 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  he database and 
1f90: 72 65 74 75 72 6e 73 20 74 6f 20 73 74 61 74 65  returns to state
1fa0: 0a 2a 2a 20 20 20 20 4f 50 45 4e 20 61 66 74 65  .**    OPEN afte
1fb0: 72 20 74 68 65 20 72 65 61 64 2d 74 72 61 6e 73  r the read-trans
1fc0: 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 70 6c 65  action is comple
1fd0: 74 65 64 2e 20 48 6f 77 65 76 65 72 20 61 20 63  ted. However a c
1fe0: 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 20 20 20  onnection.**    
1ff0: 72 75 6e 6e 69 6e 67 20 69 6e 20 6c 6f 63 6b 69  running in locki
2000: 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76  ng_mode=exclusiv
2010: 65 20 28 69 6e 63 6c 75 64 69 6e 67 20 74 65 6d  e (including tem
2020: 70 20 64 61 74 61 62 61 73 65 73 29 20 72 65 6d  p databases) rem
2030: 61 69 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 74 68  ains in.**    th
2040: 69 73 20 73 74 61 74 65 20 65 76 65 6e 20 61 66  is state even af
2050: 74 65 72 20 74 68 65 20 72 65 61 64 2d 74 72 61  ter the read-tra
2060: 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6c 6f 73  nsaction is clos
2070: 65 64 2e 20 54 68 65 20 6f 6e 6c 79 20 77 61 79  ed. The only way
2080: 0a 2a 2a 20 20 20 20 61 20 6c 6f 63 6b 69 6e 67  .**    a locking
2090: 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20  _mode=exclusive 
20a0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 61 6e 20 74  connection can t
20b0: 72 61 6e 73 69 74 69 6f 6e 20 66 72 6f 6d 20 52  ransition from R
20c0: 45 41 44 45 52 20 74 6f 20 4f 50 45 4e 0a 2a 2a  EADER to OPEN.**
20d0: 20 20 20 20 69 73 20 76 69 61 20 74 68 65 20 45      is via the E
20e0: 52 52 4f 52 20 73 74 61 74 65 20 28 73 65 65 20  RROR state (see 
20f0: 62 65 6c 6f 77 29 2e 0a 2a 2a 20 0a 2a 2a 20 20  below)..** .**  
2100: 20 20 2a 20 41 20 72 65 61 64 20 74 72 61 6e 73    * A read trans
2110: 61 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 61 63  action may be ac
2120: 74 69 76 65 20 28 62 75 74 20 61 20 77 72 69 74  tive (but a writ
2130: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61  e-transaction ca
2140: 6e 6e 6f 74 29 2e 0a 2a 2a 20 20 20 20 2a 20 41  nnot)..**    * A
2150: 20 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74   SHARED or great
2160: 65 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20  er lock is held 
2170: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
2180: 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54 68  file..**    * Th
2190: 65 20 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c  e dbSize variabl
21a0: 65 20 6d 61 79 20 62 65 20 74 72 75 73 74 65 64  e may be trusted
21b0: 20 28 65 76 65 6e 20 69 66 20 61 20 75 73 65 72   (even if a user
21c0: 2d 6c 65 76 65 6c 20 72 65 61 64 20 0a 2a 2a 20  -level read .** 
21d0: 20 20 20 20 20 74 72 61 6e 73 61 63 74 69 6f 6e       transaction
21e0: 20 69 73 20 6e 6f 74 20 61 63 74 69 76 65 29 2e   is not active).
21f0: 20 54 68 65 20 64 62 4f 72 69 67 53 69 7a 65 20   The dbOrigSize 
2200: 61 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 76  and dbFileSize v
2210: 61 72 69 61 62 6c 65 73 0a 2a 2a 20 20 20 20 20  ariables.**     
2220: 20 6d 61 79 20 6e 6f 74 20 62 65 20 74 72 75 73   may not be trus
2230: 74 65 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e  ted at this poin
2240: 74 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20 74 68  t..**    * If th
2250: 65 20 64 61 74 61 62 61 73 65 20 69 73 20 61 20  e database is a 
2260: 57 41 4c 20 64 61 74 61 62 61 73 65 2c 20 74 68  WAL database, th
2270: 65 6e 20 74 68 65 20 57 41 4c 20 63 6f 6e 6e 65  en the WAL conne
2280: 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2e 0a 2a  ction is open..*
2290: 2a 20 20 20 20 2a 20 45 76 65 6e 20 69 66 20 61  *    * Even if a
22a0: 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
22b0: 6e 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 69  n is not open, i
22c0: 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  t is guaranteed 
22d0: 74 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 74 68  that .**      th
22e0: 65 72 65 20 69 73 20 6e 6f 20 68 6f 74 2d 6a 6f  ere is no hot-jo
22f0: 75 72 6e 61 6c 20 69 6e 20 74 68 65 20 66 69 6c  urnal in the fil
2300: 65 2d 73 79 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20  e-system..**.** 
2310: 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 3a 0a   WRITER_LOCKED:.
2320: 2a 2a 0a 2a 2a 20 20 20 20 54 68 65 20 70 61 67  **.**    The pag
2330: 65 72 20 6d 6f 76 65 73 20 74 6f 20 74 68 69 73  er moves to this
2340: 20 73 74 61 74 65 20 66 72 6f 6d 20 52 45 41 44   state from READ
2350: 45 52 20 77 68 65 6e 20 61 20 77 72 69 74 65 2d  ER when a write-
2360: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20  transaction.**  
2370: 20 20 69 73 20 66 69 72 73 74 20 6f 70 65 6e 65    is first opene
2380: 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
2390: 65 2e 20 49 6e 20 57 52 49 54 45 52 5f 4c 4f 43  e. In WRITER_LOC
23a0: 4b 45 44 20 73 74 61 74 65 2c 20 61 6c 6c 20 6c  KED state, all l
23b0: 6f 63 6b 73 20 0a 2a 2a 20 20 20 20 72 65 71 75  ocks .**    requ
23c0: 69 72 65 64 20 74 6f 20 73 74 61 72 74 20 61 20  ired to start a 
23d0: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
23e0: 6e 20 61 72 65 20 68 65 6c 64 2c 20 62 75 74 20  n are held, but 
23f0: 6e 6f 20 61 63 74 75 61 6c 20 0a 2a 2a 20 20 20  no actual .**   
2400: 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73 20 74   modifications t
2410: 6f 20 74 68 65 20 63 61 63 68 65 20 6f 72 20 64  o the cache or d
2420: 61 74 61 62 61 73 65 20 68 61 76 65 20 74 61 6b  atabase have tak
2430: 65 6e 20 70 6c 61 63 65 2e 0a 2a 2a 0a 2a 2a 20  en place..**.** 
2440: 20 20 20 49 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d     In rollback m
2450: 6f 64 65 2c 20 61 20 52 45 53 45 52 56 45 44 20  ode, a RESERVED 
2460: 6f 72 20 28 69 66 20 74 68 65 20 74 72 61 6e 73  or (if the trans
2470: 61 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65  action was opene
2480: 64 20 77 69 74 68 20 0a 2a 2a 20 20 20 20 42 45  d with .**    BE
2490: 47 49 4e 20 45 58 43 4c 55 53 49 56 45 29 20 45  GIN EXCLUSIVE) E
24a0: 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73  XCLUSIVE lock is
24b0: 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65   obtained on the
24c0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
24d0: 68 65 6e 0a 2a 2a 20 20 20 20 6d 6f 76 69 6e 67  hen.**    moving
24e0: 20 74 6f 20 74 68 69 73 20 73 74 61 74 65 2c 20   to this state, 
24f0: 62 75 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  but the journal 
2500: 66 69 6c 65 20 69 73 20 6e 6f 74 20 77 72 69 74  file is not writ
2510: 74 65 6e 20 74 6f 20 6f 72 20 6f 70 65 6e 65 64  ten to or opened
2520: 20 0a 2a 2a 20 20 20 20 74 6f 20 69 6e 20 74 68   .**    to in th
2530: 69 73 20 73 74 61 74 65 2e 20 49 66 20 74 68 65  is state. If the
2540: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
2550: 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c  committed or rol
2560: 6c 65 64 20 62 61 63 6b 20 77 68 69 6c 65 20 0a  led back while .
2570: 2a 2a 20 20 20 20 69 6e 20 57 52 49 54 45 52 5f  **    in WRITER_
2580: 4c 4f 43 4b 45 44 20 73 74 61 74 65 2c 20 61 6c  LOCKED state, al
2590: 6c 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72  l that is requir
25a0: 65 64 20 69 73 20 74 6f 20 75 6e 6c 6f 63 6b 20  ed is to unlock 
25b0: 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a  the database .**
25c0: 20 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20      file..**.** 
25d0: 20 20 20 49 4e 20 57 41 4c 20 6d 6f 64 65 2c 20     IN WAL mode, 
25e0: 57 61 6c 42 65 67 69 6e 57 72 69 74 65 54 72 61  WalBeginWriteTra
25f0: 6e 73 61 63 74 69 6f 6e 28 29 20 69 73 20 63 61  nsaction() is ca
2600: 6c 6c 65 64 20 74 6f 20 6c 6f 63 6b 20 74 68 65  lled to lock the
2610: 20 6c 6f 67 20 66 69 6c 65 2e 0a 2a 2a 20 20 20   log file..**   
2620: 20 49 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   If the connecti
2630: 6f 6e 20 69 73 20 72 75 6e 6e 69 6e 67 20 77 69  on is running wi
2640: 74 68 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  th locking_mode=
2650: 65 78 63 6c 75 73 69 76 65 2c 20 61 6e 20 61 74  exclusive, an at
2660: 74 65 6d 70 74 0a 2a 2a 20 20 20 20 69 73 20 6d  tempt.**    is m
2670: 61 64 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e  ade to obtain an
2680: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
2690: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
26a0: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a  file..**.**    *
26b0: 20 41 20 77 72 69 74 65 20 74 72 61 6e 73 61 63   A write transac
26c0: 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a  tion is active..
26d0: 2a 2a 20 20 20 20 2a 20 49 66 20 74 68 65 20 63  **    * If the c
26e0: 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70 65  onnection is ope
26f0: 6e 20 69 6e 20 72 6f 6c 6c 62 61 63 6b 2d 6d 6f  n in rollback-mo
2700: 64 65 2c 20 61 20 52 45 53 45 52 56 45 44 20 6f  de, a RESERVED o
2710: 72 20 67 72 65 61 74 65 72 20 0a 2a 2a 20 20 20  r greater .**   
2720: 20 20 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20     lock is held 
2730: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
2740: 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 49 66  file..**    * If
2750: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
2760: 69 73 20 6f 70 65 6e 20 69 6e 20 57 41 4c 2d 6d  is open in WAL-m
2770: 6f 64 65 2c 20 61 20 57 41 4c 20 77 72 69 74 65  ode, a WAL write
2780: 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20   transaction.** 
2790: 20 20 20 20 20 69 73 20 6f 70 65 6e 20 28 69 2e       is open (i.
27a0: 65 2e 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67  e. sqlite3WalBeg
27b0: 69 6e 57 72 69 74 65 54 72 61 6e 73 61 63 74 69  inWriteTransacti
27c0: 6f 6e 28 29 20 68 61 73 20 62 65 65 6e 20 73 75  on() has been su
27d0: 63 63 65 73 73 66 75 6c 6c 79 0a 2a 2a 20 20 20  ccessfully.**   
27e0: 20 20 20 63 61 6c 6c 65 64 29 2e 0a 2a 2a 20 20     called)..**  
27f0: 20 20 2a 20 54 68 65 20 64 62 53 69 7a 65 2c 20    * The dbSize, 
2800: 64 62 4f 72 69 67 53 69 7a 65 20 61 6e 64 20 64  dbOrigSize and d
2810: 62 46 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62  bFileSize variab
2820: 6c 65 73 20 61 72 65 20 61 6c 6c 20 76 61 6c 69  les are all vali
2830: 64 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 63  d..**    * The c
2840: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
2850: 61 67 65 72 20 63 61 63 68 65 20 68 61 76 65 20  ager cache have 
2860: 6e 6f 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  not been modifie
2870: 64 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a  d..**    * The j
2880: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20  ournal file may 
2890: 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 70  or may not be op
28a0: 65 6e 2e 0a 2a 2a 20 20 20 20 2a 20 4e 6f 74 68  en..**    * Noth
28b0: 69 6e 67 20 28 6e 6f 74 20 65 76 65 6e 20 74 68  ing (not even th
28c0: 65 20 66 69 72 73 74 20 68 65 61 64 65 72 29 20  e first header) 
28d0: 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e  has been written
28e0: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   to the journal.
28f0: 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f 43  .**.**  WRITER_C
2900: 41 43 48 45 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20  ACHEMOD:.**.**  
2910: 20 20 41 20 70 61 67 65 72 20 6d 6f 76 65 73 20    A pager moves 
2920: 66 72 6f 6d 20 57 52 49 54 45 52 5f 4c 4f 43 4b  from WRITER_LOCK
2930: 45 44 20 73 74 61 74 65 20 74 6f 20 74 68 69 73  ED state to this
2940: 20 73 74 61 74 65 20 77 68 65 6e 20 61 20 70 61   state when a pa
2950: 67 65 20 69 73 0a 2a 2a 20 20 20 20 66 69 72 73  ge is.**    firs
2960: 74 20 6d 6f 64 69 66 69 65 64 20 62 79 20 74 68  t modified by th
2970: 65 20 75 70 70 65 72 20 6c 61 79 65 72 2e 20 49  e upper layer. I
2980: 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 20  n rollback mode 
2990: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
29a0: 0a 2a 2a 20 20 20 20 69 73 20 6f 70 65 6e 65 64  .**    is opened
29b0: 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61   (if it is not a
29c0: 6c 72 65 61 64 79 20 6f 70 65 6e 29 20 61 6e 64  lready open) and
29d0: 20 61 20 68 65 61 64 65 72 20 77 72 69 74 74 65   a header writte
29e0: 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 73  n to the.**    s
29f0: 74 61 72 74 20 6f 66 20 69 74 2e 20 54 68 65 20  tart of it. The 
2a00: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e  database file on
2a10: 20 64 69 73 6b 20 68 61 73 20 6e 6f 74 20 62 65   disk has not be
2a20: 65 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a  en modified..**.
2a30: 2a 2a 20 20 20 20 2a 20 41 20 77 72 69 74 65 20  **    * A write 
2a40: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
2a50: 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a 20 41  ctive..**    * A
2a60: 20 52 45 53 45 52 56 45 44 20 6f 72 20 67 72 65   RESERVED or gre
2a70: 61 74 65 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c  ater lock is hel
2a80: 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
2a90: 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20  e file..**    * 
2aa0: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
2ab0: 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65   is open and the
2ac0: 20 66 69 72 73 74 20 68 65 61 64 65 72 20 68 61   first header ha
2ad0: 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 0a  s been written .
2ae0: 2a 2a 20 20 20 20 20 20 74 6f 20 69 74 2c 20 62  **      to it, b
2af0: 75 74 20 74 68 65 20 68 65 61 64 65 72 20 68 61  ut the header ha
2b00: 73 20 6e 6f 74 20 62 65 65 6e 20 73 79 6e 63 65  s not been synce
2b10: 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 20 20 20  d to disk..**   
2b20: 20 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20   * The contents 
2b30: 6f 66 20 74 68 65 20 70 61 67 65 20 63 61 63 68  of the page cach
2b40: 65 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64 69  e have been modi
2b50: 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49  fied..**.**  WRI
2b60: 54 45 52 5f 44 42 4d 4f 44 3a 0a 2a 2a 0a 2a 2a  TER_DBMOD:.**.**
2b70: 20 20 20 20 54 68 65 20 70 61 67 65 72 20 74 72      The pager tr
2b80: 61 6e 73 69 74 69 6f 6e 73 20 66 72 6f 6d 20 57  ansitions from W
2b90: 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 69  RITER_CACHEMOD i
2ba0: 6e 74 6f 20 57 52 49 54 45 52 5f 44 42 4d 4f 44  nto WRITER_DBMOD
2bb0: 20 73 74 61 74 65 0a 2a 2a 20 20 20 20 77 68 65   state.**    whe
2bc0: 6e 20 69 74 20 6d 6f 64 69 66 69 65 73 20 74 68  n it modifies th
2bd0: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
2be0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2bf0: 20 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 73   WAL connections
2c00: 0a 2a 2a 20 20 20 20 6e 65 76 65 72 20 65 6e 74  .**    never ent
2c10: 65 72 20 74 68 69 73 20 73 74 61 74 65 20 28 73  er this state (s
2c20: 69 6e 63 65 20 74 68 65 79 20 64 6f 20 6e 6f 74  ince they do not
2c30: 20 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61   modify the data
2c40: 62 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 20 20  base file,.**   
2c50: 20 6a 75 73 74 20 74 68 65 20 6c 6f 67 20 66 69   just the log fi
2c60: 6c 65 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  le)..**.**    * 
2c70: 41 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  A write transact
2c80: 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a  ion is active..*
2c90: 2a 20 20 20 20 2a 20 41 6e 20 45 58 43 4c 55 53  *    * An EXCLUS
2ca0: 49 56 45 20 6f 72 20 67 72 65 61 74 65 72 20 6c  IVE or greater l
2cb0: 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74  ock is held on t
2cc0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2cd0: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f  ..**    * The jo
2ce0: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70  urnal file is op
2cf0: 65 6e 20 61 6e 64 20 74 68 65 20 66 69 72 73 74  en and the first
2d00: 20 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e   header has been
2d10: 20 77 72 69 74 74 65 6e 20 0a 2a 2a 20 20 20 20   written .**    
2d20: 20 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20    and synced to 
2d30: 64 69 73 6b 2e 0a 2a 2a 20 20 20 20 2a 20 54 68  disk..**    * Th
2d40: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
2d50: 65 20 70 61 67 65 20 63 61 63 68 65 20 68 61 76  e page cache hav
2d60: 65 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20  e been modified 
2d70: 28 61 6e 64 20 70 6f 73 73 69 62 6c 79 0a 2a 2a  (and possibly.**
2d80: 20 20 20 20 20 20 77 72 69 74 74 65 6e 20 74 6f        written to
2d90: 20 64 69 73 6b 29 2e 0a 2a 2a 0a 2a 2a 20 20 57   disk)..**.**  W
2da0: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 3a 0a  RITER_FINISHED:.
2db0: 2a 2a 0a 2a 2a 20 20 20 20 49 74 20 69 73 20 6e  **.**    It is n
2dc0: 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  ot possible for 
2dd0: 61 20 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e  a WAL connection
2de0: 20 74 6f 20 65 6e 74 65 72 20 74 68 69 73 20 73   to enter this s
2df0: 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41  tate..**.**    A
2e00: 20 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64 65 20 70   rollback-mode p
2e10: 61 67 65 72 20 63 68 61 6e 67 65 73 20 74 6f 20  ager changes to 
2e20: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20  WRITER_FINISHED 
2e30: 73 74 61 74 65 20 66 72 6f 6d 20 57 52 49 54 45  state from WRITE
2e40: 52 5f 44 42 4d 4f 44 0a 2a 2a 20 20 20 20 73 74  R_DBMOD.**    st
2e50: 61 74 65 20 61 66 74 65 72 20 74 68 65 20 65 6e  ate after the en
2e60: 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tire transaction
2e70: 20 68 61 73 20 62 65 65 6e 20 73 75 63 63 65 73   has been succes
2e80: 73 66 75 6c 6c 79 20 77 72 69 74 74 65 6e 20 69  sfully written i
2e90: 6e 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 64 61  nto the.**    da
2ea0: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6e 20  tabase file. In 
2eb0: 74 68 69 73 20 73 74 61 74 65 20 74 68 65 20 74  this state the t
2ec0: 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 62  ransaction may b
2ed0: 65 20 63 6f 6d 6d 69 74 74 65 64 20 73 69 6d 70  e committed simp
2ee0: 6c 79 0a 2a 2a 20 20 20 20 62 79 20 66 69 6e 61  ly.**    by fina
2ef0: 6c 69 7a 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e  lizing the journ
2f00: 61 6c 20 66 69 6c 65 2e 20 4f 6e 63 65 20 69 6e  al file. Once in
2f10: 20 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44   WRITER_FINISHED
2f20: 20 73 74 61 74 65 2c 20 69 74 20 69 73 20 0a 2a   state, it is .*
2f30: 2a 20 20 20 20 6e 6f 74 20 70 6f 73 73 69 62 6c  *    not possibl
2f40: 65 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20  e to modify the 
2f50: 64 61 74 61 62 61 73 65 20 66 75 72 74 68 65 72  database further
2f60: 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  . At this point,
2f70: 20 74 68 65 20 75 70 70 65 72 20 0a 2a 2a 20 20   the upper .**  
2f80: 20 20 6c 61 79 65 72 20 6d 75 73 74 20 65 69 74    layer must eit
2f90: 68 65 72 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f  her commit or ro
2fa0: 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73  llback the trans
2fb0: 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  action..**.**   
2fc0: 20 2a 20 41 20 77 72 69 74 65 20 74 72 61 6e 73   * A write trans
2fd0: 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
2fe0: 2e 0a 2a 2a 20 20 20 20 2a 20 41 6e 20 45 58 43  ..**    * An EXC
2ff0: 4c 55 53 49 56 45 20 6f 72 20 67 72 65 61 74 65  LUSIVE or greate
3000: 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f  r lock is held o
3010: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
3020: 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 6c 6c  ile..**    * All
3030: 20 77 72 69 74 69 6e 67 20 61 6e 64 20 73 79 6e   writing and syn
3040: 63 69 6e 67 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  cing of journal 
3050: 61 6e 64 20 64 61 74 61 62 61 73 65 20 64 61 74  and database dat
3060: 61 20 68 61 73 20 66 69 6e 69 73 68 65 64 2e 0a  a has finished..
3070: 2a 2a 20 20 20 20 20 20 49 66 20 6e 6f 20 65 72  **      If no er
3080: 72 6f 72 20 6f 63 63 75 72 65 64 2c 20 61 6c 6c  ror occured, all
3090: 20 74 68 61 74 20 72 65 6d 61 69 6e 73 20 69 73   that remains is
30a0: 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65   to finalize the
30b0: 20 6a 6f 75 72 6e 61 6c 20 74 6f 0a 2a 2a 20 20   journal to.**  
30c0: 20 20 20 20 63 6f 6d 6d 69 74 20 74 68 65 20 74      commit the t
30d0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 61  ransaction. If a
30e0: 6e 20 65 72 72 6f 72 20 64 69 64 20 6f 63 63 75  n error did occu
30f0: 72 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69  r, the caller wi
3100: 6c 6c 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20 20  ll need.**      
3110: 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
3120: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 2a 2a  transaction. .**
3130: 0a 2a 2a 20 20 45 52 52 4f 52 3a 0a 2a 2a 0a 2a  .**  ERROR:.**.*
3140: 2a 20 20 20 20 54 68 65 20 45 52 52 4f 52 20 73  *    The ERROR s
3150: 74 61 74 65 20 69 73 20 65 6e 74 65 72 65 64 20  tate is entered 
3160: 77 68 65 6e 20 61 6e 20 49 4f 20 6f 72 20 64 69  when an IO or di
3170: 73 6b 2d 66 75 6c 6c 20 65 72 72 6f 72 20 28 69  sk-full error (i
3180: 6e 63 6c 75 64 69 6e 67 0a 2a 2a 20 20 20 20 53  ncluding.**    S
3190: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
31a0: 4d 29 20 6f 63 63 75 72 73 20 61 74 20 61 20 70  M) occurs at a p
31b0: 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65  oint in the code
31c0: 20 74 68 61 74 20 6d 61 6b 65 73 20 69 74 20 0a   that makes it .
31d0: 2a 2a 20 20 20 20 64 69 66 66 69 63 75 6c 74 20  **    difficult 
31e0: 74 6f 20 62 65 20 73 75 72 65 20 74 68 61 74 20  to be sure that 
31f0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  the in-memory pa
3200: 67 65 72 20 73 74 61 74 65 20 28 63 61 63 68 65  ger state (cache
3210: 20 63 6f 6e 74 65 6e 74 73 2c 20 0a 2a 2a 20 20   contents, .**  
3220: 20 20 64 62 20 73 69 7a 65 20 65 74 63 2e 29 20    db size etc.) 
3230: 61 72 65 20 63 6f 6e 73 69 73 74 65 6e 74 20 77  are consistent w
3240: 69 74 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ith the contents
3250: 20 6f 66 20 74 68 65 20 66 69 6c 65 2d 73 79 73   of the file-sys
3260: 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 54 65  tem..**.**    Te
3270: 6d 70 6f 72 61 72 79 20 70 61 67 65 72 20 66 69  mporary pager fi
3280: 6c 65 73 20 6d 61 79 20 65 6e 74 65 72 20 74 68  les may enter th
3290: 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 62  e ERROR state, b
32a0: 75 74 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ut in-memory pag
32b0: 65 72 73 0a 2a 2a 20 20 20 20 63 61 6e 6e 6f 74  ers.**    cannot
32c0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 6f 72 20 65  ..**.**    For e
32d0: 78 61 6d 70 6c 65 2c 20 69 66 20 61 6e 20 49 4f  xample, if an IO
32e0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
32f0: 69 6c 65 20 70 65 72 66 6f 72 6d 69 6e 67 20 61  ile performing a
3300: 20 72 6f 6c 6c 62 61 63 6b 2c 20 0a 2a 2a 20 20   rollback, .**  
3310: 20 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f    the contents o
3320: 66 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  f the page-cache
3330: 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20   may be left in 
3340: 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  an inconsistent 
3350: 73 74 61 74 65 2e 0a 2a 2a 20 20 20 20 41 74 20  state..**    At 
3360: 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 77 6f  this point it wo
3370: 75 6c 64 20 62 65 20 64 61 6e 67 65 72 6f 75 73  uld be dangerous
3380: 20 74 6f 20 63 68 61 6e 67 65 20 62 61 63 6b 20   to change back 
3390: 74 6f 20 52 45 41 44 45 52 20 73 74 61 74 65 0a  to READER state.
33a0: 2a 2a 20 20 20 20 28 61 73 20 75 73 75 61 6c 6c  **    (as usuall
33b0: 79 20 68 61 70 70 65 6e 73 20 61 66 74 65 72 20  y happens after 
33c0: 61 20 72 6f 6c 6c 62 61 63 6b 29 2e 20 41 6e 79  a rollback). Any
33d0: 20 73 75 62 73 65 71 75 65 6e 74 20 72 65 61 64   subsequent read
33e0: 65 72 73 20 6d 69 67 68 74 0a 2a 2a 20 20 20 20  ers might.**    
33f0: 72 65 70 6f 72 74 20 64 61 74 61 62 61 73 65 20  report database 
3400: 63 6f 72 72 75 70 74 69 6f 6e 20 28 64 75 65 20  corruption (due 
3410: 74 6f 20 74 68 65 20 69 6e 63 6f 6e 73 69 73 74  to the inconsist
3420: 65 6e 74 20 63 61 63 68 65 29 2c 20 61 6e 64 20  ent cache), and 
3430: 69 66 0a 2a 2a 20 20 20 20 74 68 65 79 20 75 70  if.**    they up
3440: 67 72 61 64 65 20 74 6f 20 77 72 69 74 65 72 73  grade to writers
3450: 2c 20 74 68 65 79 20 6d 61 79 20 69 6e 61 64 76  , they may inadv
3460: 65 72 74 65 6e 74 6c 79 20 63 6f 72 72 75 70 74  ertently corrupt
3470: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
3480: 20 20 20 20 66 69 6c 65 2e 20 54 6f 20 61 76 6f      file. To avo
3490: 69 64 20 74 68 69 73 20 68 61 7a 61 72 64 2c 20  id this hazard, 
34a0: 74 68 65 20 70 61 67 65 72 20 73 77 69 74 63 68  the pager switch
34b0: 65 73 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  es into the ERRO
34c0: 52 20 73 74 61 74 65 0a 2a 2a 20 20 20 20 69 6e  R state.**    in
34d0: 73 74 65 61 64 20 6f 66 20 52 45 41 44 45 52 20  stead of READER 
34e0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 75 63 68 20 61  following such a
34f0: 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20  n error..**.**  
3500: 20 20 4f 6e 63 65 20 69 74 20 68 61 73 20 65 6e    Once it has en
3510: 74 65 72 65 64 20 74 68 65 20 45 52 52 4f 52 20  tered the ERROR 
3520: 73 74 61 74 65 2c 20 61 6e 79 20 61 74 74 65 6d  state, any attem
3530: 70 74 20 74 6f 20 75 73 65 20 74 68 65 20 70 61  pt to use the pa
3540: 67 65 72 0a 2a 2a 20 20 20 20 74 6f 20 72 65 61  ger.**    to rea
3550: 64 20 6f 72 20 77 72 69 74 65 20 64 61 74 61 20  d or write data 
3560: 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72  returns an error
3570: 2e 20 45 76 65 6e 74 75 61 6c 6c 79 2c 20 6f 6e  . Eventually, on
3580: 63 65 20 61 6c 6c 20 0a 2a 2a 20 20 20 20 6f 75  ce all .**    ou
3590: 74 73 74 61 6e 64 69 6e 67 20 74 72 61 6e 73 61  tstanding transa
35a0: 63 74 69 6f 6e 73 20 68 61 76 65 20 62 65 65 6e  ctions have been
35b0: 20 61 62 61 6e 64 6f 6e 65 64 2c 20 74 68 65 20   abandoned, the 
35c0: 70 61 67 65 72 20 69 73 20 61 62 6c 65 20 74 6f  pager is able to
35d0: 0a 2a 2a 20 20 20 20 74 72 61 6e 73 69 74 69 6f  .**    transitio
35e0: 6e 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  n back to OPEN s
35f0: 74 61 74 65 2c 20 64 69 73 63 61 72 64 69 6e 67  tate, discarding
3600: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
3610: 20 74 68 65 20 0a 2a 2a 20 20 20 20 70 61 67 65   the .**    page
3620: 2d 63 61 63 68 65 20 61 6e 64 20 61 6e 79 20 6f  -cache and any o
3630: 74 68 65 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 73  ther in-memory s
3640: 74 61 74 65 20 61 74 20 74 68 65 20 73 61 6d 65  tate at the same
3650: 20 74 69 6d 65 2e 20 45 76 65 72 79 74 68 69 6e   time. Everythin
3660: 67 0a 2a 2a 20 20 20 20 69 73 20 72 65 6c 6f 61  g.**    is reloa
3670: 64 65 64 20 66 72 6f 6d 20 64 69 73 6b 20 28 61  ded from disk (a
3680: 6e 64 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79  nd, if necessary
3690: 2c 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  , hot-journal ro
36a0: 6c 6c 62 61 63 6b 20 70 65 66 6f 72 6d 65 64 29  llback peformed)
36b0: 0a 2a 2a 20 20 20 20 77 68 65 6e 20 61 20 72 65  .**    when a re
36c0: 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ad-transaction i
36d0: 73 20 6e 65 78 74 20 6f 70 65 6e 65 64 20 6f 6e  s next opened on
36e0: 20 74 68 65 20 70 61 67 65 72 20 28 74 72 61 6e   the pager (tran
36f0: 73 69 74 69 6f 6e 69 6e 67 0a 2a 2a 20 20 20 20  sitioning.**    
3700: 74 68 65 20 70 61 67 65 72 20 69 6e 74 6f 20 52  the pager into R
3710: 45 41 44 45 52 20 73 74 61 74 65 29 2e 20 41 74  EADER state). At
3720: 20 74 68 61 74 20 70 6f 69 6e 74 20 74 68 65 20   that point the 
3730: 73 79 73 74 65 6d 20 68 61 73 20 72 65 63 6f 76  system has recov
3740: 65 72 65 64 20 0a 2a 2a 20 20 20 20 66 72 6f 6d  ered .**    from
3750: 20 74 68 65 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a   the error..**.*
3760: 2a 20 20 20 20 53 70 65 63 69 66 69 63 61 6c 6c  *    Specificall
3770: 79 2c 20 74 68 65 20 70 61 67 65 72 20 6a 75 6d  y, the pager jum
3780: 70 73 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  ps into the ERRO
3790: 52 20 73 74 61 74 65 20 69 66 3a 0a 2a 2a 0a 2a  R state if:.**.*
37a0: 2a 20 20 20 20 20 20 31 2e 20 41 6e 20 65 72 72  *      1. An err
37b0: 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
37c0: 61 74 74 65 6d 70 74 69 6e 67 20 61 20 72 6f 6c  attempting a rol
37d0: 6c 62 61 63 6b 2e 20 54 68 69 73 20 68 61 70 70  lback. This happ
37e0: 65 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 20 20 20  ens in.**       
37f0: 20 20 66 75 6e 63 74 69 6f 6e 20 73 71 6c 69 74    function sqlit
3800: 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
3810: 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 32 2e  )..**.**      2.
3820: 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   An error occurs
3830: 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74 69 6e   while attemptin
3840: 67 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 61 20  g to finalize a 
3850: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
3860: 20 20 20 20 20 20 20 20 66 6f 6c 6c 6f 77 69 6e          followin
3870: 67 20 61 20 63 6f 6d 6d 69 74 20 69 6e 20 66 75  g a commit in fu
3880: 6e 63 74 69 6f 6e 20 73 71 6c 69 74 65 33 50 61  nction sqlite3Pa
3890: 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  gerCommitPhaseTw
38a0: 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  o()..**.**      
38b0: 33 2e 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75  3. An error occu
38c0: 72 73 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74  rs while attempt
38d0: 69 6e 67 20 74 6f 20 77 72 69 74 65 20 74 6f 20  ing to write to 
38e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 0a 2a  the journal or.*
38f0: 2a 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61  *         databa
3900: 73 65 20 66 69 6c 65 20 69 6e 20 66 75 6e 63 74  se file in funct
3910: 69 6f 6e 20 70 61 67 65 72 53 74 72 65 73 73 28  ion pagerStress(
3920: 29 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 72  ) in order to fr
3930: 65 65 20 75 70 0a 2a 2a 20 20 20 20 20 20 20 20  ee up.**        
3940: 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 20   memory..**.**  
3950: 20 20 49 6e 20 6f 74 68 65 72 20 63 61 73 65 73    In other cases
3960: 2c 20 74 68 65 20 65 72 72 6f 72 20 69 73 20 72  , the error is r
3970: 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 62  eturned to the b
3980: 2d 74 72 65 65 20 6c 61 79 65 72 2e 20 54 68 65  -tree layer. The
3990: 20 62 2d 74 72 65 65 0a 2a 2a 20 20 20 20 6c 61   b-tree.**    la
39a0: 79 65 72 20 74 68 65 6e 20 61 74 74 65 6d 70 74  yer then attempt
39b0: 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65  s a rollback ope
39c0: 72 61 74 69 6f 6e 2e 20 49 66 20 74 68 65 20 65  ration. If the e
39d0: 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 0a  rror condition .
39e0: 2a 2a 20 20 20 20 70 65 72 73 69 73 74 73 2c 20  **    persists, 
39f0: 74 68 65 20 70 61 67 65 72 20 65 6e 74 65 72 73  the pager enters
3a00: 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
3a10: 20 76 69 61 20 63 6f 6e 64 69 74 69 6f 6e 20 28   via condition (
3a20: 31 29 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20  1) above..**.** 
3a30: 20 20 20 43 6f 6e 64 69 74 69 6f 6e 20 28 33 29     Condition (3)
3a40: 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 62 65   is necessary be
3a50: 63 61 75 73 65 20 69 74 20 63 61 6e 20 62 65 20  cause it can be 
3a60: 74 72 69 67 67 65 72 65 64 20 62 79 20 61 20 72  triggered by a r
3a70: 65 61 64 2d 6f 6e 6c 79 0a 2a 2a 20 20 20 20 73  ead-only.**    s
3a80: 74 61 74 65 6d 65 6e 74 20 65 78 65 63 75 74 65  tatement execute
3a90: 64 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73  d within a trans
3aa0: 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20  action. In this 
3ab0: 63 61 73 65 2c 20 69 66 20 74 68 65 20 65 72 72  case, if the err
3ac0: 6f 72 0a 2a 2a 20 20 20 20 63 6f 64 65 20 77 65  or.**    code we
3ad0: 72 65 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e  re simply return
3ae0: 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 2c 20  ed to the user, 
3af0: 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72  the b-tree layer
3b00: 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20   would not.**   
3b10: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61   automatically a
3b20: 74 74 65 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63  ttempt a rollbac
3b30: 6b 2c 20 61 73 20 69 74 20 61 73 73 75 6d 65 73  k, as it assumes
3b40: 20 74 68 61 74 20 61 6e 20 65 72 72 6f 72 20 69   that an error i
3b50: 6e 20 61 0a 2a 2a 20 20 20 20 72 65 61 64 2d 6f  n a.**    read-o
3b60: 6e 6c 79 20 73 74 61 74 65 6d 65 6e 74 20 63 61  nly statement ca
3b70: 6e 6e 6f 74 20 6c 65 61 76 65 20 74 68 65 20 70  nnot leave the p
3b80: 61 67 65 72 20 69 6e 20 61 6e 20 69 6e 74 65 72  ager in an inter
3b90: 6e 61 6c 6c 79 20 69 6e 63 6f 6e 73 69 73 74 65  nally inconsiste
3ba0: 6e 74 20 0a 2a 2a 20 20 20 20 73 74 61 74 65 2e  nt .**    state.
3bb0: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  .**.**    * The 
3bc0: 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 76 61  Pager.errCode va
3bd0: 72 69 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f  riable is set to
3be0: 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72   something other
3bf0: 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e   than SQLITE_OK.
3c00: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 72 65 20 61  .**    * There a
3c10: 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  re one or more o
3c20: 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
3c30: 65 6e 63 65 73 20 74 6f 20 70 61 67 65 73 20 28  ences to pages (
3c40: 61 66 74 65 72 20 74 68 65 0a 2a 2a 20 20 20 20  after the.**    
3c50: 20 20 6c 61 73 74 20 72 65 66 65 72 65 6e 63 65    last reference
3c60: 20 69 73 20 64 72 6f 70 70 65 64 20 74 68 65 20   is dropped the 
3c70: 70 61 67 65 72 20 73 68 6f 75 6c 64 20 6d 6f 76  pager should mov
3c80: 65 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  e back to OPEN s
3c90: 74 61 74 65 29 2e 0a 2a 2a 20 20 20 20 2a 20 54  tate)..**    * T
3ca0: 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
3cb0: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  an in-memory pag
3cc0: 65 72 2e 0a 2a 2a 20 20 20 20 0a 2a 2a 0a 2a 2a  er..**    .**.**
3cd0: 20 4e 6f 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   Notes:.**.**   
3ce0: 2a 20 41 20 70 61 67 65 72 20 69 73 20 6e 65 76  * A pager is nev
3cf0: 65 72 20 69 6e 20 57 52 49 54 45 52 5f 44 42 4d  er in WRITER_DBM
3d00: 4f 44 20 6f 72 20 57 52 49 54 45 52 5f 46 49 4e  OD or WRITER_FIN
3d10: 49 53 48 45 44 20 73 74 61 74 65 20 69 66 20 74  ISHED state if t
3d20: 68 65 0a 2a 2a 20 20 20 20 20 63 6f 6e 6e 65 63  he.**     connec
3d30: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 69 6e 20  tion is open in 
3d40: 57 41 4c 20 6d 6f 64 65 2e 20 41 20 57 41 4c 20  WAL mode. A WAL 
3d50: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 61 6c  connection is al
3d60: 77 61 79 73 20 69 6e 20 6f 6e 65 0a 2a 2a 20 20  ways in one.**  
3d70: 20 20 20 6f 66 20 74 68 65 20 66 69 72 73 74 20     of the first 
3d80: 66 6f 75 72 20 73 74 61 74 65 73 2e 0a 2a 2a 0a  four states..**.
3d90: 2a 2a 20 20 20 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  **   * Normally,
3da0: 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70   a connection op
3db0: 65 6e 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  en in exclusive 
3dc0: 6d 6f 64 65 20 69 73 20 6e 65 76 65 72 20 69 6e  mode is never in
3dd0: 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 20   PAGER_OPEN.**  
3de0: 20 20 20 73 74 61 74 65 2e 20 54 68 65 72 65 20     state. There 
3df0: 61 72 65 20 74 77 6f 20 65 78 63 65 70 74 69 6f  are two exceptio
3e00: 6e 73 3a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ns: immediately 
3e10: 61 66 74 65 72 20 65 78 63 6c 75 73 69 76 65 2d  after exclusive-
3e20: 6d 6f 64 65 20 68 61 73 0a 2a 2a 20 20 20 20 20  mode has.**     
3e30: 62 65 65 6e 20 74 75 72 6e 65 64 20 6f 6e 20 28  been turned on (
3e40: 61 6e 64 20 62 65 66 6f 72 65 20 61 6e 79 20 72  and before any r
3e50: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
3e60: 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 0a 2a  nsactions are .*
3e70: 2a 20 20 20 20 20 65 78 65 63 75 74 65 64 29 2c  *     executed),
3e80: 20 61 6e 64 20 77 68 65 6e 20 74 68 65 20 70 61   and when the pa
3e90: 67 65 72 20 69 73 20 6c 65 61 76 69 6e 67 20 74  ger is leaving t
3ea0: 68 65 20 22 65 72 72 6f 72 20 73 74 61 74 65 22  he "error state"
3eb0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 53 65 65 20  ..**.**   * See 
3ec0: 61 6c 73 6f 3a 20 61 73 73 65 72 74 5f 70 61 67  also: assert_pag
3ed0: 65 72 5f 73 74 61 74 65 28 29 2e 0a 2a 2f 0a 23  er_state()..*/.#
3ee0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4f 50 45  define PAGER_OPE
3ef0: 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N               
3f00: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 50 41 47     0.#define PAG
3f10: 45 52 5f 52 45 41 44 45 52 20 20 20 20 20 20 20  ER_READER       
3f20: 20 20 20 20 20 20 20 20 20 31 0a 23 64 65 66 69           1.#defi
3f30: 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  ne PAGER_WRITER_
3f40: 4c 4f 43 4b 45 44 20 20 20 20 20 20 20 20 20 32  LOCKED         2
3f50: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 57  .#define PAGER_W
3f60: 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 20  RITER_CACHEMOD  
3f70: 20 20 20 20 20 33 0a 23 64 65 66 69 6e 65 20 50       3.#define P
3f80: 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
3f90: 44 20 20 20 20 20 20 20 20 20 20 34 0a 23 64 65  D          4.#de
3fa0: 66 69 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45  fine PAGER_WRITE
3fb0: 52 5f 46 49 4e 49 53 48 45 44 20 20 20 20 20 20  R_FINISHED      
3fc0: 20 35 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52   5.#define PAGER
3fd0: 5f 45 52 52 4f 52 20 20 20 20 20 20 20 20 20 20  _ERROR          
3fe0: 20 20 20 20 20 20 20 36 0a 0a 2f 2a 0a 2a 2a 20         6../*.** 
3ff0: 54 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20  The Pager.eLock 
4000: 76 61 72 69 61 62 6c 65 20 69 73 20 61 6c 6d 6f  variable is almo
4010: 73 74 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f  st always set to
4020: 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20   one of the .** 
4030: 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 63 6b 69 6e  following lockin
4040: 67 2d 73 74 61 74 65 73 2c 20 61 63 63 6f 72 64  g-states, accord
4050: 69 6e 67 20 74 6f 20 74 68 65 20 6c 6f 63 6b 20  ing to the lock 
4060: 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 6f  currently held o
4070: 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  n.** the databas
4080: 65 20 66 69 6c 65 3a 20 4e 4f 5f 4c 4f 43 4b 2c  e file: NO_LOCK,
4090: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45   SHARED_LOCK, RE
40a0: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45  SERVED_LOCK or E
40b0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a  XCLUSIVE_LOCK..*
40c0: 2a 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20  * This variable 
40d0: 69 73 20 6b 65 70 74 20 75 70 20 74 6f 20 64 61  is kept up to da
40e0: 74 65 20 61 73 20 6c 6f 63 6b 73 20 61 72 65 20  te as locks are 
40f0: 74 61 6b 65 6e 20 61 6e 64 20 72 65 6c 65 61 73  taken and releas
4100: 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 70 61 67  ed by.** the pag
4110: 65 72 4c 6f 63 6b 44 62 28 29 20 61 6e 64 20 70  erLockDb() and p
4120: 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 77  agerUnlockDb() w
4130: 72 61 70 70 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49  rappers..**.** I
4140: 66 20 74 68 65 20 56 46 53 20 78 4c 6f 63 6b 28  f the VFS xLock(
4150: 29 20 6f 72 20 78 55 6e 6c 6f 63 6b 28 29 20 72  ) or xUnlock() r
4160: 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20  eturns an error 
4170: 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
4180: 45 5f 42 55 53 59 0a 2a 2a 20 28 69 2e 65 2e 20  E_BUSY.** (i.e. 
4190: 6f 6e 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54  one of the SQLIT
41a0: 45 5f 49 4f 45 52 52 20 73 75 62 74 79 70 65 73  E_IOERR subtypes
41b0: 29 2c 20 69 74 20 69 73 20 6e 6f 74 20 63 6c 65  ), it is not cle
41c0: 61 72 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ar whether or no
41d0: 74 0a 2a 2a 20 74 68 65 20 6f 70 65 72 61 74 69  t.** the operati
41e0: 6f 6e 20 77 61 73 20 73 75 63 63 65 73 73 66 75  on was successfu
41f0: 6c 2e 20 49 6e 20 74 68 65 73 65 20 63 69 72 63  l. In these circ
4200: 75 6d 73 74 61 6e 63 65 73 20 70 61 67 65 72 4c  umstances pagerL
4210: 6f 63 6b 44 62 28 29 20 61 6e 64 0a 2a 2a 20 70  ockDb() and.** p
4220: 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 74  agerUnlockDb() t
4230: 61 6b 65 20 61 20 63 6f 6e 73 65 72 76 61 74 69  ake a conservati
4240: 76 65 20 61 70 70 72 6f 61 63 68 20 2d 20 65 4c  ve approach - eL
4250: 6f 63 6b 20 69 73 20 61 6c 77 61 79 73 20 75 70  ock is always up
4260: 64 61 74 65 64 0a 2a 2a 20 77 68 65 6e 20 75 6e  dated.** when un
4270: 6c 6f 63 6b 69 6e 67 20 74 68 65 20 66 69 6c 65  locking the file
4280: 2c 20 61 6e 64 20 6f 6e 6c 79 20 75 70 64 61 74  , and only updat
4290: 65 64 20 77 68 65 6e 20 6c 6f 63 6b 69 6e 67 20  ed when locking 
42a0: 74 68 65 20 66 69 6c 65 20 69 66 20 74 68 65 0a  the file if the.
42b0: 2a 2a 20 56 46 53 20 63 61 6c 6c 20 69 73 20 73  ** VFS call is s
42c0: 75 63 63 65 73 73 66 75 6c 2e 20 54 68 69 73 20  uccessful. This 
42d0: 77 61 79 2c 20 74 68 65 20 50 61 67 65 72 2e 65  way, the Pager.e
42e0: 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 6d 61  Lock variable ma
42f0: 79 20 62 65 20 73 65 74 0a 2a 2a 20 74 6f 20 61  y be set.** to a
4300: 20 6c 65 73 73 20 65 78 63 6c 75 73 69 76 65 20   less exclusive 
4310: 28 6c 6f 77 65 72 29 20 76 61 6c 75 65 20 74 68  (lower) value th
4320: 61 6e 20 74 68 65 20 6c 6f 63 6b 20 74 68 61 74  an the lock that
4330: 20 69 73 20 61 63 74 75 61 6c 6c 79 20 68 65 6c   is actually hel
4340: 64 0a 2a 2a 20 61 74 20 74 68 65 20 73 79 73 74  d.** at the syst
4350: 65 6d 20 6c 65 76 65 6c 2c 20 62 75 74 20 69 74  em level, but it
4360: 20 69 73 20 6e 65 76 65 72 20 73 65 74 20 74 6f   is never set to
4370: 20 61 20 6d 6f 72 65 20 65 78 63 6c 75 73 69 76   a more exclusiv
4380: 65 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54  e value..**.** T
4390: 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79 20 73  his is usually s
43a0: 61 66 65 2e 20 49 66 20 61 6e 20 78 55 6e 6c 6f  afe. If an xUnlo
43b0: 63 6b 20 66 61 69 6c 73 20 6f 72 20 61 70 70 65  ck fails or appe
43c0: 61 72 73 20 74 6f 20 66 61 69 6c 2c 20 74 68 65  ars to fail, the
43d0: 72 65 20 6d 61 79 20 0a 2a 2a 20 62 65 20 61 20  re may .** be a 
43e0: 66 65 77 20 72 65 64 75 6e 64 61 6e 74 20 78 4c  few redundant xL
43f0: 6f 63 6b 28 29 20 63 61 6c 6c 73 20 6f 72 20 61  ock() calls or a
4400: 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 68 65 6c   lock may be hel
4410: 64 20 66 6f 72 20 6c 6f 6e 67 65 72 20 74 68 61  d for longer tha
4420: 6e 0a 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 62  n.** required, b
4430: 75 74 20 6e 6f 74 68 69 6e 67 20 72 65 61 6c 6c  ut nothing reall
4440: 79 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a  y goes wrong..**
4450: 0a 2a 2a 20 54 68 65 20 65 78 63 65 70 74 69 6f  .** The exceptio
4460: 6e 20 69 73 20 77 68 65 6e 20 74 68 65 20 64 61  n is when the da
4470: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 75  tabase file is u
4480: 6e 6c 6f 63 6b 65 64 20 61 73 20 74 68 65 20 70  nlocked as the p
4490: 61 67 65 72 20 6d 6f 76 65 73 0a 2a 2a 20 66 72  ager moves.** fr
44a0: 6f 6d 20 45 52 52 4f 52 20 74 6f 20 4f 50 45 4e  om ERROR to OPEN
44b0: 20 73 74 61 74 65 2e 20 41 74 20 74 68 69 73 20   state. At this 
44c0: 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 61 79 20  point there may 
44d0: 62 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  be a hot-journal
44e0: 20 66 69 6c 65 20 0a 2a 2a 20 69 6e 20 74 68 65   file .** in the
44f0: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 74 68 61   file-system tha
4500: 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f  t needs to be ro
4510: 6c 6c 65 64 20 62 61 63 6b 20 28 61 73 20 70 61  lled back (as pa
4520: 72 74 20 6f 66 20 61 20 4f 50 45 4e 2d 3e 53 48  rt of a OPEN->SH
4530: 41 52 45 44 0a 2a 2a 20 74 72 61 6e 73 69 74 69  ARED.** transiti
4540: 6f 6e 2c 20 62 79 20 74 68 65 20 73 61 6d 65 20  on, by the same 
4550: 70 61 67 65 72 20 6f 72 20 61 6e 79 20 6f 74 68  pager or any oth
4560: 65 72 29 2e 20 49 66 20 74 68 65 20 63 61 6c 6c  er). If the call
4570: 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a 2a   to xUnlock().**
4580: 20 66 61 69 6c 73 20 61 74 20 74 68 69 73 20 70   fails at this p
4590: 6f 69 6e 74 20 61 6e 64 20 74 68 65 20 70 61 67  oint and the pag
45a0: 65 72 20 69 73 20 6c 65 66 74 20 68 6f 6c 64 69  er is left holdi
45b0: 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  ng an EXCLUSIVE 
45c0: 6c 6f 63 6b 2c 20 74 68 69 73 0a 2a 2a 20 63 61  lock, this.** ca
45d0: 6e 20 63 6f 6e 66 75 73 65 20 74 68 65 20 63 61  n confuse the ca
45e0: 6c 6c 20 74 6f 20 78 43 68 65 63 6b 52 65 73 65  ll to xCheckRese
45f0: 72 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c 20  rvedLock() call 
4600: 6d 61 64 65 20 6c 61 74 65 72 20 61 73 20 70 61  made later as pa
4610: 72 74 0a 2a 2a 20 6f 66 20 68 6f 74 2d 6a 6f 75  rt.** of hot-jou
4620: 72 6e 61 6c 20 64 65 74 65 63 74 69 6f 6e 2e 0a  rnal detection..
4630: 2a 2a 0a 2a 2a 20 78 43 68 65 63 6b 52 65 73 65  **.** xCheckRese
4640: 72 76 65 64 4c 6f 63 6b 28 29 20 69 73 20 64 65  rvedLock() is de
4650: 66 69 6e 65 64 20 61 73 20 72 65 74 75 72 6e 69  fined as returni
4660: 6e 67 20 74 72 75 65 20 22 69 66 20 74 68 65 72  ng true "if ther
4670: 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20  e is a RESERVED 
4680: 0a 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64 20 62 79  .** lock held by
4690: 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f 72   this process or
46a0: 20 61 6e 79 20 6f 74 68 65 72 73 22 2e 20 53 6f   any others". So
46b0: 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
46c0: 6f 63 6b 20 6d 61 79 20 0a 2a 2a 20 72 65 74 75  ock may .** retu
46d0: 72 6e 20 74 72 75 65 20 62 65 63 61 75 73 65 20  rn true because 
46e0: 74 68 65 20 63 61 6c 6c 65 72 20 69 74 73 65 6c  the caller itsel
46f0: 66 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20  f is holding an 
4700: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 28  EXCLUSIVE lock (
4710: 62 75 74 0a 2a 2a 20 64 6f 65 73 6e 27 74 20 6b  but.** doesn't k
4720: 6e 6f 77 20 69 74 20 62 65 63 61 75 73 65 20 6f  now it because o
4730: 66 20 61 20 70 72 65 76 69 6f 75 73 20 65 72 72  f a previous err
4740: 6f 72 20 69 6e 20 78 55 6e 6c 6f 63 6b 29 2e 20  or in xUnlock). 
4750: 49 66 20 74 68 69 73 20 68 61 70 70 65 6e 73 0a  If this happens.
4760: 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ** a hot-journal
4770: 20 6d 61 79 20 62 65 20 6d 69 73 74 61 6b 65 6e   may be mistaken
4780: 20 66 6f 72 20 61 20 6a 6f 75 72 6e 61 6c 20 62   for a journal b
4790: 65 69 6e 67 20 63 72 65 61 74 65 64 20 62 79 20  eing created by 
47a0: 61 6e 20 61 63 74 69 76 65 0a 2a 2a 20 74 72 61  an active.** tra
47b0: 6e 73 61 63 74 69 6f 6e 20 69 6e 20 61 6e 6f 74  nsaction in anot
47c0: 68 65 72 20 70 72 6f 63 65 73 73 2c 20 63 61 75  her process, cau
47d0: 73 69 6e 67 20 53 51 4c 69 74 65 20 74 6f 20 72  sing SQLite to r
47e0: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ead from the dat
47f0: 61 62 61 73 65 0a 2a 2a 20 77 69 74 68 6f 75 74  abase.** without
4800: 20 72 6f 6c 6c 69 6e 67 20 69 74 20 62 61 63 6b   rolling it back
4810: 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20  ..**.** To work 
4820: 61 72 6f 75 6e 64 20 74 68 69 73 2c 20 69 66 20  around this, if 
4830: 61 20 63 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f 63  a call to xUnloc
4840: 6b 28 29 20 66 61 69 6c 73 20 77 68 65 6e 20 75  k() fails when u
4850: 6e 6c 6f 63 6b 69 6e 67 20 74 68 65 0a 2a 2a 20  nlocking the.** 
4860: 64 61 74 61 62 61 73 65 20 69 6e 20 74 68 65 20  database in the 
4870: 45 52 52 4f 52 20 73 74 61 74 65 2c 20 50 61 67  ERROR state, Pag
4880: 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74 20  er.eLock is set 
4890: 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e  to UNKNOWN_LOCK.
48a0: 20 49 74 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 63   It.** is only c
48b0: 68 61 6e 67 65 64 20 62 61 63 6b 20 74 6f 20 61  hanged back to a
48c0: 20 72 65 61 6c 20 6c 6f 63 6b 69 6e 67 20 73 74   real locking st
48d0: 61 74 65 20 61 66 74 65 72 20 61 20 73 75 63 63  ate after a succ
48e0: 65 73 73 66 75 6c 20 63 61 6c 6c 0a 2a 2a 20 74  essful call.** t
48f0: 6f 20 78 4c 6f 63 6b 28 45 58 43 4c 55 53 49 56  o xLock(EXCLUSIV
4900: 45 29 2e 20 41 6c 73 6f 2c 20 74 68 65 20 63 6f  E). Also, the co
4910: 64 65 20 74 6f 20 64 6f 20 74 68 65 20 4f 50 45  de to do the OPE
4920: 4e 2d 3e 53 48 41 52 45 44 20 73 74 61 74 65 20  N->SHARED state 
4930: 74 72 61 6e 73 69 74 69 6f 6e 0a 2a 2a 20 6f 6d  transition.** om
4940: 69 74 73 20 74 68 65 20 63 68 65 63 6b 20 66 6f  its the check fo
4950: 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  r a hot-journal 
4960: 69 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69  if Pager.eLock i
4970: 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e  s set to UNKNOWN
4980: 5f 4c 4f 43 4b 20 0a 2a 2a 20 6c 6f 63 6b 2e 20  _LOCK .** lock. 
4990: 49 6e 73 74 65 61 64 2c 20 69 74 20 61 73 73 75  Instead, it assu
49a0: 6d 65 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  mes a hot-journa
49b0: 6c 20 65 78 69 73 74 73 20 61 6e 64 20 6f 62 74  l exists and obt
49c0: 61 69 6e 73 20 61 6e 20 45 58 43 4c 55 53 49 56  ains an EXCLUSIV
49d0: 45 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  E.** lock on the
49e0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62   database file b
49f0: 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67  efore attempting
4a00: 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b   to roll it back
4a10: 2e 20 53 65 65 20 66 75 6e 63 74 69 6f 6e 0a 2a  . See function.*
4a20: 2a 20 50 61 67 65 72 53 68 61 72 65 64 4c 6f 63  * PagerSharedLoc
4a30: 6b 28 29 20 66 6f 72 20 6d 6f 72 65 20 64 65 74  k() for more det
4a40: 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 72  ail..**.** Pager
4a50: 2e 65 4c 6f 63 6b 20 6d 61 79 20 6f 6e 6c 79 20  .eLock may only 
4a60: 62 65 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57  be set to UNKNOW
4a70: 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 65 20  N_LOCK when the 
4a80: 70 61 67 65 72 20 69 73 20 69 6e 20 0a 2a 2a 20  pager is in .** 
4a90: 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65  PAGER_OPEN state
4aa0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 4b  ..*/.#define UNK
4ab0: 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20 20 20 20  NOWN_LOCK       
4ac0: 20 20 20 20 20 20 20 20 20 28 45 58 43 4c 55 53           (EXCLUS
4ad0: 49 56 45 5f 4c 4f 43 4b 2b 31 29 0a 0a 2f 2a 0a  IVE_LOCK+1)../*.
4ae0: 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73 65 64 20  ** A macro used 
4af0: 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65  for invoking the
4b00: 20 63 6f 64 65 63 20 69 66 20 74 68 65 72 65 20   codec if there 
4b10: 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65 66  is one.*/.#ifdef
4b20: 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
4b30: 43 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43  C.# define CODEC
4b40: 31 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 5c 0a 20  1(P,D,N,X,E) \. 
4b50: 20 20 20 69 66 28 20 50 2d 3e 78 43 6f 64 65 63     if( P->xCodec
4b60: 20 26 26 20 50 2d 3e 78 43 6f 64 65 63 28 50 2d   && P->xCodec(P-
4b70: 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 3d 3d  >pCodec,D,N,X)==
4b80: 30 20 29 7b 20 45 3b 20 7d 0a 23 20 64 65 66 69  0 ){ E; }.# defi
4b90: 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c  ne CODEC2(P,D,N,
4ba0: 58 2c 45 2c 4f 29 20 5c 0a 20 20 20 20 69 66 28  X,E,O) \.    if(
4bb0: 20 50 2d 3e 78 43 6f 64 65 63 3d 3d 30 20 29 7b   P->xCodec==0 ){
4bc0: 20 4f 3d 28 63 68 61 72 2a 29 44 3b 20 7d 65 6c   O=(char*)D; }el
4bd0: 73 65 20 5c 0a 20 20 20 20 69 66 28 20 28 4f 3d  se \.    if( (O=
4be0: 28 63 68 61 72 2a 29 28 50 2d 3e 78 43 6f 64 65  (char*)(P->xCode
4bf0: 63 28 50 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c  c(P->pCodec,D,N,
4c00: 58 29 29 29 3d 3d 30 20 29 7b 20 45 3b 20 7d 0a  X)))==0 ){ E; }.
4c10: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 43  #else.# define C
4c20: 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 2c 45 29  ODEC1(P,D,N,X,E)
4c30: 20 20 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a 23     /* NO-OP */.#
4c40: 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32 28 50   define CODEC2(P
4c50: 2c 44 2c 4e 2c 58 2c 45 2c 4f 29 20 4f 3d 28 63  ,D,N,X,E,O) O=(c
4c60: 68 61 72 2a 29 44 0a 23 65 6e 64 69 66 0a 0a 2f  har*)D.#endif../
4c70: 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d  *.** The maximum
4c80: 20 61 6c 6c 6f 77 65 64 20 73 65 63 74 6f 72 20   allowed sector 
4c90: 73 69 7a 65 2e 20 36 34 4b 69 42 2e 20 49 66 20  size. 64KiB. If 
4ca0: 74 68 65 20 78 53 65 63 74 6f 72 73 69 7a 65 28  the xSectorsize(
4cb0: 29 20 6d 65 74 68 6f 64 20 0a 2a 2a 20 72 65 74  ) method .** ret
4cc0: 75 72 6e 73 20 61 20 76 61 6c 75 65 20 6c 61 72  urns a value lar
4cd0: 67 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20 74  ger than this, t
4ce0: 68 65 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53  hen MAX_SECTOR_S
4cf0: 49 5a 45 20 69 73 20 75 73 65 64 20 69 6e 73 74  IZE is used inst
4d00: 65 61 64 2e 0a 2a 2a 20 54 68 69 73 20 63 6f 75  ead..** This cou
4d10: 6c 64 20 63 6f 6e 63 65 69 76 61 62 6c 79 20 63  ld conceivably c
4d20: 61 75 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  ause corruption 
4d30: 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f 77 65  following a powe
4d40: 72 20 66 61 69 6c 75 72 65 20 6f 6e 0a 2a 2a 20  r failure on.** 
4d50: 73 75 63 68 20 61 20 73 79 73 74 65 6d 2e 20 54  such a system. T
4d60: 68 69 73 20 69 73 20 63 75 72 72 65 6e 74 6c 79  his is currently
4d70: 20 61 6e 20 75 6e 64 6f 63 75 6d 65 6e 74 65 64   an undocumented
4d80: 20 6c 69 6d 69 74 2e 0a 2a 2f 0a 23 64 65 66 69   limit..*/.#defi
4d90: 6e 65 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49  ne MAX_SECTOR_SI
4da0: 5a 45 20 30 78 31 30 30 30 30 0a 0a 2f 2a 0a 2a  ZE 0x10000../*.*
4db0: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
4dc0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
4dd0: 74 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f  tructure is allo
4de0: 63 61 74 65 64 20 66 6f 72 20 65 61 63 68 20 61  cated for each a
4df0: 63 74 69 76 65 0a 2a 2a 20 73 61 76 65 70 6f 69  ctive.** savepoi
4e00: 6e 74 20 61 6e 64 20 73 74 61 74 65 6d 65 6e 74  nt and statement
4e10: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20   transaction in 
4e20: 74 68 65 20 73 79 73 74 65 6d 2e 20 41 6c 6c 20  the system. All 
4e30: 73 75 63 68 20 73 74 72 75 63 74 75 72 65 73 0a  such structures.
4e40: 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e  ** are stored in
4e50: 20 74 68 65 20 50 61 67 65 72 2e 61 53 61 76 65   the Pager.aSave
4e60: 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 2c 20 77  point[] array, w
4e70: 68 69 63 68 20 69 73 20 61 6c 6c 6f 63 61 74 65  hich is allocate
4e80: 64 20 61 6e 64 0a 2a 2a 20 72 65 73 69 7a 65 64  d and.** resized
4e90: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 52 65   using sqlite3Re
4ea0: 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a 20 57  alloc()..**.** W
4eb0: 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e 74 20  hen a savepoint 
4ec0: 69 73 20 63 72 65 61 74 65 64 2c 20 74 68 65 20  is created, the 
4ed0: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
4ee0: 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c 64 20  HdrOffset field 
4ef0: 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 2e 20  is.** set to 0. 
4f00: 49 66 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61  If a journal-hea
4f10: 64 65 72 20 69 73 20 77 72 69 74 74 65 6e 20 69  der is written i
4f20: 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75  nto the main jou
4f30: 72 6e 61 6c 20 77 68 69 6c 65 0a 2a 2a 20 74 68  rnal while.** th
4f40: 65 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 61  e savepoint is a
4f50: 63 74 69 76 65 2c 20 74 68 65 6e 20 69 48 64 72  ctive, then iHdr
4f60: 4f 66 66 73 65 74 20 69 73 20 73 65 74 20 74 6f  Offset is set to
4f70: 20 74 68 65 20 62 79 74 65 20 6f 66 66 73 65 74   the byte offset
4f80: 20 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79   .** immediately
4f90: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6c   following the l
4fa0: 61 73 74 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f  ast journal reco
4fb0: 72 64 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  rd written into 
4fc0: 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72  the main.** jour
4fd0: 6e 61 6c 20 62 65 66 6f 72 65 20 74 68 65 20 6a  nal before the j
4fe0: 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 2e 20 54  ournal-header. T
4ff0: 68 69 73 20 69 73 20 72 65 71 75 69 72 65 64 20  his is required 
5000: 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69 6e 74  during savepoint
5010: 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 28 73 65  .** rollback (se
5020: 65 20 70 61 67 65 72 50 6c 61 79 62 61 63 6b 53  e pagerPlaybackS
5030: 61 76 65 70 6f 69 6e 74 28 29 29 2e 0a 2a 2f 0a  avepoint())..*/.
5040: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 50  typedef struct P
5050: 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 50 61  agerSavepoint Pa
5060: 67 65 72 53 61 76 65 70 6f 69 6e 74 3b 0a 73 74  gerSavepoint;.st
5070: 72 75 63 74 20 50 61 67 65 72 53 61 76 65 70 6f  ruct PagerSavepo
5080: 69 6e 74 20 7b 0a 20 20 69 36 34 20 69 4f 66 66  int {.  i64 iOff
5090: 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  set;            
50a0: 20 20 20 20 20 2f 2a 20 53 74 61 72 74 69 6e 67       /* Starting
50b0: 20 6f 66 66 73 65 74 20 69 6e 20 6d 61 69 6e 20   offset in main 
50c0: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34  journal */.  i64
50d0: 20 69 48 64 72 4f 66 66 73 65 74 3b 20 20 20 20   iHdrOffset;    
50e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 65            /* See
50f0: 20 61 62 6f 76 65 20 2a 2f 0a 20 20 42 69 74 76   above */.  Bitv
5100: 65 63 20 2a 70 49 6e 53 61 76 65 70 6f 69 6e 74  ec *pInSavepoint
5110: 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20  ;        /* Set 
5120: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 69 73  of pages in this
5130: 20 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20   savepoint */.  
5140: 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20 20 20  Pgno nOrig;     
5150: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5160: 4f 72 69 67 69 6e 61 6c 20 6e 75 6d 62 65 72 20  Original number 
5170: 6f 66 20 70 61 67 65 73 20 69 6e 20 66 69 6c 65  of pages in file
5180: 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 53 75 62 52   */.  Pgno iSubR
5190: 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
51a0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66     /* Index of f
51b0: 69 72 73 74 20 72 65 63 6f 72 64 20 69 6e 20 73  irst record in s
51c0: 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 69  ub-journal */.#i
51d0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
51e0: 54 5f 57 41 4c 0a 20 20 75 33 32 20 61 57 61 6c  T_WAL.  u32 aWal
51f0: 44 61 74 61 5b 57 41 4c 5f 53 41 56 45 50 4f 49  Data[WAL_SAVEPOI
5200: 4e 54 5f 4e 44 41 54 41 5d 3b 20 20 20 20 20 20  NT_NDATA];      
5210: 20 20 2f 2a 20 57 41 4c 20 73 61 76 65 70 6f 69    /* WAL savepoi
5220: 6e 74 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 23 65  nt context */.#e
5230: 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  ndif.};../*.** A
5240: 20 6f 70 65 6e 20 70 61 67 65 20 63 61 63 68 65   open page cache
5250: 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20   is an instance 
5260: 6f 66 20 73 74 72 75 63 74 20 50 61 67 65 72 2e  of struct Pager.
5270: 20 41 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f   A description o
5280: 66 0a 2a 2a 20 73 6f 6d 65 20 6f 66 20 74 68 65  f.** some of the
5290: 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74 20   more important 
52a0: 6d 65 6d 62 65 72 20 76 61 72 69 61 62 6c 65 73  member variables
52b0: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
52c0: 65 53 74 61 74 65 0a 2a 2a 0a 2a 2a 20 20 20 54  eState.**.**   T
52d0: 68 65 20 63 75 72 72 65 6e 74 20 27 73 74 61 74  he current 'stat
52e0: 65 27 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  e' of the pager 
52f0: 6f 62 6a 65 63 74 2e 20 53 65 65 20 74 68 65 20  object. See the 
5300: 63 6f 6d 6d 65 6e 74 20 61 6e 64 20 73 74 61 74  comment and stat
5310: 65 0a 2a 2a 20 20 20 64 69 61 67 72 61 6d 20 61  e.**   diagram a
5320: 62 6f 76 65 20 66 6f 72 20 61 20 64 65 73 63 72  bove for a descr
5330: 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61  iption of the pa
5340: 67 65 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  ger state..**.**
5350: 20 65 4c 6f 63 6b 0a 2a 2a 0a 2a 2a 20 20 20 46   eLock.**.**   F
5360: 6f 72 20 61 20 72 65 61 6c 20 6f 6e 2d 64 69 73  or a real on-dis
5370: 6b 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  k database, the 
5380: 63 75 72 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c  current lock hel
5390: 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
53a0: 65 20 66 69 6c 65 20 2d 0a 2a 2a 20 20 20 4e 4f  e file -.**   NO
53b0: 5f 4c 4f 43 4b 2c 20 53 48 41 52 45 44 5f 4c 4f  _LOCK, SHARED_LO
53c0: 43 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  CK, RESERVED_LOC
53d0: 4b 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f 4c  K or EXCLUSIVE_L
53e0: 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72  OCK..**.**   For
53f0: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 6f 72 20   a temporary or 
5400: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
5410: 73 65 20 28 6e 65 69 74 68 65 72 20 6f 66 20 77  se (neither of w
5420: 68 69 63 68 20 72 65 71 75 69 72 65 20 61 6e 79  hich require any
5430: 0a 2a 2a 20 20 20 6c 6f 63 6b 73 29 2c 20 74 68  .**   locks), th
5440: 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 61  is variable is a
5450: 6c 77 61 79 73 20 73 65 74 20 74 6f 20 45 58 43  lways set to EXC
5460: 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 53 69 6e  LUSIVE_LOCK. Sin
5470: 63 65 20 73 75 63 68 0a 2a 2a 20 20 20 64 61 74  ce such.**   dat
5480: 61 62 61 73 65 73 20 61 6c 77 61 79 73 20 68 61  abases always ha
5490: 76 65 20 50 61 67 65 72 2e 65 78 63 6c 75 73 69  ve Pager.exclusi
54a0: 76 65 4d 6f 64 65 3d 3d 31 2c 20 74 68 69 73 20  veMode==1, this 
54b0: 74 72 69 63 6b 73 20 74 68 65 20 70 61 67 65 72  tricks the pager
54c0: 0a 2a 2a 20 20 20 6c 6f 67 69 63 20 69 6e 74 6f  .**   logic into
54d0: 20 74 68 69 6e 6b 69 6e 67 20 74 68 61 74 20 69   thinking that i
54e0: 74 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 6c  t already has al
54f0: 6c 20 74 68 65 20 6c 6f 63 6b 73 20 69 74 20 77  l the locks it w
5500: 69 6c 6c 20 65 76 65 72 0a 2a 2a 20 20 20 6e 65  ill ever.**   ne
5510: 65 64 20 28 61 6e 64 20 6e 6f 20 72 65 61 73 6f  ed (and no reaso
5520: 6e 20 74 6f 20 72 65 6c 65 61 73 65 20 74 68 65  n to release the
5530: 6d 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20 73  m)..**.**   In s
5540: 6f 6d 65 20 28 6f 62 73 63 75 72 65 29 20 63 69  ome (obscure) ci
5550: 72 63 75 6d 73 74 61 6e 63 65 73 2c 20 74 68 69  rcumstances, thi
5560: 73 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 61  s variable may a
5570: 6c 73 6f 20 62 65 20 73 65 74 20 74 6f 0a 2a 2a  lso be set to.**
5580: 20 20 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e     UNKNOWN_LOCK.
5590: 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74   See the comment
55a0: 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69   above the #defi
55b0: 6e 65 20 6f 66 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  ne of UNKNOWN_LO
55c0: 43 4b 20 66 6f 72 0a 2a 2a 20 20 20 64 65 74 61  CK for.**   deta
55d0: 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 63 68 61 6e 67  ils..**.** chang
55e0: 65 43 6f 75 6e 74 44 6f 6e 65 0a 2a 2a 0a 2a 2a  eCountDone.**.**
55f0: 20 20 20 54 68 69 73 20 62 6f 6f 6c 65 61 6e 20     This boolean 
5600: 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64  variable is used
5610: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
5620: 61 74 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  at the change-co
5630: 75 6e 74 65 72 20 0a 2a 2a 20 20 20 28 74 68 65  unter .**   (the
5640: 20 34 2d 62 79 74 65 20 68 65 61 64 65 72 20 66   4-byte header f
5650: 69 65 6c 64 20 61 74 20 62 79 74 65 20 6f 66 66  ield at byte off
5660: 73 65 74 20 32 34 20 6f 66 20 74 68 65 20 64 61  set 24 of the da
5670: 74 61 62 61 73 65 20 66 69 6c 65 29 20 69 73 20  tabase file) is 
5680: 0a 2a 2a 20 20 20 6e 6f 74 20 75 70 64 61 74 65  .**   not update
5690: 64 20 6d 6f 72 65 20 6f 66 74 65 6e 20 74 68 61  d more often tha
56a0: 6e 20 6e 65 63 65 73 73 61 72 79 2e 20 0a 2a 2a  n necessary. .**
56b0: 0a 2a 2a 20 20 20 49 74 20 69 73 20 73 65 74 20  .**   It is set 
56c0: 74 6f 20 74 72 75 65 20 77 68 65 6e 20 74 68 65  to true when the
56d0: 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
56e0: 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65 64  field is updated
56f0: 2c 20 77 68 69 63 68 20 0a 2a 2a 20 20 20 63 61  , which .**   ca
5700: 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66  n only happen if
5710: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
5720: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
5730: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
5740: 0a 2a 2a 20 20 20 49 74 20 69 73 20 63 6c 65 61  .**   It is clea
5750: 72 65 64 20 28 73 65 74 20 74 6f 20 66 61 6c 73  red (set to fals
5760: 65 29 20 77 68 65 6e 65 76 65 72 20 61 6e 20 65  e) whenever an e
5770: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73  xclusive lock is
5780: 20 0a 2a 2a 20 20 20 72 65 6c 69 6e 71 75 69 73   .**   relinquis
5790: 68 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62  hed on the datab
57a0: 61 73 65 20 66 69 6c 65 2e 20 45 61 63 68 20 74  ase file. Each t
57b0: 69 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ime a transactio
57c0: 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2c 0a  n is committed,.
57d0: 2a 2a 20 20 20 54 68 65 20 63 68 61 6e 67 65 43  **   The changeC
57e0: 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 69 73  ountDone flag is
57f0: 20 69 6e 73 70 65 63 74 65 64 2e 20 49 66 20 69   inspected. If i
5800: 74 20 69 73 20 74 72 75 65 2c 20 74 68 65 20 77  t is true, the w
5810: 6f 72 6b 20 6f 66 0a 2a 2a 20 20 20 75 70 64 61  ork of.**   upda
5820: 74 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65 2d  ting the change-
5830: 63 6f 75 6e 74 65 72 20 69 73 20 6f 6d 69 74 74  counter is omitt
5840: 65 64 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  ed for the curre
5850: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  nt transaction..
5860: 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20 6d 65 63  **.**   This mec
5870: 68 61 6e 69 73 6d 20 6d 65 61 6e 73 20 74 68 61  hanism means tha
5880: 74 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69  t when running i
5890: 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
58a0: 2c 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a  , a connection .
58b0: 2a 2a 20 20 20 6e 65 65 64 20 6f 6e 6c 79 20 75  **   need only u
58c0: 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65  pdate the change
58d0: 2d 63 6f 75 6e 74 65 72 20 6f 6e 63 65 2c 20 66  -counter once, f
58e0: 6f 72 20 74 68 65 20 66 69 72 73 74 20 74 72 61  or the first tra
58f0: 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 63 6f  nsaction.**   co
5900: 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 73  mmitted..**.** s
5910: 65 74 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 20  etMaster.**.**  
5920: 20 57 68 65 6e 20 50 61 67 65 72 43 6f 6d 6d 69   When PagerCommi
5930: 74 50 68 61 73 65 4f 6e 65 28 29 20 69 73 20 63  tPhaseOne() is c
5940: 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 6d 69 74 20  alled to commit 
5950: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69  a transaction, i
5960: 74 20 6d 61 79 0a 2a 2a 20 20 20 28 6f 72 20 6d  t may.**   (or m
5970: 61 79 20 6e 6f 74 29 20 73 70 65 63 69 66 79 20  ay not) specify 
5980: 61 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  a master-journal
5990: 20 6e 61 6d 65 20 74 6f 20 62 65 20 77 72 69 74   name to be writ
59a0: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 0a 2a 2a  ten into the .**
59b0: 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20     journal file 
59c0: 62 65 66 6f 72 65 20 69 74 20 69 73 20 73 79 6e  before it is syn
59d0: 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a  ced to disk..**.
59e0: 2a 2a 20 20 20 57 68 65 74 68 65 72 20 6f 72 20  **   Whether or 
59f0: 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  not a journal fi
5a00: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 6d 61  le contains a ma
5a10: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster-journal poi
5a20: 6e 74 65 72 20 61 66 66 65 63 74 73 20 0a 2a 2a  nter affects .**
5a30: 20 20 20 74 68 65 20 77 61 79 20 69 6e 20 77 68     the way in wh
5a40: 69 63 68 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ich the journal 
5a50: 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65  file is finalize
5a60: 64 20 61 66 74 65 72 20 74 68 65 20 74 72 61 6e  d after the tran
5a70: 73 61 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20 20  saction is .**  
5a80: 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f   committed or ro
5a90: 6c 6c 65 64 20 62 61 63 6b 20 77 68 65 6e 20 72  lled back when r
5aa0: 75 6e 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e  unning in "journ
5ab0: 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54 22  al_mode=PERSIST"
5ac0: 20 6d 6f 64 65 2e 0a 2a 2a 20 20 20 49 66 20 61   mode..**   If a
5ad0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f   journal file do
5ae0: 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61  es not contain a
5af0: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
5b00: 70 6f 69 6e 74 65 72 2c 20 69 74 20 69 73 0a 2a  pointer, it is.*
5b10: 2a 20 20 20 66 69 6e 61 6c 69 7a 65 64 20 62 79  *   finalized by
5b20: 20 6f 76 65 72 77 72 69 74 69 6e 67 20 74 68 65   overwriting the
5b30: 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68   first journal h
5b40: 65 61 64 65 72 20 77 69 74 68 20 7a 65 72 6f 65  eader with zeroe
5b50: 73 2e 20 49 66 0a 2a 2a 20 20 20 69 74 20 64 6f  s. If.**   it do
5b60: 65 73 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61 73  es contain a mas
5b70: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter-journal poin
5b80: 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ter the journal 
5b90: 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65  file is finalize
5ba0: 64 20 0a 2a 2a 20 20 20 62 79 20 74 72 75 6e 63  d .**   by trunc
5bb0: 61 74 69 6e 67 20 69 74 20 74 6f 20 7a 65 72 6f  ating it to zero
5bc0: 20 62 79 74 65 73 2c 20 6a 75 73 74 20 61 73 20   bytes, just as 
5bd0: 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  if the connectio
5be0: 6e 20 77 65 72 65 20 0a 2a 2a 20 20 20 72 75 6e  n were .**   run
5bf0: 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e 61 6c  ning in "journal
5c00: 5f 6d 6f 64 65 3d 74 72 75 6e 63 61 74 65 22 20  _mode=truncate" 
5c10: 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 4a 6f  mode..**.**   Jo
5c20: 75 72 6e 61 6c 20 66 69 6c 65 73 20 74 68 61 74  urnal files that
5c30: 20 63 6f 6e 74 61 69 6e 20 6d 61 73 74 65 72 20   contain master 
5c40: 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 73  journal pointers
5c50: 20 63 61 6e 6e 6f 74 20 62 65 20 66 69 6e 61 6c   cannot be final
5c60: 69 7a 65 64 0a 2a 2a 20 20 20 73 69 6d 70 6c 79  ized.**   simply
5c70: 20 62 79 20 6f 76 65 72 77 72 69 74 69 6e 67 20   by overwriting 
5c80: 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61  the first journa
5c90: 6c 2d 68 65 61 64 65 72 20 77 69 74 68 20 7a 65  l-header with ze
5ca0: 72 6f 65 73 2c 20 61 73 20 74 68 65 0a 2a 2a 20  roes, as the.** 
5cb0: 20 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c    master journal
5cc0: 20 70 6f 69 6e 74 65 72 20 63 6f 75 6c 64 20 69   pointer could i
5cd0: 6e 74 65 72 66 65 72 65 20 77 69 74 68 20 68 6f  nterfere with ho
5ce0: 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
5cf0: 63 6b 20 6f 66 20 61 6e 79 0a 2a 2a 20 20 20 73  ck of any.**   s
5d00: 75 62 73 65 71 75 65 6e 74 6c 79 20 69 6e 74 65  ubsequently inte
5d10: 72 72 75 70 74 65 64 20 74 72 61 6e 73 61 63 74  rrupted transact
5d20: 69 6f 6e 20 74 68 61 74 20 72 65 75 73 65 73 20  ion that reuses 
5d30: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
5d40: 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 66 6c  ..**.**   The fl
5d50: 61 67 20 69 73 20 63 6c 65 61 72 65 64 20 61 73  ag is cleared as
5d60: 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 6a 6f 75   soon as the jou
5d70: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 66 69 6e  rnal file is fin
5d80: 61 6c 69 7a 65 64 20 28 65 69 74 68 65 72 0a 2a  alized (either.*
5d90: 2a 20 20 20 62 79 20 50 61 67 65 72 43 6f 6d 6d  *   by PagerComm
5da0: 69 74 50 68 61 73 65 54 77 6f 20 6f 72 20 50 61  itPhaseTwo or Pa
5db0: 67 65 72 52 6f 6c 6c 62 61 63 6b 29 2e 20 49 66  gerRollback). If
5dc0: 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 70 72 65   an IO error pre
5dd0: 76 65 6e 74 73 20 74 68 65 0a 2a 2a 20 20 20 6a  vents the.**   j
5de0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 72 6f 6d  ournal file from
5df0: 20 62 65 69 6e 67 20 73 75 63 63 65 73 73 66 75   being successfu
5e00: 6c 6c 79 20 66 69 6e 61 6c 69 7a 65 64 2c 20 74  lly finalized, t
5e10: 68 65 20 73 65 74 4d 61 73 74 65 72 20 66 6c 61  he setMaster fla
5e20: 67 0a 2a 2a 20 20 20 69 73 20 63 6c 65 61 72 65  g.**   is cleare
5e30: 64 20 61 6e 79 77 61 79 20 28 61 6e 64 20 74 68  d anyway (and th
5e40: 65 20 70 61 67 65 72 20 77 69 6c 6c 20 6d 6f 76  e pager will mov
5e50: 65 20 74 6f 20 45 52 52 4f 52 20 73 74 61 74 65  e to ERROR state
5e60: 29 2e 0a 2a 2a 0a 2a 2a 20 64 6f 4e 6f 74 53 70  )..**.** doNotSp
5e70: 69 6c 6c 2c 20 64 6f 4e 6f 74 53 79 6e 63 53 70  ill, doNotSyncSp
5e80: 69 6c 6c 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 73  ill.**.**   Thes
5e90: 65 20 74 77 6f 20 62 6f 6f 6c 65 61 6e 20 76 61  e two boolean va
5ea0: 72 69 61 62 6c 65 73 20 63 6f 6e 74 72 6f 6c 20  riables control 
5eb0: 74 68 65 20 62 65 68 61 76 69 6f 75 72 20 6f 66  the behaviour of
5ec0: 20 63 61 63 68 65 2d 73 70 69 6c 6c 73 0a 2a 2a   cache-spills.**
5ed0: 20 20 20 28 63 61 6c 6c 73 20 6d 61 64 65 20 62     (calls made b
5ee0: 79 20 74 68 65 20 70 63 61 63 68 65 20 6d 6f 64  y the pcache mod
5ef0: 75 6c 65 20 74 6f 20 74 68 65 20 70 61 67 65 72  ule to the pager
5f00: 53 74 72 65 73 73 28 29 20 72 6f 75 74 69 6e 65  Stress() routine
5f10: 20 74 6f 0a 2a 2a 20 20 20 77 72 69 74 65 20 63   to.**   write c
5f20: 61 63 68 65 64 20 64 61 74 61 20 74 6f 20 74 68  ached data to th
5f30: 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 69 6e  e file-system in
5f40: 20 6f 72 64 65 72 20 74 6f 20 66 72 65 65 20 75   order to free u
5f50: 70 20 6d 65 6d 6f 72 79 29 2e 0a 2a 2a 0a 2a 2a  p memory)..**.**
5f60: 20 20 20 57 68 65 6e 20 64 6f 4e 6f 74 53 70 69     When doNotSpi
5f70: 6c 6c 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ll is non-zero, 
5f80: 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64  writing to the d
5f90: 61 74 61 62 61 73 65 20 66 72 6f 6d 20 70 61 67  atabase from pag
5fa0: 65 72 53 74 72 65 73 73 28 29 0a 2a 2a 20 20 20  erStress().**   
5fb0: 69 73 20 64 69 73 61 62 6c 65 64 20 61 6c 74 6f  is disabled alto
5fc0: 67 65 74 68 65 72 2e 20 54 68 69 73 20 69 73 20  gether. This is 
5fd0: 64 6f 6e 65 20 69 6e 20 61 20 76 65 72 79 20 6f  done in a very o
5fe0: 62 73 63 75 72 65 20 63 61 73 65 20 74 68 61 74  bscure case that
5ff0: 0a 2a 2a 20 20 20 63 6f 6d 65 73 20 75 70 20 64  .**   comes up d
6000: 75 72 69 6e 67 20 73 61 76 65 70 6f 69 6e 74 20  uring savepoint 
6010: 72 6f 6c 6c 62 61 63 6b 20 74 68 61 74 20 72 65  rollback that re
6020: 71 75 69 72 65 73 20 74 68 65 20 70 63 61 63 68  quires the pcach
6030: 65 20 6d 6f 64 75 6c 65 0a 2a 2a 20 20 20 74 6f  e module.**   to
6040: 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   allocate a new 
6050: 70 61 67 65 20 74 6f 20 70 72 65 76 65 6e 74 20  page to prevent 
6060: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
6070: 20 66 72 6f 6d 20 62 65 69 6e 67 20 77 72 69 74   from being writ
6080: 74 65 6e 0a 2a 2a 20 20 20 77 68 69 6c 65 20 69  ten.**   while i
6090: 74 20 69 73 20 62 65 69 6e 67 20 74 72 61 76 65  t is being trave
60a0: 72 73 65 64 20 62 79 20 63 6f 64 65 20 69 6e 20  rsed by code in 
60b0: 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
60c0: 2e 0a 2a 2a 20 0a 2a 2a 20 20 20 49 66 20 64 6f  ..** .**   If do
60d0: 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 20 69 73 20  NotSyncSpill is 
60e0: 6e 6f 6e 2d 7a 65 72 6f 2c 20 77 72 69 74 69 6e  non-zero, writin
60f0: 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
6100: 65 20 66 72 6f 6d 20 70 61 67 65 72 53 74 72 65  e from pagerStre
6110: 73 73 28 29 0a 2a 2a 20 20 20 69 73 20 70 65 72  ss().**   is per
6120: 6d 69 74 74 65 64 2c 20 62 75 74 20 73 79 6e 63  mitted, but sync
6130: 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ing the journal 
6140: 66 69 6c 65 20 69 73 20 6e 6f 74 2e 20 54 68 69  file is not. Thi
6150: 73 20 66 6c 61 67 20 69 73 20 73 65 74 0a 2a 2a  s flag is set.**
6160: 20 20 20 62 79 20 73 71 6c 69 74 65 33 50 61 67     by sqlite3Pag
6170: 65 72 57 72 69 74 65 28 29 20 77 68 65 6e 20 74  erWrite() when t
6180: 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73  he file-system s
6190: 65 63 74 6f 72 2d 73 69 7a 65 20 69 73 20 6c 61  ector-size is la
61a0: 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 20 20 74  rger than.**   t
61b0: 68 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65  he database page
61c0: 2d 73 69 7a 65 20 69 6e 20 6f 72 64 65 72 20 74  -size in order t
61d0: 6f 20 70 72 65 76 65 6e 74 20 61 20 6a 6f 75 72  o prevent a jour
61e0: 6e 61 6c 20 73 79 6e 63 20 66 72 6f 6d 20 68 61  nal sync from ha
61f0: 70 70 65 6e 69 6e 67 20 0a 2a 2a 20 20 20 69 6e  ppening .**   in
6200: 20 62 65 74 77 65 65 6e 20 74 68 65 20 6a 6f 75   between the jou
6210: 72 6e 61 6c 6c 69 6e 67 20 6f 66 20 74 77 6f 20  rnalling of two 
6220: 70 61 67 65 73 20 6f 6e 20 74 68 65 20 73 61 6d  pages on the sam
6230: 65 20 73 65 63 74 6f 72 2e 20 0a 2a 2a 0a 2a 2a  e sector. .**.**
6240: 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 0a 2a 2a   subjInMemory.**
6250: 0a 2a 2a 20 20 20 54 68 69 73 20 69 73 20 61 20  .**   This is a 
6260: 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61 62 6c 65  boolean variable
6270: 2e 20 49 66 20 74 72 75 65 2c 20 74 68 65 6e 20  . If true, then 
6280: 61 6e 79 20 72 65 71 75 69 72 65 64 20 73 75 62  any required sub
6290: 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 69 73  -journal.**   is
62a0: 20 6f 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e   opened as an in
62b0: 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20  -memory journal 
62c0: 66 69 6c 65 2e 20 49 66 20 66 61 6c 73 65 2c 20  file. If false, 
62d0: 74 68 65 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a  then in-memory.*
62e0: 2a 20 20 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73  *   sub-journals
62f0: 20 61 72 65 20 6f 6e 6c 79 20 75 73 65 64 20 66   are only used f
6300: 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  or in-memory pag
6310: 65 72 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  er files..**.** 
6320: 20 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20    This variable 
6330: 69 73 20 75 70 64 61 74 65 64 20 62 79 20 74 68  is updated by th
6340: 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 65 61  e upper layer ea
6350: 63 68 20 74 69 6d 65 20 61 20 6e 65 77 20 0a 2a  ch time a new .*
6360: 2a 20 20 20 77 72 69 74 65 2d 74 72 61 6e 73 61  *   write-transa
6370: 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 2e  ction is opened.
6380: 0a 2a 2a 0a 2a 2a 20 64 62 53 69 7a 65 2c 20 64  .**.** dbSize, d
6390: 62 4f 72 69 67 53 69 7a 65 2c 20 64 62 46 69 6c  bOrigSize, dbFil
63a0: 65 53 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 56 61  eSize.**.**   Va
63b0: 72 69 61 62 6c 65 20 64 62 53 69 7a 65 20 69 73  riable dbSize is
63c0: 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62   set to the numb
63d0: 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
63e0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
63f0: 2e 0a 2a 2a 20 20 20 49 74 20 69 73 20 76 61 6c  ..**   It is val
6400: 69 64 20 69 6e 20 50 41 47 45 52 5f 52 45 41 44  id in PAGER_READ
6410: 45 52 20 61 6e 64 20 68 69 67 68 65 72 20 73 74  ER and higher st
6420: 61 74 65 73 20 28 61 6c 6c 20 73 74 61 74 65 73  ates (all states
6430: 20 65 78 63 65 70 74 20 66 6f 72 0a 2a 2a 20 20   except for.**  
6440: 20 4f 50 45 4e 20 61 6e 64 20 45 52 52 4f 52 29   OPEN and ERROR)
6450: 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 64 62 53 69 7a  . .**.**   dbSiz
6460: 65 20 69 73 20 73 65 74 20 62 61 73 65 64 20 6f  e is set based o
6470: 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  n the size of th
6480: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
6490: 20 77 68 69 63 68 20 6d 61 79 20 62 65 20 0a 2a   which may be .*
64a0: 2a 20 20 20 6c 61 72 67 65 72 20 74 68 61 6e 20  *   larger than 
64b0: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
64c0: 64 61 74 61 62 61 73 65 20 28 74 68 65 20 76 61  database (the va
64d0: 6c 75 65 20 73 74 6f 72 65 64 20 61 74 20 6f 66  lue stored at of
64e0: 66 73 65 74 0a 2a 2a 20 20 20 32 38 20 6f 66 20  fset.**   28 of 
64f0: 74 68 65 20 64 61 74 61 62 61 73 65 20 68 65 61  the database hea
6500: 64 65 72 20 62 79 20 74 68 65 20 62 74 72 65 65  der by the btree
6510: 29 2e 20 49 66 20 74 68 65 20 73 69 7a 65 20 6f  ). If the size o
6520: 66 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 20 20  f the file.**   
6530: 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65  is not an intege
6540: 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74 68  r multiple of th
6550: 65 20 70 61 67 65 2d 73 69 7a 65 2c 20 74 68 65  e page-size, the
6560: 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e   value stored in
6570: 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20  .**   dbSize is 
6580: 72 6f 75 6e 64 65 64 20 64 6f 77 6e 20 28 69 2e  rounded down (i.
6590: 65 2e 20 61 20 35 4b 42 20 66 69 6c 65 20 77 69  e. a 5KB file wi
65a0: 74 68 20 32 4b 20 70 61 67 65 2d 73 69 7a 65 20  th 2K page-size 
65b0: 68 61 73 20 64 62 53 69 7a 65 3d 3d 32 29 2e 0a  has dbSize==2)..
65c0: 2a 2a 20 20 20 45 78 63 65 70 74 2c 20 61 6e 79  **   Except, any
65d0: 20 66 69 6c 65 20 74 68 61 74 20 69 73 20 67 72   file that is gr
65e0: 65 61 74 65 72 20 74 68 61 6e 20 30 20 62 79 74  eater than 0 byt
65f0: 65 73 20 69 6e 20 73 69 7a 65 20 69 73 20 63 6f  es in size is co
6600: 6e 73 69 64 65 72 65 64 0a 2a 2a 20 20 20 74 6f  nsidered.**   to
6610: 20 68 61 76 65 20 61 74 20 6c 65 61 73 74 20 6f   have at least o
6620: 6e 65 20 70 61 67 65 2e 20 28 69 2e 65 2e 20 61  ne page. (i.e. a
6630: 20 31 4b 42 20 66 69 6c 65 20 77 69 74 68 20 32   1KB file with 2
6640: 4b 20 70 61 67 65 2d 73 69 7a 65 20 6c 65 61 64  K page-size lead
6650: 73 0a 2a 2a 20 20 20 74 6f 20 64 62 53 69 7a 65  s.**   to dbSize
6660: 3d 3d 31 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 44 75  ==1)..**.**   Du
6670: 72 69 6e 67 20 61 20 77 72 69 74 65 2d 74 72 61  ring a write-tra
6680: 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20 70 61 67  nsaction, if pag
6690: 65 73 20 77 69 74 68 20 70 61 67 65 2d 6e 75 6d  es with page-num
66a0: 62 65 72 73 20 67 72 65 61 74 65 72 20 74 68 61  bers greater tha
66b0: 6e 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 61 72  n.**   dbSize ar
66c0: 65 20 6d 6f 64 69 66 69 65 64 20 69 6e 20 74 68  e modified in th
66d0: 65 20 63 61 63 68 65 2c 20 64 62 53 69 7a 65 20  e cache, dbSize 
66e0: 69 73 20 75 70 64 61 74 65 64 20 61 63 63 6f 72  is updated accor
66f0: 64 69 6e 67 6c 79 2e 0a 2a 2a 20 20 20 53 69 6d  dingly..**   Sim
6700: 69 6c 61 72 6c 79 2c 20 69 66 20 74 68 65 20 64  ilarly, if the d
6710: 61 74 61 62 61 73 65 20 69 73 20 74 72 75 6e 63  atabase is trunc
6720: 61 74 65 64 20 75 73 69 6e 67 20 50 61 67 65 72  ated using Pager
6730: 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 29 2c  TruncateImage(),
6740: 20 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73   .**   dbSize is
6750: 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   updated..**.** 
6760: 20 20 56 61 72 69 61 62 6c 65 73 20 64 62 4f 72    Variables dbOr
6770: 69 67 53 69 7a 65 20 61 6e 64 20 64 62 46 69 6c  igSize and dbFil
6780: 65 53 69 7a 65 20 61 72 65 20 76 61 6c 69 64 20  eSize are valid 
6790: 69 6e 20 73 74 61 74 65 73 20 0a 2a 2a 20 20 20  in states .**   
67a0: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
67b0: 4b 45 44 20 61 6e 64 20 68 69 67 68 65 72 2e 20  KED and higher. 
67c0: 64 62 4f 72 69 67 53 69 7a 65 20 69 73 20 61 20  dbOrigSize is a 
67d0: 63 6f 70 79 20 6f 66 20 74 68 65 20 64 62 53 69  copy of the dbSi
67e0: 7a 65 0a 2a 2a 20 20 20 76 61 72 69 61 62 6c 65  ze.**   variable
67f0: 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
6800: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
6810: 2e 20 49 74 20 69 73 20 75 73 65 64 20 64 75 72  . It is used dur
6820: 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2c 0a 2a 2a  ing rollback,.**
6830: 20 20 20 61 6e 64 20 74 6f 20 64 65 74 65 72 6d     and to determ
6840: 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ine whether or n
6850: 6f 74 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f  ot pages need to
6860: 20 62 65 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 62   be journalled b
6870: 65 66 6f 72 65 0a 2a 2a 20 20 20 62 65 69 6e 67  efore.**   being
6880: 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a   modified..**.**
6890: 20 20 20 54 68 72 6f 75 67 68 6f 75 74 20 61 20     Throughout a 
68a0: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
68b0: 6e 2c 20 64 62 46 69 6c 65 53 69 7a 65 20 63 6f  n, dbFileSize co
68c0: 6e 74 61 69 6e 73 20 74 68 65 20 73 69 7a 65 20  ntains the size 
68d0: 6f 66 0a 2a 2a 20 20 20 74 68 65 20 66 69 6c 65  of.**   the file
68e0: 20 6f 6e 20 64 69 73 6b 20 69 6e 20 70 61 67 65   on disk in page
68f0: 73 2e 20 49 74 20 69 73 20 73 65 74 20 74 6f 20  s. It is set to 
6900: 61 20 63 6f 70 79 20 6f 66 20 64 62 53 69 7a 65  a copy of dbSize
6910: 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 20 20 77   when the.**   w
6920: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
6930: 20 69 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64   is first opened
6940: 2c 20 61 6e 64 20 75 70 64 61 74 65 64 20 77 68  , and updated wh
6950: 65 6e 20 56 46 53 20 63 61 6c 6c 73 20 61 72 65  en VFS calls are
6960: 20 6d 61 64 65 0a 2a 2a 20 20 20 74 6f 20 77 72   made.**   to wr
6970: 69 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20  ite or truncate 
6980: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
6990: 65 20 6f 6e 20 64 69 73 6b 2e 20 0a 2a 2a 0a 2a  e on disk. .**.*
69a0: 2a 20 20 20 54 68 65 20 6f 6e 6c 79 20 72 65 61  *   The only rea
69b0: 73 6f 6e 20 74 68 65 20 64 62 46 69 6c 65 53 69  son the dbFileSi
69c0: 7a 65 20 76 61 72 69 61 62 6c 65 20 69 73 20 72  ze variable is r
69d0: 65 71 75 69 72 65 64 20 69 73 20 74 6f 20 73 75  equired is to su
69e0: 70 70 72 65 73 73 20 0a 2a 2a 20 20 20 75 6e 6e  ppress .**   unn
69f0: 65 63 65 73 73 61 72 79 20 63 61 6c 6c 73 20 74  ecessary calls t
6a00: 6f 20 78 54 72 75 6e 63 61 74 65 28 29 20 61 66  o xTruncate() af
6a10: 74 65 72 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61  ter committing a
6a20: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66   transaction. If
6a30: 2c 20 0a 2a 2a 20 20 20 77 68 65 6e 20 61 20 74  , .**   when a t
6a40: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f  ransaction is co
6a50: 6d 6d 69 74 74 65 64 2c 20 74 68 65 20 64 62 46  mmitted, the dbF
6a60: 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c 65  ileSize variable
6a70: 20 69 6e 64 69 63 61 74 65 73 20 0a 2a 2a 20 20   indicates .**  
6a80: 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61   that the databa
6a90: 73 65 20 66 69 6c 65 20 69 73 20 6c 61 72 67 65  se file is large
6aa0: 72 20 74 68 61 6e 20 74 68 65 20 64 61 74 61 62  r than the datab
6ab0: 61 73 65 20 69 6d 61 67 65 20 28 50 61 67 65 72  ase image (Pager
6ac0: 2e 64 62 53 69 7a 65 29 2c 20 0a 2a 2a 20 20 20  .dbSize), .**   
6ad0: 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29  pager_truncate()
6ae0: 20 69 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 20   is called. The 
6af0: 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29  pager_truncate()
6b00: 20 63 61 6c 6c 20 75 73 65 73 20 78 46 69 6c 65   call uses xFile
6b10: 73 69 7a 65 28 29 0a 2a 2a 20 20 20 74 6f 20 6d  size().**   to m
6b20: 65 61 73 75 72 65 20 74 68 65 20 64 61 74 61 62  easure the datab
6b30: 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  ase file on disk
6b40: 2c 20 61 6e 64 20 74 68 65 6e 20 74 72 75 6e 63  , and then trunc
6b50: 61 74 65 73 20 69 74 20 69 66 20 72 65 71 75 69  ates it if requi
6b60: 72 65 64 2e 0a 2a 2a 20 20 20 64 62 46 69 6c 65  red..**   dbFile
6b70: 53 69 7a 65 20 69 73 20 6e 6f 74 20 75 73 65 64  Size is not used
6b80: 20 77 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61   when rolling ba
6b90: 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ck a transaction
6ba0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 0a 2a  . In this case.*
6bb0: 2a 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61  *   pager_trunca
6bc0: 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 75  te() is called u
6bd0: 6e 63 6f 6e 64 69 74 69 6f 6e 61 6c 6c 79 20 28  nconditionally (
6be0: 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68 65 72  which means ther
6bf0: 65 20 6d 61 79 20 62 65 0a 2a 2a 20 20 20 61 20  e may be.**   a 
6c00: 63 61 6c 6c 20 74 6f 20 78 46 69 6c 65 73 69 7a  call to xFilesiz
6c10: 65 28 29 20 74 68 61 74 20 69 73 20 6e 6f 74 20  e() that is not 
6c20: 73 74 72 69 63 74 6c 79 20 72 65 71 75 69 72 65  strictly require
6c30: 64 29 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61  d). In either ca
6c40: 73 65 2c 0a 2a 2a 20 20 20 70 61 67 65 72 5f 74  se,.**   pager_t
6c50: 72 75 6e 63 61 74 65 28 29 20 6d 61 79 20 63 61  runcate() may ca
6c60: 75 73 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20  use the file to 
6c70: 62 65 63 6f 6d 65 20 73 6d 61 6c 6c 65 72 20 6f  become smaller o
6c80: 72 20 6c 61 72 67 65 72 2e 0a 2a 2a 0a 2a 2a 20  r larger..**.** 
6c90: 64 62 48 69 6e 74 53 69 7a 65 0a 2a 2a 0a 2a 2a  dbHintSize.**.**
6ca0: 20 20 20 54 68 65 20 64 62 48 69 6e 74 53 69 7a     The dbHintSiz
6cb0: 65 20 76 61 72 69 61 62 6c 65 20 69 73 20 75 73  e variable is us
6cc0: 65 64 20 74 6f 20 6c 69 6d 69 74 20 74 68 65 20  ed to limit the 
6cd0: 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20  number of calls 
6ce0: 6d 61 64 65 20 74 6f 0a 2a 2a 20 20 20 74 68 65  made to.**   the
6cf0: 20 56 46 53 20 78 46 69 6c 65 43 6f 6e 74 72 6f   VFS xFileContro
6d00: 6c 28 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e  l(FCNTL_SIZE_HIN
6d10: 54 29 20 6d 65 74 68 6f 64 2e 20 0a 2a 2a 0a 2a  T) method. .**.*
6d20: 2a 20 20 20 64 62 48 69 6e 74 53 69 7a 65 20 69  *   dbHintSize i
6d30: 73 20 73 65 74 20 74 6f 20 61 20 63 6f 70 79 20  s set to a copy 
6d40: 6f 66 20 74 68 65 20 64 62 53 69 7a 65 20 76 61  of the dbSize va
6d50: 72 69 61 62 6c 65 20 77 68 65 6e 20 61 0a 2a 2a  riable when a.**
6d60: 20 20 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63     write-transac
6d70: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 20 28  tion is opened (
6d80: 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65  at the same time
6d90: 20 61 73 20 64 62 46 69 6c 65 53 69 7a 65 20 61   as dbFileSize a
6da0: 6e 64 0a 2a 2a 20 20 20 64 62 4f 72 69 67 53 69  nd.**   dbOrigSi
6db0: 7a 65 29 2e 20 49 66 20 74 68 65 20 78 46 69 6c  ze). If the xFil
6dc0: 65 43 6f 6e 74 72 6f 6c 28 46 43 4e 54 4c 5f 53  eControl(FCNTL_S
6dd0: 49 5a 45 5f 48 49 4e 54 29 20 6d 65 74 68 6f 64  IZE_HINT) method
6de0: 20 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 20   is called,.**  
6df0: 20 64 62 48 69 6e 74 53 69 7a 65 20 69 73 20 69   dbHintSize is i
6e00: 6e 63 72 65 61 73 65 64 20 74 6f 20 74 68 65 20  ncreased to the 
6e10: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
6e20: 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 20  that correspond 
6e30: 74 6f 20 74 68 65 0a 2a 2a 20 20 20 73 69 7a 65  to the.**   size
6e40: 2d 68 69 6e 74 20 70 61 73 73 65 64 20 74 6f 20  -hint passed to 
6e50: 74 68 65 20 6d 65 74 68 6f 64 20 63 61 6c 6c 2e  the method call.
6e60: 20 53 65 65 20 70 61 67 65 72 5f 77 72 69 74 65   See pager_write
6e70: 5f 70 61 67 65 6c 69 73 74 28 29 20 66 6f 72 20  _pagelist() for 
6e80: 0a 2a 2a 20 20 20 64 65 74 61 69 6c 73 2e 0a 2a  .**   details..*
6e90: 2a 0a 2a 2a 20 65 72 72 43 6f 64 65 0a 2a 2a 0a  *.** errCode.**.
6ea0: 2a 2a 20 20 20 54 68 65 20 50 61 67 65 72 2e 65  **   The Pager.e
6eb0: 72 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65 20  rrCode variable 
6ec0: 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 75 73 65  is only ever use
6ed0: 64 20 69 6e 20 50 41 47 45 52 5f 45 52 52 4f 52  d in PAGER_ERROR
6ee0: 20 73 74 61 74 65 2e 20 49 74 0a 2a 2a 20 20 20   state. It.**   
6ef0: 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 20 69  is set to zero i
6f00: 6e 20 61 6c 6c 20 6f 74 68 65 72 20 73 74 61 74  n all other stat
6f10: 65 73 2e 20 49 6e 20 50 41 47 45 52 5f 45 52 52  es. In PAGER_ERR
6f20: 4f 52 20 73 74 61 74 65 2c 20 50 61 67 65 72 2e  OR state, Pager.
6f30: 65 72 72 43 6f 64 65 20 0a 2a 2a 20 20 20 69 73  errCode .**   is
6f40: 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f 20 53   always set to S
6f50: 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 53 51 4c 49  QLITE_FULL, SQLI
6f60: 54 45 5f 49 4f 45 52 52 20 6f 72 20 6f 6e 65 20  TE_IOERR or one 
6f70: 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f  of the SQLITE_IO
6f80: 45 52 52 5f 58 58 58 20 0a 2a 2a 20 20 20 73 75  ERR_XXX .**   su
6f90: 62 2d 63 6f 64 65 73 2e 0a 2a 2f 0a 73 74 72 75  b-codes..*/.stru
6fa0: 63 74 20 50 61 67 65 72 20 7b 0a 20 20 73 71 6c  ct Pager {.  sql
6fb0: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20  ite3_vfs *pVfs; 
6fc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 53 20 66           /* OS f
6fd0: 75 6e 63 74 69 6f 6e 73 20 74 6f 20 75 73 65 20  unctions to use 
6fe0: 66 6f 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20 65  for IO */.  u8 e
6ff0: 78 63 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20  xclusiveMode;   
7000: 20 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65          /* Boole
7010: 61 6e 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b  an. True if lock
7020: 69 6e 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53  ing_mode==EXCLUS
7030: 49 56 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72  IVE */.  u8 jour
7040: 6e 61 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20  nalMode;        
7050: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74       /* One of t
7060: 68 65 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  he PAGER_JOURNAL
7070: 4d 4f 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f  MODE_* values */
7080: 0a 20 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c  .  u8 useJournal
7090: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
70a0: 2a 20 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b  * Use a rollback
70b0: 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73   journal on this
70c0: 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f   file */.  u8 no
70d0: 52 65 61 64 6c 6f 63 6b 3b 20 20 20 20 20 20 20  Readlock;       
70e0: 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
70f0: 20 62 6f 74 68 65 72 20 74 6f 20 6f 62 74 61 69   bother to obtai
7100: 6e 20 72 65 61 64 6c 6f 63 6b 73 20 2a 2f 0a 20  n readlocks */. 
7110: 20 75 38 20 6e 6f 53 79 6e 63 3b 20 20 20 20 20   u8 noSync;     
7120: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7130: 44 6f 20 6e 6f 74 20 73 79 6e 63 20 74 68 65 20  Do not sync the 
7140: 6a 6f 75 72 6e 61 6c 20 69 66 20 74 72 75 65 20  journal if true 
7150: 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 53 79 6e 63  */.  u8 fullSync
7160: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7170: 20 2f 2a 20 44 6f 20 65 78 74 72 61 20 73 79 6e   /* Do extra syn
7180: 63 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  cs of the journa
7190: 6c 20 66 6f 72 20 72 6f 62 75 73 74 6e 65 73 73  l for robustness
71a0: 20 2a 2f 0a 20 20 75 38 20 63 6b 70 74 53 79 6e   */.  u8 ckptSyn
71b0: 63 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20  cFlags;         
71c0: 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c    /* SYNC_NORMAL
71d0: 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20 66 6f   or SYNC_FULL fo
71e0: 72 20 63 68 65 63 6b 70 6f 69 6e 74 20 2a 2f 0a  r checkpoint */.
71f0: 20 20 75 38 20 77 61 6c 53 79 6e 63 46 6c 61 67    u8 walSyncFlag
7200: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  s;            /*
7210: 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20   SYNC_NORMAL or 
7220: 53 59 4e 43 5f 46 55 4c 4c 20 66 6f 72 20 77 61  SYNC_FULL for wa
7230: 6c 20 77 72 69 74 65 73 20 2a 2f 0a 20 20 75 38  l writes */.  u8
7240: 20 73 79 6e 63 46 6c 61 67 73 3b 20 20 20 20 20   syncFlags;     
7250: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 59 4e            /* SYN
7260: 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e 43  C_NORMAL or SYNC
7270: 5f 46 55 4c 4c 20 6f 74 68 65 72 77 69 73 65 20  _FULL otherwise 
7280: 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46 69 6c 65  */.  u8 tempFile
7290: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
72a0: 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73   /* zFilename is
72b0: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
72c0: 65 20 2a 2f 0a 20 20 75 38 20 72 65 61 64 4f 6e  e */.  u8 readOn
72d0: 6c 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ly;             
72e0: 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61     /* True for a
72f0: 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62   read-only datab
7300: 61 73 65 20 2a 2f 0a 20 20 75 38 20 6d 65 6d 44  ase */.  u8 memD
7310: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
7320: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
7330: 69 6e 68 69 62 69 74 20 61 6c 6c 20 66 69 6c 65  inhibit all file
7340: 20 49 2f 4f 20 2a 2f 0a 0a 20 20 2f 2a 2a 2a 2a   I/O */..  /****
7350: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7360: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7370: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7390: 2a 2a 2a 2a 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ******.  ** The 
73a0: 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20  following block 
73b0: 63 6f 6e 74 61 69 6e 73 20 74 68 6f 73 65 20 63  contains those c
73c0: 6c 61 73 73 20 6d 65 6d 62 65 72 73 20 74 68 61  lass members tha
73d0: 74 20 63 68 61 6e 67 65 20 64 75 72 69 6e 67 0a  t change during.
73e0: 20 20 2a 2a 20 72 6f 75 74 69 6e 65 20 6f 70 65    ** routine ope
73f0: 72 74 69 6f 6e 2e 20 20 43 6c 61 73 73 20 6d 65  rtion.  Class me
7400: 6d 62 65 72 73 20 6e 6f 74 20 69 6e 20 74 68 69  mbers not in thi
7410: 73 20 62 6c 6f 63 6b 20 61 72 65 20 65 69 74 68  s block are eith
7420: 65 72 20 66 69 78 65 64 0a 20 20 2a 2a 20 77 68  er fixed.  ** wh
7430: 65 6e 20 74 68 65 20 70 61 67 65 72 20 69 73 20  en the pager is 
7440: 66 69 72 73 74 20 63 72 65 61 74 65 64 20 6f 72  first created or
7450: 20 65 6c 73 65 20 6f 6e 6c 79 20 63 68 61 6e 67   else only chang
7460: 65 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20  e when there is 
7470: 61 0a 20 20 2a 2a 20 73 69 67 6e 69 66 69 63 61  a.  ** significa
7480: 6e 74 20 6d 6f 64 65 20 63 68 61 6e 67 65 20 28  nt mode change (
7490: 73 75 63 68 20 61 73 20 63 68 61 6e 67 69 6e 67  such as changing
74a0: 20 74 68 65 20 70 61 67 65 5f 73 69 7a 65 2c 20   the page_size, 
74b0: 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 2c 0a 20 20  locking_mode,.  
74c0: 2a 2a 20 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  ** or the journa
74d0: 6c 5f 6d 6f 64 65 29 2e 20 20 46 72 6f 6d 20 61  l_mode).  From a
74e0: 6e 6f 74 68 65 72 20 76 69 65 77 2c 20 74 68 65  nother view, the
74f0: 73 65 20 63 6c 61 73 73 20 6d 65 6d 62 65 72 73  se class members
7500: 20 64 65 73 63 72 69 62 65 0a 20 20 2a 2a 20 74   describe.  ** t
7510: 68 65 20 22 73 74 61 74 65 22 20 6f 66 20 74 68  he "state" of th
7520: 65 20 70 61 67 65 72 2c 20 77 68 69 6c 65 20 6f  e pager, while o
7530: 74 68 65 72 20 63 6c 61 73 73 20 6d 65 6d 62 65  ther class membe
7540: 72 73 20 64 65 73 63 72 69 62 65 20 74 68 65 0a  rs describe the.
7550: 20 20 2a 2a 20 22 63 6f 6e 66 69 67 75 72 61 74    ** "configurat
7560: 69 6f 6e 22 20 6f 66 20 74 68 65 20 70 61 67 65  ion" of the page
7570: 72 2e 0a 20 20 2a 2f 0a 20 20 75 38 20 65 53 74  r..  */.  u8 eSt
7580: 61 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ate;            
7590: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 73        /* Pager s
75a0: 74 61 74 65 20 28 4f 50 45 4e 2c 20 52 45 41 44  tate (OPEN, READ
75b0: 45 52 2c 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45  ER, WRITER_LOCKE
75c0: 44 2e 2e 29 20 2a 2f 0a 20 20 75 38 20 65 4c 6f  D..) */.  u8 eLo
75d0: 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ck;             
75e0: 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
75f0: 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 64 61   lock held on da
7600: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
7610: 20 75 38 20 63 68 61 6e 67 65 43 6f 75 6e 74 44   u8 changeCountD
7620: 6f 6e 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  one;         /* 
7630: 53 65 74 20 61 66 74 65 72 20 69 6e 63 72 65 6d  Set after increm
7640: 65 6e 74 69 6e 67 20 74 68 65 20 63 68 61 6e 67  enting the chang
7650: 65 2d 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75  e-counter */.  u
7660: 38 20 73 65 74 4d 61 73 74 65 72 3b 20 20 20 20  8 setMaster;    
7670: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
7680: 75 65 20 69 66 20 61 20 6d 2d 6a 20 6e 61 6d 65  ue if a m-j name
7690: 20 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65   has been writte
76a0: 6e 20 74 6f 20 6a 72 6e 6c 20 2a 2f 0a 20 20 75  n to jrnl */.  u
76b0: 38 20 64 6f 4e 6f 74 53 70 69 6c 6c 3b 20 20 20  8 doNotSpill;   
76c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f             /* Do
76d0: 20 6e 6f 74 20 73 70 69 6c 6c 20 74 68 65 20 63   not spill the c
76e0: 61 63 68 65 20 77 68 65 6e 20 6e 6f 6e 2d 7a 65  ache when non-ze
76f0: 72 6f 20 2a 2f 0a 20 20 75 38 20 64 6f 4e 6f 74  ro */.  u8 doNot
7700: 53 79 6e 63 53 70 69 6c 6c 3b 20 20 20 20 20 20  SyncSpill;      
7710: 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 64 6f      /* Do not do
7720: 20 61 20 73 70 69 6c 6c 20 74 68 61 74 20 72 65   a spill that re
7730: 71 75 69 72 65 73 20 6a 72 6e 6c 20 73 79 6e 63  quires jrnl sync
7740: 20 2a 2f 0a 20 20 75 38 20 73 75 62 6a 49 6e 4d   */.  u8 subjInM
7750: 65 6d 6f 72 79 3b 20 20 20 20 20 20 20 20 20 20  emory;          
7760: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 75 73 65    /* True to use
7770: 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 75 62 2d 6a   in-memory sub-j
7780: 6f 75 72 6e 61 6c 73 20 2a 2f 0a 20 20 50 67 6e  ournals */.  Pgn
7790: 6f 20 64 62 53 69 7a 65 3b 20 20 20 20 20 20 20  o dbSize;       
77a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
77b0: 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
77c0: 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  he database */. 
77d0: 20 50 67 6e 6f 20 64 62 4f 72 69 67 53 69 7a 65   Pgno dbOrigSize
77e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
77f0: 64 62 53 69 7a 65 20 62 65 66 6f 72 65 20 74 68  dbSize before th
7800: 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
7810: 63 74 69 6f 6e 20 2a 2f 0a 20 20 50 67 6e 6f 20  ction */.  Pgno 
7820: 64 62 46 69 6c 65 53 69 7a 65 3b 20 20 20 20 20  dbFileSize;     
7830: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
7840: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
7850: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
7860: 2f 0a 20 20 50 67 6e 6f 20 64 62 48 69 6e 74 53  /.  Pgno dbHintS
7870: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
7880: 2f 2a 20 56 61 6c 75 65 20 70 61 73 73 65 64 20  /* Value passed 
7890: 74 6f 20 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49  to FCNTL_SIZE_HI
78a0: 4e 54 20 63 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74  NT call */.  int
78b0: 20 65 72 72 43 6f 64 65 3b 20 20 20 20 20 20 20   errCode;       
78c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
78d0: 6f 66 20 73 65 76 65 72 61 6c 20 6b 69 6e 64 73  of several kinds
78e0: 20 6f 66 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20   of errors */.  
78f0: 69 6e 74 20 6e 52 65 63 3b 20 20 20 20 20 20 20  int nRec;       
7900: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
7910: 61 67 65 73 20 6a 6f 75 72 6e 61 6c 6c 65 64 20  ages journalled 
7920: 73 69 6e 63 65 20 6c 61 73 74 20 6a 2d 68 65 61  since last j-hea
7930: 64 65 72 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20  der written */. 
7940: 20 75 33 32 20 63 6b 73 75 6d 49 6e 69 74 3b 20   u32 cksumInit; 
7950: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7960: 51 75 61 73 69 2d 72 61 6e 64 6f 6d 20 76 61 6c  Quasi-random val
7970: 75 65 20 61 64 64 65 64 20 74 6f 20 65 76 65 72  ue added to ever
7980: 79 20 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20  y checksum */.  
7990: 75 33 32 20 6e 53 75 62 52 65 63 3b 20 20 20 20  u32 nSubRec;    
79a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
79b0: 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73  umber of records
79c0: 20 77 72 69 74 74 65 6e 20 74 6f 20 73 75 62 2d   written to sub-
79d0: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 42 69 74  journal */.  Bit
79e0: 76 65 63 20 2a 70 49 6e 4a 6f 75 72 6e 61 6c 3b  vec *pInJournal;
79f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
7a00: 62 69 74 20 66 6f 72 20 65 61 63 68 20 70 61 67  bit for each pag
7a10: 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  e in the databas
7a20: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 73 71 6c 69  e file */.  sqli
7a30: 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b 20 20 20  te3_file *fd;   
7a40: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
7a50: 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 64  descriptor for d
7a60: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c  atabase */.  sql
7a70: 69 74 65 33 5f 66 69 6c 65 20 2a 6a 66 64 3b 20  ite3_file *jfd; 
7a80: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
7a90: 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20   descriptor for 
7aa0: 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  main journal */.
7ab0: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
7ac0: 73 6a 66 64 3b 20 20 20 20 20 20 20 20 20 2f 2a  sjfd;         /*
7ad0: 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
7ae0: 20 66 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   for sub-journal
7af0: 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61   */.  i64 journa
7b00: 6c 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  lOff;           
7b10: 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 77 72 69    /* Current wri
7b20: 74 65 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65  te offset in the
7b30: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
7b40: 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64  .  i64 journalHd
7b50: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r;             /
7b60: 2a 20 42 79 74 65 20 6f 66 66 73 65 74 20 74 6f  * Byte offset to
7b70: 20 70 72 65 76 69 6f 75 73 20 6a 6f 75 72 6e 61   previous journa
7b80: 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 73 71  l header */.  sq
7b90: 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 2a 70 42  lite3_backup *pB
7ba0: 61 63 6b 75 70 3b 20 20 20 20 2f 2a 20 50 6f 69  ackup;    /* Poi
7bb0: 6e 74 65 72 20 74 6f 20 6c 69 73 74 20 6f 66 20  nter to list of 
7bc0: 6f 6e 67 6f 69 6e 67 20 62 61 63 6b 75 70 20 70  ongoing backup p
7bd0: 72 6f 63 65 73 73 65 73 20 2a 2f 0a 20 20 50 61  rocesses */.  Pa
7be0: 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 61 53  gerSavepoint *aS
7bf0: 61 76 65 70 6f 69 6e 74 3b 20 2f 2a 20 41 72 72  avepoint; /* Arr
7c00: 61 79 20 6f 66 20 61 63 74 69 76 65 20 73 61 76  ay of active sav
7c10: 65 70 6f 69 6e 74 73 20 2a 2f 0a 20 20 69 6e 74  epoints */.  int
7c20: 20 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20 20 20   nSavepoint;    
7c30: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
7c40: 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69  er of elements i
7c50: 6e 20 61 53 61 76 65 70 6f 69 6e 74 5b 5d 20 2a  n aSavepoint[] *
7c60: 2f 0a 20 20 63 68 61 72 20 64 62 46 69 6c 65 56  /.  char dbFileV
7c70: 65 72 73 5b 31 36 5d 3b 20 20 20 20 20 20 20 20  ers[16];        
7c80: 2f 2a 20 43 68 61 6e 67 65 73 20 77 68 65 6e 65  /* Changes whene
7c90: 76 65 72 20 64 61 74 61 62 61 73 65 20 66 69 6c  ver database fil
7ca0: 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 2f  e changes */.  /
7cb0: 2a 0a 20 20 2a 2a 20 45 6e 64 20 6f 66 20 74 68  *.  ** End of th
7cc0: 65 20 72 6f 75 74 69 6e 65 6c 79 2d 63 68 61 6e  e routinely-chan
7cd0: 67 69 6e 67 20 63 6c 61 73 73 20 6d 65 6d 62 65  ging class membe
7ce0: 72 73 0a 20 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  rs.  ***********
7cf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7d00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7d10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7d20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7d30: 2f 0a 0a 20 20 75 31 36 20 6e 45 78 74 72 61 3b  /..  u16 nExtra;
7d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d50: 20 2f 2a 20 41 64 64 20 74 68 69 73 20 6d 61 6e   /* Add this man
7d60: 79 20 62 79 74 65 73 20 74 6f 20 65 61 63 68 20  y bytes to each 
7d70: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a  in-memory page *
7d80: 2f 0a 20 20 69 31 36 20 6e 52 65 73 65 72 76 65  /.  i16 nReserve
7d90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7da0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e 75  /* Number of unu
7db0: 73 65 64 20 62 79 74 65 73 20 61 74 20 65 6e 64  sed bytes at end
7dc0: 20 6f 66 20 65 61 63 68 20 70 61 67 65 20 2a 2f   of each page */
7dd0: 0a 20 20 75 33 32 20 76 66 73 46 6c 61 67 73 3b  .  u32 vfsFlags;
7de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7df0: 2a 20 46 6c 61 67 73 20 66 6f 72 20 73 71 6c 69  * Flags for sqli
7e00: 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20  te3_vfs.xOpen() 
7e10: 2a 2f 0a 20 20 75 33 32 20 73 65 63 74 6f 72 53  */.  u32 sectorS
7e20: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
7e30: 20 2f 2a 20 41 73 73 75 6d 65 64 20 73 65 63 74   /* Assumed sect
7e40: 6f 72 20 73 69 7a 65 20 64 75 72 69 6e 67 20 72  or size during r
7e50: 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74  ollback */.  int
7e60: 20 70 61 67 65 53 69 7a 65 3b 20 20 20 20 20 20   pageSize;      
7e70: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
7e80: 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 61  er of bytes in a
7e90: 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   page */.  Pgno 
7ea0: 6d 78 50 67 6e 6f 3b 20 20 20 20 20 20 20 20 20  mxPgno;         
7eb0: 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75         /* Maximu
7ec0: 6d 20 61 6c 6c 6f 77 65 64 20 73 69 7a 65 20 6f  m allowed size o
7ed0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a  f the database *
7ee0: 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53  /.  i64 journalS
7ef0: 69 7a 65 4c 69 6d 69 74 3b 20 20 20 20 20 20 20  izeLimit;       
7f00: 2f 2a 20 53 69 7a 65 20 6c 69 6d 69 74 20 66 6f  /* Size limit fo
7f10: 72 20 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75  r persistent jou
7f20: 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 0a 20 20  rnal files */.  
7f30: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b  char *zFilename;
7f40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
7f50: 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
7f60: 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68  ase file */.  ch
7f70: 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20  ar *zJournal;   
7f80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
7f90: 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
7fa0: 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 28   file */.  int (
7fb0: 2a 78 42 75 73 79 48 61 6e 64 6c 65 72 29 28 76  *xBusyHandler)(v
7fc0: 6f 69 64 2a 29 3b 20 2f 2a 20 46 75 6e 63 74 69  oid*); /* Functi
7fd0: 6f 6e 20 74 6f 20 63 61 6c 6c 20 77 68 65 6e 20  on to call when 
7fe0: 62 75 73 79 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  busy */.  void *
7ff0: 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 3b  pBusyHandlerArg;
8000: 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74        /* Context
8010: 20 61 72 67 75 6d 65 6e 74 20 66 6f 72 20 78 42   argument for xB
8020: 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a 20 20  usyHandler */.  
8030: 69 6e 74 20 6e 48 69 74 2c 20 6e 4d 69 73 73 3b  int nHit, nMiss;
8040: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
8050: 6f 74 61 6c 20 63 61 63 68 65 20 68 69 74 73 20  otal cache hits 
8060: 61 6e 64 20 6d 69 73 73 65 73 20 2a 2f 0a 23 69  and misses */.#i
8070: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
8080: 0a 20 20 69 6e 74 20 6e 52 65 61 64 2c 20 6e 57  .  int nRead, nW
8090: 72 69 74 65 3b 20 20 20 20 20 20 20 20 20 20 2f  rite;          /
80a0: 2a 20 44 61 74 61 62 61 73 65 20 70 61 67 65 73  * Database pages
80b0: 20 72 65 61 64 2f 77 72 69 74 74 65 6e 20 2a 2f   read/written */
80c0: 0a 23 65 6e 64 69 66 0a 20 20 76 6f 69 64 20 28  .#endif.  void (
80d0: 2a 78 52 65 69 6e 69 74 65 72 29 28 44 62 50 61  *xReiniter)(DbPa
80e0: 67 65 2a 29 3b 20 2f 2a 20 43 61 6c 6c 20 74 68  ge*); /* Call th
80f0: 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20  is routine when 
8100: 72 65 6c 6f 61 64 69 6e 67 20 70 61 67 65 73 20  reloading pages 
8110: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
8120: 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 76 6f 69  _HAS_CODEC.  voi
8130: 64 20 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f 69  d *(*xCodec)(voi
8140: 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e  d*,void*,Pgno,in
8150: 74 29 3b 20 2f 2a 20 52 6f 75 74 69 6e 65 20 66  t); /* Routine f
8160: 6f 72 20 65 6e 2f 64 65 63 6f 64 69 6e 67 20 64  or en/decoding d
8170: 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a  ata */.  void (*
8180: 78 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 29 28  xCodecSizeChng)(
8190: 76 6f 69 64 2a 2c 69 6e 74 2c 69 6e 74 29 3b 20  void*,int,int); 
81a0: 2f 2a 20 4e 6f 74 69 66 79 20 6f 66 20 70 61 67  /* Notify of pag
81b0: 65 20 73 69 7a 65 20 63 68 61 6e 67 65 73 20 2a  e size changes *
81c0: 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64 65  /.  void (*xCode
81d0: 63 46 72 65 65 29 28 76 6f 69 64 2a 29 3b 20 20  cFree)(void*);  
81e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
81f0: 73 74 72 75 63 74 6f 72 20 66 6f 72 20 74 68 65  structor for the
8200: 20 63 6f 64 65 63 20 2a 2f 0a 20 20 76 6f 69 64   codec */.  void
8210: 20 2a 70 43 6f 64 65 63 3b 20 20 20 20 20 20 20   *pCodec;       
8220: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
8230: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 43 6f   argument to xCo
8240: 64 65 63 2e 2e 2e 20 6d 65 74 68 6f 64 73 20 2a  dec... methods *
8250: 2f 0a 23 65 6e 64 69 66 0a 20 20 63 68 61 72 20  /.#endif.  char 
8260: 2a 70 54 6d 70 53 70 61 63 65 3b 20 20 20 20 20  *pTmpSpace;     
8270: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 2e         /* Pager.
8280: 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f  pageSize bytes o
8290: 66 20 73 70 61 63 65 20 66 6f 72 20 74 6d 70 20  f space for tmp 
82a0: 75 73 65 20 2a 2f 0a 20 20 50 43 61 63 68 65 20  use */.  PCache 
82b0: 2a 70 50 43 61 63 68 65 3b 20 20 20 20 20 20 20  *pPCache;       
82c0: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
82d0: 74 6f 20 70 61 67 65 20 63 61 63 68 65 20 6f 62  to page cache ob
82e0: 6a 65 63 74 20 2a 2f 0a 23 69 66 6e 64 65 66 20  ject */.#ifndef 
82f0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
8300: 20 20 57 61 6c 20 2a 70 57 61 6c 3b 20 20 20 20    Wal *pWal;    
8310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8320: 20 57 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67   Write-ahead log
8330: 20 75 73 65 64 20 62 79 20 22 6a 6f 75 72 6e 61   used by "journa
8340: 6c 5f 6d 6f 64 65 3d 77 61 6c 22 20 2a 2f 0a 20  l_mode=wal" */. 
8350: 20 63 68 61 72 20 2a 7a 57 61 6c 3b 20 20 20 20   char *zWal;    
8360: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8370: 46 69 6c 65 20 6e 61 6d 65 20 66 6f 72 20 77 72  File name for wr
8380: 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 20 2a 2f  ite-ahead log */
8390: 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a  .#endif.};../*.*
83a0: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
83b0: 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 73  global variables
83c0: 20 68 6f 6c 64 20 63 6f 75 6e 74 65 72 73 20 75   hold counters u
83d0: 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69  sed for.** testi
83e0: 6e 67 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79  ng purposes only
83f0: 2e 20 20 54 68 65 73 65 20 76 61 72 69 61 62 6c  .  These variabl
8400: 65 73 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 20  es do not exist 
8410: 69 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73 74  in.** a non-test
8420: 69 6e 67 20 62 75 69 6c 64 2e 20 20 54 68 65 73  ing build.  Thes
8430: 65 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20  e variables are 
8440: 6e 6f 74 20 74 68 72 65 61 64 2d 73 61 66 65 2e  not thread-safe.
8450: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
8460: 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74  E_TEST.int sqlit
8470: 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f  e3_pager_readdb_
8480: 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a  count = 0;    /*
8490: 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20   Number of full 
84a0: 70 61 67 65 73 20 72 65 61 64 20 66 72 6f 6d 20  pages read from 
84b0: 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  DB */.int sqlite
84c0: 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f  3_pager_writedb_
84d0: 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 2f 2a 20  count = 0;   /* 
84e0: 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70  Number of full p
84f0: 61 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20  ages written to 
8500: 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  DB */.int sqlite
8510: 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63  3_pager_writej_c
8520: 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20  ount = 0;    /* 
8530: 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
8540: 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e  written to journ
8550: 61 6c 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 50  al */.# define P
8560: 41 47 45 52 5f 49 4e 43 52 28 76 29 20 20 76 2b  AGER_INCR(v)  v+
8570: 2b 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  +.#else.# define
8580: 20 50 41 47 45 52 5f 49 4e 43 52 28 76 29 0a 23   PAGER_INCR(v).#
8590: 65 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 4a  endif..../*.** J
85a0: 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 62 65 67  ournal files beg
85b0: 69 6e 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c  in with the foll
85c0: 6f 77 69 6e 67 20 6d 61 67 69 63 20 73 74 72 69  owing magic stri
85d0: 6e 67 2e 20 20 54 68 65 20 64 61 74 61 0a 2a 2a  ng.  The data.**
85e0: 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72   was obtained fr
85f0: 6f 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e 20  om /dev/random. 
8600: 20 49 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79   It is used only
8610: 20 61 73 20 61 20 73 61 6e 69 74 79 20 63 68 65   as a sanity che
8620: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20  ck..**.** Since 
8630: 76 65 72 73 69 6f 6e 20 32 2e 38 2e 30 2c 20 74  version 2.8.0, t
8640: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  he journal forma
8650: 74 20 63 6f 6e 74 61 69 6e 73 20 61 64 64 69 74  t contains addit
8660: 69 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a 2a 20  ional sanity.** 
8670: 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61  checking informa
8680: 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 70 6f  tion.  If the po
8690: 77 65 72 20 66 61 69 6c 73 20 77 68 69 6c 65 20  wer fails while 
86a0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62  the journal is b
86b0: 65 69 6e 67 0a 2a 2a 20 77 72 69 74 74 65 6e 2c  eing.** written,
86c0: 20 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67 61 72   semi-random gar
86d0: 62 61 67 65 20 64 61 74 61 20 6d 69 67 68 74 20  bage data might 
86e0: 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6a 6f  appear in the jo
86f0: 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 61 66  urnal.** file af
8700: 74 65 72 20 70 6f 77 65 72 20 69 73 20 72 65 73  ter power is res
8710: 74 6f 72 65 64 2e 20 20 49 66 20 61 6e 20 61 74  tored.  If an at
8720: 74 65 6d 70 74 20 69 73 20 74 68 65 6e 20 6d 61  tempt is then ma
8730: 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74 68  de.** to roll th
8740: 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2c 20  e journal back, 
8750: 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 75  the database cou
8760: 6c 64 20 62 65 20 63 6f 72 72 75 70 74 65 64 2e  ld be corrupted.
8770: 20 20 54 68 65 20 61 64 64 69 74 69 6f 6e 61 6c    The additional
8780: 0a 2a 2a 20 73 61 6e 69 74 79 20 63 68 65 63 6b  .** sanity check
8790: 69 6e 67 20 64 61 74 61 20 69 73 20 61 6e 20 61  ing data is an a
87a0: 74 74 65 6d 70 74 20 74 6f 20 64 69 73 63 6f 76  ttempt to discov
87b0: 65 72 20 74 68 65 20 67 61 72 62 61 67 65 20 69  er the garbage i
87c0: 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  n the.** journal
87d0: 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a   and ignore it..
87e0: 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69 74 79  **.** The sanity
87f0: 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d   checking inform
8800: 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e 65  ation for the ne
8810: 77 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  w journal format
8820: 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 66 20   consists.** of 
8830: 61 20 33 32 2d 62 69 74 20 63 68 65 63 6b 73 75  a 32-bit checksu
8840: 6d 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 6f  m on each page o
8850: 66 20 64 61 74 61 2e 20 20 54 68 65 20 63 68 65  f data.  The che
8860: 63 6b 73 75 6d 20 63 6f 76 65 72 73 20 62 6f 74  cksum covers bot
8870: 68 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 75  h.** the page nu
8880: 6d 62 65 72 20 61 6e 64 20 74 68 65 20 70 50 61  mber and the pPa
8890: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79  ger->pageSize by
88a0: 74 65 73 20 6f 66 20 64 61 74 61 20 66 6f 72 20  tes of data for 
88b0: 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68 69  the page..** Thi
88c0: 73 20 63 6b 73 75 6d 20 69 73 20 69 6e 69 74 69  s cksum is initi
88d0: 61 6c 69 7a 65 64 20 74 6f 20 61 20 33 32 2d 62  alized to a 32-b
88e0: 69 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20  it random value 
88f0: 74 68 61 74 20 61 70 70 65 61 72 73 20 69 6e 20  that appears in 
8900: 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
8910: 69 6c 65 20 72 69 67 68 74 20 61 66 74 65 72 20  ile right after 
8920: 74 68 65 20 68 65 61 64 65 72 2e 20 20 54 68 65  the header.  The
8930: 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 69   random initiali
8940: 7a 65 72 20 69 73 20 69 6d 70 6f 72 74 61 6e 74  zer is important
8950: 2c 0a 2a 2a 20 62 65 63 61 75 73 65 20 67 61 72  ,.** because gar
8960: 62 61 67 65 20 64 61 74 61 20 74 68 61 74 20 61  bage data that a
8970: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 65 6e  ppears at the en
8980: 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 69  d of a journal i
8990: 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61 74 61  s likely.** data
89a0: 20 74 68 61 74 20 77 61 73 20 6f 6e 63 65 20 69   that was once i
89b0: 6e 20 6f 74 68 65 72 20 66 69 6c 65 73 20 74 68  n other files th
89c0: 61 74 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e  at have now been
89d0: 20 64 65 6c 65 74 65 64 2e 20 20 49 66 20 74 68   deleted.  If th
89e0: 65 0a 2a 2a 20 67 61 72 62 61 67 65 20 64 61 74  e.** garbage dat
89f0: 61 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e 20 6f  a came from an o
8a00: 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20  bsolete journal 
8a10: 66 69 6c 65 2c 20 74 68 65 20 63 68 65 63 6b 73  file, the checks
8a20: 75 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20  ums might.** be 
8a30: 63 6f 72 72 65 63 74 2e 20 20 42 75 74 20 62 79  correct.  But by
8a40: 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68   initializing th
8a50: 65 20 63 68 65 63 6b 73 75 6d 20 74 6f 20 72 61  e checksum to ra
8a60: 6e 64 6f 6d 20 76 61 6c 75 65 20 77 68 69 63 68  ndom value which
8a70: 0a 2a 2a 20 69 73 20 64 69 66 66 65 72 65 6e 74  .** is different
8a80: 20 66 6f 72 20 65 76 65 72 79 20 6a 6f 75 72 6e   for every journ
8a90: 61 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20  al, we minimize 
8aa0: 74 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74  that risk..*/.st
8ab0: 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67  atic const unsig
8ac0: 6e 65 64 20 63 68 61 72 20 61 4a 6f 75 72 6e 61  ned char aJourna
8ad0: 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20 30  lMagic[] = {.  0
8ae0: 78 64 39 2c 20 30 78 64 35 2c 20 30 78 30 35 2c  xd9, 0xd5, 0x05,
8af0: 20 30 78 66 39 2c 20 30 78 32 30 2c 20 30 78 61   0xf9, 0x20, 0xa
8b00: 31 2c 20 30 78 36 33 2c 20 30 78 64 37 2c 0a 7d  1, 0x63, 0xd7,.}
8b10: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a  ;../*.** The siz
8b20: 65 20 6f 66 20 74 68 65 20 6f 66 20 65 61 63 68  e of the of each
8b30: 20 70 61 67 65 20 72 65 63 6f 72 64 20 69 6e 20   page record in 
8b40: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 67  the journal is g
8b50: 69 76 65 6e 20 62 79 0a 2a 2a 20 74 68 65 20 66  iven by.** the f
8b60: 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 2e 0a  ollowing macro..
8b70: 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e  */.#define JOURN
8b80: 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29  AL_PG_SZ(pPager)
8b90: 20 20 28 28 70 50 61 67 65 72 2d 3e 70 61 67 65    ((pPager->page
8ba0: 53 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a  Size) + 8)../*.*
8bb0: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  * The journal he
8bc0: 61 64 65 72 20 73 69 7a 65 20 66 6f 72 20 74 68  ader size for th
8bd0: 69 73 20 70 61 67 65 72 2e 20 54 68 69 73 20 69  is pager. This i
8be0: 73 20 75 73 75 61 6c 6c 79 20 74 68 65 20 73 61  s usually the sa
8bf0: 6d 65 20 0a 2a 2a 20 73 69 7a 65 20 61 73 20 61  me .** size as a
8c00: 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63   single disk sec
8c10: 74 6f 72 2e 20 53 65 65 20 61 6c 73 6f 20 73 65  tor. See also se
8c20: 74 53 65 63 74 6f 72 53 69 7a 65 28 29 2e 0a 2a  tSectorSize()..*
8c30: 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41  /.#define JOURNA
8c40: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
8c50: 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72   (pPager->sector
8c60: 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  Size)../*.** The
8c70: 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69 73 20   macro MEMDB is 
8c80: 74 72 75 65 20 69 66 20 77 65 20 61 72 65 20 64  true if we are d
8c90: 65 61 6c 69 6e 67 20 77 69 74 68 20 61 6e 20 69  ealing with an i
8ca0: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
8cb0: 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69 73  e..** We do this
8cc0: 20 61 73 20 61 20 6d 61 63 72 6f 20 73 6f 20 74   as a macro so t
8cd0: 68 61 74 20 69 66 20 74 68 65 20 53 51 4c 49 54  hat if the SQLIT
8ce0: 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20  E_OMIT_MEMORYDB 
8cf0: 6d 61 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a 2a  macro is set,.**
8d00: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 4d 45   the value of ME
8d10: 4d 44 42 20 77 69 6c 6c 20 62 65 20 61 20 63 6f  MDB will be a co
8d20: 6e 73 74 61 6e 74 20 61 6e 64 20 74 68 65 20 63  nstant and the c
8d30: 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70 74  ompiler will opt
8d40: 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f 64  imize.** out cod
8d50: 65 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 65 76  e that would nev
8d60: 65 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a 23  er execute..*/.#
8d70: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
8d80: 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65 66  T_MEMORYDB.# def
8d90: 69 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c 73  ine MEMDB 0.#els
8da0: 65 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42  e.# define MEMDB
8db0: 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a 23   pPager->memDb.#
8dc0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
8dd0: 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 20 70   maximum legal p
8de0: 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 28 32  age number is (2
8df0: 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65  ^31 - 1)..*/.#de
8e00: 66 69 6e 65 20 50 41 47 45 52 5f 4d 41 58 5f 50  fine PAGER_MAX_P
8e10: 47 4e 4f 20 32 31 34 37 34 38 33 36 34 37 0a 0a  GNO 2147483647..
8e20: 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65  /*.** The argume
8e30: 6e 74 20 74 6f 20 74 68 69 73 20 6d 61 63 72 6f  nt to this macro
8e40: 20 69 73 20 61 20 66 69 6c 65 20 64 65 73 63 72   is a file descr
8e50: 69 70 74 6f 72 20 28 74 79 70 65 20 73 71 6c 69  iptor (type sqli
8e60: 74 65 33 5f 66 69 6c 65 2a 29 2e 0a 2a 2a 20 52  te3_file*)..** R
8e70: 65 74 75 72 6e 20 30 20 69 66 20 69 74 20 69 73  eturn 0 if it is
8e80: 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 6e 6f   not open, or no
8e90: 6e 2d 7a 65 72 6f 20 28 62 75 74 20 6e 6f 74 20  n-zero (but not 
8ea0: 31 29 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a  1) if it is..**.
8eb0: 2a 2a 20 54 68 69 73 20 69 73 20 73 6f 20 74 68  ** This is so th
8ec0: 61 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 63  at expressions c
8ed0: 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61 73  an be written as
8ee0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 69 73  :.**.**   if( is
8ef0: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
8f00: 29 20 29 7b 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 69  ) ){ ....**.** i
8f10: 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 0a 2a 2a 20  nstead of.**.** 
8f20: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 66    if( pPager->jf
8f30: 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 20 2e  d->pMethods ){ .
8f40: 2e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69 73  ...*/.#define is
8f50: 4f 70 65 6e 28 70 46 64 29 20 28 28 70 46 64 29  Open(pFd) ((pFd)
8f60: 2d 3e 70 4d 65 74 68 6f 64 73 29 0a 0a 2f 2a 0a  ->pMethods)../*.
8f70: 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
8f80: 66 20 74 68 69 73 20 70 61 67 65 72 20 75 73 65  f this pager use
8f90: 73 20 61 20 77 72 69 74 65 2d 61 68 65 61 64 20  s a write-ahead 
8fa0: 6c 6f 67 20 69 6e 73 74 65 61 64 20 6f 66 20 74  log instead of t
8fb0: 68 65 20 75 73 75 61 6c 0a 2a 2a 20 72 6f 6c 6c  he usual.** roll
8fc0: 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 4f 74  back journal. Ot
8fd0: 68 65 72 77 69 73 65 20 66 61 6c 73 65 2e 0a 2a  herwise false..*
8fe0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
8ff0: 5f 4f 4d 49 54 5f 57 41 4c 0a 73 74 61 74 69 63  _OMIT_WAL.static
9000: 20 69 6e 74 20 70 61 67 65 72 55 73 65 57 61 6c   int pagerUseWal
9010: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
9020: 0a 20 20 72 65 74 75 72 6e 20 28 70 50 61 67 65  .  return (pPage
9030: 72 2d 3e 70 57 61 6c 21 3d 30 29 3b 0a 7d 0a 23  r->pWal!=0);.}.#
9040: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61  else.# define pa
9050: 67 65 72 55 73 65 57 61 6c 28 78 29 20 30 0a 23  gerUseWal(x) 0.#
9060: 20 64 65 66 69 6e 65 20 70 61 67 65 72 52 6f 6c   define pagerRol
9070: 6c 62 61 63 6b 57 61 6c 28 78 29 20 30 0a 23 20  lbackWal(x) 0.# 
9080: 64 65 66 69 6e 65 20 70 61 67 65 72 57 61 6c 46  define pagerWalF
9090: 72 61 6d 65 73 28 76 2c 77 2c 78 2c 79 29 20 30  rames(v,w,x,y) 0
90a0: 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72 4f  .# define pagerO
90b0: 70 65 6e 57 61 6c 49 66 50 72 65 73 65 6e 74 28  penWalIfPresent(
90c0: 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 20 64  z) SQLITE_OK.# d
90d0: 65 66 69 6e 65 20 70 61 67 65 72 42 65 67 69 6e  efine pagerBegin
90e0: 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  ReadTransaction(
90f0: 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e  z) SQLITE_OK.#en
9100: 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45  dif..#ifndef NDE
9110: 42 55 47 20 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  BUG ./*.** Usage
9120: 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73 65 72 74  :.**.**   assert
9130: 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
9140: 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
9150: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
9160: 69 6f 6e 20 72 75 6e 73 20 6d 61 6e 79 20 61 73  ion runs many as
9170: 73 65 72 74 73 20 74 6f 20 74 72 79 20 74 6f 20  serts to try to 
9180: 66 69 6e 64 20 69 6e 63 6f 6e 73 69 73 74 65 6e  find inconsisten
9190: 63 69 65 73 20 69 6e 0a 2a 2a 20 74 68 65 20 69  cies in.** the i
91a0: 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20 6f 66  nternal state of
91b0: 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63   the Pager objec
91c0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
91d0: 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
91e0: 61 74 65 28 50 61 67 65 72 20 2a 70 29 7b 0a 20  ate(Pager *p){. 
91f0: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
9200: 20 70 3b 0a 0a 20 20 2f 2a 20 53 74 61 74 65 20   p;..  /* State 
9210: 6d 75 73 74 20 62 65 20 76 61 6c 69 64 2e 20 2a  must be valid. *
9220: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65  /.  assert( p->e
9230: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
9240: 4e 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65  N.       || p->e
9250: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41  State==PAGER_REA
9260: 44 45 52 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d  DER.       || p-
9270: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
9280: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 0a 20 20 20  RITER_LOCKED.   
9290: 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65      || p->eState
92a0: 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43  ==PAGER_WRITER_C
92b0: 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c  ACHEMOD.       |
92c0: 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  | p->eState==PAG
92d0: 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 0a  ER_WRITER_DBMOD.
92e0: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74         || p->eSt
92f0: 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
9300: 52 5f 46 49 4e 49 53 48 45 44 0a 20 20 20 20 20  R_FINISHED.     
9310: 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d    || p->eState==
9320: 50 41 47 45 52 5f 45 52 52 4f 52 0a 20 20 29 3b  PAGER_ERROR.  );
9330: 0a 0a 20 20 2f 2a 20 52 65 67 61 72 64 6c 65 73  ..  /* Regardles
9340: 73 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  s of the current
9350: 20 73 74 61 74 65 2c 20 61 20 74 65 6d 70 2d 66   state, a temp-f
9360: 69 6c 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61  ile connection a
9370: 6c 77 61 79 73 20 62 65 68 61 76 65 73 0a 20 20  lways behaves.  
9380: 2a 2a 20 61 73 20 69 66 20 69 74 20 68 61 73 20  ** as if it has 
9390: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
93a0: 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
93b0: 65 20 66 69 6c 65 2e 20 49 74 20 6e 65 76 65 72  e file. It never
93c0: 20 75 70 64 61 74 65 73 0a 20 20 2a 2a 20 74 68   updates.  ** th
93d0: 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
93e0: 20 66 69 65 6c 64 2c 20 73 6f 20 74 68 65 20 63   field, so the c
93f0: 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66  hangeCountDone f
9400: 6c 61 67 20 69 73 20 61 6c 77 61 79 73 20 73 65  lag is always se
9410: 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  t..  */.  assert
9420: 28 20 70 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30  ( p->tempFile==0
9430: 20 7c 7c 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58   || p->eLock==EX
9440: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a  CLUSIVE_LOCK );.
9450: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 74 65 6d    assert( p->tem
9460: 70 46 69 6c 65 3d 3d 30 20 7c 7c 20 70 50 61 67  pFile==0 || pPag
9470: 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
9480: 6f 6e 65 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  one );..  /* If 
9490: 74 68 65 20 75 73 65 4a 6f 75 72 6e 61 6c 20 66  the useJournal f
94a0: 6c 61 67 20 69 73 20 63 6c 65 61 72 2c 20 74 68  lag is clear, th
94b0: 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 6d  e journal-mode m
94c0: 75 73 74 20 62 65 20 22 4f 46 46 22 2e 20 0a 20  ust be "OFF". . 
94d0: 20 2a 2a 20 41 6e 64 20 69 66 20 74 68 65 20 6a   ** And if the j
94e0: 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 69 73 20 22  ournal-mode is "
94f0: 4f 46 46 22 2c 20 74 68 65 20 6a 6f 75 72 6e 61  OFF", the journa
9500: 6c 20 66 69 6c 65 20 6d 75 73 74 20 6e 6f 74 20  l file must not 
9510: 62 65 20 6f 70 65 6e 2e 0a 20 20 2a 2f 0a 20 20  be open..  */.  
9520: 61 73 73 65 72 74 28 20 70 2d 3e 6a 6f 75 72 6e  assert( p->journ
9530: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
9540: 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 7c 7c  URNALMODE_OFF ||
9550: 20 70 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29   p->useJournal )
9560: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6a  ;.  assert( p->j
9570: 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45  ournalMode!=PAGE
9580: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
9590: 46 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70 2d 3e  F || !isOpen(p->
95a0: 6a 66 64 29 20 29 3b 0a 0a 20 20 2f 2a 20 43 68  jfd) );..  /* Ch
95b0: 65 63 6b 20 74 68 61 74 20 4d 45 4d 44 42 20 69  eck that MEMDB i
95c0: 6d 70 6c 69 65 73 20 6e 6f 53 79 6e 63 2e 20 41  mplies noSync. A
95d0: 6e 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  nd an in-memory 
95e0: 6a 6f 75 72 6e 61 6c 2e 20 53 69 6e 63 65 20 0a  journal. Since .
95f0: 20 20 2a 2a 20 74 68 69 73 20 6d 65 61 6e 73 20    ** this means 
9600: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  an in-memory pag
9610: 65 72 20 70 65 72 66 6f 72 6d 73 20 6e 6f 20 49  er performs no I
9620: 4f 20 61 74 20 61 6c 6c 2c 20 69 74 20 63 61 6e  O at all, it can
9630: 6e 6f 74 20 65 6e 63 6f 75 6e 74 65 72 20 0a 20  not encounter . 
9640: 20 2a 2a 20 65 69 74 68 65 72 20 53 51 4c 49 54   ** either SQLIT
9650: 45 5f 49 4f 45 52 52 20 6f 72 20 53 51 4c 49 54  E_IOERR or SQLIT
9660: 45 5f 46 55 4c 4c 20 64 75 72 69 6e 67 20 72 6f  E_FULL during ro
9670: 6c 6c 62 61 63 6b 20 6f 72 20 77 68 69 6c 65 20  llback or while 
9680: 66 69 6e 61 6c 69 7a 69 6e 67 20 0a 20 20 2a 2a  finalizing .  **
9690: 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e   a journal file.
96a0: 20 28 61 6c 74 68 6f 75 67 68 20 74 68 65 20 69   (although the i
96b0: 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c  n-memory journal
96c0: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
96d0: 6d 61 79 20 0a 20 20 2a 2a 20 72 65 74 75 72 6e  may .  ** return
96e0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
96f0: 4d 45 4d 20 77 68 69 6c 65 20 74 68 65 20 6a 6f  MEM while the jo
9700: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 62 65  urnal file is be
9710: 69 6e 67 20 77 72 69 74 74 65 6e 29 2e 20 49 74  ing written). It
9720: 20 0a 20 20 2a 2a 20 69 73 20 74 68 65 72 65 66   .  ** is theref
9730: 6f 72 65 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65  ore not possible
9740: 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72   for an in-memor
9750: 79 20 70 61 67 65 72 20 74 6f 20 65 6e 74 65 72  y pager to enter
9760: 20 74 68 65 20 45 52 52 4f 52 20 0a 20 20 2a 2a   the ERROR .  **
9770: 20 73 74 61 74 65 2e 0a 20 20 2a 2f 0a 20 20 69   state..  */.  i
9780: 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
9790: 61 73 73 65 72 74 28 20 70 2d 3e 6e 6f 53 79 6e  assert( p->noSyn
97a0: 63 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  c );.    assert(
97b0: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d   p->journalMode=
97c0: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
97d0: 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20 20 20  DE_OFF .        
97e0: 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f   || p->journalMo
97f0: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
9800: 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20 20  LMODE_MEMORY .  
9810: 20 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28    );.    assert(
9820: 20 70 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45   p->eState!=PAGE
9830: 52 5f 45 52 52 4f 52 20 26 26 20 70 2d 3e 65 53  R_ERROR && p->eS
9840: 74 61 74 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e  tate!=PAGER_OPEN
9850: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
9860: 70 61 67 65 72 55 73 65 57 61 6c 28 70 29 3d 3d  pagerUseWal(p)==
9870: 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  0 );.  }..  /* I
9880: 66 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  f changeCountDon
9890: 65 20 69 73 20 73 65 74 2c 20 61 20 52 45 53 45  e is set, a RESE
98a0: 52 56 45 44 20 6c 6f 63 6b 20 6f 72 20 67 72 65  RVED lock or gre
98b0: 61 74 65 72 20 6d 75 73 74 20 62 65 20 68 65 6c  ater must be hel
98c0: 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 66 69  d.  ** on the fi
98d0: 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  le..  */.  asser
98e0: 74 28 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67  t( pPager->chang
98f0: 65 43 6f 75 6e 74 44 6f 6e 65 3d 3d 30 20 7c 7c  eCountDone==0 ||
9900: 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d   pPager->eLock>=
9910: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b  RESERVED_LOCK );
9920: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c  .  assert( p->eL
9930: 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43  ock!=PENDING_LOC
9940: 4b 20 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20  K );..  switch( 
9950: 70 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20  p->eState ){.   
9960: 20 63 61 73 65 20 50 41 47 45 52 5f 4f 50 45 4e   case PAGER_OPEN
9970: 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  :.      assert( 
9980: 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 20 20  !MEMDB );.      
9990: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
99a0: 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
99b0: 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  OK );.      asse
99c0: 72 74 28 20 73 71 6c 69 74 65 33 50 63 61 63 68  rt( sqlite3Pcach
99d0: 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72  eRefCount(pPager
99e0: 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 7c 7c  ->pPCache)==0 ||
99f0: 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
9a00: 65 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  e );.      break
9a10: 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47 45  ;..    case PAGE
9a20: 52 5f 52 45 41 44 45 52 3a 0a 20 20 20 20 20 20  R_READER:.      
9a30: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
9a40: 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
9a50: 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  OK );.      asse
9a60: 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e  rt( p->eLock!=UN
9a70: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20  KNOWN_LOCK );.  
9a80: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65      assert( p->e
9a90: 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock>=SHARED_LOC
9aa0: 4b 20 7c 7c 20 70 2d 3e 6e 6f 52 65 61 64 6c 6f  K || p->noReadlo
9ab0: 63 6b 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ck );.      brea
9ac0: 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47  k;..    case PAG
9ad0: 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
9ae0: 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  :.      assert( 
9af0: 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57  p->eLock!=UNKNOW
9b00: 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20  N_LOCK );.      
9b10: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
9b20: 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
9b30: 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  OK );.      if( 
9b40: 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
9b50: 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ger) ){.        
9b60: 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b  assert( p->eLock
9b70: 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  >=RESERVED_LOCK 
9b80: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
9b90: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
9ba0: 3e 64 62 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d  >dbSize==pPager-
9bb0: 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 3b 0a 20  >dbOrigSize );. 
9bc0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
9bd0: 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d  ger->dbOrigSize=
9be0: 3d 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53  =pPager->dbFileS
9bf0: 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ize );.      ass
9c00: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f  ert( pPager->dbO
9c10: 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d  rigSize==pPager-
9c20: 3e 64 62 48 69 6e 74 53 69 7a 65 20 29 3b 0a 20  >dbHintSize );. 
9c30: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
9c40: 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 3d 3d  ger->setMaster==
9c50: 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
9c60: 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47 45  ;..    case PAGE
9c70: 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
9c80: 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  D:.      assert(
9c90: 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f   p->eLock!=UNKNO
9ca0: 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  WN_LOCK );.     
9cb0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
9cc0: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
9cd0: 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69 66 28  _OK );.      if(
9ce0: 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
9cf0: 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20  ager) ){.       
9d00: 20 2f 2a 20 49 74 20 69 73 20 70 6f 73 73 69 62   /* It is possib
9d10: 6c 65 20 74 68 61 74 20 69 66 20 6a 6f 75 72 6e  le that if journ
9d20: 61 6c 5f 6d 6f 64 65 3d 77 61 6c 20 68 65 72 65  al_mode=wal here
9d30: 20 74 68 61 74 20 6e 65 69 74 68 65 72 20 74 68   that neither th
9d40: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75  e.        ** jou
9d50: 72 6e 61 6c 20 66 69 6c 65 20 6e 6f 72 20 74 68  rnal file nor th
9d60: 65 20 57 41 4c 20 66 69 6c 65 20 61 72 65 20 6f  e WAL file are o
9d70: 70 65 6e 2e 20 54 68 69 73 20 68 61 70 70 65 6e  pen. This happen
9d80: 73 20 64 75 72 69 6e 67 0a 20 20 20 20 20 20 20  s during.       
9d90: 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b 20 74   ** a rollback t
9da0: 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61 74 20  ransaction that 
9db0: 73 77 69 74 63 68 65 73 20 66 72 6f 6d 20 6a 6f  switches from jo
9dc0: 75 72 6e 61 6c 5f 6d 6f 64 65 3d 6f 66 66 0a 20  urnal_mode=off. 
9dd0: 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 6a 6f 75         ** to jou
9de0: 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 2e 0a 20  rnal_mode=wal.. 
9df0: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
9e00: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f    assert( p->eLo
9e10: 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck>=RESERVED_LOC
9e20: 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  K );.        ass
9e30: 65 72 74 28 20 69 73 4f 70 65 6e 28 70 2d 3e 6a  ert( isOpen(p->j
9e40: 66 64 29 20 0a 20 20 20 20 20 20 20 20 20 20 20  fd) .           
9e50: 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d    || p->journalM
9e60: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
9e70: 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20  ALMODE_OFF .    
9e80: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a           || p->j
9e90: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
9ea0: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
9eb0: 4c 20 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  L .        );.  
9ec0: 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
9ed0: 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f 72  rt( pPager->dbOr
9ee0: 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e  igSize==pPager->
9ef0: 64 62 46 69 6c 65 53 69 7a 65 20 29 3b 0a 20 20  dbFileSize );.  
9f00: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
9f10: 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d  er->dbOrigSize==
9f20: 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69  pPager->dbHintSi
9f30: 7a 65 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ze );.      brea
9f40: 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47  k;..    case PAG
9f50: 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 3a  ER_WRITER_DBMOD:
9f60: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
9f70: 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ->eLock==EXCLUSI
9f80: 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  VE_LOCK );.     
9f90: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
9fa0: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
9fb0: 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _OK );.      ass
9fc0: 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
9fd0: 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  l(pPager) );.   
9fe0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c     assert( p->eL
9ff0: 6f 63 6b 3e 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock>=EXCLUSIVE_L
a000: 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  OCK );.      ass
a010: 65 72 74 28 20 69 73 4f 70 65 6e 28 70 2d 3e 6a  ert( isOpen(p->j
a020: 66 64 29 20 0a 20 20 20 20 20 20 20 20 20 20 20  fd) .           
a030: 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  || p->journalMod
a040: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
a050: 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20  MODE_OFF .      
a060: 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e       || p->journ
a070: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
a080: 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20  URNALMODE_WAL . 
a090: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73       );.      as
a0a0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
a0b0: 4f 72 69 67 53 69 7a 65 3c 3d 70 50 61 67 65 72  OrigSize<=pPager
a0c0: 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29 3b 0a  ->dbHintSize );.
a0d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
a0e0: 20 20 63 61 73 65 20 50 41 47 45 52 5f 57 52 49    case PAGER_WRI
a0f0: 54 45 52 5f 46 49 4e 49 53 48 45 44 3a 0a 20 20  TER_FINISHED:.  
a100: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65      assert( p->e
a110: 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
a120: 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  LOCK );.      as
a130: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72  sert( pPager->er
a140: 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b  rCode==SQLITE_OK
a150: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
a160: 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
a170: 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20  Pager) );.      
a180: 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
a190: 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20  ->jfd) .        
a1a0: 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c     || p->journal
a1b0: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
a1c0: 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20  NALMODE_OFF .   
a1d0: 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f          || p->jo
a1e0: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
a1f0: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
a200: 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20   .      );.     
a210: 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73   break;..    cas
a220: 65 20 50 41 47 45 52 5f 45 52 52 4f 52 3a 0a 20  e PAGER_ERROR:. 
a230: 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20 6d 75       /* There mu
a240: 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f  st be at least o
a250: 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  ne outstanding r
a260: 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
a270: 70 61 67 65 72 20 69 66 0a 20 20 20 20 20 20 2a  pager if.      *
a280: 2a 20 69 6e 20 45 52 52 4f 52 20 73 74 61 74 65  * in ERROR state
a290: 2e 20 4f 74 68 65 72 77 69 73 65 20 74 68 65 20  . Otherwise the 
a2a0: 70 61 67 65 72 20 73 68 6f 75 6c 64 20 68 61 76  pager should hav
a2b0: 65 20 61 6c 72 65 61 64 79 20 64 72 6f 70 70 65  e already droppe
a2c0: 64 0a 20 20 20 20 20 20 2a 2a 20 62 61 63 6b 20  d.      ** back 
a2d0: 74 6f 20 4f 50 45 4e 20 73 74 61 74 65 2e 0a 20  to OPEN state.. 
a2e0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73       */.      as
a2f0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72  sert( pPager->er
a300: 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b  rCode!=SQLITE_OK
a310: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
a320: 28 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  ( sqlite3PcacheR
a330: 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
a340: 70 50 43 61 63 68 65 29 3e 30 20 29 3b 0a 20 20  pPCache)>0 );.  
a350: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
a360: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65    return 1;.}.#e
a370: 6e 64 69 66 20 2f 2a 20 69 66 6e 64 65 66 20 4e  ndif /* ifndef N
a380: 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66 64 65 66  DEBUG */..#ifdef
a390: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 0a 2f   SQLITE_DEBUG ./
a3a0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
a3b0: 69 6e 74 65 72 20 74 6f 20 61 20 68 75 6d 61 6e  inter to a human
a3c0: 20 72 65 61 64 61 62 6c 65 20 73 74 72 69 6e 67   readable string
a3d0: 20 69 6e 20 61 20 73 74 61 74 69 63 20 62 75 66   in a static buf
a3e0: 66 65 72 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e  fer.** containin
a3f0: 67 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74  g the state of t
a400: 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  he Pager object 
a410: 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72 67  passed as an arg
a420: 75 6d 65 6e 74 2e 20 54 68 69 73 0a 2a 2a 20 69  ument. This.** i
a430: 73 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 62 65  s intended to be
a440: 20 75 73 65 64 20 77 69 74 68 69 6e 20 64 65 62   used within deb
a450: 75 67 67 65 72 73 2e 20 46 6f 72 20 65 78 61 6d  uggers. For exam
a460: 70 6c 65 2c 20 61 73 20 61 6e 20 61 6c 74 65 72  ple, as an alter
a470: 6e 61 74 69 76 65 0a 2a 2a 20 74 6f 20 22 70 72  native.** to "pr
a480: 69 6e 74 20 2a 70 50 61 67 65 72 22 20 69 6e 20  int *pPager" in 
a490: 67 64 62 3a 0a 2a 2a 0a 2a 2a 20 28 67 64 62 29  gdb:.**.** (gdb)
a4a0: 20 70 72 69 6e 74 66 20 22 25 73 22 2c 20 70 72   printf "%s", pr
a4b0: 69 6e 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  int_pager_state(
a4c0: 70 50 61 67 65 72 29 0a 2a 2f 0a 73 74 61 74 69  pPager).*/.stati
a4d0: 63 20 63 68 61 72 20 2a 70 72 69 6e 74 5f 70 61  c char *print_pa
a4e0: 67 65 72 5f 73 74 61 74 65 28 50 61 67 65 72 20  ger_state(Pager 
a4f0: 2a 70 29 7b 0a 20 20 73 74 61 74 69 63 20 63 68  *p){.  static ch
a500: 61 72 20 7a 52 65 74 5b 31 30 32 34 5d 3b 0a 0a  ar zRet[1024];..
a510: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
a520: 74 66 28 31 30 32 34 2c 20 7a 52 65 74 2c 0a 20  tf(1024, zRet,. 
a530: 20 20 20 20 20 22 46 69 6c 65 6e 61 6d 65 3a 20       "Filename: 
a540: 20 20 20 20 20 25 73 5c 6e 22 0a 20 20 20 20 20       %s\n".     
a550: 20 22 53 74 61 74 65 3a 20 20 20 20 20 20 20 20   "State:        
a560: 20 25 73 20 65 72 72 43 6f 64 65 3d 25 64 5c 6e   %s errCode=%d\n
a570: 22 0a 20 20 20 20 20 20 22 4c 6f 63 6b 3a 20 20  ".      "Lock:  
a580: 20 20 20 20 20 20 20 20 25 73 5c 6e 22 0a 20 20          %s\n".  
a590: 20 20 20 20 22 4c 6f 63 6b 69 6e 67 20 6d 6f 64      "Locking mod
a5a0: 65 3a 20 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65  e:  locking_mode
a5b0: 3d 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 4a 6f  =%s\n".      "Jo
a5c0: 75 72 6e 61 6c 20 6d 6f 64 65 3a 20 20 6a 6f 75  urnal mode:  jou
a5d0: 72 6e 61 6c 5f 6d 6f 64 65 3d 25 73 5c 6e 22 0a  rnal_mode=%s\n".
a5e0: 20 20 20 20 20 20 22 42 61 63 6b 69 6e 67 20 73        "Backing s
a5f0: 74 6f 72 65 3a 20 74 65 6d 70 46 69 6c 65 3d 25  tore: tempFile=%
a600: 64 20 6d 65 6d 44 62 3d 25 64 20 75 73 65 4a 6f  d memDb=%d useJo
a610: 75 72 6e 61 6c 3d 25 64 5c 6e 22 0a 20 20 20 20  urnal=%d\n".    
a620: 20 20 22 4a 6f 75 72 6e 61 6c 3a 20 20 20 20 20    "Journal:     
a630: 20 20 6a 6f 75 72 6e 61 6c 4f 66 66 3d 25 6c 6c    journalOff=%ll
a640: 64 20 6a 6f 75 72 6e 61 6c 48 64 72 3d 25 6c 6c  d journalHdr=%ll
a650: 64 5c 6e 22 0a 20 20 20 20 20 20 22 53 69 7a 65  d\n".      "Size
a660: 3a 20 20 20 20 20 20 20 20 20 20 64 62 73 69 7a  :          dbsiz
a670: 65 3d 25 64 20 64 62 4f 72 69 67 53 69 7a 65 3d  e=%d dbOrigSize=
a680: 25 64 20 64 62 46 69 6c 65 53 69 7a 65 3d 25 64  %d dbFileSize=%d
a690: 5c 6e 22 0a 20 20 20 20 20 20 2c 20 70 2d 3e 7a  \n".      , p->z
a6a0: 46 69 6c 65 6e 61 6d 65 0a 20 20 20 20 20 20 2c  Filename.      ,
a6b0: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
a6c0: 52 5f 4f 50 45 4e 20 20 20 20 20 20 20 20 20 20  R_OPEN          
a6d0: 20 20 3f 20 22 4f 50 45 4e 22 20 3a 0a 20 20 20    ? "OPEN" :.   
a6e0: 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d       p->eState==
a6f0: 50 41 47 45 52 5f 52 45 41 44 45 52 20 20 20 20  PAGER_READER    
a700: 20 20 20 20 20 20 3f 20 22 52 45 41 44 45 52 22        ? "READER"
a710: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53   :.        p->eS
a720: 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
a730: 45 52 5f 4c 4f 43 4b 45 44 20 20 20 3f 20 22 57  ER_LOCKED   ? "W
a740: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 22 20 3a 0a  RITER_LOCKED" :.
a750: 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74          p->eStat
a760: 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
a770: 43 41 43 48 45 4d 4f 44 20 3f 20 22 57 52 49 54  CACHEMOD ? "WRIT
a780: 45 52 5f 43 41 43 48 45 4d 4f 44 22 20 3a 0a 20  ER_CACHEMOD" :. 
a790: 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65         p->eState
a7a0: 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  ==PAGER_WRITER_D
a7b0: 42 4d 4f 44 20 20 20 20 3f 20 22 57 52 49 54 45  BMOD    ? "WRITE
a7c0: 52 5f 44 42 4d 4f 44 22 20 3a 0a 20 20 20 20 20  R_DBMOD" :.     
a7d0: 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41     p->eState==PA
a7e0: 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49 53  GER_WRITER_FINIS
a7f0: 48 45 44 20 3f 20 22 57 52 49 54 45 52 5f 46 49  HED ? "WRITER_FI
a800: 4e 49 53 48 45 44 22 20 3a 0a 20 20 20 20 20 20  NISHED" :.      
a810: 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47    p->eState==PAG
a820: 45 52 5f 45 52 52 4f 52 20 20 20 20 20 20 20 20  ER_ERROR        
a830: 20 20 20 3f 20 22 45 52 52 4f 52 22 20 3a 20 22     ? "ERROR" : "
a840: 3f 65 72 72 6f 72 3f 22 0a 20 20 20 20 20 20 2c  ?error?".      ,
a850: 20 28 69 6e 74 29 70 2d 3e 65 72 72 43 6f 64 65   (int)p->errCode
a860: 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65 4c 6f 63  .      , p->eLoc
a870: 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 20 20 20 20 20  k==NO_LOCK      
a880: 20 20 20 3f 20 22 4e 4f 5f 4c 4f 43 4b 22 20 3a     ? "NO_LOCK" :
a890: 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 4c 6f 63  .        p->eLoc
a8a0: 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  k==RESERVED_LOCK
a8b0: 20 20 20 3f 20 22 52 45 53 45 52 56 45 44 22 20     ? "RESERVED" 
a8c0: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 4c 6f  :.        p->eLo
a8d0: 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
a8e0: 43 4b 20 20 3f 20 22 45 58 43 4c 55 53 49 56 45  CK  ? "EXCLUSIVE
a8f0: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65  " :.        p->e
a900: 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
a910: 4b 20 20 20 20 20 3f 20 22 53 48 41 52 45 44 22  K     ? "SHARED"
a920: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 4c   :.        p->eL
a930: 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  ock==UNKNOWN_LOC
a940: 4b 20 20 20 20 3f 20 22 55 4e 4b 4e 4f 57 4e 22  K    ? "UNKNOWN"
a950: 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20 20 20   : "?error?".   
a960: 20 20 20 2c 20 70 2d 3e 65 78 63 6c 75 73 69 76     , p->exclusiv
a970: 65 4d 6f 64 65 20 3f 20 22 65 78 63 6c 75 73 69  eMode ? "exclusi
a980: 76 65 22 20 3a 20 22 6e 6f 72 6d 61 6c 22 0a 20  ve" : "normal". 
a990: 20 20 20 20 20 2c 20 70 2d 3e 6a 6f 75 72 6e 61       , p->journa
a9a0: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
a9b0: 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
a9c0: 20 20 3f 20 22 6d 65 6d 6f 72 79 22 20 3a 0a 20    ? "memory" :. 
a9d0: 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61         p->journa
a9e0: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
a9f0: 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 20 20 20  RNALMODE_OFF    
aa00: 20 20 3f 20 22 6f 66 66 22 20 3a 0a 20 20 20 20    ? "off" :.    
aa10: 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f      p->journalMo
aa20: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
aa30: 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 20 20 3f  LMODE_DELETE   ?
aa40: 20 22 64 65 6c 65 74 65 22 20 3a 0a 20 20 20 20   "delete" :.    
aa50: 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f      p->journalMo
aa60: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
aa70: 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20 20 3f  LMODE_PERSIST  ?
aa80: 20 22 70 65 72 73 69 73 74 22 20 3a 0a 20 20 20   "persist" :.   
aa90: 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d       p->journalM
aaa0: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
aab0: 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20  ALMODE_TRUNCATE 
aac0: 3f 20 22 74 72 75 6e 63 61 74 65 22 20 3a 0a 20  ? "truncate" :. 
aad0: 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61         p->journa
aae0: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
aaf0: 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 20 20 20  RNALMODE_WAL    
ab00: 20 20 3f 20 22 77 61 6c 22 20 3a 20 22 3f 65 72    ? "wal" : "?er
ab10: 72 6f 72 3f 22 0a 20 20 20 20 20 20 2c 20 28 69  ror?".      , (i
ab20: 6e 74 29 70 2d 3e 74 65 6d 70 46 69 6c 65 2c 20  nt)p->tempFile, 
ab30: 28 69 6e 74 29 70 2d 3e 6d 65 6d 44 62 2c 20 28  (int)p->memDb, (
ab40: 69 6e 74 29 70 2d 3e 75 73 65 4a 6f 75 72 6e 61  int)p->useJourna
ab50: 6c 0a 20 20 20 20 20 20 2c 20 70 2d 3e 6a 6f 75  l.      , p->jou
ab60: 72 6e 61 6c 4f 66 66 2c 20 70 2d 3e 6a 6f 75 72  rnalOff, p->jour
ab70: 6e 61 6c 48 64 72 0a 20 20 20 20 20 20 2c 20 28  nalHdr.      , (
ab80: 69 6e 74 29 70 2d 3e 64 62 53 69 7a 65 2c 20 28  int)p->dbSize, (
ab90: 69 6e 74 29 70 2d 3e 64 62 4f 72 69 67 53 69 7a  int)p->dbOrigSiz
aba0: 65 2c 20 28 69 6e 74 29 70 2d 3e 64 62 46 69 6c  e, (int)p->dbFil
abb0: 65 53 69 7a 65 0a 20 20 29 3b 0a 0a 20 20 72 65  eSize.  );..  re
abc0: 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 23 65 6e  turn zRet;.}.#en
abd0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  dif../*.** Retur
abe0: 6e 20 74 72 75 65 20 69 66 20 69 74 20 69 73 20  n true if it is 
abf0: 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77 72 69  necessary to wri
ac00: 74 65 20 70 61 67 65 20 2a 70 50 67 20 69 6e 74  te page *pPg int
ac10: 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  o the sub-journa
ac20: 6c 2e 0a 2a 2a 20 41 20 70 61 67 65 20 6e 65 65  l..** A page nee
ac30: 64 73 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  ds to be written
ac40: 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f   into the sub-jo
ac50: 75 72 6e 61 6c 20 69 66 20 74 68 65 72 65 20 65  urnal if there e
ac60: 78 69 73 74 73 20 6f 6e 65 0a 2a 2a 20 6f 72 20  xists one.** or 
ac70: 6d 6f 72 65 20 6f 70 65 6e 20 73 61 76 65 70 6f  more open savepo
ac80: 69 6e 74 73 20 66 6f 72 20 77 68 69 63 68 3a 0a  ints for which:.
ac90: 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 70 61  **.**   * The pa
aca0: 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 6c 65 73  ge-number is les
acb0: 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  s than or equal 
acc0: 74 6f 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  to PagerSavepoin
acd0: 74 2e 6e 4f 72 69 67 2c 20 61 6e 64 0a 2a 2a 20  t.nOrig, and.** 
ace0: 20 20 2a 20 54 68 65 20 62 69 74 20 63 6f 72 72    * The bit corr
acf0: 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65  esponding to the
ad00: 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20   page-number is 
ad10: 6e 6f 74 20 73 65 74 20 69 6e 0a 2a 2a 20 20 20  not set in.**   
ad20: 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74    PagerSavepoint
ad30: 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2e 0a 2a  .pInSavepoint..*
ad40: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75 62  /.static int sub
ad50: 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 50 67  jRequiresPage(Pg
ad60: 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 67 6e  Hdr *pPg){.  Pgn
ad70: 6f 20 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67  o pgno = pPg->pg
ad80: 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  no;.  Pager *pPa
ad90: 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
ada0: 72 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  r;.  int i;.  fo
adb0: 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 72 2d  r(i=0; i<pPager-
adc0: 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 2b 2b  >nSavepoint; i++
add0: 29 7b 0a 20 20 20 20 50 61 67 65 72 53 61 76 65  ){.    PagerSave
ade0: 70 6f 69 6e 74 20 2a 70 20 3d 20 26 70 50 61 67  point *p = &pPag
adf0: 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69  er->aSavepoint[i
ae00: 5d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 4f  ];.    if( p->nO
ae10: 72 69 67 3e 3d 70 67 6e 6f 20 26 26 20 30 3d 3d  rig>=pgno && 0==
ae20: 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73  sqlite3BitvecTes
ae30: 74 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e  t(p->pInSavepoin
ae40: 74 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20  t, pgno) ){.    
ae50: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
ae60: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
ae70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
ae80: 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 70 61  n true if the pa
ae90: 67 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  ge is already in
aea0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
aeb0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
aec0: 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 50   pageInJournal(P
aed0: 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 72 65  gHdr *pPg){.  re
aee0: 74 75 72 6e 20 73 71 6c 69 74 65 33 42 69 74 76  turn sqlite3Bitv
aef0: 65 63 54 65 73 74 28 70 50 67 2d 3e 70 50 61 67  ecTest(pPg->pPag
af00: 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20  er->pInJournal, 
af10: 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 7d 0a 0a 2f  pPg->pgno);.}../
af20: 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33 32 2d 62  *.** Read a 32-b
af30: 69 74 20 69 6e 74 65 67 65 72 20 66 72 6f 6d 20  it integer from 
af40: 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64  the given file d
af50: 65 73 63 72 69 70 74 6f 72 2e 20 20 53 74 6f 72  escriptor.  Stor
af60: 65 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a  e the integer.**
af70: 20 74 68 61 74 20 69 73 20 72 65 61 64 20 69 6e   that is read in
af80: 20 2a 70 52 65 73 2e 20 20 52 65 74 75 72 6e 20   *pRes.  Return 
af90: 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65  SQLITE_OK if eve
afa0: 72 79 74 68 69 6e 67 20 77 6f 72 6b 65 64 2c 20  rything worked, 
afb0: 6f 72 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 63  or an.** error c
afc0: 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67  ode is something
afd0: 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a   goes wrong..**.
afe0: 2a 2a 20 41 6c 6c 20 76 61 6c 75 65 73 20 61 72  ** All values ar
aff0: 65 20 73 74 6f 72 65 64 20 6f 6e 20 64 69 73 6b  e stored on disk
b000: 20 61 73 20 62 69 67 2d 65 6e 64 69 61 6e 2e 0a   as big-endian..
b010: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
b020: 61 64 33 32 62 69 74 73 28 73 71 6c 69 74 65 33  ad32bits(sqlite3
b030: 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f  _file *fd, i64 o
b040: 66 66 73 65 74 2c 20 75 33 32 20 2a 70 52 65 73  ffset, u32 *pRes
b050: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  ){.  unsigned ch
b060: 61 72 20 61 63 5b 34 5d 3b 0a 20 20 69 6e 74 20  ar ac[4];.  int 
b070: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
b080: 61 64 28 66 64 2c 20 61 63 2c 20 73 69 7a 65 6f  ad(fd, ac, sizeo
b090: 66 28 61 63 29 2c 20 6f 66 66 73 65 74 29 3b 0a  f(ac), offset);.
b0a0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
b0b0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 65 73  _OK ){.    *pRes
b0c0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62 79   = sqlite3Get4by
b0d0: 74 65 28 61 63 29 3b 0a 20 20 7d 0a 20 20 72 65  te(ac);.  }.  re
b0e0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
b0f0: 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62 69 74  * Write a 32-bit
b100: 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 61 20   integer into a 
b110: 73 74 72 69 6e 67 20 62 75 66 66 65 72 20 69 6e  string buffer in
b120: 20 62 69 67 2d 65 6e 64 69 61 6e 20 62 79 74 65   big-endian byte
b130: 20 6f 72 64 65 72 2e 0a 2a 2f 0a 23 64 65 66 69   order..*/.#defi
b140: 6e 65 20 70 75 74 33 32 62 69 74 73 28 41 2c 42  ne put32bits(A,B
b150: 29 20 20 73 71 6c 69 74 65 33 50 75 74 34 62 79  )  sqlite3Put4by
b160: 74 65 28 28 75 38 2a 29 41 2c 42 29 0a 0a 0a 2f  te((u8*)A,B).../
b170: 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d  *.** Write a 32-
b180: 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f  bit integer into
b190: 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20   the given file 
b1a0: 64 65 73 63 72 69 70 74 6f 72 2e 20 20 52 65 74  descriptor.  Ret
b1b0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  urn SQLITE_OK.**
b1c0: 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61   on success or a
b1d0: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
b1e0: 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77  something goes w
b1f0: 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rong..*/.static 
b200: 69 6e 74 20 77 72 69 74 65 33 32 62 69 74 73 28  int write32bits(
b210: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
b220: 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20 75 33  , i64 offset, u3
b230: 32 20 76 61 6c 29 7b 0a 20 20 63 68 61 72 20 61  2 val){.  char a
b240: 63 5b 34 5d 3b 0a 20 20 70 75 74 33 32 62 69 74  c[4];.  put32bit
b250: 73 28 61 63 2c 20 76 61 6c 29 3b 0a 20 20 72 65  s(ac, val);.  re
b260: 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 57 72  turn sqlite3OsWr
b270: 69 74 65 28 66 64 2c 20 61 63 2c 20 34 2c 20 6f  ite(fd, ac, 4, o
b280: 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ffset);.}../*.**
b290: 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61   Unlock the data
b2a0: 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6c 65 76  base file to lev
b2b0: 65 6c 20 65 4c 6f 63 6b 2c 20 77 68 69 63 68 20  el eLock, which 
b2c0: 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e  must be either N
b2d0: 4f 5f 4c 4f 43 4b 0a 2a 2a 20 6f 72 20 53 48 41  O_LOCK.** or SHA
b2e0: 52 45 44 5f 4c 4f 43 4b 2e 20 52 65 67 61 72 64  RED_LOCK. Regard
b2f0: 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20  less of whether 
b300: 6f 72 20 6e 6f 74 20 74 68 65 20 63 61 6c 6c 20  or not the call 
b310: 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20  to xUnlock().** 
b320: 73 75 63 63 65 65 64 73 2c 20 73 65 74 20 74 68  succeeds, set th
b330: 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 76 61  e Pager.eLock va
b340: 72 69 61 62 6c 65 20 74 6f 20 6d 61 74 63 68 20  riable to match 
b350: 74 68 65 20 28 61 74 74 65 6d 70 74 65 64 29 20  the (attempted) 
b360: 6e 65 77 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  new lock..**.** 
b370: 45 78 63 65 70 74 2c 20 69 66 20 50 61 67 65 72  Except, if Pager
b380: 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74 20 74 6f  .eLock is set to
b390: 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 77 68   UNKNOWN_LOCK wh
b3a0: 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
b3b0: 20 69 73 0a 2a 2a 20 63 61 6c 6c 65 64 2c 20 64   is.** called, d
b3c0: 6f 20 6e 6f 74 20 6d 6f 64 69 66 79 20 69 74 2e  o not modify it.
b3d0: 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74   See the comment
b3e0: 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69   above the #defi
b3f0: 6e 65 20 6f 66 20 0a 2a 2a 20 55 4e 4b 4e 4f 57  ne of .** UNKNOW
b400: 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e 20 65 78  N_LOCK for an ex
b410: 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74 68 69  planation of thi
b420: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
b430: 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 50   pagerUnlockDb(P
b440: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
b450: 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20  t eLock){.  int 
b460: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
b470: 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67  .  assert( !pPag
b480: 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
b490: 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f  e || pPager->eLo
b4a0: 63 6b 3d 3d 65 4c 6f 63 6b 20 29 3b 0a 20 20 61  ck==eLock );.  a
b4b0: 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 4e 4f  ssert( eLock==NO
b4c0: 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d  _LOCK || eLock==
b4d0: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
b4e0: 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 21 3d   assert( eLock!=
b4f0: 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70 61 67 65 72  NO_LOCK || pager
b500: 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d  UseWal(pPager)==
b510: 30 20 29 3b 0a 20 20 69 66 28 20 69 73 4f 70 65  0 );.  if( isOpe
b520: 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b  n(pPager->fd) ){
b530: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
b540: 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 65 4c 6f 63  ger->eLock>=eLoc
b550: 6b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  k );.    rc = sq
b560: 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50  lite3OsUnlock(pP
b570: 61 67 65 72 2d 3e 66 64 2c 20 65 4c 6f 63 6b 29  ager->fd, eLock)
b580: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
b590: 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e  ->eLock!=UNKNOWN
b5a0: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 70  _LOCK ){.      p
b5b0: 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 28  Pager->eLock = (
b5c0: 75 38 29 65 4c 6f 63 6b 3b 0a 20 20 20 20 7d 0a  u8)eLock;.    }.
b5d0: 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 55 4e      IOTRACE(("UN
b5e0: 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70  LOCK %p %d\n", p
b5f0: 50 61 67 65 72 2c 20 65 4c 6f 63 6b 29 29 0a 20  Pager, eLock)). 
b600: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
b610: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68  }../*.** Lock th
b620: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
b630: 74 6f 20 6c 65 76 65 6c 20 65 4c 6f 63 6b 2c 20  to level eLock, 
b640: 77 68 69 63 68 20 6d 75 73 74 20 62 65 20 65 69  which must be ei
b650: 74 68 65 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ther SHARED_LOCK
b660: 2c 0a 2a 2a 20 52 45 53 45 52 56 45 44 5f 4c 4f  ,.** RESERVED_LO
b670: 43 4b 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f  CK or EXCLUSIVE_
b680: 4c 4f 43 4b 2e 20 49 66 20 74 68 65 20 63 61 6c  LOCK. If the cal
b690: 6c 65 72 20 69 73 20 73 75 63 63 65 73 73 66 75  ler is successfu
b6a0: 6c 2c 20 73 65 74 20 74 68 65 0a 2a 2a 20 50 61  l, set the.** Pa
b6b0: 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62  ger.eLock variab
b6c0: 6c 65 20 74 6f 20 74 68 65 20 6e 65 77 20 6c 6f  le to the new lo
b6d0: 63 6b 69 6e 67 20 73 74 61 74 65 2e 20 0a 2a 2a  cking state. .**
b6e0: 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 66 20 50  .** Except, if P
b6f0: 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65  ager.eLock is se
b700: 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  t to UNKNOWN_LOC
b710: 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  K when this func
b720: 74 69 6f 6e 20 69 73 20 0a 2a 2a 20 63 61 6c 6c  tion is .** call
b730: 65 64 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66  ed, do not modif
b740: 79 20 69 74 20 75 6e 6c 65 73 73 20 74 68 65 20  y it unless the 
b750: 6e 65 77 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74  new locking stat
b760: 65 20 69 73 20 45 58 43 4c 55 53 49 56 45 5f 4c  e is EXCLUSIVE_L
b770: 4f 43 4b 2e 20 0a 2a 2a 20 53 65 65 20 74 68 65  OCK. .** See the
b780: 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20 74   comment above t
b790: 68 65 20 23 64 65 66 69 6e 65 20 6f 66 20 55 4e  he #define of UN
b7a0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61  KNOWN_LOCK for a
b7b0: 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 0a 2a  n explanation .*
b7c0: 2a 20 6f 66 20 74 68 69 73 2e 0a 2a 2f 0a 73 74  * of this..*/.st
b7d0: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 4c 6f  atic int pagerLo
b7e0: 63 6b 44 62 28 50 61 67 65 72 20 2a 70 50 61 67  ckDb(Pager *pPag
b7f0: 65 72 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a  er, int eLock){.
b800: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
b810: 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
b820: 20 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c   eLock==SHARED_L
b830: 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 52 45  OCK || eLock==RE
b840: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65  SERVED_LOCK || e
b850: 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
b860: 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 50  LOCK );.  if( pP
b870: 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 65 4c 6f 63  ager->eLock<eLoc
b880: 6b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f  k || pPager->eLo
b890: 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b  ck==UNKNOWN_LOCK
b8a0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
b8b0: 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65  ite3OsLock(pPage
b8c0: 72 2d 3e 66 64 2c 20 65 4c 6f 63 6b 29 3b 0a 20  r->fd, eLock);. 
b8d0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
b8e0: 45 5f 4f 4b 20 26 26 20 28 70 50 61 67 65 72 2d  E_OK && (pPager-
b8f0: 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f  >eLock!=UNKNOWN_
b900: 4c 4f 43 4b 7c 7c 65 4c 6f 63 6b 3d 3d 45 58 43  LOCK||eLock==EXC
b910: 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 20 29 7b 0a  LUSIVE_LOCK) ){.
b920: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 4c        pPager->eL
b930: 6f 63 6b 20 3d 20 28 75 38 29 65 4c 6f 63 6b 3b  ock = (u8)eLock;
b940: 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28  .      IOTRACE((
b950: 22 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20  "LOCK %p %d\n", 
b960: 70 50 61 67 65 72 2c 20 65 4c 6f 63 6b 29 29 0a  pPager, eLock)).
b970: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
b980: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
b990: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65  This function de
b9a0: 74 65 72 6d 69 6e 65 73 20 77 68 65 74 68 65 72  termines whether
b9b0: 20 6f 72 20 6e 6f 74 20 74 68 65 20 61 74 6f 6d   or not the atom
b9c0: 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a  ic-write optimiz
b9d0: 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65 20  ation.** can be 
b9e0: 75 73 65 64 20 77 69 74 68 20 74 68 69 73 20 70  used with this p
b9f0: 61 67 65 72 2e 20 54 68 65 20 6f 70 74 69 6d 69  ager. The optimi
ba00: 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65 20 75 73  zation can be us
ba10: 65 64 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 28 61  ed if:.**.**  (a
ba20: 29 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75  ) the value retu
ba30: 72 6e 65 64 20 62 79 20 4f 73 44 65 76 69 63 65  rned by OsDevice
ba40: 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
ba50: 29 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74  ) indicates that
ba60: 0a 2a 2a 20 20 20 20 20 20 61 20 64 61 74 61 62  .**      a datab
ba70: 61 73 65 20 70 61 67 65 20 6d 61 79 20 62 65 20  ase page may be 
ba80: 77 72 69 74 74 65 6e 20 61 74 6f 6d 69 63 61 6c  written atomical
ba90: 6c 79 2c 20 61 6e 64 0a 2a 2a 20 20 28 62 29 20  ly, and.**  (b) 
baa0: 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
bab0: 65 64 20 62 79 20 4f 73 53 65 63 74 6f 72 53 69  ed by OsSectorSi
bac0: 7a 65 28 29 20 69 73 20 6c 65 73 73 20 74 68 61  ze() is less tha
bad0: 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 20 20  n or equal.**   
bae0: 20 20 20 74 6f 20 74 68 65 20 70 61 67 65 20 73     to the page s
baf0: 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f  ize..**.** The o
bb00: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 61  ptimization is a
bb10: 6c 73 6f 20 61 6c 77 61 79 73 20 65 6e 61 62 6c  lso always enabl
bb20: 65 64 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79  ed for temporary
bb30: 20 66 69 6c 65 73 2e 20 49 74 20 69 73 0a 2a 2a   files. It is.**
bb40: 20 61 6e 20 65 72 72 6f 72 20 74 6f 20 63 61 6c   an error to cal
bb50: 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  l this function 
bb60: 69 66 20 70 50 61 67 65 72 20 69 73 20 6f 70 65  if pPager is ope
bb70: 6e 65 64 20 6f 6e 20 61 6e 20 69 6e 2d 6d 65 6d  ned on an in-mem
bb80: 6f 72 79 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e  ory.** database.
bb90: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f 70  .**.** If the op
bba0: 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 6e 6f  timization canno
bbb0: 74 20 62 65 20 75 73 65 64 2c 20 30 20 69 73 20  t be used, 0 is 
bbc0: 72 65 74 75 72 6e 65 64 2e 20 49 66 20 69 74 20  returned. If it 
bbd0: 63 61 6e 20 62 65 20 75 73 65 64 2c 0a 2a 2a 20  can be used,.** 
bbe0: 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 72  then the value r
bbf0: 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20 73  eturned is the s
bc00: 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
bc10: 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 69 74 0a  al file when it.
bc20: 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 72 6f 6c 6c  ** contains roll
bc30: 62 61 63 6b 20 64 61 74 61 20 66 6f 72 20 65 78  back data for ex
bc40: 61 63 74 6c 79 20 6f 6e 65 20 70 61 67 65 2e 0a  actly one page..
bc50: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
bc60: 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57  _ENABLE_ATOMIC_W
bc70: 52 49 54 45 0a 73 74 61 74 69 63 20 69 6e 74 20  RITE.static int 
bc80: 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 50  jrnlBufferSize(P
bc90: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
bca0: 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20   assert( !MEMDB 
bcb0: 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  );.  if( !pPager
bcc0: 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20  ->tempFile ){.  
bcd0: 20 20 69 6e 74 20 64 63 3b 20 20 20 20 20 20 20    int dc;       
bce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bcf0: 20 20 20 20 2f 2a 20 44 65 76 69 63 65 20 63 68      /* Device ch
bd00: 61 72 61 63 74 65 72 69 73 74 69 63 73 20 2a 2f  aracteristics */
bd10: 0a 20 20 20 20 69 6e 74 20 6e 53 65 63 74 6f 72  .    int nSector
bd20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
bd30: 20 20 20 20 20 20 20 2f 2a 20 53 65 63 74 6f 72         /* Sector
bd40: 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 69 6e 74   size */.    int
bd50: 20 73 7a 50 61 67 65 3b 20 20 20 20 20 20 20 20   szPage;        
bd60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bd70: 2a 20 50 61 67 65 20 73 69 7a 65 20 2a 2f 0a 0a  * Page size */..
bd80: 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70      assert( isOp
bd90: 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
bda0: 3b 0a 20 20 20 20 64 63 20 3d 20 73 71 6c 69 74  ;.    dc = sqlit
bdb0: 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  e3OsDeviceCharac
bdc0: 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72  teristics(pPager
bdd0: 2d 3e 66 64 29 3b 0a 20 20 20 20 6e 53 65 63 74  ->fd);.    nSect
bde0: 6f 72 20 3d 20 70 50 61 67 65 72 2d 3e 73 65 63  or = pPager->sec
bdf0: 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20 73 7a 50  torSize;.    szP
be00: 61 67 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  age = pPager->pa
be10: 67 65 53 69 7a 65 3b 0a 0a 20 20 20 20 61 73 73  geSize;..    ass
be20: 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50  ert(SQLITE_IOCAP
be30: 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32  _ATOMIC512==(512
be40: 3e 3e 38 29 29 3b 0a 20 20 20 20 61 73 73 65 72  >>8));.    asser
be50: 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  t(SQLITE_IOCAP_A
be60: 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33 36  TOMIC64K==(65536
be70: 3e 3e 38 29 29 3b 0a 20 20 20 20 69 66 28 20 30  >>8));.    if( 0
be80: 3d 3d 28 64 63 26 28 53 51 4c 49 54 45 5f 49 4f  ==(dc&(SQLITE_IO
be90: 43 41 50 5f 41 54 4f 4d 49 43 7c 28 73 7a 50 61  CAP_ATOMIC|(szPa
bea0: 67 65 3e 3e 38 29 29 20 7c 7c 20 6e 53 65 63 74  ge>>8)) || nSect
beb0: 6f 72 3e 73 7a 50 61 67 65 29 20 29 7b 0a 20 20  or>szPage) ){.  
bec0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
bed0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
bee0: 6e 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  n JOURNAL_HDR_SZ
bef0: 28 70 50 61 67 65 72 29 20 2b 20 4a 4f 55 52 4e  (pPager) + JOURN
bf00: 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29  AL_PG_SZ(pPager)
bf10: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
bf20: 2a 20 49 66 20 53 51 4c 49 54 45 5f 43 48 45 43  * If SQLITE_CHEC
bf30: 4b 5f 50 41 47 45 53 20 69 73 20 64 65 66 69 6e  K_PAGES is defin
bf40: 65 64 20 74 68 65 6e 20 77 65 20 64 6f 20 73 6f  ed then we do so
bf50: 6d 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69  me sanity checki
bf60: 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 61 63  ng.** on the cac
bf70: 68 65 20 75 73 69 6e 67 20 61 20 68 61 73 68 20  he using a hash 
bf80: 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73 20  function.  This 
bf90: 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74  is used for test
bfa0: 69 6e 67 0a 2a 2a 20 61 6e 64 20 64 65 62 75 67  ing.** and debug
bfb0: 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69  ging only..*/.#i
bfc0: 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
bfd0: 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a 2a 20 52 65  K_PAGES./*.** Re
bfe0: 74 75 72 6e 20 61 20 33 32 2d 62 69 74 20 68 61  turn a 32-bit ha
bff0: 73 68 20 6f 66 20 74 68 65 20 70 61 67 65 20 64  sh of the page d
c000: 61 74 61 20 66 6f 72 20 70 50 61 67 65 2e 0a 2a  ata for pPage..*
c010: 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67  /.static u32 pag
c020: 65 72 5f 64 61 74 61 68 61 73 68 28 69 6e 74 20  er_datahash(int 
c030: 6e 42 79 74 65 2c 20 75 6e 73 69 67 6e 65 64 20  nByte, unsigned 
c040: 63 68 61 72 20 2a 70 44 61 74 61 29 7b 0a 20 20  char *pData){.  
c050: 75 33 32 20 68 61 73 68 20 3d 20 30 3b 0a 20 20  u32 hash = 0;.  
c060: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
c070: 3b 20 69 3c 6e 42 79 74 65 3b 20 69 2b 2b 29 7b  ; i<nByte; i++){
c080: 0a 20 20 20 20 68 61 73 68 20 3d 20 28 68 61 73  .    hash = (has
c090: 68 2a 31 30 33 39 29 20 2b 20 70 44 61 74 61 5b  h*1039) + pData[
c0a0: 69 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  i];.  }.  return
c0b0: 20 68 61 73 68 3b 0a 7d 0a 73 74 61 74 69 63 20   hash;.}.static 
c0c0: 75 33 32 20 70 61 67 65 72 5f 70 61 67 65 68 61  u32 pager_pageha
c0d0: 73 68 28 50 67 48 64 72 20 2a 70 50 61 67 65 29  sh(PgHdr *pPage)
c0e0: 7b 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65 72  {.  return pager
c0f0: 5f 64 61 74 61 68 61 73 68 28 70 50 61 67 65 2d  _datahash(pPage-
c100: 3e 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  >pPager->pageSiz
c110: 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61  e, (unsigned cha
c120: 72 20 2a 29 70 50 61 67 65 2d 3e 70 44 61 74 61  r *)pPage->pData
c130: 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
c140: 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68   pager_set_pageh
c150: 61 73 68 28 50 67 48 64 72 20 2a 70 50 61 67 65  ash(PgHdr *pPage
c160: 29 7b 0a 20 20 70 50 61 67 65 2d 3e 70 61 67 65  ){.  pPage->page
c170: 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67  Hash = pager_pag
c180: 65 68 61 73 68 28 70 50 61 67 65 29 3b 0a 7d 0a  ehash(pPage);.}.
c190: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 48 45 43 4b  ./*.** The CHECK
c1a0: 5f 50 41 47 45 20 6d 61 63 72 6f 20 74 61 6b 65  _PAGE macro take
c1b0: 73 20 61 20 50 67 48 64 72 2a 20 61 73 20 61 6e  s a PgHdr* as an
c1c0: 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20 53 51   argument. If SQ
c1d0: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
c1e0: 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65 64 2c 20  .** is defined, 
c1f0: 61 6e 64 20 4e 44 45 42 55 47 20 69 73 20 6e 6f  and NDEBUG is no
c200: 74 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73  t defined, an as
c210: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
c220: 20 63 68 65 63 6b 73 0a 2a 2a 20 74 68 61 74 20   checks.** that 
c230: 74 68 65 20 70 61 67 65 20 69 73 20 65 69 74 68  the page is eith
c240: 65 72 20 64 69 72 74 79 20 6f 72 20 73 74 69 6c  er dirty or stil
c250: 6c 20 6d 61 74 63 68 65 73 20 74 68 65 20 63 61  l matches the ca
c260: 6c 63 75 6c 61 74 65 64 20 70 61 67 65 2d 68 61  lculated page-ha
c270: 73 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 43  sh..*/.#define C
c280: 48 45 43 4b 5f 50 41 47 45 28 78 29 20 63 68 65  HECK_PAGE(x) che
c290: 63 6b 50 61 67 65 28 78 29 0a 73 74 61 74 69 63  ckPage(x).static
c2a0: 20 76 6f 69 64 20 63 68 65 63 6b 50 61 67 65 28   void checkPage(
c2b0: 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
c2c0: 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
c2d0: 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 61 73  Pg->pPager;.  as
c2e0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
c2f0: 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f  tate!=PAGER_ERRO
c300: 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  R );.  assert( (
c310: 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
c320: 5f 44 49 52 54 59 29 20 7c 7c 20 70 50 67 2d 3e  _DIRTY) || pPg->
c330: 70 61 67 65 48 61 73 68 3d 3d 70 61 67 65 72 5f  pageHash==pager_
c340: 70 61 67 65 68 61 73 68 28 70 50 67 29 20 29 3b  pagehash(pPg) );
c350: 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e  .}..#else.#defin
c360: 65 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68  e pager_datahash
c370: 28 58 2c 59 29 20 20 30 0a 23 64 65 66 69 6e 65  (X,Y)  0.#define
c380: 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
c390: 58 29 20 20 30 0a 23 64 65 66 69 6e 65 20 70 61  X)  0.#define pa
c3a0: 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68  ger_set_pagehash
c3b0: 28 58 29 0a 23 64 65 66 69 6e 65 20 43 48 45 43  (X).#define CHEC
c3c0: 4b 5f 50 41 47 45 28 78 29 0a 23 65 6e 64 69 66  K_PAGE(x).#endif
c3d0: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 48 45 43    /* SQLITE_CHEC
c3e0: 4b 5f 50 41 47 45 53 20 2a 2f 0a 0a 2f 2a 0a 2a  K_PAGES */../*.*
c3f0: 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73 20 63  * When this is c
c400: 61 6c 6c 65 64 20 74 68 65 20 6a 6f 75 72 6e 61  alled the journa
c410: 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72  l file for pager
c420: 20 70 50 61 67 65 72 20 6d 75 73 74 20 62 65 20   pPager must be 
c430: 6f 70 65 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 75  open..** This fu
c440: 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20  nction attempts 
c450: 74 6f 20 72 65 61 64 20 61 20 6d 61 73 74 65 72  to read a master
c460: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
c470: 6d 65 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a 20  me from the .** 
c480: 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20  end of the file 
c490: 61 6e 64 2c 20 69 66 20 73 75 63 63 65 73 73 66  and, if successf
c4a0: 75 6c 2c 20 63 6f 70 69 65 73 20 69 74 20 69 6e  ul, copies it in
c4b0: 74 6f 20 6d 65 6d 6f 72 79 20 73 75 70 70 6c 69  to memory suppli
c4c0: 65 64 20 0a 2a 2a 20 62 79 20 74 68 65 20 63 61  ed .** by the ca
c4d0: 6c 6c 65 72 2e 20 53 65 65 20 63 6f 6d 6d 65 6e  ller. See commen
c4e0: 74 73 20 61 62 6f 76 65 20 77 72 69 74 65 4d 61  ts above writeMa
c4f0: 73 74 65 72 4a 6f 75 72 6e 61 6c 28 29 20 66 6f  sterJournal() fo
c500: 72 20 74 68 65 20 66 6f 72 6d 61 74 0a 2a 2a 20  r the format.** 
c510: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 61 20  used to store a 
c520: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
c530: 69 6c 65 20 6e 61 6d 65 20 61 74 20 74 68 65 20  ile name at the 
c540: 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c  end of a journal
c550: 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 7a 4d 61   file..**.** zMa
c560: 73 74 65 72 20 6d 75 73 74 20 70 6f 69 6e 74 20  ster must point 
c570: 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20 61  to a buffer of a
c580: 74 20 6c 65 61 73 74 20 6e 4d 61 73 74 65 72 20  t least nMaster 
c590: 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20  bytes allocated 
c5a0: 62 79 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72  by.** the caller
c5b0: 2e 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65  . This should be
c5c0: 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50   sqlite3_vfs.mxP
c5d0: 61 74 68 6e 61 6d 65 2b 31 20 28 74 6f 20 65 6e  athname+1 (to en
c5e0: 73 75 72 65 20 74 68 65 72 65 20 69 73 0a 2a 2a  sure there is.**
c5f0: 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20 74 6f   enough space to
c600: 20 77 72 69 74 65 20 74 68 65 20 6d 61 73 74 65   write the maste
c610: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 29 2e  r journal name).
c620: 20 49 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a   If the master j
c630: 6f 75 72 6e 61 6c 0a 2a 2a 20 6e 61 6d 65 20 69  ournal.** name i
c640: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  n the journal is
c650: 20 6c 6f 6e 67 65 72 20 74 68 61 6e 20 6e 4d 61   longer than nMa
c660: 73 74 65 72 20 62 79 74 65 73 20 28 69 6e 63 6c  ster bytes (incl
c670: 75 64 69 6e 67 20 61 0a 2a 2a 20 6e 75 6c 2d 74  uding a.** nul-t
c680: 65 72 6d 69 6e 61 74 6f 72 29 2c 20 74 68 65 6e  erminator), then
c690: 20 74 68 69 73 20 69 73 20 68 61 6e 64 6c 65 64   this is handled
c6a0: 20 61 73 20 69 66 20 6e 6f 20 6d 61 73 74 65 72   as if no master
c6b0: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 2a 2a   journal name.**
c6c0: 20 77 65 72 65 20 70 72 65 73 65 6e 74 20 69 6e   were present in
c6d0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a   the journal..**
c6e0: 0a 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20  .** If a master 
c6f0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
c700: 65 20 69 73 20 70 72 65 73 65 6e 74 20 61 74 20  e is present at 
c710: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a  the end of the j
c720: 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2c 20  ournal.** file, 
c730: 74 68 65 6e 20 69 74 20 69 73 20 63 6f 70 69 65  then it is copie
c740: 64 20 69 6e 74 6f 20 74 68 65 20 62 75 66 66 65  d into the buffe
c750: 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  r pointed to by 
c760: 7a 4d 61 73 74 65 72 2e 20 41 0a 2a 2a 20 6e 75  zMaster. A.** nu
c770: 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74  l-terminator byt
c780: 65 20 69 73 20 61 70 70 65 6e 64 65 64 20 74 6f  e is appended to
c790: 20 74 68 65 20 62 75 66 66 65 72 20 66 6f 6c 6c   the buffer foll
c7a0: 6f 77 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72  owing the master
c7b0: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
c7c0: 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   name..**.** If 
c7d0: 69 74 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64  it is determined
c7e0: 20 74 68 61 74 20 6e 6f 20 6d 61 73 74 65 72 20   that no master 
c7f0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
c800: 65 20 69 73 20 70 72 65 73 65 6e 74 20 0a 2a 2a  e is present .**
c810: 20 7a 4d 61 73 74 65 72 5b 30 5d 20 69 73 20 73   zMaster[0] is s
c820: 65 74 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49  et to 0 and SQLI
c830: 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a  TE_OK returned..
c840: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
c850: 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 72  r occurs while r
c860: 65 61 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20  eading from the 
c870: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 61 6e  journal file, an
c880: 20 53 51 4c 69 74 65 0a 2a 2a 20 65 72 72 6f 72   SQLite.** error
c890: 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
c8a0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
c8b0: 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e   readMasterJourn
c8c0: 61 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  al(sqlite3_file 
c8d0: 2a 70 4a 72 6e 6c 2c 20 63 68 61 72 20 2a 7a 4d  *pJrnl, char *zM
c8e0: 61 73 74 65 72 2c 20 75 33 32 20 6e 4d 61 73 74  aster, u32 nMast
c8f0: 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  er){.  int rc;  
c900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c910: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
c920: 20 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 3b 20 20   */.  u32 len;  
c930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c940: 20 2f 2a 20 4c 65 6e 67 74 68 20 69 6e 20 62 79   /* Length in by
c950: 74 65 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  tes of master jo
c960: 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20  urnal name */.  
c970: 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20  i64 szJ;        
c980: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f             /* To
c990: 74 61 6c 20 73 69 7a 65 20 69 6e 20 62 79 74 65  tal size in byte
c9a0: 73 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  s of journal fil
c9b0: 65 20 70 4a 72 6e 6c 20 2a 2f 0a 20 20 75 33 32  e pJrnl */.  u32
c9c0: 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20   cksum;         
c9d0: 20 20 20 20 20 20 20 20 2f 2a 20 4d 4a 20 63 68          /* MJ ch
c9e0: 65 63 6b 73 75 6d 20 76 61 6c 75 65 20 72 65 61  ecksum value rea
c9f0: 64 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 2a  d from journal *
ca00: 2f 0a 20 20 75 33 32 20 75 3b 20 20 20 20 20 20  /.  u32 u;      
ca10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ca20: 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20  * Unsigned loop 
ca30: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 6e 73  counter */.  uns
ca40: 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69  igned char aMagi
ca50: 63 5b 38 5d 3b 20 20 20 2f 2a 20 41 20 62 75 66  c[8];   /* A buf
ca60: 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  fer to hold the 
ca70: 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a  magic header */.
ca80: 20 20 7a 4d 61 73 74 65 72 5b 30 5d 20 3d 20 27    zMaster[0] = '
ca90: 5c 30 27 3b 0a 0a 20 20 69 66 28 20 53 51 4c 49  \0';..  if( SQLI
caa0: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c  TE_OK!=(rc = sql
cab0: 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
cac0: 4a 72 6e 6c 2c 20 26 73 7a 4a 29 29 0a 20 20 20  Jrnl, &szJ)).   
cad0: 7c 7c 20 73 7a 4a 3c 31 36 0a 20 20 20 7c 7c 20  || szJ<16.   || 
cae0: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
caf0: 20 72 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e   read32bits(pJrn
cb00: 6c 2c 20 73 7a 4a 2d 31 36 2c 20 26 6c 65 6e 29  l, szJ-16, &len)
cb10: 29 0a 20 20 20 7c 7c 20 6c 65 6e 3e 3d 6e 4d 61  ).   || len>=nMa
cb20: 73 74 65 72 20 0a 20 20 20 7c 7c 20 53 51 4c 49  ster .   || SQLI
cb30: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61  TE_OK!=(rc = rea
cb40: 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73  d32bits(pJrnl, s
cb50: 7a 4a 2d 31 32 2c 20 26 63 6b 73 75 6d 29 29 0a  zJ-12, &cksum)).
cb60: 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21     || SQLITE_OK!
cb70: 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73  =(rc = sqlite3Os
cb80: 52 65 61 64 28 70 4a 72 6e 6c 2c 20 61 4d 61 67  Read(pJrnl, aMag
cb90: 69 63 2c 20 38 2c 20 73 7a 4a 2d 38 29 29 0a 20  ic, 8, szJ-8)). 
cba0: 20 20 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d 61 67    || memcmp(aMag
cbb0: 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  ic, aJournalMagi
cbc0: 63 2c 20 38 29 0a 20 20 20 7c 7c 20 53 51 4c 49  c, 8).   || SQLI
cbd0: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c  TE_OK!=(rc = sql
cbe0: 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c  ite3OsRead(pJrnl
cbf0: 2c 20 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 2c 20  , zMaster, len, 
cc00: 73 7a 4a 2d 31 36 2d 6c 65 6e 29 29 0a 20 20 29  szJ-16-len)).  )
cc10: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
cc20: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 65 20 69  .  }..  /* See i
cc30: 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6d  f the checksum m
cc40: 61 74 63 68 65 73 20 74 68 65 20 6d 61 73 74 65  atches the maste
cc50: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a  r journal name *
cc60: 2f 0a 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6c  /.  for(u=0; u<l
cc70: 65 6e 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 63 6b  en; u++){.    ck
cc80: 73 75 6d 20 2d 3d 20 7a 4d 61 73 74 65 72 5b 75  sum -= zMaster[u
cc90: 5d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 6b 73  ];.  }.  if( cks
cca0: 75 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  um ){.    /* If 
ccb0: 74 68 65 20 63 68 65 63 6b 73 75 6d 20 64 6f 65  the checksum doe
ccc0: 73 6e 27 74 20 61 64 64 20 75 70 2c 20 74 68 65  sn't add up, the
ccd0: 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66  n one or more of
cce0: 20 74 68 65 20 64 69 73 6b 20 73 65 63 74 6f 72   the disk sector
ccf0: 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e  s.    ** contain
cd00: 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ing the master j
cd10: 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20  ournal filename 
cd20: 69 73 20 63 6f 72 72 75 70 74 65 64 2e 20 54 68  is corrupted. Th
cd30: 69 73 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20  is means.    ** 
cd40: 64 65 66 69 6e 69 74 65 6c 79 20 72 6f 6c 6c 20  definitely roll 
cd50: 62 61 63 6b 2c 20 73 6f 20 6a 75 73 74 20 72 65  back, so just re
cd60: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61  turn SQLITE_OK a
cd70: 6e 64 20 72 65 70 6f 72 74 20 61 20 28 6e 75 6c  nd report a (nul
cd80: 29 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 2d  ).    ** master-
cd90: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65  journal filename
cda0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6c 65 6e  ..    */.    len
cdb0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73   = 0;.  }.  zMas
cdc0: 74 65 72 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b  ter[len] = '\0';
cdd0: 0a 20 20 20 0a 20 20 72 65 74 75 72 6e 20 53 51  .   .  return SQ
cde0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
cdf0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f 66 66  * Return the off
ce00: 73 65 74 20 6f 66 20 74 68 65 20 73 65 63 74 6f  set of the secto
ce10: 72 20 62 6f 75 6e 64 61 72 79 20 61 74 20 6f 72  r boundary at or
ce20: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a 2a 2a   immediately .**
ce30: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 76   following the v
ce40: 61 6c 75 65 20 69 6e 20 70 50 61 67 65 72 2d 3e  alue in pPager->
ce50: 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 61 73 73 75  journalOff, assu
ce60: 6d 69 6e 67 20 61 20 73 65 63 74 6f 72 20 0a 2a  ming a sector .*
ce70: 2a 20 73 69 7a 65 20 6f 66 20 70 50 61 67 65 72  * size of pPager
ce80: 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 62 79 74  ->sectorSize byt
ce90: 65 73 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f  es..**.** i.e fo
cea0: 72 20 61 20 73 65 63 74 6f 72 20 73 69 7a 65 20  r a sector size 
ceb0: 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 20 20  of 512:.**.**   
cec0: 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66  Pager.journalOff
ced0: 20 20 20 20 20 20 20 20 20 20 52 65 74 75 72 6e            Return
cee0: 20 76 61 6c 75 65 0a 2a 2a 20 20 20 2d 2d 2d 2d   value.**   ----
cef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cf00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cf10: 2d 2d 2d 0a 2a 2a 20 20 20 30 20 20 20 20 20 20  ---.**   0      
cf20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf30: 20 20 20 30 0a 2a 2a 20 20 20 35 31 32 20 20 20     0.**   512   
cf40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf50: 20 20 20 20 35 31 32 0a 2a 2a 20 20 20 31 30 30      512.**   100
cf60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf70: 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 20 20         512.**   
cf80: 32 30 30 30 20 20 20 20 20 20 20 20 20 20 20 20  2000            
cf90: 20 20 20 20 20 20 20 20 20 20 32 30 34 38 0a 2a            2048.*
cfa0: 2a 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36 34  * .*/.static i64
cfb0: 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65   journalHdrOffse
cfc0: 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
cfd0: 7b 0a 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d  {.  i64 offset =
cfe0: 20 30 3b 0a 20 20 69 36 34 20 63 20 3d 20 70 50   0;.  i64 c = pP
cff0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
d000: 3b 0a 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20  ;.  if( c ){.   
d010: 20 6f 66 66 73 65 74 20 3d 20 28 28 63 2d 31 29   offset = ((c-1)
d020: 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  /JOURNAL_HDR_SZ(
d030: 70 50 61 67 65 72 29 20 2b 20 31 29 20 2a 20 4a  pPager) + 1) * J
d040: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
d050: 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 61 73 73  ager);.  }.  ass
d060: 65 72 74 28 20 6f 66 66 73 65 74 25 4a 4f 55 52  ert( offset%JOUR
d070: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
d080: 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  r)==0 );.  asser
d090: 74 28 20 6f 66 66 73 65 74 3e 3d 63 20 29 3b 0a  t( offset>=c );.
d0a0: 20 20 61 73 73 65 72 74 28 20 28 6f 66 66 73 65    assert( (offse
d0b0: 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52  t-c)<JOURNAL_HDR
d0c0: 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20  _SZ(pPager) );. 
d0d0: 20 72 65 74 75 72 6e 20 6f 66 66 73 65 74 3b 0a   return offset;.
d0e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75  }../*.** The jou
d0f0: 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62  rnal file must b
d100: 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73  e open when this
d110: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
d120: 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  led..**.** This 
d130: 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
d140: 2d 6f 70 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  -op if the journ
d150: 61 6c 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20  al file has not 
d160: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 0a  been written to.
d170: 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 63 75  ** within the cu
d180: 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
d190: 6e 20 28 69 2e 65 2e 20 69 66 20 50 61 67 65 72  n (i.e. if Pager
d1a0: 2e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 29 2e  .journalOff==0).
d1b0: 0a 2a 2a 0a 2a 2a 20 49 66 20 64 6f 54 72 75 6e  .**.** If doTrun
d1c0: 63 61 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  cate is non-zero
d1d0: 20 6f 72 20 74 68 65 20 50 61 67 65 72 2e 6a 6f   or the Pager.jo
d1e0: 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 76  urnalSizeLimit v
d1f0: 61 72 69 61 62 6c 65 20 69 73 0a 2a 2a 20 73 65  ariable is.** se
d200: 74 20 74 6f 20 30 2c 20 74 68 65 6e 20 74 72 75  t to 0, then tru
d210: 6e 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  ncate the journa
d220: 6c 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 62  l file to zero b
d230: 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 4f 74  ytes in size. Ot
d240: 68 65 72 77 69 73 65 2c 0a 2a 2a 20 7a 65 72 6f  herwise,.** zero
d250: 20 74 68 65 20 32 38 2d 62 79 74 65 20 68 65 61   the 28-byte hea
d260: 64 65 72 20 61 74 20 74 68 65 20 73 74 61 72 74  der at the start
d270: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
d280: 66 69 6c 65 2e 20 49 6e 20 65 69 74 68 65 72 20  file. In either 
d290: 63 61 73 65 2c 20 0a 2a 2a 20 69 66 20 74 68 65  case, .** if the
d2a0: 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e   pager is not in
d2b0: 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 73   no-sync mode, s
d2c0: 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
d2d0: 66 69 6c 65 20 69 6d 6d 65 64 69 61 74 65 6c 79  file immediately
d2e0: 20 0a 2a 2a 20 61 66 74 65 72 20 77 72 69 74 69   .** after writi
d2f0: 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67  ng or truncating
d300: 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 61   it..**.** If Pa
d310: 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c  ger.journalSizeL
d320: 69 6d 69 74 20 69 73 20 73 65 74 20 74 6f 20 61  imit is set to a
d330: 20 70 6f 73 69 74 69 76 65 2c 20 6e 6f 6e 2d 7a   positive, non-z
d340: 65 72 6f 20 76 61 6c 75 65 2c 20 61 6e 64 0a 2a  ero value, and.*
d350: 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  * following the 
d360: 74 72 75 6e 63 61 74 69 6f 6e 20 6f 72 20 7a 65  truncation or ze
d370: 72 6f 69 6e 67 20 64 65 73 63 72 69 62 65 64 20  roing described 
d380: 61 62 6f 76 65 20 74 68 65 20 73 69 7a 65 20 6f  above the size o
d390: 66 20 74 68 65 20 0a 2a 2a 20 6a 6f 75 72 6e 61  f the .** journa
d3a0: 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20  l file in bytes 
d3b0: 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  is larger than t
d3c0: 68 69 73 20 76 61 6c 75 65 2c 20 74 68 65 6e 20  his value, then 
d3d0: 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20  truncate the.** 
d3e0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20  journal file to 
d3f0: 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a  Pager.journalSiz
d400: 65 4c 69 6d 69 74 20 62 79 74 65 73 2e 20 54 68  eLimit bytes. Th
d410: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  e journal file d
d420: 6f 65 73 0a 2a 2a 20 6e 6f 74 20 6e 65 65 64 20  oes.** not need 
d430: 74 6f 20 62 65 20 73 79 6e 63 65 64 20 66 6f 6c  to be synced fol
d440: 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f 70 65 72  lowing this oper
d450: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ation..**.** If 
d460: 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
d470: 72 73 2c 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63  rs, abandon proc
d480: 65 73 73 69 6e 67 20 61 6e 64 20 72 65 74 75 72  essing and retur
d490: 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63  n the IO error c
d4a0: 6f 64 65 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ode..** Otherwis
d4b0: 65 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  e, return SQLITE
d4c0: 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  _OK..*/.static i
d4d0: 6e 74 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64  nt zeroJournalHd
d4e0: 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
d4f0: 20 69 6e 74 20 64 6f 54 72 75 6e 63 61 74 65 29   int doTruncate)
d500: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
d510: 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
d520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d530: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
d540: 63 6f 64 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  code */.  assert
d550: 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
d560: 3e 6a 66 64 29 20 29 3b 0a 20 20 69 66 28 20 70  >jfd) );.  if( p
d570: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
d580: 66 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69  f ){.    const i
d590: 36 34 20 69 4c 69 6d 69 74 20 3d 20 70 50 61 67  64 iLimit = pPag
d5a0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c  er->journalSizeL
d5b0: 69 6d 69 74 3b 20 20 20 20 2f 2a 20 4c 6f 63 61  imit;    /* Loca
d5c0: 6c 20 63 61 63 68 65 20 6f 66 20 6a 73 6c 20 2a  l cache of jsl *
d5d0: 2f 0a 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28  /..    IOTRACE((
d5e0: 22 4a 5a 45 52 4f 48 44 52 20 25 70 5c 6e 22 2c  "JZEROHDR %p\n",
d5f0: 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 69 66   pPager)).    if
d600: 28 20 64 6f 54 72 75 6e 63 61 74 65 20 7c 7c 20  ( doTruncate || 
d610: 69 4c 69 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20  iLimit==0 ){.   
d620: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
d630: 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  sTruncate(pPager
d640: 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 7d  ->jfd, 0);.    }
d650: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 74 61 74  else{.      stat
d660: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 65  ic const char ze
d670: 72 6f 48 64 72 5b 32 38 5d 20 3d 20 7b 30 7d 3b  roHdr[28] = {0};
d680: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
d690: 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
d6a0: 72 2d 3e 6a 66 64 2c 20 7a 65 72 6f 48 64 72 2c  r->jfd, zeroHdr,
d6b0: 20 73 69 7a 65 6f 66 28 7a 65 72 6f 48 64 72 29   sizeof(zeroHdr)
d6c0: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
d6d0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
d6e0: 4b 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f  K && !pPager->no
d6f0: 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 72 63  Sync ){.      rc
d700: 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
d710: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53 51  (pPager->jfd, SQ
d720: 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e  LITE_SYNC_DATAON
d730: 4c 59 7c 70 50 61 67 65 72 2d 3e 73 79 6e 63 46  LY|pPager->syncF
d740: 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  lags);.    }..  
d750: 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
d760: 6e 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  nt the transacti
d770: 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 20  on is committed 
d780: 62 75 74 20 74 68 65 20 77 72 69 74 65 20 6c 6f  but the write lo
d790: 63 6b 20 0a 20 20 20 20 2a 2a 20 69 73 20 73 74  ck .    ** is st
d7a0: 69 6c 6c 20 68 65 6c 64 20 6f 6e 20 74 68 65 20  ill held on the 
d7b0: 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69  file. If there i
d7c0: 73 20 61 20 73 69 7a 65 20 6c 69 6d 69 74 20 63  s a size limit c
d7d0: 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20 0a 20  onfigured for . 
d7e0: 20 20 20 2a 2a 20 74 68 65 20 70 65 72 73 69 73     ** the persis
d7f0: 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  tent journal and
d800: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
d810: 65 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 73  e currently cons
d820: 75 6d 65 73 20 6d 6f 72 65 0a 20 20 20 20 2a 2a  umes more.    **
d830: 20 73 70 61 63 65 20 74 68 61 6e 20 74 68 61 74   space than that
d840: 20 6c 69 6d 69 74 20 61 6c 6c 6f 77 73 20 66 6f   limit allows fo
d850: 72 2c 20 74 72 75 6e 63 61 74 65 20 69 74 20 6e  r, truncate it n
d860: 6f 77 2e 20 54 68 65 72 65 20 69 73 20 6e 6f 20  ow. There is no 
d870: 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 73  need.    ** to s
d880: 79 6e 63 20 74 68 65 20 66 69 6c 65 20 66 6f 6c  ync the file fol
d890: 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f 70 65 72  lowing this oper
d8a0: 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ation..    */.  
d8b0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
d8c0: 5f 4f 4b 20 26 26 20 69 4c 69 6d 69 74 3e 30 20  _OK && iLimit>0 
d8d0: 29 7b 0a 20 20 20 20 20 20 69 36 34 20 73 7a 3b  ){.      i64 sz;
d8e0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
d8f0: 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
d900: 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 29 3b  ager->jfd, &sz);
d910: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
d920: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 7a 3e 69  QLITE_OK && sz>i
d930: 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20  Limit ){.       
d940: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54   rc = sqlite3OsT
d950: 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e  runcate(pPager->
d960: 6a 66 64 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20  jfd, iLimit);.  
d970: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
d980: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
d990: 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  /*.** The journa
d9a0: 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f  l file must be o
d9b0: 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 72 6f  pen when this ro
d9c0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
d9d0: 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65   A journal.** he
d9e0: 61 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f 48 44  ader (JOURNAL_HD
d9f0: 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20 77  R_SZ bytes) is w
da00: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
da10: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 74 20  journal file at 
da20: 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 6c  the.** current l
da30: 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  ocation..**.** T
da40: 68 65 20 66 6f 72 6d 61 74 20 66 6f 72 20 74 68  he format for th
da50: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
da60: 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a   is as follows:.
da70: 2a 2a 20 2d 20 38 20 62 79 74 65 73 3a 20 4d 61  ** - 8 bytes: Ma
da80: 67 69 63 20 69 64 65 6e 74 69 66 79 69 6e 67 20  gic identifying 
da90: 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a  journal format..
daa0: 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 4e 75  ** - 4 bytes: Nu
dab0: 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20  mber of records 
dac0: 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d  in journal, or -
dad0: 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20 69  1 no-sync mode i
dae0: 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79 74  s on..** - 4 byt
daf0: 65 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d 62 65  es: Random numbe
db00: 72 20 75 73 65 64 20 66 6f 72 20 70 61 67 65 20  r used for page 
db10: 68 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62 79 74  hash..** - 4 byt
db20: 65 73 3a 20 49 6e 69 74 69 61 6c 20 64 61 74 61  es: Initial data
db30: 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74 2e  base page count.
db40: 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 53  .** - 4 bytes: S
db50: 65 63 74 6f 72 20 73 69 7a 65 20 75 73 65 64 20  ector size used 
db60: 62 79 20 74 68 65 20 70 72 6f 63 65 73 73 20 74  by the process t
db70: 68 61 74 20 77 72 6f 74 65 20 74 68 69 73 20 6a  hat wrote this j
db80: 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 2d 20 34 20 62  ournal..** - 4 b
db90: 79 74 65 73 3a 20 44 61 74 61 62 61 73 65 20 70  ytes: Database p
dba0: 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 0a 2a 2a  age size..** .**
dbb0: 20 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28 4a 4f   Followed by (JO
dbc0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32  URNAL_HDR_SZ - 2
dbd0: 38 29 20 62 79 74 65 73 20 6f 66 20 75 6e 75 73  8) bytes of unus
dbe0: 65 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61  ed space..*/.sta
dbf0: 74 69 63 20 69 6e 74 20 77 72 69 74 65 4a 6f 75  tic int writeJou
dc00: 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70  rnalHdr(Pager *p
dc10: 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
dc20: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
dc30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
dc40: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
dc50: 20 20 63 68 61 72 20 2a 7a 48 65 61 64 65 72 20    char *zHeader 
dc60: 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  = pPager->pTmpSp
dc70: 61 63 65 3b 20 20 2f 2a 20 54 65 6d 70 6f 72 61  ace;  /* Tempora
dc80: 72 79 20 73 70 61 63 65 20 75 73 65 64 20 74 6f  ry space used to
dc90: 20 62 75 69 6c 64 20 68 65 61 64 65 72 20 2a 2f   build header */
dca0: 0a 20 20 75 33 32 20 6e 48 65 61 64 65 72 20 3d  .  u32 nHeader =
dcb0: 20 28 75 33 32 29 70 50 61 67 65 72 2d 3e 70 61   (u32)pPager->pa
dcc0: 67 65 53 69 7a 65 3b 2f 2a 20 53 69 7a 65 20 6f  geSize;/* Size o
dcd0: 66 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64  f buffer pointed
dce0: 20 74 6f 20 62 79 20 7a 48 65 61 64 65 72 20 2a   to by zHeader *
dcf0: 2f 0a 20 20 75 33 32 20 6e 57 72 69 74 65 3b 20  /.  u32 nWrite; 
dd00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd10: 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
dd20: 20 6f 66 20 68 65 61 64 65 72 20 73 65 63 74 6f   of header secto
dd30: 72 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 69  r written */.  i
dd40: 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  nt ii;          
dd50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd60: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
dd70: 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  er */..  assert(
dd80: 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
dd90: 6a 66 64 29 20 29 3b 20 20 20 20 20 20 2f 2a 20  jfd) );      /* 
dda0: 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  Journal file mus
ddb0: 74 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20  t be open. */.. 
ddc0: 20 69 66 28 20 6e 48 65 61 64 65 72 3e 4a 4f 55   if( nHeader>JOU
ddd0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
dde0: 65 72 29 20 29 7b 0a 20 20 20 20 6e 48 65 61 64  er) ){.    nHead
ddf0: 65 72 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  er = JOURNAL_HDR
de00: 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  _SZ(pPager);.  }
de10: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
de20: 61 72 65 20 61 63 74 69 76 65 20 73 61 76 65 70  are active savep
de30: 6f 69 6e 74 73 20 61 6e 64 20 61 6e 79 20 6f 66  oints and any of
de40: 20 74 68 65 6d 20 77 65 72 65 20 63 72 65 61 74   them were creat
de50: 65 64 20 0a 20 20 2a 2a 20 73 69 6e 63 65 20 74  ed .  ** since t
de60: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 6a  he most recent j
de70: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 77 61  ournal header wa
de80: 73 20 77 72 69 74 74 65 6e 2c 20 75 70 64 61 74  s written, updat
de90: 65 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67 65  e the .  ** Page
dea0: 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f  rSavepoint.iHdrO
deb0: 66 66 73 65 74 20 66 69 65 6c 64 73 20 6e 6f 77  ffset fields now
dec0: 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d  ..  */.  for(ii=
ded0: 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53  0; ii<pPager->nS
dee0: 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b  avepoint; ii++){
def0: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
df00: 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e  >aSavepoint[ii].
df10: 69 48 64 72 4f 66 66 73 65 74 3d 3d 30 20 29 7b  iHdrOffset==0 ){
df20: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61  .      pPager->a
df30: 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69 48  Savepoint[ii].iH
df40: 64 72 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65  drOffset = pPage
df50: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20  r->journalOff;. 
df60: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67     }.  }..  pPag
df70: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
df80: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
df90: 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72  Off = journalHdr
dfa0: 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a  Offset(pPager);.
dfb0: 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 57 72 69 74  .  /* .  ** Writ
dfc0: 65 20 74 68 65 20 6e 52 65 63 20 46 69 65 6c 64  e the nRec Field
dfd0: 20 2d 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66   - the number of
dfe0: 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 74 68   page records th
dff0: 61 74 20 66 6f 6c 6c 6f 77 20 74 68 69 73 0a 20  at follow this. 
e000: 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64   ** journal head
e010: 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20 7a 65  er. Normally, ze
e020: 72 6f 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  ro is written to
e030: 20 74 68 69 73 20 76 61 6c 75 65 20 61 74 20 74   this value at t
e040: 68 69 73 20 74 69 6d 65 2e 0a 20 20 2a 2a 20 41  his time..  ** A
e050: 66 74 65 72 20 74 68 65 20 72 65 63 6f 72 64 73  fter the records
e060: 20 61 72 65 20 61 64 64 65 64 20 74 6f 20 74 68   are added to th
e070: 65 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 74  e journal (and t
e080: 68 65 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 65  he journal synce
e090: 64 2c 20 0a 20 20 2a 2a 20 69 66 20 69 6e 20 66  d, .  ** if in f
e0a0: 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 29 2c 20  ull-sync mode), 
e0b0: 74 68 65 20 7a 65 72 6f 20 69 73 20 6f 76 65 72  the zero is over
e0c0: 77 72 69 74 74 65 6e 20 77 69 74 68 20 74 68 65  written with the
e0d0: 20 74 72 75 65 20 6e 75 6d 62 65 72 0a 20 20 2a   true number.  *
e0e0: 2a 20 6f 66 20 72 65 63 6f 72 64 73 20 28 73 65  * of records (se
e0f0: 65 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 29 29  e syncJournal())
e100: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 66 61  ..  **.  ** A fa
e110: 73 74 65 72 20 61 6c 74 65 72 6e 61 74 69 76 65  ster alternative
e120: 20 69 73 20 74 6f 20 77 72 69 74 65 20 30 78 46   is to write 0xF
e130: 46 46 46 46 46 46 46 20 74 6f 20 74 68 65 20 6e  FFFFFFF to the n
e140: 52 65 63 20 66 69 65 6c 64 2e 20 57 68 65 6e 0a  Rec field. When.
e150: 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 74 68 65    ** reading the
e160: 20 6a 6f 75 72 6e 61 6c 20 74 68 69 73 20 76 61   journal this va
e170: 6c 75 65 20 74 65 6c 6c 73 20 53 51 4c 69 74 65  lue tells SQLite
e180: 20 74 6f 20 61 73 73 75 6d 65 20 74 68 61 74 20   to assume that 
e190: 74 68 65 0a 20 20 2a 2a 20 72 65 73 74 20 6f 66  the.  ** rest of
e1a0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
e1b0: 65 20 63 6f 6e 74 61 69 6e 73 20 76 61 6c 69 64  e contains valid
e1c0: 20 70 61 67 65 20 72 65 63 6f 72 64 73 2e 20 54   page records. T
e1d0: 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 0a 20  his assumption. 
e1e0: 20 2a 2a 20 69 73 20 64 61 6e 67 65 72 6f 75 73   ** is dangerous
e1f0: 2c 20 61 73 20 69 66 20 61 20 66 61 69 6c 75 72  , as if a failur
e200: 65 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 73  e occurred whils
e210: 74 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65  t writing to the
e220: 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69   journal.  ** fi
e230: 6c 65 20 69 74 20 6d 61 79 20 63 6f 6e 74 61 69  le it may contai
e240: 6e 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20 64  n some garbage d
e250: 61 74 61 2e 20 54 68 65 72 65 20 61 72 65 20 74  ata. There are t
e260: 77 6f 20 73 63 65 6e 61 72 69 6f 73 0a 20 20 2a  wo scenarios.  *
e270: 2a 20 77 68 65 72 65 20 74 68 69 73 20 72 69 73  * where this ris
e280: 6b 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65 64  k can be ignored
e290: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20  :.  **.  **   * 
e2a0: 57 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 69  When the pager i
e2b0: 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64  s in no-sync mod
e2c0: 65 2e 20 43 6f 72 72 75 70 74 69 6f 6e 20 63 61  e. Corruption ca
e2d0: 6e 20 66 6f 6c 6c 6f 77 20 61 0a 20 20 2a 2a 20  n follow a.  ** 
e2e0: 20 20 20 20 70 6f 77 65 72 20 66 61 69 6c 75 72      power failur
e2f0: 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 61  e in this case a
e300: 6e 79 77 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  nyway..  **.  **
e310: 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20 53 51     * When the SQ
e320: 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f  LITE_IOCAP_SAFE_
e330: 41 50 50 45 4e 44 20 66 6c 61 67 20 69 73 20 73  APPEND flag is s
e340: 65 74 2e 20 54 68 69 73 20 67 75 61 72 61 6e 74  et. This guarant
e350: 65 65 73 0a 20 20 2a 2a 20 20 20 20 20 74 68 61  ees.  **     tha
e360: 74 20 67 61 72 62 61 67 65 20 64 61 74 61 20 69  t garbage data i
e370: 73 20 6e 65 76 65 72 20 61 70 70 65 6e 64 65 64  s never appended
e380: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
e390: 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  file..  */.  ass
e3a0: 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
e3b0: 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65  er->fd) || pPage
e3c0: 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20 20 69  r->noSync );.  i
e3d0: 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  f( pPager->noSyn
e3e0: 63 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 6a 6f  c || (pPager->jo
e3f0: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
e400: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
e410: 4f 52 59 29 0a 20 20 20 7c 7c 20 28 73 71 6c 69  ORY).   || (sqli
e420: 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
e430: 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65  cteristics(pPage
e440: 72 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f 49 4f  r->fd)&SQLITE_IO
e450: 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29  CAP_SAFE_APPEND)
e460: 20 0a 20 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70   .  ){.    memcp
e470: 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75 72  y(zHeader, aJour
e480: 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66  nalMagic, sizeof
e490: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29  (aJournalMagic))
e4a0: 3b 0a 20 20 20 20 70 75 74 33 32 62 69 74 73 28  ;.    put32bits(
e4b0: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
e4c0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c  aJournalMagic)],
e4d0: 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a 20 20   0xffffffff);.  
e4e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 73 65  }else{.    memse
e4f0: 74 28 7a 48 65 61 64 65 72 2c 20 30 2c 20 73 69  t(zHeader, 0, si
e500: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
e510: 69 63 29 2b 34 29 3b 0a 20 20 7d 0a 0a 20 20 2f  ic)+4);.  }..  /
e520: 2a 20 54 68 65 20 72 61 6e 64 6f 6d 20 63 68 65  * The random che
e530: 63 6b 2d 68 61 73 68 20 69 6e 69 74 69 61 6c 69  ck-hash initiali
e540: 73 65 72 20 2a 2f 20 0a 20 20 73 71 6c 69 74 65  ser */ .  sqlite
e550: 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a  3_randomness(siz
e560: 65 6f 66 28 70 50 61 67 65 72 2d 3e 63 6b 73 75  eof(pPager->cksu
e570: 6d 49 6e 69 74 29 2c 20 26 70 50 61 67 65 72 2d  mInit), &pPager-
e580: 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 70  >cksumInit);.  p
e590: 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
e5a0: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
e5b0: 6c 4d 61 67 69 63 29 2b 34 5d 2c 20 70 50 61 67  lMagic)+4], pPag
e5c0: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a  er->cksumInit);.
e5d0: 20 20 2f 2a 20 54 68 65 20 69 6e 69 74 69 61 6c    /* The initial
e5e0: 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 2a   database size *
e5f0: 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a  /.  put32bits(&z
e600: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
e610: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 38 5d 2c  ournalMagic)+8],
e620: 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
e630: 69 7a 65 29 3b 0a 20 20 2f 2a 20 54 68 65 20 61  ize);.  /* The a
e640: 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69  ssumed sector si
e650: 7a 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63  ze for this proc
e660: 65 73 73 20 2a 2f 0a 20 20 70 75 74 33 32 62 69  ess */.  put32bi
e670: 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
e680: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
e690: 29 2b 31 32 5d 2c 20 70 50 61 67 65 72 2d 3e 73  )+12], pPager->s
e6a0: 65 63 74 6f 72 53 69 7a 65 29 3b 0a 0a 20 20 2f  ectorSize);..  /
e6b0: 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20  * The page size 
e6c0: 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26  */.  put32bits(&
e6d0: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
e6e0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 36  JournalMagic)+16
e6f0: 5d 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  ], pPager->pageS
e700: 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74  ize);..  /* Init
e710: 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 74 61 69  ializing the tai
e720: 6c 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20  l of the buffer 
e730: 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
e740: 2e 20 20 45 76 65 72 79 74 68 69 6e 67 0a 20 20  .  Everything.  
e750: 2a 2a 20 77 6f 72 6b 73 20 66 69 6e 64 20 69 66  ** works find if
e760: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d   the following m
e770: 65 6d 73 65 74 28 29 20 69 73 20 6f 6d 69 74 74  emset() is omitt
e780: 65 64 2e 20 20 42 75 74 20 69 6e 69 74 69 61 6c  ed.  But initial
e790: 69 7a 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d  izing.  ** the m
e7a0: 65 6d 6f 72 79 20 70 72 65 76 65 6e 74 73 20 76  emory prevents v
e7b0: 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20 63 6f 6d  algrind from com
e7c0: 70 6c 61 69 6e 69 6e 67 2c 20 73 6f 20 77 65 20  plaining, so we 
e7d0: 61 72 65 20 77 69 6c 6c 69 6e 67 20 74 6f 0a 20  are willing to. 
e7e0: 20 2a 2a 20 74 61 6b 65 20 74 68 65 20 70 65 72   ** take the per
e7f0: 66 6f 72 6d 61 6e 63 65 20 68 69 74 2e 0a 20 20  formance hit..  
e800: 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 7a 48 65  */.  memset(&zHe
e810: 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
e820: 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30 5d 2c 20  rnalMagic)+20], 
e830: 30 2c 0a 20 20 20 20 20 20 20 20 20 6e 48 65 61  0,.         nHea
e840: 64 65 72 2d 28 73 69 7a 65 6f 66 28 61 4a 6f 75  der-(sizeof(aJou
e850: 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30 29 29 3b  rnalMagic)+20));
e860: 0a 0a 20 20 2f 2a 20 49 6e 20 74 68 65 6f 72 79  ..  /* In theory
e870: 2c 20 69 74 20 69 73 20 6f 6e 6c 79 20 6e 65 63  , it is only nec
e880: 65 73 73 61 72 79 20 74 6f 20 77 72 69 74 65 20  essary to write 
e890: 74 68 65 20 32 38 20 62 79 74 65 73 20 74 68 61  the 28 bytes tha
e8a0: 74 20 74 68 65 20 0a 20 20 2a 2a 20 6a 6f 75 72  t the .  ** jour
e8b0: 6e 61 6c 20 68 65 61 64 65 72 20 63 6f 6e 73 75  nal header consu
e8c0: 6d 65 73 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  mes to the journ
e8d0: 61 6c 20 66 69 6c 65 20 68 65 72 65 2e 20 54 68  al file here. Th
e8e0: 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65  en increment the
e8f0: 20 0a 20 20 2a 2a 20 50 61 67 65 72 2e 6a 6f 75   .  ** Pager.jou
e900: 72 6e 61 6c 4f 66 66 20 76 61 72 69 61 62 6c 65  rnalOff variable
e910: 20 62 79 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f   by JOURNAL_HDR_
e920: 53 5a 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e  SZ so that the n
e930: 65 78 74 20 0a 20 20 2a 2a 20 72 65 63 6f 72 64  ext .  ** record
e940: 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74   is written to t
e950: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 63  he following sec
e960: 74 6f 72 20 28 6c 65 61 76 69 6e 67 20 61 20 67  tor (leaving a g
e970: 61 70 20 69 6e 20 74 68 65 20 66 69 6c 65 0a 20  ap in the file. 
e980: 20 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20 62 65   ** that will be
e990: 20 69 6d 70 6c 69 63 69 74 6c 79 20 66 69 6c 6c   implicitly fill
e9a0: 65 64 20 69 6e 20 62 79 20 74 68 65 20 4f 53 29  ed in by the OS)
e9b0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 48 6f 77 65  ..  **.  ** Howe
e9c0: 76 65 72 20 69 74 20 68 61 73 20 62 65 65 6e 20  ver it has been 
e9d0: 64 69 73 63 6f 76 65 72 65 64 20 74 68 61 74 20  discovered that 
e9e0: 6f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 20  on some systems 
e9f0: 74 68 69 73 20 70 61 74 74 65 72 6e 20 63 61 6e  this pattern can
ea00: 20 0a 20 20 2a 2a 20 62 65 20 73 69 67 6e 69 66   .  ** be signif
ea10: 69 63 61 6e 74 6c 79 20 73 6c 6f 77 65 72 20 74  icantly slower t
ea20: 68 61 6e 20 63 6f 6e 74 69 67 75 6f 75 73 6c 79  han contiguously
ea30: 20 77 72 69 74 69 6e 67 20 64 61 74 61 20 74 6f   writing data to
ea40: 20 74 68 65 20 66 69 6c 65 2c 0a 20 20 2a 2a 20   the file,.  ** 
ea50: 65 76 65 6e 20 69 66 20 74 68 61 74 20 6d 65 61  even if that mea
ea60: 6e 73 20 65 78 70 6c 69 63 69 74 6c 79 20 77 72  ns explicitly wr
ea70: 69 74 69 6e 67 20 64 61 74 61 20 74 6f 20 74 68  iting data to th
ea80: 65 20 62 6c 6f 63 6b 20 6f 66 20 0a 20 20 2a 2a  e block of .  **
ea90: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
eaa0: 20 2d 20 32 38 29 20 62 79 74 65 73 20 74 68 61   - 28) bytes tha
eab0: 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 73  t will not be us
eac0: 65 64 2e 20 53 6f 20 74 68 61 74 20 69 73 20 77  ed. So that is w
ead0: 68 61 74 0a 20 20 2a 2a 20 69 73 20 64 6f 6e 65  hat.  ** is done
eae0: 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  . .  **.  ** The
eaf0: 20 6c 6f 6f 70 20 69 73 20 72 65 71 75 69 72 65   loop is require
eb00: 64 20 68 65 72 65 20 69 6e 20 63 61 73 65 20 74  d here in case t
eb10: 68 65 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 69  he sector-size i
eb20: 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  s larger than th
eb30: 65 20 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  e .  ** database
eb40: 20 70 61 67 65 20 73 69 7a 65 2e 20 53 69 6e 63   page size. Sinc
eb50: 65 20 74 68 65 20 7a 48 65 61 64 65 72 20 62 75  e the zHeader bu
eb60: 66 66 65 72 20 69 73 20 6f 6e 6c 79 20 50 61 67  ffer is only Pag
eb70: 65 72 2e 70 61 67 65 53 69 7a 65 0a 20 20 2a 2a  er.pageSize.  **
eb80: 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20   bytes in size, 
eb90: 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 63 61  more than one ca
eba0: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 57  ll to sqlite3OsW
ebb0: 72 69 74 65 28 29 20 6d 61 79 20 62 65 20 72 65  rite() may be re
ebc0: 71 75 69 72 65 64 0a 20 20 2a 2a 20 74 6f 20 70  quired.  ** to p
ebd0: 6f 70 75 6c 61 74 65 20 74 68 65 20 65 6e 74 69  opulate the enti
ebe0: 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  re journal heade
ebf0: 72 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2f 20 0a  r sector..  */ .
ec00: 20 20 66 6f 72 28 6e 57 72 69 74 65 3d 30 3b 20    for(nWrite=0; 
ec10: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 26 26 6e  rc==SQLITE_OK&&n
ec20: 57 72 69 74 65 3c 4a 4f 55 52 4e 41 4c 5f 48 44  Write<JOURNAL_HD
ec30: 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 20 6e 57  R_SZ(pPager); nW
ec40: 72 69 74 65 2b 3d 6e 48 65 61 64 65 72 29 7b 0a  rite+=nHeader){.
ec50: 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 48      IOTRACE(("JH
ec60: 44 52 20 25 70 20 25 6c 6c 64 20 25 64 5c 6e 22  DR %p %lld %d\n"
ec70: 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  , pPager, pPager
ec80: 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2c 20 6e 48  ->journalHdr, nH
ec90: 65 61 64 65 72 29 29 0a 20 20 20 20 72 63 20 3d  eader)).    rc =
eca0: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
ecb0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65  pPager->jfd, zHe
ecc0: 61 64 65 72 2c 20 6e 48 65 61 64 65 72 2c 20 70  ader, nHeader, p
ecd0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
ece0: 66 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  f);.    assert( 
ecf0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
ed00: 64 72 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  dr <= pPager->jo
ed10: 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 20 20 20 20  urnalOff );.    
ed20: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
ed30: 66 66 20 2b 3d 20 6e 48 65 61 64 65 72 3b 0a 20  ff += nHeader;. 
ed40: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
ed50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f  .}../*.** The jo
ed60: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20  urnal file must 
ed70: 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69  be open when thi
ed80: 73 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a  s is called. A j
ed90: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69  ournal header fi
eda0: 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48  le.** (JOURNAL_H
edb0: 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20  DR_SZ bytes) is 
edc0: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 63 75  read from the cu
edd0: 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69  rrent location i
ede0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  n the journal.**
edf0: 20 66 69 6c 65 2e 20 54 68 65 20 63 75 72 72 65   file. The curre
ee00: 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74  nt location in t
ee10: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
ee20: 69 73 20 67 69 76 65 6e 20 62 79 0a 2a 2a 20 70  is given by.** p
ee30: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
ee40: 66 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20  f. See comments 
ee50: 61 62 6f 76 65 20 66 75 6e 63 74 69 6f 6e 20 77  above function w
ee60: 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 29  riteJournalHdr()
ee70: 20 66 6f 72 0a 2a 2a 20 61 20 64 65 73 63 72 69   for.** a descri
ee80: 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 6a 6f 75  ption of the jou
ee90: 72 6e 61 6c 20 68 65 61 64 65 72 20 66 6f 72 6d  rnal header form
eea0: 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  at..**.** If the
eeb0: 20 68 65 61 64 65 72 20 69 73 20 72 65 61 64 20   header is read 
eec0: 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 2a 70  successfully, *p
eed0: 4e 52 65 63 20 69 73 20 73 65 74 20 74 6f 20 74  NRec is set to t
eee0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
eef0: 70 61 67 65 20 72 65 63 6f 72 64 73 20 66 6f 6c  page records fol
ef00: 6c 6f 77 69 6e 67 20 74 68 69 73 20 68 65 61 64  lowing this head
ef10: 65 72 20 61 6e 64 20 2a 70 44 62 53 69 7a 65 20  er and *pDbSize 
ef20: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 73 69  is set to the si
ef30: 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74  ze of the.** dat
ef40: 61 62 61 73 65 20 62 65 66 6f 72 65 20 74 68 65  abase before the
ef50: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 67   transaction beg
ef60: 61 6e 2c 20 69 6e 20 70 61 67 65 73 2e 20 41 6c  an, in pages. Al
ef70: 73 6f 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75  so, pPager->cksu
ef80: 6d 49 6e 69 74 0a 2a 2a 20 69 73 20 73 65 74 20  mInit.** is set 
ef90: 74 6f 20 74 68 65 20 76 61 6c 75 65 20 72 65 61  to the value rea
efa0: 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  d from the journ
efb0: 61 6c 20 68 65 61 64 65 72 2e 20 53 51 4c 49 54  al header. SQLIT
efc0: 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
efd0: 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65  .** in this case
efe0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a  ..**.** If the j
eff0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69  ournal header fi
f000: 6c 65 20 61 70 70 65 61 72 73 20 74 6f 20 62 65  le appears to be
f010: 20 63 6f 72 72 75 70 74 65 64 2c 20 53 51 4c 49   corrupted, SQLI
f020: 54 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20 72 65  TE_DONE is.** re
f030: 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 4e 52 65  turned and *pNRe
f040: 63 20 61 6e 64 20 2a 50 44 62 53 69 7a 65 20 61  c and *PDbSize a
f050: 72 65 20 75 6e 64 65 66 69 6e 65 64 2e 20 20 49  re undefined.  I
f060: 66 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  f JOURNAL_HDR_SZ
f070: 20 62 79 74 65 73 0a 2a 2a 20 63 61 6e 6e 6f 74   bytes.** cannot
f080: 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68   be read from th
f090: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61  e journal file a
f0a0: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
f0b0: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
f0c0: 74 69 63 20 69 6e 74 20 72 65 61 64 4a 6f 75 72  tic int readJour
f0d0: 6e 61 6c 48 64 72 28 0a 20 20 50 61 67 65 72 20  nalHdr(.  Pager 
f0e0: 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20  *pPager,        
f0f0: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20         /* Pager 
f100: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20  object */.  int 
f110: 69 73 48 6f 74 2c 0a 20 20 69 36 34 20 6a 6f 75  isHot,.  i64 jou
f120: 72 6e 61 6c 53 69 7a 65 2c 20 20 20 20 20 20 20  rnalSize,       
f130: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
f140: 20 74 68 65 20 6f 70 65 6e 20 6a 6f 75 72 6e 61   the open journa
f150: 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20  l file in bytes 
f160: 2a 2f 0a 20 20 75 33 32 20 2a 70 4e 52 65 63 2c  */.  u32 *pNRec,
f170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f180: 20 20 2f 2a 20 4f 55 54 3a 20 56 61 6c 75 65 20    /* OUT: Value 
f190: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6e 52  read from the nR
f1a0: 65 63 20 66 69 65 6c 64 20 2a 2f 0a 20 20 75 33  ec field */.  u3
f1b0: 32 20 2a 70 44 62 53 69 7a 65 20 20 20 20 20 20  2 *pDbSize      
f1c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
f1d0: 54 3a 20 56 61 6c 75 65 20 6f 66 20 6f 72 69 67  T: Value of orig
f1e0: 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 73 69  inal database si
f1f0: 7a 65 20 66 69 65 6c 64 20 2a 2f 0a 29 7b 0a 20  ze field */.){. 
f200: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
f210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f220: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
f230: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
f240: 61 4d 61 67 69 63 5b 38 5d 3b 20 20 20 20 20 2f  aMagic[8];     /
f250: 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f  * A buffer to ho
f260: 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68 65 61  ld the magic hea
f270: 64 65 72 20 2a 2f 0a 20 20 69 36 34 20 69 48 64  der */.  i64 iHd
f280: 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  rOff;           
f290: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
f2a0: 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  of journal heade
f2b0: 72 20 62 65 69 6e 67 20 72 65 61 64 20 2a 2f 0a  r being read */.
f2c0: 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
f2d0: 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
f2e0: 3b 20 20 20 20 20 20 2f 2a 20 4a 6f 75 72 6e 61  ;      /* Journa
f2f0: 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f  l file must be o
f300: 70 65 6e 2e 20 2a 2f 0a 0a 20 20 2f 2a 20 41 64  pen. */..  /* Ad
f310: 76 61 6e 63 65 20 50 61 67 65 72 2e 6a 6f 75 72  vance Pager.jour
f320: 6e 61 6c 4f 66 66 20 74 6f 20 74 68 65 20 73 74  nalOff to the st
f330: 61 72 74 20 6f 66 20 74 68 65 20 6e 65 78 74 20  art of the next 
f340: 73 65 63 74 6f 72 2e 20 49 66 20 74 68 65 0a 20  sector. If the. 
f350: 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   ** journal file
f360: 20 69 73 20 74 6f 6f 20 73 6d 61 6c 6c 20 66 6f   is too small fo
f370: 72 20 74 68 65 72 65 20 74 6f 20 62 65 20 61 20  r there to be a 
f380: 68 65 61 64 65 72 20 73 74 6f 72 65 64 20 61 74  header stored at
f390: 20 74 68 69 73 0a 20 20 2a 2a 20 70 6f 69 6e 74   this.  ** point
f3a0: 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
f3b0: 44 4f 4e 45 2e 0a 20 20 2a 2f 0a 20 20 70 50 61  DONE..  */.  pPa
f3c0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
f3d0: 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73  = journalHdrOffs
f3e0: 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  et(pPager);.  if
f3f0: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
f400: 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52  lOff+JOURNAL_HDR
f410: 5f 53 5a 28 70 50 61 67 65 72 29 20 3e 20 6a 6f  _SZ(pPager) > jo
f420: 75 72 6e 61 6c 53 69 7a 65 20 29 7b 0a 20 20 20  urnalSize ){.   
f430: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
f440: 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 48 64 72 4f  ONE;.  }.  iHdrO
f450: 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ff = pPager->jou
f460: 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 52  rnalOff;..  /* R
f470: 65 61 64 20 69 6e 20 74 68 65 20 66 69 72 73 74  ead in the first
f480: 20 38 20 62 79 74 65 73 20 6f 66 20 74 68 65 20   8 bytes of the 
f490: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20  journal header. 
f4a0: 49 66 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 6d  If they do not m
f4b0: 61 74 63 68 0a 20 20 2a 2a 20 74 68 65 20 20 6d  atch.  ** the  m
f4c0: 61 67 69 63 20 73 74 72 69 6e 67 20 66 6f 75 6e  agic string foun
f4d0: 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  d at the start o
f4e0: 66 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20 68  f each journal h
f4f0: 65 61 64 65 72 2c 20 72 65 74 75 72 6e 0a 20 20  eader, return.  
f500: 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 20  ** SQLITE_DONE. 
f510: 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  If an IO error o
f520: 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 61 6e  ccurs, return an
f530: 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f 74 68   error code. Oth
f540: 65 72 77 69 73 65 2c 0a 20 20 2a 2a 20 70 72 6f  erwise,.  ** pro
f550: 63 65 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ceed..  */.  if(
f560: 20 69 73 48 6f 74 20 7c 7c 20 69 48 64 72 4f 66   isHot || iHdrOf
f570: 66 21 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f!=pPager->journ
f580: 61 6c 48 64 72 20 29 7b 0a 20 20 20 20 72 63 20  alHdr ){.    rc 
f590: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
f5a0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61  pPager->jfd, aMa
f5b0: 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67  gic, sizeof(aMag
f5c0: 69 63 29 2c 20 69 48 64 72 4f 66 66 29 3b 0a 20  ic), iHdrOff);. 
f5d0: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
f5e0: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
f5f0: 20 20 7d 0a 20 20 20 20 69 66 28 20 6d 65 6d 63    }.    if( memc
f600: 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72  mp(aMagic, aJour
f610: 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66  nalMagic, sizeof
f620: 28 61 4d 61 67 69 63 29 29 21 3d 30 20 29 7b 0a  (aMagic))!=0 ){.
f630: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
f640: 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a  ITE_DONE;.    }.
f650: 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74    }..  /* Read t
f660: 68 65 20 66 69 72 73 74 20 74 68 72 65 65 20 33  he first three 3
f670: 32 2d 62 69 74 20 66 69 65 6c 64 73 20 6f 66 20  2-bit fields of 
f680: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
f690: 65 72 3a 20 54 68 65 20 6e 52 65 63 0a 20 20 2a  er: The nRec.  *
f6a0: 2a 20 66 69 65 6c 64 2c 20 74 68 65 20 63 68 65  * field, the che
f6b0: 63 6b 73 75 6d 2d 69 6e 69 74 69 61 6c 69 7a 65  cksum-initialize
f6c0: 72 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61  r and the databa
f6d0: 73 65 20 73 69 7a 65 20 61 74 20 74 68 65 20 73  se size at the s
f6e0: 74 61 72 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65  tart.  ** of the
f6f0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 52 65   transaction. Re
f700: 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
f710: 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67  de if anything g
f720: 6f 65 73 20 77 72 6f 6e 67 2e 0a 20 20 2a 2f 0a  oes wrong..  */.
f730: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
f740: 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74  =(rc = read32bit
f750: 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69  s(pPager->jfd, i
f760: 48 64 72 4f 66 66 2b 38 2c 20 70 4e 52 65 63 29  HdrOff+8, pNRec)
f770: 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f  ).   || SQLITE_O
f780: 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62  K!=(rc = read32b
f790: 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
f7a0: 20 69 48 64 72 4f 66 66 2b 31 32 2c 20 26 70 50   iHdrOff+12, &pP
f7b0: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29  ager->cksumInit)
f7c0: 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f  ).   || SQLITE_O
f7d0: 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62  K!=(rc = read32b
f7e0: 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
f7f0: 20 69 48 64 72 4f 66 66 2b 31 36 2c 20 70 44 62   iHdrOff+16, pDb
f800: 53 69 7a 65 29 29 0a 20 20 29 7b 0a 20 20 20 20  Size)).  ){.    
f810: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
f820: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
f830: 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20  urnalOff==0 ){. 
f840: 20 20 20 75 33 32 20 69 50 61 67 65 53 69 7a 65     u32 iPageSize
f850: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
f860: 2f 2a 20 50 61 67 65 2d 73 69 7a 65 20 66 69 65  /* Page-size fie
f870: 6c 64 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65  ld of journal he
f880: 61 64 65 72 20 2a 2f 0a 20 20 20 20 75 33 32 20  ader */.    u32 
f890: 69 53 65 63 74 6f 72 53 69 7a 65 3b 20 20 20 20  iSectorSize;    
f8a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63 74           /* Sect
f8b0: 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66  or-size field of
f8c0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
f8d0: 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20  */..    /* Read 
f8e0: 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e  the page-size an
f8f0: 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 6a 6f  d sector-size jo
f900: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69 65  urnal header fie
f910: 6c 64 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  lds. */.    if( 
f920: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
f930: 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67   read32bits(pPag
f940: 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66  er->jfd, iHdrOff
f950: 2b 32 30 2c 20 26 69 53 65 63 74 6f 72 53 69 7a  +20, &iSectorSiz
f960: 65 29 29 0a 20 20 20 20 20 7c 7c 20 53 51 4c 49  e)).     || SQLI
f970: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61  TE_OK!=(rc = rea
f980: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
f990: 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 32 34 2c  jfd, iHdrOff+24,
f9a0: 20 26 69 50 61 67 65 53 69 7a 65 29 29 0a 20 20   &iPageSize)).  
f9b0: 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72    ){.      retur
f9c0: 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n rc;.    }..   
f9d0: 20 2f 2a 20 56 65 72 73 69 6f 6e 73 20 6f 66 20   /* Versions of 
f9e0: 53 51 4c 69 74 65 20 70 72 69 6f 72 20 74 6f 20  SQLite prior to 
f9f0: 33 2e 35 2e 38 20 73 65 74 20 74 68 65 20 70 61  3.5.8 set the pa
fa00: 67 65 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66  ge-size field of
fa10: 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75 72   the.    ** jour
fa20: 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20 7a 65  nal header to ze
fa30: 72 6f 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ro. In this case
fa40: 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68  , assume that th
fa50: 65 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65  e Pager.pageSize
fa60: 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62 6c 65  .    ** variable
fa70: 20 69 73 20 61 6c 72 65 61 64 79 20 73 65 74 20   is already set 
fa80: 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20 70  to the correct p
fa90: 61 67 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f  age size..    */
faa0: 0a 20 20 20 20 69 66 28 20 69 50 61 67 65 53 69  .    if( iPageSi
fab0: 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ze==0 ){.      i
fac0: 50 61 67 65 53 69 7a 65 20 3d 20 70 50 61 67 65  PageSize = pPage
fad0: 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20  r->pageSize;.   
fae0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b   }..    /* Check
faf0: 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 73   that the values
fb00: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 70   read from the p
fb10: 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65 63  age-size and sec
fb20: 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64 73 0a  tor-size fields.
fb30: 20 20 20 20 2a 2a 20 61 72 65 20 77 69 74 68 69      ** are withi
fb40: 6e 20 72 61 6e 67 65 2e 20 54 6f 20 62 65 20 27  n range. To be '
fb50: 69 6e 20 72 61 6e 67 65 27 2c 20 62 6f 74 68 20  in range', both 
fb60: 76 61 6c 75 65 73 20 6e 65 65 64 20 74 6f 20 62  values need to b
fb70: 65 20 61 20 70 6f 77 65 72 0a 20 20 20 20 2a 2a  e a power.    **
fb80: 20 6f 66 20 74 77 6f 20 67 72 65 61 74 65 72 20   of two greater 
fb90: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
fba0: 20 35 31 32 20 6f 72 20 33 32 2c 20 61 6e 64 20   512 or 32, and 
fbb0: 6e 6f 74 20 67 72 65 61 74 65 72 20 74 68 61 6e  not greater than
fbc0: 20 74 68 65 69 72 20 0a 20 20 20 20 2a 2a 20 72   their .    ** r
fbd0: 65 73 70 65 63 74 69 76 65 20 63 6f 6d 70 69 6c  espective compil
fbe0: 65 20 74 69 6d 65 20 6d 61 78 69 6d 75 6d 20 6c  e time maximum l
fbf0: 69 6d 69 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  imits..    */.  
fc00: 20 20 69 66 28 20 69 50 61 67 65 53 69 7a 65 3c    if( iPageSize<
fc10: 35 31 32 20 20 20 20 20 20 20 20 20 20 20 20 20  512             
fc20: 20 20 20 20 20 7c 7c 20 69 53 65 63 74 6f 72 53       || iSectorS
fc30: 69 7a 65 3c 33 32 0a 20 20 20 20 20 7c 7c 20 69  ize<32.     || i
fc40: 50 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f  PageSize>SQLITE_
fc50: 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 7c 7c  MAX_PAGE_SIZE ||
fc60: 20 69 53 65 63 74 6f 72 53 69 7a 65 3e 4d 41 58   iSectorSize>MAX
fc70: 5f 53 45 43 54 4f 52 5f 53 49 5a 45 0a 20 20 20  _SECTOR_SIZE.   
fc80: 20 20 7c 7c 20 28 28 69 50 61 67 65 53 69 7a 65    || ((iPageSize
fc90: 2d 31 29 26 69 50 61 67 65 53 69 7a 65 29 21 3d  -1)&iPageSize)!=
fca0: 30 20 20 20 7c 7c 20 28 28 69 53 65 63 74 6f 72  0   || ((iSector
fcb0: 53 69 7a 65 2d 31 29 26 69 53 65 63 74 6f 72 53  Size-1)&iSectorS
fcc0: 69 7a 65 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a  ize)!=0 .    ){.
fcd0: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
fce0: 65 69 74 68 65 72 20 74 68 65 20 70 61 67 65 2d  either the page-
fcf0: 73 69 7a 65 20 6f 72 20 73 65 63 74 6f 72 2d 73  size or sector-s
fd00: 69 7a 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ize in the journ
fd10: 61 6c 2d 68 65 61 64 65 72 20 69 73 20 0a 20 20  al-header is .  
fd20: 20 20 20 20 2a 2a 20 69 6e 76 61 6c 69 64 2c 20      ** invalid, 
fd30: 74 68 65 6e 20 74 68 65 20 70 72 6f 63 65 73 73  then the process
fd40: 20 74 68 61 74 20 77 72 6f 74 65 20 74 68 65 20   that wrote the 
fd50: 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 6d  journal-header m
fd60: 75 73 74 20 68 61 76 65 20 0a 20 20 20 20 20 20  ust have .      
fd70: 2a 2a 20 63 72 61 73 68 65 64 20 62 65 66 6f 72  ** crashed befor
fd80: 65 20 74 68 65 20 68 65 61 64 65 72 20 77 61 73  e the header was
fd90: 20 73 79 6e 63 65 64 2e 20 49 6e 20 74 68 69 73   synced. In this
fda0: 20 63 61 73 65 20 73 74 6f 70 20 72 65 61 64 69   case stop readi
fdb0: 6e 67 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ng .      ** the
fdc0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65   journal file he
fdd0: 72 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  re..      */.   
fde0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
fdf0: 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20  _DONE;.    }..  
fe00: 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
fe10: 70 61 67 65 2d 73 69 7a 65 20 74 6f 20 6d 61 74  page-size to mat
fe20: 63 68 20 74 68 65 20 76 61 6c 75 65 20 72 65 61  ch the value rea
fe30: 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  d from the journ
fe40: 61 6c 2e 20 0a 20 20 20 20 2a 2a 20 55 73 65 20  al. .    ** Use 
fe50: 61 20 74 65 73 74 63 61 73 65 28 29 20 6d 61 63  a testcase() mac
fe60: 72 6f 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ro to make sure 
fe70: 74 68 61 74 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  that malloc fail
fe80: 75 72 65 20 77 69 74 68 69 6e 20 0a 20 20 20 20  ure within .    
fe90: 2a 2a 20 50 61 67 65 72 53 65 74 50 61 67 65 73  ** PagerSetPages
fea0: 69 7a 65 28 29 20 69 73 20 74 65 73 74 65 64 2e  ize() is tested.
feb0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
fec0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
fed0: 50 61 67 65 73 69 7a 65 28 70 50 61 67 65 72 2c  Pagesize(pPager,
fee0: 20 26 69 50 61 67 65 53 69 7a 65 2c 20 2d 31 29   &iPageSize, -1)
fef0: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
ff00: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
ff10: 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20  ..    /* Update 
ff20: 74 68 65 20 61 73 73 75 6d 65 64 20 73 65 63 74  the assumed sect
ff30: 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63 68  or-size to match
ff40: 20 74 68 65 20 76 61 6c 75 65 20 75 73 65 64 20   the value used 
ff50: 62 79 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 70  by .    ** the p
ff60: 72 6f 63 65 73 73 20 74 68 61 74 20 63 72 65 61  rocess that crea
ff70: 74 65 64 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  ted this journal
ff80: 2e 20 49 66 20 74 68 69 73 20 6a 6f 75 72 6e 61  . If this journa
ff90: 6c 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 72 65  l was.    ** cre
ffa0: 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73  ated by a proces
ffb0: 73 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 69  s other than thi
ffc0: 73 20 6f 6e 65 2c 20 74 68 65 6e 20 74 68 69 73  s one, then this
ffd0: 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20   routine.    ** 
ffe0: 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20  is being called 
fff0: 66 72 6f 6d 20 77 69 74 68 69 6e 20 70 61 67 65  from within page
10000 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20 54 68  r_playback(). Th
10010 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a 20 20  e local value.  
10020 20 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e 73 65    ** of Pager.se
10030 63 74 6f 72 53 69 7a 65 20 69 73 20 72 65 73 74  ctorSize is rest
10040 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e 64 20  ored at the end 
10050 6f 66 20 74 68 61 74 20 72 6f 75 74 69 6e 65 2e  of that routine.
10060 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67  .    */.    pPag
10070 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  er->sectorSize =
10080 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20   iSectorSize;.  
10090 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  }..  pPager->jou
100a0 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e  rnalOff += JOURN
100b0 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
100c0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
100d0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  }.../*.** Write 
100e0 74 68 65 20 73 75 70 70 6c 69 65 64 20 6d 61 73  the supplied mas
100f0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
10100 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
10110 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72  l file for pager
10120 0a 2a 2a 20 70 50 61 67 65 72 20 61 74 20 74 68  .** pPager at th
10130 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  e current locati
10140 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65 72 20 6a  on. The master j
10150 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74  ournal name must
10160 20 62 65 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20   be the last.** 
10170 74 68 69 6e 67 20 77 72 69 74 74 65 6e 20 74 6f  thing written to
10180 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e   a journal file.
10190 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
101a0 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f   in full-sync mo
101b0 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e  de, the.** journ
101c0 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
101d0 6f 72 20 69 73 20 61 64 76 61 6e 63 65 64 20 74  or is advanced t
101e0 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f  o the next secto
101f0 72 20 62 6f 75 6e 64 61 72 79 20 62 65 66 6f 72  r boundary befor
10200 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20 69 73  e.** anything is
10210 20 77 72 69 74 74 65 6e 2e 20 54 68 65 20 66 6f   written. The fo
10220 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  rmat is:.**.**  
10230 20 2b 20 34 20 62 79 74 65 73 3a 20 50 41 47 45   + 4 bytes: PAGE
10240 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 20 20  R_MJ_PGNO..**   
10250 2b 20 4e 20 62 79 74 65 73 3a 20 4d 61 73 74 65  + N bytes: Maste
10260 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61  r journal filena
10270 6d 65 20 69 6e 20 75 74 66 2d 38 2e 0a 2a 2a 20  me in utf-8..** 
10280 20 20 2b 20 34 20 62 79 74 65 73 3a 20 4e 20 28    + 4 bytes: N (
10290 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73 74 65 72  length of master
102a0 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e   journal name in
102b0 20 62 79 74 65 73 2c 20 6e 6f 20 6e 75 6c 2d 74   bytes, no nul-t
102c0 65 72 6d 69 6e 61 74 6f 72 29 2e 0a 2a 2a 20 20  erminator)..**  
102d0 20 2b 20 34 20 62 79 74 65 73 3a 20 4d 61 73 74   + 4 bytes: Mast
102e0 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
102f0 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 20 2b  checksum..**   +
10300 20 38 20 62 79 74 65 73 3a 20 61 4a 6f 75 72 6e   8 bytes: aJourn
10310 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a  alMagic[]..**.**
10320 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   The master jour
10330 6e 61 6c 20 70 61 67 65 20 63 68 65 63 6b 73 75  nal page checksu
10340 6d 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20  m is the sum of 
10350 74 68 65 20 62 79 74 65 73 20 69 6e 20 74 68 65  the bytes in the
10360 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e   master.** journ
10370 61 6c 20 6e 61 6d 65 2c 20 77 68 65 72 65 20 65  al name, where e
10380 61 63 68 20 62 79 74 65 20 69 73 20 69 6e 74 65  ach byte is inte
10390 72 70 72 65 74 65 64 20 61 73 20 61 20 73 69 67  rpreted as a sig
103a0 6e 65 64 20 38 2d 62 69 74 20 69 6e 74 65 67 65  ned 8-bit intege
103b0 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73  r..**.** If zMas
103c0 74 65 72 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f  ter is a NULL po
103d0 69 6e 74 65 72 20 28 6f 63 63 75 72 73 20 66 6f  inter (occurs fo
103e0 72 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62  r a single datab
103f0 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  ase transaction)
10400 2c 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20  , .** this call 
10410 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
10420 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4d  tatic int writeM
10430 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50 61 67  asterJournal(Pag
10440 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73  er *pPager, cons
10450 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29  t char *zMaster)
10460 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
10470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10480 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
10490 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61  ode */.  int nMa
104a0 73 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  ster;           
104b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e            /* Len
104c0 67 74 68 20 6f 66 20 73 74 72 69 6e 67 20 7a 4d  gth of string zM
104d0 61 73 74 65 72 20 2a 2f 0a 20 20 69 36 34 20 69  aster */.  i64 i
104e0 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20  HdrOff;         
104f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
10500 66 66 73 65 74 20 6f 66 20 68 65 61 64 65 72 20  ffset of header 
10510 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  in journal file 
10520 2a 2f 0a 20 20 69 36 34 20 6a 72 6e 6c 53 69 7a  */.  i64 jrnlSiz
10530 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
10540 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
10550 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 6e   journal file on
10560 20 64 69 73 6b 20 2a 2f 0a 20 20 75 33 32 20 63   disk */.  u32 c
10570 6b 73 75 6d 20 3d 20 30 3b 20 20 20 20 20 20 20  ksum = 0;       
10580 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
10590 68 65 63 6b 73 75 6d 20 6f 66 20 73 74 72 69 6e  hecksum of strin
105a0 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 0a 20 20  g zMaster */..  
105b0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
105c0 73 65 74 4d 61 73 74 65 72 3d 3d 30 20 29 3b 0a  setMaster==0 );.
105d0 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72    assert( !pager
105e0 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
105f0 3b 0a 0a 20 20 69 66 28 20 21 7a 4d 61 73 74 65  ;..  if( !zMaste
10600 72 20 0a 20 20 20 7c 7c 20 70 50 61 67 65 72 2d  r .   || pPager-
10610 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
10620 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
10630 4d 45 4d 4f 52 59 20 0a 20 20 20 7c 7c 20 70 50  MEMORY .   || pP
10640 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
10650 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
10660 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 29 7b 0a 20  MODE_OFF .  ){. 
10670 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
10680 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  _OK;.  }.  pPage
10690 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 31  r->setMaster = 1
106a0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ;.  assert( isOp
106b0 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
106c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
106d0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
106e0 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  <= pPager->journ
106f0 61 6c 4f 66 66 20 29 3b 0a 0a 20 20 2f 2a 20 43  alOff );..  /* C
10700 61 6c 63 75 6c 61 74 65 20 74 68 65 20 6c 65 6e  alculate the len
10710 67 74 68 20 69 6e 20 62 79 74 65 73 20 61 6e 64  gth in bytes and
10720 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6f 66   the checksum of
10730 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 20 20 66 6f   zMaster */.  fo
10740 72 28 6e 4d 61 73 74 65 72 3d 30 3b 20 7a 4d 61  r(nMaster=0; zMa
10750 73 74 65 72 5b 6e 4d 61 73 74 65 72 5d 3b 20 6e  ster[nMaster]; n
10760 4d 61 73 74 65 72 2b 2b 29 7b 0a 20 20 20 20 63  Master++){.    c
10770 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73 74 65 72 5b  ksum += zMaster[
10780 6e 4d 61 73 74 65 72 5d 3b 0a 20 20 7d 0a 0a 20  nMaster];.  }.. 
10790 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73   /* If in full-s
107a0 79 6e 63 20 6d 6f 64 65 2c 20 61 64 76 61 6e 63  ync mode, advanc
107b0 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 64 69  e to the next di
107c0 73 6b 20 73 65 63 74 6f 72 20 62 65 66 6f 72 65  sk sector before
107d0 20 77 72 69 74 69 6e 67 0a 20 20 2a 2a 20 74 68   writing.  ** th
107e0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
107f0 20 6e 61 6d 65 2e 20 54 68 69 73 20 69 73 20 69   name. This is i
10800 6e 20 63 61 73 65 20 74 68 65 20 70 72 65 76 69  n case the previ
10810 6f 75 73 20 70 61 67 65 20 77 72 69 74 74 65 6e  ous page written
10820 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75   to.  ** the jou
10830 72 6e 61 6c 20 68 61 73 20 61 6c 72 65 61 64 79  rnal has already
10840 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 20 20   been synced..  
10850 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
10860 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20  >fullSync ){.   
10870 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
10880 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72  Off = journalHdr
10890 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a  Offset(pPager);.
108a0 20 20 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d 20    }.  iHdrOff = 
108b0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
108c0 66 66 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20  ff;..  /* Write 
108d0 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
108e0 61 6c 20 64 61 74 61 20 74 6f 20 74 68 65 20 65  al data to the e
108f0 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  nd of the journa
10900 6c 20 66 69 6c 65 2e 20 49 66 0a 20 20 2a 2a 20  l file. If.  ** 
10910 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
10920 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f   return the erro
10930 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61  r code to the ca
10940 6c 6c 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ller..  */.  if(
10950 20 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69   (0 != (rc = wri
10960 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  te32bits(pPager-
10970 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2c 20 50  >jfd, iHdrOff, P
10980 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
10990 67 65 72 29 29 29 29 0a 20 20 20 7c 7c 20 28 30  ger)))).   || (0
109a0 20 21 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65   != (rc = sqlite
109b0 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
109c0 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 6e  >jfd, zMaster, n
109d0 4d 61 73 74 65 72 2c 20 69 48 64 72 4f 66 66 2b  Master, iHdrOff+
109e0 34 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d  4))).   || (0 !=
109f0 20 28 72 63 20 3d 20 77 72 69 74 65 33 32 62 69   (rc = write32bi
10a00 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
10a10 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65  iHdrOff+4+nMaste
10a20 72 2c 20 6e 4d 61 73 74 65 72 29 29 29 0a 20 20  r, nMaster))).  
10a30 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20   || (0 != (rc = 
10a40 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67  write32bits(pPag
10a50 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66  er->jfd, iHdrOff
10a60 2b 34 2b 6e 4d 61 73 74 65 72 2b 34 2c 20 63 6b  +4+nMaster+4, ck
10a70 73 75 6d 29 29 29 0a 20 20 20 7c 7c 20 28 30 20  sum))).   || (0 
10a80 21 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  != (rc = sqlite3
10a90 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
10aa0 6a 66 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  jfd, aJournalMag
10ab0 69 63 2c 20 38 2c 20 69 48 64 72 4f 66 66 2b 34  ic, 8, iHdrOff+4
10ac0 2b 6e 4d 61 73 74 65 72 2b 38 29 29 29 0a 20 20  +nMaster+8))).  
10ad0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
10ae0 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
10af0 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 28 6e  journalOff += (n
10b00 4d 61 73 74 65 72 2b 32 30 29 3b 0a 0a 20 20 2f  Master+20);..  /
10b10 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
10b20 73 20 69 6e 20 70 65 72 69 73 74 65 6e 74 2d 6a  s in peristent-j
10b30 6f 75 72 6e 61 6c 20 6d 6f 64 65 2c 20 74 68 65  ournal mode, the
10b40 6e 20 74 68 65 20 70 68 79 73 69 63 61 6c 20 0a  n the physical .
10b50 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c    ** journal-fil
10b60 65 20 6d 61 79 20 65 78 74 65 6e 64 20 70 61 73  e may extend pas
10b70 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
10b80 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
10b90 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e 64 20 38 20  name.  ** and 8 
10ba0 62 79 74 65 73 20 6f 66 20 6d 61 67 69 63 20 64  bytes of magic d
10bb0 61 74 61 20 6a 75 73 74 20 77 72 69 74 74 65 6e  ata just written
10bc0 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 54 68   to the file. Th
10bd0 69 73 20 69 73 20 0a 20 20 2a 2a 20 64 61 6e 67  is is .  ** dang
10be0 65 72 6f 75 73 20 62 65 63 61 75 73 65 20 74 68  erous because th
10bf0 65 20 63 6f 64 65 20 74 6f 20 72 6f 6c 6c 62 61  e code to rollba
10c00 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ck a hot-journal
10c10 20 66 69 6c 65 0a 20 20 2a 2a 20 77 69 6c 6c 20   file.  ** will 
10c20 6e 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20 66  not be able to f
10c30 69 6e 64 20 74 68 65 20 6d 61 73 74 65 72 2d 6a  ind the master-j
10c40 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 74 6f 20 64  ournal name to d
10c50 65 74 65 72 6d 69 6e 65 20 0a 20 20 2a 2a 20 77  etermine .  ** w
10c60 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
10c70 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68 6f 74  e journal is hot
10c80 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 61 73  . .  **.  ** Eas
10c90 69 65 73 74 20 74 68 69 6e 67 20 74 6f 20 64 6f  iest thing to do
10ca0 20 69 6e 20 74 68 69 73 20 73 63 65 6e 61 72 69   in this scenari
10cb0 6f 20 69 73 20 74 6f 20 74 72 75 6e 63 61 74 65  o is to truncate
10cc0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20   the journal .  
10cd0 2a 2a 20 66 69 6c 65 20 74 6f 20 74 68 65 20 72  ** file to the r
10ce0 65 71 75 69 72 65 64 20 73 69 7a 65 2e 0a 20 20  equired size..  
10cf0 2a 2f 20 0a 20 20 69 66 28 20 53 51 4c 49 54 45  */ .  if( SQLITE
10d00 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK==(rc = sqlit
10d10 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
10d20 67 65 72 2d 3e 6a 66 64 2c 20 26 6a 72 6e 6c 53  ger->jfd, &jrnlS
10d30 69 7a 65 29 29 0a 20 20 20 26 26 20 6a 72 6e 6c  ize)).   && jrnl
10d40 53 69 7a 65 3e 70 50 61 67 65 72 2d 3e 6a 6f 75  Size>pPager->jou
10d50 72 6e 61 6c 4f 66 66 0a 20 20 29 7b 0a 20 20 20  rnalOff.  ){.   
10d60 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54   rc = sqlite3OsT
10d70 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e  runcate(pPager->
10d80 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  jfd, pPager->jou
10d90 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 7d 0a 20 20  rnalOff);.  }.  
10da0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
10db0 0a 2a 2a 20 46 69 6e 64 20 61 20 70 61 67 65 20  .** Find a page 
10dc0 69 6e 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  in the hash tabl
10dd0 65 20 67 69 76 65 6e 20 69 74 73 20 70 61 67 65  e given its page
10de0 20 6e 75 6d 62 65 72 2e 20 52 65 74 75 72 6e 0a   number. Return.
10df0 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ** a pointer to 
10e00 74 68 65 20 70 61 67 65 20 6f 72 20 4e 55 4c 4c  the page or NULL
10e10 20 69 66 20 74 68 65 20 72 65 71 75 65 73 74 65   if the requeste
10e20 64 20 70 61 67 65 20 69 73 20 6e 6f 74 20 0a 2a  d page is not .*
10e30 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 6d 65 6d  * already in mem
10e40 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50  ory..*/.static P
10e50 67 48 64 72 20 2a 70 61 67 65 72 5f 6c 6f 6f 6b  gHdr *pager_look
10e60 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  up(Pager *pPager
10e70 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
10e80 50 67 48 64 72 20 2a 70 3b 20 20 20 20 20 20 20  PgHdr *p;       
10e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ea0 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75    /* Return valu
10eb0 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49 74 20 69 73  e */..  /* It is
10ec0 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f   not possible fo
10ed0 72 20 61 20 63 61 6c 6c 20 74 6f 20 50 63 61 63  r a call to Pcac
10ee0 68 65 46 65 74 63 68 28 29 20 77 69 74 68 20 63  heFetch() with c
10ef0 72 65 61 74 65 46 6c 61 67 3d 3d 30 20 74 6f 0a  reateFlag==0 to.
10f00 20 20 2a 2a 20 66 61 69 6c 2c 20 73 69 6e 63 65    ** fail, since
10f10 20 6e 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 61   no attempt to a
10f20 6c 6c 6f 63 61 74 65 20 64 79 6e 61 6d 69 63 20  llocate dynamic 
10f30 6d 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20 6d  memory will be m
10f40 61 64 65 2e 0a 20 20 2a 2f 0a 20 20 28 76 6f 69  ade..  */.  (voi
10f50 64 29 73 71 6c 69 74 65 33 50 63 61 63 68 65 46  d)sqlite3PcacheF
10f60 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43  etch(pPager->pPC
10f70 61 63 68 65 2c 20 70 67 6e 6f 2c 20 30 2c 20 26  ache, pgno, 0, &
10f80 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a  p);.  return p;.
10f90 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63 61 72 64  }../*.** Discard
10fa0 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74   the entire cont
10fb0 65 6e 74 73 20 6f 66 20 74 68 65 20 69 6e 2d 6d  ents of the in-m
10fc0 65 6d 6f 72 79 20 70 61 67 65 2d 63 61 63 68 65  emory page-cache
10fd0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
10fe0 20 70 61 67 65 72 5f 72 65 73 65 74 28 50 61 67   pager_reset(Pag
10ff0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73  er *pPager){.  s
11000 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65 73 74  qlite3BackupRest
11010 61 72 74 28 70 50 61 67 65 72 2d 3e 70 42 61 63  art(pPager->pBac
11020 6b 75 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  kup);.  sqlite3P
11030 63 61 63 68 65 43 6c 65 61 72 28 70 50 61 67 65  cacheClear(pPage
11040 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 7d 0a 0a  r->pPCache);.}..
11050 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 73  /*.** Free all s
11060 74 72 75 63 74 75 72 65 73 20 69 6e 20 74 68 65  tructures in the
11070 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e   Pager.aSavepoin
11080 74 5b 5d 20 61 72 72 61 79 20 61 6e 64 20 73 65  t[] array and se
11090 74 20 62 6f 74 68 0a 2a 2a 20 50 61 67 65 72 2e  t both.** Pager.
110a0 61 53 61 76 65 70 6f 69 6e 74 20 61 6e 64 20 50  aSavepoint and P
110b0 61 67 65 72 2e 6e 53 61 76 65 70 6f 69 6e 74 20  ager.nSavepoint 
110c0 74 6f 20 7a 65 72 6f 2e 20 43 6c 6f 73 65 20 74  to zero. Close t
110d0 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a  he sub-journal.*
110e0 2a 20 69 66 20 69 74 20 69 73 20 6f 70 65 6e 20  * if it is open 
110f0 61 6e 64 20 74 68 65 20 70 61 67 65 72 20 69 73  and the pager is
11100 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69 76   not in exclusiv
11110 65 20 6d 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  e mode..*/.stati
11120 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 41 6c  c void releaseAl
11130 6c 53 61 76 65 70 6f 69 6e 74 73 28 50 61 67 65  lSavepoints(Page
11140 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
11150 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  t ii;           
11160 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
11170 66 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f  for looping thro
11180 75 67 68 20 50 61 67 65 72 2e 61 53 61 76 65 70  ugh Pager.aSavep
11190 6f 69 6e 74 20 2a 2f 0a 20 20 66 6f 72 28 69 69  oint */.  for(ii
111a0 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e  =0; ii<pPager->n
111b0 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29  Savepoint; ii++)
111c0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69 74  {.    sqlite3Bit
111d0 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65  vecDestroy(pPage
111e0 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69  r->aSavepoint[ii
111f0 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 29 3b  ].pInSavepoint);
11200 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67  .  }.  if( !pPag
11210 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
11220 65 20 7c 7c 20 73 71 6c 69 74 65 33 49 73 4d 65  e || sqlite3IsMe
11230 6d 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d  mJournal(pPager-
11240 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 73 71  >sjfd) ){.    sq
11250 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
11260 67 65 72 2d 3e 73 6a 66 64 29 3b 0a 20 20 7d 0a  ger->sjfd);.  }.
11270 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
11280 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
11290 74 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 53  t);.  pPager->aS
112a0 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20  avepoint = 0;.  
112b0 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
112c0 6e 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  nt = 0;.  pPager
112d0 2d 3e 6e 53 75 62 52 65 63 20 3d 20 30 3b 0a 7d  ->nSubRec = 0;.}
112e0 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
112f0 62 69 74 20 6e 75 6d 62 65 72 20 70 67 6e 6f 20  bit number pgno 
11300 69 6e 20 74 68 65 20 50 61 67 65 72 53 61 76 65  in the PagerSave
11310 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69  point.pInSavepoi
11320 6e 74 20 0a 2a 2a 20 62 69 74 76 65 63 73 20 6f  nt .** bitvecs o
11330 66 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70  f all open savep
11340 6f 69 6e 74 73 2e 20 52 65 74 75 72 6e 20 53 51  oints. Return SQ
11350 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65  LITE_OK if succe
11360 73 73 66 75 6c 0a 2a 2a 20 6f 72 20 53 51 4c 49  ssful.** or SQLI
11370 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 61  TE_NOMEM if a ma
11380 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f 63 63  lloc failure occ
11390 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  urs..*/.static i
113a0 6e 74 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e  nt addToSavepoin
113b0 74 42 69 74 76 65 63 73 28 50 61 67 65 72 20 2a  tBitvecs(Pager *
113c0 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e  pPager, Pgno pgn
113d0 6f 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20 20  o){.  int ii;   
113e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
113f0 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
11400 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
11410 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 2f  LITE_OK;       /
11420 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f  * Result code */
11430 0a 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69  ..  for(ii=0; ii
11440 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f  <pPager->nSavepo
11450 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  int; ii++){.    
11460 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a  PagerSavepoint *
11470 70 20 3d 20 26 70 50 61 67 65 72 2d 3e 61 53 61  p = &pPager->aSa
11480 76 65 70 6f 69 6e 74 5b 69 69 5d 3b 0a 20 20 20  vepoint[ii];.   
11490 20 69 66 28 20 70 67 6e 6f 3c 3d 70 2d 3e 6e 4f   if( pgno<=p->nO
114a0 72 69 67 20 29 7b 0a 20 20 20 20 20 20 72 63 20  rig ){.      rc 
114b0 7c 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  |= sqlite3Bitvec
114c0 53 65 74 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f  Set(p->pInSavepo
114d0 69 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20  int, pgno);.    
114e0 20 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d    testcase( rc==
114f0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a  SQLITE_NOMEM );.
11500 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
11510 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72  ==SQLITE_OK || r
11520 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
11530 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
11540 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
11550 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
11560 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74   is a no-op if t
11570 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65  he pager is in e
11580 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 61 6e  xclusive mode an
11590 64 20 6e 6f 74 0a 2a 2a 20 69 6e 20 74 68 65 20  d not.** in the 
115a0 45 52 52 4f 52 20 73 74 61 74 65 2e 20 4f 74 68  ERROR state. Oth
115b0 65 72 77 69 73 65 2c 20 69 74 20 73 77 69 74 63  erwise, it switc
115c0 68 65 73 20 74 68 65 20 70 61 67 65 72 20 74 6f  hes the pager to
115d0 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 73   PAGER_OPEN.** s
115e0 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  tate..**.** If t
115f0 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
11600 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63  in exclusive-acc
11610 65 73 73 20 6d 6f 64 65 2c 20 74 68 65 20 64 61  ess mode, the da
11620 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 0a 2a  tabase file is.*
11630 2a 20 63 6f 6d 70 6c 65 74 65 6c 79 20 75 6e 6c  * completely unl
11640 6f 63 6b 65 64 2e 20 49 66 20 74 68 65 20 66 69  ocked. If the fi
11650 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 20 61  le is unlocked a
11660 6e 64 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  nd the file-syst
11670 65 6d 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 65  em does.** not e
11680 78 68 69 62 69 74 20 74 68 65 20 55 4e 44 45 4c  xhibit the UNDEL
11690 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e  ETABLE_WHEN_OPEN
116a0 20 70 72 6f 70 65 72 74 79 2c 20 74 68 65 20 6a   property, the j
116b0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 0a 2a  ournal file is.*
116c0 2a 20 63 6c 6f 73 65 64 20 28 69 66 20 69 74 20  * closed (if it 
116d0 69 73 20 6f 70 65 6e 29 2e 0a 2a 2a 0a 2a 2a 20  is open)..**.** 
116e0 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
116f0 69 6e 20 45 52 52 4f 52 20 73 74 61 74 65 20 77  in ERROR state w
11700 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
11710 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  n is called, the
11720 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66   .** contents of
11730 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
11740 20 61 72 65 20 64 69 73 63 61 72 64 65 64 20 62   are discarded b
11750 65 66 6f 72 65 20 73 77 69 74 63 68 69 6e 67 20  efore switching 
11760 62 61 63 6b 20 74 6f 20 0a 2a 2a 20 74 68 65 20  back to .** the 
11770 4f 50 45 4e 20 73 74 61 74 65 2e 20 52 65 67 61  OPEN state. Rega
11780 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65  rdless of whethe
11790 72 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  r the pager is i
117a0 6e 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65  n exclusive-mode
117b0 0a 2a 2a 20 6f 72 20 6e 6f 74 2c 20 61 6e 79 20  .** or not, any 
117c0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6c 65 66  journal file lef
117d0 74 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79  t in the file-sy
117e0 73 74 65 6d 20 77 69 6c 6c 20 62 65 20 74 72 65  stem will be tre
117f0 61 74 65 64 0a 2a 2a 20 61 73 20 61 20 68 6f 74  ated.** as a hot
11800 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 72 6f 6c  -journal and rol
11810 6c 65 64 20 62 61 63 6b 20 74 68 65 20 6e 65 78  led back the nex
11820 74 20 74 69 6d 65 20 61 20 72 65 61 64 2d 74 72  t time a read-tr
11830 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20  ansaction.** is 
11840 6f 70 65 6e 65 64 20 28 62 79 20 74 68 69 73 20  opened (by this 
11850 6f 72 20 62 79 20 61 6e 79 20 6f 74 68 65 72 20  or by any other 
11860 63 6f 6e 6e 65 63 74 69 6f 6e 29 2e 0a 2a 2f 0a  connection)..*/.
11870 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
11880 72 5f 75 6e 6c 6f 63 6b 28 50 61 67 65 72 20 2a  r_unlock(Pager *
11890 70 50 61 67 65 72 29 7b 0a 0a 20 20 61 73 73 65  pPager){..  asse
118a0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
118b0 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te==PAGER_READER
118c0 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67   .       || pPag
118d0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
118e0 52 5f 4f 50 45 4e 20 0a 20 20 20 20 20 20 20 7c  R_OPEN .       |
118f0 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
11900 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 0a 20  ==PAGER_ERROR . 
11910 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 69   );..  sqlite3Bi
11920 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67  tvecDestroy(pPag
11930 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b  er->pInJournal);
11940 0a 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  .  pPager->pInJo
11950 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 72 65 6c  urnal = 0;.  rel
11960 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74  easeAllSavepoint
11970 73 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 69 66  s(pPager);..  if
11980 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
11990 61 67 65 72 29 20 29 7b 0a 20 20 20 20 61 73 73  ager) ){.    ass
119a0 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50 61  ert( !isOpen(pPa
119b0 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20  ger->jfd) );.   
119c0 20 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65   sqlite3WalEndRe
119d0 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  adTransaction(pP
119e0 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20  ager->pWal);.   
119f0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20   pPager->eState 
11a00 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20  = PAGER_OPEN;.  
11a10 7d 65 6c 73 65 20 69 66 28 20 21 70 50 61 67 65  }else if( !pPage
11a20 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
11a30 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 20   ){.    int rc; 
11a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a50 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63        /* Error c
11a60 6f 64 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  ode returned by 
11a70 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20  pagerUnlockDb() 
11a80 2a 2f 0a 20 20 20 20 69 6e 74 20 69 44 63 20 3d  */.    int iDc =
11a90 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
11aa0 66 64 29 3f 73 71 6c 69 74 65 33 4f 73 44 65 76  fd)?sqlite3OsDev
11ab0 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
11ac0 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3a 30  cs(pPager->fd):0
11ad0 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
11ae0 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
11af0 6d 20 73 75 70 70 6f 72 74 20 64 65 6c 65 74 69  m support deleti
11b00 6f 6e 20 6f 66 20 6f 70 65 6e 20 66 69 6c 65 73  on of open files
11b10 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 63 6c  , then.    ** cl
11b20 6f 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ose the journal 
11b30 66 69 6c 65 20 77 68 65 6e 20 64 72 6f 70 70 69  file when droppi
11b40 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ng the database 
11b50 6c 6f 63 6b 2e 20 20 4f 74 68 65 72 77 69 73 65  lock.  Otherwise
11b60 0a 20 20 20 20 2a 2a 20 61 6e 6f 74 68 65 72 20  .    ** another 
11b70 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20  connection with 
11b80 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 64 65 6c  journal_mode=del
11b90 65 74 65 20 6d 69 67 68 74 20 64 65 6c 65 74 65  ete might delete
11ba0 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a   the file.    **
11bb0 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20   out from under 
11bc0 75 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  us..    */.    a
11bd0 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f  ssert( (PAGER_JO
11be0 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
11bf0 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20     & 5)!=1 );.  
11c00 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52    assert( (PAGER
11c10 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
11c20 20 20 20 20 20 20 26 20 35 29 21 3d 31 20 29 3b        & 5)!=1 );
11c30 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41  .    assert( (PA
11c40 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
11c50 57 41 4c 20 20 20 20 20 20 26 20 35 29 21 3d 31  WAL      & 5)!=1
11c60 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
11c70 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  (PAGER_JOURNALMO
11c80 44 45 5f 44 45 4c 45 54 45 20 20 20 26 20 35 29  DE_DELETE   & 5)
11c90 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=1 );.    asser
11ca0 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41  t( (PAGER_JOURNA
11cb0 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 26  LMODE_TRUNCATE &
11cc0 20 35 29 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73   5)==1 );.    as
11cd0 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55  sert( (PAGER_JOU
11ce0 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
11cf0 20 20 26 20 35 29 3d 3d 31 20 29 3b 0a 20 20 20    & 5)==1 );.   
11d00 20 69 66 28 20 30 3d 3d 28 69 44 63 20 26 20 53   if( 0==(iDc & S
11d10 51 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45  QLITE_IOCAP_UNDE
11d20 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45  LETABLE_WHEN_OPE
11d30 4e 29 0a 20 20 20 20 20 7c 7c 20 31 21 3d 28 70  N).     || 1!=(p
11d40 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
11d50 64 65 20 26 20 35 29 0a 20 20 20 20 29 7b 0a 20  de & 5).    ){. 
11d60 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
11d70 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ose(pPager->jfd)
11d80 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
11d90 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
11da0 69 6e 20 74 68 65 20 45 52 52 4f 52 20 73 74 61  in the ERROR sta
11db0 74 65 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 20  te and the call 
11dc0 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61  to unlock the da
11dd0 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69  tabase.    ** fi
11de0 6c 65 20 66 61 69 6c 73 2c 20 73 65 74 20 74 68  le fails, set th
11df0 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 20 74  e current lock t
11e00 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20  o UNKNOWN_LOCK. 
11e10 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 0a  See the comment.
11e20 20 20 20 20 2a 2a 20 61 62 6f 76 65 20 74 68 65      ** above the
11e30 20 23 64 65 66 69 6e 65 20 66 6f 72 20 55 4e 4b   #define for UNK
11e40 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e  NOWN_LOCK for an
11e50 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20   explanation of 
11e60 77 68 79 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  why this.    ** 
11e70 69 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20  is necessary..  
11e80 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61    */.    rc = pa
11e90 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67  gerUnlockDb(pPag
11ea0 65 72 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  er, NO_LOCK);.  
11eb0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
11ec0 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 65  _OK && pPager->e
11ed0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52  State==PAGER_ERR
11ee0 4f 52 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  OR ){.      pPag
11ef0 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 55 4e 4b 4e  er->eLock = UNKN
11f00 4f 57 4e 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a  OWN_LOCK;.    }.
11f10 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65  .    /* The page
11f20 72 20 73 74 61 74 65 20 6d 61 79 20 62 65 20 63  r state may be c
11f30 68 61 6e 67 65 64 20 66 72 6f 6d 20 50 41 47 45  hanged from PAGE
11f40 52 5f 45 52 52 4f 52 20 74 6f 20 50 41 47 45 52  R_ERROR to PAGER
11f50 5f 4f 50 45 4e 20 68 65 72 65 0a 20 20 20 20 2a  _OPEN here.    *
11f60 2a 20 77 69 74 68 6f 75 74 20 63 6c 65 61 72 69  * without cleari
11f70 6e 67 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  ng the error cod
11f80 65 2e 20 54 68 69 73 20 69 73 20 69 6e 74 65 6e  e. This is inten
11f90 74 69 6f 6e 61 6c 20 2d 20 74 68 65 20 65 72 72  tional - the err
11fa0 6f 72 0a 20 20 20 20 2a 2a 20 63 6f 64 65 20 69  or.    ** code i
11fb0 73 20 63 6c 65 61 72 65 64 20 61 6e 64 20 74 68  s cleared and th
11fc0 65 20 63 61 63 68 65 20 72 65 73 65 74 20 69 6e  e cache reset in
11fd0 20 74 68 65 20 62 6c 6f 63 6b 20 62 65 6c 6f 77   the block below
11fe0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
11ff0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72  ert( pPager->err
12000 43 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e  Code || pPager->
12010 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52  eState!=PAGER_ER
12020 52 4f 52 20 29 3b 0a 20 20 20 20 70 50 61 67 65  ROR );.    pPage
12030 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
12040 6e 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  ne = 0;.    pPag
12050 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47  er->eState = PAG
12060 45 52 5f 4f 50 45 4e 3b 0a 20 20 7d 0a 0a 20 20  ER_OPEN;.  }..  
12070 2f 2a 20 49 66 20 50 61 67 65 72 2e 65 72 72 43  /* If Pager.errC
12080 6f 64 65 20 69 73 20 73 65 74 2c 20 74 68 65 20  ode is set, the 
12090 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
120a0 70 61 67 65 72 20 63 61 63 68 65 20 63 61 6e 6e  pager cache cann
120b0 6f 74 20 62 65 0a 20 20 2a 2a 20 74 72 75 73 74  ot be.  ** trust
120c0 65 64 2e 20 4e 6f 77 20 74 68 61 74 20 74 68 65  ed. Now that the
120d0 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61  re are no outsta
120e0 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73  nding references
120f0 20 74 6f 20 74 68 65 20 70 61 67 65 72 2c 0a 20   to the pager,. 
12100 20 2a 2a 20 69 74 20 63 61 6e 20 73 61 66 65 6c   ** it can safel
12110 79 20 6d 6f 76 65 20 62 61 63 6b 20 74 6f 20 50  y move back to P
12120 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65 2e  AGER_OPEN state.
12130 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 69 6e   This happens in
12140 20 62 6f 74 68 0a 20 20 2a 2a 20 6e 6f 72 6d 61   both.  ** norma
12150 6c 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65 2d  l and exclusive-
12160 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2e 0a 20 20  locking mode..  
12170 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
12180 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20  >errCode ){.    
12190 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29  assert( !MEMDB )
121a0 3b 0a 20 20 20 20 70 61 67 65 72 5f 72 65 73 65  ;.    pager_rese
121b0 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70  t(pPager);.    p
121c0 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
121d0 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d  ntDone = pPager-
121e0 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 20 20 70  >tempFile;.    p
121f0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20  Pager->eState = 
12200 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 20 20  PAGER_OPEN;.    
12210 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
12220 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
12230 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ..  pPager->jour
12240 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 70 50  nalOff = 0;.  pP
12250 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
12260 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
12270 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 7d  setMaster = 0;.}
12280 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
12290 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
122a0 77 68 65 6e 65 76 65 72 20 61 6e 20 49 4f 45 52  whenever an IOER
122b0 52 20 6f 72 20 46 55 4c 4c 20 65 72 72 6f 72 20  R or FULL error 
122c0 74 68 61 74 20 72 65 71 75 69 72 65 73 0a 2a 2a  that requires.**
122d0 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 74 72   the pager to tr
122e0 61 6e 73 69 74 69 6f 6e 20 69 6e 74 6f 20 74 68  ansition into th
122f0 65 20 45 52 52 4f 52 20 73 74 61 74 65 20 6d 61  e ERROR state ma
12300 79 20 61 68 76 65 20 6f 63 63 75 72 72 65 64 2e  y ahve occurred.
12310 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61 72  .** The first ar
12320 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e  gument is a poin
12330 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 72  ter to the pager
12340 20 73 74 72 75 63 74 75 72 65 2c 20 74 68 65 20   structure, the 
12350 73 65 63 6f 6e 64 20 0a 2a 2a 20 74 68 65 20 65  second .** the e
12360 72 72 6f 72 2d 63 6f 64 65 20 61 62 6f 75 74 20  rror-code about 
12370 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 62  to be returned b
12380 79 20 61 20 70 61 67 65 72 20 41 50 49 20 66 75  y a pager API fu
12390 6e 63 74 69 6f 6e 2e 20 54 68 65 20 0a 2a 2a 20  nction. The .** 
123a0 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69  value returned i
123b0 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  s a copy of the 
123c0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
123d0 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
123e0 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  . .**.** If the 
123f0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
12400 69 73 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20  is SQLITE_FULL, 
12410 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72 20  SQLITE_IOERR or 
12420 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4f  one of the.** IO
12430 45 52 52 20 73 75 62 2d 63 6f 64 65 73 2c 20 74  ERR sub-codes, t
12440 68 65 20 70 61 67 65 72 20 65 6e 74 65 72 73 20  he pager enters 
12450 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 20  the ERROR state 
12460 61 6e 64 20 74 68 65 20 65 72 72 6f 72 20 63 6f  and the error co
12470 64 65 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64 20  de.** is stored 
12480 69 6e 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65  in Pager.errCode
12490 2e 20 57 68 69 6c 65 20 74 68 65 20 70 61 67 65  . While the page
124a0 72 20 72 65 6d 61 69 6e 73 20 69 6e 20 74 68 65  r remains in the
124b0 20 45 52 52 4f 52 20 73 74 61 74 65 2c 0a 2a 2a   ERROR state,.**
124c0 20 61 6c 6c 20 6d 61 6a 6f 72 20 41 50 49 20 63   all major API c
124d0 61 6c 6c 73 20 6f 6e 20 74 68 65 20 50 61 67 65  alls on the Page
124e0 72 20 77 69 6c 6c 20 69 6d 6d 65 64 69 61 74 65  r will immediate
124f0 6c 79 20 72 65 74 75 72 6e 20 50 61 67 65 72 2e  ly return Pager.
12500 65 72 72 43 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54  errCode..**.** T
12510 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 20 69  he ERROR state i
12520 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68  ndicates that th
12530 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
12540 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 0a 2a  e pager-cache .*
12550 2a 20 63 61 6e 6e 6f 74 20 62 65 20 74 72 75 73  * cannot be trus
12560 74 65 64 2e 20 54 68 69 73 20 73 74 61 74 65 20  ted. This state 
12570 63 61 6e 20 62 65 20 63 6c 65 61 72 65 64 20 62  can be cleared b
12580 79 20 63 6f 6d 70 6c 65 74 65 6c 79 20 64 69 73  y completely dis
12590 63 61 72 64 69 6e 67 20 0a 2a 2a 20 74 68 65 20  carding .** the 
125a0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
125b0 70 61 67 65 72 2d 63 61 63 68 65 2e 20 49 66 20  pager-cache. If 
125c0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  a transaction wa
125d0 73 20 61 63 74 69 76 65 20 77 68 65 6e 0a 2a 2a  s active when.**
125e0 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20   the persistent 
125f0 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 20  error occurred, 
12600 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63  then the rollbac
12610 6b 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 6e 65  k journal may ne
12620 65 64 0a 2a 2a 20 74 6f 20 62 65 20 72 65 70 6c  ed.** to be repl
12630 61 79 65 64 20 74 6f 20 72 65 73 74 6f 72 65 20  ayed to restore 
12640 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
12650 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
12660 65 20 28 61 73 20 69 66 0a 2a 2a 20 69 74 20 77  e (as if.** it w
12670 65 72 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  ere a hot-journa
12680 6c 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  l)..*/.static in
12690 74 20 70 61 67 65 72 5f 65 72 72 6f 72 28 50 61  t pager_error(Pa
126a0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
126b0 20 72 63 29 7b 0a 20 20 69 6e 74 20 72 63 32 20   rc){.  int rc2 
126c0 3d 20 72 63 20 26 20 30 78 66 66 3b 0a 20 20 61  = rc & 0xff;.  a
126d0 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
126e0 45 5f 4f 4b 20 7c 7c 20 21 4d 45 4d 44 42 20 29  E_OK || !MEMDB )
126f0 3b 0a 20 20 61 73 73 65 72 74 28 0a 20 20 20 20  ;.  assert(.    
12700 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f     pPager->errCo
12710 64 65 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20  de==SQLITE_FULL 
12720 7c 7c 0a 20 20 20 20 20 20 20 70 50 61 67 65 72  ||.       pPager
12730 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
12740 45 5f 4f 4b 20 7c 7c 0a 20 20 20 20 20 20 20 28  E_OK ||.       (
12750 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
12760 26 20 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f  & 0xff)==SQLITE_
12770 49 4f 45 52 52 0a 20 20 29 3b 0a 20 20 69 66 28  IOERR.  );.  if(
12780 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 46 55 4c   rc2==SQLITE_FUL
12790 4c 20 7c 7c 20 72 63 32 3d 3d 53 51 4c 49 54 45  L || rc2==SQLITE
127a0 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 70 50  _IOERR ){.    pP
127b0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20  ager->errCode = 
127c0 72 63 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  rc;.    pPager->
127d0 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45  eState = PAGER_E
127e0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75  RROR;.  }.  retu
127f0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
12800 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 64  This routine end
12810 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  s a transaction.
12820 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   A transaction i
12830 73 20 75 73 75 61 6c 6c 79 20 65 6e 64 65 64 20  s usually ended 
12840 62 79 20 0a 2a 2a 20 65 69 74 68 65 72 20 61 20  by .** either a 
12850 43 4f 4d 4d 49 54 20 6f 72 20 61 20 52 4f 4c 4c  COMMIT or a ROLL
12860 42 41 43 4b 20 6f 70 65 72 61 74 69 6f 6e 2e 20  BACK operation. 
12870 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 79  This routine may
12880 20 62 65 20 63 61 6c 6c 65 64 20 0a 2a 2a 20 61   be called .** a
12890 66 74 65 72 20 72 6f 6c 6c 62 61 63 6b 20 6f 66  fter rollback of
128a0 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 20   a hot-journal, 
128b0 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f  or if an error o
128c0 63 63 75 72 73 20 77 68 69 6c 65 20 6f 70 65 6e  ccurs while open
128d0 69 6e 67 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  ing.** the journ
128e0 61 6c 20 66 69 6c 65 20 6f 72 20 77 72 69 74 69  al file or writi
128f0 6e 67 20 74 68 65 20 76 65 72 79 20 66 69 72 73  ng the very firs
12900 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72  t journal-header
12910 20 6f 66 20 61 0a 2a 2a 20 64 61 74 61 62 61 73   of a.** databas
12920 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  e transaction..*
12930 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  * .** This routi
12940 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c  ne is never call
12950 65 64 20 69 6e 20 50 41 47 45 52 5f 45 52 52 4f  ed in PAGER_ERRO
12960 52 20 73 74 61 74 65 2e 20 49 66 20 69 74 20 69  R state. If it i
12970 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 69 6e 20 50  s called.** in P
12980 41 47 45 52 5f 4e 4f 4e 45 20 6f 72 20 50 41 47  AGER_NONE or PAG
12990 45 52 5f 53 48 41 52 45 44 20 73 74 61 74 65 20  ER_SHARED state 
129a0 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 68 65 6c  and the lock hel
129b0 64 20 69 73 20 6c 65 73 73 0a 2a 2a 20 65 78 63  d is less.** exc
129c0 6c 75 73 69 76 65 20 74 68 61 6e 20 61 20 52 45  lusive than a RE
129d0 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 69 74 20  SERVED lock, it 
129e0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
129f0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 79  * Otherwise, any
12a00 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e   active savepoin
12a10 74 73 20 61 72 65 20 72 65 6c 65 61 73 65 64 2e  ts are released.
12a20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f  .**.** If the jo
12a30 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70  urnal file is op
12a40 65 6e 2c 20 74 68 65 6e 20 69 74 20 69 73 20 22  en, then it is "
12a50 66 69 6e 61 6c 69 7a 65 64 22 2e 20 4f 6e 63 65  finalized". Once
12a60 20 61 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 66   a journal .** f
12a70 69 6c 65 20 68 61 73 20 62 65 65 6e 20 66 69 6e  ile has been fin
12a80 61 6c 69 7a 65 64 20 69 74 20 69 73 20 6e 6f 74  alized it is not
12a90 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 75 73 65   possible to use
12aa0 20 69 74 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b   it to roll back
12ab0 20 61 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69   a .** transacti
12ac0 6f 6e 2e 20 4e 6f 72 20 77 69 6c 6c 20 69 74 20  on. Nor will it 
12ad0 62 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f  be considered to
12ae0 20 62 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   be a hot-journa
12af0 6c 20 62 79 20 74 68 69 73 0a 2a 2a 20 6f 72 20  l by this.** or 
12b00 61 6e 79 20 6f 74 68 65 72 20 64 61 74 61 62 61  any other databa
12b10 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 45  se connection. E
12b20 78 61 63 74 6c 79 20 68 6f 77 20 61 20 6a 6f 75  xactly how a jou
12b30 72 6e 61 6c 20 69 73 20 66 69 6e 61 6c 69 7a 65  rnal is finalize
12b40 64 0a 2a 2a 20 64 65 70 65 6e 64 73 20 6f 6e 20  d.** depends on 
12b50 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
12b60 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e  he pager is runn
12b70 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65  ing in exclusive
12b80 20 6d 6f 64 65 20 61 6e 64 0a 2a 2a 20 74 68 65   mode and.** the
12b90 20 63 75 72 72 65 6e 74 20 6a 6f 75 72 6e 61 6c   current journal
12ba0 2d 6d 6f 64 65 20 28 50 61 67 65 72 2e 6a 6f 75  -mode (Pager.jou
12bb0 72 6e 61 6c 4d 6f 64 65 20 76 61 6c 75 65 29 2c  rnalMode value),
12bc0 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
12bd0 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65  **   journalMode
12be0 3d 3d 4d 45 4d 4f 52 59 0a 2a 2a 20 20 20 20 20  ==MEMORY.**     
12bf0 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73  Journal file des
12c00 63 72 69 70 74 6f 72 20 69 73 20 73 69 6d 70 6c  criptor is simpl
12c10 79 20 63 6c 6f 73 65 64 2e 20 54 68 69 73 20 64  y closed. This d
12c20 65 73 74 72 6f 79 73 20 61 6e 20 0a 2a 2a 20 20  estroys an .**  
12c30 20 20 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75     in-memory jou
12c40 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f  rnal..**.**   jo
12c50 75 72 6e 61 6c 4d 6f 64 65 3d 3d 54 52 55 4e 43  urnalMode==TRUNC
12c60 41 54 45 0a 2a 2a 20 20 20 20 20 4a 6f 75 72 6e  ATE.**     Journ
12c70 61 6c 20 66 69 6c 65 20 69 73 20 74 72 75 6e 63  al file is trunc
12c80 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 62 79 74  ated to zero byt
12c90 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a  es in size..**.*
12ca0 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  *   journalMode=
12cb0 3d 50 45 52 53 49 53 54 0a 2a 2a 20 20 20 20 20  =PERSIST.**     
12cc0 54 68 65 20 66 69 72 73 74 20 32 38 20 62 79 74  The first 28 byt
12cd0 65 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  es of the journa
12ce0 6c 20 66 69 6c 65 20 61 72 65 20 7a 65 72 6f 65  l file are zeroe
12cf0 64 2e 20 54 68 69 73 20 69 6e 76 61 6c 69 64 61  d. This invalida
12d00 74 65 73 0a 2a 2a 20 20 20 20 20 74 68 65 20 66  tes.**     the f
12d10 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  irst journal hea
12d20 64 65 72 20 69 6e 20 74 68 65 20 66 69 6c 65 2c  der in the file,
12d30 20 61 6e 64 20 68 65 6e 63 65 20 74 68 65 20 65   and hence the e
12d40 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  ntire journal.**
12d50 20 20 20 20 20 66 69 6c 65 2e 20 41 6e 20 69 6e       file. An in
12d60 76 61 6c 69 64 20 6a 6f 75 72 6e 61 6c 20 66 69  valid journal fi
12d70 6c 65 20 63 61 6e 6e 6f 74 20 62 65 20 72 6f 6c  le cannot be rol
12d80 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  led back..**.** 
12d90 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 44    journalMode==D
12da0 45 4c 45 54 45 0a 2a 2a 20 20 20 20 20 54 68 65  ELETE.**     The
12db0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
12dc0 20 63 6c 6f 73 65 64 20 61 6e 64 20 64 65 6c 65   closed and dele
12dd0 74 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65  ted using sqlite
12de0 33 4f 73 44 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a  3OsDelete()..**.
12df0 2a 2a 20 20 20 20 20 49 66 20 74 68 65 20 70 61  **     If the pa
12e00 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69  ger is running i
12e10 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
12e20 2c 20 74 68 69 73 20 6d 65 74 68 6f 64 20 6f 66  , this method of
12e30 20 66 69 6e 61 6c 69 7a 69 6e 67 0a 2a 2a 20 20   finalizing.**  
12e40 20 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66     the journal f
12e50 69 6c 65 20 69 73 20 6e 65 76 65 72 20 75 73 65  ile is never use
12e60 64 2e 20 49 6e 73 74 65 61 64 2c 20 69 66 20 74  d. Instead, if t
12e70 68 65 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 69  he journalMode i
12e80 73 0a 2a 2a 20 20 20 20 20 44 45 4c 45 54 45 20  s.**     DELETE 
12e90 61 6e 64 20 74 68 65 20 70 61 67 65 72 20 69 73  and the pager is
12ea0 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
12eb0 64 65 2c 20 74 68 65 20 6d 65 74 68 6f 64 20 64  de, the method d
12ec0 65 73 63 72 69 62 65 64 20 75 6e 64 65 72 0a 2a  escribed under.*
12ed0 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64  *     journalMod
12ee0 65 3d 3d 50 45 52 53 49 53 54 20 69 73 20 75 73  e==PERSIST is us
12ef0 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a  ed instead..**.*
12f00 2a 20 41 66 74 65 72 20 74 68 65 20 6a 6f 75 72  * After the jour
12f10 6e 61 6c 20 69 73 20 66 69 6e 61 6c 69 7a 65 64  nal is finalized
12f20 2c 20 74 68 65 20 70 61 67 65 72 20 6d 6f 76 65  , the pager move
12f30 73 20 74 6f 20 50 41 47 45 52 5f 52 45 41 44 45  s to PAGER_READE
12f40 52 20 73 74 61 74 65 2e 0a 2a 2a 20 49 66 20 72  R state..** If r
12f50 75 6e 6e 69 6e 67 20 69 6e 20 6e 6f 6e 2d 65 78  unning in non-ex
12f60 63 6c 75 73 69 76 65 20 72 6f 6c 6c 62 61 63 6b  clusive rollback
12f70 20 6d 6f 64 65 2c 20 74 68 65 20 6c 6f 63 6b 20   mode, the lock 
12f80 6f 6e 20 74 68 65 20 66 69 6c 65 20 69 73 20 0a  on the file is .
12f90 2a 2a 20 64 6f 77 6e 67 72 61 64 65 64 20 74 6f  ** downgraded to
12fa0 20 61 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a   a SHARED_LOCK..
12fb0 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
12fc0 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 6e  is returned if n
12fd0 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20  o error occurs. 
12fe0 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
12ff0 72 73 20 64 75 72 69 6e 67 0a 2a 2a 20 61 6e 79  rs during.** any
13000 20 6f 66 20 74 68 65 20 49 4f 20 6f 70 65 72 61   of the IO opera
13010 74 69 6f 6e 73 20 74 6f 20 66 69 6e 61 6c 69 7a  tions to finaliz
13020 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
13030 6c 65 20 6f 72 20 75 6e 6c 6f 63 6b 20 74 68 65  le or unlock the
13040 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74 68 65  .** database the
13050 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63  n the IO error c
13060 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
13070 74 6f 20 74 68 65 20 75 73 65 72 2e 20 49 66 20  to the user. If 
13080 74 68 65 20 0a 2a 2a 20 6f 70 65 72 61 74 69 6f  the .** operatio
13090 6e 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68  n to finalize th
130a0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
130b0 61 69 6c 73 2c 20 74 68 65 6e 20 74 68 65 20 63  ails, then the c
130c0 6f 64 65 20 73 74 69 6c 6c 0a 2a 2a 20 74 72 69  ode still.** tri
130d0 65 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65  es to unlock the
130e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
130f0 66 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69  f not in exclusi
13100 76 65 20 6d 6f 64 65 2e 20 49 66 20 74 68 65 0a  ve mode. If the.
13110 2a 2a 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74  ** unlock operat
13120 69 6f 6e 20 66 61 69 6c 73 20 61 73 20 77 65 6c  ion fails as wel
13130 6c 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72 73  l, then the firs
13140 74 20 65 72 72 6f 72 20 63 6f 64 65 20 72 65 6c  t error code rel
13150 61 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 66  ated.** to the f
13160 69 72 73 74 20 65 72 72 6f 72 20 65 6e 63 6f 75  irst error encou
13170 6e 74 65 72 65 64 20 28 74 68 65 20 6a 6f 75 72  ntered (the jour
13180 6e 61 6c 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e  nal finalization
13190 20 6f 6e 65 29 20 69 73 0a 2a 2a 20 72 65 74 75   one) is.** retu
131a0 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
131b0 69 6e 74 20 70 61 67 65 72 5f 65 6e 64 5f 74 72  int pager_end_tr
131c0 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65 72 20  ansaction(Pager 
131d0 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 68 61 73  *pPager, int has
131e0 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72  Master){.  int r
131f0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
13200 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64      /* Error cod
13210 65 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 66  e from journal f
13220 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 70 65 72  inalization oper
13230 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72  ation */.  int r
13240 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  c2 = SQLITE_OK; 
13250 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64      /* Error cod
13260 65 20 66 72 6f 6d 20 64 62 20 66 69 6c 65 20 75  e from db file u
13270 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20  nlock operation 
13280 2a 2f 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 68  */..  /* Do noth
13290 69 6e 67 20 69 66 20 74 68 65 20 70 61 67 65 72  ing if the pager
132a0 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61   does not have a
132b0 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61  n open write tra
132c0 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 6f 72  nsaction.  ** or
132d0 20 61 74 20 6c 65 61 73 74 20 61 20 52 45 53 45   at least a RESE
132e0 52 56 45 44 20 6c 6f 63 6b 2e 20 54 68 69 73 20  RVED lock. This 
132f0 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20  function may be 
13300 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72  called when ther
13310 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 77 72 69  e.  ** is no wri
13320 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  te-transaction a
13330 63 74 69 76 65 20 62 75 74 20 61 20 52 45 53 45  ctive but a RESE
13340 52 56 45 44 20 6f 72 20 67 72 65 61 74 65 72 20  RVED or greater 
13350 6c 6f 63 6b 20 69 73 0a 20 20 2a 2a 20 68 65 6c  lock is.  ** hel
13360 64 20 75 6e 64 65 72 20 74 77 6f 20 63 69 72 63  d under two circ
13370 75 6d 73 74 61 6e 63 65 73 3a 0a 20 20 2a 2a 0a  umstances:.  **.
13380 20 20 2a 2a 20 20 20 31 2e 20 41 66 74 65 72 20    **   1. After 
13390 61 20 73 75 63 63 65 73 73 66 75 6c 20 68 6f 74  a successful hot
133a0 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
133b0 6b 2c 20 69 74 20 69 73 20 63 61 6c 6c 65 64 20  k, it is called 
133c0 77 69 74 68 0a 20 20 2a 2a 20 20 20 20 20 20 65  with.  **      e
133d0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4e 4f 4e  State==PAGER_NON
133e0 45 20 61 6e 64 20 65 4c 6f 63 6b 3d 3d 45 58 43  E and eLock==EXC
133f0 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 20 20 2a  LUSIVE_LOCK..  *
13400 2a 0a 20 20 2a 2a 20 20 20 32 2e 20 49 66 20 61  *.  **   2. If a
13410 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68   connection with
13420 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78   locking_mode=ex
13430 63 6c 75 73 69 76 65 20 68 6f 6c 64 69 6e 67 20  clusive holding 
13440 61 6e 20 45 58 43 4c 55 53 49 56 45 20 0a 20 20  an EXCLUSIVE .  
13450 2a 2a 20 20 20 20 20 20 6c 6f 63 6b 20 73 77 69  **      lock swi
13460 74 63 68 65 73 20 62 61 63 6b 20 74 6f 20 6c 6f  tches back to lo
13470 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d 61  cking_mode=norma
13480 6c 20 61 6e 64 20 74 68 65 6e 20 65 78 65 63 75  l and then execu
13490 74 65 73 20 61 0a 20 20 2a 2a 20 20 20 20 20 20  tes a.  **      
134a0 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
134b0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
134c0 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20 65  is called with e
134d0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41  State==PAGER_REA
134e0 44 45 52 20 0a 20 20 2a 2a 20 20 20 20 20 20 61  DER .  **      a
134f0 6e 64 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  nd eLock==EXCLUS
13500 49 56 45 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68  IVE_LOCK when th
13510 65 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  e read-transacti
13520 6f 6e 20 69 73 20 63 6c 6f 73 65 64 2e 0a 20 20  on is closed..  
13530 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 61 73 73  */.  assert( ass
13540 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
13550 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73  pPager) );.  ass
13560 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
13570 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate!=PAGER_ERROR
13580 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
13590 2d 3e 65 53 74 61 74 65 3c 50 41 47 45 52 5f 57  ->eState<PAGER_W
135a0 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 26 26 20  RITER_LOCKED && 
135b0 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 52 45  pPager->eLock<RE
135c0 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SERVED_LOCK ){. 
135d0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
135e0 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 65 6c 65  _OK;.  }..  rele
135f0 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73  aseAllSavepoints
13600 28 70 50 61 67 65 72 29 3b 0a 20 20 61 73 73 65  (pPager);.  asse
13610 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
13620 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 50 61 67 65  r->jfd) || pPage
13630 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->pInJournal==0
13640 20 29 3b 0a 20 20 69 66 28 20 69 73 4f 70 65 6e   );.  if( isOpen
13650 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b  (pPager->jfd) ){
13660 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 61  .    assert( !pa
13670 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
13680 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6e  ) );..    /* Fin
13690 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61  alize the journa
136a0 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69  l file. */.    i
136b0 66 28 20 73 71 6c 69 74 65 33 49 73 4d 65 6d 4a  f( sqlite3IsMemJ
136c0 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a  ournal(pPager->j
136d0 66 64 29 20 29 7b 0a 20 20 20 20 20 20 61 73 73  fd) ){.      ass
136e0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
136f0 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
13700 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
13710 52 59 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  RY );.      sqli
13720 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
13730 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 65 6c  r->jfd);.    }el
13740 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  se if( pPager->j
13750 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
13760 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52  R_JOURNALMODE_TR
13770 55 4e 43 41 54 45 20 29 7b 0a 20 20 20 20 20 20  UNCATE ){.      
13780 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
13790 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20  nalOff==0 ){.   
137a0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
137b0 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  _OK;.      }else
137c0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
137d0 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
137e0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29  (pPager->jfd, 0)
137f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
13800 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
13810 66 66 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ff = 0;.    }els
13820 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f  e if( pPager->jo
13830 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
13840 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52  _JOURNALMODE_PER
13850 53 49 53 54 0a 20 20 20 20 20 20 7c 7c 20 28 70  SIST.      || (p
13860 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
13870 4d 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e  Mode && pPager->
13880 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47  journalMode!=PAG
13890 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
138a0 41 4c 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  AL).    ){.     
138b0 20 72 63 20 3d 20 7a 65 72 6f 4a 6f 75 72 6e 61   rc = zeroJourna
138c0 6c 48 64 72 28 70 50 61 67 65 72 2c 20 68 61 73  lHdr(pPager, has
138d0 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 70  Master);.      p
138e0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
138f0 66 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  f = 0;.    }else
13900 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
13910 62 72 61 6e 63 68 20 6d 61 79 20 62 65 20 65 78  branch may be ex
13920 65 63 75 74 65 64 20 77 69 74 68 20 50 61 67 65  ecuted with Page
13930 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d  r.journalMode==M
13940 45 4d 4f 52 59 20 69 66 0a 20 20 20 20 20 20 2a  EMORY if.      *
13950 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  * a hot-journal 
13960 77 61 73 20 6a 75 73 74 20 72 6f 6c 6c 65 64 20  was just rolled 
13970 62 61 63 6b 2e 20 49 6e 20 74 68 69 73 20 63 61  back. In this ca
13980 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  se the journal. 
13990 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 73 68 6f       ** file sho
139a0 75 6c 64 20 62 65 20 63 6c 6f 73 65 64 20 61 6e  uld be closed an
139b0 64 20 64 65 6c 65 74 65 64 2e 20 49 66 20 74 68  d deleted. If th
139c0 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72  is connection wr
139d0 69 74 65 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a  ites to.      **
139e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
139f0 6c 65 2c 20 69 74 20 77 69 6c 6c 20 64 6f 20 73  le, it will do s
13a00 6f 20 75 73 69 6e 67 20 61 6e 20 69 6e 2d 6d 65  o using an in-me
13a10 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 20 0a 20  mory journal. . 
13a20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73       */.      as
13a30 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
13a40 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
13a50 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c  _JOURNALMODE_DEL
13a60 45 54 45 20 0a 20 20 20 20 20 20 20 20 20 20 20  ETE .           
13a70 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  || pPager->journ
13a80 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
13a90 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
13aa0 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
13ab0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
13ac0 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
13ad0 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20  ALMODE_WAL .    
13ae0 20 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74    );.      sqlit
13af0 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
13b00 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 69 66  ->jfd);.      if
13b10 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  ( !pPager->tempF
13b20 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ile ){.        r
13b30 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  c = sqlite3OsDel
13b40 65 74 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73  ete(pPager->pVfs
13b50 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
13b60 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  al, 0);.      }.
13b70 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65      }.  }..#ifde
13b80 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
13b90 41 47 45 53 0a 20 20 73 71 6c 69 74 65 33 50 63  AGES.  sqlite3Pc
13ba0 61 63 68 65 49 74 65 72 61 74 65 44 69 72 74 79  acheIterateDirty
13bb0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
13bc0 2c 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65  , pager_set_page
13bd0 68 61 73 68 29 3b 0a 20 20 69 66 28 20 70 50 61  hash);.  if( pPa
13be0 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 20 26  ger->dbSize==0 &
13bf0 26 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  & sqlite3PcacheR
13c00 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
13c10 70 50 43 61 63 68 65 29 3e 30 20 29 7b 0a 20 20  pPCache)>0 ){.  
13c20 20 20 50 67 48 64 72 20 2a 70 20 3d 20 70 61 67    PgHdr *p = pag
13c30 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72  er_lookup(pPager
13c40 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 70 20  , 1);.    if( p 
13c50 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 61 67 65  ){.      p->page
13c60 48 61 73 68 20 3d 20 30 3b 0a 20 20 20 20 20 20  Hash = 0;.      
13c70 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
13c80 66 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  f(p);.    }.  }.
13c90 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65  #endif..  sqlite
13ca0 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
13cb0 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
13cc0 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 49  l);.  pPager->pI
13cd0 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
13ce0 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30  pPager->nRec = 0
13cf0 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  ;.  sqlite3Pcach
13d00 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61 67 65 72  eCleanAll(pPager
13d10 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 73 71  ->pPCache);.  sq
13d20 6c 69 74 65 33 50 63 61 63 68 65 54 72 75 6e 63  lite3PcacheTrunc
13d30 61 74 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ate(pPager->pPCa
13d40 63 68 65 2c 20 70 50 61 67 65 72 2d 3e 64 62 53  che, pPager->dbS
13d50 69 7a 65 29 3b 0a 0a 20 20 69 66 28 20 70 61 67  ize);..  if( pag
13d60 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
13d70 20 29 7b 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20   ){.    /* Drop 
13d80 74 68 65 20 57 41 4c 20 77 72 69 74 65 2d 6c 6f  the WAL write-lo
13d90 63 6b 2c 20 69 66 20 61 6e 79 2e 20 41 6c 73 6f  ck, if any. Also
13da0 2c 20 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74  , if the connect
13db0 69 6f 6e 20 77 61 73 20 69 6e 20 0a 20 20 20 20  ion was in .    
13dc0 2a 2a 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  ** locking_mode=
13dd0 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 62  exclusive mode b
13de0 75 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 2c  ut is no longer,
13df0 20 64 72 6f 70 20 74 68 65 20 45 58 43 4c 55 53   drop the EXCLUS
13e00 49 56 45 20 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b  IVE .    ** lock
13e10 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
13e20 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
13e30 2a 2f 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c  */.    rc2 = sql
13e40 69 74 65 33 57 61 6c 45 6e 64 57 72 69 74 65 54  ite3WalEndWriteT
13e50 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
13e60 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20 61 73  r->pWal);.    as
13e70 73 65 72 74 28 20 72 63 32 3d 3d 53 51 4c 49 54  sert( rc2==SQLIT
13e80 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66  E_OK );.  }.  if
13e90 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  ( !pPager->exclu
13ea0 73 69 76 65 4d 6f 64 65 20 0a 20 20 20 26 26 20  siveMode .   && 
13eb0 28 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  (!pagerUseWal(pP
13ec0 61 67 65 72 29 20 7c 7c 20 73 71 6c 69 74 65 33  ager) || sqlite3
13ed0 57 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64 65  WalExclusiveMode
13ee0 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 30  (pPager->pWal, 0
13ef0 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 63 32 20  )).  ){.    rc2 
13f00 3d 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28  = pagerUnlockDb(
13f10 70 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c  pPager, SHARED_L
13f20 4f 43 4b 29 3b 0a 20 20 20 20 70 50 61 67 65 72  OCK);.    pPager
13f30 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
13f40 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61  e = 0;.  }.  pPa
13f50 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41  ger->eState = PA
13f60 47 45 52 5f 52 45 41 44 45 52 3b 0a 20 20 70 50  GER_READER;.  pP
13f70 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20  ager->setMaster 
13f80 3d 20 30 3b 0a 0a 20 20 72 65 74 75 72 6e 20 28  = 0;..  return (
13f90 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f 72 63  rc==SQLITE_OK?rc
13fa0 32 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  2:rc);.}../*.** 
13fb0 45 78 65 63 75 74 65 20 61 20 72 6f 6c 6c 62 61  Execute a rollba
13fc0 63 6b 20 69 66 20 61 20 74 72 61 6e 73 61 63 74  ck if a transact
13fd0 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e  ion is active an
13fe0 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 2a 2a  d unlock the .**
13ff0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
14000 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
14010 67 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20  ger has already 
14020 65 6e 74 65 72 65 64 20 74 68 65 20 45 52 52 4f  entered the ERRO
14030 52 20 73 74 61 74 65 2c 20 64 6f 20 6e 6f 74 20  R state, do not 
14040 61 74 74 65 6d 70 74 20 0a 2a 2a 20 74 68 65 20  attempt .** the 
14050 72 6f 6c 6c 62 61 63 6b 20 61 74 20 74 68 69 73  rollback at this
14060 20 74 69 6d 65 2e 20 49 6e 73 74 65 61 64 2c 20   time. Instead, 
14070 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 69  pager_unlock() i
14080 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 0a 2a 2a  s called. The.**
14090 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75   call to pager_u
140a0 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c 20 64 69 73  nlock() will dis
140b0 63 61 72 64 20 61 6c 6c 20 69 6e 2d 6d 65 6d 6f  card all in-memo
140c0 72 79 20 70 61 67 65 73 2c 20 75 6e 6c 6f 63 6b  ry pages, unlock
140d0 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
140e0 20 66 69 6c 65 20 61 6e 64 20 6d 6f 76 65 20 74   file and move t
140f0 68 65 20 70 61 67 65 72 20 62 61 63 6b 20 74 6f  he pager back to
14100 20 4f 50 45 4e 20 73 74 61 74 65 2e 20 49 66 20   OPEN state. If 
14110 74 68 69 73 20 0a 2a 2a 20 6d 65 61 6e 73 20 74  this .** means t
14120 68 61 74 20 74 68 65 72 65 20 69 73 20 61 20 68  hat there is a h
14130 6f 74 2d 6a 6f 75 72 6e 61 6c 20 6c 65 66 74 20  ot-journal left 
14140 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  in the file-syst
14150 65 6d 2c 20 74 68 65 20 6e 65 78 74 20 0a 2a 2a  em, the next .**
14160 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6f   connection to o
14170 62 74 61 69 6e 20 61 20 73 68 61 72 65 64 20 6c  btain a shared l
14180 6f 63 6b 20 6f 6e 20 74 68 65 20 70 61 67 65 72  ock on the pager
14190 20 28 77 68 69 63 68 20 6d 61 79 20 62 65 20 74   (which may be t
141a0 68 69 73 20 6f 6e 65 29 20 0a 2a 2a 20 77 69 6c  his one) .** wil
141b0 6c 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 0a  l roll it back..
141c0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
141d0 65 72 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61  er has not alrea
141e0 64 79 20 65 6e 74 65 72 65 64 20 74 68 65 20 45  dy entered the E
141f0 52 52 4f 52 20 73 74 61 74 65 2c 20 62 75 74 20  RROR state, but 
14200 61 6e 20 49 4f 20 6f 72 0a 2a 2a 20 6d 61 6c 6c  an IO or.** mall
14210 6f 63 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  oc error occurs 
14220 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63  during a rollbac
14230 6b 2c 20 74 68 65 6e 20 74 68 69 73 20 77 69 6c  k, then this wil
14240 6c 20 69 74 73 65 6c 66 20 63 61 75 73 65 20 0a  l itself cause .
14250 2a 2a 20 74 68 65 20 70 61 67 65 72 20 74 6f 20  ** the pager to 
14260 65 6e 74 65 72 20 74 68 65 20 45 52 52 4f 52 20  enter the ERROR 
14270 73 74 61 74 65 2e 20 57 68 69 63 68 20 77 69 6c  state. Which wil
14280 6c 20 62 65 20 63 6c 65 61 72 65 64 20 62 79 20  l be cleared by 
14290 74 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 70  the.** call to p
142a0 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 2c 20 61  ager_unlock(), a
142b0 73 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76  s described abov
142c0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
142d0 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64  d pagerUnlockAnd
142e0 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a  Rollback(Pager *
142f0 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70  pPager){.  if( p
14300 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50  Pager->eState!=P
14310 41 47 45 52 5f 45 52 52 4f 52 20 26 26 20 70 50  AGER_ERROR && pP
14320 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
14330 47 45 52 5f 4f 50 45 4e 20 29 7b 0a 20 20 20 20  GER_OPEN ){.    
14340 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
14350 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
14360 72 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50  r) );.    if( pP
14370 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
14380 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
14390 44 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  D ){.      sqlit
143a0 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
143b0 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 73 71 6c  loc();.      sql
143c0 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63  ite3PagerRollbac
143d0 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  k(pPager);.     
143e0 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
143f0 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 7d  nMalloc();.    }
14400 65 6c 73 65 20 69 66 28 20 21 70 50 61 67 65 72  else if( !pPager
14410 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
14420 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
14430 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
14440 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b  =PAGER_READER );
14450 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65 6e 64  .      pager_end
14460 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  _transaction(pPa
14470 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  ger, 0);.    }. 
14480 20 7d 0a 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63   }.  pager_unloc
14490 6b 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a  k(pPager);.}../*
144a0 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 61 44  .** Parameter aD
144b0 61 74 61 20 6d 75 73 74 20 70 6f 69 6e 74 20 74  ata must point t
144c0 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20 70 50  o a buffer of pP
144d0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62  ager->pageSize b
144e0 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 2e  ytes.** of data.
144f0 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65 74   Compute and ret
14500 75 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20 62  urn a checksum b
14510 61 73 65 64 20 6f 6e 74 20 74 68 65 20 63 6f 6e  ased ont the con
14520 74 65 6e 74 73 20 6f 66 20 74 68 65 20 0a 2a 2a  tents of the .**
14530 20 70 61 67 65 20 6f 66 20 64 61 74 61 20 61 6e   page of data an
14540 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61  d the current va
14550 6c 75 65 20 6f 66 20 70 50 61 67 65 72 2d 3e 63  lue of pPager->c
14560 6b 73 75 6d 49 6e 69 74 2e 0a 2a 2a 0a 2a 2a 20  ksumInit..**.** 
14570 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72 65  This is not a re
14580 61 6c 20 63 68 65 63 6b 73 75 6d 2e 20 49 74 20  al checksum. It 
14590 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 74  is really just t
145a0 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a  he sum of the .*
145b0 2a 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c  * random initial
145c0 20 76 61 6c 75 65 20 28 70 50 61 67 65 72 2d 3e   value (pPager->
145d0 63 6b 73 75 6d 49 6e 69 74 29 20 61 6e 64 20 65  cksumInit) and e
145e0 76 65 72 79 20 32 30 30 74 68 20 62 79 74 65 0a  very 200th byte.
145f0 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20 64  ** of the page d
14600 61 74 61 2c 20 73 74 61 72 74 69 6e 67 20 77 69  ata, starting wi
14610 74 68 20 62 79 74 65 20 6f 66 66 73 65 74 20 28  th byte offset (
14620 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
14630 25 32 30 30 29 2e 0a 2a 2a 20 45 61 63 68 20 62  %200)..** Each b
14640 79 74 65 20 69 73 20 69 6e 74 65 72 70 72 65 74  yte is interpret
14650 65 64 20 61 73 20 61 6e 20 38 2d 62 69 74 20 75  ed as an 8-bit u
14660 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 2e  nsigned integer.
14670 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 69 6e 67 20  .**.** Changing 
14680 74 68 65 20 66 6f 72 6d 75 6c 61 20 75 73 65 64  the formula used
14690 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 69 73   to compute this
146a0 20 63 68 65 63 6b 73 75 6d 20 72 65 73 75 6c 74   checksum result
146b0 73 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 63 6f 6d  s in an.** incom
146c0 70 61 74 69 62 6c 65 20 6a 6f 75 72 6e 61 6c 20  patible journal 
146d0 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a  file format..**.
146e0 2a 2a 20 49 66 20 6a 6f 75 72 6e 61 6c 20 63 6f  ** If journal co
146f0 72 72 75 70 74 69 6f 6e 20 6f 63 63 75 72 73 20  rruption occurs 
14700 64 75 65 20 74 6f 20 61 20 70 6f 77 65 72 20 66  due to a power f
14710 61 69 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73 74  ailure, the most
14720 20 6c 69 6b 65 6c 79 20 0a 2a 2a 20 73 63 65 6e   likely .** scen
14730 61 72 69 6f 20 69 73 20 74 68 61 74 20 6f 6e 65  ario is that one
14740 20 65 6e 64 20 6f 72 20 74 68 65 20 6f 74 68 65   end or the othe
14750 72 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20  r of the record 
14760 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 2e  will be changed.
14770 20 0a 2a 2a 20 49 74 20 69 73 20 6d 75 63 68 20   .** It is much 
14780 6c 65 73 73 20 6c 69 6b 65 6c 79 20 74 68 61 74  less likely that
14790 20 74 68 65 20 74 77 6f 20 65 6e 64 73 20 6f 66   the two ends of
147a0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63   the journal rec
147b0 6f 72 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 63  ord will be.** c
147c0 6f 72 72 65 63 74 20 61 6e 64 20 74 68 65 20 6d  orrect and the m
147d0 69 64 64 6c 65 20 62 65 20 63 6f 72 72 75 70 74  iddle be corrupt
147e0 2e 20 20 54 68 75 73 2c 20 74 68 69 73 20 22 63  .  Thus, this "c
147f0 68 65 63 6b 73 75 6d 22 20 73 63 68 65 6d 65 2c  hecksum" scheme,
14800 0a 2a 2a 20 74 68 6f 75 67 68 20 66 61 73 74 20  .** though fast 
14810 61 6e 64 20 73 69 6d 70 6c 65 2c 20 63 61 74 63  and simple, catc
14820 68 65 73 20 74 68 65 20 6d 6f 73 74 6c 79 20 6c  hes the mostly l
14830 69 6b 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63 6f  ikely kind of co
14840 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  rruption..*/.sta
14850 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 63 6b  tic u32 pager_ck
14860 73 75 6d 28 50 61 67 65 72 20 2a 70 50 61 67 65  sum(Pager *pPage
14870 72 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 44 61  r, const u8 *aDa
14880 74 61 29 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d  ta){.  u32 cksum
14890 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d   = pPager->cksum
148a0 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 2f 2a  Init;         /*
148b0 20 43 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20   Checksum value 
148c0 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69  to return */.  i
148d0 6e 74 20 69 20 3d 20 70 50 61 67 65 72 2d 3e 70  nt i = pPager->p
148e0 61 67 65 53 69 7a 65 2d 32 30 30 3b 20 20 20 20  ageSize-200;    
148f0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
14900 75 6e 74 65 72 20 2a 2f 0a 20 20 77 68 69 6c 65  unter */.  while
14910 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b 73  ( i>0 ){.    cks
14920 75 6d 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b 0a  um += aData[i];.
14930 20 20 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20 20      i -= 200;.  
14940 7d 0a 20 20 72 65 74 75 72 6e 20 63 6b 73 75 6d  }.  return cksum
14950 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6f 72  ;.}../*.** Repor
14960 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  t the current pa
14970 67 65 20 73 69 7a 65 20 61 6e 64 20 6e 75 6d 62  ge size and numb
14980 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 20 62  er of reserved b
14990 79 74 65 73 20 62 61 63 6b 0a 2a 2a 20 74 6f 20  ytes back.** to 
149a0 74 68 65 20 63 6f 64 65 63 2e 0a 2a 2f 0a 23 69  the codec..*/.#i
149b0 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
149c0 43 4f 44 45 43 0a 73 74 61 74 69 63 20 76 6f 69  CODEC.static voi
149d0 64 20 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a  d pagerReportSiz
149e0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
149f0 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  {.  if( pPager->
14a00 78 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 20 29  xCodecSizeChng )
14a10 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 78 43  {.    pPager->xC
14a20 6f 64 65 63 53 69 7a 65 43 68 6e 67 28 70 50 61  odecSizeChng(pPa
14a30 67 65 72 2d 3e 70 43 6f 64 65 63 2c 20 70 50 61  ger->pCodec, pPa
14a40 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20  ger->pageSize,. 
14a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a60 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 70            (int)p
14a70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 29  Pager->nReserve)
14a80 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20  ;.  }.}.#else.# 
14a90 64 65 66 69 6e 65 20 70 61 67 65 72 52 65 70 6f  define pagerRepo
14aa0 72 74 53 69 7a 65 28 58 29 20 20 20 20 20 2f 2a  rtSize(X)     /*
14ab0 20 4e 6f 2d 6f 70 20 69 66 20 77 65 20 64 6f 20   No-op if we do 
14ac0 6e 6f 74 20 73 75 70 70 6f 72 74 20 61 20 63 6f  not support a co
14ad0 64 65 63 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f  dec */.#endif../
14ae0 2a 0a 2a 2a 20 52 65 61 64 20 61 20 73 69 6e 67  *.** Read a sing
14af0 6c 65 20 70 61 67 65 20 66 72 6f 6d 20 65 69 74  le page from eit
14b00 68 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  her the journal 
14b10 66 69 6c 65 20 28 69 66 20 69 73 4d 61 69 6e 4a  file (if isMainJ
14b20 72 6e 6c 3d 3d 31 29 20 6f 72 0a 2a 2a 20 66 72  rnl==1) or.** fr
14b30 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  om the sub-journ
14b40 61 6c 20 28 69 66 20 69 73 4d 61 69 6e 4a 72 6e  al (if isMainJrn
14b50 6c 3d 3d 30 29 20 61 6e 64 20 70 6c 61 79 62 61  l==0) and playba
14b60 63 6b 20 74 68 61 74 20 70 61 67 65 2e 0a 2a 2a  ck that page..**
14b70 20 54 68 65 20 70 61 67 65 20 62 65 67 69 6e 73   The page begins
14b80 20 61 74 20 6f 66 66 73 65 74 20 2a 70 4f 66 66   at offset *pOff
14b90 73 65 74 20 69 6e 74 6f 20 74 68 65 20 66 69 6c  set into the fil
14ba0 65 2e 20 54 68 65 20 2a 70 4f 66 66 73 65 74 0a  e. The *pOffset.
14bb0 2a 2a 20 76 61 6c 75 65 20 69 73 20 69 6e 63 72  ** value is incr
14bc0 65 61 73 65 64 20 74 6f 20 74 68 65 20 73 74 61  eased to the sta
14bd0 72 74 20 6f 66 20 74 68 65 20 6e 65 78 74 20 70  rt of the next p
14be0 61 67 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  age in the journ
14bf0 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61  al..**.** The ma
14c00 69 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  in rollback jour
14c10 6e 61 6c 20 75 73 65 73 20 63 68 65 63 6b 73 75  nal uses checksu
14c20 6d 73 20 2d 20 74 68 65 20 73 74 61 74 65 6d 65  ms - the stateme
14c30 6e 74 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20  nt journal does 
14c40 0a 2a 2a 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49  .** not..**.** I
14c50 66 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  f the page numbe
14c60 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 72 65  r of the page re
14c70 63 6f 72 64 20 72 65 61 64 20 66 72 6f 6d 20 74  cord read from t
14c80 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c  he (sub-)journal
14c90 20 66 69 6c 65 0a 2a 2a 20 69 73 20 67 72 65 61   file.** is grea
14ca0 74 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72  ter than the cur
14cb0 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 50 61  rent value of Pa
14cc0 67 65 72 2e 64 62 53 69 7a 65 2c 20 74 68 65 6e  ger.dbSize, then
14cd0 20 70 6c 61 79 62 61 63 6b 20 69 73 0a 2a 2a 20   playback is.** 
14ce0 73 6b 69 70 70 65 64 20 61 6e 64 20 53 51 4c 49  skipped and SQLI
14cf0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
14d00 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 6f 6e  d..**.** If pDon
14d10 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74  e is not NULL, t
14d20 68 65 6e 20 69 74 20 69 73 20 61 20 72 65 63 6f  hen it is a reco
14d30 72 64 20 6f 66 20 70 61 67 65 73 20 74 68 61 74  rd of pages that
14d40 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a 2a 2a   have already.**
14d50 20 62 65 65 6e 20 70 6c 61 79 65 64 20 62 61 63   been played bac
14d60 6b 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20  k.  If the page 
14d70 61 74 20 2a 70 4f 66 66 73 65 74 20 68 61 73 20  at *pOffset has 
14d80 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70 6c 61  already been pla
14d90 79 65 64 20 62 61 63 6b 0a 2a 2a 20 28 69 66 20  yed back.** (if 
14da0 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
14db0 67 20 70 44 6f 6e 65 20 62 69 74 20 69 73 20 73  g pDone bit is s
14dc0 65 74 29 20 74 68 65 6e 20 73 6b 69 70 20 74 68  et) then skip th
14dd0 65 20 70 6c 61 79 62 61 63 6b 2e 0a 2a 2a 20 4d  e playback..** M
14de0 61 6b 65 20 73 75 72 65 20 74 68 65 20 70 44 6f  ake sure the pDo
14df0 6e 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e  ne bit correspon
14e00 64 69 6e 67 20 74 6f 20 74 68 65 20 2a 70 4f 66  ding to the *pOf
14e10 66 73 65 74 20 70 61 67 65 20 69 73 20 73 65 74  fset page is set
14e20 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 72 65 74  .** prior to ret
14e30 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66  urning..**.** If
14e40 20 74 68 65 20 70 61 67 65 20 72 65 63 6f 72 64   the page record
14e50 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79   is successfully
14e60 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28   read from the (
14e70 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c  sub-)journal fil
14e80 65 0a 2a 2a 20 61 6e 64 20 70 6c 61 79 65 64 20  e.** and played 
14e90 62 61 63 6b 2c 20 74 68 65 6e 20 53 51 4c 49 54  back, then SQLIT
14ea0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
14eb0 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  . If an IO error
14ec0 20 6f 63 63 75 72 73 0a 2a 2a 20 77 68 69 6c 65   occurs.** while
14ed0 20 72 65 61 64 69 6e 67 20 74 68 65 20 72 65 63   reading the rec
14ee0 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75  ord from the (su
14ef0 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  b-)journal file 
14f00 6f 72 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67  or while writing
14f10 0a 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62  .** to the datab
14f20 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 74  ase file, then t
14f30 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  he IO error code
14f40 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
14f50 20 64 61 74 61 0a 2a 2a 20 69 73 20 73 75 63 63   data.** is succ
14f60 65 73 73 66 75 6c 6c 79 20 72 65 61 64 20 66 72  essfully read fr
14f70 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75  om the (sub-)jou
14f80 72 6e 61 6c 20 66 69 6c 65 20 62 75 74 20 61 70  rnal file but ap
14f90 70 65 61 72 73 20 74 6f 20 62 65 0a 2a 2a 20 63  pears to be.** c
14fa0 6f 72 72 75 70 74 65 64 2c 20 53 51 4c 49 54 45  orrupted, SQLITE
14fb0 5f 44 4f 4e 45 20 69 73 20 72 65 74 75 72 6e 65  _DONE is returne
14fc0 64 2e 20 44 61 74 61 20 69 73 20 63 6f 6e 73 69  d. Data is consi
14fd0 64 65 72 65 64 20 63 6f 72 72 75 70 74 65 64 20  dered corrupted 
14fe0 69 6e 0a 2a 2a 20 74 77 6f 20 63 69 72 63 75 6d  in.** two circum
14ff0 73 74 61 6e 63 65 73 3a 0a 2a 2a 20 0a 2a 2a 20  stances:.** .** 
15000 20 20 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72    * If the recor
15010 64 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73  d page-number is
15020 20 69 6c 6c 65 67 61 6c 20 28 30 20 6f 72 20 50   illegal (0 or P
15030 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 29 2c 20 6f  AGER_MJ_PGNO), o
15040 72 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20  r.**   * If the 
15050 72 65 63 6f 72 64 20 69 73 20 62 65 69 6e 67 20  record is being 
15060 72 6f 6c 6c 65 64 20 62 61 63 6b 20 66 72 6f 6d  rolled back from
15070 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
15080 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 61 6e  l file.**     an
15090 64 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 66  d the checksum f
150a0 69 65 6c 64 20 64 6f 65 73 20 6e 6f 74 20 6d 61  ield does not ma
150b0 74 63 68 20 74 68 65 20 72 65 63 6f 72 64 20 63  tch the record c
150c0 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 65  ontent..**.** Ne
150d0 69 74 68 65 72 20 6f 66 20 74 68 65 73 65 20 74  ither of these t
150e0 77 6f 20 73 63 65 6e 61 72 69 6f 73 20 61 72 65  wo scenarios are
150f0 20 70 6f 73 73 69 62 6c 65 20 64 75 72 69 6e 67   possible during
15100 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c   a savepoint rol
15110 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  lback..**.** If 
15120 74 68 69 73 20 69 73 20 61 20 73 61 76 65 70 6f  this is a savepo
15130 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68  int rollback, th
15140 65 6e 20 6d 65 6d 6f 72 79 20 6d 61 79 20 68 61  en memory may ha
15150 76 65 20 74 6f 20 62 65 20 64 79 6e 61 6d 69 63  ve to be dynamic
15160 61 6c 6c 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65  ally.** allocate
15170 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
15180 6f 6e 2e 20 49 66 20 74 68 69 73 20 69 73 20 74  on. If this is t
15190 68 65 20 63 61 73 65 20 61 6e 64 20 61 6e 20 61  he case and an a
151a0 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c  llocation fails,
151b0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  .** SQLITE_NOMEM
151c0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
151d0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
151e0 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
151f0 61 67 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50  age(.  Pager *pP
15200 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  ager,           
15210 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
15220 72 20 62 65 69 6e 67 20 70 6c 61 79 65 64 20 62  r being played b
15230 61 63 6b 20 2a 2f 0a 20 20 69 36 34 20 2a 70 4f  ack */.  i64 *pO
15240 66 66 73 65 74 2c 20 20 20 20 20 20 20 20 20 20  ffset,          
15250 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
15260 20 6f 66 20 72 65 63 6f 72 64 20 74 6f 20 70 6c   of record to pl
15270 61 79 62 61 63 6b 20 2a 2f 0a 20 20 42 69 74 76  ayback */.  Bitv
15280 65 63 20 2a 70 44 6f 6e 65 2c 20 20 20 20 20 20  ec *pDone,      
15290 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74            /* Bit
152a0 76 65 63 20 6f 66 20 70 61 67 65 73 20 61 6c 72  vec of pages alr
152b0 65 61 64 79 20 70 6c 61 79 65 64 20 62 61 63 6b  eady played back
152c0 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4d 61 69 6e   */.  int isMain
152d0 4a 72 6e 6c 2c 20 20 20 20 20 20 20 20 20 20 20  Jrnl,           
152e0 20 20 20 20 2f 2a 20 31 20 2d 3e 20 6d 61 69 6e      /* 1 -> main
152f0 20 6a 6f 75 72 6e 61 6c 2e 20 30 20 2d 3e 20 73   journal. 0 -> s
15300 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20  ub-journal. */. 
15310 20 69 6e 74 20 69 73 53 61 76 65 70 6e 74 20 20   int isSavepnt  
15320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15330 2a 20 54 72 75 65 20 66 6f 72 20 61 20 73 61 76  * True for a sav
15340 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20  epoint rollback 
15350 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
15360 20 20 50 67 48 64 72 20 2a 70 50 67 3b 20 20 20    PgHdr *pPg;   
15370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15380 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 70  /* An existing p
15390 61 67 65 20 69 6e 20 74 68 65 20 63 61 63 68 65  age in the cache
153a0 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b   */.  Pgno pgno;
153b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
153c0 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20      /* The page 
153d0 6e 75 6d 62 65 72 20 6f 66 20 61 20 70 61 67 65  number of a page
153e0 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20   in journal */. 
153f0 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20   u32 cksum;     
15400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15410 2a 20 43 68 65 63 6b 73 75 6d 20 75 73 65 64 20  * Checksum used 
15420 66 6f 72 20 73 61 6e 69 74 79 20 63 68 65 63 6b  for sanity check
15430 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61  ing */.  char *a
15440 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20  Data;           
15450 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72         /* Tempor
15460 61 72 79 20 73 74 6f 72 61 67 65 20 66 6f 72 20  ary storage for 
15470 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 73 71  the page */.  sq
15480 6c 69 74 65 33 5f 66 69 6c 65 20 2a 6a 66 64 3b  lite3_file *jfd;
15490 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
154a0 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
154b0 6f 72 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e  or for the journ
154c0 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  al file */.  int
154d0 20 69 73 53 79 6e 63 65 64 3b 20 20 20 20 20 20   isSynced;      
154e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
154f0 75 65 20 69 66 20 6a 6f 75 72 6e 61 6c 20 70 61  ue if journal pa
15500 67 65 20 69 73 20 73 79 6e 63 65 64 20 2a 2f 0a  ge is synced */.
15510 0a 20 20 61 73 73 65 72 74 28 20 28 69 73 4d 61  .  assert( (isMa
15520 69 6e 4a 72 6e 6c 26 7e 31 29 3d 3d 30 20 29 3b  inJrnl&~1)==0 );
15530 20 20 20 20 20 20 2f 2a 20 69 73 4d 61 69 6e 4a        /* isMainJ
15540 72 6e 6c 20 69 73 20 30 20 6f 72 20 31 20 2a 2f  rnl is 0 or 1 */
15550 0a 20 20 61 73 73 65 72 74 28 20 28 69 73 53 61  .  assert( (isSa
15560 76 65 70 6e 74 26 7e 31 29 3d 3d 30 20 29 3b 20  vepnt&~1)==0 ); 
15570 20 20 20 20 20 20 2f 2a 20 69 73 53 61 76 65 70        /* isSavep
15580 6e 74 20 69 73 20 30 20 6f 72 20 31 20 2a 2f 0a  nt is 0 or 1 */.
15590 20 20 61 73 73 65 72 74 28 20 69 73 4d 61 69 6e    assert( isMain
155a0 4a 72 6e 6c 20 7c 7c 20 70 44 6f 6e 65 20 29 3b  Jrnl || pDone );
155b0 20 20 20 20 20 2f 2a 20 70 44 6f 6e 65 20 61 6c       /* pDone al
155c0 77 61 79 73 20 75 73 65 64 20 6f 6e 20 73 75 62  ways used on sub
155d0 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f 0a 20 20 61  -journals */.  a
155e0 73 73 65 72 74 28 20 69 73 53 61 76 65 70 6e 74  ssert( isSavepnt
155f0 20 7c 7c 20 70 44 6f 6e 65 3d 3d 30 20 29 3b 20   || pDone==0 ); 
15600 20 20 2f 2a 20 70 44 6f 6e 65 20 6e 65 76 65 72    /* pDone never
15610 20 75 73 65 64 20 6f 6e 20 6e 6f 6e 2d 73 61 76   used on non-sav
15620 65 70 6f 69 6e 74 20 2a 2f 0a 0a 20 20 61 44 61  epoint */..  aDa
15630 74 61 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d  ta = pPager->pTm
15640 70 53 70 61 63 65 3b 0a 20 20 61 73 73 65 72 74  pSpace;.  assert
15650 28 20 61 44 61 74 61 20 29 3b 20 20 20 20 20 20  ( aData );      
15660 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61     /* Temp stora
15670 67 65 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72  ge must have alr
15680 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61  eady been alloca
15690 74 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ted */.  assert(
156a0 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
156b0 67 65 72 29 3d 3d 30 20 7c 7c 20 28 21 69 73 4d  ger)==0 || (!isM
156c0 61 69 6e 4a 72 6e 6c 20 26 26 20 69 73 53 61 76  ainJrnl && isSav
156d0 65 70 6e 74 29 20 29 3b 0a 0a 20 20 2f 2a 20 45  epnt) );..  /* E
156e0 69 74 68 65 72 20 74 68 65 20 73 74 61 74 65 20  ither the state 
156f0 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
15700 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
15710 48 45 4d 4f 44 20 28 61 20 74 72 61 6e 73 61 63  HEMOD (a transac
15720 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f 72 20 73 61  tion .  ** or sa
15730 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b  vepoint rollback
15740 20 64 6f 6e 65 20 61 74 20 74 68 65 20 72 65 71   done at the req
15750 75 65 73 74 20 6f 66 20 74 68 65 20 63 61 6c 6c  uest of the call
15760 65 72 29 20 6f 72 20 74 68 69 73 20 69 73 0a 20  er) or this is. 
15770 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   ** a hot-journa
15780 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 66 20 69  l rollback. If i
15790 74 20 69 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  t is a hot-journ
157a0 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65  al rollback, the
157b0 20 70 61 67 65 72 0a 20 20 2a 2a 20 69 73 20 69   pager.  ** is i
157c0 6e 20 73 74 61 74 65 20 4f 50 45 4e 20 61 6e 64  n state OPEN and
157d0 20 68 6f 6c 64 73 20 61 6e 20 45 58 43 4c 55 53   holds an EXCLUS
157e0 49 56 45 20 6c 6f 63 6b 2e 20 48 6f 74 2d 6a 6f  IVE lock. Hot-jo
157f0 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 0a 20  urnal rollback. 
15800 20 2a 2a 20 6f 6e 6c 79 20 72 65 61 64 73 20 66   ** only reads f
15810 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75  rom the main jou
15820 72 6e 61 6c 2c 20 6e 6f 74 20 74 68 65 20 73 75  rnal, not the su
15830 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a  b-journal..  */.
15840 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
15850 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
15860 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a  WRITER_CACHEMOD.
15870 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65         || (pPage
15880 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
15890 5f 4f 50 45 4e 20 26 26 20 70 50 61 67 65 72 2d  _OPEN && pPager-
158a0 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  >eLock==EXCLUSIV
158b0 45 5f 4c 4f 43 4b 29 0a 20 20 29 3b 0a 20 20 61  E_LOCK).  );.  a
158c0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
158d0 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49  State>=PAGER_WRI
158e0 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 7c 7c 20  TER_CACHEMOD || 
158f0 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 3b 0a 0a 20  isMainJrnl );.. 
15900 20 2f 2a 20 52 65 61 64 20 74 68 65 20 70 61 67   /* Read the pag
15910 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 70 61 67  e number and pag
15920 65 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20  e data from the 
15930 6a 6f 75 72 6e 61 6c 20 6f 72 20 73 75 62 2d 6a  journal or sub-j
15940 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65  ournal.  ** file
15950 2e 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  . Return an erro
15960 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61  r code to the ca
15970 6c 6c 65 72 20 69 66 20 61 6e 20 49 4f 20 65 72  ller if an IO er
15980 72 6f 72 20 6f 63 63 75 72 73 2e 0a 20 20 2a 2f  ror occurs..  */
15990 0a 20 20 6a 66 64 20 3d 20 69 73 4d 61 69 6e 4a  .  jfd = isMainJ
159a0 72 6e 6c 20 3f 20 70 50 61 67 65 72 2d 3e 6a 66  rnl ? pPager->jf
159b0 64 20 3a 20 70 50 61 67 65 72 2d 3e 73 6a 66 64  d : pPager->sjfd
159c0 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62  ;.  rc = read32b
159d0 69 74 73 28 6a 66 64 2c 20 2a 70 4f 66 66 73 65  its(jfd, *pOffse
159e0 74 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66 28  t, &pgno);.  if(
159f0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
15a00 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63   return rc;.  rc
15a10 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
15a20 28 6a 66 64 2c 20 28 75 38 2a 29 61 44 61 74 61  (jfd, (u8*)aData
15a30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
15a40 7a 65 2c 20 28 2a 70 4f 66 66 73 65 74 29 2b 34  ze, (*pOffset)+4
15a50 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
15a60 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
15a70 72 63 3b 0a 20 20 2a 70 4f 66 66 73 65 74 20 2b  rc;.  *pOffset +
15a80 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
15a90 7a 65 20 2b 20 34 20 2b 20 69 73 4d 61 69 6e 4a  ze + 4 + isMainJ
15aa0 72 6e 6c 2a 34 3b 0a 0a 20 20 2f 2a 20 53 61 6e  rnl*4;..  /* San
15ab0 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20  ity checking on 
15ac0 74 68 65 20 70 61 67 65 2e 20 20 54 68 69 73 20  the page.  This 
15ad0 69 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e  is more importan
15ae0 74 20 74 68 61 74 20 49 20 6f 72 69 67 69 6e 61  t that I origina
15af0 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67 68 74  lly.  ** thought
15b00 2e 20 20 49 66 20 61 20 70 6f 77 65 72 20 66 61  .  If a power fa
15b10 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77 68 69  ilure occurs whi
15b20 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  le the journal i
15b30 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c  s being written,
15b40 0a 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64 20 63  .  ** it could c
15b50 61 75 73 65 20 69 6e 76 61 6c 69 64 20 64 61 74  ause invalid dat
15b60 61 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  a to be written 
15b70 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
15b80 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 0a 20 20  .  We need to.  
15b90 2a 2a 20 64 65 74 65 63 74 20 74 68 69 73 20 69  ** detect this i
15ba0 6e 76 61 6c 69 64 20 64 61 74 61 20 28 77 69 74  nvalid data (wit
15bb0 68 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69  h high probabili
15bc0 74 79 29 20 61 6e 64 20 69 67 6e 6f 72 65 20 69  ty) and ignore i
15bd0 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67  t..  */.  if( pg
15be0 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50  no==0 || pgno==P
15bf0 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
15c00 67 65 72 29 20 29 7b 0a 20 20 20 20 61 73 73 65  ger) ){.    asse
15c10 72 74 28 20 21 69 73 53 61 76 65 70 6e 74 20 29  rt( !isSavepnt )
15c20 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
15c30 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20  ITE_DONE;.  }.  
15c40 69 66 28 20 70 67 6e 6f 3e 28 50 67 6e 6f 29 70  if( pgno>(Pgno)p
15c50 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 7c 7c  Pager->dbSize ||
15c60 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65   sqlite3BitvecTe
15c70 73 74 28 70 44 6f 6e 65 2c 20 70 67 6e 6f 29 20  st(pDone, pgno) 
15c80 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
15c90 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69  LITE_OK;.  }.  i
15ca0 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b  f( isMainJrnl ){
15cb0 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 33 32  .    rc = read32
15cc0 62 69 74 73 28 6a 66 64 2c 20 28 2a 70 4f 66 66  bits(jfd, (*pOff
15cd0 73 65 74 29 2d 34 2c 20 26 63 6b 73 75 6d 29 3b  set)-4, &cksum);
15ce0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
15cf0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 69 66 28  turn rc;.    if(
15d00 20 21 69 73 53 61 76 65 70 6e 74 20 26 26 20 70   !isSavepnt && p
15d10 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65  ager_cksum(pPage
15d20 72 2c 20 28 75 38 2a 29 61 44 61 74 61 29 21 3d  r, (u8*)aData)!=
15d30 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20 20 72  cksum ){.      r
15d40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
15d50 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  E;.    }.  }..  
15d60 2f 2a 20 49 66 20 74 68 69 73 20 70 61 67 65 20  /* If this page 
15d70 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
15d80 20 70 6c 61 79 65 64 20 62 79 20 62 65 66 6f 72   played by befor
15d90 65 20 64 75 72 69 6e 67 20 74 68 65 20 63 75 72  e during the cur
15da0 72 65 6e 74 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61  rent.  ** rollba
15db0 63 6b 2c 20 74 68 65 6e 20 64 6f 6e 27 74 20 62  ck, then don't b
15dc0 6f 74 68 65 72 20 74 6f 20 70 6c 61 79 20 69 74  other to play it
15dd0 20 62 61 63 6b 20 61 67 61 69 6e 2e 0a 20 20 2a   back again..  *
15de0 2f 0a 20 20 69 66 28 20 70 44 6f 6e 65 20 26 26  /.  if( pDone &&
15df0 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69   (rc = sqlite3Bi
15e00 74 76 65 63 53 65 74 28 70 44 6f 6e 65 2c 20 70  tvecSet(pDone, p
15e10 67 6e 6f 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b  gno))!=SQLITE_OK
15e20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
15e30 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65  c;.  }..  /* Whe
15e40 6e 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 70  n playing back p
15e50 61 67 65 20 31 2c 20 72 65 73 74 6f 72 65 20 74  age 1, restore t
15e60 68 65 20 6e 52 65 73 65 72 76 65 20 73 65 74 74  he nReserve sett
15e70 69 6e 67 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ing.  */.  if( p
15e80 67 6e 6f 3d 3d 31 20 26 26 20 70 50 61 67 65 72  gno==1 && pPager
15e90 2d 3e 6e 52 65 73 65 72 76 65 21 3d 28 28 75 38  ->nReserve!=((u8
15ea0 2a 29 61 44 61 74 61 29 5b 32 30 5d 20 29 7b 0a  *)aData)[20] ){.
15eb0 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 73      pPager->nRes
15ec0 65 72 76 65 20 3d 20 28 28 75 38 2a 29 61 44 61  erve = ((u8*)aDa
15ed0 74 61 29 5b 32 30 5d 3b 0a 20 20 20 20 70 61 67  ta)[20];.    pag
15ee0 65 72 52 65 70 6f 72 74 53 69 7a 65 28 70 50 61  erReportSize(pPa
15ef0 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ger);.  }..  /* 
15f00 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
15f10 69 6e 20 43 41 43 48 45 4d 4f 44 20 73 74 61 74  in CACHEMOD stat
15f20 65 2c 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75  e, then there mu
15f30 73 74 20 62 65 20 61 20 63 6f 70 79 20 6f 66 20  st be a copy of 
15f40 74 68 69 73 0a 20 20 2a 2a 20 70 61 67 65 20 69  this.  ** page i
15f50 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  n the pager cach
15f60 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  e. In this case 
15f70 6a 75 73 74 20 75 70 64 61 74 65 20 74 68 65 20  just update the 
15f80 70 61 67 65 72 20 63 61 63 68 65 2c 0a 20 20 2a  pager cache,.  *
15f90 2a 20 6e 6f 74 20 74 68 65 20 64 61 74 61 62 61  * not the databa
15fa0 73 65 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67  se file. The pag
15fb0 65 20 69 73 20 6c 65 66 74 20 6d 61 72 6b 65 64  e is left marked
15fc0 20 64 69 72 74 79 20 69 6e 20 74 68 69 73 20 63   dirty in this c
15fd0 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  ase..  **.  ** A
15fe0 6e 20 65 78 63 65 70 74 69 6f 6e 20 74 6f 20 74  n exception to t
15ff0 68 65 20 61 62 6f 76 65 20 72 75 6c 65 3a 20 49  he above rule: I
16000 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
16010 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64  s in no-sync mod
16020 65 0a 20 20 2a 2a 20 61 6e 64 20 61 20 70 61 67  e.  ** and a pag
16030 65 20 69 73 20 6d 6f 76 65 64 20 64 75 72 69 6e  e is moved durin
16040 67 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  g an incremental
16050 20 76 61 63 75 75 6d 20 74 68 65 6e 20 74 68 65   vacuum then the
16060 20 70 61 67 65 20 6d 61 79 0a 20 20 2a 2a 20 6e   page may.  ** n
16070 6f 74 20 62 65 20 69 6e 20 74 68 65 20 70 61 67  ot be in the pag
16080 65 72 20 63 61 63 68 65 2e 20 4c 61 74 65 72 3a  er cache. Later:
16090 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 6f   if a malloc() o
160a0 72 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  r IO error occur
160b0 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 61 20  s.  ** during a 
160c0 4d 6f 76 65 70 61 67 65 28 29 20 63 61 6c 6c 2c  Movepage() call,
160d0 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d   then the page m
160e0 61 79 20 6e 6f 74 20 62 65 20 69 6e 20 74 68 65  ay not be in the
160f0 20 63 61 63 68 65 0a 20 20 2a 2a 20 65 69 74 68   cache.  ** eith
16100 65 72 2e 20 53 6f 20 74 68 65 20 63 6f 6e 64 69  er. So the condi
16110 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20 69  tion described i
16120 6e 20 74 68 65 20 61 62 6f 76 65 20 70 61 72 61  n the above para
16130 67 72 61 70 68 20 69 73 20 6e 6f 74 0a 20 20 2a  graph is not.  *
16140 2a 20 61 73 73 65 72 74 28 29 61 62 6c 65 2e 0a  * assert()able..
16150 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 6e 20    **.  ** If in 
16160 57 52 49 54 45 52 5f 44 42 4d 4f 44 2c 20 57 52  WRITER_DBMOD, WR
16170 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20 6f 72  ITER_FINISHED or
16180 20 4f 50 45 4e 20 73 74 61 74 65 2c 20 74 68 65   OPEN state, the
16190 6e 20 77 65 20 75 70 64 61 74 65 20 74 68 65 0a  n we update the.
161a0 20 20 2a 2a 20 70 61 67 65 72 20 63 61 63 68 65    ** pager cache
161b0 20 69 66 20 69 74 20 65 78 69 73 74 73 20 61 6e   if it exists an
161c0 64 20 74 68 65 20 6d 61 69 6e 20 66 69 6c 65 2e  d the main file.
161d0 20 54 68 65 20 70 61 67 65 20 69 73 20 74 68 65   The page is the
161e0 6e 20 6d 61 72 6b 65 64 20 0a 20 20 2a 2a 20 6e  n marked .  ** n
161f0 6f 74 20 64 69 72 74 79 2e 20 53 69 6e 63 65 20  ot dirty. Since 
16200 74 68 69 73 20 63 6f 64 65 20 69 73 20 6f 6e 6c  this code is onl
16210 79 20 65 78 65 63 75 74 65 64 20 69 6e 20 50 41  y executed in PA
16220 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65 20 66  GER_OPEN state f
16230 6f 72 0a 20 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f  or.  ** a hot-jo
16240 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20  urnal rollback, 
16250 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  it is guaranteed
16260 20 74 68 61 74 20 74 68 65 20 70 61 67 65 2d 63   that the page-c
16270 61 63 68 65 20 69 73 20 65 6d 70 74 79 0a 20 20  ache is empty.  
16280 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65 72 20  ** if the pager 
16290 69 73 20 69 6e 20 4f 50 45 4e 20 73 74 61 74 65  is in OPEN state
162a0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 69 63 6b  ..  **.  ** Tick
162b0 65 74 20 23 31 31 37 31 3a 20 20 54 68 65 20 73  et #1171:  The s
162c0 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
162d0 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 70   might contain p
162e0 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 68 61 74  age content that
162f0 20 69 73 0a 20 20 2a 2a 20 64 69 66 66 65 72 65   is.  ** differe
16300 6e 74 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  nt from the page
16310 20 63 6f 6e 74 65 6e 74 20 61 74 20 74 68 65 20   content at the 
16320 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61  start of the tra
16330 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54  nsaction..  ** T
16340 68 69 73 20 6f 63 63 75 72 73 20 77 68 65 6e 20  his occurs when 
16350 61 20 70 61 67 65 20 69 73 20 63 68 61 6e 67 65  a page is change
16360 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73  d prior to the s
16370 74 61 72 74 20 6f 66 20 61 20 73 74 61 74 65 6d  tart of a statem
16380 65 6e 74 0a 20 20 2a 2a 20 74 68 65 6e 20 63 68  ent.  ** then ch
16390 61 6e 67 65 64 20 61 67 61 69 6e 20 77 69 74 68  anged again with
163a0 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  in the statement
163b0 2e 20 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20  .  When rolling 
163c0 62 61 63 6b 20 73 75 63 68 20 61 0a 20 20 2a 2a  back such a.  **
163d0 20 73 74 61 74 65 6d 65 6e 74 20 77 65 20 6d 75   statement we mu
163e0 73 74 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20  st not write to 
163f0 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
16400 61 62 61 73 65 20 75 6e 6c 65 73 73 20 77 65 20  abase unless we 
16410 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72 20 63 65  know.  ** for ce
16420 72 74 61 69 6e 20 74 68 61 74 20 6f 72 69 67 69  rtain that origi
16430 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  nal page content
16440 73 20 61 72 65 20 73 79 6e 63 65 64 20 69 6e 74  s are synced int
16450 6f 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62  o the main rollb
16460 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  ack.  ** journal
16470 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20  .  Otherwise, a 
16480 70 6f 77 65 72 20 6c 6f 73 73 20 6d 69 67 68 74  power loss might
16490 20 6c 65 61 76 65 20 6d 6f 64 69 66 69 65 64 20   leave modified 
164a0 64 61 74 61 20 69 6e 20 74 68 65 0a 20 20 2a 2a  data in the.  **
164b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
164c0 69 74 68 6f 75 74 20 61 6e 20 65 6e 74 72 79 20  ithout an entry 
164d0 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  in the rollback 
164e0 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20 63 61 6e  journal that can
164f0 0a 20 20 2a 2a 20 72 65 73 74 6f 72 65 20 74 68  .  ** restore th
16500 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 69 74  e database to it
16510 73 20 6f 72 69 67 69 6e 61 6c 20 66 6f 72 6d 2e  s original form.
16520 20 20 54 77 6f 20 63 6f 6e 64 69 74 69 6f 6e 73    Two conditions
16530 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6d 65   must be.  ** me
16540 74 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67  t before writing
16550 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
16560 20 66 69 6c 65 73 2e 20 28 31 29 20 74 68 65 20   files. (1) the 
16570 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65  database must be
16580 0a 20 20 2a 2a 20 6c 6f 63 6b 65 64 2e 20 20 28  .  ** locked.  (
16590 32 29 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20  2) we know that 
165a0 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  the original pag
165b0 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 66 75 6c  e content is ful
165c0 6c 79 20 73 79 6e 63 65 64 0a 20 20 2a 2a 20 69  ly synced.  ** i
165d0 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  n the main journ
165e0 61 6c 20 65 69 74 68 65 72 20 62 65 63 61 75 73  al either becaus
165f0 65 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  e the page is no
16600 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20 65 6c  t in cache or el
16610 73 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65  se.  ** the page
16620 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 6e 65   is marked as ne
16630 65 64 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2a 0a  edSync==0..  **.
16640 20 20 2a 2a 20 32 30 30 38 2d 30 34 2d 31 34 3a    ** 2008-04-14:
16650 20 20 57 68 65 6e 20 61 74 74 65 6d 70 74 69 6e    When attemptin
16660 67 20 74 6f 20 76 61 63 75 75 6d 20 61 20 63 6f  g to vacuum a co
16670 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66  rrupt database f
16680 69 6c 65 2c 20 69 74 0a 20 20 2a 2a 20 69 73 20  ile, it.  ** is 
16690 70 6f 73 73 69 62 6c 65 20 74 6f 20 66 61 69 6c  possible to fail
166a0 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20   a statement on 
166b0 61 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20  a database that 
166c0 64 6f 65 73 20 6e 6f 74 20 79 65 74 20 65 78 69  does not yet exi
166d0 73 74 2e 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74 20  st..  ** Do not 
166e0 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65  attempt to write
166f0 20 69 66 20 64 61 74 61 62 61 73 65 20 66 69 6c   if database fil
16700 65 20 68 61 73 20 6e 65 76 65 72 20 62 65 65 6e  e has never been
16710 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20   opened..  */.  
16720 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  if( pagerUseWal(
16730 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 70  pPager) ){.    p
16740 50 67 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  Pg = 0;.  }else{
16750 0a 20 20 20 20 70 50 67 20 3d 20 70 61 67 65 72  .    pPg = pager
16760 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  _lookup(pPager, 
16770 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 61 73 73  pgno);.  }.  ass
16780 65 72 74 28 20 70 50 67 20 7c 7c 20 21 4d 45 4d  ert( pPg || !MEM
16790 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  DB );.  assert( 
167a0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
167b0 50 41 47 45 52 5f 4f 50 45 4e 20 7c 7c 20 70 50  PAGER_OPEN || pP
167c0 67 3d 3d 30 20 29 3b 0a 20 20 50 41 47 45 52 54  g==0 );.  PAGERT
167d0 52 41 43 45 28 28 22 50 4c 41 59 42 41 43 4b 20  RACE(("PLAYBACK 
167e0 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28  %d page %d hash(
167f0 25 30 38 78 29 20 25 73 5c 6e 22 2c 0a 20 20 20  %08x) %s\n",.   
16800 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28          PAGERID(
16810 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70  pPager), pgno, p
16820 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 70 50  ager_datahash(pP
16830 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
16840 28 75 38 2a 29 61 44 61 74 61 29 2c 0a 20 20 20  (u8*)aData),.   
16850 20 20 20 20 20 20 20 20 28 69 73 4d 61 69 6e 4a          (isMainJ
16860 72 6e 6c 3f 22 6d 61 69 6e 2d 6a 6f 75 72 6e 61  rnl?"main-journa
16870 6c 22 3a 22 73 75 62 2d 6a 6f 75 72 6e 61 6c 22  l":"sub-journal"
16880 29 0a 20 20 29 29 3b 0a 20 20 69 66 28 20 69 73  ).  ));.  if( is
16890 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20  MainJrnl ){.    
168a0 69 73 53 79 6e 63 65 64 20 3d 20 70 50 61 67 65  isSynced = pPage
168b0 72 2d 3e 6e 6f 53 79 6e 63 20 7c 7c 20 28 2a 70  r->noSync || (*p
168c0 4f 66 66 73 65 74 20 3c 3d 20 70 50 61 67 65 72  Offset <= pPager
168d0 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 3b 0a 20  ->journalHdr);. 
168e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 73 53 79   }else{.    isSy
168f0 6e 63 65 64 20 3d 20 28 70 50 67 3d 3d 30 20 7c  nced = (pPg==0 |
16900 7c 20 30 3d 3d 28 70 50 67 2d 3e 66 6c 61 67 73  | 0==(pPg->flags
16910 20 26 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59   & PGHDR_NEED_SY
16920 4e 43 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  NC));.  }.  if( 
16930 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
16940 64 29 0a 20 20 20 26 26 20 28 70 50 61 67 65 72  d).   && (pPager
16950 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
16960 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20  WRITER_DBMOD || 
16970 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
16980 50 41 47 45 52 5f 4f 50 45 4e 29 0a 20 20 20 26  PAGER_OPEN).   &
16990 26 20 69 73 53 79 6e 63 65 64 0a 20 20 29 7b 0a  & isSynced.  ){.
169a0 20 20 20 20 69 36 34 20 6f 66 73 74 20 3d 20 28      i64 ofst = (
169b0 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61  pgno-1)*(i64)pPa
169c0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
169d0 20 20 20 74 65 73 74 63 61 73 65 28 20 21 69 73     testcase( !is
169e0 53 61 76 65 70 6e 74 20 26 26 20 70 50 67 21 3d  Savepnt && pPg!=
169f0 30 20 26 26 20 28 70 50 67 2d 3e 66 6c 61 67 73  0 && (pPg->flags
16a00 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
16a10 29 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  )!=0 );.    asse
16a20 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  rt( !pagerUseWal
16a30 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
16a40 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
16a50 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ite(pPager->fd, 
16a60 28 75 38 2a 29 61 44 61 74 61 2c 20 70 50 61 67  (u8*)aData, pPag
16a70 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66  er->pageSize, of
16a80 73 74 29 3b 0a 20 20 20 20 69 66 28 20 70 67 6e  st);.    if( pgn
16a90 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  o>pPager->dbFile
16aa0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 50  Size ){.      pP
16ab0 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
16ac0 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 7d 0a 20   = pgno;.    }. 
16ad0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70     if( pPager->p
16ae0 42 61 63 6b 75 70 20 29 7b 0a 20 20 20 20 20 20  Backup ){.      
16af0 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 61  CODEC1(pPager, a
16b00 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20 72  Data, pgno, 3, r
16b10 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b  c=SQLITE_NOMEM);
16b20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 61  .      sqlite3Ba
16b30 63 6b 75 70 55 70 64 61 74 65 28 70 50 61 67 65  ckupUpdate(pPage
16b40 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f  r->pBackup, pgno
16b50 2c 20 28 75 38 2a 29 61 44 61 74 61 29 3b 0a 20  , (u8*)aData);. 
16b60 20 20 20 20 20 43 4f 44 45 43 32 28 70 50 61 67       CODEC2(pPag
16b70 65 72 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f 2c  er, aData, pgno,
16b80 20 37 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f   7, rc=SQLITE_NO
16b90 4d 45 4d 2c 20 61 44 61 74 61 29 3b 0a 20 20 20  MEM, aData);.   
16ba0 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21   }.  }else if( !
16bb0 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 70 50  isMainJrnl && pP
16bc0 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49  g==0 ){.    /* I
16bd0 66 20 74 68 69 73 20 69 73 20 61 20 72 6f 6c 6c  f this is a roll
16be0 62 61 63 6b 20 6f 66 20 61 20 73 61 76 65 70 6f  back of a savepo
16bf0 69 6e 74 20 61 6e 64 20 64 61 74 61 20 77 61 73  int and data was
16c00 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 0a   not written to.
16c10 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62      ** the datab
16c20 61 73 65 20 61 6e 64 20 74 68 65 20 70 61 67 65  ase and the page
16c30 20 69 73 20 6e 6f 74 20 69 6e 2d 6d 65 6d 6f 72   is not in-memor
16c40 79 2c 20 74 68 65 72 65 20 69 73 20 61 20 70 6f  y, there is a po
16c50 74 65 6e 74 69 61 6c 0a 20 20 20 20 2a 2a 20 70  tential.    ** p
16c60 72 6f 62 6c 65 6d 2e 20 57 68 65 6e 20 74 68 65  roblem. When the
16c70 20 70 61 67 65 20 69 73 20 6e 65 78 74 20 66 65   page is next fe
16c80 74 63 68 65 64 20 62 79 20 74 68 65 20 62 2d 74  tched by the b-t
16c90 72 65 65 20 6c 61 79 65 72 2c 20 69 74 20 0a 20  ree layer, it . 
16ca0 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65     ** will be re
16cb0 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ad from the data
16cc0 62 61 73 65 20 66 69 6c 65 2c 20 77 68 69 63 68  base file, which
16cd0 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20   may or may not 
16ce0 62 65 20 0a 20 20 20 20 2a 2a 20 63 75 72 72 65  be .    ** curre
16cf0 6e 74 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20  nt. .    **.    
16d00 2a 2a 20 54 68 65 72 65 20 61 72 65 20 61 20 63  ** There are a c
16d10 6f 75 70 6c 65 20 6f 66 20 64 69 66 66 65 72 65  ouple of differe
16d20 6e 74 20 77 61 79 73 20 74 68 69 73 20 63 61 6e  nt ways this can
16d30 20 68 61 70 70 65 6e 2e 20 41 6c 6c 20 61 72 65   happen. All are
16d40 20 71 75 69 74 65 0a 20 20 20 20 2a 2a 20 6f 62   quite.    ** ob
16d50 73 63 75 72 65 2e 20 57 68 65 6e 20 72 75 6e 6e  scure. When runn
16d60 69 6e 67 20 69 6e 20 73 79 6e 63 68 72 6f 6e 6f  ing in synchrono
16d70 75 73 20 6d 6f 64 65 2c 20 74 68 69 73 20 63 61  us mode, this ca
16d80 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 0a 20  n only happen . 
16d90 20 20 20 2a 2a 20 69 66 20 74 68 65 20 70 61 67     ** if the pag
16da0 65 20 69 73 20 6f 6e 20 74 68 65 20 66 72 65 65  e is on the free
16db0 2d 6c 69 73 74 20 61 74 20 74 68 65 20 73 74 61  -list at the sta
16dc0 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  rt of the transa
16dd0 63 74 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20  ction, then.    
16de0 2a 2a 20 70 6f 70 75 6c 61 74 65 64 2c 20 74 68  ** populated, th
16df0 65 6e 20 6d 6f 76 65 64 20 75 73 69 6e 67 20 73  en moved using s
16e00 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70  qlite3PagerMovep
16e10 61 67 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20  age()..    **.  
16e20 20 20 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f    ** The solutio
16e30 6e 20 69 73 20 74 6f 20 61 64 64 20 61 6e 20 69  n is to add an i
16e40 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 74 6f  n-memory page to
16e50 20 74 68 65 20 63 61 63 68 65 20 63 6f 6e 74 61   the cache conta
16e60 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65  ining.    ** the
16e70 20 64 61 74 61 20 6a 75 73 74 20 72 65 61 64 20   data just read 
16e80 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75  from the sub-jou
16e90 72 6e 61 6c 2e 20 4d 61 72 6b 20 74 68 65 20 70  rnal. Mark the p
16ea0 61 67 65 20 61 73 20 64 69 72 74 79 20 0a 20 20  age as dirty .  
16eb0 20 20 2a 2a 20 61 6e 64 20 69 66 20 74 68 65 20    ** and if the 
16ec0 70 61 67 65 72 20 72 65 71 75 69 72 65 73 20 61  pager requires a
16ed0 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63 2c 20 74   journal-sync, t
16ee0 68 65 6e 20 6d 61 72 6b 20 74 68 65 20 70 61 67  hen mark the pag
16ef0 65 20 61 73 20 0a 20 20 20 20 2a 2a 20 72 65 71  e as .    ** req
16f00 75 69 72 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c  uiring a journal
16f10 2d 73 79 6e 63 20 62 65 66 6f 72 65 20 69 74 20  -sync before it 
16f20 69 73 20 77 72 69 74 74 65 6e 2e 0a 20 20 20 20  is written..    
16f30 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  */.    assert( i
16f40 73 53 61 76 65 70 6e 74 20 29 3b 0a 20 20 20 20  sSavepnt );.    
16f50 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
16f60 64 6f 4e 6f 74 53 70 69 6c 6c 3d 3d 30 20 29 3b  doNotSpill==0 );
16f70 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e  .    pPager->doN
16f80 6f 74 53 70 69 6c 6c 2b 2b 3b 0a 20 20 20 20 72  otSpill++;.    r
16f90 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
16fa0 41 63 71 75 69 72 65 28 70 50 61 67 65 72 2c 20  Acquire(pPager, 
16fb0 70 67 6e 6f 2c 20 26 70 50 67 2c 20 31 29 3b 0a  pgno, &pPg, 1);.
16fc0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
16fd0 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 3d 3d  er->doNotSpill==
16fe0 31 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  1 );.    pPager-
16ff0 3e 64 6f 4e 6f 74 53 70 69 6c 6c 2d 2d 3b 0a 20  >doNotSpill--;. 
17000 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
17010 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
17020 3b 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73  ;.    pPg->flags
17030 20 26 3d 20 7e 50 47 48 44 52 5f 4e 45 45 44 5f   &= ~PGHDR_NEED_
17040 52 45 41 44 3b 0a 20 20 20 20 73 71 6c 69 74 65  READ;.    sqlite
17050 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79  3PcacheMakeDirty
17060 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 69 66 28  (pPg);.  }.  if(
17070 20 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4e   pPg ){.    /* N
17080 6f 20 70 61 67 65 20 73 68 6f 75 6c 64 20 65 76  o page should ev
17090 65 72 20 62 65 20 65 78 70 6c 69 63 69 74 6c 79  er be explicitly
170a0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 61   rolled back tha
170b0 74 20 69 73 20 69 6e 20 75 73 65 2c 20 65 78 63  t is in use, exc
170c0 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20 70  ept.    ** for p
170d0 61 67 65 20 31 20 77 68 69 63 68 20 69 73 20 68  age 1 which is h
170e0 65 6c 64 20 69 6e 20 75 73 65 20 69 6e 20 6f 72  eld in use in or
170f0 64 65 72 20 74 6f 20 6b 65 65 70 20 74 68 65 20  der to keep the 
17100 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20  lock on the.    
17110 2a 2a 20 64 61 74 61 62 61 73 65 20 61 63 74 69  ** database acti
17120 76 65 2e 20 48 6f 77 65 76 65 72 20 73 75 63 68  ve. However such
17130 20 61 20 70 61 67 65 20 6d 61 79 20 62 65 20 72   a page may be r
17140 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20  olled back as a 
17150 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 6f 66  result.    ** of
17160 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65 72 72   an internal err
17170 6f 72 20 72 65 73 75 6c 74 69 6e 67 20 69 6e 20  or resulting in 
17180 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 63 61 6c  an automatic cal
17190 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69  l to.    ** sqli
171a0 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b  te3PagerRollback
171b0 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 76  ()..    */.    v
171c0 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20 20 20 20  oid *pData;.    
171d0 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61  pData = pPg->pDa
171e0 74 61 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  ta;.    memcpy(p
171f0 44 61 74 61 2c 20 28 75 38 2a 29 61 44 61 74 61  Data, (u8*)aData
17200 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
17210 7a 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  ze);.    pPager-
17220 3e 78 52 65 69 6e 69 74 65 72 28 70 50 67 29 3b  >xReiniter(pPg);
17230 0a 20 20 20 20 69 66 28 20 69 73 4d 61 69 6e 4a  .    if( isMainJ
17240 72 6e 6c 20 26 26 20 28 21 69 73 53 61 76 65 70  rnl && (!isSavep
17250 6e 74 20 7c 7c 20 2a 70 4f 66 66 73 65 74 3c 3d  nt || *pOffset<=
17260 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
17270 64 72 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  dr) ){.      /* 
17280 49 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  If the contents 
17290 6f 66 20 74 68 69 73 20 70 61 67 65 20 77 65 72  of this page wer
172a0 65 20 6a 75 73 74 20 72 65 73 74 6f 72 65 64 20  e just restored 
172b0 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 0a 20  from the main . 
172c0 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20       ** journal 
172d0 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 73 20 63  file, then its c
172e0 6f 6e 74 65 6e 74 20 6d 75 73 74 20 62 65 20 61  ontent must be a
172f0 73 20 74 68 65 79 20 77 65 72 65 20 77 68 65 6e  s they were when
17300 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 74   the .      ** t
17310 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 66  ransaction was f
17320 69 72 73 74 20 6f 70 65 6e 65 64 2e 20 49 6e 20  irst opened. In 
17330 74 68 69 73 20 63 61 73 65 20 77 65 20 63 61 6e  this case we can
17340 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 0a 20   mark the page. 
17350 20 20 20 20 20 2a 2a 20 61 73 20 63 6c 65 61 6e       ** as clean
17360 2c 20 73 69 6e 63 65 20 74 68 65 72 65 20 77 69  , since there wi
17370 6c 6c 20 62 65 20 6e 6f 20 6e 65 65 64 20 74 6f  ll be no need to
17380 20 77 72 69 74 65 20 69 74 20 6f 75 74 20 74 6f   write it out to
17390 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61   the.      ** da
173a0 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20 2a 2a  tabase..      **
173b0 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65 20  .      ** There 
173c0 69 73 20 6f 6e 65 20 65 78 63 65 70 74 69 6f 6e  is one exception
173d0 20 74 6f 20 74 68 69 73 20 72 75 6c 65 2e 20 49   to this rule. I
173e0 66 20 74 68 65 20 70 61 67 65 20 69 73 20 62 65  f the page is be
173f0 69 6e 67 20 72 6f 6c 6c 65 64 0a 20 20 20 20 20  ing rolled.     
17400 20 2a 2a 20 62 61 63 6b 20 61 73 20 70 61 72 74   ** back as part
17410 20 6f 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20   of a savepoint 
17420 28 6f 72 20 73 74 61 74 65 6d 65 6e 74 29 20 72  (or statement) r
17430 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 61 6e 20  ollback from an 
17440 0a 20 20 20 20 20 20 2a 2a 20 75 6e 73 79 6e 63  .      ** unsync
17450 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68  ed portion of th
17460 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66  e main journal f
17470 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ile, then it is 
17480 6e 6f 74 20 73 61 66 65 0a 20 20 20 20 20 20 2a  not safe.      *
17490 2a 20 74 6f 20 6d 61 72 6b 20 74 68 65 20 70 61  * to mark the pa
174a0 67 65 20 61 73 20 63 6c 65 61 6e 2e 20 54 68 69  ge as clean. Thi
174b0 73 20 69 73 20 62 65 63 61 75 73 65 20 6d 61 72  s is because mar
174c0 6b 69 6e 67 20 74 68 65 20 70 61 67 65 20 61 73  king the page as
174d0 0a 20 20 20 20 20 20 2a 2a 20 63 6c 65 61 6e 20  .      ** clean 
174e0 77 69 6c 6c 20 63 6c 65 61 72 20 74 68 65 20 50  will clear the P
174f0 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66  GHDR_NEED_SYNC f
17500 6c 61 67 2e 20 53 69 6e 63 65 20 74 68 65 20 70  lag. Since the p
17510 61 67 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  age is.      ** 
17520 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 6a  already in the j
17530 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 72 65 63  ournal file (rec
17540 6f 72 64 65 64 20 69 6e 20 50 61 67 65 72 2e 70  orded in Pager.p
17550 49 6e 4a 6f 75 72 6e 61 6c 29 20 61 6e 64 0a 20  InJournal) and. 
17560 20 20 20 20 20 2a 2a 20 74 68 65 20 50 47 48 44       ** the PGHD
17570 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67  R_NEED_SYNC flag
17580 20 69 73 20 63 6c 65 61 72 65 64 2c 20 69 66 20   is cleared, if 
17590 74 68 65 20 70 61 67 65 20 69 73 20 77 72 69 74  the page is writ
175a0 74 65 6e 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ten to.      ** 
175b0 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68 69  again within thi
175c0 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69  s transaction, i
175d0 74 20 77 69 6c 6c 20 62 65 20 6d 61 72 6b 65 64  t will be marked
175e0 20 61 73 20 64 69 72 74 79 20 62 75 74 0a 20 20   as dirty but.  
175f0 20 20 20 20 2a 2a 20 74 68 65 20 50 47 48 44 52      ** the PGHDR
17600 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20  _NEED_SYNC flag 
17610 77 69 6c 6c 20 6e 6f 74 20 62 65 20 73 65 74 2e  will not be set.
17620 20 49 74 20 63 6f 75 6c 64 20 74 68 65 6e 20 70   It could then p
17630 6f 74 65 6e 74 69 61 6c 6c 79 0a 20 20 20 20 20  otentially.     
17640 20 2a 2a 20 62 65 20 77 72 69 74 74 65 6e 20 6f   ** be written o
17650 75 74 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ut into the data
17660 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65  base file before
17670 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   its journal fil
17680 65 0a 20 20 20 20 20 20 2a 2a 20 73 65 67 6d 65  e.      ** segme
17690 6e 74 20 69 73 20 73 79 6e 63 65 64 2e 20 49 66  nt is synced. If
176a0 20 61 20 63 72 61 73 68 20 6f 63 63 75 72 73 20   a crash occurs 
176b0 64 75 72 69 6e 67 20 6f 72 20 66 6f 6c 6c 6f 77  during or follow
176c0 69 6e 67 20 74 68 69 73 2c 0a 20 20 20 20 20 20  ing this,.      
176d0 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  ** database corr
176e0 75 70 74 69 6f 6e 20 6d 61 79 20 65 6e 73 75 65  uption may ensue
176f0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
17700 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
17710 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
17720 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 63  .      sqlite3Pc
17730 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50  acheMakeClean(pP
17740 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61  g);.    }.    pa
17750 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68  ger_set_pagehash
17760 28 70 50 67 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  (pPg);..    /* I
17770 66 20 74 68 69 73 20 77 61 73 20 70 61 67 65 20  f this was page 
17780 31 2c 20 74 68 65 6e 20 72 65 73 74 6f 72 65 20  1, then restore 
17790 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61 67  the value of Pag
177a0 65 72 2e 64 62 46 69 6c 65 56 65 72 73 2e 0a 20  er.dbFileVers.. 
177b0 20 20 20 2a 2a 20 44 6f 20 74 68 69 73 20 62 65     ** Do this be
177c0 66 6f 72 65 20 61 6e 79 20 64 65 63 6f 64 69 6e  fore any decodin
177d0 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67  g. */.    if( pg
177e0 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 6d  no==1 ){.      m
177f0 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64  emcpy(&pPager->d
17800 62 46 69 6c 65 56 65 72 73 2c 20 26 28 28 75 38  bFileVers, &((u8
17810 2a 29 70 44 61 74 61 29 5b 32 34 5d 2c 73 69 7a  *)pData)[24],siz
17820 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69  eof(pPager->dbFi
17830 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a  leVers));.    }.
17840 0a 20 20 20 20 2f 2a 20 44 65 63 6f 64 65 20 74  .    /* Decode t
17850 68 65 20 70 61 67 65 20 6a 75 73 74 20 72 65 61  he page just rea
17860 64 20 66 72 6f 6d 20 64 69 73 6b 20 2a 2f 0a 20  d from disk */. 
17870 20 20 20 43 4f 44 45 43 31 28 70 50 61 67 65 72     CODEC1(pPager
17880 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67  , pData, pPg->pg
17890 6e 6f 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54 45  no, 3, rc=SQLITE
178a0 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 20 20 73 71 6c  _NOMEM);.    sql
178b0 69 74 65 33 50 63 61 63 68 65 52 65 6c 65 61 73  ite3PcacheReleas
178c0 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 72 65  e(pPg);.  }.  re
178d0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
178e0 2a 20 50 61 72 61 6d 65 74 65 72 20 7a 4d 61 73  * Parameter zMas
178f0 74 65 72 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ter is the name 
17900 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  of a master jour
17910 6e 61 6c 20 66 69 6c 65 2e 20 41 20 73 69 6e 67  nal file. A sing
17920 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  le journal.** fi
17930 6c 65 20 74 68 61 74 20 72 65 66 65 72 72 65 64  le that referred
17940 20 74 6f 20 74 68 65 20 6d 61 73 74 65 72 20 6a   to the master j
17950 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20  ournal file has 
17960 6a 75 73 74 20 62 65 65 6e 20 72 6f 6c 6c 65 64  just been rolled
17970 20 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 72   back..** This r
17980 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66  outine checks if
17990 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   it is possible 
179a0 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61  to delete the ma
179b0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
179c0 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20 73  e,.** and does s
179d0 6f 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a  o if it is..**.*
179e0 2a 20 41 72 67 75 6d 65 6e 74 20 7a 4d 61 73 74  * Argument zMast
179f0 65 72 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20  er may point to 
17a00 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 2e  Pager.pTmpSpace.
17a10 20 53 6f 20 74 68 61 74 20 62 75 66 66 65 72 20   So that buffer 
17a20 69 73 20 6e 6f 74 20 0a 2a 2a 20 61 76 61 69 6c  is not .** avail
17a30 61 62 6c 65 20 66 6f 72 20 75 73 65 20 77 69 74  able for use wit
17a40 68 69 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hin this functio
17a50 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 20  n..**.** When a 
17a60 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
17a70 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 2c 20  ile is created, 
17a80 69 74 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20  it is populated 
17a90 77 69 74 68 20 74 68 65 20 6e 61 6d 65 73 20 0a  with the names .
17aa0 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66 20 69 74 73  ** of all of its
17ab0 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 73 2c   child journals,
17ac0 20 6f 6e 65 20 61 66 74 65 72 20 61 6e 6f 74 68   one after anoth
17ad0 65 72 2c 20 66 6f 72 6d 61 74 74 65 64 20 61 73  er, formatted as
17ae0 20 75 74 66 2d 38 20 0a 2a 2a 20 65 6e 63 6f 64   utf-8 .** encod
17af0 65 64 20 74 65 78 74 2e 20 54 68 65 20 65 6e 64  ed text. The end
17b00 20 6f 66 20 65 61 63 68 20 63 68 69 6c 64 20 6a   of each child j
17b10 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6d  ournal file is m
17b20 61 72 6b 65 64 20 77 69 74 68 20 61 20 0a 2a 2a  arked with a .**
17b30 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20   nul-terminator 
17b40 62 79 74 65 20 28 30 78 30 30 29 2e 20 69 2e 65  byte (0x00). i.e
17b50 2e 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e  . the entire con
17b60 74 65 6e 74 73 20 6f 66 20 61 20 6d 61 73 74 65  tents of a maste
17b70 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  r journal.** fil
17b80 65 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74  e for a transact
17b90 69 6f 6e 20 69 6e 76 6f 6c 76 69 6e 67 20 74 77  ion involving tw
17ba0 6f 20 64 61 74 61 62 61 73 65 73 20 6d 69 67 68  o databases migh
17bb0 74 20 62 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 2f  t be:.**.**   "/
17bc0 68 6f 6d 65 2f 62 69 6c 6c 2f 61 2e 64 62 2d 6a  home/bill/a.db-j
17bd0 6f 75 72 6e 61 6c 5c 78 30 30 2f 68 6f 6d 65 2f  ournal\x00/home/
17be0 62 69 6c 6c 2f 62 2e 64 62 2d 6a 6f 75 72 6e 61  bill/b.db-journa
17bf0 6c 5c 78 30 30 22 0a 2a 2a 0a 2a 2a 20 41 20 6d  l\x00".**.** A m
17c00 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
17c10 6c 65 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 64  le may only be d
17c20 65 6c 65 74 65 64 20 6f 6e 63 65 20 61 6c 6c 20  eleted once all 
17c30 6f 66 20 69 74 73 20 63 68 69 6c 64 20 0a 2a 2a  of its child .**
17c40 20 6a 6f 75 72 6e 61 6c 73 20 68 61 76 65 20 62   journals have b
17c50 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e  een rolled back.
17c60 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
17c70 74 69 6f 6e 20 72 65 61 64 73 20 74 68 65 20 63  tion reads the c
17c80 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6d  ontents of the m
17c90 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69  aster-journal fi
17ca0 6c 65 20 69 6e 74 6f 20 0a 2a 2a 20 6d 65 6d 6f  le into .** memo
17cb0 72 79 20 61 6e 64 20 6c 6f 6f 70 73 20 74 68 72  ry and loops thr
17cc0 6f 75 67 68 20 65 61 63 68 20 6f 66 20 74 68 65  ough each of the
17cd0 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 6e   child journal n
17ce0 61 6d 65 73 2e 20 46 6f 72 0a 2a 2a 20 65 61 63  ames. For.** eac
17cf0 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 2c  h child journal,
17d00 20 69 74 20 63 68 65 63 6b 73 20 69 66 3a 0a 2a   it checks if:.*
17d10 2a 0a 2a 2a 20 20 20 2a 20 69 66 20 74 68 65 20  *.**   * if the 
17d20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 65 78  child journal ex
17d30 69 73 74 73 2c 20 61 6e 64 20 69 66 20 73 6f 0a  ists, and if so.
17d40 2a 2a 20 20 20 2a 20 69 66 20 74 68 65 20 63 68  **   * if the ch
17d50 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74  ild journal cont
17d60 61 69 6e 73 20 61 20 72 65 66 65 72 65 6e 63 65  ains a reference
17d70 20 74 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   to master journ
17d80 61 6c 20 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20  al .**     file 
17d90 7a 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 49 66  zMaster.**.** If
17da0 20 61 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c   a child journal
17db0 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 74 68   can be found th
17dc0 61 74 20 6d 61 74 63 68 65 73 20 62 6f 74 68 20  at matches both 
17dd0 6f 66 20 74 68 65 20 63 72 69 74 65 72 69 61 0a  of the criteria.
17de0 2a 2a 20 61 62 6f 76 65 2c 20 74 68 69 73 20 66  ** above, this f
17df0 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
17e00 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e  without doing an
17e10 79 74 68 69 6e 67 2e 20 4f 74 68 65 72 77 69 73  ything. Otherwis
17e20 65 2c 20 69 66 0a 2a 2a 20 6e 6f 20 73 75 63 68  e, if.** no such
17e30 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63   child journal c
17e40 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20 66 69 6c  an be found, fil
17e50 65 20 7a 4d 61 73 74 65 72 20 69 73 20 64 65 6c  e zMaster is del
17e60 65 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65  eted from.** the
17e70 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 75 73 69   file-system usi
17e80 6e 67 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65  ng sqlite3OsDele
17e90 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  te()..**.** If a
17ea0 6e 20 49 4f 20 65 72 72 6f 72 20 77 69 74 68 69  n IO error withi
17eb0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c  n this function,
17ec0 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
17ed0 73 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73  s returned. This
17ee0 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c  .** function all
17ef0 6f 63 61 74 65 73 20 6d 65 6d 6f 72 79 20 62 79  ocates memory by
17f00 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33   calling sqlite3
17f10 4d 61 6c 6c 6f 63 28 29 2e 20 49 66 20 61 6e 20  Malloc(). If an 
17f20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 66 61  allocation.** fa
17f30 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  ils, SQLITE_NOME
17f40 4d 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  M is returned. O
17f50 74 68 65 72 77 69 73 65 2c 20 69 66 20 6e 6f 20  therwise, if no 
17f60 49 4f 20 6f 72 20 6d 61 6c 6c 6f 63 20 65 72 72  IO or malloc err
17f70 6f 72 73 20 0a 2a 2a 20 6f 63 63 75 72 2c 20 53  ors .** occur, S
17f80 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
17f90 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f  rned..**.** TODO
17fa0 3a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  : This function 
17fb0 61 6c 6c 6f 63 61 74 65 73 20 61 20 73 69 6e 67  allocates a sing
17fc0 6c 65 20 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f  le block of memo
17fd0 72 79 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20 74 68  ry to load.** th
17fe0 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74  e entire content
17ff0 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20  s of the master 
18000 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68  journal file. Th
18010 69 73 20 63 6f 75 6c 64 20 62 65 0a 2a 2a 20 61  is could be.** a
18020 20 63 6f 75 70 6c 65 20 6f 66 20 6b 69 6c 6f 62   couple of kilob
18030 79 74 65 73 20 6f 72 20 73 6f 20 2d 20 70 6f 74  ytes or so - pot
18040 65 6e 74 69 61 6c 6c 79 20 6c 61 72 67 65 72 20  entially larger 
18050 74 68 61 6e 20 74 68 65 20 70 61 67 65 20 0a 2a  than the page .*
18060 2a 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69  * size..*/.stati
18070 63 20 69 6e 74 20 70 61 67 65 72 5f 64 65 6c 6d  c int pager_delm
18080 61 73 74 65 72 28 50 61 67 65 72 20 2a 70 50 61  aster(Pager *pPa
18090 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ger, const char 
180a0 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 73 71 6c  *zMaster){.  sql
180b0 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d  ite3_vfs *pVfs =
180c0 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20   pPager->pVfs;. 
180d0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
180e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
180f0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73  turn code */.  s
18100 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61  qlite3_file *pMa
18110 73 74 65 72 3b 20 20 20 20 2f 2a 20 4d 61 6c 6c  ster;    /* Mall
18120 6f 63 27 64 20 6d 61 73 74 65 72 2d 6a 6f 75 72  oc'd master-jour
18130 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70  nal file descrip
18140 74 6f 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  tor */.  sqlite3
18150 5f 66 69 6c 65 20 2a 70 4a 6f 75 72 6e 61 6c 3b  _file *pJournal;
18160 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20 63     /* Malloc'd c
18170 68 69 6c 64 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c  hild-journal fil
18180 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a  e descriptor */.
18190 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 4a    char *zMasterJ
181a0 6f 75 72 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20 43  ournal = 0; /* C
181b0 6f 6e 74 65 6e 74 73 20 6f 66 20 6d 61 73 74 65  ontents of maste
181c0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a  r journal file *
181d0 2f 0a 20 20 69 36 34 20 6e 4d 61 73 74 65 72 4a  /.  i64 nMasterJ
181e0 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 2f 2a  ournal;       /*
181f0 20 53 69 7a 65 20 6f 66 20 6d 61 73 74 65 72 20   Size of master 
18200 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
18210 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c    char *zJournal
18220 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ;           /* P
18230 6f 69 6e 74 65 72 20 74 6f 20 6f 6e 65 20 6a 6f  ointer to one jo
18240 75 72 6e 61 6c 20 77 69 74 68 69 6e 20 4d 4a 20  urnal within MJ 
18250 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  file */.  char *
18260 7a 4d 61 73 74 65 72 50 74 72 3b 20 20 20 20 20  zMasterPtr;     
18270 20 20 20 20 2f 2a 20 53 70 61 63 65 20 74 6f 20      /* Space to 
18280 68 6f 6c 64 20 4d 4a 20 66 69 6c 65 6e 61 6d 65  hold MJ filename
18290 20 66 72 6f 6d 20 61 20 6a 6f 75 72 6e 61 6c 20   from a journal 
182a0 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d  file */.  int nM
182b0 61 73 74 65 72 50 74 72 3b 20 20 20 20 20 20 20  asterPtr;       
182c0 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66      /* Amount of
182d0 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64   space allocated
182e0 20 74 6f 20 7a 4d 61 73 74 65 72 50 74 72 5b 5d   to zMasterPtr[]
182f0 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61   */..  /* Alloca
18300 74 65 20 73 70 61 63 65 20 66 6f 72 20 62 6f 74  te space for bot
18310 68 20 74 68 65 20 70 4a 6f 75 72 6e 61 6c 20 61  h the pJournal a
18320 6e 64 20 70 4d 61 73 74 65 72 20 66 69 6c 65 20  nd pMaster file 
18330 64 65 73 63 72 69 70 74 6f 72 73 2e 0a 20 20 2a  descriptors..  *
18340 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
18350 20 6f 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72   open the master
18360 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
18370 72 20 72 65 61 64 69 6e 67 2e 0a 20 20 2a 2f 0a  r reading..  */.
18380 20 20 70 4d 61 73 74 65 72 20 3d 20 28 73 71 6c    pMaster = (sql
18390 69 74 65 33 5f 66 69 6c 65 20 2a 29 73 71 6c 69  ite3_file *)sqli
183a0 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 56  te3MallocZero(pV
183b0 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 2a 20 32  fs->szOsFile * 2
183c0 29 3b 0a 20 20 70 4a 6f 75 72 6e 61 6c 20 3d 20  );.  pJournal = 
183d0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29  (sqlite3_file *)
183e0 28 28 28 75 38 20 2a 29 70 4d 61 73 74 65 72 29  (((u8 *)pMaster)
183f0 20 2b 20 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c   + pVfs->szOsFil
18400 65 29 3b 0a 20 20 69 66 28 20 21 70 4d 61 73 74  e);.  if( !pMast
18410 65 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  er ){.    rc = S
18420 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
18430 65 6c 73 65 7b 0a 20 20 20 20 63 6f 6e 73 74 20  else{.    const 
18440 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53 51 4c  int flags = (SQL
18450 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
18460 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  Y|SQLITE_OPEN_MA
18470 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20  STER_JOURNAL);. 
18480 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
18490 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4d 61 73  sOpen(pVfs, zMas
184a0 74 65 72 2c 20 70 4d 61 73 74 65 72 2c 20 66 6c  ter, pMaster, fl
184b0 61 67 73 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69  ags, 0);.  }.  i
184c0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
184d0 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65   ) goto delmaste
184e0 72 5f 6f 75 74 3b 0a 0a 20 20 2f 2a 20 4c 6f 61  r_out;..  /* Loa
184f0 64 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61 73  d the entire mas
18500 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
18510 20 69 6e 74 6f 20 73 70 61 63 65 20 6f 62 74 61   into space obta
18520 69 6e 65 64 20 66 72 6f 6d 0a 20 20 2a 2a 20 73  ined from.  ** s
18530 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 20  qlite3_malloc() 
18540 61 6e 64 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  and pointed to b
18550 79 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  y zMasterJournal
18560 2e 20 20 20 41 6c 73 6f 20 6f 62 74 61 69 6e 0a  .   Also obtain.
18570 20 20 2a 2a 20 73 75 66 66 69 63 69 65 6e 74 20    ** sufficient 
18580 73 70 61 63 65 20 28 69 6e 20 7a 4d 61 73 74 65  space (in zMaste
18590 72 50 74 72 29 20 74 6f 20 68 6f 6c 64 20 74 68  rPtr) to hold th
185a0 65 20 6e 61 6d 65 73 20 6f 66 20 6d 61 73 74 65  e names of maste
185b0 72 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  r.  ** journal f
185c0 69 6c 65 73 20 65 78 74 72 61 63 74 65 64 20 66  iles extracted f
185d0 72 6f 6d 20 72 65 67 75 6c 61 72 20 72 6f 6c 6c  rom regular roll
185e0 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c 73 2e 0a 20  back-journals.. 
185f0 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
18600 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4d 61  e3OsFileSize(pMa
18610 73 74 65 72 2c 20 26 6e 4d 61 73 74 65 72 4a 6f  ster, &nMasterJo
18620 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 72 63  urnal);.  if( rc
18630 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
18640 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
18650 3b 0a 20 20 6e 4d 61 73 74 65 72 50 74 72 20 3d  ;.  nMasterPtr =
18660 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
18670 65 2b 31 3b 0a 20 20 7a 4d 61 73 74 65 72 4a 6f  e+1;.  zMasterJo
18680 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 4d  urnal = sqlite3M
18690 61 6c 6c 6f 63 28 28 69 6e 74 29 6e 4d 61 73 74  alloc((int)nMast
186a0 65 72 4a 6f 75 72 6e 61 6c 20 2b 20 6e 4d 61 73  erJournal + nMas
186b0 74 65 72 50 74 72 20 2b 20 31 29 3b 0a 20 20 69  terPtr + 1);.  i
186c0 66 28 20 21 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  f( !zMasterJourn
186d0 61 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  al ){.    rc = S
186e0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
186f0 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
18700 6f 75 74 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74  out;.  }.  zMast
18710 65 72 50 74 72 20 3d 20 26 7a 4d 61 73 74 65 72  erPtr = &zMaster
18720 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a  Journal[nMasterJ
18730 6f 75 72 6e 61 6c 2b 31 5d 3b 0a 20 20 72 63 20  ournal+1];.  rc 
18740 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
18750 70 4d 61 73 74 65 72 2c 20 7a 4d 61 73 74 65 72  pMaster, zMaster
18760 4a 6f 75 72 6e 61 6c 2c 20 28 69 6e 74 29 6e 4d  Journal, (int)nM
18770 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 30 29  asterJournal, 0)
18780 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
18790 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c  TE_OK ) goto del
187a0 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 7a 4d  master_out;.  zM
187b0 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61  asterJournal[nMa
187c0 73 74 65 72 4a 6f 75 72 6e 61 6c 5d 20 3d 20 30  sterJournal] = 0
187d0 3b 0a 0a 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20  ;..  zJournal = 
187e0 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a  zMasterJournal;.
187f0 20 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e    while( (zJourn
18800 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  al-zMasterJourna
18810 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  l)<nMasterJourna
18820 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 65 78 69  l ){.    int exi
18830 73 74 73 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  sts;.    rc = sq
18840 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56  lite3OsAccess(pV
18850 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51  fs, zJournal, SQ
18860 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
18870 54 53 2c 20 26 65 78 69 73 74 73 29 3b 0a 20 20  TS, &exists);.  
18880 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
18890 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  _OK ){.      got
188a0 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
188b0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65  .    }.    if( e
188c0 78 69 73 74 73 20 29 7b 0a 20 20 20 20 20 20 2f  xists ){.      /
188d0 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75  * One of the jou
188e0 72 6e 61 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f  rnals pointed to
188f0 20 62 79 20 74 68 65 20 6d 61 73 74 65 72 20 6a   by the master j
18900 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 2e 0a 20  ournal exists.. 
18910 20 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20       ** Open it 
18920 61 6e 64 20 63 68 65 63 6b 20 69 66 20 69 74 20  and check if it 
18930 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6d 61  points at the ma
18940 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66  ster journal. If
18950 0a 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 72 65  .      ** so, re
18960 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 65 6c  turn without del
18970 65 74 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72  eting the master
18980 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20   journal file.. 
18990 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e       */.      in
189a0 74 20 63 3b 0a 20 20 20 20 20 20 69 6e 74 20 66  t c;.      int f
189b0 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f  lags = (SQLITE_O
189c0 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c  PEN_READONLY|SQL
189d0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
189e0 55 52 4e 41 4c 29 3b 0a 20 20 20 20 20 20 72 63  URNAL);.      rc
189f0 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
18a00 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c  (pVfs, zJournal,
18a10 20 70 4a 6f 75 72 6e 61 6c 2c 20 66 6c 61 67 73   pJournal, flags
18a20 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
18a30 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
18a40 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65  .        goto de
18a50 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
18a60 20 20 20 7d 0a 0a 20 20 20 20 20 20 72 63 20 3d     }..      rc =
18a70 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e   readMasterJourn
18a80 61 6c 28 70 4a 6f 75 72 6e 61 6c 2c 20 7a 4d 61  al(pJournal, zMa
18a90 73 74 65 72 50 74 72 2c 20 6e 4d 61 73 74 65 72  sterPtr, nMaster
18aa0 50 74 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Ptr);.      sqli
18ab0 74 65 33 4f 73 43 6c 6f 73 65 28 70 4a 6f 75 72  te3OsClose(pJour
18ac0 6e 61 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20  nal);.      if( 
18ad0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
18ae0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65  .        goto de
18af0 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
18b00 20 20 20 7d 0a 0a 20 20 20 20 20 20 63 20 3d 20     }..      c = 
18b10 7a 4d 61 73 74 65 72 50 74 72 5b 30 5d 21 3d 30  zMasterPtr[0]!=0
18b20 20 26 26 20 73 74 72 63 6d 70 28 7a 4d 61 73 74   && strcmp(zMast
18b30 65 72 50 74 72 2c 20 7a 4d 61 73 74 65 72 29 3d  erPtr, zMaster)=
18b40 3d 30 3b 0a 20 20 20 20 20 20 69 66 28 20 63 20  =0;.      if( c 
18b50 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65  ){.        /* We
18b60 20 68 61 76 65 20 61 20 6d 61 74 63 68 2e 20 44   have a match. D
18b70 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65  o not delete the
18b80 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
18b90 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  file. */.       
18ba0 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
18bb0 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  out;.      }.   
18bc0 20 7d 0a 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20   }.    zJournal 
18bd0 2b 3d 20 28 73 71 6c 69 74 65 33 53 74 72 6c 65  += (sqlite3Strle
18be0 6e 33 30 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29  n30(zJournal)+1)
18bf0 3b 0a 20 20 7d 0a 20 0a 20 20 73 71 6c 69 74 65  ;.  }. .  sqlite
18c00 33 4f 73 43 6c 6f 73 65 28 70 4d 61 73 74 65 72  3OsClose(pMaster
18c10 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
18c20 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20  3OsDelete(pVfs, 
18c30 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 0a 64 65  zMaster, 0);..de
18c40 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20 73  lmaster_out:.  s
18c50 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 61 73  qlite3_free(zMas
18c60 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69  terJournal);.  i
18c70 66 28 20 70 4d 61 73 74 65 72 20 29 7b 0a 20 20  f( pMaster ){.  
18c80 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
18c90 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 61  (pMaster);.    a
18ca0 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70  ssert( !isOpen(p
18cb0 4a 6f 75 72 6e 61 6c 29 20 29 3b 0a 20 20 20 20  Journal) );.    
18cc0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4d 61  sqlite3_free(pMa
18cd0 73 74 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ster);.  }.  ret
18ce0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
18cf0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
18d00 69 73 20 75 73 65 64 20 74 6f 20 63 68 61 6e 67  is used to chang
18d10 65 20 74 68 65 20 61 63 74 75 61 6c 20 73 69 7a  e the actual siz
18d20 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
18d30 65 20 0a 2a 2a 20 66 69 6c 65 20 69 6e 20 74 68  e .** file in th
18d40 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 20 54  e file-system. T
18d50 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73  his only happens
18d60 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e 67   when committing
18d70 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a   a transaction,.
18d80 2a 2a 20 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61  ** or rolling ba
18d90 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ck a transaction
18da0 20 28 69 6e 63 6c 75 64 69 6e 67 20 72 6f 6c 6c   (including roll
18db0 69 6e 67 20 62 61 63 6b 20 61 20 68 6f 74 2d 6a  ing back a hot-j
18dc0 6f 75 72 6e 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49  ournal)..**.** I
18dd0 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  f the main datab
18de0 61 73 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  ase file is not 
18df0 6f 70 65 6e 2c 20 6f 72 20 74 68 65 20 70 61 67  open, or the pag
18e00 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 69 74  er is not in eit
18e10 68 65 72 0a 2a 2a 20 44 42 4d 4f 44 20 6f 72 20  her.** DBMOD or 
18e20 4f 50 45 4e 20 73 74 61 74 65 2c 20 74 68 69 73  OPEN state, this
18e30 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
18e40 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c  o-op. Otherwise,
18e50 20 74 68 65 20 73 69 7a 65 20 0a 2a 2a 20 6f 66   the size .** of
18e60 20 74 68 65 20 66 69 6c 65 20 69 73 20 63 68 61   the file is cha
18e70 6e 67 65 64 20 74 6f 20 6e 50 61 67 65 20 70 61  nged to nPage pa
18e80 67 65 73 20 28 6e 50 61 67 65 2a 70 50 61 67 65  ges (nPage*pPage
18e90 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65  r->pageSize byte
18ea0 73 29 2e 20 0a 2a 2a 20 49 66 20 74 68 65 20 66  s). .** If the f
18eb0 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 63  ile on disk is c
18ec0 75 72 72 65 6e 74 6c 79 20 6c 61 72 67 65 72 20  urrently larger 
18ed0 74 68 61 6e 20 6e 50 61 67 65 20 70 61 67 65 73  than nPage pages
18ee0 2c 20 74 68 65 6e 20 75 73 65 20 74 68 65 20 56  , then use the V
18ef0 46 53 0a 2a 2a 20 78 54 72 75 6e 63 61 74 65 28  FS.** xTruncate(
18f00 29 20 6d 65 74 68 6f 64 20 74 6f 20 74 72 75 6e  ) method to trun
18f10 63 61 74 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 4f  cate it..**.** O
18f20 72 2c 20 69 74 20 6d 69 67 68 74 20 6d 69 67 68  r, it might migh
18f30 74 20 62 65 20 74 68 65 20 63 61 73 65 20 74 68  t be the case th
18f40 61 74 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64  at the file on d
18f50 69 73 6b 20 69 73 20 73 6d 61 6c 6c 65 72 20 74  isk is smaller t
18f60 68 61 6e 20 0a 2a 2a 20 6e 50 61 67 65 20 70 61  han .** nPage pa
18f70 67 65 73 2e 20 53 6f 6d 65 20 6f 70 65 72 61 74  ges. Some operat
18f80 69 6e 67 20 73 79 73 74 65 6d 20 69 6d 70 6c 65  ing system imple
18f90 6d 65 6e 74 61 74 69 6f 6e 73 20 63 61 6e 20 67  mentations can g
18fa0 65 74 20 63 6f 6e 66 75 73 65 64 20 69 66 20 0a  et confused if .
18fb0 2a 2a 20 79 6f 75 20 74 72 79 20 74 6f 20 74 72  ** you try to tr
18fc0 75 6e 63 61 74 65 20 61 20 66 69 6c 65 20 74 6f  uncate a file to
18fd0 20 73 6f 6d 65 20 73 69 7a 65 20 74 68 61 74 20   some size that 
18fe0 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 69  is larger than i
18ff0 74 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20  t .** currently 
19000 69 73 2c 20 73 6f 20 64 65 74 65 63 74 20 74 68  is, so detect th
19010 69 73 20 63 61 73 65 20 61 6e 64 20 77 72 69 74  is case and writ
19020 65 20 61 20 73 69 6e 67 6c 65 20 7a 65 72 6f 20  e a single zero 
19030 62 79 74 65 20 74 6f 20 0a 2a 2a 20 74 68 65 20  byte to .** the 
19040 65 6e 64 20 6f 66 20 74 68 65 20 6e 65 77 20 66  end of the new f
19050 69 6c 65 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a  ile instead..**.
19060 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
19070 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
19080 4f 4b 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72  OK. If an IO err
19090 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
190a0 6d 6f 64 69 66 79 69 6e 67 0a 2a 2a 20 74 68 65  modifying.** the
190b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
190c0 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72  return the error
190d0 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c   code to the cal
190e0 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ler..*/.static i
190f0 6e 74 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74  nt pager_truncat
19100 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
19110 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20   Pgno nPage){.  
19120 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
19130 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  OK;.  assert( pP
19140 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
19150 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 61  GER_ERROR );.  a
19160 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
19170 53 74 61 74 65 21 3d 50 41 47 45 52 5f 52 45 41  State!=PAGER_REA
19180 44 45 52 20 29 3b 0a 20 20 0a 20 20 69 66 28 20  DER );.  .  if( 
19190 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
191a0 64 29 20 0a 20 20 20 26 26 20 28 70 50 61 67 65  d) .   && (pPage
191b0 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
191c0 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 7c 7c  _WRITER_DBMOD ||
191d0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
191e0 3d 50 41 47 45 52 5f 4f 50 45 4e 29 20 0a 20 20  =PAGER_OPEN) .  
191f0 29 7b 0a 20 20 20 20 69 36 34 20 63 75 72 72 65  ){.    i64 curre
19200 6e 74 53 69 7a 65 2c 20 6e 65 77 53 69 7a 65 3b  ntSize, newSize;
19210 0a 20 20 20 20 69 6e 74 20 73 7a 50 61 67 65 20  .    int szPage 
19220 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
19230 7a 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ze;.    assert( 
19240 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45  pPager->eLock==E
19250 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b  XCLUSIVE_LOCK );
19260 0a 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 49 73  .    /* TODO: Is
19270 20 69 74 20 73 61 66 65 20 74 6f 20 75 73 65 20   it safe to use 
19280 50 61 67 65 72 2e 64 62 46 69 6c 65 53 69 7a 65  Pager.dbFileSize
19290 20 68 65 72 65 3f 20 2a 2f 0a 20 20 20 20 72 63   here? */.    rc
192a0 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
192b0 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  Size(pPager->fd,
192c0 20 26 63 75 72 72 65 6e 74 53 69 7a 65 29 3b 0a   &currentSize);.
192d0 20 20 20 20 6e 65 77 53 69 7a 65 20 3d 20 73 7a      newSize = sz
192e0 50 61 67 65 2a 28 69 36 34 29 6e 50 61 67 65 3b  Page*(i64)nPage;
192f0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
19300 49 54 45 5f 4f 4b 20 26 26 20 63 75 72 72 65 6e  ITE_OK && curren
19310 74 53 69 7a 65 21 3d 6e 65 77 53 69 7a 65 20 29  tSize!=newSize )
19320 7b 0a 20 20 20 20 20 20 69 66 28 20 63 75 72 72  {.      if( curr
19330 65 6e 74 53 69 7a 65 3e 6e 65 77 53 69 7a 65 20  entSize>newSize 
19340 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
19350 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
19360 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 6e 65  e(pPager->fd, ne
19370 77 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 65  wSize);.      }e
19380 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 68 61  lse{.        cha
19390 72 20 2a 70 54 6d 70 20 3d 20 70 50 61 67 65 72  r *pTmp = pPager
193a0 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 20  ->pTmpSpace;.   
193b0 20 20 20 20 20 6d 65 6d 73 65 74 28 70 54 6d 70       memset(pTmp
193c0 2c 20 30 2c 20 73 7a 50 61 67 65 29 3b 0a 20 20  , 0, szPage);.  
193d0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
193e0 28 6e 65 77 53 69 7a 65 2d 73 7a 50 61 67 65 29  (newSize-szPage)
193f0 20 3c 20 20 63 75 72 72 65 6e 74 53 69 7a 65 20   <  currentSize 
19400 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
19410 61 73 65 28 20 28 6e 65 77 53 69 7a 65 2d 73 7a  ase( (newSize-sz
19420 50 61 67 65 29 20 3d 3d 20 63 75 72 72 65 6e 74  Page) == current
19430 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Size );.        
19440 74 65 73 74 63 61 73 65 28 20 28 6e 65 77 53 69  testcase( (newSi
19450 7a 65 2d 73 7a 50 61 67 65 29 20 3e 20 20 63 75  ze-szPage) >  cu
19460 72 72 65 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20  rrentSize );.   
19470 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
19480 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
19490 3e 66 64 2c 20 70 54 6d 70 2c 20 73 7a 50 61 67  >fd, pTmp, szPag
194a0 65 2c 20 6e 65 77 53 69 7a 65 2d 73 7a 50 61 67  e, newSize-szPag
194b0 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
194c0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
194d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
194e0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
194f0 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20  e = nPage;.     
19500 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
19510 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
19520 2a 2a 20 53 65 74 20 74 68 65 20 76 61 6c 75 65  ** Set the value
19530 20 6f 66 20 74 68 65 20 50 61 67 65 72 2e 73 65   of the Pager.se
19540 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c  ctorSize variabl
19550 65 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 0a  e for the given.
19560 2a 2a 20 70 61 67 65 72 20 62 61 73 65 64 20 6f  ** pager based o
19570 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75  n the value retu
19580 72 6e 65 64 20 62 79 20 74 68 65 20 78 53 65 63  rned by the xSec
19590 74 6f 72 53 69 7a 65 20 6d 65 74 68 6f 64 0a 2a  torSize method.*
195a0 2a 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 64 61  * of the open da
195b0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65  tabase file. The
195c0 20 73 65 63 74 6f 72 20 73 69 7a 65 20 77 69 6c   sector size wil
195d0 6c 20 62 65 20 75 73 65 64 20 75 73 65 64 20 0a  l be used used .
195e0 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ** to determine 
195f0 74 68 65 20 73 69 7a 65 20 61 6e 64 20 61 6c 69  the size and ali
19600 67 6e 6d 65 6e 74 20 6f 66 20 6a 6f 75 72 6e 61  gnment of journa
19610 6c 20 68 65 61 64 65 72 20 61 6e 64 20 0a 2a 2a  l header and .**
19620 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
19630 70 6f 69 6e 74 65 72 73 20 77 69 74 68 69 6e 20  pointers within 
19640 63 72 65 61 74 65 64 20 6a 6f 75 72 6e 61 6c 20  created journal 
19650 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  files..**.** For
19660 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   temporary files
19670 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73   the effective s
19680 65 63 74 6f 72 20 73 69 7a 65 20 69 73 20 61 6c  ector size is al
19690 77 61 79 73 20 35 31 32 20 62 79 74 65 73 2e 0a  ways 512 bytes..
196a0 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
196b0 20 66 6f 72 20 6e 6f 6e 2d 74 65 6d 70 6f 72 61   for non-tempora
196c0 72 79 20 66 69 6c 65 73 2c 20 74 68 65 20 65 66  ry files, the ef
196d0 66 65 63 74 69 76 65 20 73 65 63 74 6f 72 20 73  fective sector s
196e0 69 7a 65 20 69 73 0a 2a 2a 20 74 68 65 20 76 61  ize is.** the va
196f0 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
19700 74 68 65 20 78 53 65 63 74 6f 72 53 69 7a 65 28  the xSectorSize(
19710 29 20 6d 65 74 68 6f 64 20 72 6f 75 6e 64 65 64  ) method rounded
19720 20 75 70 20 74 6f 20 33 32 20 69 66 0a 2a 2a 20   up to 32 if.** 
19730 69 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  it is less than 
19740 33 32 2c 20 6f 72 20 72 6f 75 6e 64 65 64 20 64  32, or rounded d
19750 6f 77 6e 20 74 6f 20 4d 41 58 5f 53 45 43 54 4f  own to MAX_SECTO
19760 52 5f 53 49 5a 45 20 69 66 20 69 74 0a 2a 2a 20  R_SIZE if it.** 
19770 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
19780 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 2e  MAX_SECTOR_SIZE.
19790 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69  .**.** If the fi
197a0 6c 65 20 68 61 73 20 74 68 65 20 53 51 4c 49 54  le has the SQLIT
197b0 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46  E_IOCAP_POWERSAF
197c0 45 5f 4f 56 45 52 57 52 49 54 45 20 70 72 6f 70  E_OVERWRITE prop
197d0 65 72 74 79 2c 20 74 68 65 6e 20 73 65 74 0a 2a  erty, then set.*
197e0 2a 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20  * the effective 
197f0 73 65 63 74 6f 72 20 73 69 7a 65 20 74 6f 20 69  sector size to i
19800 74 73 20 6d 69 6e 69 6d 75 6d 20 76 61 6c 75 65  ts minimum value
19810 20 28 35 31 32 29 2e 20 20 54 68 65 20 70 75 72   (512).  The pur
19820 70 6f 73 65 20 6f 66 0a 2a 2a 20 70 50 61 67 65  pose of.** pPage
19830 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 69 73  r->sectorSize is
19840 20 74 6f 20 64 65 66 69 6e 65 20 74 68 65 20 22   to define the "
19850 62 6c 61 73 74 20 72 61 64 69 75 73 22 20 6f 66  blast radius" of
19860 20 62 79 74 65 73 20 74 68 61 74 0a 2a 2a 20 6d   bytes that.** m
19870 69 67 68 74 20 63 68 61 6e 67 65 20 69 66 20 61  ight change if a
19880 20 63 72 61 73 68 20 6f 63 63 75 72 73 20 77 68   crash occurs wh
19890 69 6c 65 20 77 72 69 74 69 6e 67 20 74 6f 20 61  ile writing to a
198a0 20 73 69 6e 67 6c 65 20 62 79 74 65 20 69 6e 0a   single byte in.
198b0 2a 2a 20 74 68 61 74 20 72 61 6e 67 65 2e 20 20  ** that range.  
198c0 42 75 74 20 77 69 74 68 20 50 4f 57 45 52 53 41  But with POWERSA
198d0 46 45 5f 4f 56 45 52 57 52 49 54 45 2c 20 74 68  FE_OVERWRITE, th
198e0 65 20 62 6c 61 73 74 20 72 61 64 69 75 73 20 69  e blast radius i
198f0 73 20 7a 65 72 6f 0a 2a 2a 20 28 74 68 61 74 20  s zero.** (that 
19900 69 73 20 77 68 61 74 20 50 4f 57 45 52 53 41 46  is what POWERSAF
19910 45 5f 4f 56 45 52 57 52 49 54 45 20 6d 65 61 6e  E_OVERWRITE mean
19920 73 29 2c 20 73 6f 20 77 65 20 6d 69 6e 69 6d 69  s), so we minimi
19930 7a 65 20 74 68 65 20 73 65 63 74 6f 72 0a 2a 2a  ze the sector.**
19940 20 73 69 7a 65 2e 20 20 46 6f 72 20 62 61 63 6b   size.  For back
19950 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c  wards compatibil
19960 69 74 79 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62  ity of the rollb
19970 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ack journal file
19980 20 66 6f 72 6d 61 74 2c 0a 2a 2a 20 77 65 20 63   format,.** we c
19990 61 6e 6e 6f 74 20 72 65 64 75 63 65 20 74 68 65  annot reduce the
199a0 20 65 66 66 65 63 74 69 76 65 20 73 65 63 74 6f   effective secto
199b0 72 20 73 69 7a 65 20 62 65 6c 6f 77 20 35 31 32  r size below 512
199c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
199d0 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 50   setSectorSize(P
199e0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
199f0 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
19a00 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70  pPager->fd) || p
19a10 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
19a20 29 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72  );..  if( pPager
19a30 2d 3e 74 65 6d 70 46 69 6c 65 0a 20 20 20 7c 7c  ->tempFile.   ||
19a40 20 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63   (sqlite3OsDevic
19a50 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
19a60 28 70 50 61 67 65 72 2d 3e 66 64 29 20 26 20 0a  (pPager->fd) & .
19a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
19a80 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52  LITE_IOCAP_POWER
19a90 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 29 21  SAFE_OVERWRITE)!
19aa0 3d 30 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 53  =0.  ){.    /* S
19ab0 65 63 74 6f 72 20 73 69 7a 65 20 64 6f 65 73 6e  ector size doesn
19ac0 27 74 20 6d 61 74 74 65 72 20 66 6f 72 20 74 65  't matter for te
19ad0 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 41  mporary files. A
19ae0 6c 73 6f 2c 20 74 68 65 20 66 69 6c 65 0a 20 20  lso, the file.  
19af0 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 68 61 76    ** may not hav
19b00 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 79 65  e been opened ye
19b10 74 2c 20 69 6e 20 77 68 69 63 68 20 63 61 73 65  t, in which case
19b20 20 74 68 65 20 4f 73 53 65 63 74 6f 72 53 69 7a   the OsSectorSiz
19b30 65 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20  e().    ** call 
19b40 77 69 6c 6c 20 73 65 67 66 61 75 6c 74 2e 20 2a  will segfault. *
19b50 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65  /.    pPager->se
19b60 63 74 6f 72 53 69 7a 65 20 3d 20 35 31 32 3b 0a  ctorSize = 512;.
19b70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
19b80 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
19b90 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f  = sqlite3OsSecto
19ba0 72 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64  rSize(pPager->fd
19bb0 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
19bc0 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3c 33 32  r->sectorSize<32
19bd0 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
19be0 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 35  ->sectorSize = 5
19bf0 31 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  12;.    }.    if
19c00 28 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  ( pPager->sector
19c10 53 69 7a 65 3e 4d 41 58 5f 53 45 43 54 4f 52 5f  Size>MAX_SECTOR_
19c20 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 61 73  SIZE ){.      as
19c30 73 65 72 74 28 20 4d 41 58 5f 53 45 43 54 4f 52  sert( MAX_SECTOR
19c40 5f 53 49 5a 45 3e 3d 35 31 32 20 29 3b 0a 20 20  _SIZE>=512 );.  
19c50 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74      pPager->sect
19c60 6f 72 53 69 7a 65 20 3d 20 4d 41 58 5f 53 45 43  orSize = MAX_SEC
19c70 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 20 20 7d 0a  TOR_SIZE;.    }.
19c80 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61    }.}../*.** Pla
19c90 79 62 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61  yback the journa
19ca0 6c 20 61 6e 64 20 74 68 75 73 20 72 65 73 74 6f  l and thus resto
19cb0 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  re the database 
19cc0 66 69 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 73  file to.** the s
19cd0 74 61 74 65 20 69 74 20 77 61 73 20 69 6e 20 62  tate it was in b
19ce0 65 66 6f 72 65 20 77 65 20 73 74 61 72 74 65 64  efore we started
19cf0 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 2e   making changes.
19d00 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75    .**.** The jou
19d10 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74  rnal file format
19d20 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20   is as follows: 
19d30 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20 20 38 20 62  .**.**  (1)  8 b
19d40 79 74 65 20 70 72 65 66 69 78 2e 20 20 41 20 63  yte prefix.  A c
19d50 6f 70 79 20 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d  opy of aJournalM
19d60 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20  agic[]..**  (2) 
19d70 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69   4 byte big-endi
19d80 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
19d90 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
19da0 66 20 76 61 6c 69 64 20 70 61 67 65 20 72 65 63  f valid page rec
19db0 6f 72 64 73 0a 2a 2a 20 20 20 20 20 20 20 69 6e  ords.**       in
19dc0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49   the journal.  I
19dd0 66 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 20  f this value is 
19de0 30 78 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e  0xffffffff, then
19df0 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20   compute the.** 
19e00 20 20 20 20 20 20 6e 75 6d 62 65 72 20 6f 66 20        number of 
19e10 70 61 67 65 20 72 65 63 6f 72 64 73 20 66 72 6f  page records fro
19e20 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 69  m the journal si
19e30 7a 65 2e 0a 2a 2a 20 20 28 33 29 20 20 34 20 62  ze..**  (3)  4 b
19e40 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  yte big-endian i
19e50 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
19e60 74 68 65 20 69 6e 69 74 69 61 6c 20 76 61 6c 75  the initial valu
19e70 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 20 20  e for the .**   
19e80 20 20 20 20 73 61 6e 69 74 79 20 63 68 65 63 6b      sanity check
19e90 73 75 6d 2e 0a 2a 2a 20 20 28 34 29 20 20 34 20  sum..**  (4)  4 
19ea0 62 79 74 65 20 69 6e 74 65 67 65 72 20 77 68 69  byte integer whi
19eb0 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ch is the number
19ec0 20 6f 66 20 70 61 67 65 73 20 74 6f 20 74 72 75   of pages to tru
19ed0 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 20 20 20  ncate the.**    
19ee0 20 20 20 64 61 74 61 62 61 73 65 20 74 6f 20 64     database to d
19ef0 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b  uring a rollback
19f00 2e 0a 2a 2a 20 20 28 35 29 20 20 34 20 62 79 74  ..**  (5)  4 byt
19f10 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
19f20 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
19f30 65 20 73 65 63 74 6f 72 20 73 69 7a 65 2e 20 20  e sector size.  
19f40 54 68 65 20 68 65 61 64 65 72 0a 2a 2a 20 20 20  The header.**   
19f50 20 20 20 20 69 73 20 74 68 69 73 20 6d 61 6e 79      is this many
19f60 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a   bytes in size..
19f70 2a 2a 20 20 28 36 29 20 20 34 20 62 79 74 65 20  **  (6)  4 byte 
19f80 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
19f90 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
19fa0 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 20 28  page size..**  (
19fb0 37 29 20 20 7a 65 72 6f 20 70 61 64 64 69 6e 67  7)  zero padding
19fc0 20 6f 75 74 20 74 6f 20 74 68 65 20 6e 65 78 74   out to the next
19fd0 20 73 65 63 74 6f 72 20 73 69 7a 65 2e 0a 2a 2a   sector size..**
19fe0 20 20 28 38 29 20 20 5a 65 72 6f 20 6f 72 20 6d    (8)  Zero or m
19ff0 6f 72 65 20 70 61 67 65 73 20 69 6e 73 74 61 6e  ore pages instan
1a000 63 65 73 2c 20 65 61 63 68 20 61 73 20 66 6f 6c  ces, each as fol
1a010 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20  lows:.**        
1a020 2b 20 20 34 20 62 79 74 65 20 70 61 67 65 20 6e  +  4 byte page n
1a030 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20 20 20 20  umber..**       
1a040 20 2b 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65   +  pPager->page
1a050 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61  Size bytes of da
1a060 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20  ta..**        + 
1a070 20 34 20 62 79 74 65 20 63 68 65 63 6b 73 75 6d   4 byte checksum
1a080 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 65 20 73  .**.** When we s
1a090 70 65 61 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72  peak of the jour
1a0a0 6e 61 6c 20 68 65 61 64 65 72 2c 20 77 65 20 6d  nal header, we m
1a0b0 65 61 6e 20 74 68 65 20 66 69 72 73 74 20 37 20  ean the first 7 
1a0c0 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a 20  items above..** 
1a0d0 45 61 63 68 20 65 6e 74 72 79 20 69 6e 20 74 68  Each entry in th
1a0e0 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6e 20  e journal is an 
1a0f0 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
1a100 38 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20  8th item..**.** 
1a110 43 61 6c 6c 20 74 68 65 20 76 61 6c 75 65 20 66  Call the value f
1a120 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64 20 62  rom the second b
1a130 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e 20 20 6e  ullet "nRec".  n
1a140 52 65 63 20 69 73 20 74 68 65 20 6e 75 6d 62 65  Rec is the numbe
1a150 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64 20 70 61  r of.** valid pa
1a160 67 65 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  ge entries in th
1a170 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6d  e journal.  In m
1a180 6f 73 74 20 63 61 73 65 73 2c 20 79 6f 75 20 63  ost cases, you c
1a190 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a  an compute the.*
1a1a0 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20  * value of nRec 
1a1b0 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f 66  from the size of
1a1c0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1a1d0 65 2e 20 20 42 75 74 20 69 66 20 61 20 70 6f 77  e.  But if a pow
1a1e0 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 20 6f 63  er.** failure oc
1a1f0 63 75 72 72 65 64 20 77 68 69 6c 65 20 74 68 65  curred while the
1a200 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65 69   journal was bei
1a210 6e 67 20 77 72 69 74 74 65 6e 2c 20 69 74 20 63  ng written, it c
1a220 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a 2a 20 63  ould be the.** c
1a230 61 73 65 20 74 68 61 74 20 74 68 65 20 73 69 7a  ase that the siz
1a240 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
1a250 20 66 69 6c 65 20 68 61 64 20 61 6c 72 65 61 64   file had alread
1a260 79 20 62 65 65 6e 20 69 6e 63 72 65 61 73 65 64  y been increased
1a270 20 62 75 74 0a 2a 2a 20 74 68 65 20 65 78 74 72   but.** the extr
1a280 61 20 65 6e 74 72 69 65 73 20 68 61 64 20 6e 6f  a entries had no
1a290 74 20 79 65 74 20 6d 61 64 65 20 69 74 20 73 61  t yet made it sa
1a2a0 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e 20 20 49  fely to disk.  I
1a2b0 6e 20 73 75 63 68 20 61 20 63 61 73 65 2c 0a 2a  n such a case,.*
1a2c0 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e  * the value of n
1a2d0 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66 72 6f  Rec computed fro
1a2e0 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20  m the file size 
1a2f0 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20 6c 61 72  would be too lar
1a300 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 61 74  ge.  For.** that
1a310 20 72 65 61 73 6f 6e 2c 20 77 65 20 61 6c 77 61   reason, we alwa
1a320 79 73 20 75 73 65 20 74 68 65 20 6e 52 65 63 20  ys use the nRec 
1a330 76 61 6c 75 65 20 69 6e 20 74 68 65 20 68 65 61  value in the hea
1a340 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  der..**.** If th
1a350 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 73 20  e nRec value is 
1a360 30 78 66 66 66 66 66 66 66 66 20 69 74 20 6d 65  0xffffffff it me
1a370 61 6e 73 20 74 68 61 74 20 6e 52 65 63 20 73 68  ans that nRec sh
1a380 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64  ould be computed
1a390 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66 69 6c  .** from the fil
1a3a0 65 20 73 69 7a 65 2e 20 20 54 68 69 73 20 76 61  e size.  This va
1a3b0 6c 75 65 20 69 73 20 75 73 65 64 20 77 68 65 6e  lue is used when
1a3c0 20 74 68 65 20 75 73 65 72 20 73 65 6c 65 63 74   the user select
1a3d0 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63  s the.** no-sync
1a3e0 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74 68 65 20   option for the 
1a3f0 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70 6f 77 65  journal.  A powe
1a400 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20  r failure could 
1a410 6c 65 61 64 20 74 6f 20 63 6f 72 72 75 70 74 69  lead to corrupti
1a420 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61  on.** in this ca
1a430 73 65 2e 20 20 42 75 74 20 66 6f 72 20 74 68 69  se.  But for thi
1a440 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70 6f 72 61  ngs like tempora
1a450 72 79 20 74 61 62 6c 65 20 28 77 68 69 63 68 20  ry table (which 
1a460 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c 65 74  will be.** delet
1a470 65 64 20 77 68 65 6e 20 74 68 65 20 70 6f 77 65  ed when the powe
1a480 72 20 69 73 20 72 65 73 74 6f 72 65 64 29 20 77  r is restored) w
1a490 65 20 64 6f 6e 27 74 20 63 61 72 65 2e 20 20 0a  e don't care.  .
1a4a0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c  **.** If the fil
1a4b0 65 20 6f 70 65 6e 65 64 20 61 73 20 74 68 65 20  e opened as the 
1a4c0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
1a4d0 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65  not a well-forme
1a4e0 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  d.** journal fil
1a4f0 65 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73  e then all pages
1a500 20 75 70 20 74 6f 20 74 68 65 20 66 69 72 73 74   up to the first
1a510 20 63 6f 72 72 75 70 74 65 64 20 70 61 67 65 20   corrupted page 
1a520 61 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61  are rolled.** ba
1a530 63 6b 20 28 6f 72 20 6e 6f 20 70 61 67 65 73 20  ck (or no pages 
1a540 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  if the journal h
1a550 65 61 64 65 72 20 69 73 20 63 6f 72 72 75 70 74  eader is corrupt
1a560 65 64 29 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c  ed). The journal
1a570 20 66 69 6c 65 0a 2a 2a 20 69 73 20 74 68 65 6e   file.** is then
1a580 20 64 65 6c 65 74 65 64 20 61 6e 64 20 53 51 4c   deleted and SQL
1a590 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2c  ITE_OK returned,
1a5a0 20 6a 75 73 74 20 61 73 20 69 66 20 6e 6f 20 63   just as if no c
1a5b0 6f 72 72 75 70 74 69 6f 6e 20 68 61 64 0a 2a 2a  orruption had.**
1a5c0 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65   been encountere
1a5d0 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49  d..**.** If an I
1a5e0 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65  /O or malloc() e
1a5f0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65  rror occurs, the
1a600 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 69 73   journal-file is
1a610 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a 2a 2a 20   not deleted.** 
1a620 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  and an error cod
1a630 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
1a640 2a 0a 2a 2a 20 54 68 65 20 69 73 48 6f 74 20 70  *.** The isHot p
1a650 61 72 61 6d 65 74 65 72 20 69 6e 64 69 63 61 74  arameter indicat
1a660 65 73 20 74 68 61 74 20 77 65 20 61 72 65 20 74  es that we are t
1a670 72 79 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63  rying to rollbac
1a680 6b 20 61 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 74  k a journal.** t
1a690 68 61 74 20 6d 69 67 68 74 20 62 65 20 61 20 68  hat might be a h
1a6a0 6f 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 72 2c  ot journal.  Or,
1a6b0 20 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68 61   it could be tha
1a6c0 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  t the journal is
1a6d0 20 0a 2a 2a 20 70 72 65 73 65 72 76 65 64 20 62   .** preserved b
1a6e0 65 63 61 75 73 65 20 6f 66 20 4a 4f 55 52 4e 41  ecause of JOURNA
1a6f0 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20 6f 72  LMODE_PERSIST or
1a700 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55   JOURNALMODE_TRU
1a710 4e 43 41 54 45 2e 0a 2a 2a 20 49 66 20 74 68 65  NCATE..** If the
1a720 20 6a 6f 75 72 6e 61 6c 20 72 65 61 6c 6c 79 20   journal really 
1a730 69 73 20 68 6f 74 2c 20 72 65 73 65 74 20 74 68  is hot, reset th
1a740 65 20 70 61 67 65 72 20 63 61 63 68 65 20 70 72  e pager cache pr
1a750 69 6f 72 20 72 6f 6c 6c 69 6e 67 0a 2a 2a 20 62  ior rolling.** b
1a760 61 63 6b 20 61 6e 79 20 63 6f 6e 74 65 6e 74 2e  ack any content.
1a770 20 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c    If the journal
1a780 20 69 73 20 6d 65 72 65 6c 79 20 70 65 72 73 69   is merely persi
1a790 73 74 65 6e 74 2c 20 6e 6f 20 72 65 73 65 74 20  stent, no reset 
1a7a0 69 73 0a 2a 2a 20 6e 65 65 64 65 64 2e 0a 2a 2f  is.** needed..*/
1a7b0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
1a7c0 72 5f 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72  r_playback(Pager
1a7d0 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 69 73   *pPager, int is
1a7e0 48 6f 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  Hot){.  sqlite3_
1a7f0 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67  vfs *pVfs = pPag
1a800 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 36 34 20  er->pVfs;.  i64 
1a810 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20  szJ;            
1a820 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1a830 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1a840 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75   in bytes */.  u
1a850 33 32 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20  32 nRec;        
1a860 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1a870 72 20 6f 66 20 52 65 63 6f 72 64 73 20 69 6e 20  r of Records in 
1a880 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  the journal */. 
1a890 20 75 33 32 20 75 3b 20 20 20 20 20 20 20 20 20   u32 u;         
1a8a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73            /* Uns
1a8b0 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74  igned loop count
1a8c0 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50  er */.  Pgno mxP
1a8d0 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  g = 0;          
1a8e0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
1a8f0 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 20 69 6e  original file in
1a900 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20   pages */.  int 
1a910 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
1a920 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
1a930 6f 64 65 20 6f 66 20 61 20 73 75 62 72 6f 75 74  ode of a subrout
1a940 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73  ine */.  int res
1a950 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20   = 1;           
1a960 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72    /* Value retur
1a970 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 4f 73  ned by sqlite3Os
1a980 41 63 63 65 73 73 28 29 20 2a 2f 0a 20 20 63 68  Access() */.  ch
1a990 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b  ar *zMaster = 0;
1a9a0 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
1a9b0 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  f master journal
1a9c0 20 66 69 6c 65 20 69 66 20 61 6e 79 20 2a 2f 0a   file if any */.
1a9d0 20 20 69 6e 74 20 6e 65 65 64 50 61 67 65 72 52    int needPagerR
1a9e0 65 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 54 72  eset;      /* Tr
1a9f0 75 65 20 74 6f 20 72 65 73 65 74 20 70 61 67 65  ue to reset page
1aa00 20 70 72 69 6f 72 20 74 6f 20 66 69 72 73 74 20   prior to first 
1aa10 70 61 67 65 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f  page rollback */
1aa20 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
1aa30 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72  t how many recor
1aa40 64 73 20 61 72 65 20 69 6e 20 74 68 65 20 6a 6f  ds are in the jo
1aa50 75 72 6e 61 6c 2e 20 20 41 62 6f 72 74 20 65 61  urnal.  Abort ea
1aa60 72 6c 79 20 69 66 0a 20 20 2a 2a 20 74 68 65 20  rly if.  ** the 
1aa70 6a 6f 75 72 6e 61 6c 20 69 73 20 65 6d 70 74 79  journal is empty
1aa80 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
1aa90 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
1aaa0 6a 66 64 29 20 29 3b 0a 20 20 72 63 20 3d 20 73  jfd) );.  rc = s
1aab0 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
1aac0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73  (pPager->jfd, &s
1aad0 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  zJ);.  if( rc!=S
1aae0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1aaf0 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
1ab00 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61  k;.  }..  /* Rea
1ab10 64 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  d the master jou
1ab20 72 6e 61 6c 20 6e 61 6d 65 20 66 72 6f 6d 20 74  rnal name from t
1ab30 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69  he journal, if i
1ab40 74 20 69 73 20 70 72 65 73 65 6e 74 2e 0a 20 20  t is present..  
1ab50 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a  ** If a master j
1ab60 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
1ab70 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20 62   is specified, b
1ab80 75 74 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e  ut the file is n
1ab90 6f 74 0a 20 20 2a 2a 20 70 72 65 73 65 6e 74 20  ot.  ** present 
1aba0 6f 6e 20 64 69 73 6b 2c 20 74 68 65 6e 20 74 68  on disk, then th
1abb0 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74  e journal is not
1abc0 20 68 6f 74 20 61 6e 64 20 64 6f 65 73 20 6e 6f   hot and does no
1abd0 74 20 6e 65 65 64 20 74 6f 20 62 65 0a 20 20 2a  t need to be.  *
1abe0 2a 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20  * played back.. 
1abf0 20 2a 2a 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20 54   **.  ** TODO: T
1ac00 65 63 68 6e 69 63 61 6c 6c 79 20 74 68 65 20 66  echnically the f
1ac10 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61 6e 20 65  ollowing is an e
1ac20 72 72 6f 72 20 62 65 63 61 75 73 65 20 69 74 20  rror because it 
1ac30 61 73 73 75 6d 65 73 20 74 68 61 74 0a 20 20 2a  assumes that.  *
1ac40 2a 20 62 75 66 66 65 72 20 50 61 67 65 72 2e 70  * buffer Pager.p
1ac50 54 6d 70 53 70 61 63 65 20 69 73 20 28 6d 78 50  TmpSpace is (mxP
1ac60 61 74 68 6e 61 6d 65 2b 31 29 20 62 79 74 65 73  athname+1) bytes
1ac70 20 6f 72 20 6c 61 72 67 65 72 2e 20 69 2e 65 2e   or larger. i.e.
1ac80 20 74 68 61 74 0a 20 20 2a 2a 20 28 70 50 61 67   that.  ** (pPag
1ac90 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3e 3d 20  er->pageSize >= 
1aca0 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78  pPager->pVfs->mx
1acb0 50 61 74 68 6e 61 6d 65 2b 31 29 2e 20 55 73 69  Pathname+1). Usi
1acc0 6e 67 20 6f 73 5f 75 6e 69 78 2e 63 2c 0a 20 20  ng os_unix.c,.  
1acd0 2a 2a 20 20 6d 78 50 61 74 68 6e 61 6d 65 20 69  **  mxPathname i
1ace0 73 20 35 31 32 2c 20 77 68 69 63 68 20 69 73 20  s 512, which is 
1acf0 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
1ad00 6d 69 6e 69 6d 75 6d 20 61 6c 6c 6f 77 61 62 6c  minimum allowabl
1ad10 65 20 76 61 6c 75 65 0a 20 20 2a 2a 20 66 6f 72  e value.  ** for
1ad20 20 70 61 67 65 53 69 7a 65 2e 0a 20 20 2a 2f 0a   pageSize..  */.
1ad30 20 20 7a 4d 61 73 74 65 72 20 3d 20 70 50 61 67    zMaster = pPag
1ad40 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20  er->pTmpSpace;. 
1ad50 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72   rc = readMaster
1ad60 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e  Journal(pPager->
1ad70 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50  jfd, zMaster, pP
1ad80 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61  ager->pVfs->mxPa
1ad90 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 69 66 28  thname+1);.  if(
1ada0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1adb0 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20 29 7b 0a  & zMaster[0] ){.
1adc0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1add0 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a  OsAccess(pVfs, z
1ade0 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 41  Master, SQLITE_A
1adf0 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 72  CCESS_EXISTS, &r
1ae00 65 73 29 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74  es);.  }.  zMast
1ae10 65 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 72 63  er = 0;.  if( rc
1ae20 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21  !=SQLITE_OK || !
1ae30 72 65 73 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  res ){.    goto 
1ae40 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
1ae50 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  }.  pPager->jour
1ae60 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 6e 65  nalOff = 0;.  ne
1ae70 65 64 50 61 67 65 72 52 65 73 65 74 20 3d 20 69  edPagerReset = i
1ae80 73 48 6f 74 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  sHot;..  /* This
1ae90 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 65 73   loop terminates
1aea0 20 65 69 74 68 65 72 20 77 68 65 6e 20 61 20 72   either when a r
1aeb0 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20  eadJournalHdr() 
1aec0 6f 72 20 0a 20 20 2a 2a 20 70 61 67 65 72 5f 70  or .  ** pager_p
1aed0 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
1aee0 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 20  () call returns 
1aef0 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61  SQLITE_DONE or a
1af00 6e 20 49 4f 20 65 72 72 6f 72 20 0a 20 20 2a 2a  n IO error .  **
1af10 20 6f 63 63 75 72 73 2e 20 0a 20 20 2a 2f 0a 20   occurs. .  */. 
1af20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20   while( 1 ){.   
1af30 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6e 65 78   /* Read the nex
1af40 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
1af50 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
1af60 6c 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72  l file.  If ther
1af70 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 6e 6f 74  e are.    ** not
1af80 20 65 6e 6f 75 67 68 20 62 79 74 65 73 20 6c 65   enough bytes le
1af90 66 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ft in the journa
1afa0 6c 20 66 69 6c 65 20 66 6f 72 20 61 20 63 6f 6d  l file for a com
1afb0 70 6c 65 74 65 20 68 65 61 64 65 72 2c 20 6f 72  plete header, or
1afc0 0a 20 20 20 20 2a 2a 20 69 74 20 69 73 20 63 6f  .    ** it is co
1afd0 72 72 75 70 74 65 64 2c 20 74 68 65 6e 20 61 20  rrupted, then a 
1afe0 70 72 6f 63 65 73 73 20 6d 75 73 74 20 68 61 76  process must hav
1aff0 65 20 66 61 69 6c 65 64 20 77 68 69 6c 65 20 77  e failed while w
1b000 72 69 74 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a  riting it..    *
1b010 2a 20 54 68 69 73 20 69 6e 64 69 63 61 74 65 73  * This indicates
1b020 20 6e 6f 74 68 69 6e 67 20 6d 6f 72 65 20 6e 65   nothing more ne
1b030 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64  eds to be rolled
1b040 20 62 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20   back..    */.  
1b050 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e    rc = readJourn
1b060 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 69 73  alHdr(pPager, is
1b070 48 6f 74 2c 20 73 7a 4a 2c 20 26 6e 52 65 63 2c  Hot, szJ, &nRec,
1b080 20 26 6d 78 50 67 29 3b 0a 20 20 20 20 69 66 28   &mxPg);.    if(
1b090 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1b0a0 7b 20 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  { .      if( rc=
1b0b0 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a  =SQLITE_DONE ){.
1b0c0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
1b0d0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
1b0e0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70        goto end_p
1b0f0 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a  layback;.    }..
1b100 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69      /* If nRec i
1b110 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74 68  s 0xffffffff, th
1b120 65 6e 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20  en this journal 
1b130 77 61 73 20 63 72 65 61 74 65 64 20 62 79 20 61  was created by a
1b140 20 70 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20   process.    ** 
1b150 77 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73 79  working in no-sy
1b160 6e 63 20 6d 6f 64 65 2e 20 54 68 69 73 20 6d 65  nc mode. This me
1b170 61 6e 73 20 74 68 61 74 20 74 68 65 20 72 65 73  ans that the res
1b180 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
1b190 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 6f 6e  .    ** file con
1b1a0 73 69 73 74 73 20 6f 66 20 70 61 67 65 73 2c 20  sists of pages, 
1b1b0 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72  there are no mor
1b1c0 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
1b1d0 73 2e 20 43 6f 6d 70 75 74 65 0a 20 20 20 20 2a  s. Compute.    *
1b1e0 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e  * the value of n
1b1f0 52 65 63 20 62 61 73 65 64 20 6f 6e 20 74 68 69  Rec based on thi
1b200 73 20 61 73 73 75 6d 70 74 69 6f 6e 2e 0a 20 20  s assumption..  
1b210 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65    */.    if( nRe
1b220 63 3d 3d 30 78 66 66 66 66 66 66 66 66 20 29 7b  c==0xffffffff ){
1b230 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1b240 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1b250 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  f==JOURNAL_HDR_S
1b260 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  Z(pPager) );.   
1b270 20 20 20 6e 52 65 63 20 3d 20 28 69 6e 74 29 28     nRec = (int)(
1b280 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48  (szJ - JOURNAL_H
1b290 44 52 5f 53 5a 28 70 50 61 67 65 72 29 29 2f 4a  DR_SZ(pPager))/J
1b2a0 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
1b2b0 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ger));.    }..  
1b2c0 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20    /* If nRec is 
1b2d0 30 20 61 6e 64 20 74 68 69 73 20 72 6f 6c 6c 62  0 and this rollb
1b2e0 61 63 6b 20 69 73 20 6f 66 20 61 20 74 72 61 6e  ack is of a tran
1b2f0 73 61 63 74 69 6f 6e 20 63 72 65 61 74 65 64 20  saction created 
1b300 62 79 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 70  by this.    ** p
1b310 72 6f 63 65 73 73 20 61 6e 64 20 69 66 20 74 68  rocess and if th
1b320 69 73 20 69 73 20 74 68 65 20 66 69 6e 61 6c 20  is is the final 
1b330 68 65 61 64 65 72 20 69 6e 20 74 68 65 20 6a 6f  header in the jo
1b340 75 72 6e 61 6c 2c 20 74 68 65 6e 20 69 74 20 6d  urnal, then it m
1b350 65 61 6e 73 0a 20 20 20 20 2a 2a 20 74 68 61 74  eans.    ** that
1b360 20 74 68 69 73 20 70 61 72 74 20 6f 66 20 74 68   this part of th
1b370 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65  e journal was be
1b380 69 6e 67 20 66 69 6c 6c 65 64 20 62 75 74 20 68  ing filled but h
1b390 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 0a  as not yet been.
1b3a0 20 20 20 20 2a 2a 20 73 79 6e 63 65 64 20 74 6f      ** synced to
1b3b0 20 64 69 73 6b 2e 20 20 43 6f 6d 70 75 74 65 20   disk.  Compute 
1b3c0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
1b3d0 67 65 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ges based on the
1b3e0 20 72 65 6d 61 69 6e 69 6e 67 0a 20 20 20 20 2a   remaining.    *
1b3f0 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69  * size of the fi
1b400 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le..    **.    *
1b410 2a 20 54 68 65 20 74 68 69 72 64 20 74 65 72 6d  * The third term
1b420 20 6f 66 20 74 68 65 20 74 65 73 74 20 77 61 73   of the test was
1b430 20 61 64 64 65 64 20 74 6f 20 66 69 78 20 74 69   added to fix ti
1b440 63 6b 65 74 20 23 32 35 36 35 2e 0a 20 20 20 20  cket #2565..    
1b450 2a 2a 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20  ** When rolling 
1b460 62 61 63 6b 20 61 20 68 6f 74 20 6a 6f 75 72 6e  back a hot journ
1b470 61 6c 2c 20 6e 52 65 63 3d 3d 30 20 61 6c 77 61  al, nRec==0 alwa
1b480 79 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  ys means that th
1b490 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 63 68  e next.    ** ch
1b4a0 75 6e 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  unk of the journ
1b4b0 61 6c 20 63 6f 6e 74 61 69 6e 73 20 7a 65 72 6f  al contains zero
1b4c0 20 70 61 67 65 73 20 74 6f 20 62 65 20 72 6f 6c   pages to be rol
1b4d0 6c 65 64 20 62 61 63 6b 2e 20 20 42 75 74 0a 20  led back.  But. 
1b4e0 20 20 20 2a 2a 20 77 68 65 6e 20 64 6f 69 6e 67     ** when doing
1b4f0 20 61 20 52 4f 4c 4c 42 41 43 4b 20 61 6e 64 20   a ROLLBACK and 
1b500 74 68 65 20 6e 52 65 63 3d 3d 30 20 63 68 75 6e  the nRec==0 chun
1b510 6b 20 69 73 20 74 68 65 20 6c 61 73 74 20 63 68  k is the last ch
1b520 75 6e 6b 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68  unk in.    ** th
1b530 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 6d 65  e journal, it me
1b540 61 6e 73 20 74 68 61 74 20 74 68 65 20 6a 6f 75  ans that the jou
1b550 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61  rnal might conta
1b560 69 6e 20 61 64 64 69 74 69 6f 6e 61 6c 0a 20 20  in additional.  
1b570 20 20 2a 2a 20 70 61 67 65 73 20 74 68 61 74 20    ** pages that 
1b580 6e 65 65 64 20 74 6f 20 62 65 20 72 6f 6c 6c 65  need to be rolle
1b590 64 20 62 61 63 6b 20 61 6e 64 20 74 68 61 74 20  d back and that 
1b5a0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
1b5b0 67 65 73 20 0a 20 20 20 20 2a 2a 20 73 68 6f 75  ges .    ** shou
1b5c0 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64 20 62  ld be computed b
1b5d0 61 73 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72  ased on the jour
1b5e0 6e 61 6c 20 66 69 6c 65 20 73 69 7a 65 2e 0a 20  nal file size.. 
1b5f0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52     */.    if( nR
1b600 65 63 3d 3d 30 20 26 26 20 21 69 73 48 6f 74 20  ec==0 && !isHot 
1b610 26 26 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  &&.        pPage
1b620 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f  r->journalHdr+JO
1b630 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
1b640 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f  ger)==pPager->jo
1b650 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20  urnalOff ){.    
1b660 20 20 6e 52 65 63 20 3d 20 28 69 6e 74 29 28 28    nRec = (int)((
1b670 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f  szJ - pPager->jo
1b680 75 72 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f 55 52  urnalOff) / JOUR
1b690 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
1b6a0 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ));.    }..    /
1b6b0 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  * If this is the
1b6c0 20 66 69 72 73 74 20 68 65 61 64 65 72 20 72 65   first header re
1b6d0 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ad from the jour
1b6e0 6e 61 6c 2c 20 74 72 75 6e 63 61 74 65 20 74 68  nal, truncate th
1b6f0 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
1b700 65 20 66 69 6c 65 20 62 61 63 6b 20 74 6f 20 69  e file back to i
1b710 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65  ts original size
1b720 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1b730 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1b740 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52  Off==JOURNAL_HDR
1b750 5f 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20  _SZ(pPager) ){. 
1b760 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
1b770 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c  truncate(pPager,
1b780 20 6d 78 50 67 29 3b 0a 20 20 20 20 20 20 69 66   mxPg);.      if
1b790 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1b7a0 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
1b7b0 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
1b7c0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67      }.      pPag
1b7d0 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 78 50  er->dbSize = mxP
1b7e0 67 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  g;.    }..    /*
1b7f0 20 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70   Copy original p
1b800 61 67 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20  ages out of the 
1b810 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b  journal and back
1b820 20 69 6e 74 6f 20 74 68 65 20 0a 20 20 20 20 2a   into the .    *
1b830 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  * database file 
1b840 61 6e 64 2f 6f 72 20 70 61 67 65 20 63 61 63 68  and/or page cach
1b850 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  e..    */.    fo
1b860 72 28 75 3d 30 3b 20 75 3c 6e 52 65 63 3b 20 75  r(u=0; u<nRec; u
1b870 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e  ++){.      if( n
1b880 65 65 64 50 61 67 65 72 52 65 73 65 74 20 29 7b  eedPagerReset ){
1b890 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 72  .        pager_r
1b8a0 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
1b8b0 20 20 20 20 20 20 6e 65 65 64 50 61 67 65 72 52        needPagerR
1b8c0 65 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  eset = 0;.      
1b8d0 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  }.      rc = pag
1b8e0 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
1b8f0 70 61 67 65 28 70 50 61 67 65 72 2c 26 70 50 61  page(pPager,&pPa
1b900 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ger->journalOff,
1b910 30 2c 31 2c 30 29 3b 0a 20 20 20 20 20 20 69 66  0,1,0);.      if
1b920 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1b930 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  ){.        if( r
1b940 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
1b950 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  {.          pPag
1b960 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
1b970 20 73 7a 4a 3b 0a 20 20 20 20 20 20 20 20 20 20   szJ;.          
1b980 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
1b990 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c  else if( rc==SQL
1b9a0 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
1b9b0 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20  READ ){.        
1b9c0 20 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75 72    /* If the jour
1b9d0 6e 61 6c 20 68 61 73 20 62 65 65 6e 20 74 72 75  nal has been tru
1b9e0 6e 63 61 74 65 64 2c 20 73 69 6d 70 6c 79 20 73  ncated, simply s
1b9f0 74 6f 70 20 72 65 61 64 69 6e 67 20 61 6e 64 0a  top reading and.
1ba00 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f            ** pro
1ba10 63 65 73 73 69 6e 67 20 74 68 65 20 6a 6f 75 72  cessing the jour
1ba20 6e 61 6c 2e 20 54 68 69 73 20 6d 69 67 68 74 20  nal. This might 
1ba30 68 61 70 70 65 6e 20 69 66 20 74 68 65 20 6a 6f  happen if the jo
1ba40 75 72 6e 61 6c 20 77 61 73 0a 20 20 20 20 20 20  urnal was.      
1ba50 20 20 20 20 2a 2a 20 6e 6f 74 20 63 6f 6d 70 6c      ** not compl
1ba60 65 74 65 6c 79 20 77 72 69 74 74 65 6e 20 61 6e  etely written an
1ba70 64 20 73 79 6e 63 65 64 20 70 72 69 6f 72 20 74  d synced prior t
1ba80 6f 20 61 20 63 72 61 73 68 2e 20 20 49 6e 20 74  o a crash.  In t
1ba90 68 61 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  hat.          **
1baa0 20 63 61 73 65 2c 20 74 68 65 20 64 61 74 61 62   case, the datab
1bab0 61 73 65 20 73 68 6f 75 6c 64 20 68 61 76 65 20  ase should have 
1bac0 6e 65 76 65 72 20 62 65 65 6e 20 77 72 69 74 74  never been writt
1bad0 65 6e 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20  en in the.      
1bae0 20 20 20 20 2a 2a 20 66 69 72 73 74 20 70 6c 61      ** first pla
1baf0 63 65 20 73 6f 20 69 74 20 69 73 20 4f 4b 20 74  ce so it is OK t
1bb00 6f 20 73 69 6d 70 6c 79 20 61 62 61 6e 64 6f 6e  o simply abandon
1bb10 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 2a   the rollback. *
1bb20 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  /.          rc =
1bb30 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1bb40 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70        goto end_p
1bb50 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 20  layback;.       
1bb60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1bb70 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 75    /* If we are u
1bb80 6e 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63  nable to rollbac
1bb90 6b 2c 20 71 75 69 74 20 61 6e 64 20 72 65 74 75  k, quit and retu
1bba0 72 6e 20 74 68 65 20 65 72 72 6f 72 0a 20 20 20  rn the error.   
1bbb0 20 20 20 20 20 20 20 2a 2a 20 63 6f 64 65 2e 20         ** code. 
1bbc0 20 54 68 69 73 20 77 69 6c 6c 20 63 61 75 73 65   This will cause
1bbd0 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 65 6e   the pager to en
1bbe0 74 65 72 20 74 68 65 20 65 72 72 6f 72 20 73 74  ter the error st
1bbf0 61 74 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ate.          **
1bc00 20 73 6f 20 74 68 61 74 20 6e 6f 20 66 75 72 74   so that no furt
1bc10 68 65 72 20 68 61 72 6d 20 77 69 6c 6c 20 62 65  her harm will be
1bc20 20 64 6f 6e 65 2e 20 20 50 65 72 68 61 70 73 20   done.  Perhaps 
1bc30 74 68 65 20 6e 65 78 74 0a 20 20 20 20 20 20 20  the next.       
1bc40 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 74 6f     ** process to
1bc50 20 63 6f 6d 65 20 61 6c 6f 6e 67 20 77 69 6c 6c   come along will
1bc60 20 62 65 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c   be able to roll
1bc70 62 61 63 6b 20 74 68 65 20 64 61 74 61 62 61 73  back the databas
1bc80 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  e..          */.
1bc90 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
1bca0 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  nd_playback;.   
1bcb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1bcc0 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54     }.  }.  /*NOT
1bcd0 52 45 41 43 48 45 44 2a 2f 0a 20 20 61 73 73 65  REACHED*/.  asse
1bce0 72 74 28 20 30 20 29 3b 0a 0a 65 6e 64 5f 70 6c  rt( 0 );..end_pl
1bcf0 61 79 62 61 63 6b 3a 0a 20 20 2f 2a 20 46 6f 6c  ayback:.  /* Fol
1bd00 6c 6f 77 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63  lowing a rollbac
1bd10 6b 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  k, the database 
1bd20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 62  file should be b
1bd30 61 63 6b 20 69 6e 20 69 74 73 20 6f 72 69 67 69  ack in its origi
1bd40 6e 61 6c 0a 20 20 2a 2a 20 73 74 61 74 65 20 70  nal.  ** state p
1bd50 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72  rior to the star
1bd60 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63  t of the transac
1bd70 74 69 6f 6e 2c 20 73 6f 20 69 6e 76 6f 6b 65 20  tion, so invoke 
1bd80 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f  the.  ** SQLITE_
1bd90 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47  FCNTL_DB_UNCHANG
1bda0 45 44 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20  ED file-control 
1bdb0 6d 65 74 68 6f 64 20 74 6f 20 64 69 73 61 62 6c  method to disabl
1bdc0 65 20 74 68 65 0a 20 20 2a 2a 20 61 73 73 65 72  e the.  ** asser
1bdd0 74 69 6f 6e 20 74 68 61 74 20 74 68 65 20 74 72  tion that the tr
1bde0 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65  ansaction counte
1bdf0 72 20 77 61 73 20 6d 6f 64 69 66 69 65 64 2e 0a  r was modified..
1be00 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 0a 20    */.  assert(. 
1be10 20 20 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70     pPager->fd->p
1be20 4d 65 74 68 6f 64 73 3d 3d 30 20 7c 7c 0a 20 20  Methods==0 ||.  
1be30 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43    sqlite3OsFileC
1be40 6f 6e 74 72 6f 6c 28 70 50 61 67 65 72 2d 3e 66  ontrol(pPager->f
1be50 64 2c 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44  d,SQLITE_FCNTL_D
1be60 42 5f 55 4e 43 48 41 4e 47 45 44 2c 30 29 3e 3d  B_UNCHANGED,0)>=
1be70 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 29 3b 0a 0a  SQLITE_OK.  );..
1be80 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70 6c 61    /* If this pla
1be90 79 62 61 63 6b 20 69 73 20 68 61 70 70 65 6e 69  yback is happeni
1bea0 6e 67 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ng automatically
1beb0 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20   as a result of 
1bec0 61 6e 20 49 4f 20 6f 72 20 0a 20 20 2a 2a 20 6d  an IO or .  ** m
1bed0 61 6c 6c 6f 63 20 65 72 72 6f 72 20 74 68 61 74  alloc error that
1bee0 20 6f 63 63 75 72 72 65 64 20 61 66 74 65 72 20   occurred after 
1bef0 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
1bf00 65 72 20 77 61 73 20 75 70 64 61 74 65 64 20 62  er was updated b
1bf10 75 74 20 0a 20 20 2a 2a 20 62 65 66 6f 72 65 20  ut .  ** before 
1bf20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1bf30 77 61 73 20 63 6f 6d 6d 69 74 74 65 64 2c 20 74  was committed, t
1bf40 68 65 6e 20 74 68 65 20 63 68 61 6e 67 65 2d 63  hen the change-c
1bf50 6f 75 6e 74 65 72 20 0a 20 20 2a 2a 20 6d 6f 64  ounter .  ** mod
1bf60 69 66 69 63 61 74 69 6f 6e 20 6d 61 79 20 6a 75  ification may ju
1bf70 73 74 20 68 61 76 65 20 62 65 65 6e 20 72 65 76  st have been rev
1bf80 65 72 74 65 64 2e 20 49 66 20 74 68 69 73 20 68  erted. If this h
1bf90 61 70 70 65 6e 73 20 69 6e 20 65 78 63 6c 75 73  appens in exclus
1bfa0 69 76 65 20 0a 20 20 2a 2a 20 6d 6f 64 65 2c 20  ive .  ** mode, 
1bfb0 74 68 65 6e 20 73 75 62 73 65 71 75 65 6e 74 20  then subsequent 
1bfc0 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 70 65 72  transactions per
1bfd0 66 6f 72 6d 65 64 20 62 79 20 74 68 65 20 63 6f  formed by the co
1bfe0 6e 6e 65 63 74 69 6f 6e 20 77 69 6c 6c 20 6e 6f  nnection will no
1bff0 74 0a 20 20 2a 2a 20 75 70 64 61 74 65 20 74 68  t.  ** update th
1c000 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
1c010 20 61 74 20 61 6c 6c 2e 20 54 68 69 73 20 6d 61   at all. This ma
1c020 79 20 6c 65 61 64 20 74 6f 20 63 61 63 68 65 20  y lead to cache 
1c030 69 6e 63 6f 6e 73 69 73 74 65 6e 63 79 0a 20 20  inconsistency.  
1c040 2a 2a 20 70 72 6f 62 6c 65 6d 73 20 66 6f 72 20  ** problems for 
1c050 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20  other processes 
1c060 61 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e  at some point in
1c070 20 74 68 65 20 66 75 74 75 72 65 2e 20 53 6f 2c   the future. So,
1c080 20 6a 75 73 74 0a 20 20 2a 2a 20 69 6e 20 63 61   just.  ** in ca
1c090 73 65 20 74 68 69 73 20 68 61 73 20 68 61 70 70  se this has happ
1c0a0 65 6e 65 64 2c 20 63 6c 65 61 72 20 74 68 65 20  ened, clear the 
1c0b0 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
1c0c0 66 6c 61 67 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20  flag now..  */. 
1c0d0 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
1c0e0 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65  ountDone = pPage
1c0f0 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 0a 20 20  r->tempFile;..  
1c100 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1c110 4b 20 29 7b 0a 20 20 20 20 7a 4d 61 73 74 65 72  K ){.    zMaster
1c120 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53   = pPager->pTmpS
1c130 70 61 63 65 3b 0a 20 20 20 20 72 63 20 3d 20 72  pace;.    rc = r
1c140 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  eadMasterJournal
1c150 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d  (pPager->jfd, zM
1c160 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 70  aster, pPager->p
1c170 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
1c180 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  1);.    testcase
1c190 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1c1a0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
1c1b0 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 26 26  =SQLITE_OK.   &&
1c1c0 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65   (pPager->eState
1c1d0 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  >=PAGER_WRITER_D
1c1e0 42 4d 4f 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e  BMOD || pPager->
1c1f0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
1c200 45 4e 29 0a 20 20 29 7b 0a 20 20 20 20 72 63 20  EN).  ){.    rc 
1c210 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 79  = sqlite3PagerSy
1c220 6e 63 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  nc(pPager);.  }.
1c230 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1c240 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
1c250 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61  pager_end_transa
1c260 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 7a 4d  ction(pPager, zM
1c270 61 73 74 65 72 5b 30 5d 21 3d 27 5c 30 27 29 3b  aster[0]!='\0');
1c280 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72  .    testcase( r
1c290 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
1c2a0 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
1c2b0 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74  LITE_OK && zMast
1c2c0 65 72 5b 30 5d 20 26 26 20 72 65 73 20 29 7b 0a  er[0] && res ){.
1c2d0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
1c2e0 77 61 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  was a master jou
1c2f0 72 6e 61 6c 20 61 6e 64 20 74 68 69 73 20 72 6f  rnal and this ro
1c300 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72  utine will retur
1c310 6e 20 73 75 63 63 65 73 73 2c 0a 20 20 20 20 2a  n success,.    *
1c320 2a 20 73 65 65 20 69 66 20 69 74 20 69 73 20 70  * see if it is p
1c330 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74  ossible to delet
1c340 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
1c350 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  rnal..    */.   
1c360 20 72 63 20 3d 20 70 61 67 65 72 5f 64 65 6c 6d   rc = pager_delm
1c370 61 73 74 65 72 28 70 50 61 67 65 72 2c 20 7a 4d  aster(pPager, zM
1c380 61 73 74 65 72 29 3b 0a 20 20 20 20 74 65 73 74  aster);.    test
1c390 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45  case( rc!=SQLITE
1c3a0 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _OK );.  }..  /*
1c3b0 20 54 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f   The Pager.secto
1c3c0 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 6d  rSize variable m
1c3d0 61 79 20 68 61 76 65 20 62 65 65 6e 20 75 70 64  ay have been upd
1c3e0 61 74 65 64 20 77 68 69 6c 65 20 72 6f 6c 6c 69  ated while rolli
1c3f0 6e 67 0a 20 20 2a 2a 20 62 61 63 6b 20 61 20 6a  ng.  ** back a j
1c400 6f 75 72 6e 61 6c 20 63 72 65 61 74 65 64 20 62  ournal created b
1c410 79 20 61 20 70 72 6f 63 65 73 73 20 77 69 74 68  y a process with
1c420 20 61 20 64 69 66 66 65 72 65 6e 74 20 73 65 63   a different sec
1c430 74 6f 72 20 73 69 7a 65 0a 20 20 2a 2a 20 76 61  tor size.  ** va
1c440 6c 75 65 2e 20 52 65 73 65 74 20 69 74 20 74 6f  lue. Reset it to
1c450 20 74 68 65 20 63 6f 72 72 65 63 74 20 76 61 6c   the correct val
1c460 75 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63  ue for this proc
1c470 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 65 74 53  ess..  */.  setS
1c480 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72  ectorSize(pPager
1c490 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1c4a0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74  }.../*.** Read t
1c4b0 68 65 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 70  he content for p
1c4c0 61 67 65 20 70 50 67 20 6f 75 74 20 6f 66 20 74  age pPg out of t
1c4d0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1c4e0 20 61 6e 64 20 69 6e 74 6f 20 0a 2a 2a 20 70 50   and into .** pP
1c4f0 67 2d 3e 70 44 61 74 61 2e 20 41 20 73 68 61 72  g->pData. A shar
1c500 65 64 20 6c 6f 63 6b 20 6f 72 20 67 72 65 61 74  ed lock or great
1c510 65 72 20 6d 75 73 74 20 62 65 20 68 65 6c 64 20  er must be held 
1c520 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  on the database.
1c530 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72 65 20 74  ** file before t
1c540 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1c550 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  called..**.** If
1c560 20 70 61 67 65 20 31 20 69 73 20 72 65 61 64 2c   page 1 is read,
1c570 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20   then the value 
1c580 6f 66 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56  of Pager.dbFileV
1c590 65 72 73 5b 5d 20 69 73 20 73 65 74 20 74 6f 0a  ers[] is set to.
1c5a0 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 72 65 61  ** the value rea
1c5b0 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  d from the datab
1c5c0 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ase file..**.** 
1c5d0 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  If an IO error o
1c5e0 63 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65 20  ccurs, then the 
1c5f0 49 4f 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  IO error is retu
1c600 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c  rned to the call
1c610 65 72 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  er..** Otherwise
1c620 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
1c630 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
1c640 69 63 20 69 6e 74 20 72 65 61 64 44 62 50 61 67  ic int readDbPag
1c650 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
1c660 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
1c670 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 20 2f 2a   pPg->pPager; /*
1c680 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 61 73   Pager object as
1c690 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 61  sociated with pa
1c6a0 67 65 20 70 50 67 20 2a 2f 0a 20 20 50 67 6e 6f  ge pPg */.  Pgno
1c6b0 20 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e   pgno = pPg->pgn
1c6c0 6f 3b 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65  o;       /* Page
1c6d0 20 6e 75 6d 62 65 72 20 74 6f 20 72 65 61 64 20   number to read 
1c6e0 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
1c6f0 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
1c700 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
1c710 20 2a 2f 0a 20 20 69 6e 74 20 69 73 49 6e 57 61   */.  int isInWa
1c720 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  l = 0;          
1c730 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70 61     /* True if pa
1c740 67 65 20 69 73 20 69 6e 20 6c 6f 67 20 66 69 6c  ge is in log fil
1c750 65 20 2a 2f 0a 20 20 69 6e 74 20 70 67 73 7a 20  e */.  int pgsz 
1c760 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
1c770 7a 65 3b 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  ze; /* Number of
1c780 20 62 79 74 65 73 20 74 6f 20 72 65 61 64 20 2a   bytes to read *
1c790 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
1c7a0 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
1c7b0 45 52 5f 52 45 41 44 45 52 20 26 26 20 21 4d 45  ER_READER && !ME
1c7c0 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28  MDB );.  assert(
1c7d0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
1c7e0 66 64 29 20 29 3b 0a 0a 20 20 69 66 28 20 4e 45  fd) );..  if( NE
1c7f0 56 45 52 28 21 69 73 4f 70 65 6e 28 70 50 61 67  VER(!isOpen(pPag
1c800 65 72 2d 3e 66 64 29 29 20 29 7b 0a 20 20 20 20  er->fd)) ){.    
1c810 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1c820 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20  tempFile );.    
1c830 6d 65 6d 73 65 74 28 70 50 67 2d 3e 70 44 61 74  memset(pPg->pDat
1c840 61 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61  a, 0, pPager->pa
1c850 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 72 65 74  geSize);.    ret
1c860 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1c870 20 7d 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55   }..  if( pagerU
1c880 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
1c890 0a 20 20 20 20 2f 2a 20 54 72 79 20 74 6f 20 70  .    /* Try to p
1c8a0 75 6c 6c 20 74 68 65 20 70 61 67 65 20 66 72 6f  ull the page fro
1c8b0 6d 20 74 68 65 20 77 72 69 74 65 2d 61 68 65 61  m the write-ahea
1c8c0 64 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20 20 72 63  d log. */.    rc
1c8d0 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 52 65 61   = sqlite3WalRea
1c8e0 64 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  d(pPager->pWal, 
1c8f0 70 67 6e 6f 2c 20 26 69 73 49 6e 57 61 6c 2c 20  pgno, &isInWal, 
1c900 70 67 73 7a 2c 20 70 50 67 2d 3e 70 44 61 74 61  pgsz, pPg->pData
1c910 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
1c920 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 69  =SQLITE_OK && !i
1c930 73 49 6e 57 61 6c 20 29 7b 0a 20 20 20 20 69 36  sInWal ){.    i6
1c940 34 20 69 4f 66 66 73 65 74 20 3d 20 28 70 67 6e  4 iOffset = (pgn
1c950 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72  o-1)*(i64)pPager
1c960 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  ->pageSize;.    
1c970 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
1c980 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  ad(pPager->fd, p
1c990 50 67 2d 3e 70 44 61 74 61 2c 20 70 67 73 7a 2c  Pg->pData, pgsz,
1c9a0 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 69   iOffset);.    i
1c9b0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f  f( rc==SQLITE_IO
1c9c0 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29  ERR_SHORT_READ )
1c9d0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
1c9e0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
1c9f0 7d 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31  }..  if( pgno==1
1ca00 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 20 29   ){.    if( rc )
1ca10 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
1ca20 65 20 72 65 61 64 20 69 73 20 75 6e 73 75 63 63  e read is unsucc
1ca30 65 73 73 66 75 6c 2c 20 73 65 74 20 74 68 65 20  essful, set the 
1ca40 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 74 6f 20  dbFileVers[] to 
1ca50 73 6f 6d 65 74 68 69 6e 67 0a 20 20 20 20 20 20  something.      
1ca60 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20 6e 65 76  ** that will nev
1ca70 65 72 20 62 65 20 61 20 76 61 6c 69 64 20 66 69  er be a valid fi
1ca80 6c 65 20 76 65 72 73 69 6f 6e 2e 20 20 64 62 46  le version.  dbF
1ca90 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 61 20 63  ileVers[] is a c
1caa0 6f 70 79 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  opy.      ** of 
1cab0 62 79 74 65 73 20 32 34 2e 2e 33 39 20 6f 66 20  bytes 24..39 of 
1cac0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 42  the database.  B
1cad0 79 74 65 73 20 32 38 2e 2e 33 31 20 73 68 6f 75  ytes 28..31 shou
1cae0 6c 64 20 61 6c 77 61 79 73 20 62 65 0a 20 20 20  ld always be.   
1caf0 20 20 20 2a 2a 20 7a 65 72 6f 20 6f 72 20 74 68     ** zero or th
1cb00 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  e size of the da
1cb10 74 61 62 61 73 65 20 69 6e 20 70 61 67 65 2e 20  tabase in page. 
1cb20 42 79 74 65 73 20 33 32 2e 2e 33 35 20 61 6e 64  Bytes 32..35 and
1cb30 20 33 35 2e 2e 33 39 0a 20 20 20 20 20 20 2a 2a   35..39.      **
1cb40 20 73 68 6f 75 6c 64 20 62 65 20 70 61 67 65 20   should be page 
1cb50 6e 75 6d 62 65 72 73 20 77 68 69 63 68 20 61 72  numbers which ar
1cb60 65 20 6e 65 76 65 72 20 30 78 66 66 66 66 66 66  e never 0xffffff
1cb70 66 66 2e 20 20 53 6f 20 66 69 6c 6c 69 6e 67 0a  ff.  So filling.
1cb80 20 20 20 20 20 20 2a 2a 20 70 50 61 67 65 72 2d        ** pPager-
1cb90 3e 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 77 69  >dbFileVers[] wi
1cba0 74 68 20 61 6c 6c 20 30 78 66 66 20 62 79 74 65  th all 0xff byte
1cbb0 73 20 73 68 6f 75 6c 64 20 73 75 66 66 69 63 65  s should suffice
1cbc0 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
1cbd0 20 2a 2a 20 46 6f 72 20 61 6e 20 65 6e 63 72 79   ** For an encry
1cbe0 70 74 65 64 20 64 61 74 61 62 61 73 65 2c 20 74  pted database, t
1cbf0 68 65 20 73 69 74 75 61 74 69 6f 6e 20 69 73 20  he situation is 
1cc00 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 3a 20 20 62  more complex:  b
1cc10 79 74 65 73 0a 20 20 20 20 20 20 2a 2a 20 32 34  ytes.      ** 24
1cc20 2e 2e 33 39 20 6f 66 20 74 68 65 20 64 61 74 61  ..39 of the data
1cc30 62 61 73 65 20 61 72 65 20 77 68 69 74 65 20 6e  base are white n
1cc40 6f 69 73 65 2e 20 20 42 75 74 20 74 68 65 20 70  oise.  But the p
1cc50 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 0a 20 20  robability of.  
1cc60 20 20 20 20 2a 2a 20 77 68 69 74 65 20 6e 6f 69      ** white noi
1cc70 73 69 6e 67 20 65 71 75 61 6c 69 6e 67 20 31 36  sing equaling 16
1cc80 20 62 79 74 65 73 20 6f 66 20 30 78 66 66 20 69   bytes of 0xff i
1cc90 73 20 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d  s vanishingly sm
1cca0 61 6c 6c 20 73 6f 0a 20 20 20 20 20 20 2a 2a 20  all so.      ** 
1ccb0 77 65 20 73 68 6f 75 6c 64 20 73 74 69 6c 6c 20  we should still 
1ccc0 62 65 20 6f 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a  be ok..      */.
1ccd0 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61        memset(pPa
1cce0 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c  ger->dbFileVers,
1ccf0 20 30 78 66 66 2c 20 73 69 7a 65 6f 66 28 70 50   0xff, sizeof(pP
1cd00 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
1cd10 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ));.    }else{. 
1cd20 20 20 20 20 20 75 38 20 2a 64 62 46 69 6c 65 56       u8 *dbFileV
1cd30 65 72 73 20 3d 20 26 28 28 75 38 2a 29 70 50 67  ers = &((u8*)pPg
1cd40 2d 3e 70 44 61 74 61 29 5b 32 34 5d 3b 0a 20 20  ->pData)[24];.  
1cd50 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
1cd60 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20  er->dbFileVers, 
1cd70 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65  dbFileVers, size
1cd80 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  of(pPager->dbFil
1cd90 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a 20  eVers));.    }. 
1cda0 20 7d 0a 20 20 43 4f 44 45 43 31 28 70 50 61 67   }.  CODEC1(pPag
1cdb0 65 72 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c 20  er, pPg->pData, 
1cdc0 70 67 6e 6f 2c 20 33 2c 20 72 63 20 3d 20 53 51  pgno, 3, rc = SQ
1cdd0 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 0a 20 20  LITE_NOMEM);..  
1cde0 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74  PAGER_INCR(sqlit
1cdf0 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f  e3_pager_readdb_
1ce00 63 6f 75 6e 74 29 3b 0a 20 20 50 41 47 45 52 5f  count);.  PAGER_
1ce10 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 52 65  INCR(pPager->nRe
1ce20 61 64 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28  ad);.  IOTRACE((
1ce30 22 50 47 49 4e 20 25 70 20 25 64 5c 6e 22 2c 20  "PGIN %p %d\n", 
1ce40 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a  pPager, pgno));.
1ce50 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 46    PAGERTRACE(("F
1ce60 45 54 43 48 20 25 64 20 70 61 67 65 20 25 64 20  ETCH %d page %d 
1ce70 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20  hash(%08x)\n",. 
1ce80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41                PA
1ce90 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
1cea0 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68  gno, pager_pageh
1ceb0 61 73 68 28 70 50 67 29 29 29 3b 0a 0a 20 20 72  ash(pPg)));..  r
1cec0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1ced0 2a 2a 20 55 70 64 61 74 65 20 74 68 65 20 76 61  ** Update the va
1cee0 6c 75 65 20 6f 66 20 74 68 65 20 63 68 61 6e 67  lue of the chang
1cef0 65 2d 63 6f 75 6e 74 65 72 20 61 74 20 6f 66 66  e-counter at off
1cf00 73 65 74 73 20 32 34 20 61 6e 64 20 39 32 20 69  sets 24 and 92 i
1cf10 6e 0a 2a 2a 20 74 68 65 20 68 65 61 64 65 72 20  n.** the header 
1cf20 61 6e 64 20 74 68 65 20 73 71 6c 69 74 65 20 76  and the sqlite v
1cf30 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20 61 74  ersion number at
1cf40 20 6f 66 66 73 65 74 20 39 36 2e 0a 2a 2a 0a 2a   offset 96..**.*
1cf50 2a 20 54 68 69 73 20 69 73 20 61 6e 20 75 6e 63  * This is an unc
1cf60 6f 6e 64 69 74 69 6f 6e 61 6c 20 75 70 64 61 74  onditional updat
1cf70 65 2e 20 20 53 65 65 20 61 6c 73 6f 20 74 68 65  e.  See also the
1cf80 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e   pager_incr_chan
1cf90 67 65 63 6f 75 6e 74 65 72 28 29 0a 2a 2a 20 72  gecounter().** r
1cfa0 6f 75 74 69 6e 65 20 77 68 69 63 68 20 6f 6e 6c  outine which onl
1cfb0 79 20 75 70 64 61 74 65 73 20 74 68 65 20 63 68  y updates the ch
1cfc0 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 69 66 20  ange-counter if 
1cfd0 74 68 65 20 75 70 64 61 74 65 20 69 73 20 61 63  the update is ac
1cfe0 74 75 61 6c 6c 79 0a 2a 2a 20 6e 65 65 64 65 64  tually.** needed
1cff0 2c 20 61 73 20 64 65 74 65 72 6d 69 6e 65 64 20  , as determined 
1d000 62 79 20 74 68 65 20 70 50 61 67 65 72 2d 3e 63  by the pPager->c
1d010 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 73  hangeCountDone s
1d020 74 61 74 65 20 76 61 72 69 61 62 6c 65 2e 0a 2a  tate variable..*
1d030 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
1d040 67 65 72 5f 77 72 69 74 65 5f 63 68 61 6e 67 65  ger_write_change
1d050 63 6f 75 6e 74 65 72 28 50 67 48 64 72 20 2a 70  counter(PgHdr *p
1d060 50 67 29 7b 0a 20 20 75 33 32 20 63 68 61 6e 67  Pg){.  u32 chang
1d070 65 5f 63 6f 75 6e 74 65 72 3b 0a 0a 20 20 2f 2a  e_counter;..  /*
1d080 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76   Increment the v
1d090 61 6c 75 65 20 6a 75 73 74 20 72 65 61 64 20 61  alue just read a
1d0a0 6e 64 20 77 72 69 74 65 20 69 74 20 62 61 63 6b  nd write it back
1d0b0 20 74 6f 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a   to byte 24. */.
1d0c0 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72    change_counter
1d0d0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62 79   = sqlite3Get4by
1d0e0 74 65 28 28 75 38 2a 29 70 50 67 2d 3e 70 50 61  te((u8*)pPg->pPa
1d0f0 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29  ger->dbFileVers)
1d100 2b 31 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28  +1;.  put32bits(
1d110 28 28 63 68 61 72 2a 29 70 50 67 2d 3e 70 44 61  ((char*)pPg->pDa
1d120 74 61 29 2b 32 34 2c 20 63 68 61 6e 67 65 5f 63  ta)+24, change_c
1d130 6f 75 6e 74 65 72 29 3b 0a 0a 20 20 2f 2a 20 41  ounter);..  /* A
1d140 6c 73 6f 20 73 74 6f 72 65 20 74 68 65 20 53 51  lso store the SQ
1d150 4c 69 74 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d  Lite version num
1d160 62 65 72 20 69 6e 20 62 79 74 65 73 20 39 36 2e  ber in bytes 96.
1d170 2e 39 39 20 61 6e 64 20 69 6e 0a 20 20 2a 2a 20  .99 and in.  ** 
1d180 62 79 74 65 73 20 39 32 2e 2e 39 35 20 73 74 6f  bytes 92..95 sto
1d190 72 65 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f  re the change co
1d1a0 75 6e 74 65 72 20 66 6f 72 20 77 68 69 63 68 20  unter for which 
1d1b0 74 68 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62  the version numb
1d1c0 65 72 0a 20 20 2a 2a 20 69 73 20 76 61 6c 69 64  er.  ** is valid
1d1d0 2e 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73  . */.  put32bits
1d1e0 28 28 28 63 68 61 72 2a 29 70 50 67 2d 3e 70 44  (((char*)pPg->pD
1d1f0 61 74 61 29 2b 39 32 2c 20 63 68 61 6e 67 65 5f  ata)+92, change_
1d200 63 6f 75 6e 74 65 72 29 3b 0a 20 20 70 75 74 33  counter);.  put3
1d210 32 62 69 74 73 28 28 28 63 68 61 72 2a 29 70 50  2bits(((char*)pP
1d220 67 2d 3e 70 44 61 74 61 29 2b 39 36 2c 20 53 51  g->pData)+96, SQ
1d230 4c 49 54 45 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d  LITE_VERSION_NUM
1d240 42 45 52 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  BER);.}..#ifndef
1d250 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
1d260 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
1d270 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20  tion is invoked 
1d280 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 70 61  once for each pa
1d290 67 65 20 74 68 61 74 20 68 61 73 20 61 6c 72 65  ge that has alre
1d2a0 61 64 79 20 62 65 65 6e 20 0a 2a 2a 20 77 72 69  ady been .** wri
1d2b0 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6c 6f  tten into the lo
1d2c0 67 20 66 69 6c 65 20 77 68 65 6e 20 61 20 57 41  g file when a WA
1d2d0 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  L transaction is
1d2e0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a   rolled back..**
1d2f0 20 50 61 72 61 6d 65 74 65 72 20 69 50 67 20 69   Parameter iPg i
1d300 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  s the page numbe
1d310 72 20 6f 66 20 73 61 69 64 20 70 61 67 65 2e 20  r of said page. 
1d320 54 68 65 20 70 43 74 78 20 61 72 67 75 6d 65 6e  The pCtx argumen
1d330 74 20 0a 2a 2a 20 69 73 20 61 63 74 75 61 6c 6c  t .** is actuall
1d340 79 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  y a pointer to t
1d350 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75  he Pager structu
1d360 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 67  re..**.** If pag
1d370 65 20 69 50 67 20 69 73 20 70 72 65 73 65 6e 74  e iPg is present
1d380 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20 61   in the cache, a
1d390 6e 64 20 68 61 73 20 6e 6f 20 6f 75 74 73 74 61  nd has no outsta
1d3a0 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73  nding references
1d3b0 2c 0a 2a 2a 20 69 74 20 69 73 20 64 69 73 63 61  ,.** it is disca
1d3c0 72 64 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rded. Otherwise,
1d3d0 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6f 6e   if there are on
1d3e0 65 20 6f 72 20 6d 6f 72 65 20 6f 75 74 73 74 61  e or more outsta
1d3f0 6e 64 69 6e 67 0a 2a 2a 20 72 65 66 65 72 65 6e  nding.** referen
1d400 63 65 73 2c 20 74 68 65 20 70 61 67 65 20 63 6f  ces, the page co
1d410 6e 74 65 6e 74 20 69 73 20 72 65 6c 6f 61 64 65  ntent is reloade
1d420 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  d from the datab
1d430 61 73 65 2e 20 49 66 20 74 68 65 0a 2a 2a 20 61  ase. If the.** a
1d440 74 74 65 6d 70 74 20 74 6f 20 72 65 6c 6f 61 64  ttempt to reload
1d450 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68   content from th
1d460 65 20 64 61 74 61 62 61 73 65 20 69 73 20 72 65  e database is re
1d470 71 75 69 72 65 64 20 61 6e 64 20 66 61 69 6c 73  quired and fails
1d480 2c 20 0a 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20  , .** return an 
1d490 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
1d4a0 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51  e. Otherwise, SQ
1d4b0 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74  LITE_OK..*/.stat
1d4c0 69 63 20 69 6e 74 20 70 61 67 65 72 55 6e 64 6f  ic int pagerUndo
1d4d0 43 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70  Callback(void *p
1d4e0 43 74 78 2c 20 50 67 6e 6f 20 69 50 67 29 7b 0a  Ctx, Pgno iPg){.
1d4f0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1d500 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70  E_OK;.  Pager *p
1d510 50 61 67 65 72 20 3d 20 28 50 61 67 65 72 20 2a  Pager = (Pager *
1d520 29 70 43 74 78 3b 0a 20 20 50 67 48 64 72 20 2a  )pCtx;.  PgHdr *
1d530 70 50 67 3b 0a 0a 20 20 70 50 67 20 3d 20 73 71  pPg;..  pPg = sq
1d540 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70  lite3PagerLookup
1d550 28 70 50 61 67 65 72 2c 20 69 50 67 29 3b 0a 20  (pPager, iPg);. 
1d560 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20   if( pPg ){.    
1d570 69 66 28 20 73 71 6c 69 74 65 33 50 63 61 63 68  if( sqlite3Pcach
1d580 65 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 50  ePageRefcount(pP
1d590 67 29 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 73  g)==1 ){.      s
1d5a0 71 6c 69 74 65 33 50 63 61 63 68 65 44 72 6f 70  qlite3PcacheDrop
1d5b0 28 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65  (pPg);.    }else
1d5c0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 61  {.      rc = rea
1d5d0 64 44 62 50 61 67 65 28 70 50 67 29 3b 0a 20 20  dDbPage(pPg);.  
1d5e0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1d5f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1d600 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74   pPager->xReinit
1d610 65 72 28 70 50 67 29 3b 0a 20 20 20 20 20 20 7d  er(pPg);.      }
1d620 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
1d630 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20  gerUnref(pPg);. 
1d640 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e     }.  }..  /* N
1d650 6f 72 6d 61 6c 6c 79 2c 20 69 66 20 61 20 74 72  ormally, if a tr
1d660 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c  ansaction is rol
1d670 6c 65 64 20 62 61 63 6b 2c 20 61 6e 79 20 62 61  led back, any ba
1d680 63 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20 61  ckup processes a
1d690 72 65 0a 20 20 2a 2a 20 75 70 64 61 74 65 64 20  re.  ** updated 
1d6a0 61 73 20 64 61 74 61 20 69 73 20 63 6f 70 69 65  as data is copie
1d6b0 64 20 6f 75 74 20 6f 66 20 74 68 65 20 72 6f 6c  d out of the rol
1d6c0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e  lback journal an
1d6d0 64 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20  d into the.  ** 
1d6e0 64 61 74 61 62 61 73 65 2e 20 54 68 69 73 20 69  database. This i
1d6f0 73 20 6e 6f 74 20 67 65 6e 65 72 61 6c 6c 79 20  s not generally 
1d700 70 6f 73 73 69 62 6c 65 20 77 69 74 68 20 61 20  possible with a 
1d710 57 41 4c 20 64 61 74 61 62 61 73 65 2c 20 61 73  WAL database, as
1d720 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 69  .  ** rollback i
1d730 6e 76 6f 6c 76 65 73 20 73 69 6d 70 6c 79 20 74  nvolves simply t
1d740 72 75 6e 63 61 74 69 6e 67 20 74 68 65 20 6c 6f  runcating the lo
1d750 67 20 66 69 6c 65 2e 20 54 68 65 72 65 66 6f 72  g file. Therefor
1d760 65 2c 20 69 66 20 6f 6e 65 0a 20 20 2a 2a 20 6f  e, if one.  ** o
1d770 72 20 6d 6f 72 65 20 66 72 61 6d 65 73 20 68 61  r more frames ha
1d780 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
1d790 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6c  written to the l
1d7a0 6f 67 20 28 61 6e 64 20 74 68 65 72 65 66 6f 72  og (and therefor
1d7b0 65 20 0a 20 20 2a 2a 20 61 6c 73 6f 20 63 6f 70  e .  ** also cop
1d7c0 69 65 64 20 69 6e 74 6f 20 74 68 65 20 62 61 63  ied into the bac
1d7d0 6b 75 70 20 64 61 74 61 62 61 73 65 73 29 20 61  kup databases) a
1d7e0 73 20 70 61 72 74 20 6f 66 20 74 68 69 73 20 74  s part of this t
1d7f0 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 20 20 2a 2a  ransaction,.  **
1d800 20 74 68 65 20 62 61 63 6b 75 70 73 20 6d 75 73   the backups mus
1d810 74 20 62 65 20 72 65 73 74 61 72 74 65 64 2e 0a  t be restarted..
1d820 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 61    */.  sqlite3Ba
1d830 63 6b 75 70 52 65 73 74 61 72 74 28 70 50 61 67  ckupRestart(pPag
1d840 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 0a 20  er->pBackup);.. 
1d850 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1d860 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1d870 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  on is called to 
1d880 72 6f 6c 6c 62 61 63 6b 20 61 20 74 72 61 6e 73  rollback a trans
1d890 61 63 74 69 6f 6e 20 6f 6e 20 61 20 57 41 4c 20  action on a WAL 
1d8a0 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61  database..*/.sta
1d8b0 74 69 63 20 69 6e 74 20 70 61 67 65 72 52 6f 6c  tic int pagerRol
1d8c0 6c 62 61 63 6b 57 61 6c 28 50 61 67 65 72 20 2a  lbackWal(Pager *
1d8d0 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
1d8e0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1d8f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1d900 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 50  turn Code */.  P
1d910 67 48 64 72 20 2a 70 4c 69 73 74 3b 20 20 20 20  gHdr *pList;    
1d920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d930 2a 20 4c 69 73 74 20 6f 66 20 64 69 72 74 79 20  * List of dirty 
1d940 70 61 67 65 73 20 74 6f 20 72 65 76 65 72 74 20  pages to revert 
1d950 2a 2f 0a 0a 20 20 2f 2a 20 46 6f 72 20 61 6c 6c  */..  /* For all
1d960 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 63 61   pages in the ca
1d970 63 68 65 20 74 68 61 74 20 61 72 65 20 63 75 72  che that are cur
1d980 72 65 6e 74 6c 79 20 64 69 72 74 79 20 6f 72 20  rently dirty or 
1d990 68 61 76 65 20 61 6c 72 65 61 64 79 0a 20 20 2a  have already.  *
1d9a0 2a 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 28  * been written (
1d9b0 62 75 74 20 6e 6f 74 20 63 6f 6d 6d 69 74 74 65  but not committe
1d9c0 64 29 20 74 6f 20 74 68 65 20 6c 6f 67 20 66 69  d) to the log fi
1d9d0 6c 65 2c 20 64 6f 20 6f 6e 65 20 6f 66 20 74 68  le, do one of th
1d9e0 65 20 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e  e .  ** followin
1d9f0 67 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2b  g:.  **.  **   +
1da00 20 44 69 73 63 61 72 64 20 74 68 65 20 63 61 63   Discard the cac
1da10 68 65 64 20 70 61 67 65 20 28 69 66 20 72 65 66  hed page (if ref
1da20 63 6f 75 6e 74 3d 3d 30 29 2c 20 6f 72 0a 20 20  count==0), or.  
1da30 2a 2a 20 20 20 2b 20 52 65 6c 6f 61 64 20 70 61  **   + Reload pa
1da40 67 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20  ge content from 
1da50 74 68 65 20 64 61 74 61 62 61 73 65 20 28 69 66  the database (if
1da60 20 72 65 66 63 6f 75 6e 74 3e 30 29 2e 0a 20 20   refcount>0)..  
1da70 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53  */.  pPager->dbS
1da80 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
1da90 4f 72 69 67 53 69 7a 65 3b 0a 20 20 72 63 20 3d  OrigSize;.  rc =
1daa0 20 73 71 6c 69 74 65 33 57 61 6c 55 6e 64 6f 28   sqlite3WalUndo(
1dab0 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 61  pPager->pWal, pa
1dac0 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 2c  gerUndoCallback,
1dad0 20 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72 29   (void *)pPager)
1dae0 3b 0a 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69  ;.  pList = sqli
1daf0 74 65 33 50 63 61 63 68 65 44 69 72 74 79 4c 69  te3PcacheDirtyLi
1db00 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  st(pPager->pPCac
1db10 68 65 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 4c  he);.  while( pL
1db20 69 73 74 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  ist && rc==SQLIT
1db30 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 67 48 64  E_OK ){.    PgHd
1db40 72 20 2a 70 4e 65 78 74 20 3d 20 70 4c 69 73 74  r *pNext = pList
1db50 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 72 63  ->pDirty;.    rc
1db60 20 3d 20 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c   = pagerUndoCall
1db70 62 61 63 6b 28 28 76 6f 69 64 20 2a 29 70 50 61  back((void *)pPa
1db80 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f  ger, pList->pgno
1db90 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70  );.    pList = p
1dba0 4e 65 78 74 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  Next;.  }..  ret
1dbb0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1dbc0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
1dbd0 73 20 61 20 77 72 61 70 70 65 72 20 61 72 6f 75  s a wrapper arou
1dbe0 6e 64 20 73 71 6c 69 74 65 33 57 61 6c 46 72 61  nd sqlite3WalFra
1dbf0 6d 65 73 28 29 2e 20 41 73 20 77 65 6c 6c 20 61  mes(). As well a
1dc00 73 20 6c 6f 67 67 69 6e 67 0a 2a 2a 20 74 68 65  s logging.** the
1dc10 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
1dc20 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20 68   list of pages h
1dc30 65 61 64 65 64 20 62 79 20 70 4c 69 73 74 20 28  eaded by pList (
1dc40 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 70 44 69  connected by pDi
1dc50 72 74 79 29 2c 0a 2a 2a 20 74 68 69 73 20 66 75  rty),.** this fu
1dc60 6e 63 74 69 6f 6e 20 6e 6f 74 69 66 69 65 73 20  nction notifies 
1dc70 61 6e 79 20 61 63 74 69 76 65 20 62 61 63 6b 75  any active backu
1dc80 70 20 70 72 6f 63 65 73 73 65 73 20 74 68 61 74  p processes that
1dc90 20 74 68 65 20 70 61 67 65 73 20 68 61 76 65 0a   the pages have.
1dca0 2a 2a 20 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 0a  ** changed. .**.
1dcb0 2a 2a 20 54 68 65 20 6c 69 73 74 20 6f 66 20 70  ** The list of p
1dcc0 61 67 65 73 20 70 61 73 73 65 64 20 69 6e 74 6f  ages passed into
1dcd0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1dce0 20 61 6c 77 61 79 73 20 73 6f 72 74 65 64 20 62   always sorted b
1dcf0 79 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a  y page number..*
1dd00 2a 20 48 65 6e 63 65 2c 20 69 66 20 70 61 67 65  * Hence, if page
1dd10 20 31 20 61 70 70 65 61 72 73 20 61 6e 79 77 68   1 appears anywh
1dd20 65 72 65 20 6f 6e 20 74 68 65 20 6c 69 73 74 2c  ere on the list,
1dd30 20 69 74 20 77 69 6c 6c 20 62 65 20 74 68 65 20   it will be the 
1dd40 66 69 72 73 74 20 70 61 67 65 2e 0a 2a 2f 20 0a  first page..*/ .
1dd50 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
1dd60 57 61 6c 46 72 61 6d 65 73 28 0a 20 20 50 61 67  WalFrames(.  Pag
1dd70 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
1dd80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1dd90 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  Pager object */.
1dda0 20 20 50 67 48 64 72 20 2a 70 4c 69 73 74 2c 20    PgHdr *pList, 
1ddb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ddc0 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72 61    /* List of fra
1ddd0 6d 65 73 20 74 6f 20 6c 6f 67 20 2a 2f 0a 20 20  mes to log */.  
1dde0 50 67 6e 6f 20 6e 54 72 75 6e 63 61 74 65 2c 20  Pgno nTruncate, 
1ddf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de00 2f 2a 20 44 61 74 61 62 61 73 65 20 73 69 7a 65  /* Database size
1de10 20 61 66 74 65 72 20 74 68 69 73 20 63 6f 6d 6d   after this comm
1de20 69 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f  it */.  int isCo
1de30 6d 6d 69 74 20 20 20 20 20 20 20 20 20 20 20 20  mmit            
1de40 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1de50 69 66 20 74 68 69 73 20 69 73 20 61 20 63 6f 6d  if this is a com
1de60 6d 69 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  mit */.){.  int 
1de70 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
1de80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1de90 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 23 69  eturn code */.#i
1dea0 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
1deb0 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e  _DEBUG) || defin
1dec0 65 64 28 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ed(SQLITE_CHECK_
1ded0 50 41 47 45 53 29 0a 20 20 50 67 48 64 72 20 2a  PAGES).  PgHdr *
1dee0 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
1def0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
1df00 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 70 61 67  looping over pag
1df10 65 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20  es */.#endif..  
1df20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1df30 70 57 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  pWal );.  assert
1df40 28 20 70 4c 69 73 74 20 29 3b 0a 23 69 66 64 65  ( pList );.#ifde
1df50 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
1df60 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20   /* Verify that 
1df70 74 68 65 20 70 61 67 65 20 6c 69 73 74 20 69 73  the page list is
1df80 20 69 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f 72   in accending or
1df90 64 65 72 20 2a 2f 0a 20 20 66 6f 72 28 70 3d 70  der */.  for(p=p
1dfa0 4c 69 73 74 3b 20 70 20 26 26 20 70 2d 3e 70 44  List; p && p->pD
1dfb0 69 72 74 79 3b 20 70 3d 70 2d 3e 70 44 69 72 74  irty; p=p->pDirt
1dfc0 79 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  y){.    assert( 
1dfd0 70 2d 3e 70 67 6e 6f 20 3c 20 70 2d 3e 70 44 69  p->pgno < p->pDi
1dfe0 72 74 79 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 7d  rty->pgno );.  }
1dff0 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 69  .#endif..  if( i
1e000 73 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 2f  sCommit ){.    /
1e010 2a 20 49 66 20 61 20 57 41 4c 20 74 72 61 6e 73  * If a WAL trans
1e020 61 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20  action is being 
1e030 63 6f 6d 6d 69 74 74 65 64 2c 20 74 68 65 72 65  committed, there
1e040 20 69 73 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20   is no point in 
1e050 77 72 69 74 69 6e 67 0a 20 20 20 20 2a 2a 20 61  writing.    ** a
1e060 6e 79 20 70 61 67 65 73 20 77 69 74 68 20 70 61  ny pages with pa
1e070 67 65 20 6e 75 6d 62 65 72 73 20 67 72 65 61 74  ge numbers great
1e080 65 72 20 74 68 61 6e 20 6e 54 72 75 6e 63 61 74  er than nTruncat
1e090 65 20 69 6e 74 6f 20 74 68 65 20 57 41 4c 20 66  e into the WAL f
1e0a0 69 6c 65 2e 0a 20 20 20 20 2a 2a 20 54 68 65 79  ile..    ** They
1e0b0 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 72   will never be r
1e0c0 65 61 64 20 62 79 20 61 6e 79 20 63 6c 69 65 6e  ead by any clien
1e0d0 74 2e 20 53 6f 20 72 65 6d 6f 76 65 20 74 68 65  t. So remove the
1e0e0 6d 20 66 72 6f 6d 20 74 68 65 20 70 44 69 72 74  m from the pDirt
1e0f0 79 0a 20 20 20 20 2a 2a 20 6c 69 73 74 20 68 65  y.    ** list he
1e100 72 65 2e 20 2a 2f 0a 20 20 20 20 50 67 48 64 72  re. */.    PgHdr
1e110 20 2a 70 3b 0a 20 20 20 20 50 67 48 64 72 20 2a   *p;.    PgHdr *
1e120 2a 70 70 4e 65 78 74 20 3d 20 26 70 4c 69 73 74  *ppNext = &pList
1e130 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 4c 69 73  ;.    for(p=pLis
1e140 74 3b 20 28 2a 70 70 4e 65 78 74 20 3d 20 70 29  t; (*ppNext = p)
1e150 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a  ; p=p->pDirty){.
1e160 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 67 6e        if( p->pgn
1e170 6f 3c 3d 6e 54 72 75 6e 63 61 74 65 20 29 20 70  o<=nTruncate ) p
1e180 70 4e 65 78 74 20 3d 20 26 70 2d 3e 70 44 69 72  pNext = &p->pDir
1e190 74 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  ty;.    }.    as
1e1a0 73 65 72 74 28 20 70 4c 69 73 74 20 29 3b 0a 20  sert( pList );. 
1e1b0 20 7d 0a 0a 20 20 69 66 28 20 70 4c 69 73 74 2d   }..  if( pList-
1e1c0 3e 70 67 6e 6f 3d 3d 31 20 29 20 70 61 67 65 72  >pgno==1 ) pager
1e1d0 5f 77 72 69 74 65 5f 63 68 61 6e 67 65 63 6f 75  _write_changecou
1e1e0 6e 74 65 72 28 70 4c 69 73 74 29 3b 0a 20 20 72  nter(pList);.  r
1e1f0 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 46 72  c = sqlite3WalFr
1e200 61 6d 65 73 28 70 50 61 67 65 72 2d 3e 70 57 61  ames(pPager->pWa
1e210 6c 2c 20 0a 20 20 20 20 20 20 70 50 61 67 65 72  l, .      pPager
1e220 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 4c 69 73  ->pageSize, pLis
1e230 74 2c 20 6e 54 72 75 6e 63 61 74 65 2c 20 69 73  t, nTruncate, is
1e240 43 6f 6d 6d 69 74 2c 20 70 50 61 67 65 72 2d 3e  Commit, pPager->
1e250 77 61 6c 53 79 6e 63 46 6c 61 67 73 0a 20 20 29  walSyncFlags.  )
1e260 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
1e270 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d  TE_OK && pPager-
1e280 3e 70 42 61 63 6b 75 70 20 29 7b 0a 20 20 20 20  >pBackup ){.    
1e290 50 67 48 64 72 20 2a 70 3b 0a 20 20 20 20 66 6f  PgHdr *p;.    fo
1e2a0 72 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d  r(p=pList; p; p=
1e2b0 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20  p->pDirty){.    
1e2c0 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55    sqlite3BackupU
1e2d0 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42  pdate(pPager->pB
1e2e0 61 63 6b 75 70 2c 20 70 2d 3e 70 67 6e 6f 2c 20  ackup, p->pgno, 
1e2f0 28 75 38 20 2a 29 70 2d 3e 70 44 61 74 61 29 3b  (u8 *)p->pData);
1e300 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64  .    }.  }..#ifd
1e310 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
1e320 50 41 47 45 53 0a 20 20 70 4c 69 73 74 20 3d 20  PAGES.  pList = 
1e330 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 69 72  sqlite3PcacheDir
1e340 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70  tyList(pPager->p
1e350 50 43 61 63 68 65 29 3b 0a 20 20 66 6f 72 28 70  PCache);.  for(p
1e360 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d 70 2d 3e  =pList; p; p=p->
1e370 70 44 69 72 74 79 29 7b 0a 20 20 20 20 70 61 67  pDirty){.    pag
1e380 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28  er_set_pagehash(
1e390 70 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  p);.  }.#endif..
1e3a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1e3b0 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20 72 65  /*.** Begin a re
1e3c0 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  ad transaction o
1e3d0 6e 20 74 68 65 20 57 41 4c 2e 0a 2a 2a 0a 2a 2a  n the WAL..**.**
1e3e0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 75 73   This routine us
1e3f0 65 64 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20  ed to be called 
1e400 22 70 61 67 65 72 4f 70 65 6e 53 6e 61 70 73 68  "pagerOpenSnapsh
1e410 6f 74 28 29 22 20 62 65 63 61 75 73 65 20 69 74  ot()" because it
1e420 20 65 73 73 65 6e 74 69 61 6c 6c 79 0a 2a 2a 20   essentially.** 
1e430 6d 61 6b 65 73 20 61 20 73 6e 61 70 73 68 6f 74  makes a snapshot
1e440 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1e450 20 61 74 20 74 68 65 20 63 75 72 72 65 6e 74 20   at the current 
1e460 70 6f 69 6e 74 20 69 6e 20 74 69 6d 65 20 61 6e  point in time an
1e470 64 20 70 72 65 73 65 72 76 65 73 0a 2a 2a 20 74  d preserves.** t
1e480 68 61 74 20 73 6e 61 70 73 68 6f 74 20 66 6f 72  hat snapshot for
1e490 20 75 73 65 20 62 79 20 74 68 65 20 72 65 61 64   use by the read
1e4a0 65 72 20 69 6e 20 73 70 69 74 65 20 6f 66 20 63  er in spite of c
1e4b0 6f 6e 63 75 72 72 65 6e 74 6c 79 20 63 68 61 6e  oncurrently chan
1e4c0 67 65 73 20 62 79 0a 2a 2a 20 6f 74 68 65 72 20  ges by.** other 
1e4d0 77 72 69 74 65 72 73 20 6f 72 20 63 68 65 63 6b  writers or check
1e4e0 70 6f 69 6e 74 65 72 73 2e 0a 2a 2f 0a 73 74 61  pointers..*/.sta
1e4f0 74 69 63 20 69 6e 74 20 70 61 67 65 72 42 65 67  tic int pagerBeg
1e500 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f  inReadTransactio
1e510 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  n(Pager *pPager)
1e520 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
1e530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e540 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
1e550 64 65 20 2a 2f 0a 20 20 69 6e 74 20 63 68 61 6e  de */.  int chan
1e560 67 65 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ged = 0;        
1e570 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1e580 69 66 20 63 61 63 68 65 20 6d 75 73 74 20 62 65  if cache must be
1e590 20 72 65 73 65 74 20 2a 2f 0a 0a 20 20 61 73 73   reset */..  ass
1e5a0 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c  ert( pagerUseWal
1e5b0 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73  (pPager) );.  as
1e5c0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
1e5d0 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
1e5e0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
1e5f0 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te==PAGER_READER
1e600 20 29 3b 0a 0a 20 20 2f 2a 20 73 71 6c 69 74 65   );..  /* sqlite
1e610 33 57 61 6c 45 6e 64 52 65 61 64 54 72 61 6e 73  3WalEndReadTrans
1e620 61 63 74 69 6f 6e 28 29 20 77 61 73 20 6e 6f 74  action() was not
1e630 20 63 61 6c 6c 65 64 20 66 6f 72 20 74 68 65 20   called for the 
1e640 70 72 65 76 69 6f 75 73 0a 20 20 2a 2a 20 74 72  previous.  ** tr
1e650 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 6c 6f 63  ansaction in loc
1e660 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53  king_mode=EXCLUS
1e670 49 56 45 2e 20 20 53 6f 20 63 61 6c 6c 20 69 74  IVE.  So call it
1e680 20 6e 6f 77 2e 20 20 49 66 20 77 65 0a 20 20 2a   now.  If we.  *
1e690 2a 20 61 72 65 20 69 6e 20 6c 6f 63 6b 69 6e 67  * are in locking
1e6a0 5f 6d 6f 64 65 3d 4e 4f 52 4d 41 4c 20 61 6e 64  _mode=NORMAL and
1e6b0 20 45 6e 64 52 65 61 64 28 29 20 77 61 73 20 70   EndRead() was p
1e6c0 72 65 76 69 6f 75 73 6c 79 20 63 61 6c 6c 65 64  reviously called
1e6d0 2c 0a 20 20 2a 2a 20 74 68 65 20 64 75 70 6c 69  ,.  ** the dupli
1e6e0 63 61 74 65 20 63 61 6c 6c 20 69 73 20 68 61 72  cate call is har
1e6f0 6d 6c 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71  mless..  */.  sq
1e700 6c 69 74 65 33 57 61 6c 45 6e 64 52 65 61 64 54  lite3WalEndReadT
1e710 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
1e720 72 2d 3e 70 57 61 6c 29 3b 0a 0a 20 20 72 63 20  r->pWal);..  rc 
1e730 3d 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67 69  = sqlite3WalBegi
1e740 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e  nReadTransaction
1e750 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 26  (pPager->pWal, &
1e760 63 68 61 6e 67 65 64 29 3b 0a 20 20 69 66 28 20  changed);.  if( 
1e770 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
1e780 20 63 68 61 6e 67 65 64 20 29 7b 0a 20 20 20 20   changed ){.    
1e790 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
1e7a0 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  er);.  }..  retu
1e7b0 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a  rn rc;.}.#endif.
1e7c0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
1e7d0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61  tion is called a
1e7e0 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 74 72  s part of the tr
1e7f0 61 6e 73 69 74 69 6f 6e 20 66 72 6f 6d 20 50 41  ansition from PA
1e800 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 74 6f 20 50  GER_OPEN.** to P
1e810 41 47 45 52 5f 52 45 41 44 45 52 20 73 74 61 74  AGER_READER stat
1e820 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  e to determine t
1e830 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  he size of the d
1e840 61 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20  atabase file.** 
1e850 69 6e 20 70 61 67 65 73 20 28 61 73 73 75 6d 69  in pages (assumi
1e860 6e 67 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  ng the page size
1e870 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65   currently store
1e880 64 20 69 6e 20 50 61 67 65 72 2e 70 61 67 65 53  d in Pager.pageS
1e890 69 7a 65 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  ize)..**.** If n
1e8a0 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  o error occurs, 
1e8b0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
1e8c0 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 73 69  urned and the si
1e8d0 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
1e8e0 73 65 0a 2a 2a 20 69 6e 20 70 61 67 65 73 20 69  se.** in pages i
1e8f0 73 20 73 74 6f 72 65 64 20 69 6e 20 2a 70 6e 50  s stored in *pnP
1e900 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  age. Otherwise, 
1e910 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 28 70  an error code (p
1e920 65 72 68 61 70 73 0a 2a 2a 20 53 51 4c 49 54 45  erhaps.** SQLITE
1e930 5f 49 4f 45 52 52 5f 46 53 54 41 54 29 20 69 73  _IOERR_FSTAT) is
1e940 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
1e950 6e 50 61 67 65 20 69 73 20 6c 65 66 74 20 75 6e  nPage is left un
1e960 6d 6f 64 69 66 69 65 64 2e 0a 2a 2f 0a 73 74 61  modified..*/.sta
1e970 74 69 63 20 69 6e 74 20 70 61 67 65 72 50 61 67  tic int pagerPag
1e980 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50  ecount(Pager *pP
1e990 61 67 65 72 2c 20 50 67 6e 6f 20 2a 70 6e 50 61  ager, Pgno *pnPa
1e9a0 67 65 29 7b 0a 20 20 50 67 6e 6f 20 6e 50 61 67  ge){.  Pgno nPag
1e9b0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1e9c0 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
1e9d0 74 6f 20 72 65 74 75 72 6e 20 76 69 61 20 2a 70  to return via *p
1e9e0 6e 50 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20 51  nPage */..  /* Q
1e9f0 75 65 72 79 20 74 68 65 20 57 41 4c 20 73 75 62  uery the WAL sub
1ea00 2d 73 79 73 74 65 6d 20 66 6f 72 20 74 68 65 20  -system for the 
1ea10 64 61 74 61 62 61 73 65 20 73 69 7a 65 2e 20 54  database size. T
1ea20 68 65 20 57 61 6c 44 62 73 69 7a 65 28 29 0a 20  he WalDbsize(). 
1ea30 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74   ** function ret
1ea40 75 72 6e 73 20 7a 65 72 6f 20 69 66 20 74 68 65  urns zero if the
1ea50 20 57 41 4c 20 69 73 20 6e 6f 74 20 6f 70 65 6e   WAL is not open
1ea60 20 28 69 2e 65 2e 20 50 61 67 65 72 2e 70 57 61   (i.e. Pager.pWa
1ea70 6c 3d 3d 30 29 2c 20 6f 72 0a 20 20 2a 2a 20 69  l==0), or.  ** i
1ea80 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  f the database s
1ea90 69 7a 65 20 69 73 20 6e 6f 74 20 61 76 61 69 6c  ize is not avail
1eaa0 61 62 6c 65 2e 20 54 68 65 20 64 61 74 61 62 61  able. The databa
1eab0 73 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a 20  se size is not. 
1eac0 20 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 66 72   ** available fr
1ead0 6f 6d 20 74 68 65 20 57 41 4c 20 73 75 62 2d 73  om the WAL sub-s
1eae0 79 73 74 65 6d 20 69 66 20 74 68 65 20 6c 6f 67  ystem if the log
1eaf0 20 66 69 6c 65 20 69 73 20 65 6d 70 74 79 20 6f   file is empty o
1eb00 72 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20  r.  ** contains 
1eb10 6e 6f 20 76 61 6c 69 64 20 63 6f 6d 6d 69 74 74  no valid committ
1eb20 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e  ed transactions.
1eb30 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
1eb40 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
1eb50 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20  PAGER_OPEN );.  
1eb60 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1eb70 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f  eLock>=SHARED_LO
1eb80 43 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 6f  CK || pPager->no
1eb90 52 65 61 64 6c 6f 63 6b 20 29 3b 0a 20 20 6e 50  Readlock );.  nP
1eba0 61 67 65 20 3d 20 73 71 6c 69 74 65 33 57 61 6c  age = sqlite3Wal
1ebb0 44 62 73 69 7a 65 28 70 50 61 67 65 72 2d 3e 70  Dbsize(pPager->p
1ebc0 57 61 6c 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  Wal);..  /* If t
1ebd0 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  he database size
1ebe0 20 77 61 73 20 6e 6f 74 20 61 76 61 69 6c 61 62   was not availab
1ebf0 6c 65 20 66 72 6f 6d 20 74 68 65 20 57 41 4c 20  le from the WAL 
1ec00 73 75 62 2d 73 79 73 74 65 6d 2c 0a 20 20 2a 2a  sub-system,.  **
1ec10 20 64 65 74 65 72 6d 69 6e 65 20 69 74 20 62 61   determine it ba
1ec20 73 65 64 20 6f 6e 20 74 68 65 20 73 69 7a 65 20  sed on the size 
1ec30 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1ec40 66 69 6c 65 2e 20 49 66 20 74 68 65 20 73 69 7a  file. If the siz
1ec50 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 64 61  e.  ** of the da
1ec60 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6e  tabase file is n
1ec70 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20 6d 75  ot an integer mu
1ec80 6c 74 69 70 6c 65 20 6f 66 20 74 68 65 20 70 61  ltiple of the pa
1ec90 67 65 2d 73 69 7a 65 2c 0a 20 20 2a 2a 20 72 6f  ge-size,.  ** ro
1eca0 75 6e 64 20 64 6f 77 6e 20 74 6f 20 74 68 65 20  und down to the 
1ecb0 6e 65 61 72 65 73 74 20 70 61 67 65 2e 20 45 78  nearest page. Ex
1ecc0 63 65 70 74 2c 20 61 6e 79 20 66 69 6c 65 20 6c  cept, any file l
1ecd0 61 72 67 65 72 20 74 68 61 6e 20 30 0a 20 20 2a  arger than 0.  *
1ece0 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 20  * bytes in size 
1ecf0 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f  is considered to
1ed00 20 63 6f 6e 74 61 69 6e 20 61 74 20 6c 65 61 73   contain at leas
1ed10 74 20 6f 6e 65 20 70 61 67 65 2e 0a 20 20 2a 2f  t one page..  */
1ed20 0a 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20  .  if( nPage==0 
1ed30 29 7b 0a 20 20 20 20 69 36 34 20 6e 20 3d 20 30  ){.    i64 n = 0
1ed40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1ed50 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1ed60 64 62 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73  db file in bytes
1ed70 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
1ed80 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
1ed90 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65  d) || pPager->te
1eda0 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 69 66  mpFile );.    if
1edb0 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
1edc0 3e 66 64 29 20 29 7b 0a 20 20 20 20 20 20 69 6e  >fd) ){.      in
1edd0 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73  t rc = sqlite3Os
1ede0 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
1edf0 3e 66 64 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20  >fd, &n);.      
1ee00 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1ee10 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
1ee20 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
1ee30 20 20 20 20 7d 0a 20 20 20 20 6e 50 61 67 65 20      }.    nPage 
1ee40 3d 20 28 50 67 6e 6f 29 28 6e 20 2f 20 70 50 61  = (Pgno)(n / pPa
1ee50 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
1ee60 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30      if( nPage==0
1ee70 20 26 26 20 6e 3e 30 20 29 7b 0a 20 20 20 20 20   && n>0 ){.     
1ee80 20 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20 20 20   nPage = 1;.    
1ee90 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  }.  }..  /* If t
1eea0 68 65 20 63 75 72 72 65 6e 74 20 6e 75 6d 62 65  he current numbe
1eeb0 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
1eec0 65 20 66 69 6c 65 20 69 73 20 67 72 65 61 74 65  e file is greate
1eed0 72 20 74 68 61 6e 20 74 68 65 0a 20 20 2a 2a 20  r than the.  ** 
1eee0 63 6f 6e 66 69 67 75 72 65 64 20 6d 61 78 69 6d  configured maxim
1eef0 75 6d 20 70 61 67 65 72 20 6e 75 6d 62 65 72 2c  um pager number,
1ef00 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 61 6c   increase the al
1ef10 6c 6f 77 65 64 20 6c 69 6d 69 74 20 73 6f 0a 20  lowed limit so. 
1ef20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 66 69 6c   ** that the fil
1ef30 65 20 63 61 6e 20 62 65 20 72 65 61 64 2e 0a 20  e can be read.. 
1ef40 20 2a 2f 0a 20 20 69 66 28 20 6e 50 61 67 65 3e   */.  if( nPage>
1ef50 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29  pPager->mxPgno )
1ef60 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78  {.    pPager->mx
1ef70 50 67 6e 6f 20 3d 20 28 50 67 6e 6f 29 6e 50 61  Pgno = (Pgno)nPa
1ef80 67 65 3b 0a 20 20 7d 0a 0a 20 20 2a 70 6e 50 61  ge;.  }..  *pnPa
1ef90 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 72 65  ge = nPage;.  re
1efa0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1efb0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
1efc0 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a  E_OMIT_WAL./*.**
1efd0 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 2a 2d   Check if the *-
1efe0 77 61 6c 20 66 69 6c 65 20 74 68 61 74 20 63 6f  wal file that co
1eff0 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68 65  rresponds to the
1f000 20 64 61 74 61 62 61 73 65 20 6f 70 65 6e 65 64   database opened
1f010 20 62 79 20 70 50 61 67 65 72 0a 2a 2a 20 65 78   by pPager.** ex
1f020 69 73 74 73 20 69 66 20 74 68 65 20 64 61 74 61  ists if the data
1f030 62 61 73 65 20 69 73 20 6e 6f 74 20 65 6d 70 79  base is not empy
1f040 2c 20 6f 72 20 76 65 72 69 66 79 20 74 68 61 74  , or verify that
1f050 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20   the *-wal file 
1f060 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 65 78 69 73  does.** not exis
1f070 74 20 28 62 79 20 64 65 6c 65 74 69 6e 67 20 69  t (by deleting i
1f080 74 29 20 69 66 20 74 68 65 20 64 61 74 61 62 61  t) if the databa
1f090 73 65 20 66 69 6c 65 20 69 73 20 65 6d 70 74 79  se file is empty
1f0a0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64  ..**.** If the d
1f0b0 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 65  atabase is not e
1f0c0 6d 70 74 79 20 61 6e 64 20 74 68 65 20 2a 2d 77  mpty and the *-w
1f0d0 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20  al file exists, 
1f0e0 6f 70 65 6e 20 74 68 65 20 70 61 67 65 72 0a 2a  open the pager.*
1f0f0 2a 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 20 20  * in WAL mode.  
1f100 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
1f110 69 73 20 65 6d 70 74 79 20 6f 72 20 69 66 20 6e  is empty or if n
1f120 6f 20 2a 2d 77 61 6c 20 66 69 6c 65 20 65 78 69  o *-wal file exi
1f130 73 74 73 20 61 6e 64 0a 2a 2a 20 69 66 20 6e 6f  sts and.** if no
1f140 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6d   error occurs, m
1f150 61 6b 65 20 73 75 72 65 20 50 61 67 65 72 2e 6a  ake sure Pager.j
1f160 6f 75 72 6e 61 6c 4d 6f 64 65 20 69 73 20 6e 6f  ournalMode is no
1f170 74 20 73 65 74 20 74 6f 0a 2a 2a 20 50 41 47 45  t set to.** PAGE
1f180 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
1f190 4c 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  L..**.** Return 
1f1a0 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 20 61 6e 20  SQLITE_OK or an 
1f1b0 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a  error code..**.*
1f1c0 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73  * The caller mus
1f1d0 74 20 68 6f 6c 64 20 61 20 53 48 41 52 45 44 20  t hold a SHARED 
1f1e0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
1f1f0 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63 61 6c  base file to cal
1f200 6c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  l this.** functi
1f210 6f 6e 2e 20 42 65 63 61 75 73 65 20 61 6e 20 45  on. Because an E
1f220 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
1f230 20 74 68 65 20 64 62 20 66 69 6c 65 20 69 73 20   the db file is 
1f240 72 65 71 75 69 72 65 64 20 74 6f 20 64 65 6c 65  required to dele
1f250 74 65 20 0a 2a 2a 20 61 20 57 41 4c 20 6f 6e 20  te .** a WAL on 
1f260 61 20 6e 6f 6e 65 2d 65 6d 70 74 79 20 64 61 74  a none-empty dat
1f270 61 62 61 73 65 2c 20 74 68 69 73 20 65 6e 73 75  abase, this ensu
1f280 72 65 73 20 74 68 65 72 65 20 69 73 20 6e 6f 20  res there is no 
1f290 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 0a  race condition .
1f2a0 2a 2a 20 62 65 74 77 65 65 6e 20 74 68 65 20 78  ** between the x
1f2b0 41 63 63 65 73 73 28 29 20 62 65 6c 6f 77 20 61  Access() below a
1f2c0 6e 64 20 61 6e 20 78 44 65 6c 65 74 65 28 29 20  nd an xDelete() 
1f2d0 62 65 69 6e 67 20 65 78 65 63 75 74 65 64 20 62  being executed b
1f2e0 79 20 73 6f 6d 65 20 0a 2a 2a 20 6f 74 68 65 72  y some .** other
1f2f0 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a   connection..*/.
1f300 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
1f310 4f 70 65 6e 57 61 6c 49 66 50 72 65 73 65 6e 74  OpenWalIfPresent
1f320 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
1f330 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1f340 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28  TE_OK;.  assert(
1f350 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
1f360 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20  =PAGER_OPEN );. 
1f370 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1f380 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f 4c  >eLock>=SHARED_L
1f390 4f 43 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e  OCK || pPager->n
1f3a0 6f 52 65 61 64 6c 6f 63 6b 20 29 3b 0a 0a 20 20  oReadlock );..  
1f3b0 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d  if( !pPager->tem
1f3c0 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74  pFile ){.    int
1f3d0 20 69 73 57 61 6c 3b 20 20 20 20 20 20 20 20 20   isWal;         
1f3e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1f3f0 75 65 20 69 66 20 57 41 4c 20 66 69 6c 65 20 65  ue if WAL file e
1f400 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 50 67 6e  xists */.    Pgn
1f410 6f 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20  o nPage;        
1f420 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
1f430 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
1f440 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20  se file */..    
1f450 72 63 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f  rc = pagerPageco
1f460 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61  unt(pPager, &nPa
1f470 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ge);.    if( rc 
1f480 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
1f490 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 7b   if( nPage==0 ){
1f4a0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1f4b0 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67  te3OsDelete(pPag
1f4c0 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72  er->pVfs, pPager
1f4d0 2d 3e 7a 57 61 6c 2c 20 30 29 3b 0a 20 20 20 20  ->zWal, 0);.    
1f4e0 20 20 69 73 57 61 6c 20 3d 20 30 3b 0a 20 20 20    isWal = 0;.   
1f4f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
1f500 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65   = sqlite3OsAcce
1f510 73 73 28 0a 20 20 20 20 20 20 20 20 20 20 70 50  ss(.          pP
1f520 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67  ager->pVfs, pPag
1f530 65 72 2d 3e 7a 57 61 6c 2c 20 53 51 4c 49 54 45  er->zWal, SQLITE
1f540 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20  _ACCESS_EXISTS, 
1f550 26 69 73 57 61 6c 0a 20 20 20 20 20 20 29 3b 0a  &isWal.      );.
1f560 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
1f570 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1f580 20 20 20 20 20 69 66 28 20 69 73 57 61 6c 20 29       if( isWal )
1f590 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  {.        testca
1f5a0 73 65 28 20 73 71 6c 69 74 65 33 50 63 61 63 68  se( sqlite3Pcach
1f5b0 65 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  ePagecount(pPage
1f5c0 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 29  r->pPCache)==0 )
1f5d0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
1f5e0 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 57  qlite3PagerOpenW
1f5f0 61 6c 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20  al(pPager, 0);. 
1f600 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
1f610 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
1f620 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
1f630 4c 4d 4f 44 45 5f 57 41 4c 20 29 7b 0a 20 20 20  LMODE_WAL ){.   
1f640 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
1f650 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52  rnalMode = PAGER
1f660 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c  _JOURNALMODE_DEL
1f670 45 54 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ETE;.      }.   
1f680 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1f690 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  rc;.}.#endif../*
1f6a0 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 73 61 76  .** Playback sav
1f6b0 65 70 6f 69 6e 74 20 70 53 61 76 65 70 6f 69 6e  epoint pSavepoin
1f6c0 74 2e 20 4f 72 2c 20 69 66 20 70 53 61 76 65 70  t. Or, if pSavep
1f6d0 6f 69 6e 74 3d 3d 4e 55 4c 4c 2c 20 74 68 65 6e  oint==NULL, then
1f6e0 20 70 6c 61 79 62 61 63 6b 0a 2a 2a 20 74 68 65   playback.** the
1f6f0 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72 20 6a   entire master j
1f700 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65  ournal file. The
1f710 20 63 61 73 65 20 70 53 61 76 65 70 6f 69 6e 74   case pSavepoint
1f720 3d 3d 4e 55 4c 4c 20 6f 63 63 75 72 73 20 77 68  ==NULL occurs wh
1f730 65 6e 20 0a 2a 2a 20 61 20 52 4f 4c 4c 42 41 43  en .** a ROLLBAC
1f740 4b 20 54 4f 20 63 6f 6d 6d 61 6e 64 20 69 73 20  K TO command is 
1f750 69 6e 76 6f 6b 65 64 20 6f 6e 20 61 20 53 41 56  invoked on a SAV
1f760 45 50 4f 49 4e 54 20 74 68 61 74 20 69 73 20 61  EPOINT that is a
1f770 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a   transaction .**
1f780 20 73 61 76 65 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a   savepoint..**.*
1f790 2a 20 57 68 65 6e 20 70 53 61 76 65 70 6f 69 6e  * When pSavepoin
1f7a0 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 28 6d  t is not NULL (m
1f7b0 65 61 6e 69 6e 67 20 61 20 6e 6f 6e 2d 74 72 61  eaning a non-tra
1f7c0 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f 69  nsaction savepoi
1f7d0 6e 74 20 69 73 20 0a 2a 2a 20 62 65 69 6e 67 20  nt is .** being 
1f7e0 72 6f 6c 6c 65 64 20 62 61 63 6b 29 2c 20 74 68  rolled back), th
1f7f0 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
1f800 63 6f 6e 73 69 73 74 73 20 6f 66 20 75 70 20 74  consists of up t
1f810 6f 20 74 68 72 65 65 20 73 74 61 67 65 73 2c 0a  o three stages,.
1f820 2a 2a 20 70 65 72 66 6f 72 6d 65 64 20 69 6e 20  ** performed in 
1f830 74 68 65 20 6f 72 64 65 72 20 73 70 65 63 69 66  the order specif
1f840 69 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50  ied:.**.**   * P
1f850 61 67 65 73 20 61 72 65 20 70 6c 61 79 65 64 20  ages are played 
1f860 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61  back from the ma
1f870 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74  in journal start
1f880 69 6e 67 20 61 74 20 62 79 74 65 0a 2a 2a 20 20  ing at byte.**  
1f890 20 20 20 6f 66 66 73 65 74 20 50 61 67 65 72 53     offset PagerS
1f8a0 61 76 65 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74  avepoint.iOffset
1f8b0 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20   and continuing 
1f8c0 74 6f 20 0a 2a 2a 20 20 20 20 20 50 61 67 65 72  to .**     Pager
1f8d0 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66  Savepoint.iHdrOf
1f8e0 66 73 65 74 2c 20 6f 72 20 74 6f 20 74 68 65 20  fset, or to the 
1f8f0 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  end of the main 
1f900 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 66  journal.**     f
1f910 69 6c 65 20 69 66 20 50 61 67 65 72 53 61 76 65  ile if PagerSave
1f920 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74  point.iHdrOffset
1f930 20 69 73 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20   is zero..**.** 
1f940 20 20 2a 20 49 66 20 50 61 67 65 72 53 61 76 65    * If PagerSave
1f950 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74  point.iHdrOffset
1f960 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68   is not zero, th
1f970 65 6e 20 70 61 67 65 73 20 61 72 65 20 70 6c 61  en pages are pla
1f980 79 65 64 0a 2a 2a 20 20 20 20 20 62 61 63 6b 20  yed.**     back 
1f990 73 74 61 72 74 69 6e 67 20 66 72 6f 6d 20 74 68  starting from th
1f9a0 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
1f9b0 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c   immediately fol
1f9c0 6c 6f 77 69 6e 67 20 0a 2a 2a 20 20 20 20 20 50  lowing .**     P
1f9d0 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48  agerSavepoint.iH
1f9e0 64 72 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20  drOffset to the 
1f9f0 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  end of the main 
1fa00 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a  journal file..**
1fa10 0a 2a 2a 20 20 20 2a 20 50 61 67 65 73 20 61 72  .**   * Pages ar
1fa20 65 20 74 68 65 6e 20 70 6c 61 79 65 64 20 62 61  e then played ba
1fa30 63 6b 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d  ck from the sub-
1fa40 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 73 74  journal file, st
1fa50 61 72 74 69 6e 67 0a 2a 2a 20 20 20 20 20 77 69  arting.**     wi
1fa60 74 68 20 74 68 65 20 50 61 67 65 72 53 61 76 65  th the PagerSave
1fa70 70 6f 69 6e 74 2e 69 53 75 62 52 65 63 20 61 6e  point.iSubRec an
1fa80 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20  d continuing to 
1fa90 74 68 65 20 65 6e 64 20 6f 66 0a 2a 2a 20 20 20  the end of.**   
1faa0 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69    the journal fi
1fab0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 72 6f 75 67  le..**.** Throug
1fac0 68 6f 75 74 20 74 68 65 20 72 6f 6c 6c 62 61 63  hout the rollbac
1fad0 6b 20 70 72 6f 63 65 73 73 2c 20 65 61 63 68 20  k process, each 
1fae0 74 69 6d 65 20 61 20 70 61 67 65 20 69 73 20 72  time a page is r
1faf0 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 0a  olled back, the.
1fb00 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ** corresponding
1fb10 20 62 69 74 20 69 73 20 73 65 74 20 69 6e 20 61   bit is set in a
1fb20 20 62 69 74 76 65 63 20 73 74 72 75 63 74 75 72   bitvec structur
1fb30 65 20 28 76 61 72 69 61 62 6c 65 20 70 44 6f 6e  e (variable pDon
1fb40 65 20 69 6e 20 74 68 65 0a 2a 2a 20 69 6d 70 6c  e in the.** impl
1fb50 65 6d 65 6e 74 61 74 69 6f 6e 20 62 65 6c 6f 77  ementation below
1fb60 29 2e 20 54 68 69 73 20 69 73 20 75 73 65 64 20  ). This is used 
1fb70 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 61  to ensure that a
1fb80 20 70 61 67 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a   page is only.**
1fb90 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 65   rolled back the
1fba0 20 66 69 72 73 74 20 74 69 6d 65 20 69 74 20 69   first time it i
1fbb0 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 6e  s encountered in
1fbc0 20 65 69 74 68 65 72 20 6a 6f 75 72 6e 61 6c 2e   either journal.
1fbd0 0a 2a 2a 0a 2a 2a 20 49 66 20 70 53 61 76 65 70  .**.** If pSavep
1fbe0 6f 69 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68  oint is NULL, th
1fbf0 65 6e 20 70 61 67 65 73 20 61 72 65 20 6f 6e 6c  en pages are onl
1fc00 79 20 70 6c 61 79 65 64 20 62 61 63 6b 20 66 72  y played back fr
1fc10 6f 6d 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a  om the main.** j
1fc20 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65  ournal file. The
1fc30 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f  re is no need fo
1fc40 72 20 61 20 62 69 74 76 65 63 20 69 6e 20 74 68  r a bitvec in th
1fc50 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  is case..**.** I
1fc60 6e 20 65 69 74 68 65 72 20 63 61 73 65 2c 20 62  n either case, b
1fc70 65 66 6f 72 65 20 70 6c 61 79 62 61 63 6b 20 63  efore playback c
1fc80 6f 6d 6d 65 6e 63 65 73 20 74 68 65 20 50 61 67  ommences the Pag
1fc90 65 72 2e 64 62 53 69 7a 65 20 76 61 72 69 61 62  er.dbSize variab
1fca0 6c 65 0a 2a 2a 20 69 73 20 72 65 73 65 74 20 74  le.** is reset t
1fcb0 6f 20 74 68 65 20 76 61 6c 75 65 20 74 68 61 74  o the value that
1fcc0 20 69 74 20 68 65 6c 64 20 61 74 20 74 68 65 20   it held at the 
1fcd0 73 74 61 72 74 20 6f 66 20 74 68 65 20 73 61 76  start of the sav
1fce0 65 70 6f 69 6e 74 20 0a 2a 2a 20 28 6f 72 20 74  epoint .** (or t
1fcf0 72 61 6e 73 61 63 74 69 6f 6e 29 2e 20 4e 6f 20  ransaction). No 
1fd00 70 61 67 65 20 77 69 74 68 20 61 20 70 61 67 65  page with a page
1fd10 2d 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72 20  -number greater 
1fd20 74 68 61 6e 20 74 68 69 73 20 76 61 6c 75 65 0a  than this value.
1fd30 2a 2a 20 69 73 20 70 6c 61 79 65 64 20 62 61 63  ** is played bac
1fd40 6b 2e 20 49 66 20 6f 6e 65 20 69 73 20 65 6e 63  k. If one is enc
1fd50 6f 75 6e 74 65 72 65 64 20 69 74 20 69 73 20 73  ountered it is s
1fd60 69 6d 70 6c 79 20 73 6b 69 70 70 65 64 2e 0a 2a  imply skipped..*
1fd70 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
1fd80 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65 70 6f  erPlaybackSavepo
1fd90 69 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  int(Pager *pPage
1fda0 72 2c 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  r, PagerSavepoin
1fdb0 74 20 2a 70 53 61 76 65 70 6f 69 6e 74 29 7b 0a  t *pSavepoint){.
1fdc0 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20    i64 szJ;      
1fdd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 66             /* Ef
1fde0 66 65 63 74 69 76 65 20 73 69 7a 65 20 6f 66 20  fective size of 
1fdf0 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
1fe00 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66   */.  i64 iHdrOf
1fe10 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  f;             /
1fe20 2a 20 45 6e 64 20 6f 66 20 66 69 72 73 74 20 73  * End of first s
1fe30 65 67 6d 65 6e 74 20 6f 66 20 6d 61 69 6e 2d 6a  egment of main-j
1fe40 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 73 20 2a  ournal records *
1fe50 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
1fe60 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20  ITE_OK;      /* 
1fe70 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
1fe80 20 42 69 74 76 65 63 20 2a 70 44 6f 6e 65 20 3d   Bitvec *pDone =
1fe90 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 42 69 74   0;       /* Bit
1fea0 76 65 63 20 74 6f 20 65 6e 73 75 72 65 20 70 61  vec to ensure pa
1feb0 67 65 73 20 70 6c 61 79 65 64 20 62 61 63 6b 20  ges played back 
1fec0 6f 6e 6c 79 20 6f 6e 63 65 20 2a 2f 0a 0a 20 20  only once */..  
1fed0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1fee0 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52  eState!=PAGER_ER
1fef0 52 4f 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ROR );.  assert(
1ff00 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
1ff10 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f  =PAGER_WRITER_LO
1ff20 43 4b 45 44 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c  CKED );..  /* Al
1ff30 6c 6f 63 61 74 65 20 61 20 62 69 74 76 65 63 20  locate a bitvec 
1ff40 74 6f 20 75 73 65 20 74 6f 20 73 74 6f 72 65 20  to use to store 
1ff50 74 68 65 20 73 65 74 20 6f 66 20 70 61 67 65 73  the set of pages
1ff60 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 2a 2f 0a   rolled back */.
1ff70 20 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e 74    if( pSavepoint
1ff80 20 29 7b 0a 20 20 20 20 70 44 6f 6e 65 20 3d 20   ){.    pDone = 
1ff90 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72 65  sqlite3BitvecCre
1ffa0 61 74 65 28 70 53 61 76 65 70 6f 69 6e 74 2d 3e  ate(pSavepoint->
1ffb0 6e 4f 72 69 67 29 3b 0a 20 20 20 20 69 66 28 20  nOrig);.    if( 
1ffc0 21 70 44 6f 6e 65 20 29 7b 0a 20 20 20 20 20 20  !pDone ){.      
1ffd0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
1ffe0 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  MEM;.    }.  }..
1fff0 20 20 2f 2a 20 53 65 74 20 74 68 65 20 64 61 74    /* Set the dat
20000 61 62 61 73 65 20 73 69 7a 65 20 62 61 63 6b 20  abase size back 
20010 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69 74 20  to the value it 
20020 77 61 73 20 62 65 66 6f 72 65 20 74 68 65 20 73  was before the s
20030 61 76 65 70 6f 69 6e 74 20 0a 20 20 2a 2a 20 62  avepoint .  ** b
20040 65 69 6e 67 20 72 65 76 65 72 74 65 64 20 77 61  eing reverted wa
20050 73 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20  s opened..  */. 
20060 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
20070 3d 20 70 53 61 76 65 70 6f 69 6e 74 20 3f 20 70  = pSavepoint ? p
20080 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67  Savepoint->nOrig
20090 20 3a 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69   : pPager->dbOri
200a0 67 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d  gSize;.  pPager-
200b0 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
200c0 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46   = pPager->tempF
200d0 69 6c 65 3b 0a 0a 20 20 69 66 28 20 21 70 53 61  ile;..  if( !pSa
200e0 76 65 70 6f 69 6e 74 20 26 26 20 70 61 67 65 72  vepoint && pager
200f0 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
20100 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 61 67  {.    return pag
20110 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 70 50  erRollbackWal(pP
20120 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ager);.  }..  /*
20130 20 55 73 65 20 70 50 61 67 65 72 2d 3e 6a 6f 75   Use pPager->jou
20140 72 6e 61 6c 4f 66 66 20 61 73 20 74 68 65 20 65  rnalOff as the e
20150 66 66 65 63 74 69 76 65 20 73 69 7a 65 20 6f 66  ffective size of
20160 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61   the main rollba
20170 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e  ck.  ** journal.
20180 20 20 54 68 65 20 61 63 74 75 61 6c 20 66 69 6c    The actual fil
20190 65 20 6d 69 67 68 74 20 62 65 20 6c 61 72 67 65  e might be large
201a0 72 20 74 68 61 6e 20 74 68 69 73 20 69 6e 0a 20  r than this in. 
201b0 20 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41   ** PAGER_JOURNA
201c0 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 6f  LMODE_TRUNCATE o
201d0 72 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  r PAGER_JOURNALM
201e0 4f 44 45 5f 50 45 52 53 49 53 54 2e 20 20 42 75  ODE_PERSIST.  Bu
201f0 74 20 61 6e 79 74 68 69 6e 67 0a 20 20 2a 2a 20  t anything.  ** 
20200 70 61 73 74 20 70 50 61 67 65 72 2d 3e 6a 6f 75  past pPager->jou
20210 72 6e 61 6c 4f 66 66 20 69 73 20 6f 66 66 2d 6c  rnalOff is off-l
20220 69 6d 69 74 73 20 74 6f 20 75 73 2e 0a 20 20 2a  imits to us..  *
20230 2f 0a 20 20 73 7a 4a 20 3d 20 70 50 61 67 65 72  /.  szJ = pPager
20240 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20  ->journalOff;.  
20250 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65  assert( pagerUse
20260 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 7c  Wal(pPager)==0 |
20270 7c 20 73 7a 4a 3d 3d 30 20 29 3b 0a 0a 20 20 2f  | szJ==0 );..  /
20280 2a 20 42 65 67 69 6e 20 62 79 20 72 6f 6c 6c 69  * Begin by rolli
20290 6e 67 20 62 61 63 6b 20 72 65 63 6f 72 64 73 20  ng back records 
202a0 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f  from the main jo
202b0 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61  urnal starting a
202c0 74 0a 20 20 2a 2a 20 50 61 67 65 72 53 61 76 65  t.  ** PagerSave
202d0 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e  point.iOffset an
202e0 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20  d continuing to 
202f0 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c  the next journal
20300 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20 54 68   header..  ** Th
20310 65 72 65 20 6d 69 67 68 74 20 62 65 20 72 65 63  ere might be rec
20320 6f 72 64 73 20 69 6e 20 74 68 65 20 6d 61 69 6e  ords in the main
20330 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20 68 61   journal that ha
20340 76 65 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72  ve a page number
20350 0a 20 20 2a 2a 20 67 72 65 61 74 65 72 20 74 68  .  ** greater th
20360 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 64  an the current d
20370 61 74 61 62 61 73 65 20 73 69 7a 65 20 28 70 50  atabase size (pP
20380 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 20 62 75  ager->dbSize) bu
20390 74 20 74 68 6f 73 65 0a 20 20 2a 2a 20 77 69 6c  t those.  ** wil
203a0 6c 20 62 65 20 73 6b 69 70 70 65 64 20 61 75 74  l be skipped aut
203b0 6f 6d 61 74 69 63 61 6c 6c 79 2e 20 20 50 61 67  omatically.  Pag
203c0 65 73 20 61 72 65 20 61 64 64 65 64 20 74 6f 20  es are added to 
203d0 70 44 6f 6e 65 20 61 73 20 74 68 65 79 0a 20 20  pDone as they.  
203e0 2a 2a 20 61 72 65 20 70 6c 61 79 65 64 20 62 61  ** are played ba
203f0 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ck..  */.  if( p
20400 53 61 76 65 70 6f 69 6e 74 20 26 26 20 21 70 61  Savepoint && !pa
20410 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
20420 29 20 29 7b 0a 20 20 20 20 69 48 64 72 4f 66 66  ) ){.    iHdrOff
20430 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69   = pSavepoint->i
20440 48 64 72 4f 66 66 73 65 74 20 3f 20 70 53 61 76  HdrOffset ? pSav
20450 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73  epoint->iHdrOffs
20460 65 74 20 3a 20 73 7a 4a 3b 0a 20 20 20 20 70 50  et : szJ;.    pP
20470 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
20480 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69   = pSavepoint->i
20490 4f 66 66 73 65 74 3b 0a 20 20 20 20 77 68 69 6c  Offset;.    whil
204a0 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
204b0 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
204c0 6e 61 6c 4f 66 66 3c 69 48 64 72 4f 66 66 20 29  nalOff<iHdrOff )
204d0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
204e0 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
204f0 70 61 67 65 28 70 50 61 67 65 72 2c 20 26 70 50  page(pPager, &pP
20500 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
20510 2c 20 70 44 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a  , pDone, 1, 1);.
20520 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
20530 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
20540 45 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  E );.  }else{.  
20550 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
20560 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  lOff = 0;.  }.. 
20570 20 2f 2a 20 43 6f 6e 74 69 6e 75 65 20 72 6f 6c   /* Continue rol
20580 6c 69 6e 67 20 62 61 63 6b 20 72 65 63 6f 72 64  ling back record
20590 73 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 69  s out of the mai
205a0 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69  n journal starti
205b0 6e 67 20 61 74 0a 20 20 2a 2a 20 74 68 65 20 66  ng at.  ** the f
205c0 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  irst journal hea
205d0 64 65 72 20 73 65 65 6e 20 61 6e 64 20 63 6f 6e  der seen and con
205e0 74 69 6e 75 69 6e 67 20 75 6e 74 69 6c 20 74 68  tinuing until th
205f0 65 20 65 66 66 65 63 74 69 76 65 20 65 6e 64 0a  e effective end.
20600 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d 61 69 6e    ** of the main
20610 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20   journal file.  
20620 43 6f 6e 74 69 6e 75 65 20 74 6f 20 73 6b 69 70  Continue to skip
20630 20 6f 75 74 2d 6f 66 2d 72 61 6e 67 65 20 70 61   out-of-range pa
20640 67 65 73 20 61 6e 64 0a 20 20 2a 2a 20 63 6f 6e  ges and.  ** con
20650 74 69 6e 75 65 20 61 64 64 69 6e 67 20 70 61 67  tinue adding pag
20660 65 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74  es rolled back t
20670 6f 20 70 44 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20  o pDone..  */.  
20680 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
20690 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e  E_OK && pPager->
206a0 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 20 29  journalOff<szJ )
206b0 7b 0a 20 20 20 20 75 33 32 20 69 69 3b 20 20 20  {.    u32 ii;   
206c0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
206d0 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
206e0 75 33 32 20 6e 4a 52 65 63 20 3d 20 30 3b 20 20  u32 nJRec = 0;  
206f0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
20700 4a 6f 75 72 6e 61 6c 20 52 65 63 6f 72 64 73 20  Journal Records 
20710 2a 2f 0a 20 20 20 20 75 33 32 20 64 75 6d 6d 79  */.    u32 dummy
20720 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a  ;.    rc = readJ
20730 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
20740 2c 20 30 2c 20 73 7a 4a 2c 20 26 6e 4a 52 65 63  , 0, szJ, &nJRec
20750 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 61  , &dummy);.    a
20760 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
20770 45 5f 44 4f 4e 45 20 29 3b 0a 0a 20 20 20 20 2f  E_DONE );..    /
20780 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 22 70 50  *.    ** The "pP
20790 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
207a0 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  +JOURNAL_HDR_SZ(
207b0 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d  pPager)==pPager-
207c0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 22 0a 20 20 20  >journalOff".   
207d0 20 2a 2a 20 74 65 73 74 20 69 73 20 72 65 6c 61   ** test is rela
207e0 74 65 64 20 74 6f 20 74 69 63 6b 65 74 20 23 32  ted to ticket #2
207f0 35 36 35 2e 20 20 53 65 65 20 74 68 65 20 64 69  565.  See the di
20800 73 63 75 73 73 69 6f 6e 20 69 6e 20 74 68 65 0a  scussion in the.
20810 20 20 20 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61      ** pager_pla
20820 79 62 61 63 6b 28 29 20 66 75 6e 63 74 69 6f 6e  yback() function
20830 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
20840 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 20  information..   
20850 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 4a 52 65   */.    if( nJRe
20860 63 3d 3d 30 20 0a 20 20 20 20 20 26 26 20 70 50  c==0 .     && pP
20870 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
20880 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  +JOURNAL_HDR_SZ(
20890 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d  pPager)==pPager-
208a0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20 20 20  >journalOff.    
208b0 29 7b 0a 20 20 20 20 20 20 6e 4a 52 65 63 20 3d  ){.      nJRec =
208c0 20 28 75 33 32 29 28 28 73 7a 4a 20 2d 20 70 50   (u32)((szJ - pP
208d0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
208e0 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  )/JOURNAL_PG_SZ(
208f0 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a  pPager));.    }.
20900 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 72 63      for(ii=0; rc
20910 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
20920 69 3c 6e 4a 52 65 63 20 26 26 20 70 50 61 67 65  i<nJRec && pPage
20930 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a  r->journalOff<sz
20940 4a 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  J; ii++){.      
20950 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
20960 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61  ack_one_page(pPa
20970 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f  ger, &pPager->jo
20980 75 72 6e 61 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c  urnalOff, pDone,
20990 20 31 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20   1, 1);.    }.  
209a0 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
209b0 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d  LITE_DONE );.  }
209c0 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53  .  assert( rc!=S
209d0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67  QLITE_OK || pPag
209e0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 3d  er->journalOff>=
209f0 73 7a 4a 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e  szJ );..  /* Fin
20a00 61 6c 6c 79 2c 20 20 72 6f 6c 6c 62 61 63 6b 20  ally,  rollback 
20a10 70 61 67 65 73 20 66 72 6f 6d 20 74 68 65 20 73  pages from the s
20a20 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 20 50 61 67  ub-journal.  Pag
20a30 65 20 74 68 61 74 20 77 65 72 65 0a 20 20 2a 2a  e that were.  **
20a40 20 70 72 65 76 69 6f 75 73 6c 79 20 72 6f 6c 6c   previously roll
20a50 65 64 20 62 61 63 6b 20 6f 75 74 20 6f 66 20 74  ed back out of t
20a60 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
20a70 28 61 6e 64 20 61 72 65 20 68 65 6e 63 65 20 69  (and are hence i
20a80 6e 20 70 44 6f 6e 65 29 0a 20 20 2a 2a 20 77 69  n pDone).  ** wi
20a90 6c 6c 20 62 65 20 73 6b 69 70 70 65 64 2e 20 20  ll be skipped.  
20aa0 4f 75 74 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67  Out-of-range pag
20ab0 65 73 20 61 72 65 20 61 6c 73 6f 20 73 6b 69 70  es are also skip
20ac0 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ped..  */.  if( 
20ad0 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20  pSavepoint ){.  
20ae0 20 20 75 33 32 20 69 69 3b 20 20 20 20 20 20 20    u32 ii;       
20af0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
20b00 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 36 34 20  nter */.    i64 
20b10 6f 66 66 73 65 74 20 3d 20 28 69 36 34 29 70 53  offset = (i64)pS
20b20 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52 65  avepoint->iSubRe
20b30 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67  c*(4+pPager->pag
20b40 65 53 69 7a 65 29 3b 0a 0a 20 20 20 20 69 66 28  eSize);..    if(
20b50 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
20b60 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63  ger) ){.      rc
20b70 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 53 61 76   = sqlite3WalSav
20b80 65 70 6f 69 6e 74 55 6e 64 6f 28 70 50 61 67 65  epointUndo(pPage
20b90 72 2d 3e 70 57 61 6c 2c 20 70 53 61 76 65 70 6f  r->pWal, pSavepo
20ba0 69 6e 74 2d 3e 61 57 61 6c 44 61 74 61 29 3b 0a  int->aWalData);.
20bb0 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69      }.    for(ii
20bc0 3d 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75  =pSavepoint->iSu
20bd0 62 52 65 63 3b 20 72 63 3d 3d 53 51 4c 49 54 45  bRec; rc==SQLITE
20be0 5f 4f 4b 20 26 26 20 69 69 3c 70 50 61 67 65 72  _OK && ii<pPager
20bf0 2d 3e 6e 53 75 62 52 65 63 3b 20 69 69 2b 2b 29  ->nSubRec; ii++)
20c00 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
20c10 6f 66 66 73 65 74 3d 3d 28 69 36 34 29 69 69 2a  offset==(i64)ii*
20c20 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53  (4+pPager->pageS
20c30 69 7a 65 29 20 29 3b 0a 20 20 20 20 20 20 72 63  ize) );.      rc
20c40 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
20c50 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65  k_one_page(pPage
20c60 72 2c 20 26 6f 66 66 73 65 74 2c 20 70 44 6f 6e  r, &offset, pDon
20c70 65 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20 7d 0a  e, 0, 1);.    }.
20c80 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
20c90 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
20ca0 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 42 69 74   }..  sqlite3Bit
20cb0 76 65 63 44 65 73 74 72 6f 79 28 70 44 6f 6e 65  vecDestroy(pDone
20cc0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
20cd0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50  ITE_OK ){.    pP
20ce0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
20cf0 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 0a 20 20 72   = szJ;.  }..  r
20d00 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
20d10 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6d 61  ** Change the ma
20d20 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  ximum number of 
20d30 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20  in-memory pages 
20d40 74 68 61 74 20 61 72 65 20 61 6c 6c 6f 77 65 64  that are allowed
20d50 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
20d60 33 50 61 67 65 72 53 65 74 43 61 63 68 65 73 69  3PagerSetCachesi
20d70 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
20d80 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20  , int mxPage){. 
20d90 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 65   sqlite3PcacheSe
20da0 74 43 61 63 68 65 73 69 7a 65 28 70 50 61 67 65  tCachesize(pPage
20db0 72 2d 3e 70 50 43 61 63 68 65 2c 20 6d 78 50 61  r->pPCache, mxPa
20dc0 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  ge);.}../*.** Fr
20dd0 65 65 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f 72  ee as much memor
20de0 79 20 61 73 20 70 6f 73 73 69 62 6c 65 20 66 72  y as possible fr
20df0 6f 6d 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2f  om the pager..*/
20e00 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
20e10 65 72 53 68 72 69 6e 6b 28 50 61 67 65 72 20 2a  erShrink(Pager *
20e20 70 50 61 67 65 72 29 7b 0a 20 20 73 71 6c 69 74  pPager){.  sqlit
20e30 65 33 50 63 61 63 68 65 53 68 72 69 6e 6b 28 70  e3PcacheShrink(p
20e40 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
20e50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74  .}../*.** Adjust
20e60 20 74 68 65 20 72 6f 62 75 73 74 6e 65 73 73 20   the robustness 
20e70 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
20e80 74 6f 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f  to damage due to
20e90 20 4f 53 20 63 72 61 73 68 65 73 0a 2a 2a 20 6f   OS crashes.** o
20ea0 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73  r power failures
20eb0 20 62 79 20 63 68 61 6e 67 69 6e 67 20 74 68 65   by changing the
20ec0 20 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e 63 73   number of syncs
20ed0 28 29 73 20 77 68 65 6e 20 77 72 69 74 69 6e 67  ()s when writing
20ee0 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  .** the rollback
20ef0 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 72 65   journal.  There
20f00 20 61 72 65 20 74 68 72 65 65 20 6c 65 76 65 6c   are three level
20f10 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20  s:.**.**    OFF 
20f20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53        sqlite3OsS
20f30 79 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20 63  ync() is never c
20f40 61 6c 6c 65 64 2e 20 20 54 68 69 73 20 69 73 20  alled.  This is 
20f50 74 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20  the default.**  
20f60 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20              for 
20f70 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 20 74 72  temporary and tr
20f80 61 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a  ansient files..*
20f90 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20  *.**    NORMAL  
20fa0 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73    The journal is
20fb0 20 73 79 6e 63 65 64 20 6f 6e 63 65 20 62 65 66   synced once bef
20fc0 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e  ore writes begin
20fd0 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   on the.**      
20fe0 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65          database
20ff0 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61  .  This is norma
21000 6c 6c 79 20 61 64 65 71 75 61 74 65 20 70 72 6f  lly adequate pro
21010 74 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20  tection, but.** 
21020 20 20 20 20 20 20 20 20 20 20 20 20 20 69 74 20               it 
21030 69 73 20 74 68 65 6f 72 65 74 69 63 61 6c 6c 79  is theoretically
21040 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75 67   possible, thoug
21050 68 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c  h very unlikely,
21060 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
21070 20 74 68 61 74 20 61 6e 20 69 6e 6f 70 65 72 74   that an inopert
21080 75 6e 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72  une power failur
21090 65 20 63 6f 75 6c 64 20 6c 65 61 76 65 20 74 68  e could leave th
210a0 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  e journal.**    
210b0 20 20 20 20 20 20 20 20 20 20 69 6e 20 61 20 73            in a s
210c0 74 61 74 65 20 77 68 69 63 68 20 77 6f 75 6c 64  tate which would
210d0 20 63 61 75 73 65 20 64 61 6d 61 67 65 20 74 6f   cause damage to
210e0 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
210f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68                wh
21100 65 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65 64 20  en it is rolled 
21110 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46  back..**.**    F
21120 55 4c 4c 20 20 20 20 20 20 54 68 65 20 6a 6f 75  ULL      The jou
21130 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 74  rnal is synced t
21140 77 69 63 65 20 62 65 66 6f 72 65 20 77 72 69 74  wice before writ
21150 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a  es begin on the.
21160 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
21170 64 61 74 61 62 61 73 65 20 28 77 69 74 68 20 73  database (with s
21180 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  ome additional i
21190 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65  nformation - the
211a0 20 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20   nRec field.**  
211b0 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74              of t
211c0 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
211d0 72 20 2d 20 62 65 69 6e 67 20 77 72 69 74 74 65  r - being writte
211e0 6e 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65  n in between the
211f0 20 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20   two.**         
21200 20 20 20 20 20 73 79 6e 63 73 29 2e 20 20 49 66       syncs).  If
21210 20 77 65 20 61 73 73 75 6d 65 20 74 68 61 74 20   we assume that 
21220 77 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20  writing a.**    
21230 20 20 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65            single
21240 20 64 69 73 6b 20 73 65 63 74 6f 72 20 69 73 20   disk sector is 
21250 61 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68 69  atomic, then thi
21260 73 20 6d 6f 64 65 20 70 72 6f 76 69 64 65 73 0a  s mode provides.
21270 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
21280 61 73 73 75 72 61 6e 63 65 20 74 68 61 74 20 74  assurance that t
21290 68 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20  he journal will 
212a0 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65 64  not be corrupted
212b0 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   to the.**      
212c0 20 20 20 20 20 20 20 20 70 6f 69 6e 74 20 6f 66          point of
212d0 20 63 61 75 73 69 6e 67 20 64 61 6d 61 67 65 20   causing damage 
212e0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
212f0 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e  during rollback.
21300 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 62 6f 76 65  .**.** The above
21310 20 69 73 20 66 6f 72 20 61 20 72 6f 6c 6c 62 61   is for a rollba
21320 63 6b 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2e  ck-journal mode.
21330 20 20 46 6f 72 20 57 41 4c 20 6d 6f 64 65 2c 20    For WAL mode, 
21340 4f 46 46 20 63 6f 6e 74 69 6e 75 65 73 0a 2a 2a  OFF continues.**
21350 20 74 6f 20 6d 65 61 6e 20 74 68 61 74 20 6e 6f   to mean that no
21360 20 73 79 6e 63 73 20 65 76 65 72 20 6f 63 63 75   syncs ever occu
21370 72 2e 20 20 4e 4f 52 4d 41 4c 20 6d 65 61 6e 73  r.  NORMAL means
21380 20 74 68 61 74 20 74 68 65 20 57 41 4c 20 69 73   that the WAL is
21390 20 73 79 6e 63 65 64 0a 2a 2a 20 70 72 69 6f 72   synced.** prior
213a0 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
213b0 20 63 68 65 63 6b 70 6f 69 6e 74 20 61 6e 64 20   checkpoint and 
213c0 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73  that the databas
213d0 65 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64  e file is synced
213e0 0a 2a 2a 20 61 74 20 74 68 65 20 63 6f 6e 63 6c  .** at the concl
213f0 75 73 69 6f 6e 20 6f 66 20 74 68 65 20 63 68 65  usion of the che
21400 63 6b 70 6f 69 6e 74 20 69 66 20 74 68 65 20 65  ckpoint if the e
21410 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66  ntire content of
21420 20 74 68 65 20 57 41 4c 0a 2a 2a 20 77 61 73 20   the WAL.** was 
21430 77 72 69 74 74 65 6e 20 62 61 63 6b 20 69 6e 74  written back int
21440 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  o the database. 
21450 20 42 75 74 20 6e 6f 20 73 79 6e 63 20 6f 70 65   But no sync ope
21460 72 61 74 69 6f 6e 73 20 6f 63 63 75 72 20 66 6f  rations occur fo
21470 72 0a 2a 2a 20 61 6e 20 6f 72 64 69 6e 61 72 79  r.** an ordinary
21480 20 63 6f 6d 6d 69 74 20 69 6e 20 4e 4f 52 4d 41   commit in NORMA
21490 4c 20 6d 6f 64 65 20 77 69 74 68 20 57 41 4c 2e  L mode with WAL.
214a0 20 20 46 55 4c 4c 20 6d 65 61 6e 73 20 74 68 61    FULL means tha
214b0 74 20 74 68 65 20 57 41 4c 0a 2a 2a 20 66 69 6c  t the WAL.** fil
214c0 65 20 69 73 20 73 79 6e 63 65 64 20 66 6f 6c 6c  e is synced foll
214d0 6f 77 69 6e 67 20 65 61 63 68 20 63 6f 6d 6d 69  owing each commi
214e0 74 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69 6e 20  t operation, in 
214f0 61 64 64 69 74 69 6f 6e 20 74 6f 20 74 68 65 0a  addition to the.
21500 2a 2a 20 73 79 6e 63 73 20 61 73 73 6f 63 69 61  ** syncs associa
21510 74 65 64 20 77 69 74 68 20 4e 4f 52 4d 41 4c 2e  ted with NORMAL.
21520 0a 2a 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20 63 6f  .**.** Do not co
21530 6e 66 75 73 65 20 73 79 6e 63 68 72 6f 6e 6f 75  nfuse synchronou
21540 73 3d 46 55 4c 4c 20 77 69 74 68 20 53 51 4c 49  s=FULL with SQLI
21550 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 2e 20 20 54  TE_SYNC_FULL.  T
21560 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 53 59 4e  he.** SQLITE_SYN
21570 43 5f 46 55 4c 4c 20 6d 61 63 72 6f 20 6d 65 61  C_FULL macro mea
21580 6e 73 20 74 6f 20 75 73 65 20 74 68 65 20 4d 61  ns to use the Ma
21590 63 4f 53 58 2d 73 74 79 6c 65 20 66 75 6c 6c 2d  cOSX-style full-
215a0 66 73 79 6e 63 0a 2a 2a 20 75 73 69 6e 67 20 66  fsync.** using f
215b0 63 6e 74 6c 28 46 5f 46 55 4c 4c 46 53 59 4e 43  cntl(F_FULLFSYNC
215c0 29 2e 20 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  ).  SQLITE_SYNC_
215d0 4e 4f 52 4d 41 4c 20 6d 65 61 6e 73 20 74 6f 20  NORMAL means to 
215e0 64 6f 20 61 6e 0a 2a 2a 20 6f 72 64 69 6e 61 72  do an.** ordinar
215f0 79 20 66 73 79 6e 63 28 29 20 63 61 6c 6c 2e 20  y fsync() call. 
21600 20 54 68 65 72 65 20 69 73 20 6e 6f 20 64 69 66   There is no dif
21610 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
21620 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
21630 0a 2a 2a 20 61 6e 64 20 53 51 4c 49 54 45 5f 53  .** and SQLITE_S
21640 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 6e 20 70 6c  YNC_NORMAL on pl
21650 61 74 66 6f 72 6d 73 20 6f 74 68 65 72 20 74 68  atforms other th
21660 61 6e 20 4d 61 63 4f 53 58 2e 20 20 42 75 74 20  an MacOSX.  But 
21670 74 68 65 0a 2a 2a 20 73 79 6e 63 68 72 6f 6e 6f  the.** synchrono
21680 75 73 3d 46 55 4c 4c 20 76 65 72 73 75 73 20 73  us=FULL versus s
21690 79 6e 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52 4d 41  ynchronous=NORMA
216a0 4c 20 73 65 74 74 69 6e 67 20 64 65 74 65 72 6d  L setting determ
216b0 69 6e 65 73 20 77 68 65 6e 0a 2a 2a 20 74 68 65  ines when.** the
216c0 20 78 53 79 6e 63 20 70 72 69 6d 69 74 69 76 65   xSync primitive
216d0 20 69 73 20 63 61 6c 6c 65 64 20 61 6e 64 20 69   is called and i
216e0 73 20 72 65 6c 65 76 61 6e 74 20 74 6f 20 61 6c  s relevant to al
216f0 6c 20 70 6c 61 74 66 6f 72 6d 73 2e 0a 2a 2a 0a  l platforms..**.
21700 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c 75 65  ** Numeric value
21710 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
21720 68 20 74 68 65 73 65 20 73 74 61 74 65 73 20 61  h these states a
21730 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41  re OFF==1, NORMA
21740 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c  L=2,.** and FULL
21750 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  =3..*/.#ifndef S
21760 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52  QLITE_OMIT_PAGER
21770 5f 50 52 41 47 4d 41 53 0a 76 6f 69 64 20 73 71  _PRAGMAS.void sq
21780 6c 69 74 65 33 50 61 67 65 72 53 65 74 53 61 66  lite3PagerSetSaf
21790 65 74 79 4c 65 76 65 6c 28 0a 20 20 50 61 67 65  etyLevel(.  Page
217a0 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
217b0 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 74    /* The pager t
217c0 6f 20 73 65 74 20 73 61 66 65 74 79 20 6c 65 76  o set safety lev
217d0 65 6c 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  el for */.  int 
217e0 6c 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20  level,          
217f0 20 20 2f 2a 20 50 52 41 47 4d 41 20 73 79 6e 63    /* PRAGMA sync
21800 68 72 6f 6e 6f 75 73 2e 20 20 31 3d 4f 46 46 2c  hronous.  1=OFF,
21810 20 32 3d 4e 4f 52 4d 41 4c 2c 20 33 3d 46 55 4c   2=NORMAL, 3=FUL
21820 4c 20 2a 2f 20 20 0a 20 20 69 6e 74 20 62 46 75  L */  .  int bFu
21830 6c 6c 46 73 79 6e 63 2c 20 20 20 20 20 20 20 2f  llFsync,       /
21840 2a 20 50 52 41 47 4d 41 20 66 75 6c 6c 66 73 79  * PRAGMA fullfsy
21850 6e 63 20 2a 2f 0a 20 20 69 6e 74 20 62 43 6b 70  nc */.  int bCkp
21860 74 46 75 6c 6c 46 73 79 6e 63 20 20 20 20 2f 2a  tFullFsync    /*
21870 20 50 52 41 47 4d 41 20 63 68 65 63 6b 70 6f 69   PRAGMA checkpoi
21880 6e 74 5f 66 75 6c 6c 66 73 79 6e 63 20 2a 2f 0a  nt_fullfsync */.
21890 29 7b 0a 20 20 61 73 73 65 72 74 28 20 6c 65 76  ){.  assert( lev
218a0 65 6c 3e 3d 31 20 26 26 20 6c 65 76 65 6c 3c 3d  el>=1 && level<=
218b0 33 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  3 );.  pPager->n
218c0 6f 53 79 6e 63 20 3d 20 20 28 6c 65 76 65 6c 3d  oSync =  (level=
218d0 3d 31 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65  =1 || pPager->te
218e0 6d 70 46 69 6c 65 29 20 3f 31 3a 30 3b 0a 20 20  mpFile) ?1:0;.  
218f0 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
21900 20 3d 20 28 6c 65 76 65 6c 3d 3d 33 20 26 26 20   = (level==3 && 
21910 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
21920 65 29 20 3f 31 3a 30 3b 0a 20 20 69 66 28 20 70  e) ?1:0;.  if( p
21930 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b  Pager->noSync ){
21940 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e  .    pPager->syn
21950 63 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20  cFlags = 0;.    
21960 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63  pPager->ckptSync
21970 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 7d 65 6c  Flags = 0;.  }el
21980 73 65 20 69 66 28 20 62 46 75 6c 6c 46 73 79 6e  se if( bFullFsyn
21990 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  c ){.    pPager-
219a0 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c  >syncFlags = SQL
219b0 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 20  ITE_SYNC_FULL;. 
219c0 20 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53     pPager->ckptS
219d0 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54  yncFlags = SQLIT
219e0 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20 7d  E_SYNC_FULL;.  }
219f0 65 6c 73 65 20 69 66 28 20 62 43 6b 70 74 46 75  else if( bCkptFu
21a00 6c 6c 46 73 79 6e 63 20 29 7b 0a 20 20 20 20 70  llFsync ){.    p
21a10 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
21a20 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e   = SQLITE_SYNC_N
21a30 4f 52 4d 41 4c 3b 0a 20 20 20 20 70 50 61 67 65  ORMAL;.    pPage
21a40 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73  r->ckptSyncFlags
21a50 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46   = SQLITE_SYNC_F
21a60 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ULL;.  }else{.  
21a70 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c    pPager->syncFl
21a80 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e  ags = SQLITE_SYN
21a90 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 70 50  C_NORMAL;.    pP
21aa0 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c  ager->ckptSyncFl
21ab0 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e  ags = SQLITE_SYN
21ac0 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20  C_NORMAL;.  }.  
21ad0 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46  pPager->walSyncF
21ae0 6c 61 67 73 20 3d 20 70 50 61 67 65 72 2d 3e 73  lags = pPager->s
21af0 79 6e 63 46 6c 61 67 73 3b 0a 20 20 69 66 28 20  yncFlags;.  if( 
21b00 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
21b10 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
21b20 77 61 6c 53 79 6e 63 46 6c 61 67 73 20 7c 3d 20  walSyncFlags |= 
21b30 57 41 4c 5f 53 59 4e 43 5f 54 52 41 4e 53 41 43  WAL_SYNC_TRANSAC
21b40 54 49 4f 4e 53 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  TIONS;.  }.}.#en
21b50 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  dif../*.** The f
21b60 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20  ollowing global 
21b70 76 61 72 69 61 62 6c 65 20 69 73 20 69 6e 63 72  variable is incr
21b80 65 6d 65 6e 74 65 64 20 77 68 65 6e 65 76 65 72  emented whenever
21b90 20 74 68 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20   the library.** 
21ba0 61 74 74 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e  attempts to open
21bb0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
21bc0 65 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61  e.  This informa
21bd0 74 69 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72  tion is used for
21be0 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20  .** testing and 
21bf0 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 20 20  analysis only.  
21c00 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
21c10 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74  E_TEST.int sqlit
21c20 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e  e3_opentemp_coun
21c30 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f  t = 0;.#endif../
21c40 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70  *.** Open a temp
21c50 6f 72 61 72 79 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  orary file..**.*
21c60 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 6c 65  * Write the file
21c70 20 64 65 73 63 72 69 70 74 6f 72 20 69 6e 74 6f   descriptor into
21c80 20 2a 70 46 69 6c 65 2e 20 52 65 74 75 72 6e 20   *pFile. Return 
21c90 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
21ca0 63 65 73 73 20 0a 2a 2a 20 6f 72 20 73 6f 6d 65  cess .** or some
21cb0 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64   other error cod
21cc0 65 20 69 66 20 77 65 20 66 61 69 6c 2e 20 54 68  e if we fail. Th
21cd0 65 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61  e OS will automa
21ce0 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 64 65 6c 65  tically .** dele
21cf0 74 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  te the temporary
21d00 20 66 69 6c 65 20 77 68 65 6e 20 69 74 20 69 73   file when it is
21d10 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54   closed..**.** T
21d20 68 65 20 66 6c 61 67 73 20 70 61 73 73 65 64 20  he flags passed 
21d30 74 6f 20 74 68 65 20 56 46 53 20 6c 61 79 65 72  to the VFS layer
21d40 20 78 4f 70 65 6e 28 29 20 63 61 6c 6c 20 61 72   xOpen() call ar
21d50 65 20 74 68 6f 73 65 20 73 70 65 63 69 66 69 65  e those specifie
21d60 64 0a 2a 2a 20 62 79 20 70 61 72 61 6d 65 74 65  d.** by paramete
21d70 72 20 76 66 73 46 6c 61 67 73 20 4f 52 65 64 20  r vfsFlags ORed 
21d80 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69  with the followi
21d90 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51  ng:.**.**     SQ
21da0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
21db0 49 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54  ITE.**     SQLIT
21dc0 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 0a 2a 2a  E_OPEN_CREATE.**
21dd0 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
21de0 5f 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20  _EXCLUSIVE.**   
21df0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45    SQLITE_OPEN_DE
21e00 4c 45 54 45 4f 4e 43 4c 4f 53 45 0a 2a 2f 0a 73  LETEONCLOSE.*/.s
21e10 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 4f  tatic int pagerO
21e20 70 65 6e 74 65 6d 70 28 0a 20 20 50 61 67 65 72  pentemp(.  Pager
21e30 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20   *pPager,       
21e40 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f 62   /* The pager ob
21e50 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ject */.  sqlite
21e60 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20  3_file *pFile,  
21e70 2f 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 6c  /* Write the fil
21e80 65 20 64 65 73 63 72 69 70 74 6f 72 20 68 65 72  e descriptor her
21e90 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c  e */.  int vfsFl
21ea0 61 67 73 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ags          /* 
21eb0 46 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72  Flags passed thr
21ec0 6f 75 67 68 20 74 6f 20 74 68 65 20 56 46 53 20  ough to the VFS 
21ed0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  */.){.  int rc; 
21ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21ef0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
21f00 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
21f10 45 53 54 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70  EST.  sqlite3_op
21f20 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20  entemp_count++; 
21f30 20 2f 2a 20 55 73 65 64 20 66 6f 72 20 74 65 73   /* Used for tes
21f40 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69  ting and analysi
21f50 73 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69 66  s only */.#endif
21f60 0a 0a 20 20 76 66 73 46 6c 61 67 73 20 7c 3d 20  ..  vfsFlags |= 
21f70 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
21f80 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f  DWRITE | SQLITE_
21f90 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20  OPEN_CREATE |.  
21fa0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
21fb0 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20  _OPEN_EXCLUSIVE 
21fc0 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45  | SQLITE_OPEN_DE
21fd0 4c 45 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20 72  LETEONCLOSE;.  r
21fe0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
21ff0 6e 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20  n(pPager->pVfs, 
22000 30 2c 20 70 46 69 6c 65 2c 20 76 66 73 46 6c 61  0, pFile, vfsFla
22010 67 73 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74  gs, 0);.  assert
22020 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
22030 7c 7c 20 69 73 4f 70 65 6e 28 70 46 69 6c 65 29  || isOpen(pFile)
22040 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
22050 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
22060 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66  e busy handler f
22070 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  unction..**.** T
22080 68 65 20 70 61 67 65 72 20 69 6e 76 6f 6b 65 73  he pager invokes
22090 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65   the busy-handle
220a0 72 20 69 66 20 73 71 6c 69 74 65 33 4f 73 4c 6f  r if sqlite3OsLo
220b0 63 6b 28 29 20 72 65 74 75 72 6e 73 20 0a 2a 2a  ck() returns .**
220c0 20 53 51 4c 49 54 45 5f 42 55 53 59 20 77 68 65   SQLITE_BUSY whe
220d0 6e 20 74 72 79 69 6e 67 20 74 6f 20 75 70 67 72  n trying to upgr
220e0 61 64 65 20 66 72 6f 6d 20 6e 6f 2d 6c 6f 63 6b  ade from no-lock
220f0 20 74 6f 20 61 20 53 48 41 52 45 44 20 6c 6f 63   to a SHARED loc
22100 6b 2c 0a 2a 2a 20 6f 72 20 77 68 65 6e 20 74 72  k,.** or when tr
22110 79 69 6e 67 20 74 6f 20 75 70 67 72 61 64 65 20  ying to upgrade 
22120 66 72 6f 6d 20 61 20 52 45 53 45 52 56 45 44 20  from a RESERVED 
22130 6c 6f 63 6b 20 74 6f 20 61 6e 20 45 58 43 4c 55  lock to an EXCLU
22140 53 49 56 45 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49  SIVE .** lock. I
22150 74 20 64 6f 65 73 20 2a 6e 6f 74 2a 20 69 6e 76  t does *not* inv
22160 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e  oke the busy han
22170 64 6c 65 72 20 77 68 65 6e 20 75 70 67 72 61 64  dler when upgrad
22180 69 6e 67 20 66 72 6f 6d 0a 2a 2a 20 53 48 41 52  ing from.** SHAR
22190 45 44 20 74 6f 20 52 45 53 45 52 56 45 44 2c 20  ED to RESERVED, 
221a0 6f 72 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e  or when upgradin
221b0 67 20 66 72 6f 6d 20 53 48 41 52 45 44 20 74 6f  g from SHARED to
221c0 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 28 77   EXCLUSIVE.** (w
221d0 68 69 63 68 20 6f 63 63 75 72 73 20 64 75 72 69  hich occurs duri
221e0 6e 67 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72  ng hot-journal r
221f0 6f 6c 6c 62 61 63 6b 29 2e 20 53 75 6d 6d 61 72  ollback). Summar
22200 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 54 72 61 6e 73  y:.**.**   Trans
22210 69 74 69 6f 6e 20 20 20 20 20 20 20 20 20 20 20  ition           
22220 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 49               | I
22230 6e 76 6f 6b 65 73 20 78 42 75 73 79 48 61 6e 64  nvokes xBusyHand
22240 6c 65 72 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d  ler.**   -------
22250 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22260 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22270 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22280 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b 20 20  -.**   NO_LOCK  
22290 20 20 20 20 20 2d 3e 20 53 48 41 52 45 44 5f 4c       -> SHARED_L
222a0 4f 43 4b 20 20 20 20 20 20 7c 20 59 65 73 0a 2a  OCK      | Yes.*
222b0 2a 20 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20  *   SHARED_LOCK 
222c0 20 20 2d 3e 20 52 45 53 45 52 56 45 44 5f 4c 4f    -> RESERVED_LO
222d0 43 4b 20 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20  CK    | No.**   
222e0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e  SHARED_LOCK   ->
222f0 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20   EXCLUSIVE_LOCK 
22300 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 52 45 53 45    | No.**   RESE
22310 52 56 45 44 5f 4c 4f 43 4b 20 2d 3e 20 45 58 43  RVED_LOCK -> EXC
22320 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20  LUSIVE_LOCK   | 
22330 59 65 73 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  Yes.**.** If the
22340 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61   busy-handler ca
22350 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20 6e  llback returns n
22360 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63  on-zero, the loc
22370 6b 20 69 73 20 0a 2a 2a 20 72 65 74 72 69 65 64  k is .** retried
22380 2e 20 49 66 20 69 74 20 72 65 74 75 72 6e 73 20  . If it returns 
22390 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 53  zero, then the S
223a0 51 4c 49 54 45 5f 42 55 53 59 20 65 72 72 6f 72  QLITE_BUSY error
223b0 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20   is.** returned 
223c0 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 6f 66  to the caller of
223d0 20 74 68 65 20 70 61 67 65 72 20 41 50 49 20 66   the pager API f
223e0 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  unction..*/.void
223f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
22400 42 75 73 79 68 61 6e 64 6c 65 72 28 0a 20 20 50  Busyhandler(.  P
22410 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20  ager *pPager,   
22420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22430 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a      /* Pager obj
22440 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78  ect */.  int (*x
22450 42 75 73 79 48 61 6e 64 6c 65 72 29 28 76 6f 69  BusyHandler)(voi
22460 64 20 2a 29 2c 20 20 20 20 20 20 20 20 20 2f 2a  d *),         /*
22470 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 73 79   Pointer to busy
22480 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f  -handler functio
22490 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75  n */.  void *pBu
224a0 73 79 48 61 6e 64 6c 65 72 41 72 67 20 20 20 20  syHandlerArg    
224b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
224c0 72 67 75 6d 65 6e 74 20 74 6f 20 70 61 73 73 20  rgument to pass 
224d0 74 6f 20 78 42 75 73 79 48 61 6e 64 6c 65 72 20  to xBusyHandler 
224e0 2a 2f 0a 29 7b 20 20 0a 20 20 70 50 61 67 65 72  */.){  .  pPager
224f0 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 20 3d  ->xBusyHandler =
22500 20 78 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20   xBusyHandler;. 
22510 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61   pPager->pBusyHa
22520 6e 64 6c 65 72 41 72 67 20 3d 20 70 42 75 73 79  ndlerArg = pBusy
22530 48 61 6e 64 6c 65 72 41 72 67 3b 0a 7d 0a 0a 2f  HandlerArg;.}../
22540 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
22550 70 61 67 65 20 73 69 7a 65 20 75 73 65 64 20 62  page size used b
22560 79 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65  y the Pager obje
22570 63 74 2e 20 54 68 65 20 6e 65 77 20 70 61 67 65  ct. The new page
22580 20 73 69 7a 65 20 0a 2a 2a 20 69 73 20 70 61 73   size .** is pas
22590 73 65 64 20 69 6e 20 2a 70 50 61 67 65 53 69 7a  sed in *pPageSiz
225a0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
225b0 70 61 67 65 72 20 69 73 20 69 6e 20 74 68 65 20  pager is in the 
225c0 65 72 72 6f 72 20 73 74 61 74 65 20 77 68 65 6e  error state when
225d0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
225e0 73 20 63 61 6c 6c 65 64 2c 20 69 74 0a 2a 2a 20  s called, it.** 
225f0 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 54 68 65 20  is a no-op. The 
22600 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69  value returned i
22610 73 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  s the error stat
22620 65 20 65 72 72 6f 72 20 63 6f 64 65 20 28 69 2e  e error code (i.
22630 65 2e 20 0a 2a 2a 20 6f 6e 65 20 6f 66 20 53 51  e. .** one of SQ
22640 4c 49 54 45 5f 49 4f 45 52 52 2c 20 61 6e 20 53  LITE_IOERR, an S
22650 51 4c 49 54 45 5f 49 4f 45 52 52 5f 78 78 78 20  QLITE_IOERR_xxx 
22660 73 75 62 2d 63 6f 64 65 20 6f 72 20 53 51 4c 49  sub-code or SQLI
22670 54 45 5f 46 55 4c 4c 29 2e 0a 2a 2a 0a 2a 2a 20  TE_FULL)..**.** 
22680 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 6c  Otherwise, if al
22690 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  l of the followi
226a0 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a  ng are true:.**.
226b0 2a 2a 20 20 20 2a 20 74 68 65 20 6e 65 77 20 70  **   * the new p
226c0 61 67 65 20 73 69 7a 65 20 28 76 61 6c 75 65 20  age size (value 
226d0 6f 66 20 2a 70 50 61 67 65 53 69 7a 65 29 20 69  of *pPageSize) i
226e0 73 20 76 61 6c 69 64 20 28 61 20 70 6f 77 65 72  s valid (a power
226f0 20 0a 2a 2a 20 20 20 20 20 6f 66 20 74 77 6f 20   .**     of two 
22700 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20  between 512 and 
22710 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
22720 53 49 5a 45 2c 20 69 6e 63 6c 75 73 69 76 65 29  SIZE, inclusive)
22730 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  , and.**.**   * 
22740 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74  there are no out
22750 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20 72 65  standing page re
22760 66 65 72 65 6e 63 65 73 2c 20 61 6e 64 0a 2a 2a  ferences, and.**
22770 0a 2a 2a 20 20 20 2a 20 74 68 65 20 64 61 74 61  .**   * the data
22780 62 61 73 65 20 69 73 20 65 69 74 68 65 72 20 6e  base is either n
22790 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  ot an in-memory 
227a0 64 61 74 61 62 61 73 65 20 6f 72 20 69 74 20 69  database or it i
227b0 73 0a 2a 2a 20 20 20 20 20 61 6e 20 69 6e 2d 6d  s.**     an in-m
227c0 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 74  emory database t
227d0 68 61 74 20 63 75 72 72 65 6e 74 6c 79 20 63 6f  hat currently co
227e0 6e 73 69 73 74 73 20 6f 66 20 7a 65 72 6f 20 70  nsists of zero p
227f0 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e  ages..**.** then
22800 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63   the pager objec
22810 74 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 73  t page size is s
22820 65 74 20 74 6f 20 2a 70 50 61 67 65 53 69 7a 65  et to *pPageSize
22830 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
22840 61 67 65 20 73 69 7a 65 20 69 73 20 63 68 61 6e  age size is chan
22850 67 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20 66  ged, then this f
22860 75 6e 63 74 69 6f 6e 20 75 73 65 73 20 73 71 6c  unction uses sql
22870 69 74 65 33 50 61 67 65 72 4d 61 6c 6c 6f 63 28  ite3PagerMalloc(
22880 29 20 0a 2a 2a 20 74 6f 20 6f 62 74 61 69 6e 20  ) .** to obtain 
22890 61 20 6e 65 77 20 50 61 67 65 72 2e 70 54 6d 70  a new Pager.pTmp
228a0 53 70 61 63 65 20 62 75 66 66 65 72 2e 20 49 66  Space buffer. If
228b0 20 74 68 69 73 20 61 6c 6c 6f 63 61 74 69 6f 6e   this allocation
228c0 20 61 74 74 65 6d 70 74 20 0a 2a 2a 20 66 61 69   attempt .** fai
228d0 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  ls, SQLITE_NOMEM
228e0 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
228f0 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 72   the page size r
22900 65 6d 61 69 6e 73 20 75 6e 63 68 61 6e 67 65 64  emains unchanged
22910 2e 20 0a 2a 2a 20 49 6e 20 61 6c 6c 20 6f 74 68  . .** In all oth
22920 65 72 20 63 61 73 65 73 2c 20 53 51 4c 49 54 45  er cases, SQLITE
22930 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
22940 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
22950 67 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 20 63  ge size is not c
22960 68 61 6e 67 65 64 2c 20 65 69 74 68 65 72 20 62  hanged, either b
22970 65 63 61 75 73 65 20 6f 6e 65 20 6f 66 20 74 68  ecause one of th
22980 65 20 65 6e 75 6d 65 72 61 74 65 64 0a 2a 2a 20  e enumerated.** 
22990 63 6f 6e 64 69 74 69 6f 6e 73 20 61 62 6f 76 65  conditions above
229a0 20 69 73 20 6e 6f 74 20 74 72 75 65 2c 20 74 68   is not true, th
229b0 65 20 70 61 67 65 72 20 77 61 73 20 69 6e 20 65  e pager was in e
229c0 72 72 6f 72 20 73 74 61 74 65 20 77 68 65 6e 20  rror state when 
229d0 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  this.** function
229e0 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 6f 72 20   was called, or 
229f0 62 65 63 61 75 73 65 20 74 68 65 20 6d 65 6d 6f  because the memo
22a00 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74  ry allocation at
22a10 74 65 6d 70 74 20 66 61 69 6c 65 64 2c 20 0a 2a  tempt failed, .*
22a20 2a 20 74 68 65 6e 20 2a 70 50 61 67 65 53 69 7a  * then *pPageSiz
22a30 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  e is set to the 
22a40 6f 6c 64 2c 20 72 65 74 61 69 6e 65 64 20 70 61  old, retained pa
22a50 67 65 20 73 69 7a 65 20 62 65 66 6f 72 65 20 72  ge size before r
22a60 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74  eturning..*/.int
22a70 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
22a80 50 61 67 65 73 69 7a 65 28 50 61 67 65 72 20 2a  Pagesize(Pager *
22a90 70 50 61 67 65 72 2c 20 75 33 32 20 2a 70 50 61  pPager, u32 *pPa
22aa0 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73  geSize, int nRes
22ab0 65 72 76 65 29 7b 0a 20 20 69 6e 74 20 72 63 20  erve){.  int rc 
22ac0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
22ad0 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73  /* It is not pos
22ae0 73 69 62 6c 65 20 74 6f 20 64 6f 20 61 20 66 75  sible to do a fu
22af0 6c 6c 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  ll assert_pager_
22b00 73 74 61 74 65 28 29 20 68 65 72 65 2c 20 61 73  state() here, as
22b10 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74   this.  ** funct
22b20 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65  ion may be calle
22b30 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 50 61  d from within Pa
22b40 67 65 72 4f 70 65 6e 28 29 2c 20 62 65 66 6f 72  gerOpen(), befor
22b50 65 20 74 68 65 20 73 74 61 74 65 0a 20 20 2a 2a  e the state.  **
22b60 20 6f 66 20 74 68 65 20 50 61 67 65 72 20 6f 62   of the Pager ob
22b70 6a 65 63 74 20 69 73 20 69 6e 74 65 72 6e 61 6c  ject is internal
22b80 6c 79 20 63 6f 6e 73 69 73 74 65 6e 74 2e 0a 20  ly consistent.. 
22b90 20 2a 2a 0a 20 20 2a 2a 20 41 74 20 6f 6e 65 20   **.  ** At one 
22ba0 70 6f 69 6e 74 20 74 68 69 73 20 66 75 6e 63 74  point this funct
22bb0 69 6f 6e 20 72 65 74 75 72 6e 65 64 20 61 6e 20  ion returned an 
22bc0 65 72 72 6f 72 20 69 66 20 74 68 65 20 70 61 67  error if the pag
22bd0 65 72 20 77 61 73 20 69 6e 20 0a 20 20 2a 2a 20  er was in .  ** 
22be0 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74  PAGER_ERROR stat
22bf0 65 2e 20 42 75 74 20 73 69 6e 63 65 20 50 41 47  e. But since PAG
22c00 45 52 5f 45 52 52 4f 52 20 73 74 61 74 65 20 67  ER_ERROR state g
22c10 75 61 72 61 6e 74 65 65 73 20 74 68 61 74 0a 20  uarantees that. 
22c20 20 2a 2a 20 74 68 65 72 65 20 69 73 20 61 74 20   ** there is at 
22c30 6c 65 61 73 74 20 6f 6e 65 20 6f 75 74 73 74 61  least one outsta
22c40 6e 64 69 6e 67 20 70 61 67 65 20 72 65 66 65 72  nding page refer
22c50 65 6e 63 65 2c 20 74 68 69 73 20 66 75 6e 63 74  ence, this funct
22c60 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 61 20 6e 6f  ion.  ** is a no
22c70 2d 6f 70 20 66 6f 72 20 74 68 61 74 20 63 61 73  -op for that cas
22c80 65 20 61 6e 79 68 6f 77 2e 0a 20 20 2a 2f 0a 0a  e anyhow..  */..
22c90 20 20 75 33 32 20 70 61 67 65 53 69 7a 65 20 3d    u32 pageSize =
22ca0 20 2a 70 50 61 67 65 53 69 7a 65 3b 0a 20 20 61   *pPageSize;.  a
22cb0 73 73 65 72 74 28 20 70 61 67 65 53 69 7a 65 3d  ssert( pageSize=
22cc0 3d 30 20 7c 7c 20 28 70 61 67 65 53 69 7a 65 3e  =0 || (pageSize>
22cd0 3d 35 31 32 20 26 26 20 70 61 67 65 53 69 7a 65  =512 && pageSize
22ce0 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  <=SQLITE_MAX_PAG
22cf0 45 5f 53 49 5a 45 29 20 29 3b 0a 20 20 69 66 28  E_SIZE) );.  if(
22d00 20 28 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 3d   (pPager->memDb=
22d10 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62  =0 || pPager->db
22d20 53 69 7a 65 3d 3d 30 29 0a 20 20 20 26 26 20 73  Size==0).   && s
22d30 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43  qlite3PcacheRefC
22d40 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43  ount(pPager->pPC
22d50 61 63 68 65 29 3d 3d 30 20 0a 20 20 20 26 26 20  ache)==0 .   && 
22d60 70 61 67 65 53 69 7a 65 20 26 26 20 70 61 67 65  pageSize && page
22d70 53 69 7a 65 21 3d 28 75 33 32 29 70 50 61 67 65  Size!=(u32)pPage
22d80 72 2d 3e 70 61 67 65 53 69 7a 65 20 0a 20 20 29  r->pageSize .  )
22d90 7b 0a 20 20 20 20 63 68 61 72 20 2a 70 4e 65 77  {.    char *pNew
22da0 20 3d 20 4e 55 4c 4c 3b 20 20 20 20 20 20 20 20   = NULL;        
22db0 20 20 20 20 20 2f 2a 20 4e 65 77 20 74 65 6d 70       /* New temp
22dc0 20 73 70 61 63 65 20 2a 2f 0a 20 20 20 20 69 36   space */.    i6
22dd0 34 20 6e 42 79 74 65 20 3d 20 30 3b 0a 0a 20 20  4 nByte = 0;..  
22de0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53    if( pPager->eS
22df0 74 61 74 65 3e 50 41 47 45 52 5f 4f 50 45 4e 20  tate>PAGER_OPEN 
22e00 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  && isOpen(pPager
22e10 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 20 20 72  ->fd) ){.      r
22e20 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
22e30 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64  eSize(pPager->fd
22e40 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 7d  , &nByte);.    }
22e50 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
22e60 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
22e70 70 4e 65 77 20 3d 20 28 63 68 61 72 20 2a 29 73  pNew = (char *)s
22e80 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63  qlite3PageMalloc
22e90 28 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  (pageSize);.    
22ea0 20 20 69 66 28 20 21 70 4e 65 77 20 29 20 72 63    if( !pNew ) rc
22eb0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
22ec0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
22ed0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
22ee0 0a 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73  .      pager_res
22ef0 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  et(pPager);.    
22f00 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
22f10 20 3d 20 28 50 67 6e 6f 29 28 6e 42 79 74 65 2f   = (Pgno)(nByte/
22f20 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
22f30 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
22f40 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20  e = pageSize;.  
22f50 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 46      sqlite3PageF
22f60 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d 70  ree(pPager->pTmp
22f70 53 70 61 63 65 29 3b 0a 20 20 20 20 20 20 70 50  Space);.      pP
22f80 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20  ager->pTmpSpace 
22f90 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 73 71  = pNew;.      sq
22fa0 6c 69 74 65 33 50 63 61 63 68 65 53 65 74 50 61  lite3PcacheSetPa
22fb0 67 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 70  geSize(pPager->p
22fc0 50 43 61 63 68 65 2c 20 70 61 67 65 53 69 7a 65  PCache, pageSize
22fd0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
22fe0 2a 70 50 61 67 65 53 69 7a 65 20 3d 20 70 50 61  *pPageSize = pPa
22ff0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
23000 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
23010 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 52  OK ){.    if( nR
23020 65 73 65 72 76 65 3c 30 20 29 20 6e 52 65 73 65  eserve<0 ) nRese
23030 72 76 65 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52  rve = pPager->nR
23040 65 73 65 72 76 65 3b 0a 20 20 20 20 61 73 73 65  eserve;.    asse
23050 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 30 20  rt( nReserve>=0 
23060 26 26 20 6e 52 65 73 65 72 76 65 3c 31 30 30 30  && nReserve<1000
23070 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
23080 6e 52 65 73 65 72 76 65 20 3d 20 28 69 31 36 29  nReserve = (i16)
23090 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20 70 61  nReserve;.    pa
230a0 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 70 50  gerReportSize(pP
230b0 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ager);.  }.  ret
230c0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
230d0 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
230e0 72 20 74 6f 20 74 68 65 20 22 74 65 6d 70 6f 72  r to the "tempor
230f0 61 72 79 20 70 61 67 65 22 20 62 75 66 66 65 72  ary page" buffer
23100 20 68 65 6c 64 20 69 6e 74 65 72 6e 61 6c 6c 79   held internally
23110 0a 2a 2a 20 62 79 20 74 68 65 20 70 61 67 65 72  .** by the pager
23120 2e 20 20 54 68 69 73 20 69 73 20 61 20 62 75 66  .  This is a buf
23130 66 65 72 20 74 68 61 74 20 69 73 20 62 69 67 20  fer that is big 
23140 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 74  enough to hold t
23150 68 65 0a 2a 2a 20 65 6e 74 69 72 65 20 63 6f 6e  he.** entire con
23160 74 65 6e 74 20 6f 66 20 61 20 64 61 74 61 62 61  tent of a databa
23170 73 65 20 70 61 67 65 2e 20 20 54 68 69 73 20 62  se page.  This b
23180 75 66 66 65 72 20 69 73 20 75 73 65 64 20 69 6e  uffer is used in
23190 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 64 75 72 69  ternally.** duri
231a0 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20  ng rollback and 
231b0 77 69 6c 6c 20 62 65 20 6f 76 65 72 77 72 69 74  will be overwrit
231c0 74 65 6e 20 77 68 65 6e 65 76 65 72 20 61 20 72  ten whenever a r
231d0 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6f 63 63 75 72  ollback.** occur
231e0 73 2e 20 20 42 75 74 20 6f 74 68 65 72 20 6d 6f  s.  But other mo
231f0 64 75 6c 65 73 20 61 72 65 20 66 72 65 65 20 74  dules are free t
23200 6f 20 75 73 65 20 69 74 20 74 6f 6f 2c 20 61 73  o use it too, as
23210 20 6c 6f 6e 67 20 61 73 0a 2a 2a 20 6e 6f 20 72   long as.** no r
23220 6f 6c 6c 62 61 63 6b 73 20 61 72 65 20 68 61 70  ollbacks are hap
23230 70 65 6e 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20  pening..*/.void 
23240 2a 73 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d  *sqlite3PagerTem
23250 70 53 70 61 63 65 28 50 61 67 65 72 20 2a 70 50  pSpace(Pager *pP
23260 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
23270 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
23280 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65  e;.}../*.** Atte
23290 6d 70 74 20 74 6f 20 73 65 74 20 74 68 65 20 6d  mpt to set the m
232a0 61 78 69 6d 75 6d 20 64 61 74 61 62 61 73 65 20  aximum database 
232b0 70 61 67 65 20 63 6f 75 6e 74 20 69 66 20 6d 78  page count if mx
232c0 50 61 67 65 20 69 73 20 70 6f 73 69 74 69 76 65  Page is positive
232d0 2e 20 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68  . .** Make no ch
232e0 61 6e 67 65 73 20 69 66 20 6d 78 50 61 67 65 20  anges if mxPage 
232f0 69 73 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74  is zero or negat
23300 69 76 65 2e 20 20 41 6e 64 20 6e 65 76 65 72 20  ive.  And never 
23310 72 65 64 75 63 65 20 74 68 65 0a 2a 2a 20 6d 61  reduce the.** ma
23320 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74  ximum page count
23330 20 62 65 6c 6f 77 20 74 68 65 20 63 75 72 72 65   below the curre
23340 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  nt size of the d
23350 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52  atabase..**.** R
23360 65 67 61 72 64 6c 65 73 73 20 6f 66 20 6d 78 50  egardless of mxP
23370 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20  age, return the 
23380 63 75 72 72 65 6e 74 20 6d 61 78 69 6d 75 6d 20  current maximum 
23390 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69  page count..*/.i
233a0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d  nt sqlite3PagerM
233b0 61 78 50 61 67 65 43 6f 75 6e 74 28 50 61 67 65  axPageCount(Page
233c0 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d  r *pPager, int m
233d0 78 50 61 67 65 29 7b 0a 20 20 69 66 28 20 6d 78  xPage){.  if( mx
233e0 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 70 50  Page>0 ){.    pP
233f0 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 6d  ager->mxPgno = m
23400 78 50 61 67 65 3b 0a 20 20 7d 0a 20 20 61 73 73  xPage;.  }.  ass
23410 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
23420 61 74 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate!=PAGER_OPEN 
23430 29 3b 20 20 20 20 20 20 2f 2a 20 43 61 6c 6c 65  );      /* Calle
23440 64 20 6f 6e 6c 79 20 62 79 20 4f 50 5f 4d 61 78  d only by OP_Max
23450 50 67 63 6e 74 20 2a 2f 0a 20 20 61 73 73 65 72  Pgcnt */.  asser
23460 74 28 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e  t( pPager->mxPgn
23470 6f 3e 3d 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  o>=pPager->dbSiz
23480 65 20 29 3b 20 20 2f 2a 20 4f 50 5f 4d 61 78 50  e );  /* OP_MaxP
23490 67 63 6e 74 20 65 6e 66 6f 72 63 65 73 20 74 68  gcnt enforces th
234a0 69 73 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70  is */.  return p
234b0 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 3b 0a 7d  Pager->mxPgno;.}
234c0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
234d0 6f 77 69 6e 67 20 73 65 74 20 6f 66 20 72 6f 75  owing set of rou
234e0 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74  tines are used t
234f0 6f 20 64 69 73 61 62 6c 65 20 74 68 65 20 73 69  o disable the si
23500 6d 75 6c 61 74 65 64 0a 2a 2a 20 49 2f 4f 20 65  mulated.** I/O e
23510 72 72 6f 72 20 6d 65 63 68 61 6e 69 73 6d 2e 20  rror mechanism. 
23520 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20   These routines 
23530 61 72 65 20 75 73 65 64 20 74 6f 20 61 76 6f 69  are used to avoi
23540 64 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 65  d simulated.** e
23550 72 72 6f 72 73 20 69 6e 20 70 6c 61 63 65 73 20  rrors in places 
23560 77 68 65 72 65 20 77 65 20 64 6f 20 6e 6f 74 20  where we do not 
23570 63 61 72 65 20 61 62 6f 75 74 20 65 72 72 6f 72  care about error
23580 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20  s..**.** Unless 
23590 2d 44 53 51 4c 49 54 45 5f 54 45 53 54 3d 31 20  -DSQLITE_TEST=1 
235a0 69 73 20 75 73 65 64 2c 20 74 68 65 73 65 20 72  is used, these r
235b0 6f 75 74 69 6e 65 73 20 61 72 65 20 61 6c 6c 20  outines are all 
235c0 6e 6f 2d 6f 70 73 0a 2a 2a 20 61 6e 64 20 67 65  no-ops.** and ge
235d0 6e 65 72 61 74 65 20 6e 6f 20 63 6f 64 65 2e 0a  nerate no code..
235e0 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
235f0 5f 54 45 53 54 0a 65 78 74 65 72 6e 20 69 6e 74  _TEST.extern int
23600 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
23610 72 5f 70 65 6e 64 69 6e 67 3b 0a 65 78 74 65 72  r_pending;.exter
23620 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f  n int sqlite3_io
23630 5f 65 72 72 6f 72 5f 68 69 74 3b 0a 73 74 61 74  _error_hit;.stat
23640 69 63 20 69 6e 74 20 73 61 76 65 64 5f 63 6e 74  ic int saved_cnt
23650 3b 0a 76 6f 69 64 20 64 69 73 61 62 6c 65 5f 73  ;.void disable_s
23660 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
23670 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 61 76 65  rs(void){.  save
23680 64 5f 63 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f  d_cnt = sqlite3_
23690 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67  io_error_pending
236a0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  ;.  sqlite3_io_e
236b0 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 2d  rror_pending = -
236c0 31 3b 0a 7d 0a 76 6f 69 64 20 65 6e 61 62 6c 65  1;.}.void enable
236d0 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
236e0 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 71  rors(void){.  sq
236f0 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70  lite3_io_error_p
23700 65 6e 64 69 6e 67 20 3d 20 73 61 76 65 64 5f 63  ending = saved_c
23710 6e 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65  nt;.}.#else.# de
23720 66 69 6e 65 20 64 69 73 61 62 6c 65 5f 73 69 6d  fine disable_sim
23730 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
23740 28 29 0a 23 20 64 65 66 69 6e 65 20 65 6e 61 62  ().# define enab
23750 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
23760 65 72 72 6f 72 73 28 29 0a 23 65 6e 64 69 66 0a  errors().#endif.
23770 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20  ./*.** Read the 
23780 66 69 72 73 74 20 4e 20 62 79 74 65 73 20 66 72  first N bytes fr
23790 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  om the beginning
237a0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e 74   of the file int
237b0 6f 20 6d 65 6d 6f 72 79 0a 2a 2a 20 74 68 61 74  o memory.** that
237c0 20 70 44 65 73 74 20 70 6f 69 6e 74 73 20 74 6f   pDest points to
237d0 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  . .**.** If the 
237e0 70 61 67 65 72 20 77 61 73 20 6f 70 65 6e 65 64  pager was opened
237f0 20 6f 6e 20 61 20 74 72 61 6e 73 69 65 6e 74 20   on a transient 
23800 66 69 6c 65 20 28 7a 46 69 6c 65 6e 61 6d 65 3d  file (zFilename=
23810 3d 22 22 29 2c 20 6f 72 0a 2a 2a 20 6f 70 65 6e  =""), or.** open
23820 65 64 20 6f 6e 20 61 20 66 69 6c 65 20 6c 65 73  ed on a file les
23830 73 20 74 68 61 6e 20 4e 20 62 79 74 65 73 20 69  s than N bytes i
23840 6e 20 73 69 7a 65 2c 20 74 68 65 20 6f 75 74 70  n size, the outp
23850 75 74 20 62 75 66 66 65 72 20 69 73 0a 2a 2a 20  ut buffer is.** 
23860 7a 65 72 6f 65 64 20 61 6e 64 20 53 51 4c 49 54  zeroed and SQLIT
23870 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 54  E_OK returned. T
23880 68 65 20 72 61 74 69 6f 6e 61 6c 65 20 66 6f 72  he rationale for
23890 20 74 68 69 73 20 69 73 20 74 68 61 74 20 74 68   this is that th
238a0 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  is .** function 
238b0 69 73 20 75 73 65 64 20 74 6f 20 72 65 61 64 20  is used to read 
238c0 64 61 74 61 62 61 73 65 20 68 65 61 64 65 72 73  database headers
238d0 2c 20 61 6e 64 20 61 20 6e 65 77 20 74 72 61 6e  , and a new tran
238e0 73 69 65 6e 74 20 6f 72 0a 2a 2a 20 7a 65 72 6f  sient or.** zero
238f0 20 73 69 7a 65 64 20 64 61 74 61 62 61 73 65 20   sized database 
23900 68 61 73 20 61 20 68 65 61 64 65 72 20 74 68 61  has a header tha
23910 6e 20 63 6f 6e 73 69 73 74 73 20 65 6e 74 69 72  n consists entir
23920 65 6c 79 20 6f 66 20 7a 65 72 6f 65 73 2e 0a 2a  ely of zeroes..*
23930 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 49 4f 20 65  *.** If any IO e
23940 72 72 6f 72 20 61 70 61 72 74 20 66 72 6f 6d 20  rror apart from 
23950 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
23960 52 54 5f 52 45 41 44 20 69 73 20 65 6e 63 6f 75  RT_READ is encou
23970 6e 74 65 72 65 64 2c 0a 2a 2a 20 74 68 65 20 65  ntered,.** the e
23980 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
23990 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c  urned to the cal
239a0 6c 65 72 20 61 6e 64 20 74 68 65 20 63 6f 6e 74  ler and the cont
239b0 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 6f  ents of the.** o
239c0 75 74 70 75 74 20 62 75 66 66 65 72 20 75 6e 64  utput buffer und
239d0 65 66 69 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  efined..*/.int s
239e0 71 6c 69 74 65 33 50 61 67 65 72 52 65 61 64 46  qlite3PagerReadF
239f0 69 6c 65 68 65 61 64 65 72 28 50 61 67 65 72 20  ileheader(Pager 
23a00 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 4e 2c 20  *pPager, int N, 
23a10 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
23a20 44 65 73 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  Dest){.  int rc 
23a30 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6d  = SQLITE_OK;.  m
23a40 65 6d 73 65 74 28 70 44 65 73 74 2c 20 30 2c 20  emset(pDest, 0, 
23a50 4e 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73  N);.  assert( is
23a60 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
23a70 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
23a80 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  File );..  /* Th
23a90 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e  is routine is on
23aa0 6c 79 20 63 61 6c 6c 65 64 20 62 79 20 62 74 72  ly called by btr
23ab0 65 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61  ee immediately a
23ac0 66 74 65 72 20 63 72 65 61 74 69 6e 67 0a 20 20  fter creating.  
23ad0 2a 2a 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a  ** the Pager obj
23ae0 65 63 74 2e 20 20 54 68 65 72 65 20 68 61 73 20  ect.  There has 
23af0 6e 6f 74 20 62 65 65 6e 20 61 6e 20 6f 70 70 6f  not been an oppo
23b00 72 74 75 6e 69 74 79 20 74 6f 20 74 72 61 6e 73  rtunity to trans
23b10 69 74 69 6f 6e 0a 20 20 2a 2a 20 74 6f 20 57 41  ition.  ** to WA
23b20 4c 20 6d 6f 64 65 20 79 65 74 2e 0a 20 20 2a 2f  L mode yet..  */
23b30 0a 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65  .  assert( !page
23b40 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
23b50 29 3b 0a 0a 20 20 69 66 28 20 69 73 4f 70 65 6e  );..  if( isOpen
23b60 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a  (pPager->fd) ){.
23b70 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 44 42      IOTRACE(("DB
23b80 48 44 52 20 25 70 20 30 20 25 64 5c 6e 22 2c 20  HDR %p 0 %d\n", 
23b90 70 50 61 67 65 72 2c 20 4e 29 29 0a 20 20 20 20  pPager, N)).    
23ba0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
23bb0 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  ad(pPager->fd, p
23bc0 44 65 73 74 2c 20 4e 2c 20 30 29 3b 0a 20 20 20  Dest, N, 0);.   
23bd0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
23be0 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
23bf0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
23c00 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
23c10 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
23c20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
23c30 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6f 6e 6c 79  unction may only
23c40 20 62 65 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   be called when 
23c50 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  a read-transacti
23c60 6f 6e 20 69 73 20 6f 70 65 6e 20 6f 6e 0a 2a 2a  on is open on.**
23c70 20 74 68 65 20 70 61 67 65 72 2e 20 49 74 20 72   the pager. It r
23c80 65 74 75 72 6e 73 20 74 68 65 20 74 6f 74 61 6c  eturns the total
23c90 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
23ca0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
23cb0 2e 0a 2a 2a 0a 2a 2a 20 48 6f 77 65 76 65 72 2c  ..**.** However,
23cc0 20 69 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   if the file is 
23cd0 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 3c 70  between 1 and <p
23ce0 61 67 65 2d 73 69 7a 65 3e 20 62 79 74 65 73 20  age-size> bytes 
23cf0 69 6e 20 73 69 7a 65 2c 20 74 68 65 6e 20 0a 2a  in size, then .*
23d00 2a 20 74 68 69 73 20 69 73 20 63 6f 6e 73 69 64  * this is consid
23d10 65 72 65 64 20 61 20 31 20 70 61 67 65 20 66 69  ered a 1 page fi
23d20 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  le..*/.void sqli
23d30 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
23d40 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  t(Pager *pPager,
23d50 20 69 6e 74 20 2a 70 6e 50 61 67 65 29 7b 0a 20   int *pnPage){. 
23d60 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
23d70 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  >eState>=PAGER_R
23d80 45 41 44 45 52 20 29 3b 0a 20 20 61 73 73 65 72  EADER );.  asser
23d90 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
23da0 65 21 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e!=PAGER_WRITER_
23db0 46 49 4e 49 53 48 45 44 20 29 3b 0a 20 20 2a 70  FINISHED );.  *p
23dc0 6e 50 61 67 65 20 3d 20 28 69 6e 74 29 70 50 61  nPage = (int)pPa
23dd0 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 7d 0a 0a  ger->dbSize;.}..
23de0 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6f 62  ./*.** Try to ob
23df0 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 66 20 74  tain a lock of t
23e00 79 70 65 20 6c 6f 63 6b 74 79 70 65 20 6f 6e 20  ype locktype on 
23e10 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
23e20 65 2e 20 49 66 0a 2a 2a 20 61 20 73 69 6d 69 6c  e. If.** a simil
23e30 61 72 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  ar or greater lo
23e40 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68 65  ck is already he
23e50 6c 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ld, this functio
23e60 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 0a 2a 2a 20  n is a no-op.** 
23e70 28 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54  (returning SQLIT
23e80 45 5f 4f 4b 20 69 6d 6d 65 64 69 61 74 65 6c 79  E_OK immediately
23e90 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  )..**.** Otherwi
23ea0 73 65 2c 20 61 74 74 65 6d 70 74 20 74 6f 20 6f  se, attempt to o
23eb0 62 74 61 69 6e 20 74 68 65 20 6c 6f 63 6b 20 75  btain the lock u
23ec0 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 4c 6f  sing sqlite3OsLo
23ed0 63 6b 28 29 2e 20 49 6e 76 6f 6b 65 20 0a 2a 2a  ck(). Invoke .**
23ee0 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61   the busy callba
23ef0 63 6b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 69  ck if the lock i
23f00 73 20 63 75 72 72 65 6e 74 6c 79 20 6e 6f 74 20  s currently not 
23f10 61 76 61 69 6c 61 62 6c 65 2e 20 52 65 70 65 61  available. Repea
23f20 74 20 0a 2a 2a 20 75 6e 74 69 6c 20 74 68 65 20  t .** until the 
23f30 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 72 65  busy callback re
23f40 74 75 72 6e 73 20 66 61 6c 73 65 20 6f 72 20 75  turns false or u
23f50 6e 74 69 6c 20 74 68 65 20 61 74 74 65 6d 70 74  ntil the attempt
23f60 20 74 6f 20 0a 2a 2a 20 6f 62 74 61 69 6e 20 74   to .** obtain t
23f70 68 65 20 6c 6f 63 6b 20 73 75 63 63 65 65 64 73  he lock succeeds
23f80 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
23f90 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
23fa0 65 73 73 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  ess and an error
23fb0 20 63 6f 64 65 20 69 66 20 77 65 20 63 61 6e 6e   code if we cann
23fc0 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a 20 74 68 65  ot obtain.** the
23fd0 20 6c 6f 63 6b 2e 20 49 66 20 74 68 65 20 6c 6f   lock. If the lo
23fe0 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20 73  ck is obtained s
23ff0 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 73 65 74  uccessfully, set
24000 20 74 68 65 20 50 61 67 65 72 2e 73 74 61 74 65   the Pager.state
24010 20 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 74 6f   .** variable to
24020 20 6c 6f 63 6b 74 79 70 65 20 62 65 66 6f 72 65   locktype before
24030 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73   returning..*/.s
24040 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
24050 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 50 61 67  wait_on_lock(Pag
24060 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
24070 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74  locktype){.  int
24080 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
24090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
240a0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
240b0 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20   */..  /* Check 
240c0 74 68 61 74 20 74 68 69 73 20 69 73 20 65 69 74  that this is eit
240d0 68 65 72 20 61 20 6e 6f 2d 6f 70 20 28 62 65 63  her a no-op (bec
240e0 61 75 73 65 20 74 68 65 20 72 65 71 75 65 73 74  ause the request
240f0 65 64 20 6c 6f 63 6b 20 69 73 20 0a 20 20 2a 2a  ed lock is .  **
24100 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 6f   already held, o
24110 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 72 61  r one of the tra
24120 6e 73 69 73 74 69 6f 6e 73 20 74 68 61 74 20 74  nsistions that t
24130 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 0a  he busy-handler.
24140 20 20 2a 2a 20 6d 61 79 20 62 65 20 69 6e 76 6f    ** may be invo
24150 6b 65 64 20 64 75 72 69 6e 67 2c 20 61 63 63 6f  ked during, acco
24160 72 64 69 6e 67 20 74 6f 20 74 68 65 20 63 6f 6d  rding to the com
24170 6d 65 6e 74 20 61 62 6f 76 65 0a 20 20 2a 2a 20  ment above.  ** 
24180 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42  sqlite3PagerSetB
24190 75 73 79 68 61 6e 64 6c 65 72 28 29 2e 0a 20 20  usyhandler()..  
241a0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70 50  */.  assert( (pP
241b0 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 6c 6f 63  ager->eLock>=loc
241c0 6b 74 79 70 65 29 0a 20 20 20 20 20 20 20 7c 7c  ktype).       ||
241d0 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d   (pPager->eLock=
241e0 3d 4e 4f 5f 4c 4f 43 4b 20 26 26 20 6c 6f 63 6b  =NO_LOCK && lock
241f0 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
24200 4b 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 50  K).       || (pP
24210 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 53  ager->eLock==RES
24220 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 6c 6f  ERVED_LOCK && lo
24230 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56  cktype==EXCLUSIV
24240 45 5f 4c 4f 43 4b 29 0a 20 20 29 3b 0a 0a 20 20  E_LOCK).  );..  
24250 64 6f 20 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  do {.    rc = pa
24260 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72  gerLockDb(pPager
24270 2c 20 6c 6f 63 6b 74 79 70 65 29 3b 0a 20 20 7d  , locktype);.  }
24280 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
24290 45 5f 42 55 53 59 20 26 26 20 70 50 61 67 65 72  E_BUSY && pPager
242a0 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 28 70  ->xBusyHandler(p
242b0 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
242c0 6c 65 72 41 72 67 29 20 29 3b 0a 20 20 72 65 74  lerArg) );.  ret
242d0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
242e0 20 46 75 6e 63 74 69 6f 6e 20 61 73 73 65 72 74   Function assert
242f0 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69  TruncateConstrai
24300 6e 74 28 70 50 61 67 65 72 29 20 63 68 65 63 6b  nt(pPager) check
24310 73 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 74 68  s that one of th
24320 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20  e .** following 
24330 69 73 20 74 72 75 65 20 66 6f 72 20 61 6c 6c 20  is true for all 
24340 64 69 72 74 79 20 70 61 67 65 73 20 63 75 72 72  dirty pages curr
24350 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 70 61 67  ently in the pag
24360 65 2d 63 61 63 68 65 3a 0a 2a 2a 0a 2a 2a 20 20  e-cache:.**.**  
24370 20 61 29 20 54 68 65 20 70 61 67 65 20 6e 75 6d   a) The page num
24380 62 65 72 20 69 73 20 6c 65 73 73 20 74 68 61 6e  ber is less than
24390 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65   or equal to the
243a0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 0a 2a 2a   size of the .**
243b0 20 20 20 20 20 20 63 75 72 72 65 6e 74 20 64 61        current da
243c0 74 61 62 61 73 65 20 69 6d 61 67 65 2c 20 69 6e  tabase image, in
243d0 20 70 61 67 65 73 2c 20 4f 52 0a 2a 2a 0a 2a 2a   pages, OR.**.**
243e0 20 20 20 62 29 20 69 66 20 74 68 65 20 70 61 67     b) if the pag
243f0 65 20 63 6f 6e 74 65 6e 74 20 77 65 72 65 20 77  e content were w
24400 72 69 74 74 65 6e 20 61 74 20 74 68 69 73 20 74  ritten at this t
24410 69 6d 65 2c 20 69 74 20 77 6f 75 6c 64 20 6e 6f  ime, it would no
24420 74 0a 2a 2a 20 20 20 20 20 20 62 65 20 6e 65 63  t.**      be nec
24430 65 73 73 61 72 79 20 74 6f 20 77 72 69 74 65 20  essary to write 
24440 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74  the current cont
24450 65 6e 74 20 6f 75 74 20 74 6f 20 74 68 65 20 73  ent out to the s
24460 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20  ub-journal.**   
24470 20 20 20 28 61 73 20 64 65 74 65 72 6d 69 6e 65     (as determine
24480 64 20 62 79 20 66 75 6e 63 74 69 6f 6e 20 73 75  d by function su
24490 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 29  bjRequiresPage()
244a0 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  )..**.** If the 
244b0 63 6f 6e 64 69 74 69 6f 6e 20 61 73 73 65 72 74  condition assert
244c0 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
244d0 69 6f 6e 20 77 65 72 65 20 6e 6f 74 20 74 72 75  ion were not tru
244e0 65 2c 20 61 6e 64 20 74 68 65 0a 2a 2a 20 64 69  e, and the.** di
244f0 72 74 79 20 70 61 67 65 20 77 65 72 65 20 74 6f  rty page were to
24500 20 62 65 20 64 69 73 63 61 72 64 65 64 20 66 72   be discarded fr
24510 6f 6d 20 74 68 65 20 63 61 63 68 65 20 76 69 61  om the cache via
24520 20 74 68 65 20 70 61 67 65 72 53 74 72 65 73 73   the pagerStress
24530 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 2c 20 70  ().** routine, p
24540 61 67 65 72 53 74 72 65 73 73 28 29 20 77 6f 75  agerStress() wou
24550 6c 64 20 6e 6f 74 20 77 72 69 74 65 20 74 68 65  ld not write the
24560 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 63 6f   current page co
24570 6e 74 65 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20  ntent to.** the 
24580 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
24590 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20 74 72  f a savepoint tr
245a0 61 6e 73 61 63 74 69 6f 6e 20 77 65 72 65 20 72  ansaction were r
245b0 6f 6c 6c 65 64 20 62 61 63 6b 20 61 66 74 65 72  olled back after
245c0 0a 2a 2a 20 74 68 69 73 20 68 61 70 70 65 6e 65  .** this happene
245d0 64 2c 20 74 68 65 20 63 6f 72 72 65 63 74 20 62  d, the correct b
245e0 65 68 61 76 69 6f 75 72 20 77 6f 75 6c 64 20 62  ehaviour would b
245f0 65 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65  e to restore the
24600 20 63 75 72 72 65 6e 74 0a 2a 2a 20 63 6f 6e 74   current.** cont
24610 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e  ent of the page.
24620 20 48 6f 77 65 76 65 72 2c 20 73 69 6e 63 65 20   However, since 
24630 74 68 69 73 20 63 6f 6e 74 65 6e 74 20 69 73 20  this content is 
24640 6e 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20 65  not present in e
24650 69 74 68 65 72 0a 2a 2a 20 74 68 65 20 64 61 74  ither.** the dat
24660 61 62 61 73 65 20 66 69 6c 65 20 6f 72 20 74 68  abase file or th
24670 65 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65  e portion of the
24680 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
24690 6c 20 61 6e 64 20 0a 2a 2a 20 73 75 62 2d 6a 6f  l and .** sub-jo
246a0 75 72 6e 61 6c 20 72 6f 6c 6c 65 64 20 62 61 63  urnal rolled bac
246b0 6b 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 63 6f  k the content co
246c0 75 6c 64 20 6e 6f 74 20 62 65 20 72 65 73 74 6f  uld not be resto
246d0 72 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 64  red and the.** d
246e0 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 77 6f  atabase image wo
246f0 75 6c 64 20 62 65 63 6f 6d 65 20 63 6f 72 72 75  uld become corru
24700 70 74 2e 20 49 74 20 69 73 20 74 68 65 72 65 66  pt. It is theref
24710 6f 72 65 20 66 6f 72 74 75 6e 61 74 65 20 74 68  ore fortunate th
24720 61 74 20 0a 2a 2a 20 74 68 69 73 20 63 69 72 63  at .** this circ
24730 75 6d 73 74 61 6e 63 65 20 63 61 6e 6e 6f 74 20  umstance cannot 
24740 61 72 69 73 65 2e 0a 2a 2f 0a 23 69 66 20 64 65  arise..*/.#if de
24750 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
24760 55 47 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20  UG).static void 
24770 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f  assertTruncateCo
24780 6e 73 74 72 61 69 6e 74 43 62 28 50 67 48 64 72  nstraintCb(PgHdr
24790 20 2a 70 50 67 29 7b 0a 20 20 61 73 73 65 72 74   *pPg){.  assert
247a0 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48  ( pPg->flags&PGH
247b0 44 52 5f 44 49 52 54 59 20 29 3b 0a 20 20 61 73  DR_DIRTY );.  as
247c0 73 65 72 74 28 20 21 73 75 62 6a 52 65 71 75 69  sert( !subjRequi
247d0 72 65 73 50 61 67 65 28 70 50 67 29 20 7c 7c 20  resPage(pPg) || 
247e0 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 67 2d 3e  pPg->pgno<=pPg->
247f0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29  pPager->dbSize )
24800 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
24810 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f  assertTruncateCo
24820 6e 73 74 72 61 69 6e 74 28 50 61 67 65 72 20 2a  nstraint(Pager *
24830 70 50 61 67 65 72 29 7b 0a 20 20 73 71 6c 69 74  pPager){.  sqlit
24840 65 33 50 63 61 63 68 65 49 74 65 72 61 74 65 44  e3PcacheIterateD
24850 69 72 74 79 28 70 50 61 67 65 72 2d 3e 70 50 43  irty(pPager->pPC
24860 61 63 68 65 2c 20 61 73 73 65 72 74 54 72 75 6e  ache, assertTrun
24870 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 62  cateConstraintCb
24880 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  );.}.#else.# def
24890 69 6e 65 20 61 73 73 65 72 74 54 72 75 6e 63 61  ine assertTrunca
248a0 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61  teConstraint(pPa
248b0 67 65 72 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ger).#endif../*.
248c0 2a 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65 20  ** Truncate the 
248d0 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
248e0 73 65 20 66 69 6c 65 20 69 6d 61 67 65 20 74 6f  se file image to
248f0 20 6e 50 61 67 65 20 70 61 67 65 73 2e 20 54 68   nPage pages. Th
24900 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  is .** function 
24910 64 6f 65 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c  does not actuall
24920 79 20 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74  y modify the dat
24930 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69  abase file on di
24940 73 6b 2e 20 49 74 20 0a 2a 2a 20 6a 75 73 74 20  sk. It .** just 
24950 73 65 74 73 20 74 68 65 20 69 6e 74 65 72 6e 61  sets the interna
24960 6c 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 70  l state of the p
24970 61 67 65 72 20 6f 62 6a 65 63 74 20 73 6f 20 74  ager object so t
24980 68 61 74 20 74 68 65 20 0a 2a 2a 20 74 72 75 6e  hat the .** trun
24990 63 61 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 64  cation will be d
249a0 6f 6e 65 20 77 68 65 6e 20 74 68 65 20 63 75 72  one when the cur
249b0 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
249c0 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a   is committed..*
249d0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
249e0 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65  gerTruncateImage
249f0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
24a00 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 61  Pgno nPage){.  a
24a10 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
24a20 62 53 69 7a 65 3e 3d 6e 50 61 67 65 20 29 3b 0a  bSize>=nPage );.
24a30 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
24a40 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
24a50 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20  WRITER_CACHEMOD 
24a60 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53  );.  pPager->dbS
24a70 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 61  ize = nPage;.  a
24a80 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e  ssertTruncateCon
24a90 73 74 72 61 69 6e 74 28 70 50 61 67 65 72 29 3b  straint(pPager);
24aa0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
24ab0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
24ac0 65 64 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70  ed before attemp
24ad0 74 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  ting a hot-journ
24ae0 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 74 0a  al rollback. It.
24af0 2a 2a 20 73 79 6e 63 73 20 74 68 65 20 6a 6f 75  ** syncs the jou
24b00 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 64 69 73  rnal file to dis
24b10 6b 2c 20 74 68 65 6e 20 73 65 74 73 20 70 50 61  k, then sets pPa
24b20 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
24b30 74 6f 20 74 68 65 0a 2a 2a 20 73 69 7a 65 20 6f  to the.** size o
24b40 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
24b50 6c 65 20 73 6f 20 74 68 61 74 20 74 68 65 20 70  le so that the p
24b60 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20  ager_playback() 
24b70 72 6f 75 74 69 6e 65 20 6b 6e 6f 77 73 0a 2a 2a  routine knows.**
24b80 20 74 68 61 74 20 74 68 65 20 65 6e 74 69 72 65   that the entire
24b90 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
24ba0 73 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 2a  s been synced..*
24bb0 2a 0a 2a 2a 20 53 79 6e 63 69 6e 67 20 61 20 68  *.** Syncing a h
24bc0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 74 6f 20 64 69  ot-journal to di
24bd0 73 6b 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70  sk before attemp
24be0 74 69 6e 67 20 74 6f 20 72 6f 6c 6c 20 69 74 20  ting to roll it 
24bf0 62 61 63 6b 20 65 6e 73 75 72 65 73 20 0a 2a 2a  back ensures .**
24c00 20 74 68 61 74 20 69 66 20 61 20 70 6f 77 65 72   that if a power
24c10 2d 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20  -failure occurs 
24c20 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62  during the rollb
24c30 61 63 6b 2c 20 74 68 65 20 70 72 6f 63 65 73 73  ack, the process
24c40 20 74 68 61 74 0a 2a 2a 20 61 74 74 65 6d 70 74   that.** attempt
24c50 73 20 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f  s rollback follo
24c60 77 69 6e 67 20 73 79 73 74 65 6d 20 72 65 63 6f  wing system reco
24c70 76 65 72 79 20 73 65 65 73 20 74 68 65 20 73 61  very sees the sa
24c80 6d 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63 6f  me journal.** co
24c90 6e 74 65 6e 74 20 61 73 20 74 68 69 73 20 70 72  ntent as this pr
24ca0 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ocess..**.** If 
24cb0 65 76 65 72 79 74 68 69 6e 67 20 67 6f 65 73 20  everything goes 
24cc0 61 73 20 70 6c 61 6e 6e 65 64 2c 20 53 51 4c 49  as planned, SQLI
24cd0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
24ce0 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 0a 2a  d. Otherwise, .*
24cf0 2a 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  * an SQLite erro
24d00 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  r code..*/.stati
24d10 63 20 69 6e 74 20 70 61 67 65 72 53 79 6e 63 48  c int pagerSyncH
24d20 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  otJournal(Pager 
24d30 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
24d40 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
24d50 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e    if( !pPager->n
24d60 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 72 63 20  oSync ){.    rc 
24d70 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
24d80 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c  pPager->jfd, SQL
24d90 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29  ITE_SYNC_NORMAL)
24da0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
24db0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
24dc0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
24dd0 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
24de0 6a 66 64 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f  jfd, &pPager->jo
24df0 75 72 6e 61 6c 48 64 72 29 3b 0a 20 20 7d 0a 20  urnalHdr);.  }. 
24e00 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
24e10 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68  *.** Shutdown th
24e20 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 20 46  e page cache.  F
24e30 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61  ree all memory a
24e40 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c  nd close all fil
24e50 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74  es..**.** If a t
24e60 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 69  ransaction was i
24e70 6e 20 70 72 6f 67 72 65 73 73 20 77 68 65 6e 20  n progress when 
24e80 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
24e90 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a 20  called, that.** 
24ea0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
24eb0 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c 6c  olled back.  All
24ec0 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67   outstanding pag
24ed0 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74  es are invalidat
24ee0 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72 20  ed.** and their 
24ef0 6d 65 6d 6f 72 79 20 69 73 20 66 72 65 65 64 2e  memory is freed.
24f00 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f    Any attempt to
24f10 20 75 73 65 20 61 20 70 61 67 65 20 61 73 73 6f   use a page asso
24f20 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74  ciated.** with t
24f30 68 69 73 20 70 61 67 65 20 63 61 63 68 65 20 61  his page cache a
24f40 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69  fter this functi
24f50 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 6c 6c 20  on returns will 
24f60 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74  likely.** result
24f70 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a   in a coredump..
24f80 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
24f90 69 6f 6e 20 61 6c 77 61 79 73 20 73 75 63 63 65  ion always succe
24fa0 65 64 73 2e 20 49 66 20 61 20 74 72 61 6e 73 61  eds. If a transa
24fb0 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20  ction is active 
24fc0 61 6e 20 61 74 74 65 6d 70 74 0a 2a 2a 20 69 73  an attempt.** is
24fd0 20 6d 61 64 65 20 74 6f 20 72 6f 6c 6c 20 69 74   made to roll it
24fe0 20 62 61 63 6b 2e 20 49 66 20 61 6e 20 65 72 72   back. If an err
24ff0 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
25000 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a   the rollback .*
25010 2a 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  * a hot journal 
25020 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20 74  may be left in t
25030 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20 62 75  he filesystem bu
25040 74 20 6e 6f 20 65 72 72 6f 72 20 69 73 20 72 65  t no error is re
25050 74 75 72 6e 65 64 0a 2a 2a 20 74 6f 20 74 68 65  turned.** to the
25060 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20   caller..*/.int 
25070 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73  sqlite3PagerClos
25080 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
25090 7b 0a 20 20 75 38 20 2a 70 54 6d 70 20 3d 20 28  {.  u8 *pTmp = (
250a0 75 38 20 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d  u8 *)pPager->pTm
250b0 70 53 70 61 63 65 3b 0a 0a 20 20 61 73 73 65 72  pSpace;..  asser
250c0 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
250d0 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
250e0 0a 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c  .  disable_simul
250f0 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
25100 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e  ;.  sqlite3Begin
25110 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
25120 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72 72    /* pPager->err
25130 43 6f 64 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70  Code = 0; */.  p
25140 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
25150 4d 6f 64 65 20 3d 20 30 3b 0a 23 69 66 6e 64 65  Mode = 0;.#ifnde
25160 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
25170 4c 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 43 6c  L.  sqlite3WalCl
25180 6f 73 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ose(pPager->pWal
25190 2c 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79  , pPager->ckptSy
251a0 6e 63 46 6c 61 67 73 2c 20 70 50 61 67 65 72 2d  ncFlags, pPager-
251b0 3e 70 61 67 65 53 69 7a 65 2c 20 70 54 6d 70 29  >pageSize, pTmp)
251c0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 57 61 6c  ;.  pPager->pWal
251d0 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 70   = 0;.#endif.  p
251e0 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
251f0 72 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20  r);.  if( MEMDB 
25200 29 7b 0a 20 20 20 20 70 61 67 65 72 5f 75 6e 6c  ){.    pager_unl
25210 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ock(pPager);.  }
25220 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20  else{.    /* If 
25230 69 74 20 69 73 20 6f 70 65 6e 2c 20 73 79 6e 63  it is open, sync
25240 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
25250 65 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67  e before calling
25260 20 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61   UnlockAndRollba
25270 63 6b 2e 0a 20 20 20 20 2a 2a 20 49 66 20 74 68  ck..    ** If th
25280 69 73 20 69 73 20 6e 6f 74 20 64 6f 6e 65 2c 20  is is not done, 
25290 74 68 65 6e 20 61 6e 20 75 6e 73 79 6e 63 65 64  then an unsynced
252a0 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20   portion of the 
252b0 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 0a 20 20  open journal .  
252c0 20 20 2a 2a 20 66 69 6c 65 20 6d 61 79 20 62 65    ** file may be
252d0 20 70 6c 61 79 65 64 20 62 61 63 6b 20 69 6e 74   played back int
252e0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  o the database. 
252f0 49 66 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  If a power failu
25300 72 65 20 6f 63 63 75 72 73 20 0a 20 20 20 20 2a  re occurs .    *
25310 2a 20 77 68 69 6c 65 20 74 68 69 73 20 69 73 20  * while this is 
25320 68 61 70 70 65 6e 69 6e 67 2c 20 74 68 65 20 64  happening, the d
25330 61 74 61 62 61 73 65 20 63 6f 75 6c 64 20 62 65  atabase could be
25340 63 6f 6d 65 20 63 6f 72 72 75 70 74 2e 0a 20 20  come corrupt..  
25350 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 61    **.    ** If a
25360 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  n error occurs w
25370 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 73  hile trying to s
25380 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c  ync the journal,
25390 20 73 68 69 66 74 20 74 68 65 20 70 61 67 65 72   shift the pager
253a0 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65  .    ** into the
253b0 20 45 52 52 4f 52 20 73 74 61 74 65 2e 20 54 68   ERROR state. Th
253c0 69 73 20 63 61 75 73 65 73 20 55 6e 6c 6f 63 6b  is causes Unlock
253d0 41 6e 64 52 6f 6c 6c 62 61 63 6b 20 74 6f 20 75  AndRollback to u
253e0 6e 6c 6f 63 6b 20 74 68 65 0a 20 20 20 20 2a 2a  nlock the.    **
253f0 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 63 6c   database and cl
25400 6f 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ose the journal 
25410 66 69 6c 65 20 77 69 74 68 6f 75 74 20 61 74 74  file without att
25420 65 6d 70 74 69 6e 67 20 74 6f 20 72 6f 6c 6c 20  empting to roll 
25430 69 74 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20 6f  it.    ** back o
25440 72 20 66 69 6e 61 6c 69 7a 65 20 69 74 2e 20 54  r finalize it. T
25450 68 65 20 6e 65 78 74 20 64 61 74 61 62 61 73 65  he next database
25460 20 75 73 65 72 20 77 69 6c 6c 20 68 61 76 65 20   user will have 
25470 74 6f 20 64 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61  to do hot-journa
25480 6c 0a 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63  l.    ** rollbac
25490 6b 20 62 65 66 6f 72 65 20 61 63 63 65 73 73 69  k before accessi
254a0 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ng the database 
254b0 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  file..    */.   
254c0 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
254d0 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20  er->jfd) ){.    
254e0 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50    pager_error(pP
254f0 61 67 65 72 2c 20 70 61 67 65 72 53 79 6e 63 48  ager, pagerSyncH
25500 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  otJournal(pPager
25510 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61  ));.    }.    pa
25520 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c  gerUnlockAndRoll
25530 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
25540 7d 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65  }.  sqlite3EndBe
25550 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
25560 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  enable_simulated
25570 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20  _io_errors();.  
25580 50 41 47 45 52 54 52 41 43 45 28 28 22 43 4c 4f  PAGERTRACE(("CLO
25590 53 45 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  SE %d\n", PAGERI
255a0 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 49  D(pPager)));.  I
255b0 4f 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25  OTRACE(("CLOSE %
255c0 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20  p\n", pPager)). 
255d0 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
255e0 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
255f0 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
25600 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 73 71  Pager->fd);.  sq
25610 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70 54  lite3PageFree(pT
25620 6d 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63  mp);.  sqlite3Pc
25630 61 63 68 65 43 6c 6f 73 65 28 70 50 61 67 65 72  acheClose(pPager
25640 2d 3e 70 50 43 61 63 68 65 29 3b 0a 0a 23 69 66  ->pPCache);..#if
25650 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
25660 4f 44 45 43 0a 20 20 69 66 28 20 70 50 61 67 65  ODEC.  if( pPage
25670 72 2d 3e 78 43 6f 64 65 63 46 72 65 65 20 29 20  r->xCodecFree ) 
25680 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 46 72  pPager->xCodecFr
25690 65 65 28 70 50 61 67 65 72 2d 3e 70 43 6f 64 65  ee(pPager->pCode
256a0 63 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73  c);.#endif..  as
256b0 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 61  sert( !pPager->a
256c0 53 61 76 65 70 6f 69 6e 74 20 26 26 20 21 70 50  Savepoint && !pP
256d0 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
256e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 69   );.  assert( !i
256f0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
25700 64 29 20 26 26 20 21 69 73 4f 70 65 6e 28 70 50  d) && !isOpen(pP
25710 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 3b 0a 0a  ager->sjfd) );..
25720 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
25730 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  Pager);.  return
25740 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
25750 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42  if !defined(NDEB
25760 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  UG) || defined(S
25770 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a  QLITE_TEST)./*.*
25780 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67  * Return the pag
25790 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 70 61 67  e number for pag
257a0 65 20 70 50 67 2e 0a 2a 2f 0a 50 67 6e 6f 20 73  e pPg..*/.Pgno s
257b0 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e  qlite3PagerPagen
257c0 75 6d 62 65 72 28 44 62 50 61 67 65 20 2a 70 50  umber(DbPage *pP
257d0 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 67  g){.  return pPg
257e0 2d 3e 70 67 6e 6f 3b 0a 7d 0a 23 65 6e 64 69 66  ->pgno;.}.#endif
257f0 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e  ../*.** Incremen
25800 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  t the reference 
25810 63 6f 75 6e 74 20 66 6f 72 20 70 61 67 65 20 70  count for page p
25820 50 67 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  Pg..*/.void sqli
25830 74 65 33 50 61 67 65 72 52 65 66 28 44 62 50 61  te3PagerRef(DbPa
25840 67 65 20 2a 70 50 67 29 7b 0a 20 20 73 71 6c 69  ge *pPg){.  sqli
25850 74 65 33 50 63 61 63 68 65 52 65 66 28 70 50 67  te3PcacheRef(pPg
25860 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63  );.}../*.** Sync
25870 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 49 6e   the journal. In
25880 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6d 61   other words, ma
25890 6b 65 20 73 75 72 65 20 61 6c 6c 20 74 68 65 20  ke sure all the 
258a0 70 61 67 65 73 20 74 68 61 74 20 68 61 76 65 0a  pages that have.
258b0 2a 2a 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  ** been written 
258c0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  to the journal h
258d0 61 76 65 20 61 63 74 75 61 6c 6c 79 20 72 65 61  ave actually rea
258e0 63 68 65 64 20 74 68 65 20 73 75 72 66 61 63 65  ched the surface
258f0 20 6f 66 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20   of the.** disk 
25900 61 6e 64 20 63 61 6e 20 62 65 20 72 65 73 74 6f  and can be resto
25910 72 65 64 20 69 6e 20 74 68 65 20 65 76 65 6e 74  red in the event
25920 20 6f 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   of a hot-journa
25930 6c 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a  l rollback..**.*
25940 2a 20 49 66 20 74 68 65 20 50 61 67 65 72 2e 6e  * If the Pager.n
25950 6f 53 79 6e 63 20 66 6c 61 67 20 69 73 20 73 65  oSync flag is se
25960 74 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e  t, then this fun
25970 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
25980 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
25990 74 68 65 20 61 63 74 69 6f 6e 73 20 72 65 71 75  the actions requ
259a0 69 72 65 64 20 64 65 70 65 6e 64 20 6f 6e 20 74  ired depend on t
259b0 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20  he journal-mode 
259c0 61 6e 64 20 74 68 65 20 0a 2a 2a 20 64 65 76 69  and the .** devi
259d0 63 65 20 63 68 61 72 61 63 74 65 72 69 73 74 69  ce characteristi
259e0 63 73 20 6f 66 20 74 68 65 20 74 68 65 20 66 69  cs of the the fi
259f0 6c 65 2d 73 79 73 74 65 6d 2c 20 61 73 20 66 6f  le-system, as fo
25a00 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  llows:.**.**   *
25a10 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
25a20 66 69 6c 65 20 69 73 20 61 6e 20 69 6e 2d 6d 65  file is an in-me
25a30 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  mory journal fil
25a40 65 2c 20 6e 6f 20 61 63 74 69 6f 6e 20 6e 65 65  e, no action nee
25a50 64 0a 2a 2a 20 20 20 20 20 62 65 20 74 61 6b 65  d.**     be take
25a60 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 4f 74 68  n..**.**   * Oth
25a70 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 64  erwise, if the d
25a80 65 76 69 63 65 20 64 6f 65 73 20 6e 6f 74 20 73  evice does not s
25a90 75 70 70 6f 72 74 20 74 68 65 20 53 41 46 45 5f  upport the SAFE_
25aa0 41 50 50 45 4e 44 20 70 72 6f 70 65 72 74 79 2c  APPEND property,
25ab0 0a 2a 2a 20 20 20 20 20 74 68 65 6e 20 74 68 65  .**     then the
25ac0 20 6e 52 65 63 20 66 69 65 6c 64 20 6f 66 20 74   nRec field of t
25ad0 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
25ae0 20 77 72 69 74 74 65 6e 20 6a 6f 75 72 6e 61 6c   written journal
25af0 20 68 65 61 64 65 72 0a 2a 2a 20 20 20 20 20 69   header.**     i
25b00 73 20 75 70 64 61 74 65 64 20 74 6f 20 63 6f 6e  s updated to con
25b10 74 61 69 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  tain the number 
25b20 6f 66 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72  of journal recor
25b30 64 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20  ds that have.** 
25b40 20 20 20 20 62 65 65 6e 20 77 72 69 74 74 65 6e      been written
25b50 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 74 2e 20 49   following it. I
25b60 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6f  f the pager is o
25b70 70 65 72 61 74 69 6e 67 20 69 6e 20 66 75 6c 6c  perating in full
25b80 2d 73 79 6e 63 0a 2a 2a 20 20 20 20 20 6d 6f 64  -sync.**     mod
25b90 65 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72  e, then the jour
25ba0 6e 61 6c 20 66 69 6c 65 20 69 73 20 73 79 6e 63  nal file is sync
25bb0 65 64 20 62 65 66 6f 72 65 20 74 68 69 73 20 66  ed before this f
25bc0 69 65 6c 64 20 69 73 20 75 70 64 61 74 65 64 2e  ield is updated.
25bd0 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68  .**.**   * If th
25be0 65 20 64 65 76 69 63 65 20 64 6f 65 73 20 6e 6f  e device does no
25bf0 74 20 73 75 70 70 6f 72 74 20 74 68 65 20 53 45  t support the SE
25c00 51 55 45 4e 54 49 41 4c 20 70 72 6f 70 65 72 74  QUENTIAL propert
25c10 79 2c 20 74 68 65 6e 20 0a 2a 2a 20 20 20 20 20  y, then .**     
25c20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
25c30 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 72  synced..**.** Or
25c40 2c 20 69 6e 20 70 73 65 75 64 6f 2d 63 6f 64 65  , in pseudo-code
25c50 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 4e 4f  :.**.**   if( NO
25c60 54 20 3c 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75  T <in-memory jou
25c70 72 6e 61 6c 3e 20 29 7b 0a 2a 2a 20 20 20 20 20  rnal> ){.**     
25c80 69 66 28 20 4e 4f 54 20 53 41 46 45 5f 41 50 50  if( NOT SAFE_APP
25c90 45 4e 44 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20  END ){.**       
25ca0 69 66 28 20 3c 66 75 6c 6c 2d 73 79 6e 63 20 6d  if( <full-sync m
25cb0 6f 64 65 3e 20 29 20 78 53 79 6e 63 28 3c 6a 6f  ode> ) xSync(<jo
25cc0 75 72 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a  urnal file>);.**
25cd0 20 20 20 20 20 20 20 3c 75 70 64 61 74 65 20 6e         <update n
25ce0 52 65 63 20 66 69 65 6c 64 3e 0a 2a 2a 20 20 20  Rec field>.**   
25cf0 20 20 7d 20 0a 2a 2a 20 20 20 20 20 69 66 28 20    } .**     if( 
25d00 4e 4f 54 20 53 45 51 55 45 4e 54 49 41 4c 20 29  NOT SEQUENTIAL )
25d10 20 78 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20   xSync(<journal 
25d20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20 7d 0a 2a  file>);.**   }.*
25d30 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
25d40 75 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ul, this routine
25d50 20 63 6c 65 61 72 73 20 74 68 65 20 50 47 48 44   clears the PGHD
25d60 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67  R_NEED_SYNC flag
25d70 20 6f 66 20 65 76 65 72 79 20 0a 2a 2a 20 70 61   of every .** pa
25d80 67 65 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c  ge currently hel
25d90 64 20 69 6e 20 6d 65 6d 6f 72 79 20 62 65 66 6f  d in memory befo
25da0 72 65 20 72 65 74 75 72 6e 69 6e 67 20 53 51 4c  re returning SQL
25db0 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 49 4f  ITE_OK. If an IO
25dc0 0a 2a 2a 20 65 72 72 6f 72 20 69 73 20 65 6e 63  .** error is enc
25dd0 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 6e 20 74  ountered, then t
25de0 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  he IO error code
25df0 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20   is returned to 
25e00 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73  the caller..*/.s
25e10 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f  tatic int syncJo
25e20 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
25e30 67 65 72 2c 20 69 6e 74 20 6e 65 77 48 64 72 29  ger, int newHdr)
25e40 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
25e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25e60 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
25e70 64 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  de */..  assert(
25e80 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
25e90 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41  =PAGER_WRITER_CA
25ea0 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c  CHEMOD.       ||
25eb0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
25ec0 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42  =PAGER_WRITER_DB
25ed0 4d 4f 44 0a 20 20 29 3b 0a 20 20 61 73 73 65 72  MOD.  );.  asser
25ee0 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
25ef0 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
25f00 0a 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65  .  assert( !page
25f10 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
25f20 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  );..  rc = sqlit
25f30 65 33 50 61 67 65 72 45 78 63 6c 75 73 69 76 65  e3PagerExclusive
25f40 4c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  Lock(pPager);.  
25f50 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
25f60 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
25f70 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e    if( !pPager->n
25f80 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 61 73 73  oSync ){.    ass
25f90 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65  ert( !pPager->te
25fa0 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 69 66  mpFile );.    if
25fb0 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
25fc0 3e 6a 66 64 29 20 26 26 20 70 50 61 67 65 72 2d  >jfd) && pPager-
25fd0 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41  >journalMode!=PA
25fe0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
25ff0 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20 20  MEMORY ){.      
26000 63 6f 6e 73 74 20 69 6e 74 20 69 44 63 20 3d 20  const int iDc = 
26010 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
26020 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
26030 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20  Pager->fd);.    
26040 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
26050 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
26060 0a 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28  ..      if( 0==(
26070 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  iDc&SQLITE_IOCAP
26080 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20 29 7b  _SAFE_APPEND) ){
26090 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73  .        /* This
260a0 20 62 6c 6f 63 6b 20 64 65 61 6c 73 20 77 69 74   block deals wit
260b0 68 20 61 6e 20 6f 62 73 63 75 72 65 20 70 72 6f  h an obscure pro
260c0 62 6c 65 6d 2e 20 49 66 20 74 68 65 20 6c 61 73  blem. If the las
260d0 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20 20  t connection.   
260e0 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 72 6f       ** that wro
260f0 74 65 20 74 6f 20 74 68 69 73 20 64 61 74 61 62  te to this datab
26100 61 73 65 20 77 61 73 20 6f 70 65 72 61 74 69 6e  ase was operatin
26110 67 20 69 6e 20 70 65 72 73 69 73 74 65 6e 74 2d  g in persistent-
26120 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20  journal.        
26130 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68  ** mode, then th
26140 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  e journal file m
26150 61 79 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  ay at this point
26160 20 61 63 74 75 61 6c 6c 79 20 62 65 20 6c 61 72   actually be lar
26170 67 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ger.        ** t
26180 68 61 6e 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61  han Pager.journa
26190 6c 4f 66 66 20 62 79 74 65 73 2e 20 49 66 20 74  lOff bytes. If t
261a0 68 65 20 6e 65 78 74 20 74 68 69 6e 67 20 69 6e  he next thing in
261b0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20   the journal.   
261c0 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 68 61 70       ** file hap
261d0 70 65 6e 73 20 74 6f 20 62 65 20 61 20 6a 6f 75  pens to be a jou
261e0 72 6e 61 6c 2d 68 65 61 64 65 72 20 28 77 72 69  rnal-header (wri
261f0 74 74 65 6e 20 61 73 20 70 61 72 74 20 6f 66 20  tten as part of 
26200 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  the.        ** p
26210 72 65 76 69 6f 75 73 20 63 6f 6e 6e 65 63 74 69  revious connecti
26220 6f 6e 27 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  on's transaction
26230 29 2c 20 61 6e 64 20 61 20 63 72 61 73 68 20 6f  ), and a crash o
26240 72 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65 20  r power-failure 
26250 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 63 63 75  .        ** occu
26260 72 73 20 61 66 74 65 72 20 6e 52 65 63 20 69 73  rs after nRec is
26270 20 75 70 64 61 74 65 64 20 62 75 74 20 62 65 66   updated but bef
26280 6f 72 65 20 74 68 69 73 20 63 6f 6e 6e 65 63 74  ore this connect
26290 69 6f 6e 20 77 72 69 74 65 73 20 0a 20 20 20 20  ion writes .    
262a0 20 20 20 20 2a 2a 20 61 6e 79 74 68 69 6e 67 20      ** anything 
262b0 65 6c 73 65 20 74 6f 20 74 68 65 20 6a 6f 75 72  else to the jour
262c0 6e 61 6c 20 66 69 6c 65 20 28 6f 72 20 63 6f 6d  nal file (or com
262d0 6d 69 74 73 2f 72 6f 6c 6c 73 20 62 61 63 6b 20  mits/rolls back 
262e0 69 74 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  its .        ** 
262f0 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 74 68  transaction), th
26300 65 6e 20 53 51 4c 69 74 65 20 6d 61 79 20 62 65  en SQLite may be
26310 63 6f 6d 65 20 63 6f 6e 66 75 73 65 64 20 77 68  come confused wh
26320 65 6e 20 64 6f 69 6e 67 20 74 68 65 20 0a 20 20  en doing the .  
26330 20 20 20 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f 75        ** hot-jou
26340 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 66 6f  rnal rollback fo
26350 6c 6c 6f 77 69 6e 67 20 72 65 63 6f 76 65 72 79  llowing recovery
26360 2e 20 49 74 20 6d 61 79 20 72 6f 6c 6c 20 62 61  . It may roll ba
26370 63 6b 20 61 6c 6c 0a 20 20 20 20 20 20 20 20 2a  ck all.        *
26380 2a 20 6f 66 20 74 68 69 73 20 63 6f 6e 6e 65 63  * of this connec
26390 74 69 6f 6e 73 20 64 61 74 61 2c 20 74 68 65 6e  tions data, then
263a0 20 70 72 6f 63 65 65 64 20 74 6f 20 72 6f 6c 6c   proceed to roll
263b0 69 6e 67 20 62 61 63 6b 20 74 68 65 20 6f 6c 64  ing back the old
263c0 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74  ,.        ** out
263d0 2d 6f 66 2d 64 61 74 65 20 64 61 74 61 20 74 68  -of-date data th
263e0 61 74 20 66 6f 6c 6c 6f 77 73 20 69 74 2e 20 44  at follows it. D
263f0 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
26400 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  on..        **. 
26410 20 20 20 20 20 20 20 2a 2a 20 54 6f 20 77 6f 72         ** To wor
26420 6b 20 61 72 6f 75 6e 64 20 74 68 69 73 2c 20 69  k around this, i
26430 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
26440 6c 65 20 64 6f 65 73 20 61 70 70 65 61 72 20 74  le does appear t
26450 6f 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 20 20  o contain.      
26460 20 20 2a 2a 20 61 20 76 61 6c 69 64 20 68 65 61    ** a valid hea
26470 64 65 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 50 61  der following Pa
26480 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20  ger.journalOff, 
26490 74 68 65 6e 20 77 72 69 74 65 20 61 20 30 78 30  then write a 0x0
264a0 30 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 79 74  0.        ** byt
264b0 65 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  e to the start o
264c0 66 20 69 74 20 74 6f 20 70 72 65 76 65 6e 74 20  f it to prevent 
264d0 69 74 20 66 72 6f 6d 20 62 65 69 6e 67 20 72 65  it from being re
264e0 63 6f 67 6e 69 7a 65 64 2e 0a 20 20 20 20 20 20  cognized..      
264f0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
26500 56 61 72 69 61 62 6c 65 20 69 4e 65 78 74 48 64  Variable iNextHd
26510 72 4f 66 66 73 65 74 20 69 73 20 73 65 74 20 74  rOffset is set t
26520 6f 20 74 68 65 20 6f 66 66 73 65 74 20 61 74 20  o the offset at 
26530 77 68 69 63 68 20 74 68 69 73 0a 20 20 20 20 20  which this.     
26540 20 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 61 74 69     ** problemati
26550 63 20 68 65 61 64 65 72 20 77 69 6c 6c 20 6f 63  c header will oc
26560 63 75 72 2c 20 69 66 20 69 74 20 65 78 69 73 74  cur, if it exist
26570 73 2e 20 61 4d 61 67 69 63 20 69 73 20 75 73 65  s. aMagic is use
26580 64 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 73  d .        ** as
26590 20 61 20 74 65 6d 70 6f 72 61 72 79 20 62 75 66   a temporary buf
265a0 66 65 72 20 74 6f 20 69 6e 73 70 65 63 74 20 74  fer to inspect t
265b0 68 65 20 66 69 72 73 74 20 63 6f 75 70 6c 65 20  he first couple 
265c0 6f 66 20 62 79 74 65 73 20 6f 66 0a 20 20 20 20  of bytes of.    
265d0 20 20 20 20 2a 2a 20 74 68 65 20 70 6f 74 65 6e      ** the poten
265e0 74 69 61 6c 20 6a 6f 75 72 6e 61 6c 20 68 65 61  tial journal hea
265f0 64 65 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  der..        */.
26600 20 20 20 20 20 20 20 20 69 36 34 20 69 4e 65 78          i64 iNex
26610 74 48 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20  tHdrOffset;.    
26620 20 20 20 20 75 38 20 61 4d 61 67 69 63 5b 38 5d      u8 aMagic[8]
26630 3b 0a 20 20 20 20 20 20 20 20 75 38 20 7a 48 65  ;.        u8 zHe
26640 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
26650 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 3b 0a 0a  rnalMagic)+4];..
26660 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a          memcpy(z
26670 48 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c  Header, aJournal
26680 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a  Magic, sizeof(aJ
26690 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20  ournalMagic));. 
266a0 20 20 20 20 20 20 20 70 75 74 33 32 62 69 74 73         put32bits
266b0 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
266c0 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d  (aJournalMagic)]
266d0 2c 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 29 3b  , pPager->nRec);
266e0 0a 0a 20 20 20 20 20 20 20 20 69 4e 65 78 74 48  ..        iNextH
266f0 64 72 4f 66 66 73 65 74 20 3d 20 6a 6f 75 72 6e  drOffset = journ
26700 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61 67  alHdrOffset(pPag
26710 65 72 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  er);.        rc 
26720 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
26730 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61  pPager->jfd, aMa
26740 67 69 63 2c 20 38 2c 20 69 4e 65 78 74 48 64 72  gic, 8, iNextHdr
26750 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20  Offset);.       
26760 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
26770 4f 4b 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28  OK && 0==memcmp(
26780 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c  aMagic, aJournal
26790 4d 61 67 69 63 2c 20 38 29 20 29 7b 0a 20 20 20  Magic, 8) ){.   
267a0 20 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f         static co
267b0 6e 73 74 20 75 38 20 7a 65 72 6f 62 79 74 65 20  nst u8 zerobyte 
267c0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72  = 0;.          r
267d0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
267e0 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
267f0 26 7a 65 72 6f 62 79 74 65 2c 20 31 2c 20 69 4e  &zerobyte, 1, iN
26800 65 78 74 48 64 72 4f 66 66 73 65 74 29 3b 0a 20  extHdrOffset);. 
26810 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
26820 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
26830 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45  OK && rc!=SQLITE
26840 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
26850 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  D ){.          r
26860 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
26870 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
26880 57 72 69 74 65 20 74 68 65 20 6e 52 65 63 20 76  Write the nRec v
26890 61 6c 75 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f  alue into the jo
268a0 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 61 64 65  urnal file heade
268b0 72 2e 20 49 66 20 69 6e 0a 20 20 20 20 20 20 20  r. If in.       
268c0 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63 68 72 6f   ** full-synchro
268d0 6e 6f 75 73 20 6d 6f 64 65 2c 20 73 79 6e 63 20  nous mode, sync 
268e0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 72 73  the journal firs
268f0 74 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73 20  t. This ensures 
26900 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  that.        ** 
26910 61 6c 6c 20 64 61 74 61 20 68 61 73 20 72 65 61  all data has rea
26920 6c 6c 79 20 68 69 74 20 74 68 65 20 64 69 73 6b  lly hit the disk
26930 20 62 65 66 6f 72 65 20 6e 52 65 63 20 69 73 20   before nRec is 
26940 75 70 64 61 74 65 64 20 74 6f 20 6d 61 72 6b 0a  updated to mark.
26950 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 61 73          ** it as
26960 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72   a candidate for
26970 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20 20 20   rollback..     
26980 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
26990 20 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71   This is not req
269a0 75 69 72 65 64 20 69 66 20 74 68 65 20 70 65 72  uired if the per
269b0 73 69 73 74 65 6e 74 20 6d 65 64 69 61 20 73 75  sistent media su
269c0 70 70 6f 72 74 73 20 74 68 65 0a 20 20 20 20 20  pports the.     
269d0 20 20 20 2a 2a 20 53 41 46 45 5f 41 50 50 45 4e     ** SAFE_APPEN
269e0 44 20 70 72 6f 70 65 72 74 79 2e 20 42 65 63 61  D property. Beca
269f0 75 73 65 20 69 6e 20 74 68 69 73 20 63 61 73 65  use in this case
26a00 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   it is not possi
26a10 62 6c 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ble .        ** 
26a20 66 6f 72 20 67 61 72 62 61 67 65 20 64 61 74 61  for garbage data
26a30 20 74 6f 20 62 65 20 61 70 70 65 6e 64 65 64 20   to be appended 
26a40 74 6f 20 74 68 65 20 66 69 6c 65 2c 20 74 68 65  to the file, the
26a50 20 6e 52 65 63 20 66 69 65 6c 64 0a 20 20 20 20   nRec field.    
26a60 20 20 20 20 2a 2a 20 69 73 20 70 6f 70 75 6c 61      ** is popula
26a70 74 65 64 20 77 69 74 68 20 30 78 46 46 46 46 46  ted with 0xFFFFF
26a80 46 46 46 20 77 68 65 6e 20 74 68 65 20 6a 6f 75  FFF when the jou
26a90 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20 77  rnal header is w
26aa0 72 69 74 74 65 6e 0a 20 20 20 20 20 20 20 20 2a  ritten.        *
26ab0 2a 20 61 6e 64 20 6e 65 76 65 72 20 6e 65 65 64  * and never need
26ac0 73 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 2e  s to be updated.
26ad0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
26ae0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
26af0 66 75 6c 6c 53 79 6e 63 20 26 26 20 30 3d 3d 28  fullSync && 0==(
26b00 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  iDc&SQLITE_IOCAP
26b10 5f 53 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a  _SEQUENTIAL) ){.
26b20 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 54            PAGERT
26b30 52 41 43 45 28 28 22 53 59 4e 43 20 6a 6f 75 72  RACE(("SYNC jour
26b40 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41  nal of %d\n", PA
26b50 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b  GERID(pPager)));
26b60 0a 20 20 20 20 20 20 20 20 20 20 49 4f 54 52 41  .          IOTRA
26b70 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22  CE(("JSYNC %p\n"
26b80 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 20  , pPager)).     
26b90 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
26ba0 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
26bb0 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e  jfd, pPager->syn
26bc0 63 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 20  cFlags);.       
26bd0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
26be0 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
26bf0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
26c00 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 48      IOTRACE(("JH
26c10 44 52 20 25 70 20 25 6c 6c 64 5c 6e 22 2c 20 70  DR %p %lld\n", p
26c20 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a  Pager, pPager->j
26c30 6f 75 72 6e 61 6c 48 64 72 29 29 3b 0a 20 20 20  ournalHdr));.   
26c40 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
26c50 33 4f 73 57 72 69 74 65 28 0a 20 20 20 20 20 20  3OsWrite(.      
26c60 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 66        pPager->jf
26c70 64 2c 20 7a 48 65 61 64 65 72 2c 20 73 69 7a 65  d, zHeader, size
26c80 6f 66 28 7a 48 65 61 64 65 72 29 2c 20 70 50 61  of(zHeader), pPa
26c90 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 0a  ger->journalHdr.
26ca0 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
26cb0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
26cc0 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
26cd0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
26ce0 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49  if( 0==(iDc&SQLI
26cf0 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54  TE_IOCAP_SEQUENT
26d00 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  IAL) ){.        
26d10 50 41 47 45 52 54 52 41 43 45 28 28 22 53 59 4e  PAGERTRACE(("SYN
26d20 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c  C journal of %d\
26d30 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
26d40 65 72 29 29 29 3b 0a 20 20 20 20 20 20 20 20 49  er)));.        I
26d50 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25  OTRACE(("JSYNC %
26d60 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20  p\n", pPager)). 
26d70 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
26d80 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72  te3OsSync(pPager
26d90 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73  ->jfd, pPager->s
26da0 79 6e 63 46 6c 61 67 73 7c 20 0a 20 20 20 20 20  yncFlags| .     
26db0 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 73 79       (pPager->sy
26dc0 6e 63 46 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f  ncFlags==SQLITE_
26dd0 53 59 4e 43 5f 46 55 4c 4c 3f 53 51 4c 49 54 45  SYNC_FULL?SQLITE
26de0 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 3a 30  _SYNC_DATAONLY:0
26df0 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  ).        );.   
26e00 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
26e10 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
26e20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  rc;.      }..   
26e30 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
26e40 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d 3e  alHdr = pPager->
26e50 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20  journalOff;.    
26e60 20 20 69 66 28 20 6e 65 77 48 64 72 20 26 26 20    if( newHdr && 
26e70 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49  0==(iDc&SQLITE_I
26e80 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44  OCAP_SAFE_APPEND
26e90 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  ) ){.        pPa
26ea0 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20  ger->nRec = 0;. 
26eb0 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74         rc = writ
26ec0 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  eJournalHdr(pPag
26ed0 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  er);.        if(
26ee0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
26ef0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
26f00 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
26f10 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
26f20 72 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72  rnalHdr = pPager
26f30 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20  ->journalOff;.  
26f40 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e    }.  }..  /* Un
26f50 6c 65 73 73 20 74 68 65 20 70 61 67 65 72 20 69  less the pager i
26f60 73 20 69 6e 20 6e 6f 53 79 6e 63 20 6d 6f 64 65  s in noSync mode
26f70 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  , the journal fi
26f80 6c 65 20 77 61 73 20 6a 75 73 74 20 0a 20 20 2a  le was just .  *
26f90 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 73  * successfully s
26fa0 79 6e 63 65 64 2e 20 45 69 74 68 65 72 20 77 61  ynced. Either wa
26fb0 79 2c 20 63 6c 65 61 72 20 74 68 65 20 50 47 48  y, clear the PGH
26fc0 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61  DR_NEED_SYNC fla
26fd0 67 20 6f 6e 20 0a 20 20 2a 2a 20 61 6c 6c 20 70  g on .  ** all p
26fe0 61 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  ages..  */.  sql
26ff0 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 72 53  ite3PcacheClearS
27000 79 6e 63 46 6c 61 67 73 28 70 50 61 67 65 72 2d  yncFlags(pPager-
27010 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 70 50 61  >pPCache);.  pPa
27020 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41  ger->eState = PA
27030 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44  GER_WRITER_DBMOD
27040 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65  ;.  assert( asse
27050 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
27060 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74 75  Pager) );.  retu
27070 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
27080 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d  ./*.** The argum
27090 65 6e 74 20 69 73 20 74 68 65 20 66 69 72 73 74  ent is the first
270a0 20 69 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73   in a linked lis
270b0 74 20 6f 66 20 64 69 72 74 79 20 70 61 67 65 73  t of dirty pages
270c0 20 63 6f 6e 6e 65 63 74 65 64 0a 2a 2a 20 62 79   connected.** by
270d0 20 74 68 65 20 50 67 48 64 72 2e 70 44 69 72 74   the PgHdr.pDirt
270e0 79 20 70 6f 69 6e 74 65 72 2e 20 54 68 69 73 20  y pointer. This 
270f0 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 73 20  function writes 
27100 65 61 63 68 20 6f 6e 65 20 6f 66 20 74 68 65 0a  each one of the.
27110 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ** in-memory pag
27120 65 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20 74  es in the list t
27130 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
27140 69 6c 65 2e 20 54 68 65 20 61 72 67 75 6d 65 6e  ile. The argumen
27150 74 20 6d 61 79 0a 2a 2a 20 62 65 20 4e 55 4c 4c  t may.** be NULL
27160 2c 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20 61  , representing a
27170 6e 20 65 6d 70 74 79 20 6c 69 73 74 2e 20 49 6e  n empty list. In
27180 20 74 68 69 73 20 63 61 73 65 20 74 68 69 73 20   this case this 
27190 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 61  function is.** a
271a0 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68   no-op..**.** Th
271b0 65 20 70 61 67 65 72 20 6d 75 73 74 20 68 6f 6c  e pager must hol
271c0 64 20 61 74 20 6c 65 61 73 74 20 61 20 52 45 53  d at least a RES
271d0 45 52 56 45 44 20 6c 6f 63 6b 20 77 68 65 6e 20  ERVED lock when 
271e0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  this function.**
271f0 20 69 73 20 63 61 6c 6c 65 64 2e 20 42 65 66 6f   is called. Befo
27200 72 65 20 77 72 69 74 69 6e 67 20 61 6e 79 74 68  re writing anyth
27210 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
27220 61 73 65 20 66 69 6c 65 2c 20 74 68 69 73 20 6c  ase file, this l
27230 6f 63 6b 0a 2a 2a 20 69 73 20 75 70 67 72 61 64  ock.** is upgrad
27240 65 64 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49  ed to an EXCLUSI
27250 56 45 20 6c 6f 63 6b 2e 20 49 66 20 74 68 65 20  VE lock. If the 
27260 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62 65 20 6f  lock cannot be o
27270 62 74 61 69 6e 65 64 2c 0a 2a 2a 20 53 51 4c 49  btained,.** SQLI
27280 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72  TE_BUSY is retur
27290 6e 65 64 20 61 6e 64 20 6e 6f 20 64 61 74 61 20  ned and no data 
272a0 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  is written to th
272b0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
272c0 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20 70  .** .** If the p
272d0 61 67 65 72 20 69 73 20 61 20 74 65 6d 70 2d 66  ager is a temp-f
272e0 69 6c 65 20 70 61 67 65 72 20 61 6e 64 20 74 68  ile pager and th
272f0 65 20 61 63 74 75 61 6c 20 66 69 6c 65 2d 73 79  e actual file-sy
27300 73 74 65 6d 20 66 69 6c 65 0a 2a 2a 20 69 73 20  stem file.** is 
27310 6e 6f 74 20 79 65 74 20 6f 70 65 6e 2c 20 69 74  not yet open, it
27320 20 69 73 20 63 72 65 61 74 65 64 20 61 6e 64 20   is created and 
27330 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20 61 6e  opened before an
27340 79 20 64 61 74 61 20 69 73 20 0a 2a 2a 20 77 72  y data is .** wr
27350 69 74 74 65 6e 20 6f 75 74 2e 0a 2a 2a 0a 2a 2a  itten out..**.**
27360 20 4f 6e 63 65 20 74 68 65 20 6c 6f 63 6b 20 68   Once the lock h
27370 61 73 20 62 65 65 6e 20 75 70 67 72 61 64 65 64  as been upgraded
27380 20 61 6e 64 2c 20 69 66 20 6e 65 63 65 73 73 61   and, if necessa
27390 72 79 2c 20 74 68 65 20 66 69 6c 65 20 6f 70 65  ry, the file ope
273a0 6e 65 64 2c 0a 2a 2a 20 74 68 65 20 70 61 67 65  ned,.** the page
273b0 73 20 61 72 65 20 77 72 69 74 74 65 6e 20 6f 75  s are written ou
273c0 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  t to the databas
273d0 65 20 66 69 6c 65 20 69 6e 20 6c 69 73 74 20 6f  e file in list o
273e0 72 64 65 72 2e 20 57 72 69 74 69 6e 67 0a 2a 2a  rder. Writing.**
273f0 20 61 20 70 61 67 65 20 69 73 20 73 6b 69 70 70   a page is skipp
27400 65 64 20 69 66 20 69 74 20 6d 65 65 74 73 20 65  ed if it meets e
27410 69 74 68 65 72 20 6f 66 20 74 68 65 20 66 6f 6c  ither of the fol
27420 6c 6f 77 69 6e 67 20 63 72 69 74 65 72 69 61 3a  lowing criteria:
27430 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 70  .**.**   * The p
27440 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 67 72  age number is gr
27450 65 61 74 65 72 20 74 68 61 6e 20 50 61 67 65 72  eater than Pager
27460 2e 64 62 53 69 7a 65 2c 20 6f 72 0a 2a 2a 20 20  .dbSize, or.**  
27470 20 2a 20 54 68 65 20 50 47 48 44 52 5f 44 4f 4e   * The PGHDR_DON
27480 54 5f 57 52 49 54 45 20 66 6c 61 67 20 69 73 20  T_WRITE flag is 
27490 73 65 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2e  set on the page.
274a0 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 69 74 69 6e  .**.** If writin
274b0 67 20 6f 75 74 20 61 20 70 61 67 65 20 63 61 75  g out a page cau
274c0 73 65 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ses the database
274d0 20 66 69 6c 65 20 74 6f 20 67 72 6f 77 2c 20 50   file to grow, P
274e0 61 67 65 72 2e 64 62 46 69 6c 65 53 69 7a 65 0a  ager.dbFileSize.
274f0 2a 2a 20 69 73 20 75 70 64 61 74 65 64 20 61 63  ** is updated ac
27500 63 6f 72 64 69 6e 67 6c 79 2e 20 49 66 20 70 61  cordingly. If pa
27510 67 65 20 31 20 69 73 20 77 72 69 74 74 65 6e 20  ge 1 is written 
27520 6f 75 74 2c 20 74 68 65 6e 20 74 68 65 20 76 61  out, then the va
27530 6c 75 65 20 63 61 63 68 65 64 0a 2a 2a 20 69 6e  lue cached.** in
27540 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72   Pager.dbFileVer
27550 73 5b 5d 20 69 73 20 75 70 64 61 74 65 64 20 74  s[] is updated t
27560 6f 20 6d 61 74 63 68 20 74 68 65 20 6e 65 77 20  o match the new 
27570 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 0a  value stored in.
27580 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
27590 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65  file..**.** If e
275a0 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75 63  verything is suc
275b0 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f  cessful, SQLITE_
275c0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
275d0 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a  If an IO error .
275e0 2a 2a 20 6f 63 63 75 72 73 2c 20 61 6e 20 49 4f  ** occurs, an IO
275f0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
27600 65 74 75 72 6e 65 64 2e 20 4f 72 2c 20 69 66 20  eturned. Or, if 
27610 74 68 65 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  the EXCLUSIVE lo
27620 63 6b 20 63 61 6e 6e 6f 74 0a 2a 2a 20 62 65 20  ck cannot.** be 
27630 6f 62 74 61 69 6e 65 64 2c 20 53 51 4c 49 54 45  obtained, SQLITE
27640 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65  _BUSY is returne
27650 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
27660 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67   pager_write_pag
27670 65 6c 69 73 74 28 50 61 67 65 72 20 2a 70 50 61  elist(Pager *pPa
27680 67 65 72 2c 20 50 67 48 64 72 20 2a 70 4c 69 73  ger, PgHdr *pLis
27690 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
276a0 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
276b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
276c0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20  turn code */..  
276d0 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  /* This function
276e0 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20   is only called 
276f0 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 70 61 67  for rollback pag
27700 65 72 73 20 69 6e 20 57 52 49 54 45 52 5f 44 42  ers in WRITER_DB
27710 4d 4f 44 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20  MOD state. */.  
27720 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73  assert( !pagerUs
27730 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
27740 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
27750 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
27760 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 29 3b 0a  WRITER_DBMOD );.
27770 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
27780 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ->eLock==EXCLUSI
27790 56 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a  VE_LOCK );..  /*
277a0 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   If the file is 
277b0 61 20 74 65 6d 70 2d 66 69 6c 65 20 68 61 73 20  a temp-file has 
277c0 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6f 70 65  not yet been ope
277d0 6e 65 64 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77  ned, open it now
277e0 2e 20 49 74 0a 20 20 2a 2a 20 69 73 20 6e 6f 74  . It.  ** is not
277f0 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 72 63   possible for rc
27800 20 74 6f 20 62 65 20 6f 74 68 65 72 20 74 68 61   to be other tha
27810 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74  n SQLITE_OK if t
27820 68 69 73 20 62 72 61 6e 63 68 0a 20 20 2a 2a 20  his branch.  ** 
27830 69 73 20 74 61 6b 65 6e 2c 20 61 73 20 70 61 67  is taken, as pag
27840 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
27850 29 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72  ) is a no-op for
27860 20 74 65 6d 70 2d 66 69 6c 65 73 2e 0a 20 20 2a   temp-files..  *
27870 2f 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28  /.  if( !isOpen(
27880 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20  pPager->fd) ){. 
27890 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
278a0 72 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26 20 72  r->tempFile && r
278b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
278c0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4f 70      rc = pagerOp
278d0 65 6e 74 65 6d 70 28 70 50 61 67 65 72 2c 20 70  entemp(pPager, p
278e0 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65  Pager->fd, pPage
278f0 72 2d 3e 76 66 73 46 6c 61 67 73 29 3b 0a 20 20  r->vfsFlags);.  
27900 7d 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20 74  }..  /* Before t
27910 68 65 20 66 69 72 73 74 20 77 72 69 74 65 2c 20  he first write, 
27920 67 69 76 65 20 74 68 65 20 56 46 53 20 61 20 68  give the VFS a h
27930 69 6e 74 20 6f 66 20 77 68 61 74 20 74 68 65 20  int of what the 
27940 66 69 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20  final.  ** file 
27950 73 69 7a 65 20 77 69 6c 6c 20 62 65 2e 0a 20 20  size will be..  
27960 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 72 63 21  */.  assert( rc!
27970 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73  =SQLITE_OK || is
27980 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
27990 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   );.  if( rc==SQ
279a0 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65  LITE_OK && pPage
279b0 72 2d 3e 64 62 53 69 7a 65 3e 70 50 61 67 65 72  r->dbSize>pPager
279c0 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29 7b 0a  ->dbHintSize ){.
279d0 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
279e0 34 20 73 7a 46 69 6c 65 20 3d 20 70 50 61 67 65  4 szFile = pPage
279f0 72 2d 3e 70 61 67 65 53 69 7a 65 20 2a 20 28 73  r->pageSize * (s
27a00 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 70 50 61  qlite3_int64)pPa
27a10 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20  ger->dbSize;.   
27a20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
27a30 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
27a40 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f   sqlite3OsFileCo
27a50 6e 74 72 6f 6c 28 70 50 61 67 65 72 2d 3e 66 64  ntrol(pPager->fd
27a60 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53  , SQLITE_FCNTL_S
27a70 49 5a 45 5f 48 49 4e 54 2c 20 26 73 7a 46 69 6c  IZE_HINT, &szFil
27a80 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  e);.    sqlite3E
27a90 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
27aa0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  ;.    pPager->db
27ab0 48 69 6e 74 53 69 7a 65 20 3d 20 70 50 61 67 65  HintSize = pPage
27ac0 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 7d 0a 0a  r->dbSize;.  }..
27ad0 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
27ae0 49 54 45 5f 4f 4b 20 26 26 20 70 4c 69 73 74 20  ITE_OK && pList 
27af0 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f  ){.    Pgno pgno
27b00 20 3d 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3b 0a   = pList->pgno;.
27b10 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
27b20 20 61 72 65 20 64 69 72 74 79 20 70 61 67 65 73   are dirty pages
27b30 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63   in the page cac
27b40 68 65 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d  he with page num
27b50 62 65 72 73 20 67 72 65 61 74 65 72 0a 20 20 20  bers greater.   
27b60 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 64   ** than Pager.d
27b70 62 53 69 7a 65 2c 20 74 68 69 73 20 6d 65 61 6e  bSize, this mean
27b80 73 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  s sqlite3PagerTr
27b90 75 6e 63 61 74 65 49 6d 61 67 65 28 29 20 77 61  uncateImage() wa
27ba0 73 20 63 61 6c 6c 65 64 20 74 6f 0a 20 20 20 20  s called to.    
27bb0 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66 69 6c 65  ** make the file
27bc0 20 73 6d 61 6c 6c 65 72 20 28 70 72 65 73 75 6d   smaller (presum
27bd0 61 62 6c 79 20 62 79 20 61 75 74 6f 2d 76 61 63  ably by auto-vac
27be0 75 75 6d 20 63 6f 64 65 29 2e 20 44 6f 20 6e 6f  uum code). Do no
27bf0 74 20 77 72 69 74 65 0a 20 20 20 20 2a 2a 20 61  t write.    ** a
27c00 6e 79 20 73 75 63 68 20 70 61 67 65 73 20 74 6f  ny such pages to
27c10 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a   the file..    *
27c20 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 64  *.    ** Also, d
27c30 6f 20 6e 6f 74 20 77 72 69 74 65 20 6f 75 74 20  o not write out 
27c40 61 6e 79 20 70 61 67 65 20 74 68 61 74 20 68 61  any page that ha
27c50 73 20 74 68 65 20 50 47 48 44 52 5f 44 4f 4e 54  s the PGHDR_DONT
27c60 5f 57 52 49 54 45 20 66 6c 61 67 0a 20 20 20 20  _WRITE flag.    
27c70 2a 2a 20 73 65 74 20 28 73 65 74 20 62 79 20 73  ** set (set by s
27c80 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57  qlite3PagerDontW
27c90 72 69 74 65 28 29 29 2e 0a 20 20 20 20 2a 2f 0a  rite())..    */.
27ca0 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50      if( pgno<=pP
27cb0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 26 26 20  ager->dbSize && 
27cc0 30 3d 3d 28 70 4c 69 73 74 2d 3e 66 6c 61 67 73  0==(pList->flags
27cd0 26 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54  &PGHDR_DONT_WRIT
27ce0 45 29 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20  E) ){.      i64 
27cf0 6f 66 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31  offset = (pgno-1
27d00 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70  )*(i64)pPager->p
27d10 61 67 65 53 69 7a 65 3b 20 20 20 2f 2a 20 4f 66  ageSize;   /* Of
27d20 66 73 65 74 20 74 6f 20 77 72 69 74 65 20 2a 2f  fset to write */
27d30 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70 44 61  .      char *pDa
27d40 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ta;             
27d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27d60 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20 74 6f        /* Data to
27d70 20 77 72 69 74 65 20 2a 2f 20 20 20 20 0a 0a 20   write */    .. 
27d80 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4c       assert( (pL
27d90 69 73 74 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  ist->flags&PGHDR
27da0 5f 4e 45 45 44 5f 53 59 4e 43 29 3d 3d 30 20 29  _NEED_SYNC)==0 )
27db0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69 73  ;.      if( pLis
27dc0 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 20 70 61 67  t->pgno==1 ) pag
27dd0 65 72 5f 77 72 69 74 65 5f 63 68 61 6e 67 65 63  er_write_changec
27de0 6f 75 6e 74 65 72 28 70 4c 69 73 74 29 3b 0a 0a  ounter(pList);..
27df0 20 20 20 20 20 20 2f 2a 20 45 6e 63 6f 64 65 20        /* Encode 
27e00 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  the database */.
27e10 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50 61        CODEC2(pPa
27e20 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70 44 61 74  ger, pList->pDat
27e30 61 2c 20 70 67 6e 6f 2c 20 36 2c 20 72 65 74 75  a, pgno, 6, retu
27e40 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  rn SQLITE_NOMEM,
27e50 20 70 44 61 74 61 29 3b 0a 0a 20 20 20 20 20 20   pData);..      
27e60 2f 2a 20 57 72 69 74 65 20 6f 75 74 20 74 68 65  /* Write out the
27e70 20 70 61 67 65 20 64 61 74 61 2e 20 2a 2f 0a 20   page data. */. 
27e80 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
27e90 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
27ea0 3e 66 64 2c 20 70 44 61 74 61 2c 20 70 50 61 67  >fd, pData, pPag
27eb0 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66  er->pageSize, of
27ec0 66 73 65 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  fset);..      /*
27ed0 20 49 66 20 70 61 67 65 20 31 20 77 61 73 20 6a   If page 1 was j
27ee0 75 73 74 20 77 72 69 74 74 65 6e 2c 20 75 70 64  ust written, upd
27ef0 61 74 65 20 50 61 67 65 72 2e 64 62 46 69 6c 65  ate Pager.dbFile
27f00 56 65 72 73 20 74 6f 20 6d 61 74 63 68 0a 20 20  Vers to match.  
27f10 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65      ** the value
27f20 20 6e 6f 77 20 73 74 6f 72 65 64 20 69 6e 20 74   now stored in t
27f30 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
27f40 2e 20 49 66 20 77 72 69 74 69 6e 67 20 74 68 69  . If writing thi
27f50 73 20 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65  s .      ** page
27f60 20 63 61 75 73 65 64 20 74 68 65 20 64 61 74 61   caused the data
27f70 62 61 73 65 20 66 69 6c 65 20 74 6f 20 67 72 6f  base file to gro
27f80 77 2c 20 75 70 64 61 74 65 20 64 62 46 69 6c 65  w, update dbFile
27f90 53 69 7a 65 2e 20 0a 20 20 20 20 20 20 2a 2f 0a  Size. .      */.
27fa0 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d        if( pgno==
27fb0 31 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  1 ){.        mem
27fc0 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46  cpy(&pPager->dbF
27fd0 69 6c 65 56 65 72 73 2c 20 26 70 44 61 74 61 5b  ileVers, &pData[
27fe0 32 34 5d 2c 20 73 69 7a 65 6f 66 28 70 50 61 67  24], sizeof(pPag
27ff0 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29  er->dbFileVers))
28000 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
28010 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d  if( pgno>pPager-
28020 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20  >dbFileSize ){. 
28030 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64         pPager->d
28040 62 46 69 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f  bFileSize = pgno
28050 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
28060 20 2f 2a 20 55 70 64 61 74 65 20 61 6e 79 20 62   /* Update any b
28070 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 20 63 6f  ackup objects co
28080 70 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e  pying the conten
28090 74 73 20 6f 66 20 74 68 69 73 20 70 61 67 65 72  ts of this pager
280a0 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
280b0 65 33 42 61 63 6b 75 70 55 70 64 61 74 65 28 70  e3BackupUpdate(p
280c0 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20  Pager->pBackup, 
280d0 70 67 6e 6f 2c 20 28 75 38 2a 29 70 4c 69 73 74  pgno, (u8*)pList
280e0 2d 3e 70 44 61 74 61 29 3b 0a 0a 20 20 20 20 20  ->pData);..     
280f0 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53 54   PAGERTRACE(("ST
28100 4f 52 45 20 25 64 20 70 61 67 65 20 25 64 20 68  ORE %d page %d h
28110 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20  ash(%08x)\n",.  
28120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28130 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
28140 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61  , pgno, pager_pa
28150 67 65 68 61 73 68 28 70 4c 69 73 74 29 29 29 3b  gehash(pList)));
28160 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28  .      IOTRACE((
28170 22 50 47 4f 55 54 20 25 70 20 25 64 5c 6e 22 2c  "PGOUT %p %d\n",
28180 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b   pPager, pgno));
28190 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43  .      PAGER_INC
281a0 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  R(sqlite3_pager_
281b0 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 29 3b 0a  writedb_count);.
281c0 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52        PAGER_INCR
281d0 28 70 50 61 67 65 72 2d 3e 6e 57 72 69 74 65 29  (pPager->nWrite)
281e0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
281f0 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
28200 4e 4f 53 54 4f 52 45 20 25 64 20 70 61 67 65 20  NOSTORE %d page 
28210 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
28220 50 61 67 65 72 29 2c 20 70 67 6e 6f 29 29 3b 0a  Pager), pgno));.
28230 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72 5f      }.    pager_
28240 73 65 74 5f 70 61 67 65 68 61 73 68 28 70 4c 69  set_pagehash(pLi
28250 73 74 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d  st);.    pList =
28260 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a   pList->pDirty;.
28270 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
28280 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 73 75 72  ;.}../*.** Ensur
28290 65 20 74 68 61 74 20 74 68 65 20 73 75 62 2d 6a  e that the sub-j
282a0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f  ournal file is o
282b0 70 65 6e 2e 20 49 66 20 69 74 20 69 73 20 61 6c  pen. If it is al
282c0 72 65 61 64 79 20 6f 70 65 6e 2c 20 74 68 69 73  ready open, this
282d0 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73   .** function is
282e0 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
282f0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
28300 75 72 6e 65 64 20 69 66 20 65 76 65 72 79 74 68  urned if everyth
28310 69 6e 67 20 67 6f 65 73 20 61 63 63 6f 72 64 69  ing goes accordi
28320 6e 67 20 74 6f 20 70 6c 61 6e 2e 20 41 6e 20 0a  ng to plan. An .
28330 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  ** SQLITE_IOERR_
28340 58 58 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69  XXX error code i
28350 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 61 20  s returned if a 
28360 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f  call to sqlite3O
28370 73 4f 70 65 6e 28 29 20 0a 2a 2a 20 66 61 69 6c  sOpen() .** fail
28380 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
28390 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28   openSubJournal(
283a0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
283b0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
283c0 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 69 73 4f  E_OK;.  if( !isO
283d0 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  pen(pPager->sjfd
283e0 29 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  ) ){.    if( pPa
283f0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
28400 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
28410 4f 44 45 5f 4d 45 4d 4f 52 59 20 7c 7c 20 70 50  ODE_MEMORY || pP
28420 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f  ager->subjInMemo
28430 72 79 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ry ){.      sqli
28440 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65  te3MemJournalOpe
28450 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 3b  n(pPager->sjfd);
28460 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
28470 20 20 72 63 20 3d 20 70 61 67 65 72 4f 70 65 6e    rc = pagerOpen
28480 74 65 6d 70 28 70 50 61 67 65 72 2c 20 70 50 61  temp(pPager, pPa
28490 67 65 72 2d 3e 73 6a 66 64 2c 20 53 51 4c 49 54  ger->sjfd, SQLIT
284a0 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41  E_OPEN_SUBJOURNA
284b0 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  L);.    }.  }.  
284c0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
284d0 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 72 65 63  .** Append a rec
284e0 6f 72 64 20 6f 66 20 74 68 65 20 63 75 72 72 65  ord of the curre
284f0 6e 74 20 73 74 61 74 65 20 6f 66 20 70 61 67 65  nt state of page
28500 20 70 50 67 20 74 6f 20 74 68 65 20 73 75 62 2d   pPg to the sub-
28510 6a 6f 75 72 6e 61 6c 2e 20 0a 2a 2a 20 49 74 20  journal. .** It 
28520 69 73 20 74 68 65 20 63 61 6c 6c 65 72 73 20 72  is the callers r
28530 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 74 6f  esponsibility to
28540 20 75 73 65 20 73 75 62 6a 52 65 71 75 69 72 65   use subjRequire
28550 73 50 61 67 65 28 29 20 74 6f 20 63 68 65 63 6b  sPage() to check
28560 20 0a 2a 2a 20 74 68 61 74 20 69 74 20 69 73 20   .** that it is 
28570 72 65 61 6c 6c 79 20 72 65 71 75 69 72 65 64 20  really required 
28580 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74  before calling t
28590 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
285a0 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
285b0 6c 2c 20 73 65 74 20 74 68 65 20 62 69 74 20 63  l, set the bit c
285c0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
285d0 70 50 67 2d 3e 70 67 6e 6f 20 69 6e 20 74 68 65  pPg->pgno in the
285e0 20 62 69 74 76 65 63 73 0a 2a 2a 20 66 6f 72 20   bitvecs.** for 
285f0 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f 69  all open savepoi
28600 6e 74 73 20 62 65 66 6f 72 65 20 72 65 74 75 72  nts before retur
28610 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ning..**.** This
28620 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
28630 73 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65  s SQLITE_OK if e
28640 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75 63  verything is suc
28650 63 65 73 73 66 75 6c 2c 20 61 6e 20 49 4f 0a 2a  cessful, an IO.*
28660 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  * error code if 
28670 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 77  the attempt to w
28680 72 69 74 65 20 74 6f 20 74 68 65 20 73 75 62 2d  rite to the sub-
28690 6a 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c 20 6f  journal fails, o
286a0 72 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d  r .** SQLITE_NOM
286b0 45 4d 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66  EM if a malloc f
286c0 61 69 6c 73 20 77 68 69 6c 65 20 73 65 74 74 69  ails while setti
286d0 6e 67 20 61 20 62 69 74 20 69 6e 20 61 20 73 61  ng a bit in a sa
286e0 76 65 70 6f 69 6e 74 0a 2a 2a 20 62 69 74 76 65  vepoint.** bitve
286f0 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  c..*/.static int
28700 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28   subjournalPage(
28710 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69  PgHdr *pPg){.  i
28720 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
28730 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  K;.  Pager *pPag
28740 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
28750 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
28760 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47  journalMode!=PAG
28770 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
28780 46 46 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 4f 70  FF ){..    /* Op
28790 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  en the sub-journ
287a0 61 6c 2c 20 69 66 20 69 74 20 68 61 73 20 6e 6f  al, if it has no
287b0 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f  t already been o
287c0 70 65 6e 65 64 20 2a 2f 0a 20 20 20 20 61 73 73  pened */.    ass
287d0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65  ert( pPager->use
287e0 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 61  Journal );.    a
287f0 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
28800 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 61  ager->jfd) || pa
28810 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
28820 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
28830 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
28840 73 6a 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d  sjfd) || pPager-
28850 3e 6e 53 75 62 52 65 63 3d 3d 30 20 29 3b 0a 20  >nSubRec==0 );. 
28860 20 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72     assert( pager
28870 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 0a  UseWal(pPager) .
28880 20 20 20 20 20 20 20 20 20 7c 7c 20 70 61 67 65           || page
28890 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 0a  InJournal(pPg) .
288a0 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 67 2d           || pPg-
288b0 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62  >pgno>pPager->db
288c0 4f 72 69 67 53 69 7a 65 20 0a 20 20 20 20 29 3b  OrigSize .    );
288d0 0a 20 20 20 20 72 63 20 3d 20 6f 70 65 6e 53 75  .    rc = openSu
288e0 62 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  bJournal(pPager)
288f0 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
28900 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 77 61 73   sub-journal was
28910 20 6f 70 65 6e 65 64 20 73 75 63 63 65 73 73 66   opened successf
28920 75 6c 6c 79 20 28 6f 72 20 77 61 73 20 61 6c 72  ully (or was alr
28930 65 61 64 79 20 6f 70 65 6e 29 2c 0a 20 20 20 20  eady open),.    
28940 2a 2a 20 77 72 69 74 65 20 74 68 65 20 6a 6f 75  ** write the jou
28950 72 6e 61 6c 20 72 65 63 6f 72 64 20 69 6e 74 6f  rnal record into
28960 20 74 68 65 20 66 69 6c 65 2e 20 20 2a 2f 0a 20   the file.  */. 
28970 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
28980 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 76 6f  E_OK ){.      vo
28990 69 64 20 2a 70 44 61 74 61 20 3d 20 70 50 67 2d  id *pData = pPg-
289a0 3e 70 44 61 74 61 3b 0a 20 20 20 20 20 20 69 36  >pData;.      i6
289b0 34 20 6f 66 66 73 65 74 20 3d 20 28 69 36 34 29  4 offset = (i64)
289c0 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 2a  pPager->nSubRec*
289d0 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53  (4+pPager->pageS
289e0 69 7a 65 29 3b 0a 20 20 20 20 20 20 63 68 61 72  ize);.      char
289f0 20 2a 70 44 61 74 61 32 3b 0a 20 20 0a 20 20 20   *pData2;.  .   
28a00 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72     CODEC2(pPager
28a10 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67  , pData, pPg->pg
28a20 6e 6f 2c 20 37 2c 20 72 65 74 75 72 6e 20 53 51  no, 7, return SQ
28a30 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74  LITE_NOMEM, pDat
28a40 61 32 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52  a2);.      PAGER
28a50 54 52 41 43 45 28 28 22 53 54 4d 54 2d 4a 4f 55  TRACE(("STMT-JOU
28a60 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c  RNAL %d page %d\
28a70 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
28a80 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29  er), pPg->pgno))
28a90 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72 69  ;.      rc = wri
28aa0 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  te32bits(pPager-
28ab0 3e 73 6a 66 64 2c 20 6f 66 66 73 65 74 2c 20 70  >sjfd, offset, p
28ac0 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  Pg->pgno);.     
28ad0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
28ae0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
28af0 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
28b00 65 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20  e(pPager->sjfd, 
28b10 70 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d 3e  pData2, pPager->
28b20 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74  pageSize, offset
28b30 2b 34 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  +4);.      }.   
28b40 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d   }.  }.  if( rc=
28b50 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
28b60 20 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65    pPager->nSubRe
28b70 63 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28  c++;.    assert(
28b80 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f   pPager->nSavepo
28b90 69 6e 74 3e 30 20 29 3b 0a 20 20 20 20 72 63 20  int>0 );.    rc 
28ba0 3d 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74  = addToSavepoint
28bb0 42 69 74 76 65 63 73 28 70 50 61 67 65 72 2c 20  Bitvecs(pPager, 
28bc0 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a  pPg->pgno);.  }.
28bd0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
28be0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
28bf0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ion is called by
28c00 20 74 68 65 20 70 63 61 63 68 65 20 6c 61 79 65   the pcache laye
28c10 72 20 77 68 65 6e 20 69 74 20 68 61 73 20 72 65  r when it has re
28c20 61 63 68 65 64 20 73 6f 6d 65 0a 2a 2a 20 73 6f  ached some.** so
28c30 66 74 20 6d 65 6d 6f 72 79 20 6c 69 6d 69 74 2e  ft memory limit.
28c40 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   The first argum
28c50 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ent is a pointer
28c60 20 74 6f 20 61 20 50 61 67 65 72 20 6f 62 6a 65   to a Pager obje
28c70 63 74 0a 2a 2a 20 28 63 61 73 74 20 61 73 20 61  ct.** (cast as a
28c80 20 76 6f 69 64 2a 29 2e 20 54 68 65 20 70 61 67   void*). The pag
28c90 65 72 20 69 73 20 61 6c 77 61 79 73 20 27 70 75  er is always 'pu
28ca0 72 67 65 61 62 6c 65 27 20 28 6e 6f 74 20 61 6e  rgeable' (not an
28cb0 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61   in-memory.** da
28cc0 74 61 62 61 73 65 29 2e 20 54 68 65 20 73 65 63  tabase). The sec
28cd0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
28ce0 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61  a reference to a
28cf0 20 70 61 67 65 20 74 68 61 74 20 69 73 20 0a 2a   page that is .*
28d00 2a 20 63 75 72 72 65 6e 74 6c 79 20 64 69 72 74  * currently dirt
28d10 79 20 62 75 74 20 68 61 73 20 6e 6f 20 6f 75 74  y but has no out
28d20 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e  standing referen
28d30 63 65 73 2e 20 54 68 65 20 70 61 67 65 0a 2a 2a  ces. The page.**
28d40 20 69 73 20 61 6c 77 61 79 73 20 61 73 73 6f 63   is always assoc
28d50 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 50  iated with the P
28d60 61 67 65 72 20 6f 62 6a 65 63 74 20 70 61 73 73  ager object pass
28d70 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
28d80 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a  .** argument..**
28d90 0a 2a 2a 20 54 68 65 20 6a 6f 62 20 6f 66 20 74  .** The job of t
28da0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
28db0 74 6f 20 6d 61 6b 65 20 70 50 67 20 63 6c 65 61  to make pPg clea
28dc0 6e 20 62 79 20 77 72 69 74 69 6e 67 20 69 74 73  n by writing its
28dd0 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 75 74   contents.** out
28de0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
28df0 20 66 69 6c 65 2c 20 69 66 20 70 6f 73 73 69 62   file, if possib
28e00 6c 65 2e 20 54 68 69 73 20 6d 61 79 20 69 6e 76  le. This may inv
28e10 6f 6c 76 65 20 73 79 6e 63 69 6e 67 20 74 68 65  olve syncing the
28e20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
28e30 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63  . .**.** If succ
28e40 65 73 73 66 75 6c 2c 20 73 71 6c 69 74 65 33 50  essful, sqlite3P
28e50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29  cacheMakeClean()
28e60 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68   is called on th
28e70 65 20 70 61 67 65 20 61 6e 64 0a 2a 2a 20 53 51  e page and.** SQ
28e80 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
28e90 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  . If an IO error
28ea0 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72   occurs while tr
28eb0 79 69 6e 67 20 74 6f 20 6d 61 6b 65 20 74 68 65  ying to make the
28ec0 0a 2a 2a 20 70 61 67 65 20 63 6c 65 61 6e 2c 20  .** page clean, 
28ed0 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64  the IO error cod
28ee0 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  e is returned. I
28ef0 66 20 74 68 65 20 70 61 67 65 20 63 61 6e 6e 6f  f the page canno
28f00 74 20 62 65 0a 2a 2a 20 6d 61 64 65 20 63 6c 65  t be.** made cle
28f10 61 6e 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65  an for some othe
28f20 72 20 72 65 61 73 6f 6e 2c 20 62 75 74 20 6e 6f  r reason, but no
28f30 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
28f40 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  hen SQLITE_OK.**
28f50 20 69 73 20 72 65 74 75 72 6e 65 64 20 62 79 20   is returned by 
28f60 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
28f70 65 43 6c 65 61 6e 28 29 20 69 73 20 6e 6f 74 20  eClean() is not 
28f80 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  called..*/.stati
28f90 63 20 69 6e 74 20 70 61 67 65 72 53 74 72 65 73  c int pagerStres
28fa0 73 28 76 6f 69 64 20 2a 70 2c 20 50 67 48 64 72  s(void *p, PgHdr
28fb0 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
28fc0 2a 70 50 61 67 65 72 20 3d 20 28 50 61 67 65 72  *pPager = (Pager
28fd0 20 2a 29 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d   *)p;.  int rc =
28fe0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
28ff0 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67  ssert( pPg->pPag
29000 65 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20 20  er==pPager );.  
29010 61 73 73 65 72 74 28 20 70 50 67 2d 3e 66 6c 61  assert( pPg->fla
29020 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 20 29  gs&PGHDR_DIRTY )
29030 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 64 6f 4e 6f  ;..  /* The doNo
29040 74 53 79 6e 63 53 70 69 6c 6c 20 66 6c 61 67 20  tSyncSpill flag 
29050 69 73 20 73 65 74 20 64 75 72 69 6e 67 20 74 69  is set during ti
29060 6d 65 73 20 77 68 65 6e 20 64 6f 69 6e 67 20 61  mes when doing a
29070 20 73 79 6e 63 20 6f 66 0a 20 20 2a 2a 20 6a 6f   sync of.  ** jo
29080 75 72 6e 61 6c 20 28 61 6e 64 20 61 64 64 69 6e  urnal (and addin
29090 67 20 61 20 6e 65 77 20 68 65 61 64 65 72 29 20  g a new header) 
290a0 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 2e 20  is not allowed. 
290b0 20 54 68 69 73 20 6f 63 63 75 72 73 0a 20 20 2a   This occurs.  *
290c0 2a 20 64 75 72 69 6e 67 20 63 61 6c 6c 73 20 74  * during calls t
290d0 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  o sqlite3PagerWr
290e0 69 74 65 28 29 20 77 68 69 6c 65 20 74 72 79 69  ite() while tryi
290f0 6e 67 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 6d 75  ng to journal mu
29100 6c 74 69 70 6c 65 0a 20 20 2a 2a 20 70 61 67 65  ltiple.  ** page
29110 73 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74  s belonging to t
29120 68 65 20 73 61 6d 65 20 73 65 63 74 6f 72 2e 0a  he same sector..
29130 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 64 6f    **.  ** The do
29140 4e 6f 74 53 70 69 6c 6c 20 66 6c 61 67 20 69 6e  NotSpill flag in
29150 68 69 62 69 74 73 20 61 6c 6c 20 63 61 63 68 65  hibits all cache
29160 20 73 70 69 6c 6c 69 6e 67 20 72 65 67 61 72 64   spilling regard
29170 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 0a  less of whether.
29180 20 20 2a 2a 20 6f 72 20 6e 6f 74 20 61 20 73 79    ** or not a sy
29190 6e 63 20 69 73 20 72 65 71 75 69 72 65 64 2e 20  nc is required. 
291a0 20 54 68 69 73 20 69 73 20 73 65 74 20 64 75 72   This is set dur
291b0 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a  ing a rollback..
291c0 20 20 2a 2a 0a 20 20 2a 2a 20 53 70 69 6c 6c 69    **.  ** Spilli
291d0 6e 67 20 69 73 20 61 6c 73 6f 20 70 72 6f 68 69  ng is also prohi
291e0 62 69 74 65 64 20 77 68 65 6e 20 69 6e 20 61 6e  bited when in an
291f0 20 65 72 72 6f 72 20 73 74 61 74 65 20 73 69 6e   error state sin
29200 63 65 20 74 68 61 74 20 63 6f 75 6c 64 0a 20 20  ce that could.  
29210 2a 2a 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62  ** lead to datab
29220 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20  ase corruption. 
29230 20 20 49 6e 20 74 68 65 20 63 75 72 72 65 6e 74    In the current
29240 20 69 6d 70 6c 65 6d 65 6e 74 61 74 6f 6e 20 69   implementaton i
29250 74 20 0a 20 20 2a 2a 20 69 73 20 69 6d 70 6f 73  t .  ** is impos
29260 73 69 62 6c 65 20 66 6f 72 20 73 71 6c 69 74 65  sible for sqlite
29270 33 50 63 61 63 68 65 46 65 74 63 68 28 29 20 74  3PcacheFetch() t
29280 6f 20 62 65 20 63 61 6c 6c 65 64 20 77 69 74 68  o be called with
29290 20 63 72 65 61 74 65 46 6c 61 67 3d 3d 31 0a 20   createFlag==1. 
292a0 20 2a 2a 20 77 68 69 6c 65 20 69 6e 20 74 68 65   ** while in the
292b0 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 68 65   error state, he
292c0 6e 63 65 20 69 74 20 69 73 20 69 6d 70 6f 73 73  nce it is imposs
292d0 69 62 6c 65 20 66 6f 72 20 74 68 69 73 20 72 6f  ible for this ro
292e0 75 74 69 6e 65 20 74 6f 0a 20 20 2a 2a 20 62 65  utine to.  ** be
292f0 20 63 61 6c 6c 65 64 20 69 6e 20 74 68 65 20 65   called in the e
29300 72 72 6f 72 20 73 74 61 74 65 2e 20 20 4e 65 76  rror state.  Nev
29310 65 72 74 68 65 6c 65 73 73 2c 20 77 65 20 69 6e  ertheless, we in
29320 63 6c 75 64 65 20 61 20 4e 45 56 45 52 28 29 0a  clude a NEVER().
29330 20 20 2a 2a 20 74 65 73 74 20 66 6f 72 20 74 68    ** test for th
29340 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 61 73  e error state as
29350 20 61 20 73 61 66 65 67 75 61 72 64 20 61 67 61   a safeguard aga
29360 69 6e 73 74 20 66 75 74 75 72 65 20 63 68 61 6e  inst future chan
29370 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ges..  */.  if( 
29380 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e 65 72  NEVER(pPager->er
29390 72 43 6f 64 65 29 20 29 20 72 65 74 75 72 6e 20  rCode) ) return 
293a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
293b0 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70   pPager->doNotSp
293c0 69 6c 6c 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ill ) return SQL
293d0 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50  ITE_OK;.  if( pP
293e0 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 53  ager->doNotSyncS
293f0 70 69 6c 6c 20 26 26 20 28 70 50 67 2d 3e 66 6c  pill && (pPg->fl
29400 61 67 73 20 26 20 50 47 48 44 52 5f 4e 45 45 44  ags & PGHDR_NEED
29410 5f 53 59 4e 43 29 21 3d 30 20 29 7b 0a 20 20 20  _SYNC)!=0 ){.   
29420 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
29430 4b 3b 0a 20 20 7d 0a 0a 20 20 70 50 67 2d 3e 70  K;.  }..  pPg->p
29440 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 69 66 28  Dirty = 0;.  if(
29450 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
29460 67 65 72 29 20 29 7b 0a 20 20 20 20 2f 2a 20 57  ger) ){.    /* W
29470 72 69 74 65 20 61 20 73 69 6e 67 6c 65 20 66 72  rite a single fr
29480 61 6d 65 20 66 6f 72 20 74 68 69 73 20 70 61 67  ame for this pag
29490 65 20 74 6f 20 74 68 65 20 6c 6f 67 2e 20 2a 2f  e to the log. */
294a0 0a 20 20 20 20 69 66 28 20 73 75 62 6a 52 65 71  .    if( subjReq
294b0 75 69 72 65 73 50 61 67 65 28 70 50 67 29 20 29  uiresPage(pPg) )
294c0 7b 20 0a 20 20 20 20 20 20 72 63 20 3d 20 73 75  { .      rc = su
294d0 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70 50 67  bjournalPage(pPg
294e0 29 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ); .    }.    if
294f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
29500 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
29510 67 65 72 57 61 6c 46 72 61 6d 65 73 28 70 50 61  gerWalFrames(pPa
29520 67 65 72 2c 20 70 50 67 2c 20 30 2c 20 30 29 3b  ger, pPg, 0, 0);
29530 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
29540 20 20 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74    .    /* Sync t
29550 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
29560 69 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a  if required. */.
29570 20 20 20 20 69 66 28 20 70 50 67 2d 3e 66 6c 61      if( pPg->fla
29580 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
29590 4e 43 20 0a 20 20 20 20 20 7c 7c 20 70 50 61 67  NC .     || pPag
295a0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
295b0 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
295c0 44 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72  D.    ){.      r
295d0 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  c = syncJournal(
295e0 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20  pPager, 1);.    
295f0 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74  }.  .    /* If t
29600 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
29610 66 20 74 68 69 73 20 70 61 67 65 20 69 73 20 6c  f this page is l
29620 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 63  arger than the c
29630 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 0a 20  urrent size of. 
29640 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61     ** the databa
29650 73 65 20 69 6d 61 67 65 2c 20 69 74 20 6d 61 79  se image, it may
29660 20 6e 65 65 64 20 74 6f 20 62 65 20 77 72 69 74   need to be writ
29670 74 65 6e 20 74 6f 20 74 68 65 20 73 75 62 2d 6a  ten to the sub-j
29680 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2a 20 54  ournal..    ** T
29690 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20 74  his is because t
296a0 68 65 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72  he call to pager
296b0 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28  _write_pagelist(
296c0 29 20 62 65 6c 6f 77 20 77 69 6c 6c 20 6e 6f 74  ) below will not
296d0 0a 20 20 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79  .    ** actually
296e0 20 77 72 69 74 65 20 64 61 74 61 20 74 6f 20 74   write data to t
296f0 68 65 20 66 69 6c 65 20 69 6e 20 74 68 69 73 20  he file in this 
29700 63 61 73 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  case..    **.   
29710 20 2a 2a 20 43 6f 6e 73 69 64 65 72 20 74 68 65   ** Consider the
29720 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 71 75 65   following seque
29730 6e 63 65 20 6f 66 20 65 76 65 6e 74 73 3a 0a 20  nce of events:. 
29740 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 42     **.    **   B
29750 45 47 49 4e 3b 0a 20 20 20 20 2a 2a 20 20 20 20  EGIN;.    **    
29760 20 3c 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 58   <journal page X
29770 3e 0a 20 20 20 20 2a 2a 20 20 20 20 20 3c 6d 6f  >.    **     <mo
29780 64 69 66 79 20 70 61 67 65 20 58 3e 0a 20 20 20  dify page X>.   
29790 20 2a 2a 20 20 20 20 20 53 41 56 45 50 4f 49 4e   **     SAVEPOIN
297a0 54 20 73 70 3b 0a 20 20 20 20 2a 2a 20 20 20 20  T sp;.    **    
297b0 20 20 20 3c 73 68 72 69 6e 6b 20 64 61 74 61 62     <shrink datab
297c0 61 73 65 20 66 69 6c 65 20 74 6f 20 59 20 70 61  ase file to Y pa
297d0 67 65 73 3e 0a 20 20 20 20 2a 2a 20 20 20 20 20  ges>.    **     
297e0 20 20 70 61 67 65 72 53 74 72 65 73 73 28 70 61    pagerStress(pa
297f0 67 65 20 58 29 0a 20 20 20 20 2a 2a 20 20 20 20  ge X).    **    
29800 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70 3b   ROLLBACK TO sp;
29810 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
29820 66 20 28 58 3e 59 29 2c 20 74 68 65 6e 20 77 68  f (X>Y), then wh
29830 65 6e 20 70 61 67 65 72 53 74 72 65 73 73 20 69  en pagerStress i
29840 73 20 63 61 6c 6c 65 64 20 70 61 67 65 20 58 20  s called page X 
29850 77 69 6c 6c 20 6e 6f 74 20 62 65 20 77 72 69 74  will not be writ
29860 74 65 6e 0a 20 20 20 20 2a 2a 20 6f 75 74 20 74  ten.    ** out t
29870 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
29880 69 6c 65 2c 20 62 75 74 20 77 69 6c 6c 20 62 65  ile, but will be
29890 20 64 72 6f 70 70 65 64 20 66 72 6f 6d 20 74 68   dropped from th
298a0 65 20 63 61 63 68 65 2e 20 54 68 65 6e 2c 0a 20  e cache. Then,. 
298b0 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20     ** following 
298c0 74 68 65 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f  the "ROLLBACK TO
298d0 20 73 70 22 20 73 74 61 74 65 6d 65 6e 74 2c 20   sp" statement, 
298e0 72 65 61 64 69 6e 67 20 70 61 67 65 20 58 20 77  reading page X w
298f0 69 6c 6c 20 72 65 61 64 0a 20 20 20 20 2a 2a 20  ill read.    ** 
29900 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 64 61  data from the da
29910 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 69  tabase file. Thi
29920 73 20 77 69 6c 6c 20 62 65 20 74 68 65 20 63 6f  s will be the co
29930 70 79 20 6f 66 20 70 61 67 65 20 58 20 61 73 20  py of page X as 
29940 69 74 0a 20 20 20 20 2a 2a 20 77 61 73 20 77 68  it.    ** was wh
29950 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  en the transacti
29960 6f 6e 20 73 74 61 72 74 65 64 2c 20 6e 6f 74 20  on started, not 
29970 61 73 20 69 74 20 77 61 73 20 77 68 65 6e 20 22  as it was when "
29980 53 41 56 45 50 4f 49 4e 54 20 73 70 22 0a 20 20  SAVEPOINT sp".  
29990 20 20 2a 2a 20 77 61 73 20 65 78 65 63 75 74 65    ** was execute
299a0 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  d..    **.    **
299b0 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73   The solution is
299c0 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 63 75   to write the cu
299d0 72 72 65 6e 74 20 64 61 74 61 20 66 6f 72 20 70  rrent data for p
299e0 61 67 65 20 58 20 69 6e 74 6f 20 74 68 65 20 0a  age X into the .
299f0 20 20 20 20 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e      ** sub-journ
29a00 61 6c 20 66 69 6c 65 20 6e 6f 77 20 28 69 66 20  al file now (if 
29a10 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  it is not alread
29a20 79 20 74 68 65 72 65 29 2c 20 73 6f 20 74 68 61  y there), so tha
29a30 74 20 69 74 20 77 69 6c 6c 0a 20 20 20 20 2a 2a  t it will.    **
29a40 20 62 65 20 72 65 73 74 6f 72 65 64 20 74 6f 20   be restored to 
29a50 69 74 73 20 63 75 72 72 65 6e 74 20 76 61 6c 75  its current valu
29a60 65 20 77 68 65 6e 20 74 68 65 20 22 52 4f 4c 4c  e when the "ROLL
29a70 42 41 43 4b 20 54 4f 20 73 70 22 20 69 73 20 0a  BACK TO sp" is .
29a80 20 20 20 20 2a 2a 20 65 78 65 63 75 74 65 64 2e      ** executed.
29a90 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
29aa0 4e 45 56 45 52 28 0a 20 20 20 20 20 20 20 20 72  NEVER(.        r
29ab0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
29ac0 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72  pPg->pgno>pPager
29ad0 2d 3e 64 62 53 69 7a 65 20 26 26 20 73 75 62 6a  ->dbSize && subj
29ae0 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50 67  RequiresPage(pPg
29af0 29 0a 20 20 20 20 29 20 29 7b 0a 20 20 20 20 20  ).    ) ){.     
29b00 20 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c   rc = subjournal
29b10 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 7d  Page(pPg);.    }
29b20 0a 20 20 0a 20 20 20 20 2f 2a 20 57 72 69 74 65  .  .    /* Write
29b30 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
29b40 20 74 68 65 20 70 61 67 65 20 6f 75 74 20 74 6f   the page out to
29b50 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
29b60 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 72  le. */.    if( r
29b70 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
29b80 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
29b90 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
29ba0 4e 45 45 44 5f 53 59 4e 43 29 3d 3d 30 20 29 3b  NEED_SYNC)==0 );
29bb0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
29bc0 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74  r_write_pagelist
29bd0 28 70 50 61 67 65 72 2c 20 70 50 67 29 3b 0a 20  (pPager, pPg);. 
29be0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d     }.  }..  /* M
29bf0 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20  ark the page as 
29c00 63 6c 65 61 6e 2e 20 2a 2f 0a 20 20 69 66 28 20  clean. */.  if( 
29c10 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
29c20 0a 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28  .    PAGERTRACE(
29c30 28 22 53 54 52 45 53 53 20 25 64 20 70 61 67 65  ("STRESS %d page
29c40 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
29c50 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
29c60 6e 6f 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  no));.    sqlite
29c70 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e  3PcacheMakeClean
29c80 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  (pPg);.  }..  re
29c90 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72  turn pager_error
29ca0 28 70 50 61 67 65 72 2c 20 72 63 29 3b 20 0a 7d  (pPager, rc); .}
29cb0 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  .../*.** Allocat
29cc0 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  e and initialize
29cd0 20 61 20 6e 65 77 20 50 61 67 65 72 20 6f 62 6a   a new Pager obj
29ce0 65 63 74 20 61 6e 64 20 70 75 74 20 61 20 70 6f  ect and put a po
29cf0 69 6e 74 65 72 20 74 6f 20 69 74 0a 2a 2a 20 69  inter to it.** i
29d00 6e 20 2a 70 70 50 61 67 65 72 2e 20 54 68 65 20  n *ppPager. The 
29d10 70 61 67 65 72 20 73 68 6f 75 6c 64 20 65 76 65  pager should eve
29d20 6e 74 75 61 6c 6c 79 20 62 65 20 66 72 65 65 64  ntually be freed
29d30 20 62 79 20 70 61 73 73 69 6e 67 20 69 74 0a 2a   by passing it.*
29d40 2a 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65  * to sqlite3Page
29d50 72 43 6c 6f 73 65 28 29 2e 0a 2a 2a 0a 2a 2a 20  rClose()..**.** 
29d60 54 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20 61 72  The zFilename ar
29d70 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 70 61  gument is the pa
29d80 74 68 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  th to the databa
29d90 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 2e  se file to open.
29da0 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65  .** If zFilename
29db0 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61 20   is NULL then a 
29dc0 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74  randomly-named t
29dd0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73  emporary file is
29de0 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20   created.** and 
29df0 75 73 65 64 20 61 73 20 74 68 65 20 66 69 6c 65  used as the file
29e00 20 74 6f 20 62 65 20 63 61 63 68 65 64 2e 20 54   to be cached. T
29e10 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20 61  emporary files a
29e20 72 65 20 62 65 20 64 65 6c 65 74 65 64 0a 2a 2a  re be deleted.**
29e30 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77   automatically w
29e40 68 65 6e 20 74 68 65 79 20 61 72 65 20 63 6c 6f  hen they are clo
29e50 73 65 64 2e 20 49 66 20 7a 46 69 6c 65 6e 61 6d  sed. If zFilenam
29e60 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20  e is ":memory:" 
29e70 74 68 65 6e 20 0a 2a 2a 20 61 6c 6c 20 69 6e 66  then .** all inf
29e80 6f 72 6d 61 74 69 6f 6e 20 69 73 20 68 65 6c 64  ormation is held
29e90 20 69 6e 20 63 61 63 68 65 2e 20 49 74 20 69 73   in cache. It is
29ea0 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20 74   never written t
29eb0 6f 20 64 69 73 6b 2e 20 0a 2a 2a 20 54 68 69 73  o disk. .** This
29ec0 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20   can be used to 
29ed0 69 6d 70 6c 65 6d 65 6e 74 20 61 6e 20 69 6e 2d  implement an in-
29ee0 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e  memory database.
29ef0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 45 78 74 72  .**.** The nExtr
29f00 61 20 70 61 72 61 6d 65 74 65 72 20 73 70 65 63  a parameter spec
29f10 69 66 69 65 73 20 74 68 65 20 6e 75 6d 62 65 72  ifies the number
29f20 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61   of bytes of spa
29f30 63 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20  ce allocated.** 
29f40 61 6c 6f 6e 67 20 77 69 74 68 20 65 61 63 68 20  along with each 
29f50 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e 20  page reference. 
29f60 54 68 69 73 20 73 70 61 63 65 20 69 73 20 61 76  This space is av
29f70 61 69 6c 61 62 6c 65 20 74 6f 20 74 68 65 20 75  ailable to the u
29f80 73 65 72 0a 2a 2a 20 76 69 61 20 74 68 65 20 73  ser.** via the s
29f90 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
29fa0 74 72 61 28 29 20 41 50 49 2e 0a 2a 2a 0a 2a 2a  tra() API..**.**
29fb0 20 54 68 65 20 66 6c 61 67 73 20 61 72 67 75 6d   The flags argum
29fc0 65 6e 74 20 69 73 20 75 73 65 64 20 74 6f 20 73  ent is used to s
29fd0 70 65 63 69 66 79 20 70 72 6f 70 65 72 74 69 65  pecify propertie
29fe0 73 20 74 68 61 74 20 61 66 66 65 63 74 20 74 68  s that affect th
29ff0 65 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 6f  e.** operation o
2a000 66 20 74 68 65 20 70 61 67 65 72 2e 20 49 74 20  f the pager. It 
2a010 73 68 6f 75 6c 64 20 62 65 20 70 61 73 73 65 64  should be passed
2a020 20 73 6f 6d 65 20 62 69 74 77 69 73 65 20 63 6f   some bitwise co
2a030 6d 62 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20  mbination.** of 
2a040 74 68 65 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a  the PAGER_OMIT_J
2a050 4f 55 52 4e 41 4c 20 61 6e 64 20 50 41 47 45 52  OURNAL and PAGER
2a060 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 20 66 6c 61  _NO_READLOCK fla
2a070 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 66  gs..**.** The vf
2a080 73 46 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72  sFlags parameter
2a090 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20 74 6f   is a bitmask to
2a0a0 20 70 61 73 73 20 74 6f 20 74 68 65 20 66 6c 61   pass to the fla
2a0b0 67 73 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20  gs parameter.** 
2a0c0 6f 66 20 74 68 65 20 78 4f 70 65 6e 28 29 20 6d  of the xOpen() m
2a0d0 65 74 68 6f 64 20 6f 66 20 74 68 65 20 73 75 70  ethod of the sup
2a0e0 70 6c 69 65 64 20 56 46 53 20 77 68 65 6e 20 6f  plied VFS when o
2a0f0 70 65 6e 69 6e 67 20 66 69 6c 65 73 2e 20 0a 2a  pening files. .*
2a100 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
2a110 72 20 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f  r object is allo
2a120 63 61 74 65 64 20 61 6e 64 20 74 68 65 20 73 70  cated and the sp
2a130 65 63 69 66 69 65 64 20 66 69 6c 65 20 6f 70 65  ecified file ope
2a140 6e 65 64 20 0a 2a 2a 20 73 75 63 63 65 73 73 66  ned .** successf
2a150 75 6c 6c 79 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  ully, SQLITE_OK 
2a160 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
2a170 2a 70 70 50 61 67 65 72 20 73 65 74 20 74 6f 20  *ppPager set to 
2a180 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20  point to.** the 
2a190 6e 65 77 20 70 61 67 65 72 20 6f 62 6a 65 63 74  new pager object
2a1a0 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
2a1b0 63 75 72 73 2c 20 2a 70 70 50 61 67 65 72 20 69  curs, *ppPager i
2a1c0 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a 2a  s set to NULL.**
2a1d0 20 61 6e 64 20 65 72 72 6f 72 20 63 6f 64 65 20   and error code 
2a1e0 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73 20 66  returned. This f
2a1f0 75 6e 63 74 69 6f 6e 20 6d 61 79 20 72 65 74 75  unction may retu
2a200 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a  rn SQLITE_NOMEM.
2a210 2a 2a 20 28 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  ** (sqlite3Mallo
2a220 63 28 29 20 69 73 20 75 73 65 64 20 74 6f 20 61  c() is used to a
2a230 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 29 2c  llocate memory),
2a240 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
2a250 20 6f 72 20 0a 2a 2a 20 76 61 72 69 6f 75 73 20   or .** various 
2a260 53 51 4c 49 54 45 5f 49 4f 5f 58 58 58 20 65 72  SQLITE_IO_XXX er
2a270 72 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rors..*/.int sql
2a280 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28 0a 20  ite3PagerOpen(. 
2a290 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
2a2a0 66 73 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  fs,       /* The
2a2b0 20 76 69 72 74 75 61 6c 20 66 69 6c 65 20 73 79   virtual file sy
2a2c0 73 74 65 6d 20 74 6f 20 75 73 65 20 2a 2f 0a 20  stem to use */. 
2a2d0 20 50 61 67 65 72 20 2a 2a 70 70 50 61 67 65 72   Pager **ppPager
2a2e0 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54  ,         /* OUT
2a2f0 3a 20 52 65 74 75 72 6e 20 74 68 65 20 50 61 67  : Return the Pag
2a300 65 72 20 73 74 72 75 63 74 75 72 65 20 68 65 72  er structure her
2a310 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
2a320 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20  r *zFilename,   
2a330 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
2a340 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
2a350 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  open */.  int nE
2a360 78 74 72 61 2c 20 20 20 20 20 20 20 20 20 20 20  xtra,           
2a370 20 20 20 2f 2a 20 45 78 74 72 61 20 62 79 74 65     /* Extra byte
2a380 73 20 61 70 70 65 6e 64 20 74 6f 20 65 61 63 68  s append to each
2a390 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20   in-memory page 
2a3a0 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
2a3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a3c0 20 66 6c 61 67 73 20 63 6f 6e 74 72 6f 6c 6c 69   flags controlli
2a3d0 6e 67 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a  ng this file */.
2a3e0 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73 2c 20    int vfsFlags, 
2a3f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c             /* fl
2a400 61 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75  ags passed throu
2a410 67 68 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 66  gh to sqlite3_vf
2a420 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 76  s.xOpen() */.  v
2a430 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 29 28 44  oid (*xReinit)(D
2a440 62 50 61 67 65 2a 29 20 2f 2a 20 46 75 6e 63 74  bPage*) /* Funct
2a450 69 6f 6e 20 74 6f 20 72 65 69 6e 69 74 69 61 6c  ion to reinitial
2a460 69 7a 65 20 70 61 67 65 73 20 2a 2f 0a 29 7b 0a  ize pages */.){.
2a470 20 20 75 38 20 2a 70 50 74 72 3b 0a 20 20 50 61    u8 *pPtr;.  Pa
2a480 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 30 3b  ger *pPager = 0;
2a490 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20         /* Pager 
2a4a0 6f 62 6a 65 63 74 20 74 6f 20 61 6c 6c 6f 63 61  object to alloca
2a4b0 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f  te and return */
2a4c0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2a4d0 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52  TE_OK;      /* R
2a4e0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
2a4f0 69 6e 74 20 74 65 6d 70 46 69 6c 65 20 3d 20 30  int tempFile = 0
2a500 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ;        /* True
2a510 20 66 6f 72 20 74 65 6d 70 20 66 69 6c 65 73 20   for temp files 
2a520 28 69 6e 63 6c 2e 20 69 6e 2d 6d 65 6d 6f 72 79  (incl. in-memory
2a530 20 66 69 6c 65 73 29 20 2a 2f 0a 20 20 69 6e 74   files) */.  int
2a540 20 6d 65 6d 44 62 20 3d 20 30 3b 20 20 20 20 20   memDb = 0;     
2a550 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2a560 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d   this is an in-m
2a570 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20  emory file */.  
2a580 69 6e 74 20 72 65 61 64 4f 6e 6c 79 20 3d 20 30  int readOnly = 0
2a590 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ;        /* True
2a5a0 20 69 66 20 74 68 69 73 20 69 73 20 61 20 72 65   if this is a re
2a5b0 61 64 2d 6f 6e 6c 79 20 66 69 6c 65 20 2a 2f 0a  ad-only file */.
2a5c0 20 20 69 6e 74 20 6a 6f 75 72 6e 61 6c 46 69 6c    int journalFil
2a5d0 65 53 69 7a 65 3b 20 20 20 20 20 2f 2a 20 42 79  eSize;     /* By
2a5e0 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  tes to allocate 
2a5f0 66 6f 72 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c  for each journal
2a600 20 66 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a   fd */.  char *z
2a610 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 20 20 20  Pathname = 0;   
2a620 20 20 2f 2a 20 46 75 6c 6c 20 70 61 74 68 20 74    /* Full path t
2a630 6f 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  o database file 
2a640 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 74 68 6e 61  */.  int nPathna
2a650 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  me = 0;       /*
2a660 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
2a670 20 69 6e 20 7a 50 61 74 68 6e 61 6d 65 20 2a 2f   in zPathname */
2a680 0a 20 20 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61  .  int useJourna
2a690 6c 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47  l = (flags & PAG
2a6a0 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29  ER_OMIT_JOURNAL)
2a6b0 3d 3d 30 3b 20 2f 2a 20 46 61 6c 73 65 20 74 6f  ==0; /* False to
2a6c0 20 6f 6d 69 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f   omit journal */
2a6d0 0a 20 20 69 6e 74 20 6e 6f 52 65 61 64 6c 6f 63  .  int noReadloc
2a6e0 6b 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47  k = (flags & PAG
2a6f0 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 29 21  ER_NO_READLOCK)!
2a700 3d 30 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20  =0;  /* True to 
2a710 6f 6d 69 74 20 72 65 61 64 2d 6c 6f 63 6b 20 2a  omit read-lock *
2a720 2f 0a 20 20 69 6e 74 20 70 63 61 63 68 65 53 69  /.  int pcacheSi
2a730 7a 65 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  ze = sqlite3Pcac
2a740 68 65 53 69 7a 65 28 29 3b 20 20 20 20 20 20 20  heSize();       
2a750 2f 2a 20 42 79 74 65 73 20 74 6f 20 61 6c 6c 6f  /* Bytes to allo
2a760 63 61 74 65 20 66 6f 72 20 50 43 61 63 68 65 20  cate for PCache 
2a770 2a 2f 0a 20 20 75 33 32 20 73 7a 50 61 67 65 44  */.  u32 szPageD
2a780 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f 44 45 46  flt = SQLITE_DEF
2a790 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20  AULT_PAGE_SIZE; 
2a7a0 20 2f 2a 20 44 65 66 61 75 6c 74 20 70 61 67 65   /* Default page
2a7b0 20 73 69 7a 65 20 2a 2f 0a 20 20 63 6f 6e 73 74   size */.  const
2a7c0 20 63 68 61 72 20 2a 7a 55 72 69 20 3d 20 30 3b   char *zUri = 0;
2a7d0 20 20 20 20 2f 2a 20 55 52 49 20 61 72 67 73 20      /* URI args 
2a7e0 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74  to copy */.  int
2a7f0 20 6e 55 72 69 20 3d 20 30 3b 20 20 20 20 20 20   nUri = 0;      
2a800 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2a810 6f 66 20 62 79 74 65 73 20 6f 66 20 55 52 49 20  of bytes of URI 
2a820 61 72 67 73 20 61 74 20 2a 7a 55 72 69 20 2a 2f  args at *zUri */
2a830 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
2a840 74 20 68 6f 77 20 6d 75 63 68 20 73 70 61 63 65  t how much space
2a850 20 69 73 20 72 65 71 75 69 72 65 64 20 66 6f 72   is required for
2a860 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20 66 69   each journal fi
2a870 6c 65 2d 68 61 6e 64 6c 65 0a 20 20 2a 2a 20 28  le-handle.  ** (
2a880 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 6f 66  there are two of
2a890 20 74 68 65 6d 2c 20 74 68 65 20 6d 61 69 6e 20   them, the main 
2a8a0 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 65 20  journal and the 
2a8b0 73 75 62 2d 6a 6f 75 72 6e 61 6c 29 2e 20 54 68  sub-journal). Th
2a8c0 69 73 0a 20 20 2a 2a 20 69 73 20 74 68 65 20 6d  is.  ** is the m
2a8d0 61 78 69 6d 75 6d 20 73 70 61 63 65 20 72 65 71  aximum space req
2a8e0 75 69 72 65 64 20 66 6f 72 20 61 6e 20 69 6e 2d  uired for an in-
2a8f0 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66  memory journal f
2a900 69 6c 65 20 68 61 6e 64 6c 65 20 0a 20 20 2a 2a  ile handle .  **
2a910 20 61 6e 64 20 61 20 72 65 67 75 6c 61 72 20 6a   and a regular j
2a920 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 68 61 6e 64  ournal file-hand
2a930 6c 65 2e 20 4e 6f 74 65 20 74 68 61 74 20 61 20  le. Note that a 
2a940 22 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c  "regular journal
2a950 2d 68 61 6e 64 6c 65 22 0a 20 20 2a 2a 20 6d 61  -handle".  ** ma
2a960 79 20 62 65 20 61 20 77 72 61 70 70 65 72 20 63  y be a wrapper c
2a970 61 70 61 62 6c 65 20 6f 66 20 63 61 63 68 69 6e  apable of cachin
2a980 67 20 74 68 65 20 66 69 72 73 74 20 70 6f 72 74  g the first port
2a990 69 6f 6e 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ion of the journ
2a9a0 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69 6e 20  al.  ** file in 
2a9b0 6d 65 6d 6f 72 79 20 74 6f 20 69 6d 70 6c 65 6d  memory to implem
2a9c0 65 6e 74 20 74 68 65 20 61 74 6f 6d 69 63 2d 77  ent the atomic-w
2a9d0 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  rite optimizatio
2a9e0 6e 20 28 73 65 65 20 0a 20 20 2a 2a 20 73 6f 75  n (see .  ** sou
2a9f0 72 63 65 20 66 69 6c 65 20 6a 6f 75 72 6e 61 6c  rce file journal
2aa00 2e 63 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  .c)..  */.  if( 
2aa10 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 53 69  sqlite3JournalSi
2aa20 7a 65 28 70 56 66 73 29 3e 73 71 6c 69 74 65 33  ze(pVfs)>sqlite3
2aa30 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 29  MemJournalSize()
2aa40 20 29 7b 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46   ){.    journalF
2aa50 69 6c 65 53 69 7a 65 20 3d 20 52 4f 55 4e 44 38  ileSize = ROUND8
2aa60 28 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 53  (sqlite3JournalS
2aa70 69 7a 65 28 70 56 66 73 29 29 3b 0a 20 20 7d 65  ize(pVfs));.  }e
2aa80 6c 73 65 7b 0a 20 20 20 20 6a 6f 75 72 6e 61 6c  lse{.    journal
2aa90 46 69 6c 65 53 69 7a 65 20 3d 20 52 4f 55 4e 44  FileSize = ROUND
2aaa0 38 28 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72  8(sqlite3MemJour
2aab0 6e 61 6c 53 69 7a 65 28 29 29 3b 0a 20 20 7d 0a  nalSize());.  }.
2aac0 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6f 75  .  /* Set the ou
2aad0 74 70 75 74 20 76 61 72 69 61 62 6c 65 20 74 6f  tput variable to
2aae0 20 4e 55 4c 4c 20 69 6e 20 63 61 73 65 20 61 6e   NULL in case an
2aaf0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 2a   error occurs. *
2ab00 2f 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20 30  /.  *ppPager = 0
2ab10 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
2ab20 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a  E_OMIT_MEMORYDB.
2ab30 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 50 41    if( flags & PA
2ab40 47 45 52 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20  GER_MEMORY ){.  
2ab50 20 20 6d 65 6d 44 62 20 3d 20 31 3b 0a 20 20 20    memDb = 1;.   
2ab60 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a   zFilename = 0;.
2ab70 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
2ab80 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 73 74 6f   Compute and sto
2ab90 72 65 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68  re the full path
2aba0 6e 61 6d 65 20 69 6e 20 61 6e 20 61 6c 6c 6f 63  name in an alloc
2abb0 61 74 65 64 20 62 75 66 66 65 72 20 70 6f 69 6e  ated buffer poin
2abc0 74 65 64 0a 20 20 2a 2a 20 74 6f 20 62 79 20 7a  ted.  ** to by z
2abd0 50 61 74 68 6e 61 6d 65 2c 20 6c 65 6e 67 74 68  Pathname, length
2abe0 20 6e 50 61 74 68 6e 61 6d 65 2e 20 4f 72 2c 20   nPathname. Or, 
2abf0 69 66 20 74 68 69 73 20 69 73 20 61 20 74 65 6d  if this is a tem
2ac00 70 6f 72 61 72 79 20 66 69 6c 65 2c 0a 20 20 2a  porary file,.  *
2ac10 2a 20 6c 65 61 76 65 20 62 6f 74 68 20 6e 50 61  * leave both nPa
2ac20 74 68 6e 61 6d 65 20 61 6e 64 20 7a 50 61 74 68  thname and zPath
2ac30 6e 61 6d 65 20 73 65 74 20 74 6f 20 30 2e 0a 20  name set to 0.. 
2ac40 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e   */.  if( zFilen
2ac50 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65  ame && zFilename
2ac60 5b 30 5d 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  [0] ){.    const
2ac70 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 6e 50   char *z;.    nP
2ac80 61 74 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e  athname = pVfs->
2ac90 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20  mxPathname+1;.  
2aca0 20 20 7a 50 61 74 68 6e 61 6d 65 20 3d 20 73 71    zPathname = sq
2acb0 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 50 61 74  lite3Malloc(nPat
2acc0 68 6e 61 6d 65 2a 32 29 3b 0a 20 20 20 20 69 66  hname*2);.    if
2acd0 28 20 7a 50 61 74 68 6e 61 6d 65 3d 3d 30 20 29  ( zPathname==0 )
2ace0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
2acf0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
2ad00 20 7d 0a 20 20 20 20 7a 50 61 74 68 6e 61 6d 65   }.    zPathname
2ad10 5b 30 5d 20 3d 20 30 3b 20 2f 2a 20 4d 61 6b 65  [0] = 0; /* Make
2ad20 20 73 75 72 65 20 69 6e 69 74 69 61 6c 69 7a 65   sure initialize
2ad30 64 20 65 76 65 6e 20 69 66 20 46 75 6c 6c 50 61  d even if FullPa
2ad40 74 68 6e 61 6d 65 28 29 20 66 61 69 6c 73 20 2a  thname() fails *
2ad50 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
2ad60 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65  e3OsFullPathname
2ad70 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65  (pVfs, zFilename
2ad80 2c 20 6e 50 61 74 68 6e 61 6d 65 2c 20 7a 50 61  , nPathname, zPa
2ad90 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6e 50 61  thname);.    nPa
2ada0 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  thname = sqlite3
2adb0 53 74 72 6c 65 6e 33 30 28 7a 50 61 74 68 6e 61  Strlen30(zPathna
2adc0 6d 65 29 3b 0a 20 20 20 20 7a 20 3d 20 7a 55 72  me);.    z = zUr
2add0 69 20 3d 20 26 7a 46 69 6c 65 6e 61 6d 65 5b 73  i = &zFilename[s
2ade0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
2adf0 46 69 6c 65 6e 61 6d 65 29 2b 31 5d 3b 0a 20 20  Filename)+1];.  
2ae00 20 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20    while( *z ){. 
2ae10 20 20 20 20 20 7a 20 2b 3d 20 73 71 6c 69 74 65       z += sqlite
2ae20 33 53 74 72 6c 65 6e 33 30 28 7a 29 2b 31 3b 0a  3Strlen30(z)+1;.
2ae30 20 20 20 20 20 20 7a 20 2b 3d 20 73 71 6c 69 74        z += sqlit
2ae40 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 2b 31 3b  e3Strlen30(z)+1;
2ae50 0a 20 20 20 20 7d 0a 20 20 20 20 6e 55 72 69 20  .    }.    nUri 
2ae60 3d 20 28 69 6e 74 29 28 26 7a 5b 31 5d 20 2d 20  = (int)(&z[1] - 
2ae70 7a 55 72 69 29 3b 0a 20 20 20 20 61 73 73 65 72  zUri);.    asser
2ae80 74 28 20 6e 55 72 69 3e 3d 30 20 29 3b 0a 20 20  t( nUri>=0 );.  
2ae90 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2aea0 5f 4f 4b 20 26 26 20 6e 50 61 74 68 6e 61 6d 65  _OK && nPathname
2aeb0 2b 38 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  +8>pVfs->mxPathn
2aec0 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ame ){.      /* 
2aed0 54 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 74  This branch is t
2aee0 61 6b 65 6e 20 77 68 65 6e 20 74 68 65 20 6a 6f  aken when the jo
2aef0 75 72 6e 61 6c 20 70 61 74 68 20 72 65 71 75 69  urnal path requi
2af00 72 65 64 20 62 79 0a 20 20 20 20 20 20 2a 2a 20  red by.      ** 
2af10 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65 69  the database bei
2af20 6e 67 20 6f 70 65 6e 65 64 20 77 69 6c 6c 20 62  ng opened will b
2af30 65 20 6d 6f 72 65 20 74 68 61 6e 20 70 56 66 73  e more than pVfs
2af40 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 0a 20 20 20  ->mxPathname.   
2af50 20 20 20 2a 2a 20 62 79 74 65 73 20 69 6e 20 6c     ** bytes in l
2af60 65 6e 67 74 68 2e 20 54 68 69 73 20 6d 65 61 6e  ength. This mean
2af70 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  s the database c
2af80 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64 2c  annot be opened,
2af90 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 69 74 20  .      ** as it 
2afa0 77 69 6c 6c 20 6e 6f 74 20 62 65 20 70 6f 73 73  will not be poss
2afb0 69 62 6c 65 20 74 6f 20 6f 70 65 6e 20 74 68 65  ible to open the
2afc0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72   journal file or
2afd0 20 65 76 65 6e 0a 20 20 20 20 20 20 2a 2a 20 63   even.      ** c
2afe0 68 65 63 6b 20 66 6f 72 20 61 20 68 6f 74 2d 6a  heck for a hot-j
2aff0 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 72 65  ournal before re
2b000 61 64 69 6e 67 2e 0a 20 20 20 20 20 20 2a 2f 0a  ading..      */.
2b010 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2b020 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b  E_CANTOPEN_BKPT;
2b030 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
2b040 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2b050 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
2b060 65 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20  ee(zPathname);. 
2b070 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
2b080 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
2b090 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20  Allocate memory 
2b0a0 66 6f 72 20 74 68 65 20 50 61 67 65 72 20 73 74  for the Pager st
2b0b0 72 75 63 74 75 72 65 2c 20 50 43 61 63 68 65 20  ructure, PCache 
2b0c0 6f 62 6a 65 63 74 2c 20 74 68 65 0a 20 20 2a 2a  object, the.  **
2b0d0 20 74 68 72 65 65 20 66 69 6c 65 20 64 65 73 63   three file desc
2b0e0 72 69 70 74 6f 72 73 2c 20 74 68 65 20 64 61 74  riptors, the dat
2b0f0 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20  abase file name 
2b100 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  and the journal 
2b110 0a 20 20 2a 2a 20 66 69 6c 65 20 6e 61 6d 65 2e  .  ** file name.
2b120 20 54 68 65 20 6c 61 79 6f 75 74 20 69 6e 20 6d   The layout in m
2b130 65 6d 6f 72 79 20 69 73 20 61 73 20 66 6f 6c 6c  emory is as foll
2b140 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ows:.  **.  **  
2b150 20 20 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20     Pager object 
2b160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b170 20 20 20 28 73 69 7a 65 6f 66 28 50 61 67 65 72     (sizeof(Pager
2b180 29 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20  ) bytes).  **   
2b190 20 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 20    PCache object 
2b1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b1b0 20 20 28 73 71 6c 69 74 65 33 50 63 61 63 68 65    (sqlite3Pcache
2b1c0 53 69 7a 65 28 29 20 62 79 74 65 73 29 0a 20 20  Size() bytes).  
2b1d0 2a 2a 20 20 20 20 20 44 61 74 61 62 61 73 65 20  **     Database 
2b1e0 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20  file handle     
2b1f0 20 20 20 20 20 20 20 28 70 56 66 73 2d 3e 73 7a         (pVfs->sz
2b200 4f 73 46 69 6c 65 20 62 79 74 65 73 29 0a 20 20  OsFile bytes).  
2b210 2a 2a 20 20 20 20 20 53 75 62 2d 6a 6f 75 72 6e  **     Sub-journ
2b220 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20  al file handle  
2b230 20 20 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c 46         (journalF
2b240 69 6c 65 53 69 7a 65 20 62 79 74 65 73 29 0a 20  ileSize bytes). 
2b250 20 2a 2a 20 20 20 20 20 4d 61 69 6e 20 6a 6f 75   **     Main jou
2b260 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65  rnal file handle
2b270 20 20 20 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c          (journal
2b280 46 69 6c 65 53 69 7a 65 20 62 79 74 65 73 29 0a  FileSize bytes).
2b290 20 20 2a 2a 20 20 20 20 20 44 61 74 61 62 61 73    **     Databas
2b2a0 65 20 66 69 6c 65 20 6e 61 6d 65 20 20 20 20 20  e file name     
2b2b0 20 20 20 20 20 20 20 20 20 28 6e 50 61 74 68 6e           (nPathn
2b2c0 61 6d 65 2b 31 20 62 79 74 65 73 29 0a 20 20 2a  ame+1 bytes).  *
2b2d0 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69  *     Journal fi
2b2e0 6c 65 20 6e 61 6d 65 20 20 20 20 20 20 20 20 20  le name         
2b2f0 20 20 20 20 20 20 28 6e 50 61 74 68 6e 61 6d 65        (nPathname
2b300 2b 38 2b 31 20 62 79 74 65 73 29 0a 20 20 2a 2f  +8+1 bytes).  */
2b310 0a 20 20 70 50 74 72 20 3d 20 28 75 38 20 2a 29  .  pPtr = (u8 *)
2b320 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
2b330 6f 28 0a 20 20 20 20 52 4f 55 4e 44 38 28 73 69  o(.    ROUND8(si
2b340 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 29 20 2b  zeof(*pPager)) +
2b350 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 73        /* Pager s
2b360 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20  tructure */.    
2b370 52 4f 55 4e 44 38 28 70 63 61 63 68 65 53 69 7a  ROUND8(pcacheSiz
2b380 65 29 20 2b 20 20 20 20 20 20 20 20 20 20 20 2f  e) +           /
2b390 2a 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 20  * PCache object 
2b3a0 2a 2f 0a 20 20 20 20 52 4f 55 4e 44 38 28 70 56  */.    ROUND8(pV
2b3b0 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 20 2b 20  fs->szOsFile) + 
2b3c0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69        /* The mai
2b3d0 6e 20 64 62 20 66 69 6c 65 20 2a 2f 0a 20 20 20  n db file */.   
2b3e0 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65   journalFileSize
2b3f0 20 2a 20 32 20 2b 20 20 20 20 20 20 20 20 20 20   * 2 +          
2b400 2f 2a 20 54 68 65 20 74 77 6f 20 6a 6f 75 72 6e  /* The two journ
2b410 61 6c 20 66 69 6c 65 73 20 2a 2f 20 0a 20 20 20  al files */ .   
2b420 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31 20 2b   nPathname + 1 +
2b430 20 6e 55 72 69 20 2b 20 20 20 20 20 20 20 20 20   nUri +         
2b440 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 2a 2f 0a  /* zFilename */.
2b450 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20      nPathname + 
2b460 38 20 2b 20 31 20 20 20 20 20 20 20 20 20 20 20  8 + 1           
2b470 20 20 20 2f 2a 20 7a 4a 6f 75 72 6e 61 6c 20 2a     /* zJournal *
2b480 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
2b490 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 2b 20  _OMIT_WAL.    + 
2b4a0 6e 50 61 74 68 6e 61 6d 65 20 2b 20 34 20 2b 20  nPathname + 4 + 
2b4b0 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  1              /
2b4c0 2a 20 7a 57 61 6c 20 2a 2f 0a 23 65 6e 64 69 66  * zWal */.#endif
2b4d0 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  .  );.  assert( 
2b4e0 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e  EIGHT_BYTE_ALIGN
2b4f0 4d 45 4e 54 28 53 51 4c 49 54 45 5f 49 4e 54 5f  MENT(SQLITE_INT_
2b500 54 4f 5f 50 54 52 28 6a 6f 75 72 6e 61 6c 46 69  TO_PTR(journalFi
2b510 6c 65 53 69 7a 65 29 29 20 29 3b 0a 20 20 69 66  leSize)) );.  if
2b520 28 20 21 70 50 74 72 20 29 7b 0a 20 20 20 20 73  ( !pPtr ){.    s
2b530 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61 74  qlite3_free(zPat
2b540 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75  hname);.    retu
2b550 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
2b560 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 20 3d 20  .  }.  pPager = 
2b570 20 20 20 20 20 20 20 20 20 20 20 20 20 28 50 61               (Pa
2b580 67 65 72 2a 29 28 70 50 74 72 29 3b 0a 20 20 70  ger*)(pPtr);.  p
2b590 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 20 3d  Pager->pPCache =
2b5a0 20 20 20 20 28 50 43 61 63 68 65 2a 29 28 70 50      (PCache*)(pP
2b5b0 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 73 69 7a  tr += ROUND8(siz
2b5c0 65 6f 66 28 2a 70 50 61 67 65 72 29 29 29 3b 0a  eof(*pPager)));.
2b5d0 20 20 70 50 61 67 65 72 2d 3e 66 64 20 3d 20 20    pPager->fd =  
2b5e0 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29   (sqlite3_file*)
2b5f0 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28  (pPtr += ROUND8(
2b600 70 63 61 63 68 65 53 69 7a 65 29 29 3b 0a 20 20  pcacheSize));.  
2b610 70 50 61 67 65 72 2d 3e 73 6a 66 64 20 3d 20 28  pPager->sjfd = (
2b620 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70  sqlite3_file*)(p
2b630 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 70 56  Ptr += ROUND8(pV
2b640 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 29 3b 0a  fs->szOsFile));.
2b650 20 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3d 20    pPager->jfd = 
2b660 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29   (sqlite3_file*)
2b670 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c  (pPtr += journal
2b680 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50 61  FileSize);.  pPa
2b690 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d  ger->zFilename =
2b6a0 20 20 20 20 28 63 68 61 72 2a 29 28 70 50 74 72      (char*)(pPtr
2b6b0 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53   += journalFileS
2b6c0 69 7a 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ize);.  assert( 
2b6d0 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e  EIGHT_BYTE_ALIGN
2b6e0 4d 45 4e 54 28 70 50 61 67 65 72 2d 3e 6a 66 64  MENT(pPager->jfd
2b6f0 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20  ) );..  /* Fill 
2b700 69 6e 20 74 68 65 20 50 61 67 65 72 2e 7a 46 69  in the Pager.zFi
2b710 6c 65 6e 61 6d 65 20 61 6e 64 20 50 61 67 65 72  lename and Pager
2b720 2e 7a 4a 6f 75 72 6e 61 6c 20 62 75 66 66 65 72  .zJournal buffer
2b730 73 2c 20 69 66 20 72 65 71 75 69 72 65 64 2e 20  s, if required. 
2b740 2a 2f 0a 20 20 69 66 28 20 7a 50 61 74 68 6e 61  */.  if( zPathna
2b750 6d 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  me ){.    assert
2b760 28 20 6e 50 61 74 68 6e 61 6d 65 3e 30 20 29 3b  ( nPathname>0 );
2b770 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  .    pPager->zJo
2b780 75 72 6e 61 6c 20 3d 20 20 20 28 63 68 61 72 2a  urnal =   (char*
2b790 29 28 70 50 74 72 20 2b 3d 20 6e 50 61 74 68 6e  )(pPtr += nPathn
2b7a0 61 6d 65 20 2b 20 31 20 2b 20 6e 55 72 69 29 3b  ame + 1 + nUri);
2b7b0 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67  .    memcpy(pPag
2b7c0 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a  er->zFilename, z
2b7d0 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e  Pathname, nPathn
2b7e0 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  ame);.    memcpy
2b7f0 28 26 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  (&pPager->zFilen
2b800 61 6d 65 5b 6e 50 61 74 68 6e 61 6d 65 2b 31 5d  ame[nPathname+1]
2b810 2c 20 7a 55 72 69 2c 20 6e 55 72 69 29 3b 0a 20  , zUri, nUri);. 
2b820 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72     memcpy(pPager
2b830 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 50 61 74  ->zJournal, zPat
2b840 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65  hname, nPathname
2b850 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70  );.    memcpy(&p
2b860 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b  Pager->zJournal[
2b870 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 6a 6f  nPathname], "-jo
2b880 75 72 6e 61 6c 22 2c 20 38 29 3b 0a 20 20 20 20  urnal", 8);.    
2b890 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69  sqlite3FileSuffi
2b8a0 78 33 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  x3(pPager->zFile
2b8b0 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  name, pPager->zJ
2b8c0 6f 75 72 6e 61 6c 29 3b 0a 23 69 66 6e 64 65 66  ournal);.#ifndef
2b8d0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
2b8e0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 57 61  .    pPager->zWa
2b8f0 6c 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a 4a 6f  l = &pPager->zJo
2b900 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 2b  urnal[nPathname+
2b910 38 2b 31 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79  8+1];.    memcpy
2b920 28 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 7a  (pPager->zWal, z
2b930 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e  Pathname, nPathn
2b940 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  ame);.    memcpy
2b950 28 26 70 50 61 67 65 72 2d 3e 7a 57 61 6c 5b 6e  (&pPager->zWal[n
2b960 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 77 61 6c  Pathname], "-wal
2b970 22 2c 20 34 29 3b 0a 20 20 20 20 73 71 6c 69 74  ", 4);.    sqlit
2b980 65 33 46 69 6c 65 53 75 66 66 69 78 33 28 70 50  e3FileSuffix3(pP
2b990 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  ager->zFilename,
2b9a0 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 29 3b 0a   pPager->zWal);.
2b9b0 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74  #endif.    sqlit
2b9c0 65 33 5f 66 72 65 65 28 7a 50 61 74 68 6e 61 6d  e3_free(zPathnam
2b9d0 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  e);.  }.  pPager
2b9e0 2d 3e 70 56 66 73 20 3d 20 70 56 66 73 3b 0a 20  ->pVfs = pVfs;. 
2b9f0 20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67   pPager->vfsFlag
2ba00 73 20 3d 20 76 66 73 46 6c 61 67 73 3b 0a 0a 20  s = vfsFlags;.. 
2ba10 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 70 61 67   /* Open the pag
2ba20 65 72 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  er file..  */.  
2ba30 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26  if( zFilename &&
2ba40 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b   zFilename[0] ){
2ba50 0a 20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20  .    int fout = 
2ba60 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
2ba70 20 20 20 20 20 20 2f 2a 20 56 46 53 20 66 6c 61        /* VFS fla
2ba80 67 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 78  gs returned by x
2ba90 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 20 20 72 63  Open() */.    rc
2baa0 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
2bab0 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
2bac0 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72  Filename, pPager
2bad0 2d 3e 66 64 2c 20 76 66 73 46 6c 61 67 73 2c 20  ->fd, vfsFlags, 
2bae0 26 66 6f 75 74 29 3b 0a 20 20 20 20 61 73 73 65  &fout);.    asse
2baf0 72 74 28 20 21 6d 65 6d 44 62 20 29 3b 0a 20 20  rt( !memDb );.  
2bb00 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28 66 6f    readOnly = (fo
2bb10 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  ut&SQLITE_OPEN_R
2bb20 45 41 44 4f 4e 4c 59 29 3b 0a 0a 20 20 20 20 2f  EADONLY);..    /
2bb30 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 77 61  * If the file wa
2bb40 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f  s successfully o
2bb50 70 65 6e 65 64 20 66 6f 72 20 72 65 61 64 2f 77  pened for read/w
2bb60 72 69 74 65 20 61 63 63 65 73 73 2c 0a 20 20 20  rite access,.   
2bb70 20 2a 2a 20 63 68 6f 6f 73 65 20 61 20 64 65 66   ** choose a def
2bb80 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 69  ault page size i
2bb90 6e 20 63 61 73 65 20 77 65 20 68 61 76 65 20 74  n case we have t
2bba0 6f 20 63 72 65 61 74 65 20 74 68 65 0a 20 20 20  o create the.   
2bbb0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
2bbc0 65 2e 20 54 68 65 20 64 65 66 61 75 6c 74 20 70  e. The default p
2bbd0 61 67 65 20 73 69 7a 65 20 69 73 20 74 68 65 20  age size is the 
2bbe0 6d 61 78 69 6d 75 6d 20 6f 66 3a 0a 20 20 20 20  maximum of:.    
2bbf0 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 53  **.    **    + S
2bc00 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41  QLITE_DEFAULT_PA
2bc10 47 45 5f 53 49 5a 45 2c 0a 20 20 20 20 2a 2a 20  GE_SIZE,.    ** 
2bc20 20 20 20 2b 20 54 68 65 20 76 61 6c 75 65 20 72     + The value r
2bc30 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74  eturned by sqlit
2bc40 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29  e3OsSectorSize()
2bc50 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 65  .    **    + The
2bc60 20 6c 61 72 67 65 73 74 20 70 61 67 65 20 73 69   largest page si
2bc70 7a 65 20 74 68 61 74 20 63 61 6e 20 62 65 20 77  ze that can be w
2bc80 72 69 74 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c  ritten atomicall
2bc90 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  y..    */.    if
2bca0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2bcb0 26 26 20 21 72 65 61 64 4f 6e 6c 79 20 29 7b 0a  && !readOnly ){.
2bcc0 20 20 20 20 20 20 73 65 74 53 65 63 74 6f 72 53        setSectorS
2bcd0 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ize(pPager);.   
2bce0 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45     assert(SQLITE
2bcf0 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
2bd00 5a 45 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 44  ZE<=SQLITE_MAX_D
2bd10 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
2bd20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a 50  );.      if( szP
2bd30 61 67 65 44 66 6c 74 3c 70 50 61 67 65 72 2d 3e  ageDflt<pPager->
2bd40 73 65 63 74 6f 72 53 69 7a 65 20 29 7b 0a 20 20  sectorSize ){.  
2bd50 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
2bd60 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3e 53 51 4c  ->sectorSize>SQL
2bd70 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f  ITE_MAX_DEFAULT_
2bd80 50 41 47 45 5f 53 49 5a 45 20 29 7b 0a 20 20 20  PAGE_SIZE ){.   
2bd90 20 20 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c         szPageDfl
2bda0 74 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 44  t = SQLITE_MAX_D
2bdb0 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
2bdc0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
2bdd0 0a 20 20 20 20 20 20 20 20 20 20 73 7a 50 61 67  .          szPag
2bde0 65 44 66 6c 74 20 3d 20 28 75 33 32 29 70 50 61  eDflt = (u32)pPa
2bdf0 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b  ger->sectorSize;
2be00 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2be10 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
2be20 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57  _ENABLE_ATOMIC_W
2be30 52 49 54 45 0a 20 20 20 20 20 20 7b 0a 20 20 20  RITE.      {.   
2be40 20 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20 73       int iDc = s
2be50 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
2be60 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
2be70 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20  ager->fd);.     
2be80 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20     int ii;.     
2be90 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45     assert(SQLITE
2bea0 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32  _IOCAP_ATOMIC512
2beb0 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20  ==(512>>8));.   
2bec0 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49       assert(SQLI
2bed0 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36  TE_IOCAP_ATOMIC6
2bee0 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b  4K==(65536>>8));
2bef0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2bf00 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55  SQLITE_MAX_DEFAU
2bf10 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 36 35  LT_PAGE_SIZE<=65
2bf20 35 33 36 29 3b 0a 20 20 20 20 20 20 20 20 66 6f  536);.        fo
2bf30 72 28 69 69 3d 73 7a 50 61 67 65 44 66 6c 74 3b  r(ii=szPageDflt;
2bf40 20 69 69 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f   ii<=SQLITE_MAX_
2bf50 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
2bf60 45 3b 20 69 69 3d 69 69 2a 32 29 7b 0a 20 20 20  E; ii=ii*2){.   
2bf70 20 20 20 20 20 20 20 69 66 28 20 69 44 63 26 28         if( iDc&(
2bf80 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
2bf90 4d 49 43 7c 28 69 69 3e 3e 38 29 29 20 29 7b 0a  MIC|(ii>>8)) ){.
2bfa0 20 20 20 20 20 20 20 20 20 20 20 20 73 7a 50 61              szPa
2bfb0 67 65 44 66 6c 74 20 3d 20 69 69 3b 0a 20 20 20  geDflt = ii;.   
2bfc0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2bfd0 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69   }.      }.#endi
2bfe0 66 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  f.    }.  }else{
2bff0 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 74 65 6d  .    /* If a tem
2c000 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73 20 72  porary file is r
2c010 65 71 75 65 73 74 65 64 2c 20 69 74 20 69 73 20  equested, it is 
2c020 6e 6f 74 20 6f 70 65 6e 65 64 20 69 6d 6d 65 64  not opened immed
2c030 69 61 74 65 6c 79 2e 0a 20 20 20 20 2a 2a 20 49  iately..    ** I
2c040 6e 20 74 68 69 73 20 63 61 73 65 20 77 65 20 61  n this case we a
2c050 63 63 65 70 74 20 74 68 65 20 64 65 66 61 75 6c  ccept the defaul
2c060 74 20 70 61 67 65 20 73 69 7a 65 20 61 6e 64 20  t page size and 
2c070 64 65 6c 61 79 20 61 63 74 75 61 6c 6c 79 0a 20  delay actually. 
2c080 20 20 20 2a 2a 20 6f 70 65 6e 69 6e 67 20 74 68     ** opening th
2c090 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 74 68 65  e file until the
2c0a0 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 4f   first call to O
2c0b0 73 57 72 69 74 65 28 29 2e 0a 20 20 20 20 2a 2a  sWrite()..    **
2c0c0 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 62 72 61  .    ** This bra
2c0d0 6e 63 68 20 69 73 20 61 6c 73 6f 20 72 75 6e 20  nch is also run 
2c0e0 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  for an in-memory
2c0f0 20 64 61 74 61 62 61 73 65 2e 20 41 6e 20 69 6e   database. An in
2c100 2d 6d 65 6d 6f 72 79 0a 20 20 20 20 2a 2a 20 64  -memory.    ** d
2c110 61 74 61 62 61 73 65 20 69 73 20 74 68 65 20 73  atabase is the s
2c120 61 6d 65 20 61 73 20 61 20 74 65 6d 70 2d 66 69  ame as a temp-fi
2c130 6c 65 20 74 68 61 74 20 69 73 20 6e 65 76 65 72  le that is never
2c140 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 0a   written out to.
2c150 20 20 20 20 2a 2a 20 64 69 73 6b 20 61 6e 64 20      ** disk and 
2c160 75 73 65 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  uses an in-memor
2c170 79 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  y rollback journ
2c180 61 6c 2e 0a 20 20 20 20 2a 2f 20 0a 20 20 20 20  al..    */ .    
2c190 74 65 6d 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20  tempFile = 1;.  
2c1a0 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
2c1b0 20 3d 20 50 41 47 45 52 5f 52 45 41 44 45 52 3b   = PAGER_READER;
2c1c0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f  .    pPager->eLo
2c1d0 63 6b 20 3d 20 45 58 43 4c 55 53 49 56 45 5f 4c  ck = EXCLUSIVE_L
2c1e0 4f 43 4b 3b 0a 20 20 20 20 72 65 61 64 4f 6e 6c  OCK;.    readOnl
2c1f0 79 20 3d 20 28 76 66 73 46 6c 61 67 73 26 53 51  y = (vfsFlags&SQ
2c200 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
2c210 4c 59 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  LY);.  }..  /* T
2c220 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c  he following cal
2c230 6c 20 74 6f 20 50 61 67 65 72 53 65 74 50 61 67  l to PagerSetPag
2c240 65 73 69 7a 65 28 29 20 73 65 72 76 65 73 20 74  esize() serves t
2c250 6f 20 73 65 74 20 74 68 65 20 76 61 6c 75 65 20  o set the value 
2c260 6f 66 20 0a 20 20 2a 2a 20 50 61 67 65 72 2e 70  of .  ** Pager.p
2c270 61 67 65 53 69 7a 65 20 61 6e 64 20 74 6f 20 61  ageSize and to a
2c280 6c 6c 6f 63 61 74 65 20 74 68 65 20 50 61 67 65  llocate the Page
2c290 72 2e 70 54 6d 70 53 70 61 63 65 20 62 75 66 66  r.pTmpSpace buff
2c2a0 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  er..  */.  if( r
2c2b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2c2c0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2c2d0 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 29 3b 0a  er->memDb==0 );.
2c2e0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2c2f0 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
2c300 28 70 50 61 67 65 72 2c 20 26 73 7a 50 61 67 65  (pPager, &szPage
2c310 44 66 6c 74 2c 20 2d 31 29 3b 0a 20 20 20 20 74  Dflt, -1);.    t
2c320 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c  estcase( rc!=SQL
2c330 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20  ITE_OK );.  }.. 
2c340 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20   /* If an error 
2c350 6f 63 63 75 72 72 65 64 20 69 6e 20 65 69 74 68  occurred in eith
2c360 65 72 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 73  er of the blocks
2c370 20 61 62 6f 76 65 2c 20 66 72 65 65 20 74 68 65   above, free the
2c380 20 0a 20 20 2a 2a 20 50 61 67 65 72 20 73 74 72   .  ** Pager str
2c390 75 63 74 75 72 65 20 61 6e 64 20 63 6c 6f 73 65  ucture and close
2c3a0 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a   the file..  */.
2c3b0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2c3c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _OK ){.    asser
2c3d0 74 28 20 21 70 50 61 67 65 72 2d 3e 70 54 6d 70  t( !pPager->pTmp
2c3e0 53 70 61 63 65 20 29 3b 0a 20 20 20 20 73 71 6c  Space );.    sql
2c3f0 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
2c400 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 73 71 6c  er->fd);.    sql
2c410 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72  ite3_free(pPager
2c420 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  );.    return rc
2c430 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74  ;.  }..  /* Init
2c440 69 61 6c 69 7a 65 20 74 68 65 20 50 43 61 63 68  ialize the PCach
2c450 65 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 61  e object. */.  a
2c460 73 73 65 72 74 28 20 6e 45 78 74 72 61 3c 31 30  ssert( nExtra<10
2c470 30 30 20 29 3b 0a 20 20 6e 45 78 74 72 61 20 3d  00 );.  nExtra =
2c480 20 52 4f 55 4e 44 38 28 6e 45 78 74 72 61 29 3b   ROUND8(nExtra);
2c490 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
2c4a0 4f 70 65 6e 28 73 7a 50 61 67 65 44 66 6c 74 2c  Open(szPageDflt,
2c4b0 20 6e 45 78 74 72 61 2c 20 21 6d 65 6d 44 62 2c   nExtra, !memDb,
2c4c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2c4d0 20 20 20 20 20 21 6d 65 6d 44 62 3f 70 61 67 65       !memDb?page
2c4e0 72 53 74 72 65 73 73 3a 30 2c 20 28 76 6f 69 64  rStress:0, (void
2c4f0 20 2a 29 70 50 61 67 65 72 2c 20 70 50 61 67 65   *)pPager, pPage
2c500 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 0a 20 20  r->pPCache);..  
2c510 50 41 47 45 52 54 52 41 43 45 28 28 22 4f 50 45  PAGERTRACE(("OPE
2c520 4e 20 25 64 20 25 73 5c 6e 22 2c 20 46 49 4c 45  N %d %s\n", FILE
2c530 48 41 4e 44 4c 45 49 44 28 70 50 61 67 65 72 2d  HANDLEID(pPager-
2c540 3e 66 64 29 2c 20 70 50 61 67 65 72 2d 3e 7a 46  >fd), pPager->zF
2c550 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 49 4f 54  ilename));.  IOT
2c560 52 41 43 45 28 28 22 4f 50 45 4e 20 25 70 20 25  RACE(("OPEN %p %
2c570 73 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  s\n", pPager, pP
2c580 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29  ager->zFilename)
2c590 29 0a 0a 20 20 70 50 61 67 65 72 2d 3e 75 73 65  )..  pPager->use
2c5a0 4a 6f 75 72 6e 61 6c 20 3d 20 28 75 38 29 75 73  Journal = (u8)us
2c5b0 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20 70 50 61 67  eJournal;.  pPag
2c5c0 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d  er->noReadlock =
2c5d0 20 28 6e 6f 52 65 61 64 6c 6f 63 6b 20 26 26 20   (noReadlock && 
2c5e0 72 65 61 64 4f 6e 6c 79 29 20 3f 31 3a 30 3b 0a  readOnly) ?1:0;.
2c5f0 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d    /* pPager->stm
2c600 74 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20  tOpen = 0; */.  
2c610 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  /* pPager->stmtI
2c620 6e 55 73 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  nUse = 0; */.  /
2c630 2a 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d  * pPager->nRef =
2c640 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
2c650 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 30  er->stmtSize = 0
2c660 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
2c670 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20 30 3b  ->stmtJSize = 0;
2c680 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
2c690 3e 6e 50 61 67 65 20 3d 20 30 3b 20 2a 2f 0a 20  >nPage = 0; */. 
2c6a0 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20   pPager->mxPgno 
2c6b0 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  = SQLITE_MAX_PAG
2c6c0 45 5f 43 4f 55 4e 54 3b 0a 20 20 2f 2a 20 70 50  E_COUNT;.  /* pP
2c6d0 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
2c6e0 47 45 52 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a 23  GER_UNLOCK; */.#
2c6f0 69 66 20 30 0a 20 20 61 73 73 65 72 74 28 20 70  if 0.  assert( p
2c700 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 3d 20  Pager->state == 
2c710 28 74 65 6d 70 46 69 6c 65 20 3f 20 50 41 47 45  (tempFile ? PAGE
2c720 52 5f 45 58 43 4c 55 53 49 56 45 20 3a 20 50 41  R_EXCLUSIVE : PA
2c730 47 45 52 5f 55 4e 4c 4f 43 4b 29 20 29 3b 0a 23  GER_UNLOCK) );.#
2c740 65 6e 64 69 66 0a 20 20 2f 2a 20 70 50 61 67 65  endif.  /* pPage
2c750 72 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30 3b 20  r->errMask = 0; 
2c760 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 74 65 6d  */.  pPager->tem
2c770 70 46 69 6c 65 20 3d 20 28 75 38 29 74 65 6d 70  pFile = (u8)temp
2c780 46 69 6c 65 3b 0a 20 20 61 73 73 65 72 74 28 20  File;.  assert( 
2c790 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f  tempFile==PAGER_
2c7a0 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d  LOCKINGMODE_NORM
2c7b0 41 4c 20 0a 20 20 20 20 20 20 20 20 20 20 7c 7c  AL .          ||
2c7c0 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52   tempFile==PAGER
2c7d0 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43  _LOCKINGMODE_EXC
2c7e0 4c 55 53 49 56 45 20 29 3b 0a 20 20 61 73 73 65  LUSIVE );.  asse
2c7f0 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  rt( PAGER_LOCKIN
2c800 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 3d  GMODE_EXCLUSIVE=
2c810 3d 31 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  =1 );.  pPager->
2c820 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20  exclusiveMode = 
2c830 28 75 38 29 74 65 6d 70 46 69 6c 65 3b 20 0a 20  (u8)tempFile; . 
2c840 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
2c850 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65  ountDone = pPage
2c860 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70  r->tempFile;.  p
2c870 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3d 20 28  Pager->memDb = (
2c880 75 38 29 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67  u8)memDb;.  pPag
2c890 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 28  er->readOnly = (
2c8a0 75 38 29 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 61  u8)readOnly;.  a
2c8b0 73 73 65 72 74 28 20 75 73 65 4a 6f 75 72 6e 61  ssert( useJourna
2c8c0 6c 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d  l || pPager->tem
2c8d0 70 46 69 6c 65 20 29 3b 0a 20 20 70 50 61 67 65  pFile );.  pPage
2c8e0 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61 67  r->noSync = pPag
2c8f0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20  er->tempFile;.  
2c900 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  if( pPager->noSy
2c910 6e 63 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  nc ){.    assert
2c920 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79  ( pPager->fullSy
2c930 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  nc==0 );.    ass
2c940 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 79 6e  ert( pPager->syn
2c950 63 46 6c 61 67 73 3d 3d 30 20 29 3b 0a 20 20 20  cFlags==0 );.   
2c960 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2c970 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 3d 3d 30  >walSyncFlags==0
2c980 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2c990 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63  pPager->ckptSync
2c9a0 46 6c 61 67 73 3d 3d 30 20 29 3b 0a 20 20 7d 65  Flags==0 );.  }e
2c9b0 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  lse{.    pPager-
2c9c0 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 31 3b 0a 20  >fullSync = 1;. 
2c9d0 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46     pPager->syncF
2c9e0 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59  lags = SQLITE_SY
2c9f0 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 70  NC_NORMAL;.    p
2ca00 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c  Pager->walSyncFl
2ca10 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e  ags = SQLITE_SYN
2ca20 43 5f 4e 4f 52 4d 41 4c 20 7c 20 57 41 4c 5f 53  C_NORMAL | WAL_S
2ca30 59 4e 43 5f 54 52 41 4e 53 41 43 54 49 4f 4e 53  YNC_TRANSACTIONS
2ca40 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b  ;.    pPager->ck
2ca50 70 74 53 79 6e 63 46 6c 61 67 73 20 3d 20 53 51  ptSyncFlags = SQ
2ca60 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
2ca70 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50 61 67 65  ;.  }.  /* pPage
2ca80 72 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 20 2a  r->pFirst = 0; *
2ca90 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70  /.  /* pPager->p
2caa0 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 30 3b  FirstSynced = 0;
2cab0 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
2cac0 3e 70 4c 61 73 74 20 3d 20 30 3b 20 2a 2f 0a 20  >pLast = 0; */. 
2cad0 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 20   pPager->nExtra 
2cae0 3d 20 28 75 31 36 29 6e 45 78 74 72 61 3b 0a 20  = (u16)nExtra;. 
2caf0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
2cb00 53 69 7a 65 4c 69 6d 69 74 20 3d 20 53 51 4c 49  SizeLimit = SQLI
2cb10 54 45 5f 44 45 46 41 55 4c 54 5f 4a 4f 55 52 4e  TE_DEFAULT_JOURN
2cb20 41 4c 5f 53 49 5a 45 5f 4c 49 4d 49 54 3b 0a 20  AL_SIZE_LIMIT;. 
2cb30 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
2cb40 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 74  pPager->fd) || t
2cb50 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 73 65 74  empFile );.  set
2cb60 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65  SectorSize(pPage
2cb70 72 29 3b 0a 20 20 69 66 28 20 21 75 73 65 4a 6f  r);.  if( !useJo
2cb80 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 70 50 61  urnal ){.    pPa
2cb90 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
2cba0 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c   = PAGER_JOURNAL
2cbb0 4d 4f 44 45 5f 4f 46 46 3b 0a 20 20 7d 65 6c 73  MODE_OFF;.  }els
2cbc0 65 20 69 66 28 20 6d 65 6d 44 62 20 29 7b 0a 20  e if( memDb ){. 
2cbd0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
2cbe0 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a  alMode = PAGER_J
2cbf0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
2cc00 59 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50 61 67  Y;.  }.  /* pPag
2cc10 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72  er->xBusyHandler
2cc20 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
2cc30 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
2cc40 65 72 41 72 67 20 3d 20 30 3b 20 2a 2f 0a 20 20  erArg = 0; */.  
2cc50 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65  pPager->xReinite
2cc60 72 20 3d 20 78 52 65 69 6e 69 74 3b 0a 20 20 2f  r = xReinit;.  /
2cc70 2a 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d  * memset(pPager-
2cc80 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f  >aHash, 0, sizeo
2cc90 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29  f(pPager->aHash)
2cca0 29 3b 20 2a 2f 0a 0a 20 20 2a 70 70 50 61 67 65  ); */..  *ppPage
2ccb0 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 72 65  r = pPager;.  re
2ccc0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2ccd0 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }..../*.** This 
2cce0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
2ccf0 65 64 20 61 66 74 65 72 20 74 72 61 6e 73 69 74  ed after transit
2cd00 69 6f 6e 69 6e 67 20 66 72 6f 6d 20 50 41 47 45  ioning from PAGE
2cd10 52 5f 55 4e 4c 4f 43 4b 20 74 6f 0a 2a 2a 20 50  R_UNLOCK to.** P
2cd20 41 47 45 52 5f 53 48 41 52 45 44 20 73 74 61 74  AGER_SHARED stat
2cd30 65 2e 20 49 74 20 74 65 73 74 73 20 69 66 20 74  e. It tests if t
2cd40 68 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a 6f  here is a hot jo
2cd50 75 72 6e 61 6c 20 70 72 65 73 65 6e 74 20 69 6e  urnal present in
2cd60 0a 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73 79 73  .** the file-sys
2cd70 74 65 6d 20 66 6f 72 20 74 68 65 20 67 69 76 65  tem for the give
2cd80 6e 20 70 61 67 65 72 2e 20 41 20 68 6f 74 20 6a  n pager. A hot j
2cd90 6f 75 72 6e 61 6c 20 69 73 20 6f 6e 65 20 74 68  ournal is one th
2cda0 61 74 20 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20  at .** needs to 
2cdb0 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20  be played back. 
2cdc0 41 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 69  According to thi
2cdd0 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 68 6f  s function, a ho
2cde0 74 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  t-journal.** fil
2cdf0 65 20 65 78 69 73 74 73 20 69 66 20 74 68 65 20  e exists if the 
2ce00 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65 72  following criter
2ce10 69 61 20 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a  ia are met:.**.*
2ce20 2a 20 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e 61  *   * The journa
2ce30 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 69 6e  l file exists in
2ce40 20 74 68 65 20 66 69 6c 65 20 73 79 73 74 65 6d   the file system
2ce50 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 4e 6f 20  , and.**   * No 
2ce60 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 61 20  process holds a 
2ce70 52 45 53 45 52 56 45 44 20 6f 72 20 67 72 65 61  RESERVED or grea
2ce80 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ter lock on the 
2ce90 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 61  database file, a
2cea0 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 64 61  nd.**   * The da
2ceb0 74 61 62 61 73 65 20 66 69 6c 65 20 69 74 73 65  tabase file itse
2cec0 6c 66 20 69 73 20 67 72 65 61 74 65 72 20 74 68  lf is greater th
2ced0 61 6e 20 30 20 62 79 74 65 73 20 69 6e 20 73 69  an 0 bytes in si
2cee0 7a 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54  ze, and.**   * T
2cef0 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
2cf00 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2cf10 65 20 65 78 69 73 74 73 20 61 6e 64 20 69 73 20  e exists and is 
2cf20 6e 6f 74 20 30 78 30 30 2e 0a 2a 2a 0a 2a 2a 20  not 0x00..**.** 
2cf30 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  If the current s
2cf40 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
2cf50 61 73 65 20 66 69 6c 65 20 69 73 20 30 20 62 75  ase file is 0 bu
2cf60 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  t a journal file
2cf70 0a 2a 2a 20 65 78 69 73 74 73 2c 20 74 68 61 74  .** exists, that
2cf80 20 69 73 20 70 72 6f 62 61 62 6c 79 20 61 6e 20   is probably an 
2cf90 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 6c 65 66 74  old journal left
2cfa0 20 6f 76 65 72 20 66 72 6f 6d 20 61 20 70 72 69   over from a pri
2cfb0 6f 72 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 77  or.** database w
2cfc0 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d  ith the same nam
2cfd0 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  e. In this case 
2cfe0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2cff0 20 69 73 0a 2a 2a 20 6a 75 73 74 20 64 65 6c 65   is.** just dele
2d000 74 65 64 20 75 73 69 6e 67 20 4f 73 44 65 6c 65  ted using OsDele
2d010 74 65 2c 20 2a 70 45 78 69 73 74 73 20 69 73 20  te, *pExists is 
2d020 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53 51 4c  set to 0 and SQL
2d030 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74  ITE_OK.** is ret
2d040 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  urned..**.** Thi
2d050 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e  s routine does n
2d060 6f 74 20 63 68 65 63 6b 20 69 66 20 74 68 65 72  ot check if ther
2d070 65 20 69 73 20 61 20 6d 61 73 74 65 72 20 6a 6f  e is a master jo
2d080 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 0a 2a  urnal filename.*
2d090 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  * at the end of 
2d0a0 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65  the file. If the
2d0b0 72 65 20 69 73 2c 20 61 6e 64 20 74 68 61 74 20  re is, and that 
2d0c0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
2d0d0 69 6c 65 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20  ile.** does not 
2d0e0 65 78 69 73 74 2c 20 74 68 65 6e 20 74 68 65 20  exist, then the 
2d0f0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
2d100 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74 2e 20  not really hot. 
2d110 49 6e 20 74 68 69 73 0a 2a 2a 20 63 61 73 65 20  In this.** case 
2d120 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  this routine wil
2d130 6c 20 72 65 74 75 72 6e 20 61 20 66 61 6c 73 65  l return a false
2d140 2d 70 6f 73 69 74 69 76 65 2e 20 54 68 65 20 70  -positive. The p
2d150 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 0a  ager_playback().
2d160 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  ** routine will 
2d170 64 69 73 63 6f 76 65 72 20 74 68 61 74 20 74 68  discover that th
2d180 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
2d190 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74  s not really hot
2d1a0 20 61 6e 64 20 0a 2a 2a 20 77 69 6c 6c 20 6e 6f   and .** will no
2d1b0 74 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20  t roll it back. 
2d1c0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 68 6f 74 2d  .**.** If a hot-
2d1d0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
2d1e0 66 6f 75 6e 64 20 74 6f 20 65 78 69 73 74 2c 20  found to exist, 
2d1f0 2a 70 45 78 69 73 74 73 20 69 73 20 73 65 74 20  *pExists is set 
2d200 74 6f 20 31 20 61 6e 64 20 0a 2a 2a 20 53 51 4c  to 1 and .** SQL
2d210 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
2d220 20 49 66 20 6e 6f 20 68 6f 74 2d 6a 6f 75 72 6e   If no hot-journ
2d230 61 6c 20 66 69 6c 65 20 69 73 20 70 72 65 73 65  al file is prese
2d240 6e 74 2c 20 2a 70 45 78 69 73 74 73 20 69 73 0a  nt, *pExists is.
2d250 2a 2a 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20  ** set to 0 and 
2d260 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
2d270 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72  ed. If an IO err
2d280 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
2d290 74 72 79 69 6e 67 0a 2a 2a 20 74 6f 20 64 65 74  trying.** to det
2d2a0 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f  ermine whether o
2d2b0 72 20 6e 6f 74 20 61 20 68 6f 74 2d 6a 6f 75 72  r not a hot-jour
2d2c0 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c  nal file exists,
2d2d0 20 74 68 65 20 49 4f 20 65 72 72 6f 72 0a 2a 2a   the IO error.**
2d2e0 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
2d2f0 64 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20  d and the value 
2d300 6f 66 20 2a 70 45 78 69 73 74 73 20 69 73 20 75  of *pExists is u
2d310 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61  ndefined..*/.sta
2d320 74 69 63 20 69 6e 74 20 68 61 73 48 6f 74 4a 6f  tic int hasHotJo
2d330 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
2d340 67 65 72 2c 20 69 6e 74 20 2a 70 45 78 69 73 74  ger, int *pExist
2d350 73 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  s){.  sqlite3_vf
2d360 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d  s * const pVfs =
2d370 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20   pPager->pVfs;. 
2d380 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2d390 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 2f  _OK;           /
2d3a0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
2d3b0 0a 20 20 69 6e 74 20 65 78 69 73 74 73 20 3d 20  .  int exists = 
2d3c0 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
2d3d0 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6a 6f   /* True if a jo
2d3e0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 70 72  urnal file is pr
2d3f0 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6a  esent */.  int j
2d400 72 6e 6c 4f 70 65 6e 20 3d 20 21 21 69 73 4f 70  rnlOpen = !!isOp
2d410 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  en(pPager->jfd);
2d420 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
2d430 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29  er->useJournal )
2d440 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ;.  assert( isOp
2d450 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
2d460 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
2d470 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
2d480 52 5f 4f 50 45 4e 20 29 3b 0a 0a 20 20 61 73 73  R_OPEN );..  ass
2d490 65 72 74 28 20 6a 72 6e 6c 4f 70 65 6e 3d 3d 30  ert( jrnlOpen==0
2d4a0 20 7c 7c 20 28 20 73 71 6c 69 74 65 33 4f 73 44   || ( sqlite3OsD
2d4b0 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
2d4c0 74 69 63 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  tics(pPager->jfd
2d4d0 29 20 26 0a 20 20 20 20 53 51 4c 49 54 45 5f 49  ) &.    SQLITE_I
2d4e0 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41 42 4c 45  OCAP_UNDELETABLE
2d4f0 5f 57 48 45 4e 5f 4f 50 45 4e 0a 20 20 29 29 3b  _WHEN_OPEN.  ));
2d500 0a 0a 20 20 2a 70 45 78 69 73 74 73 20 3d 20 30  ..  *pExists = 0
2d510 3b 0a 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65  ;.  if( !jrnlOpe
2d520 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  n ){.    rc = sq
2d530 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56  lite3OsAccess(pV
2d540 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
2d550 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43  rnal, SQLITE_ACC
2d560 45 53 53 5f 45 58 49 53 54 53 2c 20 26 65 78 69  ESS_EXISTS, &exi
2d570 73 74 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  sts);.  }.  if( 
2d580 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2d590 20 65 78 69 73 74 73 20 29 7b 0a 20 20 20 20 69   exists ){.    i
2d5a0 6e 74 20 6c 6f 63 6b 65 64 20 3d 20 30 3b 20 20  nt locked = 0;  
2d5b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2d5c0 75 65 20 69 66 20 73 6f 6d 65 20 70 72 6f 63 65  ue if some proce
2d5d0 73 73 20 68 6f 6c 64 73 20 61 20 52 45 53 45 52  ss holds a RESER
2d5e0 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a 0a 20 20 20  VED lock */..   
2d5f0 20 2f 2a 20 52 61 63 65 20 63 6f 6e 64 69 74 69   /* Race conditi
2d600 6f 6e 20 68 65 72 65 3a 20 20 41 6e 6f 74 68 65  on here:  Anothe
2d610 72 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20  r process might 
2d620 68 61 76 65 20 62 65 65 6e 20 68 6f 6c 64 69 6e  have been holdin
2d630 67 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 68 65  g the.    ** the
2d640 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 61   RESERVED lock a
2d650 6e 64 20 68 61 76 65 20 61 20 6a 6f 75 72 6e 61  nd have a journa
2d660 6c 20 6f 70 65 6e 20 61 74 20 74 68 65 20 73 71  l open at the sq
2d670 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 29 20  lite3OsAccess() 
2d680 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 61 62 6f  .    ** call abo
2d690 76 65 2c 20 62 75 74 20 74 68 65 6e 20 64 65 6c  ve, but then del
2d6a0 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ete the journal 
2d6b0 61 6e 64 20 64 72 6f 70 20 74 68 65 20 6c 6f 63  and drop the loc
2d6c0 6b 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20  k before.    ** 
2d6d0 77 65 20 67 65 74 20 74 6f 20 74 68 65 20 66 6f  we get to the fo
2d6e0 6c 6c 6f 77 69 6e 67 20 73 71 6c 69 74 65 33 4f  llowing sqlite3O
2d6f0 73 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  sCheckReservedLo
2d700 63 6b 28 29 20 63 61 6c 6c 2e 20 20 49 66 20 74  ck() call.  If t
2d710 68 61 74 0a 20 20 20 20 2a 2a 20 69 73 20 74 68  hat.    ** is th
2d720 65 20 63 61 73 65 2c 20 74 68 69 73 20 72 6f 75  e case, this rou
2d730 74 69 6e 65 20 6d 69 67 68 74 20 74 68 69 6e 6b  tine might think
2d740 20 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 20   there is a hot 
2d750 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 0a 20 20 20  journal when.   
2d760 20 2a 2a 20 69 6e 20 66 61 63 74 20 74 68 65 72   ** in fact ther
2d770 65 20 69 73 20 6e 6f 6e 65 2e 20 20 54 68 69 73  e is none.  This
2d780 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20 66 61   results in a fa
2d790 6c 73 65 2d 70 6f 73 69 74 69 76 65 20 77 68 69  lse-positive whi
2d7a0 63 68 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62  ch will.    ** b
2d7b0 65 20 64 65 61 6c 74 20 77 69 74 68 20 62 79 20  e dealt with by 
2d7c0 74 68 65 20 70 6c 61 79 62 61 63 6b 20 72 6f 75  the playback rou
2d7d0 74 69 6e 65 2e 20 20 54 69 63 6b 65 74 20 23 33  tine.  Ticket #3
2d7e0 38 38 33 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  883..    */.    
2d7f0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 43 68  rc = sqlite3OsCh
2d800 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
2d810 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6c 6f 63  pPager->fd, &loc
2d820 6b 65 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ked);.    if( rc
2d830 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21  ==SQLITE_OK && !
2d840 6c 6f 63 6b 65 64 20 29 7b 0a 20 20 20 20 20 20  locked ){.      
2d850 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20 20  Pgno nPage;     
2d860 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2d870 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
2d880 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
2d890 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 43 68 65  */..      /* Che
2d8a0 63 6b 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  ck the size of t
2d8b0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2d8c0 2e 20 49 66 20 69 74 20 63 6f 6e 73 69 73 74 73  . If it consists
2d8d0 20 6f 66 20 30 20 70 61 67 65 73 2c 0a 20 20 20   of 0 pages,.   
2d8e0 20 20 20 2a 2a 20 74 68 65 6e 20 64 65 6c 65 74     ** then delet
2d8f0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
2d900 6c 65 2e 20 53 65 65 20 74 68 65 20 68 65 61 64  le. See the head
2d910 65 72 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65  er comment above
2d920 20 66 6f 72 20 0a 20 20 20 20 20 20 2a 2a 20 74   for .      ** t
2d930 68 65 20 72 65 61 73 6f 6e 69 6e 67 20 68 65 72  he reasoning her
2d940 65 2e 20 20 44 65 6c 65 74 65 20 74 68 65 20 6f  e.  Delete the o
2d950 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20  bsolete journal 
2d960 66 69 6c 65 20 75 6e 64 65 72 0a 20 20 20 20 20  file under.     
2d970 20 2a 2a 20 61 20 52 45 53 45 52 56 45 44 20 6c   ** a RESERVED l
2d980 6f 63 6b 20 74 6f 20 61 76 6f 69 64 20 72 61 63  ock to avoid rac
2d990 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 6e 64  e conditions and
2d9a0 20 74 6f 20 61 76 6f 69 64 20 76 69 6f 6c 61 74   to avoid violat
2d9b0 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 5b 48 33  ing.      ** [H3
2d9c0 33 30 32 30 5d 2e 0a 20 20 20 20 20 20 2a 2f 0a  3020]..      */.
2d9d0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
2d9e0 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
2d9f0 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20  , &nPage);.     
2da00 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2da10 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  OK ){.        if
2da20 28 20 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20  ( nPage==0 ){.  
2da30 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
2da40 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
2da50 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ();.          if
2da60 28 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50  ( pagerLockDb(pP
2da70 61 67 65 72 2c 20 52 45 53 45 52 56 45 44 5f 4c  ager, RESERVED_L
2da80 4f 43 4b 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  OCK)==SQLITE_OK 
2da90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
2daa0 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
2dab0 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
2dac0 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20  urnal, 0);.     
2dad0 20 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67         if( !pPag
2dae0 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
2daf0 65 20 29 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44  e ) pagerUnlockD
2db00 62 28 70 50 61 67 65 72 2c 20 53 48 41 52 45 44  b(pPager, SHARED
2db10 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  _LOCK);.        
2db20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71    }.          sq
2db30 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
2db40 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20  lloc();.        
2db50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2db60 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20   /* The journal 
2db70 66 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64 20  file exists and 
2db80 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  no other connect
2db90 69 6f 6e 20 68 61 73 20 61 20 72 65 73 65 72 76  ion has a reserv
2dba0 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ed.          ** 
2dbb0 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20  or greater lock 
2dbc0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
2dbd0 66 69 6c 65 2e 20 4e 6f 77 20 63 68 65 63 6b 20  file. Now check 
2dbe0 74 68 61 74 20 74 68 65 72 65 20 69 73 0a 20 20  that there is.  
2dbf0 20 20 20 20 20 20 20 20 2a 2a 20 61 74 20 6c 65          ** at le
2dc00 61 73 74 20 6f 6e 65 20 6e 6f 6e 2d 7a 65 72 6f  ast one non-zero
2dc10 20 62 79 74 65 73 20 61 74 20 74 68 65 20 73 74   bytes at the st
2dc20 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  art of the journ
2dc30 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20  al file..       
2dc40 20 20 20 2a 2a 20 49 66 20 74 68 65 72 65 20 69     ** If there i
2dc50 73 2c 20 74 68 65 6e 20 77 65 20 63 6f 6e 73 69  s, then we consi
2dc60 64 65 72 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  der this journal
2dc70 20 74 6f 20 62 65 20 68 6f 74 2e 20 49 66 20 6e   to be hot. If n
2dc80 6f 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ot, .          *
2dc90 2a 20 69 74 20 63 61 6e 20 62 65 20 69 67 6e 6f  * it can be igno
2dca0 72 65 64 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  red..          *
2dcb0 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
2dcc0 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20  !jrnlOpen ){.   
2dcd0 20 20 20 20 20 20 20 20 20 69 6e 74 20 66 20 3d           int f =
2dce0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
2dcf0 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45  DONLY|SQLITE_OPE
2dd00 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a  N_MAIN_JOURNAL;.
2dd10 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
2dd20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70   sqlite3OsOpen(p
2dd30 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
2dd40 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a  urnal, pPager->j
2dd50 66 64 2c 20 66 2c 20 26 66 29 3b 0a 20 20 20 20  fd, f, &f);.    
2dd60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2dd70 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2dd80 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
2dd90 20 20 20 75 38 20 66 69 72 73 74 20 3d 20 30 3b     u8 first = 0;
2dda0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
2ddb0 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
2ddc0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 28 76 6f  pPager->jfd, (vo
2ddd0 69 64 20 2a 29 26 66 69 72 73 74 2c 20 31 2c 20  id *)&first, 1, 
2dde0 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
2ddf0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49  if( rc==SQLITE_I
2de00 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20  OERR_SHORT_READ 
2de10 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2de20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2de30 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2de40 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21             if( !
2de50 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20  jrnlOpen ){.    
2de60 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2de70 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
2de80 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20  >jfd);.         
2de90 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2dea0 20 2a 70 45 78 69 73 74 73 20 3d 20 28 66 69 72   *pExists = (fir
2deb0 73 74 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20  st!=0);.        
2dec0 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d    }else if( rc==
2ded0 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20  SQLITE_CANTOPEN 
2dee0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){.            /
2def0 2a 20 49 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f  * If we cannot o
2df00 70 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  pen the rollback
2df10 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e   journal file in
2df20 20 6f 72 64 65 72 20 74 6f 20 73 65 65 20 69 66   order to see if
2df30 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
2df40 69 74 73 20 68 61 73 20 61 20 7a 65 72 6f 20 68  its has a zero h
2df50 65 61 64 65 72 2c 20 74 68 61 74 20 6d 69 67 68  eader, that migh
2df60 74 20 62 65 20 64 75 65 20 74 6f 20 61 6e 20 49  t be due to an I
2df70 2f 4f 20 65 72 72 6f 72 2c 20 6f 72 0a 20 20 20  /O error, or.   
2df80 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 6d           ** it m
2df90 69 67 68 74 20 62 65 20 64 75 65 20 74 6f 20 74  ight be due to t
2dfa0 68 65 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f  he race conditio
2dfb0 6e 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76  n described abov
2dfc0 65 20 61 6e 64 20 69 6e 0a 20 20 20 20 20 20 20  e and in.       
2dfd0 20 20 20 20 20 2a 2a 20 74 69 63 6b 65 74 20 23       ** ticket #
2dfe0 33 38 38 33 2e 20 20 45 69 74 68 65 72 20 77 61  3883.  Either wa
2dff0 79 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20 74  y, assume that t
2e000 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68 6f  he journal is ho
2e010 74 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  t..            *
2e020 2a 20 54 68 69 73 20 6d 69 67 68 74 20 62 65 20  * This might be 
2e030 61 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76 65  a false positive
2e040 2e 20 20 42 75 74 20 69 66 20 69 74 20 69 73 2c  .  But if it is,
2e050 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20 20 20   then the.      
2e060 20 20 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74        ** automat
2e070 69 63 20 6a 6f 75 72 6e 61 6c 20 70 6c 61 79 62  ic journal playb
2e080 61 63 6b 20 61 6e 64 20 72 65 63 6f 76 65 72 79  ack and recovery
2e090 20 6d 65 63 68 61 6e 69 73 6d 20 77 69 6c 6c 20   mechanism will 
2e0a0 64 65 61 6c 0a 20 20 20 20 20 20 20 20 20 20 20  deal.           
2e0b0 20 2a 2a 20 77 69 74 68 20 69 74 20 75 6e 64 65   ** with it unde
2e0c0 72 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  r an EXCLUSIVE l
2e0d0 6f 63 6b 20 77 68 65 72 65 20 77 65 20 64 6f 20  ock where we do 
2e0e0 6e 6f 74 20 6e 65 65 64 20 74 6f 0a 20 20 20 20  not need to.    
2e0f0 20 20 20 20 20 20 20 20 2a 2a 20 77 6f 72 72 79          ** worry
2e100 20 73 6f 20 6d 75 63 68 20 77 69 74 68 20 72 61   so much with ra
2e110 63 65 20 63 6f 6e 64 69 74 69 6f 6e 73 2e 0a 20  ce conditions.. 
2e120 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20             */.  
2e130 20 20 20 20 20 20 20 20 20 20 2a 70 45 78 69 73            *pExis
2e140 74 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ts = 1;.        
2e150 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2e160 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  OK;.          }.
2e170 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2e180 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  }.    }.  }..  r
2e190 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2e1a0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
2e1b0 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62   is called to ob
2e1c0 74 61 69 6e 20 61 20 73 68 61 72 65 64 20 6c 6f  tain a shared lo
2e1d0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
2e1e0 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 74 20 69  se file..** It i
2e1f0 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 63 61 6c  s illegal to cal
2e200 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63  l sqlite3PagerAc
2e210 71 75 69 72 65 28 29 20 75 6e 74 69 6c 20 61 66  quire() until af
2e220 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ter this functio
2e230 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 73 75  n.** has been su
2e240 63 63 65 73 73 66 75 6c 6c 79 20 63 61 6c 6c 65  ccessfully calle
2e250 64 2e 20 49 66 20 61 20 73 68 61 72 65 64 2d 6c  d. If a shared-l
2e260 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68  ock is already h
2e270 65 6c 64 20 77 68 65 6e 0a 2a 2a 20 74 68 69 73  eld when.** this
2e280 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
2e290 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d  led, it is a no-
2e2a0 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  op..**.** The fo
2e2b0 6c 6c 6f 77 69 6e 67 20 6f 70 65 72 61 74 69 6f  llowing operatio
2e2c0 6e 73 20 61 72 65 20 61 6c 73 6f 20 70 65 72 66  ns are also perf
2e2d0 6f 72 6d 65 64 20 62 79 20 74 68 69 73 20 66 75  ormed by this fu
2e2e0 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  nction..**.**   
2e2f0 31 29 20 49 66 20 74 68 65 20 70 61 67 65 72 20  1) If the pager 
2e300 69 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  is currently in 
2e310 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65  PAGER_OPEN state
2e320 20 28 6e 6f 20 6c 6f 63 6b 20 68 65 6c 64 0a 2a   (no lock held.*
2e330 2a 20 20 20 20 20 20 6f 6e 20 74 68 65 20 64 61  *      on the da
2e340 74 61 62 61 73 65 20 66 69 6c 65 29 2c 20 74 68  tabase file), th
2e350 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73  en an attempt is
2e360 20 6d 61 64 65 20 74 6f 20 6f 62 74 61 69 6e 20   made to obtain 
2e370 61 0a 2a 2a 20 20 20 20 20 20 53 48 41 52 45 44  a.**      SHARED
2e380 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
2e390 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6d 6d 65  abase file. Imme
2e3a0 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 6f 62  diately after ob
2e3b0 74 61 69 6e 69 6e 67 0a 2a 2a 20 20 20 20 20 20  taining.**      
2e3c0 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c  the SHARED lock,
2e3d0 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
2e3e0 20 69 73 20 63 68 65 63 6b 65 64 20 66 6f 72 20   is checked for 
2e3f0 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 0a 2a  a hot-journal,.*
2e400 2a 20 20 20 20 20 20 77 68 69 63 68 20 69 73 20  *      which is 
2e410 70 6c 61 79 65 64 20 62 61 63 6b 20 69 66 20 70  played back if p
2e420 72 65 73 65 6e 74 2e 20 46 6f 6c 6c 6f 77 69 6e  resent. Followin
2e430 67 20 61 6e 79 20 68 6f 74 2d 6a 6f 75 72 6e 61  g any hot-journa
2e440 6c 20 0a 2a 2a 20 20 20 20 20 20 72 6f 6c 6c 62  l .**      rollb
2e450 61 63 6b 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74  ack, the content
2e460 73 20 6f 66 20 74 68 65 20 63 61 63 68 65 20 61  s of the cache a
2e470 72 65 20 76 61 6c 69 64 61 74 65 64 20 62 79 20  re validated by 
2e480 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20  checking.**     
2e490 20 74 68 65 20 27 63 68 61 6e 67 65 2d 63 6f 75   the 'change-cou
2e4a0 6e 74 65 72 27 20 66 69 65 6c 64 20 6f 66 20 74  nter' field of t
2e4b0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2e4c0 20 68 65 61 64 65 72 20 61 6e 64 0a 2a 2a 20 20   header and.**  
2e4d0 20 20 20 20 64 69 73 63 61 72 64 65 64 20 69 66      discarded if
2e4e0 20 74 68 65 79 20 61 72 65 20 66 6f 75 6e 64 20   they are found 
2e4f0 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 2e 0a 2a  to be invalid..*
2e500 2a 0a 2a 2a 20 20 20 32 29 20 49 66 20 74 68 65  *.**   2) If the
2e510 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e   pager is runnin
2e520 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 6d  g in exclusive-m
2e530 6f 64 65 2c 20 61 6e 64 20 74 68 65 72 65 20 61  ode, and there a
2e540 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20  re currently.** 
2e550 20 20 20 20 20 6e 6f 20 6f 75 74 73 74 61 6e 64       no outstand
2e560 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20 74  ing references t
2e570 6f 20 61 6e 79 20 70 61 67 65 73 2c 20 61 6e 64  o any pages, and
2e580 20 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72   is in the error
2e590 20 73 74 61 74 65 2c 0a 2a 2a 20 20 20 20 20 20   state,.**      
2e5a0 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20  then an attempt 
2e5b0 69 73 20 6d 61 64 65 20 74 6f 20 63 6c 65 61 72  is made to clear
2e5c0 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
2e5d0 20 62 79 20 64 69 73 63 61 72 64 69 6e 67 0a 2a   by discarding.*
2e5e0 2a 20 20 20 20 20 20 74 68 65 20 63 6f 6e 74 65  *      the conte
2e5f0 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 20  nts of the page 
2e600 63 61 63 68 65 20 61 6e 64 20 72 6f 6c 6c 69 6e  cache and rollin
2e610 67 20 62 61 63 6b 20 61 6e 79 20 6f 70 65 6e 20  g back any open 
2e620 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20  journal.**      
2e630 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65  file..**.** If e
2e640 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75 63  verything is suc
2e650 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f  cessful, SQLITE_
2e660 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
2e670 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a  If an IO error .
2e680 2a 2a 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  ** occurs while 
2e690 6c 6f 63 6b 69 6e 67 20 74 68 65 20 64 61 74 61  locking the data
2e6a0 62 61 73 65 2c 20 63 68 65 63 6b 69 6e 67 20 66  base, checking f
2e6b0 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  or a hot-journal
2e6c0 20 66 69 6c 65 20 6f 72 20 0a 2a 2a 20 72 6f 6c   file or .** rol
2e6d0 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75 72  ling back a jour
2e6e0 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20 49 4f  nal file, the IO
2e6f0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
2e700 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20  eturned..*/.int 
2e710 73 71 6c 69 74 65 33 50 61 67 65 72 53 68 61 72  sqlite3PagerShar
2e720 65 64 4c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50  edLock(Pager *pP
2e730 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
2e740 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
2e750 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
2e760 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20  eturn code */.. 
2e770 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65   /* This routine
2e780 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20   is only called 
2e790 66 72 6f 6d 20 62 2d 74 72 65 65 20 61 6e 64 20  from b-tree and 
2e7a0 6f 6e 6c 79 20 77 68 65 6e 20 74 68 65 72 65 20  only when there 
2e7b0 61 72 65 20 6e 6f 0a 20 20 2a 2a 20 6f 75 74 73  are no.  ** outs
2e7c0 74 61 6e 64 69 6e 67 20 70 61 67 65 73 2e 20 54  tanding pages. T
2e7d0 68 69 73 20 69 6d 70 6c 69 65 73 20 74 68 61 74  his implies that
2e7e0 20 74 68 65 20 70 61 67 65 72 20 73 74 61 74 65   the pager state
2e7f0 20 73 68 6f 75 6c 64 20 65 69 74 68 65 72 0a 20   should either. 
2e800 20 2a 2a 20 62 65 20 4f 50 45 4e 20 6f 72 20 52   ** be OPEN or R
2e810 45 41 44 45 52 2e 20 52 45 41 44 45 52 20 69 73  EADER. READER is
2e820 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65 20 69   only possible i
2e830 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6f  f the pager is o
2e840 72 20 77 61 73 20 69 6e 20 0a 20 20 2a 2a 20 65  r was in .  ** e
2e850 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73 20  xclusive access 
2e860 6d 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  mode..  */.  ass
2e870 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61 63  ert( sqlite3Pcac
2e880 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
2e890 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 29  r->pPCache)==0 )
2e8a0 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65  ;.  assert( asse
2e8b0 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
2e8c0 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65  Pager) );.  asse
2e8d0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
2e8e0 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 7c  te==PAGER_OPEN |
2e8f0 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
2e900 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29  ==PAGER_READER )
2e910 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 4d 45  ;.  if( NEVER(ME
2e920 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e 65  MDB && pPager->e
2e930 72 72 43 6f 64 65 29 20 29 7b 20 72 65 74 75 72  rrCode) ){ retur
2e940 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  n pPager->errCod
2e950 65 3b 20 7d 0a 0a 20 20 69 66 28 20 21 70 61 67  e; }..  if( !pag
2e960 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
2e970 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61   && pPager->eSta
2e980 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29  te==PAGER_OPEN )
2e990 7b 0a 20 20 20 20 69 6e 74 20 62 48 6f 74 4a 6f  {.    int bHotJo
2e9a0 75 72 6e 61 6c 20 3d 20 31 3b 20 20 20 20 20 20  urnal = 1;      
2e9b0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
2e9c0 68 65 72 65 20 65 78 69 73 74 73 20 61 20 68 6f  here exists a ho
2e9d0 74 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 2a  t journal-file *
2e9e0 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  /..    assert( !
2e9f0 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 61 73 73  MEMDB );.    ass
2ea00 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 6f 52  ert( pPager->noR
2ea10 65 61 64 6c 6f 63 6b 3d 3d 30 20 7c 7c 20 70 50  eadlock==0 || pP
2ea20 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 29  ager->readOnly )
2ea30 3b 0a 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ;..    if( pPage
2ea40 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 3d 3d 30  r->noReadlock==0
2ea50 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
2ea60 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
2ea70 6b 28 70 50 61 67 65 72 2c 20 53 48 41 52 45 44  k(pPager, SHARED
2ea80 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66  _LOCK);.      if
2ea90 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2eaa0 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
2eab0 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  t( pPager->eLock
2eac0 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70 50 61  ==NO_LOCK || pPa
2ead0 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e  ger->eLock==UNKN
2eae0 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  OWN_LOCK );.    
2eaf0 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b      goto failed;
2eb00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
2eb10 20 20 20 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72      /* If a jour
2eb20 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c  nal file exists,
2eb30 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f   and there is no
2eb40 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f   RESERVED lock o
2eb50 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  n the.    ** dat
2eb60 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e  abase file, then
2eb70 20 69 74 20 65 69 74 68 65 72 20 6e 65 65 64 73   it either needs
2eb80 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61   to be played ba
2eb90 63 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20  ck or deleted.. 
2eba0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50     */.    if( pP
2ebb0 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 3d 53 48 41  ager->eLock<=SHA
2ebc0 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
2ebd0 20 20 72 63 20 3d 20 68 61 73 48 6f 74 4a 6f 75    rc = hasHotJou
2ebe0 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 26 62 48  rnal(pPager, &bH
2ebf0 6f 74 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  otJournal);.    
2ec00 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
2ec10 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2ec20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20   goto failed;.  
2ec30 20 20 7d 0a 20 20 20 20 69 66 28 20 62 48 6f 74    }.    if( bHot
2ec40 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20  Journal ){.     
2ec50 20 2f 2a 20 47 65 74 20 61 6e 20 45 58 43 4c 55   /* Get an EXCLU
2ec60 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
2ec70 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
2ec80 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74  At this point it
2ec90 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70   is.      ** imp
2eca0 6f 72 74 61 6e 74 20 74 68 61 74 20 61 20 52 45  ortant that a RE
2ecb0 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e  SERVED lock is n
2ecc0 6f 74 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74  ot obtained on t
2ecd0 68 65 20 77 61 79 20 74 6f 20 74 68 65 0a 20 20  he way to the.  
2ece0 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45      ** EXCLUSIVE
2ecf0 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20 77 65 72   lock. If it wer
2ed00 65 2c 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65  e, another proce
2ed10 73 73 20 6d 69 67 68 74 20 6f 70 65 6e 20 74 68  ss might open th
2ed20 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62  e.      ** datab
2ed30 61 73 65 20 66 69 6c 65 2c 20 64 65 74 65 63 74  ase file, detect
2ed40 20 74 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f   the RESERVED lo
2ed50 63 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75 64 65  ck, and conclude
2ed60 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 20 20   that the.      
2ed70 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73 20 73  ** database is s
2ed80 61 66 65 20 74 6f 20 72 65 61 64 20 77 68 69 6c  afe to read whil
2ed90 65 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 69  e this process i
2eda0 73 20 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20  s still rolling 
2edb0 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 68 6f  the .      ** ho
2edc0 74 2d 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2e 0a  t-journal back..
2edd0 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20        ** .      
2ede0 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65 20 69  ** Because the i
2edf0 6e 74 65 72 6d 65 64 69 61 74 65 20 52 45 53 45  ntermediate RESE
2ee00 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74  RVED lock is not
2ee10 20 72 65 71 75 65 73 74 65 64 2c 20 61 6e 79 0a   requested, any.
2ee20 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 70        ** other p
2ee30 72 6f 63 65 73 73 20 61 74 74 65 6d 70 74 69 6e  rocess attemptin
2ee40 67 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20  g to access the 
2ee50 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69  database file wi
2ee60 6c 6c 20 67 65 74 20 74 6f 20 0a 20 20 20 20 20  ll get to .     
2ee70 20 2a 2a 20 74 68 69 73 20 70 6f 69 6e 74 20 69   ** this point i
2ee80 6e 20 74 68 65 20 63 6f 64 65 20 61 6e 64 20 66  n the code and f
2ee90 61 69 6c 20 74 6f 20 6f 62 74 61 69 6e 20 69 74  ail to obtain it
2eea0 73 20 6f 77 6e 20 45 58 43 4c 55 53 49 56 45 20  s own EXCLUSIVE 
2eeb0 6c 6f 63 6b 20 0a 20 20 20 20 20 20 2a 2a 20 6f  lock .      ** o
2eec0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2eed0 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ile..      **.  
2eee0 20 20 20 20 2a 2a 20 55 6e 6c 65 73 73 20 74 68      ** Unless th
2eef0 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 6c 6f  e pager is in lo
2ef00 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75  cking_mode=exclu
2ef10 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 65 20 6c  sive mode, the l
2ef20 6f 63 6b 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  ock is.      ** 
2ef30 64 6f 77 6e 67 72 61 64 65 64 20 74 6f 20 53 48  downgraded to SH
2ef40 41 52 45 44 5f 4c 4f 43 4b 20 62 65 66 6f 72 65  ARED_LOCK before
2ef50 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
2ef60 65 74 75 72 6e 73 2e 0a 20 20 20 20 20 20 2a 2f  eturns..      */
2ef70 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
2ef80 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20  rLockDb(pPager, 
2ef90 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b  EXCLUSIVE_LOCK);
2efa0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
2efb0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2efc0 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b      goto failed;
2efd0 0a 20 20 20 20 20 20 7d 0a 20 0a 20 20 20 20 20  .      }. .     
2efe0 20 2f 2a 20 49 66 20 69 74 20 69 73 20 6e 6f 74   /* If it is not
2eff0 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 61 6e   already open an
2f000 64 20 74 68 65 20 66 69 6c 65 20 65 78 69 73 74  d the file exist
2f010 73 20 6f 6e 20 64 69 73 6b 2c 20 6f 70 65 6e 20  s on disk, open 
2f020 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f  the .      ** jo
2f030 75 72 6e 61 6c 20 66 6f 72 20 72 65 61 64 2f 77  urnal for read/w
2f040 72 69 74 65 20 61 63 63 65 73 73 2e 20 57 72 69  rite access. Wri
2f050 74 65 20 61 63 63 65 73 73 20 69 73 20 72 65 71  te access is req
2f060 75 69 72 65 64 20 62 65 63 61 75 73 65 20 0a 20  uired because . 
2f070 20 20 20 20 20 2a 2a 20 69 6e 20 65 78 63 6c 75       ** in exclu
2f080 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65  sive-access mode
2f090 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
2f0a0 70 74 6f 72 20 77 69 6c 6c 20 62 65 20 6b 65 70  ptor will be kep
2f0b0 74 20 6f 70 65 6e 20 0a 20 20 20 20 20 20 2a 2a  t open .      **
2f0c0 20 61 6e 64 20 70 6f 73 73 69 62 6c 79 20 75 73   and possibly us
2f0d0 65 64 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63  ed for a transac
2f0e0 74 69 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e 20 41  tion later on. A
2f0f0 6c 73 6f 2c 20 77 72 69 74 65 2d 61 63 63 65 73  lso, write-acces
2f100 73 20 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 75  s .      ** is u
2f110 73 75 61 6c 6c 79 20 72 65 71 75 69 72 65 64 20  sually required 
2f120 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20  to finalize the 
2f130 6a 6f 75 72 6e 61 6c 20 69 6e 20 6a 6f 75 72 6e  journal in journ
2f140 61 6c 5f 6d 6f 64 65 3d 70 65 72 73 69 73 74 20  al_mode=persist 
2f150 0a 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65 20 28  .      ** mode (
2f160 61 6e 64 20 61 6c 73 6f 20 66 6f 72 20 6a 6f 75  and also for jou
2f170 72 6e 61 6c 5f 6d 6f 64 65 3d 74 72 75 6e 63 61  rnal_mode=trunca
2f180 74 65 20 6f 6e 20 73 6f 6d 65 20 73 79 73 74 65  te on some syste
2f190 6d 73 29 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ms)..      **.  
2f1a0 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 6a 6f      ** If the jo
2f1b0 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20 65  urnal does not e
2f1c0 78 69 73 74 2c 20 69 74 20 75 73 75 61 6c 6c 79  xist, it usually
2f1d0 20 6d 65 61 6e 73 20 74 68 61 74 20 73 6f 6d 65   means that some
2f1e0 20 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72   .      ** other
2f1f0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61 6e 61   connection mana
2f200 67 65 64 20 74 6f 20 67 65 74 20 69 6e 20 61 6e  ged to get in an
2f210 64 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20 62  d roll it back b
2f220 65 66 6f 72 65 20 0a 20 20 20 20 20 20 2a 2a 20  efore .      ** 
2f230 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  this connection 
2f240 6f 62 74 61 69 6e 65 64 20 74 68 65 20 65 78 63  obtained the exc
2f250 6c 75 73 69 76 65 20 6c 6f 63 6b 20 61 62 6f 76  lusive lock abov
2f260 65 2e 20 4f 72 2c 20 69 74 20 0a 20 20 20 20 20  e. Or, it .     
2f270 20 2a 2a 20 6d 61 79 20 6d 65 61 6e 20 74 68 61   ** may mean tha
2f280 74 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20  t the pager was 
2f290 69 6e 20 74 68 65 20 65 72 72 6f 72 2d 73 74 61  in the error-sta
2f2a0 74 65 20 77 68 65 6e 20 74 68 69 73 0a 20 20 20  te when this.   
2f2b0 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77     ** function w
2f2c0 61 73 20 63 61 6c 6c 65 64 20 61 6e 64 20 74 68  as called and th
2f2d0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  e journal file d
2f2e0 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a 20  oes not exist.. 
2f2f0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
2f300 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  ( !isOpen(pPager
2f310 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20  ->jfd) ){.      
2f320 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20    sqlite3_vfs * 
2f330 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61  const pVfs = pPa
2f340 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 20 20 20  ger->pVfs;.     
2f350 20 20 20 69 6e 74 20 62 45 78 69 73 74 73 3b 20     int bExists; 
2f360 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2f370 54 72 75 65 20 69 66 20 6a 6f 75 72 6e 61 6c 20  True if journal 
2f380 66 69 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a 20  file exists */. 
2f390 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
2f3a0 74 65 33 4f 73 41 63 63 65 73 73 28 0a 20 20 20  te3OsAccess(.   
2f3b0 20 20 20 20 20 20 20 20 20 70 56 66 73 2c 20 70           pVfs, p
2f3c0 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
2f3d0 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
2f3e0 58 49 53 54 53 2c 20 26 62 45 78 69 73 74 73 29  XISTS, &bExists)
2f3f0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
2f400 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62  ==SQLITE_OK && b
2f410 45 78 69 73 74 73 20 29 7b 0a 20 20 20 20 20 20  Exists ){.      
2f420 20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30      int fout = 0
2f430 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  ;.          int 
2f440 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  f = SQLITE_OPEN_
2f450 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45  READWRITE|SQLITE
2f460 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
2f470 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  AL;.          as
2f480 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74  sert( !pPager->t
2f490 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 20  empFile );.     
2f4a0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2f4b0 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50  3OsOpen(pVfs, pP
2f4c0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
2f4d0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20  pPager->jfd, f, 
2f4e0 26 66 6f 75 74 29 3b 0a 20 20 20 20 20 20 20 20  &fout);.        
2f4f0 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
2f500 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65  LITE_OK || isOpe
2f510 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
2f520 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2f530 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2f540 20 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50 45   fout&SQLITE_OPE
2f550 4e 5f 52 45 41 44 4f 4e 4c 59 20 29 7b 0a 20 20  N_READONLY ){.  
2f560 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
2f570 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42  QLITE_CANTOPEN_B
2f580 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20  KPT;.           
2f590 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
2f5a0 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
2f5b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2f5c0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 0a 20 20    }.      }. .  
2f5d0 20 20 20 20 2f 2a 20 50 6c 61 79 62 61 63 6b 20      /* Playback 
2f5e0 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 6a  and delete the j
2f5f0 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20 74 68  ournal.  Drop th
2f600 65 20 64 61 74 61 62 61 73 65 20 77 72 69 74 65  e database write
2f610 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 61  .      ** lock a
2f620 6e 64 20 72 65 61 63 71 75 69 72 65 20 74 68 65  nd reacquire the
2f630 20 72 65 61 64 20 6c 6f 63 6b 2e 20 50 75 72 67   read lock. Purg
2f640 65 20 74 68 65 20 63 61 63 68 65 20 62 65 66 6f  e the cache befo
2f650 72 65 0a 20 20 20 20 20 20 2a 2a 20 70 6c 61 79  re.      ** play
2f660 69 6e 67 20 62 61 63 6b 20 74 68 65 20 68 6f 74  ing back the hot
2f670 2d 6a 6f 75 72 6e 61 6c 20 73 6f 20 74 68 61 74  -journal so that
2f680 20 77 65 20 64 6f 6e 27 74 20 65 6e 64 20 75 70   we don't end up
2f690 20 77 69 74 68 0a 20 20 20 20 20 20 2a 2a 20 61   with.      ** a
2f6a0 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 63  n inconsistent c
2f6b0 61 63 68 65 2e 20 20 53 79 6e 63 20 74 68 65 20  ache.  Sync the 
2f6c0 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f  hot journal befo
2f6d0 72 65 20 70 6c 61 79 69 6e 67 0a 20 20 20 20 20  re playing.     
2f6e0 20 2a 2a 20 69 74 20 62 61 63 6b 20 73 69 6e 63   ** it back sinc
2f6f0 65 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68  e the process th
2f700 61 74 20 63 72 61 73 68 65 64 20 61 6e 64 20 6c  at crashed and l
2f710 65 66 74 20 74 68 65 20 68 6f 74 20 6a 6f 75 72  eft the hot jour
2f720 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20 70 72 6f  nal.      ** pro
2f730 62 61 62 6c 79 20 64 69 64 20 6e 6f 74 20 73 79  bably did not sy
2f740 6e 63 20 69 74 20 61 6e 64 20 77 65 20 61 72 65  nc it and we are
2f750 20 72 65 71 75 69 72 65 64 20 74 6f 20 61 6c 77   required to alw
2f760 61 79 73 20 73 79 6e 63 0a 20 20 20 20 20 20 2a  ays sync.      *
2f770 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 65  * the journal be
2f780 66 6f 72 65 20 70 6c 61 79 69 6e 67 20 69 74 20  fore playing it 
2f790 62 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  back..      */. 
2f7a0 20 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28       if( isOpen(
2f7b0 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a  pPager->jfd) ){.
2f7c0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2f7d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
2f7e0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61  .        rc = pa
2f7f0 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61  gerSyncHotJourna
2f800 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  l(pPager);.     
2f810 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2f820 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2f830 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
2f840 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20 31 29  yback(pPager, 1)
2f850 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  ;.          pPag
2f860 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47  er->eState = PAG
2f870 45 52 5f 4f 50 45 4e 3b 0a 20 20 20 20 20 20 20  ER_OPEN;.       
2f880 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69   }.      }else i
2f890 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  f( !pPager->excl
2f8a0 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20  usiveMode ){.   
2f8b0 20 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b       pagerUnlock
2f8c0 44 62 28 70 50 61 67 65 72 2c 20 53 48 41 52 45  Db(pPager, SHARE
2f8d0 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d  D_LOCK);.      }
2f8e0 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ..      if( rc!=
2f8f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2f900 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61       /* This bra
2f910 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 69 66 20  nch is taken if 
2f920 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
2f930 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20  while trying to 
2f940 6f 70 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  open.        ** 
2f950 6f 72 20 72 6f 6c 6c 20 62 61 63 6b 20 61 20 68  or roll back a h
2f960 6f 74 2d 6a 6f 75 72 6e 61 6c 20 77 68 69 6c 65  ot-journal while
2f970 20 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c   holding an EXCL
2f980 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65 0a  USIVE lock. The.
2f990 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 72          ** pager
2f9a0 5f 75 6e 6c 6f 63 6b 28 29 20 72 6f 75 74 69 6e  _unlock() routin
2f9b0 65 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64  e will be called
2f9c0 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
2f9d0 67 20 74 6f 20 75 6e 6c 6f 63 6b 0a 20 20 20 20  g to unlock.    
2f9e0 20 20 20 20 2a 2a 20 74 68 65 20 66 69 6c 65 2e      ** the file.
2f9f0 20 49 66 20 74 68 65 20 75 6e 6c 6f 63 6b 20 61   If the unlock a
2fa00 74 74 65 6d 70 74 20 66 61 69 6c 73 2c 20 74 68  ttempt fails, th
2fa10 65 6e 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 6d  en Pager.eLock m
2fa20 75 73 74 20 62 65 0a 20 20 20 20 20 20 20 20 2a  ust be.        *
2fa30 2a 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e  * set to UNKNOWN
2fa40 5f 4c 4f 43 4b 20 28 73 65 65 20 74 68 65 20 63  _LOCK (see the c
2fa50 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20 74 68 65  omment above the
2fa60 20 23 64 65 66 69 6e 65 20 66 6f 72 20 0a 20 20   #define for .  
2fa70 20 20 20 20 20 20 2a 2a 20 55 4e 4b 4e 4f 57 4e        ** UNKNOWN
2fa80 5f 4c 4f 43 4b 20 61 62 6f 76 65 20 66 6f 72 20  _LOCK above for 
2fa90 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 29 2e  an explanation).
2faa0 20 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20   .        **.   
2fab0 20 20 20 20 20 2a 2a 20 49 6e 20 6f 72 64 65 72       ** In order
2fac0 20 74 6f 20 67 65 74 20 70 61 67 65 72 5f 75 6e   to get pager_un
2fad0 6c 6f 63 6b 28 29 20 74 6f 20 64 6f 20 74 68 69  lock() to do thi
2fae0 73 2c 20 73 65 74 20 50 61 67 65 72 2e 65 53 74  s, set Pager.eSt
2faf0 61 74 65 20 74 6f 0a 20 20 20 20 20 20 20 20 2a  ate to.        *
2fb00 2a 20 50 41 47 45 52 5f 45 52 52 4f 52 20 6e 6f  * PAGER_ERROR no
2fb10 77 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61  w. This is not a
2fb20 63 74 75 61 6c 6c 79 20 63 6f 75 6e 74 65 64 20  ctually counted 
2fb30 61 73 20 61 20 74 72 61 6e 73 69 74 69 6f 6e 0a  as a transition.
2fb40 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 45 52          ** to ER
2fb50 52 4f 52 20 73 74 61 74 65 20 69 6e 20 74 68 65  ROR state in the
2fb60 20 73 74 61 74 65 20 64 69 61 67 72 61 6d 20 61   state diagram a
2fb70 74 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 69  t the top of thi
2fb80 73 20 66 69 6c 65 2c 0a 20 20 20 20 20 20 20 20  s file,.        
2fb90 2a 2a 20 73 69 6e 63 65 20 77 65 20 6b 6e 6f 77  ** since we know
2fba0 20 74 68 61 74 20 74 68 65 20 73 61 6d 65 20 63   that the same c
2fbb0 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c  all to pager_unl
2fbc0 6f 63 6b 28 29 20 77 69 6c 6c 20 76 65 72 79 0a  ock() will very.
2fbd0 20 20 20 20 20 20 20 20 2a 2a 20 73 68 6f 72 74          ** short
2fbe0 6c 79 20 74 72 61 6e 73 69 74 69 6f 6e 20 74 68  ly transition th
2fbf0 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 74  e pager object t
2fc00 6f 20 74 68 65 20 4f 50 45 4e 20 73 74 61 74 65  o the OPEN state
2fc10 2e 20 43 61 6c 6c 69 6e 67 0a 20 20 20 20 20 20  . Calling.      
2fc20 20 20 2a 2a 20 61 73 73 65 72 74 5f 70 61 67 65    ** assert_page
2fc30 72 5f 73 74 61 74 65 28 29 20 77 6f 75 6c 64 20  r_state() would 
2fc40 66 61 69 6c 20 6e 6f 77 2c 20 61 73 20 69 74 20  fail now, as it 
2fc50 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 70 6f  should not be po
2fc60 73 73 69 62 6c 65 0a 20 20 20 20 20 20 20 20 2a  ssible.        *
2fc70 2a 20 74 6f 20 62 65 20 69 6e 20 45 52 52 4f 52  * to be in ERROR
2fc80 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 65 72   state when ther
2fc90 65 20 61 72 65 20 7a 65 72 6f 20 6f 75 74 73 74  e are zero outst
2fca0 61 6e 64 69 6e 67 20 70 61 67 65 20 0a 20 20 20  anding page .   
2fcb0 20 20 20 20 20 2a 2a 20 72 65 66 65 72 65 6e 63       ** referenc
2fcc0 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  es..        */. 
2fcd0 20 20 20 20 20 20 20 70 61 67 65 72 5f 65 72 72         pager_err
2fce0 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a  or(pPager, rc);.
2fcf0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69          goto fai
2fd00 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  led;.      }..  
2fd10 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2fd20 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
2fd30 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 20 20 20 20  R_OPEN );.      
2fd40 61 73 73 65 72 74 28 20 28 70 50 61 67 65 72 2d  assert( (pPager-
2fd50 3e 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  >eLock==SHARED_L
2fd60 4f 43 4b 29 0a 20 20 20 20 20 20 20 20 20 20 20  OCK).           
2fd70 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 78 63 6c  || (pPager->excl
2fd80 75 73 69 76 65 4d 6f 64 65 20 26 26 20 70 50 61  usiveMode && pPa
2fd90 67 65 72 2d 3e 65 4c 6f 63 6b 3e 53 48 41 52 45  ger->eLock>SHARE
2fda0 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20 29 3b  D_LOCK).      );
2fdb0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
2fdc0 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
2fdd0 65 20 0a 20 20 20 20 20 26 26 20 28 70 50 61 67  e .     && (pPag
2fde0 65 72 2d 3e 70 42 61 63 6b 75 70 20 7c 7c 20 73  er->pBackup || s
2fdf0 71 6c 69 74 65 33 50 63 61 63 68 65 50 61 67 65  qlite3PcachePage
2fe00 63 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  count(pPager->pP
2fe10 43 61 63 68 65 29 3e 30 29 20 0a 20 20 20 20 29  Cache)>0) .    )
2fe20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73  {.      /* The s
2fe30 68 61 72 65 64 2d 6c 6f 63 6b 20 68 61 73 20 6a  hared-lock has j
2fe40 75 73 74 20 62 65 65 6e 20 61 63 71 75 69 72 65  ust been acquire
2fe50 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
2fe60 65 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20  e file.      ** 
2fe70 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 61 6c  and there are al
2fe80 72 65 61 64 79 20 70 61 67 65 73 20 69 6e 20 74  ready pages in t
2fe90 68 65 20 63 61 63 68 65 20 28 66 72 6f 6d 20 61  he cache (from a
2fea0 20 70 72 65 76 69 6f 75 73 0a 20 20 20 20 20 20   previous.      
2feb0 2a 2a 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  ** read or write
2fec0 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 20 20   transaction).  
2fed0 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
2fee0 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20  the database.   
2fef0 20 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 6d     ** has been m
2ff00 6f 64 69 66 69 65 64 2e 20 20 49 66 20 74 68 65  odified.  If the
2ff10 20 64 61 74 61 62 61 73 65 20 68 61 73 20 63 68   database has ch
2ff20 61 6e 67 65 64 2c 20 66 6c 75 73 68 20 74 68 65  anged, flush the
2ff30 0a 20 20 20 20 20 20 2a 2a 20 63 61 63 68 65 2e  .      ** cache.
2ff40 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
2ff50 2a 2a 20 44 61 74 61 62 61 73 65 20 63 68 61 6e  ** Database chan
2ff60 67 65 73 20 69 73 20 64 65 74 65 63 74 65 64 20  ges is detected 
2ff70 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 31 35  by looking at 15
2ff80 20 62 79 74 65 73 20 62 65 67 69 6e 6e 69 6e 67   bytes beginning
2ff90 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 6f 66 66  .      ** at off
2ffa0 73 65 74 20 32 34 20 69 6e 74 6f 20 74 68 65 20  set 24 into the 
2ffb0 66 69 6c 65 2e 20 20 54 68 65 20 66 69 72 73 74  file.  The first
2ffc0 20 34 20 6f 66 20 74 68 65 73 65 20 31 36 20 62   4 of these 16 b
2ffd0 79 74 65 73 20 61 72 65 0a 20 20 20 20 20 20 2a  ytes are.      *
2ffe0 2a 20 61 20 33 32 2d 62 69 74 20 63 6f 75 6e 74  * a 32-bit count
2fff0 65 72 20 74 68 61 74 20 69 73 20 69 6e 63 72 65  er that is incre
30000 6d 65 6e 74 65 64 20 77 69 74 68 20 65 61 63 68  mented with each
30010 20 63 68 61 6e 67 65 2e 20 20 54 68 65 0a 20 20   change.  The.  
30020 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 62 79 74      ** other byt
30030 65 73 20 63 68 61 6e 67 65 20 72 61 6e 64 6f 6d  es change random
30040 6c 79 20 77 69 74 68 20 65 61 63 68 20 66 69 6c  ly with each fil
30050 65 20 63 68 61 6e 67 65 20 77 68 65 6e 0a 20 20  e change when.  
30060 20 20 20 20 2a 2a 20 61 20 63 6f 64 65 63 20 69      ** a codec i
30070 73 20 69 6e 20 75 73 65 2e 0a 20 20 20 20 20 20  s in use..      
30080 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20 54 68 65  ** .      ** The
30090 72 65 20 69 73 20 61 20 76 61 6e 69 73 68 69 6e  re is a vanishin
300a0 67 6c 79 20 73 6d 61 6c 6c 20 63 68 61 6e 63 65  gly small chance
300b0 20 74 68 61 74 20 61 20 63 68 61 6e 67 65 20 77   that a change w
300c0 69 6c 6c 20 6e 6f 74 20 62 65 20 0a 20 20 20 20  ill not be .    
300d0 20 20 2a 2a 20 64 65 74 65 63 74 65 64 2e 20 20    ** detected.  
300e0 54 68 65 20 63 68 61 6e 63 65 20 6f 66 20 61 6e  The chance of an
300f0 20 75 6e 64 65 74 65 63 74 65 64 20 63 68 61 6e   undetected chan
30100 67 65 20 69 73 20 73 6f 20 73 6d 61 6c 6c 20 74  ge is so small t
30110 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 69 74 20  hat.      ** it 
30120 63 61 6e 20 62 65 20 6e 65 67 6c 65 63 74 65 64  can be neglected
30130 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
30140 20 50 67 6e 6f 20 6e 50 61 67 65 20 3d 20 30 3b   Pgno nPage = 0;
30150 0a 20 20 20 20 20 20 63 68 61 72 20 64 62 46 69  .      char dbFi
30160 6c 65 56 65 72 73 5b 73 69 7a 65 6f 66 28 70 50  leVers[sizeof(pP
30170 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
30180 29 5d 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20  )];..      rc = 
30190 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  pagerPagecount(p
301a0 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a  Pager, &nPage);.
301b0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67        if( rc ) g
301c0 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 0a 20 20 20  oto failed;..   
301d0 20 20 20 69 66 28 20 6e 50 61 67 65 3e 30 20 29     if( nPage>0 )
301e0 7b 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43  {.        IOTRAC
301f0 45 28 28 22 43 4b 56 45 52 53 20 25 70 20 25 64  E(("CKVERS %p %d
30200 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 73 69 7a  \n", pPager, siz
30210 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 29  eof(dbFileVers))
30220 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
30230 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
30240 61 67 65 72 2d 3e 66 64 2c 20 26 64 62 46 69 6c  ager->fd, &dbFil
30250 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62  eVers, sizeof(db
30260 46 69 6c 65 56 65 72 73 29 2c 20 32 34 29 3b 0a  FileVers), 24);.
30270 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
30280 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
30290 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c         goto fail
302a0 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ed;.        }.  
302b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
302c0 20 20 20 6d 65 6d 73 65 74 28 64 62 46 69 6c 65     memset(dbFile
302d0 56 65 72 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Vers, 0, sizeof(
302e0 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20  dbFileVers));.  
302f0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
30300 20 6d 65 6d 63 6d 70 28 70 50 61 67 65 72 2d 3e   memcmp(pPager->
30310 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69  dbFileVers, dbFi
30320 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64  leVers, sizeof(d
30330 62 46 69 6c 65 56 65 72 73 29 29 21 3d 30 20 29  bFileVers))!=0 )
30340 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f  {.        pager_
30350 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
30360 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
30370 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
30380 20 61 20 57 41 4c 20 66 69 6c 65 20 69 6e 20 74   a WAL file in t
30390 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20  he file-system, 
303a0 6f 70 65 6e 20 74 68 69 73 20 64 61 74 61 62 61  open this databa
303b0 73 65 20 69 6e 20 57 41 4c 0a 20 20 20 20 2a 2a  se in WAL.    **
303c0 20 6d 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65   mode. Otherwise
303d0 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  , the following 
303e0 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 69 73  function call is
303f0 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 20 20 2a 2f   a no-op..    */
30400 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4f  .    rc = pagerO
30410 70 65 6e 57 61 6c 49 66 50 72 65 73 65 6e 74 28  penWalIfPresent(
30420 70 50 61 67 65 72 29 3b 0a 23 69 66 6e 64 65 66  pPager);.#ifndef
30430 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
30440 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
30450 67 65 72 2d 3e 70 57 61 6c 3d 3d 30 20 7c 7c 20  ger->pWal==0 || 
30460 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
30470 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 69  .#endif.  }..  i
30480 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  f( pagerUseWal(p
30490 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 61 73  Pager) ){.    as
304a0 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
304b0 5f 4f 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  _OK );.    rc = 
304c0 70 61 67 65 72 42 65 67 69 6e 52 65 61 64 54 72  pagerBeginReadTr
304d0 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
304e0 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50  );.  }..  if( pP
304f0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
30500 47 45 52 5f 4f 50 45 4e 20 26 26 20 72 63 3d 3d  GER_OPEN && rc==
30510 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
30520 20 72 63 20 3d 20 70 61 67 65 72 50 61 67 65 63   rc = pagerPagec
30530 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 70 50  ount(pPager, &pP
30540 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20  ager->dbSize);. 
30550 20 7d 0a 0a 20 66 61 69 6c 65 64 3a 0a 20 20 69   }.. failed:.  i
30560 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
30570 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
30580 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 70 61  !MEMDB );.    pa
30590 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65  ger_unlock(pPage
305a0 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  r);.    assert( 
305b0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
305c0 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20  PAGER_OPEN );.  
305d0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65  }else{.    pPage
305e0 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45  r->eState = PAGE
305f0 52 5f 52 45 41 44 45 52 3b 0a 20 20 7d 0a 20 20  R_READER;.  }.  
30600 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
30610 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 66 65 72  .** If the refer
30620 65 6e 63 65 20 63 6f 75 6e 74 20 68 61 73 20 72  ence count has r
30630 65 61 63 68 65 64 20 7a 65 72 6f 2c 20 72 6f 6c  eached zero, rol
30640 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69 76 65  lback any active
30650 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
30660 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70  and unlock the p
30670 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 45 78 63 65  ager..**.** Exce
30680 70 74 2c 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d  pt, in locking_m
30690 6f 64 65 3d 45 58 43 4c 55 53 49 56 45 20 77 68  ode=EXCLUSIVE wh
306a0 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 74 68  en there is noth
306b0 69 6e 67 20 74 6f 20 69 6e 0a 2a 2a 20 74 68 65  ing to in.** the
306c0 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
306d0 6c 2c 20 74 68 65 20 75 6e 6c 6f 63 6b 20 69 73  l, the unlock is
306e0 20 6e 6f 74 20 70 65 72 66 6f 72 6d 65 64 20 61   not performed a
306f0 6e 64 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e  nd there is.** n
30700 6f 74 68 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61  othing to rollba
30710 63 6b 2c 20 73 6f 20 74 68 69 73 20 72 6f 75 74  ck, so this rout
30720 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
30730 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20  */ .static void 
30740 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75  pagerUnlockIfUnu
30750 73 65 64 28 50 61 67 65 72 20 2a 70 50 61 67 65  sed(Pager *pPage
30760 72 29 7b 0a 20 20 69 66 28 20 28 73 71 6c 69 74  r){.  if( (sqlit
30770 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74  e3PcacheRefCount
30780 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
30790 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 70 61 67  )==0) ){.    pag
307a0 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62  erUnlockAndRollb
307b0 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ack(pPager);.  }
307c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72  .}../*.** Acquir
307d0 65 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  e a reference to
307e0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70 67 6e   page number pgn
307f0 6f 20 69 6e 20 70 61 67 65 72 20 70 50 61 67 65  o in pager pPage
30800 72 20 28 61 20 70 61 67 65 0a 2a 2a 20 72 65 66  r (a page.** ref
30810 65 72 65 6e 63 65 20 68 61 73 20 74 79 70 65 20  erence has type 
30820 44 62 50 61 67 65 2a 29 2e 20 49 66 20 74 68 65  DbPage*). If the
30830 20 72 65 71 75 65 73 74 65 64 20 72 65 66 65 72   requested refer
30840 65 6e 63 65 20 69 73 20 0a 2a 2a 20 73 75 63 63  ence is .** succ
30850 65 73 73 66 75 6c 6c 79 20 6f 62 74 61 69 6e 65  essfully obtaine
30860 64 2c 20 69 74 20 69 73 20 63 6f 70 69 65 64 20  d, it is copied 
30870 74 6f 20 2a 70 70 50 61 67 65 20 61 6e 64 20 53  to *ppPage and S
30880 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
30890 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
308a0 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69  requested page i
308b0 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  s already in the
308c0 20 63 61 63 68 65 2c 20 69 74 20 69 73 20 72 65   cache, it is re
308d0 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68 65  turned. .** Othe
308e0 72 77 69 73 65 2c 20 61 20 6e 65 77 20 70 61 67  rwise, a new pag
308f0 65 20 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f  e object is allo
30900 63 61 74 65 64 20 61 6e 64 20 70 6f 70 75 6c 61  cated and popula
30910 74 65 64 20 77 69 74 68 20 64 61 74 61 0a 2a 2a  ted with data.**
30920 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64   read from the d
30930 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6e  atabase file. In
30940 20 73 6f 6d 65 20 63 61 73 65 73 2c 20 74 68 65   some cases, the
30950 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65 20 6d   pcache module m
30960 61 79 0a 2a 2a 20 63 68 6f 6f 73 65 20 6e 6f 74  ay.** choose not
30970 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e   to allocate a n
30980 65 77 20 70 61 67 65 20 6f 62 6a 65 63 74 20 61  ew page object a
30990 6e 64 20 6d 61 79 20 72 65 75 73 65 20 61 6e 20  nd may reuse an 
309a0 65 78 69 73 74 69 6e 67 0a 2a 2a 20 6f 62 6a 65  existing.** obje
309b0 63 74 20 77 69 74 68 20 6e 6f 20 6f 75 74 73 74  ct with no outst
309c0 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
309d0 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 74  s..**.** The ext
309e0 72 61 20 64 61 74 61 20 61 70 70 65 6e 64 65 64  ra data appended
309f0 20 74 6f 20 61 20 70 61 67 65 20 69 73 20 61 6c   to a page is al
30a00 77 61 79 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  ways initialized
30a10 20 74 6f 20 7a 65 72 6f 73 20 74 68 65 20 0a 2a   to zeros the .*
30a20 2a 20 66 69 72 73 74 20 74 69 6d 65 20 61 20 70  * first time a p
30a30 61 67 65 20 69 73 20 6c 6f 61 64 65 64 20 69 6e  age is loaded in
30a40 74 6f 20 6d 65 6d 6f 72 79 2e 20 49 66 20 74 68  to memory. If th
30a50 65 20 70 61 67 65 20 72 65 71 75 65 73 74 65 64  e page requested
30a60 20 69 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20   is .** already 
30a70 69 6e 20 74 68 65 20 63 61 63 68 65 20 77 68 65  in the cache whe
30a80 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
30a90 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20  is called, then 
30aa0 74 68 65 20 65 78 74 72 61 0a 2a 2a 20 64 61 74  the extra.** dat
30ab0 61 20 69 73 20 6c 65 66 74 20 61 73 20 69 74 20  a is left as it 
30ac0 77 61 73 20 77 68 65 6e 20 74 68 65 20 70 61 67  was when the pag
30ad0 65 20 6f 62 6a 65 63 74 20 77 61 73 20 6c 61 73  e object was las
30ae0 74 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  t used..**.** If
30af0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d   the database im
30b00 61 67 65 20 69 73 20 73 6d 61 6c 6c 65 72 20 74  age is smaller t
30b10 68 61 6e 20 74 68 65 20 72 65 71 75 65 73 74 65  han the requeste
30b20 64 20 70 61 67 65 20 6f 72 20 69 66 20 61 20 0a  d page or if a .
30b30 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75  ** non-zero valu
30b40 65 20 69 73 20 70 61 73 73 65 64 20 61 73 20 74  e is passed as t
30b50 68 65 20 6e 6f 43 6f 6e 74 65 6e 74 20 70 61 72  he noContent par
30b60 61 6d 65 74 65 72 20 61 6e 64 20 74 68 65 20 0a  ameter and the .
30b70 2a 2a 20 72 65 71 75 65 73 74 65 64 20 70 61 67  ** requested pag
30b80 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
30b90 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 63   stored in the c
30ba0 61 63 68 65 2c 20 74 68 65 6e 20 6e 6f 20 0a 2a  ache, then no .*
30bb0 2a 20 61 63 74 75 61 6c 20 64 69 73 6b 20 72 65  * actual disk re
30bc0 61 64 20 6f 63 63 75 72 73 2e 20 49 6e 20 74 68  ad occurs. In th
30bd0 69 73 20 63 61 73 65 20 74 68 65 20 6d 65 6d 6f  is case the memo
30be0 72 79 20 69 6d 61 67 65 20 6f 66 20 74 68 65 20  ry image of the 
30bf0 0a 2a 2a 20 70 61 67 65 20 69 73 20 69 6e 69 74  .** page is init
30c00 69 61 6c 69 7a 65 64 20 74 6f 20 61 6c 6c 20 7a  ialized to all z
30c10 65 72 6f 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  eros. .**.** If 
30c20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74 72 75  noContent is tru
30c30 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  e, it means that
30c40 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20   we do not care 
30c50 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 74 65 6e  about the conten
30c60 74 73 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67  ts.** of the pag
30c70 65 2e 20 54 68 69 73 20 6f 63 63 75 72 73 20 69  e. This occurs i
30c80 6e 20 74 77 6f 20 73 65 70 65 72 61 74 65 20 73  n two seperate s
30c90 63 65 6e 61 72 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20  cenarios:.**.** 
30ca0 20 20 61 29 20 57 68 65 6e 20 72 65 61 64 69 6e    a) When readin
30cb0 67 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  g a free-list le
30cc0 61 66 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65  af page from the
30cd0 20 64 61 74 61 62 61 73 65 2c 20 61 6e 64 0a 2a   database, and.*
30ce0 2a 0a 2a 2a 20 20 20 62 29 20 57 68 65 6e 20 61  *.**   b) When a
30cf0 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 62 65   savepoint is be
30d00 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  ing rolled back 
30d10 61 6e 64 20 77 65 20 6e 65 65 64 20 74 6f 20 6c  and we need to l
30d20 6f 61 64 0a 2a 2a 20 20 20 20 20 20 61 20 6e 65  oad.**      a ne
30d30 77 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20  w page into the 
30d40 63 61 63 68 65 20 74 6f 20 62 65 20 66 69 6c 6c  cache to be fill
30d50 65 64 20 77 69 74 68 20 74 68 65 20 64 61 74 61  ed with the data
30d60 20 72 65 61 64 0a 2a 2a 20 20 20 20 20 20 66 72   read.**      fr
30d70 6f 6d 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74  om the savepoint
30d80 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
30d90 49 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20  If noContent is 
30da0 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 64  true, then the d
30db0 61 74 61 20 72 65 74 75 72 6e 65 64 20 69 73 20  ata returned is 
30dc0 7a 65 72 6f 65 64 20 69 6e 73 74 65 61 64 20 6f  zeroed instead o
30dd0 66 0a 2a 2a 20 62 65 69 6e 67 20 72 65 61 64 20  f.** being read 
30de0 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
30df0 65 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c  e. Additionally,
30e00 20 74 68 65 20 62 69 74 73 20 63 6f 72 72 65 73   the bits corres
30e10 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 67  ponding.** to pg
30e20 6e 6f 20 69 6e 20 50 61 67 65 72 2e 70 49 6e 4a  no in Pager.pInJ
30e30 6f 75 72 6e 61 6c 20 28 62 69 74 76 65 63 20 6f  ournal (bitvec o
30e40 66 20 70 61 67 65 73 20 61 6c 72 65 61 64 79 20  f pages already 
30e50 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a  written to the.*
30e60 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20  * journal file) 
30e70 61 6e 64 20 74 68 65 20 50 61 67 65 72 53 61 76  and the PagerSav
30e80 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f  epoint.pInSavepo
30e90 69 6e 74 20 62 69 74 76 65 63 73 20 6f 66 20 61  int bitvecs of a
30ea0 6e 79 20 6f 70 65 6e 0a 2a 2a 20 73 61 76 65 70  ny open.** savep
30eb0 6f 69 6e 74 73 20 61 72 65 20 73 65 74 2e 20 54  oints are set. T
30ec0 68 69 73 20 6d 65 61 6e 73 20 69 66 20 74 68 65  his means if the
30ed0 20 70 61 67 65 20 69 73 20 6d 61 64 65 20 77 72   page is made wr
30ee0 69 74 61 62 6c 65 20 61 74 20 61 6e 79 0a 2a 2a  itable at any.**
30ef0 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75   point in the fu
30f00 74 75 72 65 2c 20 75 73 69 6e 67 20 61 20 63 61  ture, using a ca
30f10 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  ll to sqlite3Pag
30f20 65 72 57 72 69 74 65 28 29 2c 20 69 74 73 20 63  erWrite(), its c
30f30 6f 6e 74 65 6e 74 73 0a 2a 2a 20 77 69 6c 6c 20  ontents.** will 
30f40 6e 6f 74 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64  not be journaled
30f50 2e 20 54 68 69 73 20 73 61 76 65 73 20 49 4f 2e  . This saves IO.
30f60 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 63 71 75 69  .**.** The acqui
30f70 73 69 74 69 6f 6e 20 6d 69 67 68 74 20 66 61 69  sition might fai
30f80 6c 20 66 6f 72 20 73 65 76 65 72 61 6c 20 72 65  l for several re
30f90 61 73 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63  asons.  In all c
30fa0 61 73 65 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72  ases,.** an appr
30fb0 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f  opriate error co
30fc0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  de is returned a
30fd0 6e 64 20 2a 70 70 50 61 67 65 20 69 73 20 73 65  nd *ppPage is se
30fe0 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  t to NULL..**.**
30ff0 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65   See also sqlite
31000 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29 2e 20  3PagerLookup(). 
31010 20 42 6f 74 68 20 74 68 69 73 20 72 6f 75 74 69   Both this routi
31020 6e 65 20 61 6e 64 20 4c 6f 6f 6b 75 70 28 29 20  ne and Lookup() 
31030 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69  attempt.** to fi
31040 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65  nd a page in the
31050 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
31060 20 66 69 72 73 74 2e 20 20 49 66 20 74 68 65 20   first.  If the 
31070 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  page is not alre
31080 61 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79  ady.** in memory
31090 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 67  , this routine g
310a0 6f 65 73 20 74 6f 20 64 69 73 6b 20 74 6f 20 72  oes to disk to r
310b0 65 61 64 20 69 74 20 69 6e 20 77 68 65 72 65 61  ead it in wherea
310c0 73 20 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75  s Lookup().** ju
310d0 73 74 20 72 65 74 75 72 6e 73 20 30 2e 20 20 54  st returns 0.  T
310e0 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63 71 75  his routine acqu
310f0 69 72 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b  ires a read-lock
31100 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   the first time 
31110 69 74 0a 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20  it.** has to go 
31120 74 6f 20 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75  to disk, and cou
31130 6c 64 20 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b  ld also playback
31140 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20   an old journal 
31150 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a  if necessary..**
31160 20 53 69 6e 63 65 20 4c 6f 6f 6b 75 70 28 29 20   Since Lookup() 
31170 6e 65 76 65 72 20 67 6f 65 73 20 74 6f 20 64 69  never goes to di
31180 73 6b 2c 20 69 74 20 6e 65 76 65 72 20 68 61 73  sk, it never has
31190 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 6c 6f   to deal with lo
311a0 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61  cks.** or journa
311b0 6c 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20  l files..*/.int 
311c0 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75  sqlite3PagerAcqu
311d0 69 72 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50  ire(.  Pager *pP
311e0 61 67 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68  ager,      /* Th
311f0 65 20 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20  e pager open on 
31200 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
31210 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
31220 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
31230 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 66 65 74  ge number to fet
31240 63 68 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a  ch */.  DbPage *
31250 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 57  *ppPage,    /* W
31260 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72 20 74  rite a pointer t
31270 6f 20 74 68 65 20 70 61 67 65 20 68 65 72 65 20  o the page here 
31280 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65  */.  int noConte
31290 6e 74 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e  nt       /* Do n
312a0 6f 74 20 62 6f 74 68 65 72 20 72 65 61 64 69 6e  ot bother readin
312b0 67 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64  g content from d
312c0 69 73 6b 20 69 66 20 74 72 75 65 20 2a 2f 0a 29  isk if true */.)
312d0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67  {.  int rc;.  Pg
312e0 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 61 73 73  Hdr *pPg;..  ass
312f0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
31300 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45  ate>=PAGER_READE
31310 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  R );.  assert( a
31320 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
31330 65 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20  e(pPager) );..  
31340 69 66 28 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20  if( pgno==0 ){. 
31350 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
31360 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
31370 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
31380 70 61 67 65 72 20 69 73 20 69 6e 20 74 68 65 20  pager is in the 
31390 65 72 72 6f 72 20 73 74 61 74 65 2c 20 72 65 74  error state, ret
313a0 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 69 6d 6d  urn an error imm
313b0 65 64 69 61 74 65 6c 79 2e 20 0a 20 20 2a 2a 20  ediately. .  ** 
313c0 4f 74 68 65 72 77 69 73 65 2c 20 72 65 71 75 65  Otherwise, reque
313d0 73 74 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d  st the page from
313e0 20 74 68 65 20 50 43 61 63 68 65 20 6c 61 79 65   the PCache laye
313f0 72 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  r. */.  if( pPag
31400 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c  er->errCode!=SQL
31410 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
31420 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f   = pPager->errCo
31430 64 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  de;.  }else{.   
31440 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61   rc = sqlite3Pca
31450 63 68 65 46 65 74 63 68 28 70 50 61 67 65 72 2d  cheFetch(pPager-
31460 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20  >pPCache, pgno, 
31470 31 2c 20 70 70 50 61 67 65 29 3b 0a 20 20 7d 0a  1, ppPage);.  }.
31480 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
31490 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 45  E_OK ){.    /* E
314a0 69 74 68 65 72 20 74 68 65 20 63 61 6c 6c 20 74  ither the call t
314b0 6f 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46  o sqlite3PcacheF
314c0 65 74 63 68 28 29 20 72 65 74 75 72 6e 65 64 20  etch() returned 
314d0 61 6e 20 65 72 72 6f 72 20 6f 72 20 74 68 65 0a  an error or the.
314e0 20 20 20 20 2a 2a 20 70 61 67 65 72 20 77 61 73      ** pager was
314f0 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
31500 65 72 72 6f 72 2d 73 74 61 74 65 20 77 68 65 6e  error-state when
31510 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
31520 61 73 20 63 61 6c 6c 65 64 2e 0a 20 20 20 20 2a  as called..    *
31530 2a 20 53 65 74 20 70 50 67 20 74 6f 20 30 20 61  * Set pPg to 0 a
31540 6e 64 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 65  nd jump to the e
31550 78 63 65 70 74 69 6f 6e 20 68 61 6e 64 6c 65 72  xception handler
31560 2e 20 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20  .  */.    pPg = 
31570 30 3b 0a 20 20 20 20 67 6f 74 6f 20 70 61 67 65  0;.    goto page
31580 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20  r_acquire_err;. 
31590 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28 2a 70   }.  assert( (*p
315a0 70 50 61 67 65 29 2d 3e 70 67 6e 6f 3d 3d 70 67  pPage)->pgno==pg
315b0 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  no );.  assert( 
315c0 28 2a 70 70 50 61 67 65 29 2d 3e 70 50 61 67 65  (*ppPage)->pPage
315d0 72 3d 3d 70 50 61 67 65 72 20 7c 7c 20 28 2a 70  r==pPager || (*p
315e0 70 50 61 67 65 29 2d 3e 70 50 61 67 65 72 3d 3d  pPage)->pPager==
315f0 30 20 29 3b 0a 0a 20 20 69 66 28 20 28 2a 70 70  0 );..  if( (*pp
31600 50 61 67 65 29 2d 3e 70 50 61 67 65 72 20 26 26  Page)->pPager &&
31610 20 21 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20   !noContent ){. 
31620 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61     /* In this ca
31630 73 65 20 74 68 65 20 70 63 61 63 68 65 20 61 6c  se the pcache al
31640 72 65 61 64 79 20 63 6f 6e 74 61 69 6e 73 20 61  ready contains a
31650 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 63 6f  n initialized co
31660 70 79 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65  py of.    ** the
31670 20 70 61 67 65 2e 20 52 65 74 75 72 6e 20 77 69   page. Return wi
31680 74 68 6f 75 74 20 66 75 72 74 68 65 72 20 61 64  thout further ad
31690 6f 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  o.  */.    asser
316a0 74 28 20 70 67 6e 6f 3c 3d 50 41 47 45 52 5f 4d  t( pgno<=PAGER_M
316b0 41 58 5f 50 47 4e 4f 20 26 26 20 70 67 6e 6f 21  AX_PGNO && pgno!
316c0 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
316d0 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 70 50  Pager) );.    pP
316e0 61 67 65 72 2d 3e 6e 48 69 74 2b 2b 3b 0a 20 20  ager->nHit++;.  
316f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
31700 4f 4b 3b 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  OK;..  }else{.  
31710 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 63    /* The pager c
31720 61 63 68 65 20 68 61 73 20 63 72 65 61 74 65 64  ache has created
31730 20 61 20 6e 65 77 20 70 61 67 65 2e 20 49 74 73   a new page. Its
31740 20 63 6f 6e 74 65 6e 74 20 6e 65 65 64 73 20 74   content needs t
31750 6f 20 0a 20 20 20 20 2a 2a 20 62 65 20 69 6e 69  o .    ** be ini
31760 74 69 61 6c 69 7a 65 64 2e 20 20 2a 2f 0a 0a 20  tialized.  */.. 
31770 20 20 20 70 50 67 20 3d 20 2a 70 70 50 61 67 65     pPg = *ppPage
31780 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65  ;.    pPg->pPage
31790 72 20 3d 20 70 50 61 67 65 72 3b 0a 0a 20 20 20  r = pPager;..   
317a0 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20   /* The maximum 
317b0 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 32  page number is 2
317c0 5e 33 31 2e 20 52 65 74 75 72 6e 20 53 51 4c 49  ^31. Return SQLI
317d0 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61 20  TE_CORRUPT if a 
317e0 70 61 67 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62  page.    ** numb
317f0 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  er greater than 
31800 74 68 69 73 2c 20 6f 72 20 74 68 65 20 75 6e 75  this, or the unu
31810 73 65 64 20 6c 6f 63 6b 69 6e 67 2d 70 61 67 65  sed locking-page
31820 2c 20 69 73 20 72 65 71 75 65 73 74 65 64 2e 20  , is requested. 
31830 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3e  */.    if( pgno>
31840 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c  PAGER_MAX_PGNO |
31850 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a  | pgno==PAGER_MJ
31860 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b  _PGNO(pPager) ){
31870 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
31880 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
31890 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
318a0 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20  r_acquire_err;. 
318b0 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 4d 45     }..    if( ME
318c0 4d 44 42 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64  MDB || pPager->d
318d0 62 53 69 7a 65 3c 70 67 6e 6f 20 7c 7c 20 6e 6f  bSize<pgno || no
318e0 43 6f 6e 74 65 6e 74 20 7c 7c 20 21 69 73 4f 70  Content || !isOp
318f0 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
31900 7b 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f  {.      if( pgno
31910 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20  >pPager->mxPgno 
31920 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
31930 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20  SQLITE_FULL;.   
31940 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f       goto pager_
31950 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20  acquire_err;.   
31960 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e     }.      if( n
31970 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20  oContent ){.    
31980 20 20 20 20 2f 2a 20 46 61 69 6c 75 72 65 20 74      /* Failure t
31990 6f 20 73 65 74 20 74 68 65 20 62 69 74 73 20 69  o set the bits i
319a0 6e 20 74 68 65 20 49 6e 4a 6f 75 72 6e 61 6c 20  n the InJournal 
319b0 62 69 74 2d 76 65 63 74 6f 72 73 20 69 73 20 62  bit-vectors is b
319c0 65 6e 69 67 6e 2e 0a 20 20 20 20 20 20 20 20 2a  enign..        *
319d0 2a 20 49 74 20 6d 65 72 65 6c 79 20 6d 65 61 6e  * It merely mean
319e0 73 20 74 68 61 74 20 77 65 20 6d 69 67 68 74 20  s that we might 
319f0 64 6f 20 73 6f 6d 65 20 65 78 74 72 61 20 77 6f  do some extra wo
31a00 72 6b 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 61 20  rk to journal a 
31a10 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65  .        ** page
31a20 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e   that does not n
31a30 65 65 64 20 74 6f 20 62 65 20 6a 6f 75 72 6e 61  eed to be journa
31a40 6c 65 64 2e 20 20 4e 65 76 65 72 74 68 65 6c 65  led.  Neverthele
31a50 73 73 2c 20 62 65 20 73 75 72 65 20 0a 20 20 20  ss, be sure .   
31a60 20 20 20 20 20 2a 2a 20 74 6f 20 74 65 73 74 20       ** to test 
31a70 74 68 65 20 63 61 73 65 20 77 68 65 72 65 20 61  the case where a
31a80 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f 63   malloc error oc
31a90 63 75 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e  curs while tryin
31aa0 67 20 74 6f 20 73 65 74 20 0a 20 20 20 20 20 20  g to set .      
31ab0 20 20 2a 2a 20 61 20 62 69 74 20 69 6e 20 61 20    ** a bit in a 
31ac0 62 69 74 20 76 65 63 74 6f 72 2e 0a 20 20 20 20  bit vector..    
31ad0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73      */.        s
31ae0 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
31af0 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20  nMalloc();.     
31b00 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61     if( pgno<=pPa
31b10 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20  ger->dbOrigSize 
31b20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 45 53  ){.          TES
31b30 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20 73 71  TONLY( rc = ) sq
31b40 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70  lite3BitvecSet(p
31b50 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
31b60 6c 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  l, pgno);.      
31b70 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
31b80 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
31b90 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
31ba0 20 20 20 20 54 45 53 54 4f 4e 4c 59 28 20 72 63      TESTONLY( rc
31bb0 20 3d 20 29 20 61 64 64 54 6f 53 61 76 65 70 6f   = ) addToSavepo
31bc0 69 6e 74 42 69 74 76 65 63 73 28 70 50 61 67 65  intBitvecs(pPage
31bd0 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  r, pgno);.      
31be0 20 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d    testcase( rc==
31bf0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a  SQLITE_NOMEM );.
31c00 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
31c10 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
31c20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
31c30 6d 65 6d 73 65 74 28 70 50 67 2d 3e 70 44 61 74  memset(pPg->pDat
31c40 61 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61  a, 0, pPager->pa
31c50 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 49  geSize);.      I
31c60 4f 54 52 41 43 45 28 28 22 5a 45 52 4f 20 25 70  OTRACE(("ZERO %p
31c70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
31c80 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 65 6c 73  pgno));.    }els
31c90 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
31ca0 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50   pPg->pPager==pP
31cb0 61 67 65 72 20 29 3b 0a 20 20 20 20 20 20 70 50  ager );.      pP
31cc0 61 67 65 72 2d 3e 6e 4d 69 73 73 2b 2b 3b 0a 20  ager->nMiss++;. 
31cd0 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 44 62       rc = readDb
31ce0 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20  Page(pPg);.     
31cf0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
31d00 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
31d10 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65  to pager_acquire
31d20 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _err;.      }.  
31d30 20 20 7d 0a 20 20 20 20 70 61 67 65 72 5f 73 65    }.    pager_se
31d40 74 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b  t_pagehash(pPg);
31d50 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53  .  }..  return S
31d60 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 72  QLITE_OK;..pager
31d70 5f 61 63 71 75 69 72 65 5f 65 72 72 3a 0a 20 20  _acquire_err:.  
31d80 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
31d90 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20 70  TE_OK );.  if( p
31da0 50 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  Pg ){.    sqlite
31db0 33 50 63 61 63 68 65 44 72 6f 70 28 70 50 67 29  3PcacheDrop(pPg)
31dc0 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 55 6e 6c  ;.  }.  pagerUnl
31dd0 6f 63 6b 49 66 55 6e 75 73 65 64 28 70 50 61 67  ockIfUnused(pPag
31de0 65 72 29 3b 0a 0a 20 20 2a 70 70 50 61 67 65 20  er);..  *ppPage 
31df0 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  = 0;.  return rc
31e00 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69  ;.}../*.** Acqui
31e10 72 65 20 61 20 70 61 67 65 20 69 66 20 69 74 20  re a page if it 
31e20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  is already in th
31e30 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68  e in-memory cach
31e40 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65  e.  Do.** not re
31e50 61 64 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d  ad the page from
31e60 20 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 61   disk.  Return a
31e70 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
31e80 70 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66  page,.** or 0 if
31e90 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
31ea0 20 69 6e 20 63 61 63 68 65 2e 20 0a 2a 2a 0a 2a   in cache. .**.*
31eb0 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74  * See also sqlit
31ec0 65 33 50 61 67 65 72 47 65 74 28 29 2e 20 20 54  e3PagerGet().  T
31ed0 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65  he difference be
31ee0 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69  tween this routi
31ef0 6e 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65  ne.** and sqlite
31f00 33 50 61 67 65 72 47 65 74 28 29 20 69 73 20 74  3PagerGet() is t
31f10 68 61 74 20 5f 67 65 74 28 29 20 77 69 6c 6c 20  hat _get() will 
31f20 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61  go to the disk a
31f30 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74 68  nd read.** in th
31f40 65 20 70 61 67 65 20 69 66 20 74 68 65 20 70 61  e page if the pa
31f50 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  ge is not alread
31f60 79 20 69 6e 20 63 61 63 68 65 2e 20 20 54 68 69  y in cache.  Thi
31f70 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74  s routine.** ret
31f80 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68 65  urns NULL if the
31f90 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
31fa0 63 61 63 68 65 20 6f 72 20 69 66 20 61 20 64 69  cache or if a di
31fb0 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a  sk I/O error .**
31fc0 20 68 61 73 20 65 76 65 72 20 68 61 70 70 65 6e   has ever happen
31fd0 65 64 2e 0a 2a 2f 0a 44 62 50 61 67 65 20 2a 73  ed..*/.DbPage *s
31fe0 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75  qlite3PagerLooku
31ff0 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  p(Pager *pPager,
32000 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50   Pgno pgno){.  P
32010 67 48 64 72 20 2a 70 50 67 20 3d 20 30 3b 0a 20  gHdr *pPg = 0;. 
32020 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21   assert( pPager!
32030 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
32040 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 61 73 73  pgno!=0 );.  ass
32050 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 50 43  ert( pPager->pPC
32060 61 63 68 65 21 3d 30 20 29 3b 0a 20 20 61 73 73  ache!=0 );.  ass
32070 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
32080 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45  ate>=PAGER_READE
32090 52 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74  R && pPager->eSt
320a0 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate!=PAGER_ERROR
320b0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61   );.  sqlite3Pca
320c0 63 68 65 46 65 74 63 68 28 70 50 61 67 65 72 2d  cheFetch(pPager-
320d0 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20  >pPCache, pgno, 
320e0 30 2c 20 26 70 50 67 29 3b 0a 20 20 72 65 74 75  0, &pPg);.  retu
320f0 72 6e 20 70 50 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn pPg;.}../*.**
32100 20 52 65 6c 65 61 73 65 20 61 20 70 61 67 65 20   Release a page 
32110 72 65 66 65 72 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a  reference..**.**
32120 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   If the number o
32130 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  f references to 
32140 74 68 65 20 70 61 67 65 20 64 72 6f 70 20 74 6f  the page drop to
32150 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a   zero, then the.
32160 2a 2a 20 70 61 67 65 20 69 73 20 61 64 64 65 64  ** page is added
32170 20 74 6f 20 74 68 65 20 4c 52 55 20 6c 69 73 74   to the LRU list
32180 2e 20 20 57 68 65 6e 20 61 6c 6c 20 72 65 66 65  .  When all refe
32190 72 65 6e 63 65 73 20 74 6f 20 61 6c 6c 20 70 61  rences to all pa
321a0 67 65 73 0a 2a 2a 20 61 72 65 20 72 65 6c 65 61  ges.** are relea
321b0 73 65 64 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20  sed, a rollback 
321c0 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65 20 6c  occurs and the l
321d0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
321e0 61 73 65 20 69 73 0a 2a 2a 20 72 65 6d 6f 76 65  ase is.** remove
321f0 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
32200 65 33 50 61 67 65 72 55 6e 72 65 66 28 44 62 50  e3PagerUnref(DbP
32210 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 69 66 28  age *pPg){.  if(
32220 20 70 50 67 20 29 7b 0a 20 20 20 20 50 61 67 65   pPg ){.    Page
32230 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
32240 3e 70 50 61 67 65 72 3b 0a 20 20 20 20 73 71 6c  >pPager;.    sql
32250 69 74 65 33 50 63 61 63 68 65 52 65 6c 65 61 73  ite3PcacheReleas
32260 65 28 70 50 67 29 3b 0a 20 20 20 20 70 61 67 65  e(pPg);.    page
32270 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28  rUnlockIfUnused(
32280 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a  pPager);.  }.}..
32290 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
322a0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 74  ion is called at
322b0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 76   the start of ev
322c0 65 72 79 20 77 72 69 74 65 20 74 72 61 6e 73 61  ery write transa
322d0 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 72 65 20  ction..** There 
322e0 6d 75 73 74 20 61 6c 72 65 61 64 79 20 62 65 20  must already be 
322f0 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58  a RESERVED or EX
32300 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
32310 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a  the database .**
32320 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20   file when this 
32330 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
32340 64 2e 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68  d..**.** Open th
32350 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
32360 6f 72 20 70 61 67 65 72 20 70 50 61 67 65 72 20  or pager pPager 
32370 61 6e 64 20 77 72 69 74 65 20 61 20 6a 6f 75 72  and write a jour
32380 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20 74 6f  nal header.** to
32390 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 69 74   the start of it
323a0 2e 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61  . If there are a
323b0 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73  ctive savepoints
323c0 2c 20 6f 70 65 6e 20 74 68 65 20 73 75 62 2d 6a  , open the sub-j
323d0 6f 75 72 6e 61 6c 0a 2a 2a 20 61 73 20 77 65 6c  ournal.** as wel
323e0 6c 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  l. This function
323f0 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 77 68   is only used wh
32400 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
32410 69 6c 65 20 69 73 20 62 65 69 6e 67 20 0a 2a 2a  ile is being .**
32420 20 6f 70 65 6e 65 64 20 74 6f 20 77 72 69 74 65   opened to write
32430 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6c 6f 67 20   a rollback log 
32440 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f  for a transactio
32450 6e 2e 20 49 74 20 69 73 20 6e 6f 74 20 75 73 65  n. It is not use
32460 64 20 0a 2a 2a 20 77 68 65 6e 20 6f 70 65 6e 69  d .** when openi
32470 6e 67 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  ng a hot journal
32480 20 66 69 6c 65 20 74 6f 20 72 6f 6c 6c 20 69 74   file to roll it
32490 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   back..**.** If 
324a0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
324b0 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e   is already open
324c0 20 28 61 73 20 69 74 20 6d 61 79 20 62 65 20 69   (as it may be i
324d0 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
324e0 29 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73 20  ),.** then this 
324f0 66 75 6e 63 74 69 6f 6e 20 6a 75 73 74 20 77 72  function just wr
32500 69 74 65 73 20 61 20 6a 6f 75 72 6e 61 6c 20 68  ites a journal h
32510 65 61 64 65 72 20 74 6f 20 74 68 65 20 73 74 61  eader to the sta
32520 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20 61 6c 72  rt of the.** alr
32530 65 61 64 79 20 6f 70 65 6e 20 66 69 6c 65 2e 20  eady open file. 
32540 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f  .**.** Whether o
32550 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61  r not the journa
32560 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64  l file is opened
32570 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
32580 6e 2c 20 74 68 65 0a 2a 2a 20 50 61 67 65 72 2e  n, the.** Pager.
32590 70 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 76 65  pInJournal bitve
325a0 63 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  c structure is a
325b0 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  llocated..**.** 
325c0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
325d0 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 69   if everything i
325e0 73 20 73 75 63 63 65 73 73 66 75 6c 2e 20 4f 74  s successful. Ot
325f0 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20  herwise, return 
32600 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  .** SQLITE_NOMEM
32610 20 69 66 20 74 68 65 20 61 74 74 65 6d 70 74 20   if the attempt 
32620 74 6f 20 61 6c 6c 6f 63 61 74 65 20 50 61 67 65  to allocate Page
32630 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 66 61 69  r.pInJournal fai
32640 6c 73 2c 20 6f 72 20 0a 2a 2a 20 61 6e 20 49 4f  ls, or .** an IO
32650 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 6f   error code if o
32660 70 65 6e 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  pening or writin
32670 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  g the journal fi
32680 6c 65 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61  le fails..*/.sta
32690 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 6f 70  tic int pager_op
326a0 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67 65 72  en_journal(Pager
326b0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
326c0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
326d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
326e0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
326f0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69  n code */.  sqli
32700 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20  te3_vfs * const 
32710 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
32720 56 66 73 3b 20 20 20 2f 2a 20 4c 6f 63 61 6c 20  Vfs;   /* Local 
32730 63 61 63 68 65 20 6f 66 20 76 66 73 20 70 6f 69  cache of vfs poi
32740 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72  nter */..  asser
32750 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
32760 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
32770 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 61 73 73 65  LOCKED );.  asse
32780 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
32790 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
327a0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
327b0 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d  er->pInJournal==
327c0 30 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49 66 20  0 );.  .  /* If 
327d0 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 65  already in the e
327e0 72 72 6f 72 20 73 74 61 74 65 2c 20 74 68 69 73  rror state, this
327f0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
32800 6f 2d 6f 70 2e 20 20 42 75 74 20 6f 6e 0a 20 20  o-op.  But on.  
32810 2a 2a 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e  ** the other han
32820 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  d, this routine 
32830 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20  is never called 
32840 69 66 20 77 65 20 61 72 65 20 61 6c 72 65 61 64  if we are alread
32850 79 20 69 6e 0a 20 20 2a 2a 20 61 6e 20 65 72 72  y in.  ** an err
32860 6f 72 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 69  or state. */.  i
32870 66 28 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d  f( NEVER(pPager-
32880 3e 65 72 72 43 6f 64 65 29 20 29 20 72 65 74 75  >errCode) ) retu
32890 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  rn pPager->errCo
328a0 64 65 3b 0a 0a 20 20 69 66 28 20 21 70 61 67 65  de;..  if( !page
328b0 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
328c0 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
328d0 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f  alMode!=PAGER_JO
328e0 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b  URNALMODE_OFF ){
328f0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e  .    pPager->pIn
32900 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65  Journal = sqlite
32910 33 42 69 74 76 65 63 43 72 65 61 74 65 28 70 50  3BitvecCreate(pP
32920 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20  ager->dbSize);. 
32930 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70     if( pPager->p
32940 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a  InJournal==0 ){.
32950 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
32960 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
32970 0a 20 20 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20  .  .    /* Open 
32980 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
32990 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c   if it is not al
329a0 72 65 61 64 79 20 6f 70 65 6e 2e 20 2a 2f 0a 20  ready open. */. 
329b0 20 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70     if( !isOpen(p
329c0 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20  Pager->jfd) ){. 
329d0 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
329e0 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
329f0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
32a00 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20 20  MEMORY ){.      
32a10 20 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72    sqlite3MemJour
32a20 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  nalOpen(pPager->
32a30 6a 66 64 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  jfd);.      }els
32a40 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  e{.        const
32a50 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 20 20 20   int flags =    
32a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
32a70 2a 20 56 46 53 20 66 6c 61 67 73 20 74 6f 20 6f  * VFS flags to o
32a80 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  pen journal file
32a90 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 53 51   */.          SQ
32aa0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
32ab0 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ITE|SQLITE_OPEN_
32ac0 43 52 45 41 54 45 7c 0a 20 20 20 20 20 20 20 20  CREATE|.        
32ad0 20 20 28 70 50 61 67 65 72 2d 3e 74 65 6d 70 46    (pPager->tempF
32ae0 69 6c 65 20 3f 20 0a 20 20 20 20 20 20 20 20 20  ile ? .         
32af0 20 20 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f     (SQLITE_OPEN_
32b00 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 7c 53 51  DELETEONCLOSE|SQ
32b10 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a  LITE_OPEN_TEMP_J
32b20 4f 55 52 4e 41 4c 29 3a 0a 20 20 20 20 20 20 20  OURNAL):.       
32b30 20 20 20 20 20 28 53 51 4c 49 54 45 5f 4f 50 45       (SQLITE_OPE
32b40 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 0a  N_MAIN_JOURNAL).
32b50 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 23            );.  #
32b60 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
32b70 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  BLE_ATOMIC_WRITE
32b80 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
32b90 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 4f 70 65 6e  lite3JournalOpen
32ba0 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 56  (.            pV
32bb0 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
32bc0 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66  rnal, pPager->jf
32bd0 64 2c 20 66 6c 61 67 73 2c 20 6a 72 6e 6c 42 75  d, flags, jrnlBu
32be0 66 66 65 72 53 69 7a 65 28 70 50 61 67 65 72 29  fferSize(pPager)
32bf0 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 23 65  .        );.  #e
32c00 6c 73 65 0a 20 20 20 20 20 20 20 20 72 63 20 3d  lse.        rc =
32c10 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70   sqlite3OsOpen(p
32c20 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
32c30 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a  urnal, pPager->j
32c40 66 64 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20  fd, flags, 0);. 
32c50 20 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a   #endif.      }.
32c60 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
32c70 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69  !=SQLITE_OK || i
32c80 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
32c90 64 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20  d) );.    }.  . 
32ca0 20 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74   .    /* Write t
32cb0 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c  he first journal
32cc0 20 68 65 61 64 65 72 20 74 6f 20 74 68 65 20 6a   header to the j
32cd0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64 20  ournal file and 
32ce0 6f 70 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65  open .    ** the
32cf0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20   sub-journal if 
32d00 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 20 20 2a  necessary..    *
32d10 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
32d20 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
32d30 20 2f 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b 20   /* TODO: Check 
32d40 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 73 65 20  if all of these 
32d50 61 72 65 20 72 65 61 6c 6c 79 20 72 65 71 75 69  are really requi
32d60 72 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 70 50  red. */.      pP
32d70 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a  ager->nRec = 0;.
32d80 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
32d90 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20  urnalOff = 0;.  
32da0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d      pPager->setM
32db0 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 20  aster = 0;.     
32dc0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
32dd0 48 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  Hdr = 0;.      r
32de0 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  c = writeJournal
32df0 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20  Hdr(pPager);.   
32e00 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63   }.  }..  if( rc
32e10 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
32e20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63     sqlite3Bitvec
32e30 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e  Destroy(pPager->
32e40 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  pInJournal);.   
32e50 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
32e60 6e 61 6c 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  nal = 0;.  }else
32e70 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
32e80 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
32e90 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
32ea0 44 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  D );.    pPager-
32eb0 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f  >eState = PAGER_
32ec0 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 3b  WRITER_CACHEMOD;
32ed0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
32ee0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69  c;.}../*.** Begi
32ef0 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61  n a write-transa
32f00 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 73 70 65  ction on the spe
32f10 63 69 66 69 65 64 20 70 61 67 65 72 20 6f 62 6a  cified pager obj
32f20 65 63 74 2e 20 49 66 20 61 20 0a 2a 2a 20 77 72  ect. If a .** wr
32f30 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
32f40 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
32f50 20 6f 70 65 6e 65 64 2c 20 74 68 69 73 20 66 75   opened, this fu
32f60 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
32f70 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  p..**.** If the 
32f80 65 78 46 6c 61 67 20 61 72 67 75 6d 65 6e 74 20  exFlag argument 
32f90 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 61  is false, then a
32fa0 63 71 75 69 72 65 20 61 74 20 6c 65 61 73 74 20  cquire at least 
32fb0 61 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 6c 6f  a RESERVED.** lo
32fc0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
32fd0 73 65 20 66 69 6c 65 2e 20 49 66 20 65 78 46 6c  se file. If exFl
32fe0 61 67 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  ag is true, then
32ff0 20 61 63 71 75 69 72 65 20 61 74 20 6c 65 61 73   acquire at leas
33000 74 0a 2a 2a 20 61 6e 20 45 58 43 4c 55 53 49 56  t.** an EXCLUSIV
33010 45 20 6c 6f 63 6b 2e 20 49 66 20 73 75 63 68 20  E lock. If such 
33020 61 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64  a lock is alread
33030 79 20 68 65 6c 64 2c 20 6e 6f 20 6c 6f 63 6b 69  y held, no locki
33040 6e 67 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73  ng .** functions
33050 20 6e 65 65 64 20 62 65 20 63 61 6c 6c 65 64 2e   need be called.
33060 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 75  .**.** If the su
33070 62 6a 49 6e 4d 65 6d 6f 72 79 20 61 72 67 75 6d  bjInMemory argum
33080 65 6e 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  ent is non-zero,
33090 20 74 68 65 6e 20 61 6e 79 20 73 75 62 2d 6a 6f   then any sub-jo
330a0 75 72 6e 61 6c 20 6f 70 65 6e 65 64 0a 2a 2a 20  urnal opened.** 
330b0 77 69 74 68 69 6e 20 74 68 69 73 20 74 72 61 6e  within this tran
330c0 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20  saction will be 
330d0 6f 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d  opened as an in-
330e0 6d 65 6d 6f 72 79 20 66 69 6c 65 2e 20 54 68 69  memory file. Thi
330f0 73 0a 2a 2a 20 68 61 73 20 6e 6f 20 65 66 66 65  s.** has no effe
33100 63 74 20 69 66 20 74 68 65 20 73 75 62 2d 6a 6f  ct if the sub-jo
33110 75 72 6e 61 6c 20 69 73 20 61 6c 72 65 61 64 79  urnal is already
33120 20 6f 70 65 6e 65 64 20 28 61 73 20 69 74 20 6d   opened (as it m
33130 61 79 20 62 65 20 77 68 65 6e 0a 2a 2a 20 72 75  ay be when.** ru
33140 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69  nning in exclusi
33150 76 65 20 6d 6f 64 65 29 20 6f 72 20 69 66 20 74  ve mode) or if t
33160 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 64  he transaction d
33170 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65 20  oes not require 
33180 61 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  a.** sub-journal
33190 2e 20 49 66 20 74 68 65 20 73 75 62 6a 49 6e 4d  . If the subjInM
331a0 65 6d 6f 72 79 20 61 72 67 75 6d 65 6e 74 20 69  emory argument i
331b0 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79  s zero, then any
331c0 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 73 75 62   required.** sub
331d0 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 69 6d 70 6c  -journal is impl
331e0 65 6d 65 6e 74 65 64 20 69 6e 2d 6d 65 6d 6f 72  emented in-memor
331f0 79 20 69 66 20 70 50 61 67 65 72 20 69 73 20 61  y if pPager is a
33200 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
33210 62 61 73 65 2c 20 0a 2a 2a 20 6f 72 20 75 73 69  base, .** or usi
33220 6e 67 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  ng a temporary f
33230 69 6c 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  ile otherwise..*
33240 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
33250 65 72 42 65 67 69 6e 28 50 61 67 65 72 20 2a 70  erBegin(Pager *p
33260 50 61 67 65 72 2c 20 69 6e 74 20 65 78 46 6c 61  Pager, int exFla
33270 67 2c 20 69 6e 74 20 73 75 62 6a 49 6e 4d 65 6d  g, int subjInMem
33280 6f 72 79 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ory){.  int rc =
33290 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69   SQLITE_OK;..  i
332a0 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
332b0 64 65 20 29 20 72 65 74 75 72 6e 20 70 50 61 67  de ) return pPag
332c0 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 61  er->errCode;.  a
332d0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
332e0 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41  State>=PAGER_REA
332f0 44 45 52 20 26 26 20 70 50 61 67 65 72 2d 3e 65  DER && pPager->e
33300 53 74 61 74 65 3c 50 41 47 45 52 5f 45 52 52 4f  State<PAGER_ERRO
33310 52 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  R );.  pPager->s
33320 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 3d 20 28 75  ubjInMemory = (u
33330 38 29 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 0a  8)subjInMemory;.
33340 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 50  .  if( ALWAYS(pP
33350 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
33360 47 45 52 5f 52 45 41 44 45 52 29 20 29 7b 0a 20  GER_READER) ){. 
33370 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
33380 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->pInJournal==0
33390 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 61 67   );..    if( pag
333a0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
333b0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
333c0 74 68 65 20 70 61 67 65 72 20 69 73 20 63 6f 6e  the pager is con
333d0 66 69 67 75 72 65 64 20 74 6f 20 75 73 65 20 6c  figured to use l
333e0 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c  ocking_mode=excl
333f0 75 73 69 76 65 2c 20 61 6e 64 20 61 6e 0a 20 20  usive, and an.  
33400 20 20 20 20 2a 2a 20 65 78 63 6c 75 73 69 76 65      ** exclusive
33410 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
33420 61 62 61 73 65 20 69 73 20 6e 6f 74 20 61 6c 72  abase is not alr
33430 65 61 64 79 20 68 65 6c 64 2c 20 6f 62 74 61 69  eady held, obtai
33440 6e 20 69 74 20 6e 6f 77 2e 0a 20 20 20 20 20 20  n it now..      
33450 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  */.      if( pPa
33460 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
33470 64 65 20 26 26 20 73 71 6c 69 74 65 33 57 61 6c  de && sqlite3Wal
33480 45 78 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50  ExclusiveMode(pP
33490 61 67 65 72 2d 3e 70 57 61 6c 2c 20 2d 31 29 20  ager->pWal, -1) 
334a0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
334b0 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67  pagerLockDb(pPag
334c0 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  er, EXCLUSIVE_LO
334d0 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  CK);.        if(
334e0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
334f0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
33500 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
33510 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
33520 57 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64 65  WalExclusiveMode
33530 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 31  (pPager->pWal, 1
33540 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
33550 20 20 2f 2a 20 47 72 61 62 20 74 68 65 20 77 72    /* Grab the wr
33560 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite lock on the 
33570 6c 6f 67 20 66 69 6c 65 2e 20 49 66 20 73 75 63  log file. If suc
33580 63 65 73 73 66 75 6c 2c 20 75 70 67 72 61 64 65  cessful, upgrade
33590 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 50 41 47   to.      ** PAG
335a0 45 52 5f 52 45 53 45 52 56 45 44 20 73 74 61 74  ER_RESERVED stat
335b0 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65  e. Otherwise, re
335c0 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
335d0 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  de to the caller
335e0 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20 62  ..      ** The b
335f0 75 73 79 2d 68 61 6e 64 6c 65 72 20 69 73 20 6e  usy-handler is n
33600 6f 74 20 69 6e 76 6f 6b 65 64 20 69 66 20 61 6e  ot invoked if an
33610 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
33620 20 61 6c 72 65 61 64 79 0a 20 20 20 20 20 20 2a   already.      *
33630 2a 20 68 6f 6c 64 73 20 74 68 65 20 77 72 69 74  * holds the writ
33640 65 2d 6c 6f 63 6b 2e 20 49 66 20 70 6f 73 73 69  e-lock. If possi
33650 62 6c 65 2c 20 74 68 65 20 75 70 70 65 72 20 6c  ble, the upper l
33660 61 79 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20 69  ayer will call i
33670 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
33680 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61    rc = sqlite3Wa
33690 6c 42 65 67 69 6e 57 72 69 74 65 54 72 61 6e 73  lBeginWriteTrans
336a0 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70  action(pPager->p
336b0 57 61 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Wal);.    }else{
336c0 0a 20 20 20 20 20 20 2f 2a 20 4f 62 74 61 69 6e  .      /* Obtain
336d0 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
336e0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
336f0 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 65 78   file. If the ex
33700 46 6c 61 67 20 70 61 72 61 6d 65 74 65 72 0a 20  Flag parameter. 
33710 20 20 20 20 20 2a 2a 20 69 73 20 74 72 75 65 2c       ** is true,
33720 20 74 68 65 6e 20 69 6d 6d 65 64 69 61 74 65 6c   then immediatel
33730 79 20 75 70 67 72 61 64 65 20 74 68 69 73 20 74  y upgrade this t
33740 6f 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  o an EXCLUSIVE l
33750 6f 63 6b 2e 20 54 68 65 0a 20 20 20 20 20 20 2a  ock. The.      *
33760 2a 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63  * busy-handler c
33770 61 6c 6c 62 61 63 6b 20 63 61 6e 20 62 65 20 75  allback can be u
33780 73 65 64 20 77 68 65 6e 20 75 70 67 72 61 64 69  sed when upgradi
33790 6e 67 20 74 6f 20 74 68 65 20 45 58 43 4c 55 53  ng to the EXCLUS
337a0 49 56 45 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63  IVE.      ** loc
337b0 6b 2c 20 62 75 74 20 6e 6f 74 20 77 68 65 6e 20  k, but not when 
337c0 6f 62 74 61 69 6e 69 6e 67 20 74 68 65 20 52 45  obtaining the RE
337d0 53 45 52 56 45 44 20 6c 6f 63 6b 2e 0a 20 20 20  SERVED lock..   
337e0 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
337f0 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61   pagerLockDb(pPa
33800 67 65 72 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f  ger, RESERVED_LO
33810 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  CK);.      if( r
33820 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
33830 65 78 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20  exFlag ){.      
33840 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69    rc = pager_wai
33850 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72  t_on_lock(pPager
33860 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  , EXCLUSIVE_LOCK
33870 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
33880 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ..    if( rc==SQ
33890 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
338a0 20 2f 2a 20 43 68 61 6e 67 65 20 74 6f 20 57 52   /* Change to WR
338b0 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73 74 61 74  ITER_LOCKED stat
338c0 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  e..      **.    
338d0 20 20 2a 2a 20 57 41 4c 20 6d 6f 64 65 20 73 65    ** WAL mode se
338e0 74 73 20 50 61 67 65 72 2e 65 53 74 61 74 65 20  ts Pager.eState 
338f0 74 6f 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  to PAGER_WRITER_
33900 4c 4f 43 4b 45 44 20 6f 72 20 43 41 43 48 45 4d  LOCKED or CACHEM
33910 4f 44 0a 20 20 20 20 20 20 2a 2a 20 77 68 65 6e  OD.      ** when
33920 20 69 74 20 68 61 73 20 61 6e 20 6f 70 65 6e 20   it has an open 
33930 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 62 75 74  transaction, but
33940 20 6e 65 76 65 72 20 74 6f 20 44 42 4d 4f 44 20   never to DBMOD 
33950 6f 72 20 46 49 4e 49 53 48 45 44 2e 0a 20 20 20  or FINISHED..   
33960 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 62 65     ** This is be
33970 63 61 75 73 65 20 69 6e 20 74 68 6f 73 65 20 73  cause in those s
33980 74 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 74  tates the code t
33990 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 73 61 76 65  o roll back save
339a0 70 6f 69 6e 74 20 0a 20 20 20 20 20 20 2a 2a 20  point .      ** 
339b0 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6d 61 79  transactions may
339c0 20 63 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20   copy data from 
339d0 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
339e0 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
339f0 65 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65  e .      ** file
33a00 20 61 73 20 77 65 6c 6c 20 61 73 20 69 6e 74 6f   as well as into
33a10 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e   the page cache.
33a20 20 57 68 69 63 68 20 77 6f 75 6c 64 20 62 65 20   Which would be 
33a30 69 6e 63 6f 72 72 65 63 74 20 69 6e 20 0a 20 20  incorrect in .  
33a40 20 20 20 20 2a 2a 20 57 41 4c 20 6d 6f 64 65 2e      ** WAL mode.
33a50 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
33a60 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
33a70 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f   PAGER_WRITER_LO
33a80 43 4b 45 44 3b 0a 20 20 20 20 20 20 70 50 61 67  CKED;.      pPag
33a90 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 3d  er->dbHintSize =
33aa0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
33ab0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
33ac0 62 46 69 6c 65 53 69 7a 65 20 3d 20 70 50 61 67  bFileSize = pPag
33ad0 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20  er->dbSize;.    
33ae0 20 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67    pPager->dbOrig
33af0 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
33b00 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 50 61  bSize;.      pPa
33b10 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
33b20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 0;.    }..    
33b30 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
33b40 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d  TE_OK || pPager-
33b50 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  >eState==PAGER_R
33b60 45 41 44 45 52 20 29 3b 0a 20 20 20 20 61 73 73  EADER );.    ass
33b70 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
33b80 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53  OK || pPager->eS
33b90 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
33ba0 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 20  ER_LOCKED );.   
33bb0 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
33bc0 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
33bd0 65 72 29 20 29 3b 0a 20 20 7d 0a 0a 20 20 50 41  er) );.  }..  PA
33be0 47 45 52 54 52 41 43 45 28 28 22 54 52 41 4e 53  GERTRACE(("TRANS
33bf0 41 43 54 49 4f 4e 20 25 64 5c 6e 22 2c 20 50 41  ACTION %d\n", PA
33c00 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b  GERID(pPager)));
33c10 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
33c20 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 73 69  ./*.** Mark a si
33c30 6e 67 6c 65 20 64 61 74 61 20 70 61 67 65 20 61  ngle data page a
33c40 73 20 77 72 69 74 65 61 62 6c 65 2e 20 54 68 65  s writeable. The
33c50 20 70 61 67 65 20 69 73 20 77 72 69 74 74 65 6e   page is written
33c60 20 69 6e 74 6f 20 74 68 65 20 0a 2a 2a 20 6d 61   into the .** ma
33c70 69 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 73 75  in journal or su
33c80 62 2d 6a 6f 75 72 6e 61 6c 20 61 73 20 72 65 71  b-journal as req
33c90 75 69 72 65 64 2e 20 49 66 20 74 68 65 20 70 61  uired. If the pa
33ca0 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  ge is written in
33cb0 74 6f 0a 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65  to.** one of the
33cc0 20 6a 6f 75 72 6e 61 6c 73 2c 20 74 68 65 20 63   journals, the c
33cd0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74  orresponding bit
33ce0 20 69 73 20 73 65 74 20 69 6e 20 74 68 65 20 0a   is set in the .
33cf0 2a 2a 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72  ** Pager.pInJour
33d00 6e 61 6c 20 62 69 74 76 65 63 20 61 6e 64 20 74  nal bitvec and t
33d10 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  he PagerSavepoin
33d20 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 62  t.pInSavepoint b
33d30 69 74 76 65 63 73 0a 2a 2a 20 6f 66 20 61 6e 79  itvecs.** of any
33d40 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73   open savepoints
33d50 20 61 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e   as appropriate.
33d60 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
33d70 61 67 65 72 5f 77 72 69 74 65 28 50 67 48 64 72  ager_write(PgHdr
33d80 20 2a 70 50 67 29 7b 0a 20 20 76 6f 69 64 20 2a   *pPg){.  void *
33d90 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61  pData = pPg->pDa
33da0 74 61 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  ta;.  Pager *pPa
33db0 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
33dc0 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  r;.  int rc = SQ
33dd0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 54  LITE_OK;..  /* T
33de0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e  his routine is n
33df0 6f 74 20 63 61 6c 6c 65 64 20 75 6e 6c 65 73 73  ot called unless
33e00 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
33e10 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79  tion has already
33e20 20 0a 20 20 2a 2a 20 62 65 65 6e 20 73 74 61 72   .  ** been star
33e30 74 65 64 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c  ted. The journal
33e40 20 66 69 6c 65 20 6d 61 79 20 6f 72 20 6d 61 79   file may or may
33e50 20 6e 6f 74 20 62 65 20 6f 70 65 6e 20 61 74 20   not be open at 
33e60 74 68 69 73 20 70 6f 69 6e 74 2e 0a 20 20 2a 2a  this point..  **
33e70 20 49 74 20 69 73 20 6e 65 76 65 72 20 63 61 6c   It is never cal
33e80 6c 65 64 20 69 6e 20 74 68 65 20 45 52 52 4f 52  led in the ERROR
33e90 20 73 74 61 74 65 2e 0a 20 20 2a 2f 0a 20 20 61   state..  */.  a
33ea0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
33eb0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
33ec0 54 45 52 5f 4c 4f 43 4b 45 44 0a 20 20 20 20 20  TER_LOCKED.     
33ed0 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74    || pPager->eSt
33ee0 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
33ef0 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20  R_CACHEMOD.     
33f00 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74    || pPager->eSt
33f10 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
33f20 52 5f 44 42 4d 4f 44 0a 20 20 29 3b 0a 20 20 61  R_DBMOD.  );.  a
33f30 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
33f40 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
33f50 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e  ) );..  /* If an
33f60 20 65 72 72 6f 72 20 68 61 73 20 62 65 65 6e 20   error has been 
33f70 70 72 65 76 69 6f 75 73 6c 79 20 64 65 74 65 63  previously detec
33f80 74 65 64 2c 20 72 65 70 6f 72 74 20 74 68 65 20  ted, report the 
33f90 73 61 6d 65 20 65 72 72 6f 72 0a 20 20 2a 2a 20  same error.  ** 
33fa0 61 67 61 69 6e 2e 20 54 68 69 73 20 73 68 6f 75  again. This shou
33fb0 6c 64 20 6e 6f 74 20 68 61 70 70 65 6e 2c 20 62  ld not happen, b
33fc0 75 74 20 74 68 65 20 63 68 65 63 6b 20 70 72 6f  ut the check pro
33fd0 76 69 64 65 73 20 72 6f 62 75 73 74 6e 65 73 73  vides robustness
33fe0 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52  . */.  if( NEVER
33ff0 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65  (pPager->errCode
34000 29 20 29 20 20 72 65 74 75 72 6e 20 70 50 61 67  ) )  return pPag
34010 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20  er->errCode;..  
34020 2f 2a 20 48 69 67 68 65 72 2d 6c 65 76 65 6c 20  /* Higher-level 
34030 72 6f 75 74 69 6e 65 73 20 6e 65 76 65 72 20 63  routines never c
34040 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  all this functio
34050 6e 20 69 66 20 64 61 74 61 62 61 73 65 20 69 73  n if database is
34060 20 6e 6f 74 0a 20 20 2a 2a 20 77 72 69 74 61 62   not.  ** writab
34070 6c 65 2e 20 20 42 75 74 20 63 68 65 63 6b 20 61  le.  But check a
34080 6e 79 77 61 79 2c 20 6a 75 73 74 20 66 6f 72 20  nyway, just for 
34090 72 6f 62 75 73 74 6e 65 73 73 2e 20 2a 2f 0a 20  robustness. */. 
340a0 20 69 66 28 20 4e 45 56 45 52 28 70 50 61 67 65   if( NEVER(pPage
340b0 72 2d 3e 72 65 61 64 4f 6e 6c 79 29 20 29 20 72  r->readOnly) ) r
340c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52  eturn SQLITE_PER
340d0 4d 3b 0a 0a 20 20 43 48 45 43 4b 5f 50 41 47 45  M;..  CHECK_PAGE
340e0 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  (pPg);..  /* The
340f0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 65   journal file ne
34100 65 64 73 20 74 6f 20 62 65 20 6f 70 65 6e 65 64  eds to be opened
34110 2e 20 48 69 67 68 65 72 20 6c 65 76 65 6c 20 72  . Higher level r
34120 6f 75 74 69 6e 65 73 20 68 61 76 65 20 61 6c 72  outines have alr
34130 65 61 64 79 0a 20 20 2a 2a 20 6f 62 74 61 69 6e  eady.  ** obtain
34140 65 64 20 74 68 65 20 6e 65 63 65 73 73 61 72 79  ed the necessary
34150 20 6c 6f 63 6b 73 20 74 6f 20 62 65 67 69 6e 20   locks to begin 
34160 74 68 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61  the write-transa
34170 63 74 69 6f 6e 2c 20 62 75 74 20 74 68 65 0a 20  ction, but the. 
34180 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75   ** rollback jou
34190 72 6e 61 6c 20 6d 69 67 68 74 20 6e 6f 74 20 79  rnal might not y
341a0 65 74 20 62 65 20 6f 70 65 6e 2e 20 4f 70 65 6e  et be open. Open
341b0 20 69 74 20 6e 6f 77 20 69 66 20 74 68 69 73 20   it now if this 
341c0 69 73 20 74 68 65 20 63 61 73 65 2e 0a 20 20 2a  is the case..  *
341d0 2a 0a 20 20 2a 2a 20 54 68 69 73 20 69 73 20 64  *.  ** This is d
341e0 6f 6e 65 20 62 65 66 6f 72 65 20 63 61 6c 6c 69  one before calli
341f0 6e 67 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  ng sqlite3Pcache
34200 4d 61 6b 65 44 69 72 74 79 28 29 20 6f 6e 20 74  MakeDirty() on t
34210 68 65 20 70 61 67 65 2e 20 0a 20 20 2a 2a 20 4f  he page. .  ** O
34220 74 68 65 72 77 69 73 65 2c 20 69 66 20 69 74 20  therwise, if it 
34230 77 65 72 65 20 64 6f 6e 65 20 61 66 74 65 72 20  were done after 
34240 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 50  calling sqlite3P
34250 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28 29  cacheMakeDirty()
34260 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 61 6e 20 65  , then.  ** an e
34270 72 72 6f 72 20 6d 69 67 68 74 20 6f 63 63 75 72  rror might occur
34280 20 61 6e 64 20 74 68 65 20 70 61 67 65 72 20 77   and the pager w
34290 6f 75 6c 64 20 65 6e 64 20 75 70 20 69 6e 20 57  ould end up in W
342a0 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73 74 61  RITER_LOCKED sta
342b0 74 65 0a 20 20 2a 2a 20 77 69 74 68 20 70 61 67  te.  ** with pag
342c0 65 73 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72  es marked as dir
342d0 74 79 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e  ty in the cache.
342e0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
342f0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
34300 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  R_WRITER_LOCKED 
34310 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
34320 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70  r_open_journal(p
34330 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
34340 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
34350 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
34360 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
34370 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57  >eState>=PAGER_W
34380 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 29  RITER_CACHEMOD )
34390 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65  ;.  assert( asse
343a0 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
343b0 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 2f 2a 20  Pager) );..  /* 
343c0 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73  Mark the page as
343d0 20 64 69 72 74 79 2e 20 20 49 66 20 74 68 65 20   dirty.  If the 
343e0 70 61 67 65 20 68 61 73 20 61 6c 72 65 61 64 79  page has already
343f0 20 62 65 65 6e 20 77 72 69 74 74 65 6e 0a 20 20   been written.  
34400 2a 2a 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ** to the journa
34410 6c 20 74 68 65 6e 20 77 65 20 63 61 6e 20 72 65  l then we can re
34420 74 75 72 6e 20 72 69 67 68 74 20 61 77 61 79 2e  turn right away.
34430 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 50  .  */.  sqlite3P
34440 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70  cacheMakeDirty(p
34450 50 67 29 3b 0a 20 20 69 66 28 20 70 61 67 65 49  Pg);.  if( pageI
34460 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 26 26  nJournal(pPg) &&
34470 20 21 73 75 62 6a 52 65 71 75 69 72 65 73 50 61   !subjRequiresPa
34480 67 65 28 70 50 67 29 20 29 7b 0a 20 20 20 20 61  ge(pPg) ){.    a
34490 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65  ssert( !pagerUse
344a0 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20  Wal(pPager) );. 
344b0 20 7d 65 6c 73 65 7b 0a 20 20 0a 20 20 20 20 2f   }else{.  .    /
344c0 2a 20 54 68 65 20 74 72 61 6e 73 61 63 74 69 6f  * The transactio
344d0 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20 65 78  n journal now ex
344e0 69 73 74 73 20 61 6e 64 20 77 65 20 68 61 76 65  ists and we have
344f0 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 61   a RESERVED or a
34500 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49  n.    ** EXCLUSI
34510 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6d  VE lock on the m
34520 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
34530 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 63 75  e.  Write the cu
34540 72 72 65 6e 74 20 70 61 67 65 20 74 6f 0a 20 20  rrent page to.  
34550 20 20 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63    ** the transac
34560 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 69 66 20  tion journal if 
34570 69 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65 20  it is not there 
34580 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a  already..    */.
34590 20 20 20 20 69 66 28 20 21 70 61 67 65 49 6e 4a      if( !pageInJ
345a0 6f 75 72 6e 61 6c 28 70 50 67 29 20 26 26 20 21  ournal(pPg) && !
345b0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
345c0 65 72 29 20 29 7b 0a 20 20 20 20 20 20 61 73 73  er) ){.      ass
345d0 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c  ert( pagerUseWal
345e0 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20  (pPager)==0 );. 
345f0 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67       if( pPg->pg
34600 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72  no<=pPager->dbOr
34610 69 67 53 69 7a 65 20 26 26 20 69 73 4f 70 65 6e  igSize && isOpen
34620 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b  (pPager->jfd) ){
34630 0a 20 20 20 20 20 20 20 20 75 33 32 20 63 6b 73  .        u32 cks
34640 75 6d 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72  um;.        char
34650 20 2a 70 44 61 74 61 32 3b 0a 20 20 20 20 20 20   *pData2;.      
34660 20 20 69 36 34 20 69 4f 66 66 20 3d 20 70 50 61    i64 iOff = pPa
34670 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
34680 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20  ..        /* We 
34690 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 77 72 69  should never wri
346a0 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  te to the journa
346b0 6c 20 66 69 6c 65 20 74 68 65 20 70 61 67 65 20  l file the page 
346c0 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  that.        ** 
346d0 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74  contains the dat
346e0 61 62 61 73 65 20 6c 6f 63 6b 73 2e 20 20 54 68  abase locks.  Th
346f0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65  e following asse
34700 72 74 20 76 65 72 69 66 69 65 73 0a 20 20 20 20  rt verifies.    
34710 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20 64      ** that we d
34720 6f 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20 20 20  o not. */.      
34730 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
34740 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47  gno!=PAGER_MJ_PG
34750 4e 4f 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20  NO(pPager) );.. 
34760 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
34770 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
34780 72 3c 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  r<=pPager->journ
34790 61 6c 4f 66 66 20 29 3b 0a 20 20 20 20 20 20 20  alOff );.       
347a0 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20   CODEC2(pPager, 
347b0 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f  pData, pPg->pgno
347c0 2c 20 37 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  , 7, return SQLI
347d0 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74 61 32  TE_NOMEM, pData2
347e0 29 3b 0a 20 20 20 20 20 20 20 20 63 6b 73 75 6d  );.        cksum
347f0 20 3d 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70   = pager_cksum(p
34800 50 61 67 65 72 2c 20 28 75 38 2a 29 70 44 61 74  Pager, (u8*)pDat
34810 61 32 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  a2);..        /*
34820 20 45 76 65 6e 20 69 66 20 61 6e 20 49 4f 20 6f   Even if an IO o
34830 72 20 64 69 73 6b 66 75 6c 6c 20 65 72 72 6f 72  r diskfull error
34840 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6a 6f   occurs while jo
34850 75 72 6e 61 6c 6c 69 6e 67 20 74 68 65 0a 20 20  urnalling the.  
34860 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e        ** page in
34870 20 74 68 65 20 62 6c 6f 63 6b 20 61 62 6f 76 65   the block above
34880 2c 20 73 65 74 20 74 68 65 20 6e 65 65 64 2d 73  , set the need-s
34890 79 6e 63 20 66 6c 61 67 20 66 6f 72 20 74 68 65  ync flag for the
348a0 20 70 61 67 65 2e 0a 20 20 20 20 20 20 20 20 2a   page..        *
348b0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 77 68 65  * Otherwise, whe
348c0 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  n the transactio
348d0 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
348e0 2c 20 74 68 65 20 6c 6f 67 69 63 20 69 6e 0a 20  , the logic in. 
348f0 20 20 20 20 20 20 20 2a 2a 20 70 6c 61 79 62 61         ** playba
34900 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20 77 69  ck_one_page() wi
34910 6c 6c 20 74 68 69 6e 6b 20 74 68 61 74 20 74 68  ll think that th
34920 65 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20  e page needs to 
34930 62 65 20 72 65 73 74 6f 72 65 64 0a 20 20 20 20  be restored.    
34940 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 64 61      ** in the da
34950 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41 6e 64  tabase file. And
34960 20 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   if an IO error 
34970 6f 63 63 75 72 73 20 77 68 69 6c 65 20 64 6f 69  occurs while doi
34980 6e 67 20 73 6f 2c 0a 20 20 20 20 20 20 20 20 2a  ng so,.        *
34990 2a 20 74 68 65 6e 20 63 6f 72 72 75 70 74 69 6f  * then corruptio
349a0 6e 20 6d 61 79 20 66 6f 6c 6c 6f 77 2e 0a 20 20  n may follow..  
349b0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
349c0 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50   pPg->flags |= P
349d0 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a  GHDR_NEED_SYNC;.
349e0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72  .        rc = wr
349f0 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72  ite32bits(pPager
34a00 2d 3e 6a 66 64 2c 20 69 4f 66 66 2c 20 70 50 67  ->jfd, iOff, pPg
34a10 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  ->pgno);.       
34a20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
34a30 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
34a40 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
34a50 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
34a60 65 72 2d 3e 6a 66 64 2c 20 70 44 61 74 61 32 2c  er->jfd, pData2,
34a70 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
34a80 65 2c 20 69 4f 66 66 2b 34 29 3b 0a 20 20 20 20  e, iOff+4);.    
34a90 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
34aa0 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
34ab0 63 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  c;.        rc = 
34ac0 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67  write32bits(pPag
34ad0 65 72 2d 3e 6a 66 64 2c 20 69 4f 66 66 2b 70 50  er->jfd, iOff+pP
34ae0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 34  ager->pageSize+4
34af0 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 20 20 20 20  , cksum);.      
34b00 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
34b10 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
34b20 0a 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43  ..        IOTRAC
34b30 45 28 28 22 4a 4f 55 54 20 25 70 20 25 64 20 25  E(("JOUT %p %d %
34b40 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65  lld %d\n", pPage
34b50 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20  r, pPg->pgno, . 
34b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34b70 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
34b80 66 66 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ff, pPager->page
34b90 53 69 7a 65 29 29 3b 0a 20 20 20 20 20 20 20 20  Size));.        
34ba0 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74  PAGER_INCR(sqlit
34bb0 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f  e3_pager_writej_
34bc0 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  count);.        
34bd0 50 41 47 45 52 54 52 41 43 45 28 28 22 4a 4f 55  PAGERTRACE(("JOU
34be0 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 20  RNAL %d page %d 
34bf0 6e 65 65 64 53 79 6e 63 3d 25 64 20 68 61 73 68  needSync=%d hash
34c00 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20  (%08x)\n",.     
34c10 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28          PAGERID(
34c20 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
34c30 6e 6f 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  no, .           
34c40 20 20 28 28 70 50 67 2d 3e 66 6c 61 67 73 26 50    ((pPg->flags&P
34c50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f  GHDR_NEED_SYNC)?
34c60 31 3a 30 29 2c 20 70 61 67 65 72 5f 70 61 67 65  1:0), pager_page
34c70 68 61 73 68 28 70 50 67 29 29 29 3b 0a 0a 20 20  hash(pPg)));..  
34c80 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
34c90 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 38 20 2b 20  urnalOff += 8 + 
34ca0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
34cb0 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  ;.        pPager
34cc0 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20  ->nRec++;.      
34cd0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
34ce0 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20  ->pInJournal!=0 
34cf0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
34d00 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74  sqlite3BitvecSet
34d10 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
34d20 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  nal, pPg->pgno);
34d30 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
34d40 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  e( rc==SQLITE_NO
34d50 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 61  MEM );.        a
34d60 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
34d70 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  E_OK || rc==SQLI
34d80 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20  TE_NOMEM );.    
34d90 20 20 20 20 72 63 20 7c 3d 20 61 64 64 54 6f 53      rc |= addToS
34da0 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28  avepointBitvecs(
34db0 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e  pPager, pPg->pgn
34dc0 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  o);.        if( 
34dd0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
34de0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
34df0 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  t( rc==SQLITE_NO
34e00 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 20  MEM );.         
34e10 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
34e20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
34e30 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  e{.        if( p
34e40 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50  Pager->eState!=P
34e50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
34e60 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  D ){.          p
34e70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48  Pg->flags |= PGH
34e80 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20  DR_NEED_SYNC;.  
34e90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
34ea0 50 41 47 45 52 54 52 41 43 45 28 28 22 41 50 50  PAGERTRACE(("APP
34eb0 45 4e 44 20 25 64 20 70 61 67 65 20 25 64 20 6e  END %d page %d n
34ec0 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20  eedSync=%d\n",. 
34ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
34ee0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
34ef0 70 50 67 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20 20  pPg->pgno,.     
34f00 20 20 20 20 20 20 20 20 20 20 28 28 70 50 67 2d            ((pPg-
34f10 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45  >flags&PGHDR_NEE
34f20 44 5f 53 59 4e 43 29 3f 31 3a 30 29 29 29 3b 0a  D_SYNC)?1:0)));.
34f30 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
34f40 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73  .    /* If the s
34f50 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
34f60 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65   is open and the
34f70 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
34f80 69 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20  it,.    ** then 
34f90 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e  write the curren
34fa0 74 20 70 61 67 65 20 74 6f 20 74 68 65 20 73 74  t page to the st
34fb0 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e  atement journal.
34fc0 20 20 4e 6f 74 65 20 74 68 61 74 0a 20 20 20 20    Note that.    
34fd0 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ** the statement
34fe0 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20   journal format 
34ff0 64 69 66 66 65 72 73 20 66 72 6f 6d 20 74 68 65  differs from the
35000 20 73 74 61 6e 64 61 72 64 20 6a 6f 75 72 6e 61   standard journa
35010 6c 20 66 6f 72 6d 61 74 0a 20 20 20 20 2a 2a 20  l format.    ** 
35020 69 6e 20 74 68 61 74 20 69 74 20 6f 6d 69 74 73  in that it omits
35030 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20 61   the checksums a
35040 6e 64 20 74 68 65 20 68 65 61 64 65 72 2e 0a 20  nd the header.. 
35050 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 75     */.    if( su
35060 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 70  bjRequiresPage(p
35070 50 67 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  Pg) ){.      rc 
35080 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65  = subjournalPage
35090 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (pPg);.    }.  }
350a0 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68  ..  /* Update th
350b0 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
350c0 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f  and return..  */
350d0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64  .  if( pPager->d
350e0 62 53 69 7a 65 3c 70 50 67 2d 3e 70 67 6e 6f 20  bSize<pPg->pgno 
350f0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  ){.    pPager->d
35100 62 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67 6e  bSize = pPg->pgn
35110 6f 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  o;.  }.  return 
35120 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72  rc;.}../*.** Mar
35130 6b 20 61 20 64 61 74 61 20 70 61 67 65 20 61 73  k a data page as
35140 20 77 72 69 74 65 61 62 6c 65 2e 20 54 68 69 73   writeable. This
35150 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 62 65   routine must be
35160 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 0a   called before .
35170 2a 2a 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65  ** making change
35180 73 20 74 6f 20 61 20 70 61 67 65 2e 20 54 68 65  s to a page. The
35190 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 63 68 65   caller must che
351a0 63 6b 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  ck the return va
351b0 6c 75 65 20 0a 2a 2a 20 6f 66 20 74 68 69 73 20  lue .** of this 
351c0 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 62 65 20  function and be 
351d0 63 61 72 65 66 75 6c 20 6e 6f 74 20 74 6f 20 63  careful not to c
351e0 68 61 6e 67 65 20 61 6e 79 20 70 61 67 65 20 64  hange any page d
351f0 61 74 61 20 75 6e 6c 65 73 73 20 0a 2a 2a 20 74  ata unless .** t
35200 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
35210 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  rns SQLITE_OK..*
35220 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65  *.** The differe
35230 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73  nce between this
35240 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 70 61   function and pa
35250 67 65 72 5f 77 72 69 74 65 28 29 20 69 73 20 74  ger_write() is t
35260 68 61 74 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63  hat this.** func
35270 74 69 6f 6e 20 61 6c 73 6f 20 64 65 61 6c 73 20  tion also deals 
35280 77 69 74 68 20 74 68 65 20 73 70 65 63 69 61 6c  with the special
35290 20 63 61 73 65 20 77 68 65 72 65 20 32 20 6f 72   case where 2 or
352a0 20 6d 6f 72 65 20 70 61 67 65 73 0a 2a 2a 20 66   more pages.** f
352b0 69 74 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 64  it on a single d
352c0 69 73 6b 20 73 65 63 74 6f 72 2e 20 49 6e 20 74  isk sector. In t
352d0 68 69 73 20 63 61 73 65 20 61 6c 6c 20 63 6f 2d  his case all co-
352e0 72 65 73 69 64 65 6e 74 20 70 61 67 65 73 0a 2a  resident pages.*
352f0 2a 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e  * must have been
35300 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
35310 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66  journal file bef
35320 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
35330 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
35340 20 6f 63 63 75 72 73 2c 20 53 51 4c 49 54 45 5f   occurs, SQLITE_
35350 4e 4f 4d 45 4d 20 6f 72 20 61 6e 20 49 4f 20 65  NOMEM or an IO e
35360 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
35370 75 72 6e 65 64 0a 2a 2a 20 61 73 20 61 70 70 72  urned.** as appr
35380 6f 70 72 69 61 74 65 2e 20 4f 74 68 65 72 77 69  opriate. Otherwi
35390 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  se, SQLITE_OK..*
353a0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
353b0 65 72 57 72 69 74 65 28 44 62 50 61 67 65 20 2a  erWrite(DbPage *
353c0 70 44 62 50 61 67 65 29 7b 0a 20 20 69 6e 74 20  pDbPage){.  int 
353d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
353e0 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20  .  PgHdr *pPg = 
353f0 70 44 62 50 61 67 65 3b 0a 20 20 50 61 67 65 72  pDbPage;.  Pager
35400 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
35410 70 50 61 67 65 72 3b 0a 20 20 50 67 6e 6f 20 6e  pPager;.  Pgno n
35420 50 61 67 65 50 65 72 53 65 63 74 6f 72 20 3d 20  PagePerSector = 
35430 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53  (pPager->sectorS
35440 69 7a 65 2f 70 50 61 67 65 72 2d 3e 70 61 67 65  ize/pPager->page
35450 53 69 7a 65 29 3b 0a 0a 20 20 61 73 73 65 72 74  Size);..  assert
35460 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
35470 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  >=PAGER_WRITER_L
35480 4f 43 4b 45 44 20 29 3b 0a 20 20 61 73 73 65 72  OCKED );.  asser
35490 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
354a0 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29  e!=PAGER_ERROR )
354b0 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65  ;.  assert( asse
354c0 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
354d0 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 69 66 28  Pager) );..  if(
354e0 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 3e   nPagePerSector>
354f0 31 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 50  1 ){.    Pgno nP
35500 61 67 65 43 6f 75 6e 74 3b 20 20 20 20 20 20 20  ageCount;       
35510 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62     /* Total numb
35520 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 64  er of pages in d
35530 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
35540 20 20 20 20 50 67 6e 6f 20 70 67 31 3b 20 20 20      Pgno pg1;   
35550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
35560 20 46 69 72 73 74 20 70 61 67 65 20 6f 66 20 74   First page of t
35570 68 65 20 73 65 63 74 6f 72 20 70 50 67 20 69 73  he sector pPg is
35580 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 20 2a 2f 0a   located on. */.
35590 20 20 20 20 69 6e 74 20 6e 50 61 67 65 20 3d 20      int nPage = 
355a0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  0;            /*
355b0 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
355c0 20 73 74 61 72 74 69 6e 67 20 61 74 20 70 67 31   starting at pg1
355d0 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20   to journal */. 
355e0 20 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20     int ii;      
355f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
35600 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
35610 20 20 20 20 69 6e 74 20 6e 65 65 64 53 79 6e 63      int needSync
35620 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
35630 20 54 72 75 65 20 69 66 20 61 6e 79 20 70 61 67   True if any pag
35640 65 20 68 61 73 20 50 47 48 44 52 5f 4e 45 45 44  e has PGHDR_NEED
35650 5f 53 59 4e 43 20 2a 2f 0a 0a 20 20 20 20 2f 2a  _SYNC */..    /*
35660 20 53 65 74 20 74 68 65 20 64 6f 4e 6f 74 53 79   Set the doNotSy
35670 6e 63 53 70 69 6c 6c 20 66 6c 61 67 20 74 6f 20  ncSpill flag to 
35680 31 2e 20 54 68 69 73 20 69 73 20 62 65 63 61 75  1. This is becau
35690 73 65 20 77 65 20 63 61 6e 6e 6f 74 20 61 6c 6c  se we cannot all
356a0 6f 77 0a 20 20 20 20 2a 2a 20 61 20 6a 6f 75 72  ow.    ** a jour
356b0 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20 62 65  nal header to be
356c0 20 77 72 69 74 74 65 6e 20 62 65 74 77 65 65 6e   written between
356d0 20 74 68 65 20 70 61 67 65 73 20 6a 6f 75 72 6e   the pages journ
356e0 61 6c 65 64 20 62 79 0a 20 20 20 20 2a 2a 20 74  aled by.    ** t
356f0 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20  his function..  
35700 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
35710 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 61   !MEMDB );.    a
35720 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
35730 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 3d 3d 30  oNotSyncSpill==0
35740 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
35750 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 2b 2b  doNotSyncSpill++
35760 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 74  ;..    /* This t
35770 72 69 63 6b 20 61 73 73 75 6d 65 73 20 74 68 61  rick assumes tha
35780 74 20 62 6f 74 68 20 74 68 65 20 70 61 67 65 2d  t both the page-
35790 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d  size and sector-
357a0 73 69 7a 65 20 61 72 65 0a 20 20 20 20 2a 2a 20  size are.    ** 
357b0 61 6e 20 69 6e 74 65 67 65 72 20 70 6f 77 65 72  an integer power
357c0 20 6f 66 20 32 2e 20 49 74 20 73 65 74 73 20 76   of 2. It sets v
357d0 61 72 69 61 62 6c 65 20 70 67 31 20 74 6f 20 74  ariable pg1 to t
357e0 68 65 20 69 64 65 6e 74 69 66 69 65 72 0a 20 20  he identifier.  
357f0 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73    ** of the firs
35800 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 73 65  t page of the se
35810 63 74 6f 72 20 70 50 67 20 69 73 20 6c 6f 63 61  ctor pPg is loca
35820 74 65 64 20 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  ted on..    */. 
35830 20 20 20 70 67 31 20 3d 20 28 28 70 50 67 2d 3e     pg1 = ((pPg->
35840 70 67 6e 6f 2d 31 29 20 26 20 7e 28 6e 50 61 67  pgno-1) & ~(nPag
35850 65 50 65 72 53 65 63 74 6f 72 2d 31 29 29 20 2b  ePerSector-1)) +
35860 20 31 3b 0a 0a 20 20 20 20 6e 50 61 67 65 43 6f   1;..    nPageCo
35870 75 6e 74 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  unt = pPager->db
35880 53 69 7a 65 3b 0a 20 20 20 20 69 66 28 20 70 50  Size;.    if( pP
35890 67 2d 3e 70 67 6e 6f 3e 6e 50 61 67 65 43 6f 75  g->pgno>nPageCou
358a0 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e 50 61 67  nt ){.      nPag
358b0 65 20 3d 20 28 70 50 67 2d 3e 70 67 6e 6f 20 2d  e = (pPg->pgno -
358c0 20 70 67 31 29 2b 31 3b 0a 20 20 20 20 7d 65 6c   pg1)+1;.    }el
358d0 73 65 20 69 66 28 20 28 70 67 31 2b 6e 50 61 67  se if( (pg1+nPag
358e0 65 50 65 72 53 65 63 74 6f 72 2d 31 29 3e 6e 50  ePerSector-1)>nP
358f0 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20  ageCount ){.    
35900 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 43    nPage = nPageC
35910 6f 75 6e 74 2b 31 2d 70 67 31 3b 0a 20 20 20 20  ount+1-pg1;.    
35920 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 50 61  }else{.      nPa
35930 67 65 20 3d 20 6e 50 61 67 65 50 65 72 53 65 63  ge = nPagePerSec
35940 74 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  tor;.    }.    a
35950 73 73 65 72 74 28 6e 50 61 67 65 3e 30 29 3b 0a  ssert(nPage>0);.
35960 20 20 20 20 61 73 73 65 72 74 28 70 67 31 3c 3d      assert(pg1<=
35970 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
35980 61 73 73 65 72 74 28 28 70 67 31 2b 6e 50 61 67  assert((pg1+nPag
35990 65 29 3e 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 0a  e)>pPg->pgno);..
359a0 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
359b0 3c 6e 50 61 67 65 20 26 26 20 72 63 3d 3d 53 51  <nPage && rc==SQ
359c0 4c 49 54 45 5f 4f 4b 3b 20 69 69 2b 2b 29 7b 0a  LITE_OK; ii++){.
359d0 20 20 20 20 20 20 50 67 6e 6f 20 70 67 20 3d 20        Pgno pg = 
359e0 70 67 31 2b 69 69 3b 0a 20 20 20 20 20 20 50 67  pg1+ii;.      Pg
359f0 48 64 72 20 2a 70 50 61 67 65 3b 0a 20 20 20 20  Hdr *pPage;.    
35a00 20 20 69 66 28 20 70 67 3d 3d 70 50 67 2d 3e 70    if( pg==pPg->p
35a10 67 6e 6f 20 7c 7c 20 21 73 71 6c 69 74 65 33 42  gno || !sqlite3B
35a20 69 74 76 65 63 54 65 73 74 28 70 50 61 67 65 72  itvecTest(pPager
35a30 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67  ->pInJournal, pg
35a40 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ) ){.        if(
35a50 20 70 67 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47   pg!=PAGER_MJ_PG
35a60 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  NO(pPager) ){.  
35a70 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
35a80 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61  ite3PagerGet(pPa
35a90 67 65 72 2c 20 70 67 2c 20 26 70 50 61 67 65 29  ger, pg, &pPage)
35aa0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
35ab0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
35ac0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
35ad0 3d 20 70 61 67 65 72 5f 77 72 69 74 65 28 70 50  = pager_write(pP
35ae0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
35af0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 66 6c 61    if( pPage->fla
35b00 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
35b10 4e 43 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  NC ){.          
35b20 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31      needSync = 1
35b30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
35b40 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
35b50 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
35b60 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
35b70 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
35b80 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 50 61    }else if( (pPa
35b90 67 65 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75  ge = pager_looku
35ba0 70 28 70 50 61 67 65 72 2c 20 70 67 29 29 21 3d  p(pPager, pg))!=
35bb0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
35bc0 20 70 50 61 67 65 2d 3e 66 6c 61 67 73 26 50 47   pPage->flags&PG
35bd0 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 29 7b  HDR_NEED_SYNC ){
35be0 0a 20 20 20 20 20 20 20 20 20 20 6e 65 65 64 53  .          needS
35bf0 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ync = 1;.       
35c00 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
35c10 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 61  e3PagerUnref(pPa
35c20 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ge);.      }.   
35c30 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
35c40 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  e PGHDR_NEED_SYN
35c50 43 20 66 6c 61 67 20 69 73 20 73 65 74 20 66 6f  C flag is set fo
35c60 72 20 61 6e 79 20 6f 66 20 74 68 65 20 6e 50 61  r any of the nPa
35c70 67 65 20 70 61 67 65 73 20 0a 20 20 20 20 2a 2a  ge pages .    **
35c80 20 73 74 61 72 74 69 6e 67 20 61 74 20 70 67 31   starting at pg1
35c90 2c 20 74 68 65 6e 20 69 74 20 6e 65 65 64 73 20  , then it needs 
35ca0 74 6f 20 62 65 20 73 65 74 20 66 6f 72 20 61 6c  to be set for al
35cb0 6c 20 6f 66 20 74 68 65 6d 2e 20 42 65 63 61 75  l of them. Becau
35cc0 73 65 0a 20 20 20 20 2a 2a 20 77 72 69 74 69 6e  se.    ** writin
35cd0 67 20 74 6f 20 61 6e 79 20 6f 66 20 74 68 65 73  g to any of thes
35ce0 65 20 6e 50 61 67 65 20 70 61 67 65 73 20 6d 61  e nPage pages ma
35cf0 79 20 64 61 6d 61 67 65 20 74 68 65 20 6f 74 68  y damage the oth
35d00 65 72 73 2c 20 74 68 65 0a 20 20 20 20 2a 2a 20  ers, the.    ** 
35d10 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  journal file mus
35d20 74 20 63 6f 6e 74 61 69 6e 20 73 79 6e 63 28 29  t contain sync()
35d30 65 64 20 63 6f 70 69 65 73 20 6f 66 20 61 6c 6c  ed copies of all
35d40 20 6f 66 20 74 68 65 6d 0a 20 20 20 20 2a 2a 20   of them.    ** 
35d50 62 65 66 6f 72 65 20 61 6e 79 20 6f 66 20 74 68  before any of th
35d60 65 6d 20 63 61 6e 20 62 65 20 77 72 69 74 74 65  em can be writte
35d70 6e 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74  n out to the dat
35d80 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
35d90 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
35da0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 65 65 64  QLITE_OK && need
35db0 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 61 73  Sync ){.      as
35dc0 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a  sert( !MEMDB );.
35dd0 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20        for(ii=0; 
35de0 69 69 3c 6e 50 61 67 65 3b 20 69 69 2b 2b 29 7b  ii<nPage; ii++){
35df0 0a 20 20 20 20 20 20 20 20 50 67 48 64 72 20 2a  .        PgHdr *
35e00 70 50 61 67 65 20 3d 20 70 61 67 65 72 5f 6c 6f  pPage = pager_lo
35e10 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 31  okup(pPager, pg1
35e20 2b 69 69 29 3b 0a 20 20 20 20 20 20 20 20 69 66  +ii);.        if
35e30 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20 20  ( pPage ){.     
35e40 20 20 20 20 20 70 50 61 67 65 2d 3e 66 6c 61 67       pPage->flag
35e50 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f  s |= PGHDR_NEED_
35e60 53 59 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20  SYNC;.          
35e70 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
35e80 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  f(pPage);.      
35e90 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
35ea0 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  }..    assert( p
35eb0 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63  Pager->doNotSync
35ec0 53 70 69 6c 6c 3d 3d 31 20 29 3b 0a 20 20 20 20  Spill==1 );.    
35ed0 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e  pPager->doNotSyn
35ee0 63 53 70 69 6c 6c 2d 2d 3b 0a 20 20 7d 65 6c 73  cSpill--;.  }els
35ef0 65 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  e{.    rc = page
35f00 72 5f 77 72 69 74 65 28 70 44 62 50 61 67 65 29  r_write(pDbPage)
35f10 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
35f20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
35f30 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 70  rn TRUE if the p
35f40 61 67 65 20 67 69 76 65 6e 20 69 6e 20 74 68 65  age given in the
35f50 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20 70 72   argument was pr
35f60 65 76 69 6f 75 73 6c 79 20 70 61 73 73 65 64 0a  eviously passed.
35f70 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  ** to sqlite3Pag
35f80 65 72 57 72 69 74 65 28 29 2e 20 20 49 6e 20 6f  erWrite().  In o
35f90 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65 74 75  ther words, retu
35fa0 72 6e 20 54 52 55 45 20 69 66 20 69 74 20 69 73  rn TRUE if it is
35fb0 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e 67 65   ok.** to change
35fc0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
35fd0 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66  the page..*/.#if
35fe0 6e 64 65 66 20 4e 44 45 42 55 47 0a 69 6e 74 20  ndef NDEBUG.int 
35ff0 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
36000 69 74 65 61 62 6c 65 28 44 62 50 61 67 65 20 2a  iteable(DbPage *
36010 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  pPg){.  return p
36020 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
36030 44 49 52 54 59 3b 0a 7d 0a 23 65 6e 64 69 66 0a  DIRTY;.}.#endif.
36040 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f  ./*.** A call to
36050 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65   this routine te
36060 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20 74 68  lls the pager th
36070 61 74 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63  at it is not nec
36080 65 73 73 61 72 79 20 74 6f 0a 2a 2a 20 77 72 69  essary to.** wri
36090 74 65 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69  te the informati
360a0 6f 6e 20 6f 6e 20 70 61 67 65 20 70 50 67 20 62  on on page pPg b
360b0 61 63 6b 20 74 6f 20 74 68 65 20 64 69 73 6b 2c  ack to the disk,
360c0 20 65 76 65 6e 20 74 68 6f 75 67 68 0a 2a 2a 20   even though.** 
360d0 74 68 61 74 20 70 61 67 65 20 6d 69 67 68 74 20  that page might 
360e0 62 65 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72  be marked as dir
360f0 74 79 2e 20 20 54 68 69 73 20 68 61 70 70 65 6e  ty.  This happen
36100 73 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20  s, for example, 
36110 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65  when.** the page
36120 20 68 61 73 20 62 65 65 6e 20 61 64 64 65 64 20   has been added 
36130 61 73 20 61 20 6c 65 61 66 20 6f 66 20 74 68 65  as a leaf of the
36140 20 66 72 65 65 6c 69 73 74 20 61 6e 64 20 73 6f   freelist and so
36150 20 69 74 73 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20   its.** content 
36160 6e 6f 20 6c 6f 6e 67 65 72 20 6d 61 74 74 65 72  no longer matter
36170 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76 65  s..**.** The ove
36180 72 6c 79 69 6e 67 20 73 6f 66 74 77 61 72 65 20  rlying software 
36190 6c 61 79 65 72 20 63 61 6c 6c 73 20 74 68 69 73  layer calls this
361a0 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 61 6c   routine when al
361b0 6c 20 6f 66 20 74 68 65 20 64 61 74 61 0a 2a 2a  l of the data.**
361c0 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61   on the given pa
361d0 67 65 20 69 73 20 75 6e 75 73 65 64 2e 20 54 68  ge is unused. Th
361e0 65 20 70 61 67 65 72 20 6d 61 72 6b 73 20 74 68  e pager marks th
361f0 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 20  e page as clean 
36200 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 64 6f  so.** that it do
36210 65 73 20 6e 6f 74 20 67 65 74 20 77 72 69 74 74  es not get writt
36220 65 6e 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a  en to disk..**.*
36230 2a 20 54 65 73 74 73 20 73 68 6f 77 20 74 68 61  * Tests show tha
36240 74 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74  t this optimizat
36250 69 6f 6e 20 63 61 6e 20 71 75 61 64 72 75 70 6c  ion can quadrupl
36260 65 20 74 68 65 20 73 70 65 65 64 20 6f 66 20 6c  e the speed of l
36270 61 72 67 65 20 0a 2a 2a 20 44 45 4c 45 54 45 20  arge .** DELETE 
36280 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2f 0a 76  operations..*/.v
36290 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
362a0 44 6f 6e 74 57 72 69 74 65 28 50 67 48 64 72 20  DontWrite(PgHdr 
362b0 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
362c0 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
362d0 61 67 65 72 3b 0a 20 20 69 66 28 20 28 70 50 67  ager;.  if( (pPg
362e0 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49  ->flags&PGHDR_DI
362f0 52 54 59 29 20 26 26 20 70 50 61 67 65 72 2d 3e  RTY) && pPager->
36300 6e 53 61 76 65 70 6f 69 6e 74 3d 3d 30 20 29 7b  nSavepoint==0 ){
36310 0a 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28  .    PAGERTRACE(
36320 28 22 44 4f 4e 54 5f 57 52 49 54 45 20 70 61 67  ("DONT_WRITE pag
36330 65 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70  e %d of %d\n", p
36340 50 67 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49  Pg->pgno, PAGERI
36350 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20  D(pPager)));.   
36360 20 49 4f 54 52 41 43 45 28 28 22 43 4c 45 41 4e   IOTRACE(("CLEAN
36370 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
36380 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 0a 20  r, pPg->pgno)). 
36390 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d     pPg->flags |=
363a0 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54   PGHDR_DONT_WRIT
363b0 45 3b 0a 20 20 20 20 70 61 67 65 72 5f 73 65 74  E;.    pager_set
363c0 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a  _pagehash(pPg);.
363d0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
363e0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
363f0 6c 65 64 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74  led to increment
36400 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
36410 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
36420 0a 2a 2a 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  .** change-count
36430 65 72 2c 20 73 74 6f 72 65 64 20 61 73 20 61 20  er, stored as a 
36440 34 2d 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4-byte big-endia
36450 6e 20 69 6e 74 65 67 65 72 20 73 74 61 72 74 69  n integer starti
36460 6e 67 20 61 74 20 0a 2a 2a 20 62 79 74 65 20 6f  ng at .** byte o
36470 66 66 73 65 74 20 32 34 20 6f 66 20 74 68 65 20  ffset 24 of the 
36480 70 61 67 65 72 20 66 69 6c 65 2e 20 20 54 68 65  pager file.  The
36490 20 73 65 63 6f 6e 64 61 72 79 20 63 68 61 6e 67   secondary chang
364a0 65 20 63 6f 75 6e 74 65 72 20 61 74 0a 2a 2a 20  e counter at.** 
364b0 39 32 20 69 73 20 61 6c 73 6f 20 75 70 64 61 74  92 is also updat
364c0 65 64 2c 20 61 73 20 69 73 20 74 68 65 20 53 51  ed, as is the SQ
364d0 4c 69 74 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d  Lite version num
364e0 62 65 72 20 61 74 20 6f 66 66 73 65 74 20 39 36  ber at offset 96
364f0 2e 0a 2a 2a 0a 2a 2a 20 42 75 74 20 74 68 69 73  ..**.** But this
36500 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 69 66   only happens if
36510 20 74 68 65 20 70 50 61 67 65 72 2d 3e 63 68 61   the pPager->cha
36520 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61  ngeCountDone fla
36530 67 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2a 20 54  g is false..** T
36540 6f 20 61 76 6f 69 64 20 65 78 63 65 73 73 20 63  o avoid excess c
36550 68 75 72 6e 69 6e 67 20 6f 66 20 70 61 67 65 20  hurning of page 
36560 31 2c 20 74 68 65 20 75 70 64 61 74 65 20 6f 6e  1, the update on
36570 6c 79 20 68 61 70 70 65 6e 73 20 6f 6e 63 65 2e  ly happens once.
36580 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 74 68 65  .** See also the
36590 20 70 61 67 65 72 5f 77 72 69 74 65 5f 63 68 61   pager_write_cha
365a0 6e 67 65 63 6f 75 6e 74 65 72 28 29 20 72 6f 75  ngecounter() rou
365b0 74 69 6e 65 20 74 68 61 74 20 64 6f 65 73 20 61  tine that does a
365c0 6e 20 0a 2a 2a 20 75 6e 63 6f 6e 64 69 74 69 6f  n .** unconditio
365d0 6e 61 6c 20 75 70 64 61 74 65 20 6f 66 20 74 68  nal update of th
365e0 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72  e change counter
365f0 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  s..**.** If the 
36600 69 73 44 69 72 65 63 74 4d 6f 64 65 20 66 6c 61  isDirectMode fla
36610 67 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20  g is zero, then 
36620 74 68 69 73 20 69 73 20 64 6f 6e 65 20 62 79 20  this is done by 
36630 63 61 6c 6c 69 6e 67 20 0a 2a 2a 20 73 71 6c 69  calling .** sqli
36640 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20  te3PagerWrite() 
36650 6f 6e 20 70 61 67 65 20 31 2c 20 74 68 65 6e 20  on page 1, then 
36660 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 63 6f  modifying the co
36670 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a  ntents of the.**
36680 20 70 61 67 65 20 64 61 74 61 2e 20 49 6e 20 74   page data. In t
36690 68 69 73 20 63 61 73 65 20 74 68 65 20 66 69 6c  his case the fil
366a0 65 20 77 69 6c 6c 20 62 65 20 75 70 64 61 74 65  e will be update
366b0 64 20 77 68 65 6e 20 74 68 65 20 63 75 72 72 65  d when the curre
366c0 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  nt.** transactio
366d0 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a  n is committed..
366e0 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 44 69 72 65  **.** The isDire
366f0 63 74 4d 6f 64 65 20 66 6c 61 67 20 6d 61 79 20  ctMode flag may 
36700 6f 6e 6c 79 20 62 65 20 6e 6f 6e 2d 7a 65 72 6f  only be non-zero
36710 20 69 66 20 74 68 65 20 6c 69 62 72 61 72 79 20   if the library 
36720 77 61 73 20 63 6f 6d 70 69 6c 65 64 0a 2a 2a 20  was compiled.** 
36730 77 69 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f  with the SQLITE_
36740 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52  ENABLE_ATOMIC_WR
36750 49 54 45 20 6d 61 63 72 6f 20 64 65 66 69 6e 65  ITE macro define
36760 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  d. In this case,
36770 0a 2a 2a 20 69 66 20 69 73 44 69 72 65 63 74 20  .** if isDirect 
36780 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
36790 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
367a0 69 6c 65 20 69 73 20 75 70 64 61 74 65 64 20 64  ile is updated d
367b0 69 72 65 63 74 6c 79 0a 2a 2a 20 62 79 20 77 72  irectly.** by wr
367c0 69 74 69 6e 67 20 61 6e 20 75 70 64 61 74 65 64  iting an updated
367d0 20 76 65 72 73 69 6f 6e 20 6f 66 20 70 61 67 65   version of page
367e0 20 31 20 75 73 69 6e 67 20 61 20 63 61 6c 6c 20   1 using a call 
367f0 74 6f 20 74 68 65 20 0a 2a 2a 20 73 71 6c 69 74  to the .** sqlit
36800 65 33 4f 73 57 72 69 74 65 28 29 20 66 75 6e 63  e3OsWrite() func
36810 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
36820 69 6e 74 20 70 61 67 65 72 5f 69 6e 63 72 5f 63  int pager_incr_c
36830 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 50 61 67  hangecounter(Pag
36840 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
36850 69 73 44 69 72 65 63 74 4d 6f 64 65 29 7b 0a 20  isDirectMode){. 
36860 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
36870 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  _OK;..  assert( 
36880 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
36890 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
368a0 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20  HEMOD.       || 
368b0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
368c0 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d  PAGER_WRITER_DBM
368d0 4f 44 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74  OD.  );.  assert
368e0 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
368f0 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
36900 0a 20 20 2f 2a 20 44 65 63 6c 61 72 65 20 61 6e  .  /* Declare an
36910 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 63 6f 6e  d initialize con
36920 73 74 61 6e 74 20 69 6e 74 65 67 65 72 20 27 69  stant integer 'i
36930 73 44 69 72 65 63 74 27 2e 20 49 66 20 74 68 65  sDirect'. If the
36940 0a 20 20 2a 2a 20 61 74 6f 6d 69 63 2d 77 72 69  .  ** atomic-wri
36950 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  te optimization 
36960 69 73 20 65 6e 61 62 6c 65 64 20 69 6e 20 74 68  is enabled in th
36970 69 73 20 62 75 69 6c 64 2c 20 74 68 65 6e 20 69  is build, then i
36980 73 44 69 72 65 63 74 0a 20 20 2a 2a 20 69 73 20  sDirect.  ** is 
36990 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 74  initialized to t
369a0 68 65 20 76 61 6c 75 65 20 70 61 73 73 65 64 20  he value passed 
369b0 61 73 20 74 68 65 20 69 73 44 69 72 65 63 74 4d  as the isDirectM
369c0 6f 64 65 20 70 61 72 61 6d 65 74 65 72 0a 20 20  ode parameter.  
369d0 2a 2a 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  ** to this funct
369e0 69 6f 6e 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ion. Otherwise, 
369f0 69 74 20 69 73 20 61 6c 77 61 79 73 20 73 65 74  it is always set
36a00 20 74 6f 20 7a 65 72 6f 2e 0a 20 20 2a 2a 0a 20   to zero..  **. 
36a10 20 2a 2a 20 54 68 65 20 69 64 65 61 20 69 73 20   ** The idea is 
36a20 74 68 61 74 20 69 66 20 74 68 65 20 61 74 6f 6d  that if the atom
36a30 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a  ic-write optimiz
36a40 61 74 69 6f 6e 20 69 73 20 6e 6f 74 0a 20 20 2a  ation is not.  *
36a50 2a 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d  * enabled at com
36a60 70 69 6c 65 20 74 69 6d 65 2c 20 74 68 65 20 63  pile time, the c
36a70 6f 6d 70 69 6c 65 72 20 63 61 6e 20 6f 6d 69 74  ompiler can omit
36a80 20 74 68 65 20 74 65 73 74 73 20 6f 66 0a 20 20   the tests of.  
36a90 2a 2a 20 27 69 73 44 69 72 65 63 74 27 20 62 65  ** 'isDirect' be
36aa0 6c 6f 77 2c 20 61 73 20 77 65 6c 6c 20 61 73 20  low, as well as 
36ab0 74 68 65 20 62 6c 6f 63 6b 20 65 6e 63 6c 6f 73  the block enclos
36ac0 65 64 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 22  ed in the.  ** "
36ad0 69 66 28 20 69 73 44 69 72 65 63 74 20 29 22 20  if( isDirect )" 
36ae0 63 6f 6e 64 69 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  condition..  */.
36af0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 45  #ifndef SQLITE_E
36b00 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49  NABLE_ATOMIC_WRI
36b10 54 45 0a 23 20 64 65 66 69 6e 65 20 44 49 52 45  TE.# define DIRE
36b20 43 54 5f 4d 4f 44 45 20 30 0a 20 20 61 73 73 65  CT_MODE 0.  asse
36b30 72 74 28 20 69 73 44 69 72 65 63 74 4d 6f 64 65  rt( isDirectMode
36b40 3d 3d 30 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f  ==0 );.  UNUSED_
36b50 50 41 52 41 4d 45 54 45 52 28 69 73 44 69 72 65  PARAMETER(isDire
36b60 63 74 4d 6f 64 65 29 3b 0a 23 65 6c 73 65 0a 23  ctMode);.#else.#
36b70 20 64 65 66 69 6e 65 20 44 49 52 45 43 54 5f 4d   define DIRECT_M
36b80 4f 44 45 20 69 73 44 69 72 65 63 74 4d 6f 64 65  ODE isDirectMode
36b90 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 21  .#endif..  if( !
36ba0 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
36bb0 75 6e 74 44 6f 6e 65 20 26 26 20 70 50 61 67 65  untDone && pPage
36bc0 72 2d 3e 64 62 53 69 7a 65 3e 30 20 29 7b 0a 20  r->dbSize>0 ){. 
36bd0 20 20 20 50 67 48 64 72 20 2a 70 50 67 48 64 72     PgHdr *pPgHdr
36be0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
36bf0 20 2f 2a 20 52 65 66 65 72 65 6e 63 65 20 74 6f   /* Reference to
36c00 20 70 61 67 65 20 31 20 2a 2f 0a 0a 20 20 20 20   page 1 */..    
36c10 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
36c20 3e 74 65 6d 70 46 69 6c 65 20 26 26 20 69 73 4f  >tempFile && isO
36c30 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
36c40 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20  );..    /* Open 
36c50 70 61 67 65 20 31 20 6f 66 20 74 68 65 20 66 69  page 1 of the fi
36c60 6c 65 20 66 6f 72 20 77 72 69 74 69 6e 67 2e 20  le for writing. 
36c70 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
36c80 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67  te3PagerGet(pPag
36c90 65 72 2c 20 31 2c 20 26 70 50 67 48 64 72 29 3b  er, 1, &pPgHdr);
36ca0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67  .    assert( pPg
36cb0 48 64 72 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51  Hdr==0 || rc==SQ
36cc0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20  LITE_OK );..    
36cd0 2f 2a 20 49 66 20 70 61 67 65 20 6f 6e 65 20 77  /* If page one w
36ce0 61 73 20 66 65 74 63 68 65 64 20 73 75 63 63 65  as fetched succe
36cf0 73 73 66 75 6c 6c 79 2c 20 61 6e 64 20 74 68 69  ssfully, and thi
36d00 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f  s function is no
36d10 74 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 69  t.    ** operati
36d20 6e 67 20 69 6e 20 64 69 72 65 63 74 2d 6d 6f 64  ng in direct-mod
36d30 65 2c 20 6d 61 6b 65 20 70 61 67 65 20 31 20 77  e, make page 1 w
36d40 72 69 74 61 62 6c 65 2e 20 20 57 68 65 6e 20 6e  ritable.  When n
36d50 6f 74 20 69 6e 20 0a 20 20 20 20 2a 2a 20 64 69  ot in .    ** di
36d60 72 65 63 74 20 6d 6f 64 65 2c 20 70 61 67 65 20  rect mode, page 
36d70 31 20 69 73 20 61 6c 77 61 79 73 20 68 65 6c 64  1 is always held
36d80 20 69 6e 20 63 61 63 68 65 20 61 6e 64 20 68 65   in cache and he
36d90 6e 63 65 20 74 68 65 20 50 61 67 65 72 47 65 74  nce the PagerGet
36da0 28 29 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 20  ().    ** above 
36db0 69 73 20 61 6c 77 61 79 73 20 73 75 63 63 65 73  is always succes
36dc0 73 66 75 6c 20 2d 20 68 65 6e 63 65 20 74 68 65  sful - hence the
36dd0 20 41 4c 57 41 59 53 20 6f 6e 20 72 63 3d 3d 53   ALWAYS on rc==S
36de0 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 20 20 2a 2f  QLITE_OK..    */
36df0 0a 20 20 20 20 69 66 28 20 21 44 49 52 45 43 54  .    if( !DIRECT
36e00 5f 4d 4f 44 45 20 26 26 20 41 4c 57 41 59 53 28  _MODE && ALWAYS(
36e10 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 29  rc==SQLITE_OK) )
36e20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
36e30 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
36e40 50 67 48 64 72 29 3b 0a 20 20 20 20 7d 0a 0a 20  PgHdr);.    }.. 
36e50 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
36e60 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a  E_OK ){.      /*
36e70 20 41 63 74 75 61 6c 6c 79 20 64 6f 20 74 68 65   Actually do the
36e80 20 75 70 64 61 74 65 20 6f 66 20 74 68 65 20 63   update of the c
36e90 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 2a 2f  hange counter */
36ea0 0a 20 20 20 20 20 20 70 61 67 65 72 5f 77 72 69  .      pager_wri
36eb0 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72  te_changecounter
36ec0 28 70 50 67 48 64 72 29 3b 0a 0a 20 20 20 20 20  (pPgHdr);..     
36ed0 20 2f 2a 20 49 66 20 72 75 6e 6e 69 6e 67 20 69   /* If running i
36ee0 6e 20 64 69 72 65 63 74 20 6d 6f 64 65 2c 20 77  n direct mode, w
36ef0 72 69 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  rite the content
36f00 73 20 6f 66 20 70 61 67 65 20 31 20 74 6f 20 74  s of page 1 to t
36f10 68 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  he file. */.    
36f20 20 20 69 66 28 20 44 49 52 45 43 54 5f 4d 4f 44    if( DIRECT_MOD
36f30 45 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  E ){.        con
36f40 73 74 20 76 6f 69 64 20 2a 7a 42 75 66 3b 0a 20  st void *zBuf;. 
36f50 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
36f60 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
36f70 65 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 43  e>0 );.        C
36f80 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 50  ODEC2(pPager, pP
36f90 67 48 64 72 2d 3e 70 44 61 74 61 2c 20 31 2c 20  gHdr->pData, 1, 
36fa0 36 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d  6, rc=SQLITE_NOM
36fb0 45 4d 2c 20 7a 42 75 66 29 3b 0a 20 20 20 20 20  EM, zBuf);.     
36fc0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
36fd0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
36fe0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
36ff0 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64  Write(pPager->fd
37000 2c 20 7a 42 75 66 2c 20 70 50 61 67 65 72 2d 3e  , zBuf, pPager->
37010 70 61 67 65 53 69 7a 65 2c 20 30 29 3b 0a 20 20  pageSize, 0);.  
37020 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
37030 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
37040 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  K ){.          p
37050 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
37060 6e 74 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20  ntDone = 1;.    
37070 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
37080 65 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  e{.        pPage
37090 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
370a0 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  ne = 1;.      }.
370b0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65      }..    /* Re
370c0 6c 65 61 73 65 20 74 68 65 20 70 61 67 65 20 72  lease the page r
370d0 65 66 65 72 65 6e 63 65 2e 20 2a 2f 0a 20 20 20  eference. */.   
370e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
370f0 65 66 28 70 50 67 48 64 72 29 3b 0a 20 20 7d 0a  ef(pPgHdr);.  }.
37100 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
37110 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 64  /*.** Sync the d
37120 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
37130 64 69 73 6b 2e 20 54 68 69 73 20 69 73 20 61 20  disk. This is a 
37140 6e 6f 2d 6f 70 20 66 6f 72 20 69 6e 2d 6d 65 6d  no-op for in-mem
37150 6f 72 79 20 64 61 74 61 62 61 73 65 73 0a 2a 2a  ory databases.**
37160 20 6f 72 20 70 61 67 65 73 20 77 69 74 68 20 74   or pages with t
37170 68 65 20 50 61 67 65 72 2e 6e 6f 53 79 6e 63 20  he Pager.noSync 
37180 66 6c 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20  flag set..**.** 
37190 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f  If successful, o
371a0 72 20 69 66 20 63 61 6c 6c 65 64 20 6f 6e 20 61  r if called on a
371b0 20 70 61 67 65 72 20 66 6f 72 20 77 68 69 63 68   pager for which
371c0 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2c 20   it is a no-op, 
371d0 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  this.** function
371e0 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
371f0 4f 4b 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61  OK. Otherwise, a
37200 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  n IO error code 
37210 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
37220 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
37230 53 79 6e 63 28 50 61 67 65 72 20 2a 70 50 61 67  Sync(Pager *pPag
37240 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
37250 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
37260 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
37270 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
37280 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 72 63  !MEMDB );.    rc
37290 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
372a0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61  (pPager->fd, pPa
372b0 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 29 3b  ger->syncFlags);
372c0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73 4f  .  }else if( isO
372d0 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
372e0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
372f0 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 73 71 6c  MEMDB );.    sql
37300 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f  ite3OsFileContro
37310 6c 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51  l(pPager->fd, SQ
37320 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 59 4e 43 5f  LITE_FCNTL_SYNC_
37330 4f 4d 49 54 54 45 44 2c 20 28 76 6f 69 64 20 2a  OMITTED, (void *
37340 29 26 72 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74  )&rc);.  }.  ret
37350 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
37360 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   This function m
37370 61 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65  ay only be calle
37380 64 20 77 68 69 6c 65 20 61 20 77 72 69 74 65 2d  d while a write-
37390 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
373a0 63 74 69 76 65 20 69 6e 0a 2a 2a 20 72 6f 6c 6c  ctive in.** roll
373b0 62 61 63 6b 2e 20 49 66 20 74 68 65 20 63 6f 6e  back. If the con
373c0 6e 65 63 74 69 6f 6e 20 69 73 20 69 6e 20 57 41  nection is in WA
373d0 4c 20 6d 6f 64 65 2c 20 74 68 69 73 20 63 61 6c  L mode, this cal
373e0 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 0a 2a  l is a no-op. .*
373f0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  * Otherwise, if 
37400 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64  the connection d
37410 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  oes not already 
37420 68 61 76 65 20 61 6e 20 45 58 43 4c 55 53 49 56  have an EXCLUSIV
37430 45 20 6c 6f 63 6b 20 6f 6e 20 0a 2a 2a 20 74 68  E lock on .** th
37440 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
37450 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d   an attempt is m
37460 61 64 65 20 74 6f 20 6f 62 74 61 69 6e 20 6f 6e  ade to obtain on
37470 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
37480 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69  EXCLUSIVE lock i
37490 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64 20 6f  s already held o
374a0 72 20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f  r the attempt to
374b0 20 6f 62 74 61 69 6e 20 69 74 20 69 73 0a 2a 2a   obtain it is.**
374c0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20   successful, or 
374d0 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  the connection i
374e0 73 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2c 20 53  s in WAL mode, S
374f0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
37500 72 6e 65 64 2e 0a 2a 2a 20 4f 74 68 65 72 77 69  rned..** Otherwi
37510 73 65 2c 20 65 69 74 68 65 72 20 53 51 4c 49 54  se, either SQLIT
37520 45 5f 42 55 53 59 20 6f 72 20 61 6e 20 53 51 4c  E_BUSY or an SQL
37530 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20 65 72  ITE_IOERR_XXX er
37540 72 6f 72 20 63 6f 64 65 20 69 73 20 0a 2a 2a 20  ror code is .** 
37550 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74  returned..*/.int
37560 20 73 71 6c 69 74 65 33 50 61 67 65 72 45 78 63   sqlite3PagerExc
37570 6c 75 73 69 76 65 4c 6f 63 6b 28 50 61 67 65 72  lusiveLock(Pager
37580 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
37590 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
375a0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
375b0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
375c0 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
375d0 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67   .       || pPag
375e0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
375f0 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 0a  R_WRITER_DBMOD .
37600 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72         || pPager
37610 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
37620 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 0a 20  WRITER_LOCKED . 
37630 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73   );.  assert( as
37640 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
37650 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 69 66  (pPager) );.  if
37660 28 20 30 3d 3d 70 61 67 65 72 55 73 65 57 61 6c  ( 0==pagerUseWal
37670 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
37680 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f  rc = pager_wait_
37690 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20  on_lock(pPager, 
376a0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b  EXCLUSIVE_LOCK);
376b0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
376c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20  ;.}../*.** Sync 
376d0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
376e0 65 20 66 6f 72 20 74 68 65 20 70 61 67 65 72 20  e for the pager 
376f0 70 50 61 67 65 72 2e 20 7a 4d 61 73 74 65 72 20  pPager. zMaster 
37700 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6e 61  points to the na
37710 6d 65 0a 2a 2a 20 6f 66 20 61 20 6d 61 73 74 65  me.** of a maste
37720 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  r journal file t
37730 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72  hat should be wr
37740 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 69  itten into the i
37750 6e 64 69 76 69 64 75 61 6c 0a 2a 2a 20 6a 6f 75  ndividual.** jou
37760 72 6e 61 6c 20 66 69 6c 65 2e 20 7a 4d 61 73 74  rnal file. zMast
37770 65 72 20 6d 61 79 20 62 65 20 4e 55 4c 4c 2c 20  er may be NULL, 
37780 77 68 69 63 68 20 69 73 20 69 6e 74 65 72 70 72  which is interpr
37790 65 74 65 64 20 61 73 20 6e 6f 20 6d 61 73 74 65  eted as no maste
377a0 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 20  r.** journal (a 
377b0 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20  single database 
377c0 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a  transaction)..**
377d0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
377e0 20 65 6e 73 75 72 65 73 20 74 68 61 74 3a 0a 2a   ensures that:.*
377f0 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 64 61 74  *.**   * The dat
37800 61 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e 67  abase file chang
37810 65 2d 63 6f 75 6e 74 65 72 20 69 73 20 75 70 64  e-counter is upd
37820 61 74 65 64 2c 0a 2a 2a 20 20 20 2a 20 74 68 65  ated,.**   * the
37830 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63   journal is sync
37840 65 64 20 28 75 6e 6c 65 73 73 20 74 68 65 20 61  ed (unless the a
37850 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69  tomic-write opti
37860 6d 69 7a 61 74 69 6f 6e 20 69 73 20 75 73 65 64  mization is used
37870 29 2c 0a 2a 2a 20 20 20 2a 20 61 6c 6c 20 64 69  ),.**   * all di
37880 72 74 79 20 70 61 67 65 73 20 61 72 65 20 77 72  rty pages are wr
37890 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74  itten to the dat
378a0 61 62 61 73 65 20 66 69 6c 65 2c 20 0a 2a 2a 20  abase file, .** 
378b0 20 20 2a 20 74 68 65 20 64 61 74 61 62 61 73 65    * the database
378c0 20 66 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74   file is truncat
378d0 65 64 20 28 69 66 20 72 65 71 75 69 72 65 64 29  ed (if required)
378e0 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 74 68 65  , and.**   * the
378f0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 73   database file s
37900 79 6e 63 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68  ynced. .**.** Th
37910 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 74 68 61  e only thing tha
37920 74 20 72 65 6d 61 69 6e 73 20 74 6f 20 63 6f 6d  t remains to com
37930 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  mit the transact
37940 69 6f 6e 20 69 73 20 74 6f 20 66 69 6e 61 6c 69  ion is to finali
37950 7a 65 20 0a 2a 2a 20 28 64 65 6c 65 74 65 2c 20  ze .** (delete, 
37960 74 72 75 6e 63 61 74 65 20 6f 72 20 7a 65 72 6f  truncate or zero
37970 20 74 68 65 20 66 69 72 73 74 20 70 61 72 74 20   the first part 
37980 6f 66 29 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  of) the journal 
37990 66 69 6c 65 20 28 6f 72 20 0a 2a 2a 20 64 65 6c  file (or .** del
379a0 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
379b0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 73  ournal file if s
379c0 70 65 63 69 66 69 65 64 29 2e 0a 2a 2a 0a 2a 2a  pecified)..**.**
379d0 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20 7a 4d   Note that if zM
379e0 61 73 74 65 72 3d 3d 4e 55 4c 4c 2c 20 74 68 69  aster==NULL, thi
379f0 73 20 64 6f 65 73 20 6e 6f 74 20 6f 76 65 72 77  s does not overw
37a00 72 69 74 65 20 61 20 70 72 65 76 69 6f 75 73 20  rite a previous 
37a10 76 61 6c 75 65 0a 2a 2a 20 70 61 73 73 65 64 20  value.** passed 
37a20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 50 61 67  to an sqlite3Pag
37a30 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  erCommitPhaseOne
37a40 28 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49  () call..**.** I
37a50 66 20 74 68 65 20 66 69 6e 61 6c 20 70 61 72 61  f the final para
37a60 6d 65 74 65 72 20 2d 20 6e 6f 53 79 6e 63 20 2d  meter - noSync -
37a70 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74   is true, then t
37a80 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
37a90 20 69 74 73 65 6c 66 0a 2a 2a 20 69 73 20 6e 6f   itself.** is no
37aa0 74 20 73 79 6e 63 65 64 2e 20 54 68 65 20 63 61  t synced. The ca
37ab0 6c 6c 65 72 20 6d 75 73 74 20 63 61 6c 6c 20 73  ller must call s
37ac0 71 6c 69 74 65 33 50 61 67 65 72 53 79 6e 63 28  qlite3PagerSync(
37ad0 29 20 64 69 72 65 63 74 6c 79 20 74 6f 0a 2a 2a  ) directly to.**
37ae0 20 73 79 6e 63 20 74 68 65 20 64 61 74 61 62 61   sync the databa
37af0 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65 20 63  se file before c
37b00 61 6c 6c 69 6e 67 20 43 6f 6d 6d 69 74 50 68 61  alling CommitPha
37b10 73 65 54 77 6f 28 29 20 74 6f 20 64 65 6c 65 74  seTwo() to delet
37b20 65 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  e the.** journal
37b30 20 66 69 6c 65 20 69 6e 20 74 68 69 73 20 63 61   file in this ca
37b40 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  se..*/.int sqlit
37b50 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  e3PagerCommitPha
37b60 73 65 4f 6e 65 28 0a 20 20 50 61 67 65 72 20 2a  seOne(.  Pager *
37b70 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20  pPager,         
37b80 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
37b90 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f  r object */.  co
37ba0 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  nst char *zMaste
37bb0 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r,            /*
37bc0 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   If not NULL, th
37bd0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
37be0 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   name */.  int n
37bf0 6f 53 79 6e 63 20 20 20 20 20 20 20 20 20 20 20  oSync           
37c00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
37c10 75 65 20 74 6f 20 6f 6d 69 74 20 74 68 65 20 78  ue to omit the x
37c20 53 79 6e 63 20 6f 6e 20 74 68 65 20 64 62 20 66  Sync on the db f
37c30 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ile */.){.  int 
37c40 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
37c50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
37c60 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20  eturn code */.. 
37c70 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
37c80 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
37c90 52 49 54 45 52 5f 4c 4f 43 4b 45 44 0a 20 20 20  RITER_LOCKED.   
37ca0 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65      || pPager->e
37cb0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
37cc0 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20  TER_CACHEMOD.   
37cd0 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65      || pPager->e
37ce0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
37cf0 54 45 52 5f 44 42 4d 4f 44 0a 20 20 20 20 20 20  TER_DBMOD.      
37d00 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
37d10 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 0a  te==PAGER_ERROR.
37d20 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61    );.  assert( a
37d30 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
37d40 65 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20  e(pPager) );..  
37d50 2f 2a 20 49 66 20 61 20 70 72 69 6f 72 20 65 72  /* If a prior er
37d60 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 72 65  ror occurred, re
37d70 70 6f 72 74 20 74 68 61 74 20 65 72 72 6f 72 20  port that error 
37d80 61 67 61 69 6e 2e 20 2a 2f 0a 20 20 69 66 28 20  again. */.  if( 
37d90 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e 65 72  NEVER(pPager->er
37da0 72 43 6f 64 65 29 20 29 20 72 65 74 75 72 6e 20  rCode) ) return 
37db0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
37dc0 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28  ..  PAGERTRACE((
37dd0 22 44 41 54 41 42 41 53 45 20 53 59 4e 43 3a 20  "DATABASE SYNC: 
37de0 46 69 6c 65 3d 25 73 20 7a 4d 61 73 74 65 72 3d  File=%s zMaster=
37df0 25 73 20 6e 53 69 7a 65 3d 25 64 5c 6e 22 2c 20  %s nSize=%d\n", 
37e00 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 7a  .      pPager->z
37e10 46 69 6c 65 6e 61 6d 65 2c 20 7a 4d 61 73 74 65  Filename, zMaste
37e20 72 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  r, pPager->dbSiz
37e30 65 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f  e));..  /* If no
37e40 20 64 61 74 61 62 61 73 65 20 63 68 61 6e 67 65   database change
37e50 73 20 68 61 76 65 20 62 65 65 6e 20 6d 61 64 65  s have been made
37e60 2c 20 72 65 74 75 72 6e 20 65 61 72 6c 79 2e 20  , return early. 
37e70 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
37e80 3e 65 53 74 61 74 65 3c 50 41 47 45 52 5f 57 52  >eState<PAGER_WR
37e90 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 29 20  ITER_CACHEMOD ) 
37ea0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
37eb0 3b 0a 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29  ;..  if( MEMDB )
37ec0 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  {.    /* If this
37ed0 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   is an in-memory
37ee0 20 64 62 2c 20 6f 72 20 6e 6f 20 70 61 67 65 73   db, or no pages
37ef0 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74   have been writt
37f00 65 6e 20 74 6f 2c 20 6f 72 20 74 68 69 73 0a 20  en to, or this. 
37f10 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68     ** function h
37f20 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
37f30 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 6d 6f  called, it is mo
37f40 73 74 6c 79 20 61 20 6e 6f 2d 6f 70 2e 20 20 48  stly a no-op.  H
37f50 6f 77 65 76 65 72 2c 20 61 6e 79 0a 20 20 20 20  owever, any.    
37f60 2a 2a 20 62 61 63 6b 75 70 20 69 6e 20 70 72 6f  ** backup in pro
37f70 67 72 65 73 73 20 6e 65 65 64 73 20 74 6f 20 62  gress needs to b
37f80 65 20 72 65 73 74 61 72 74 65 64 2e 0a 20 20 20  e restarted..   
37f90 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42   */.    sqlite3B
37fa0 61 63 6b 75 70 52 65 73 74 61 72 74 28 70 50 61  ackupRestart(pPa
37fb0 67 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 20  ger->pBackup);. 
37fc0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
37fd0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
37fe0 65 72 29 20 29 7b 0a 20 20 20 20 20 20 50 67 48  er) ){.      PgH
37ff0 64 72 20 2a 70 4c 69 73 74 20 3d 20 73 71 6c 69  dr *pList = sqli
38000 74 65 33 50 63 61 63 68 65 44 69 72 74 79 4c 69  te3PcacheDirtyLi
38010 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  st(pPager->pPCac
38020 68 65 29 3b 0a 20 20 20 20 20 20 50 67 48 64 72  he);.      PgHdr
38030 20 2a 70 50 61 67 65 4f 6e 65 20 3d 20 30 3b 0a   *pPageOne = 0;.
38040 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d        if( pList=
38050 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
38060 20 4d 75 73 74 20 68 61 76 65 20 61 74 20 6c 65   Must have at le
38070 61 73 74 20 6f 6e 65 20 70 61 67 65 20 66 6f 72  ast one page for
38080 20 74 68 65 20 57 41 4c 20 63 6f 6d 6d 69 74 20   the WAL commit 
38090 66 6c 61 67 2e 0a 20 20 20 20 20 20 20 20 2a 2a  flag..        **
380a0 20 54 69 63 6b 65 74 20 5b 32 64 31 61 35 63 36   Ticket [2d1a5c6
380b0 37 64 66 63 32 33 36 33 65 34 34 66 32 39 64 39  7dfc2363e44f29d9
380c0 62 62 64 35 37 66 5d 20 32 30 31 31 2d 30 35 2d  bbd57f] 2011-05-
380d0 31 38 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63  18 */.        rc
380e0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
380f0 65 74 28 70 50 61 67 65 72 2c 20 31 2c 20 26 70  et(pPager, 1, &p
38100 50 61 67 65 4f 6e 65 29 3b 0a 20 20 20 20 20 20  PageOne);.      
38110 20 20 70 4c 69 73 74 20 3d 20 70 50 61 67 65 4f    pList = pPageO
38120 6e 65 3b 0a 20 20 20 20 20 20 20 20 70 4c 69 73  ne;.        pLis
38130 74 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20  t->pDirty = 0;. 
38140 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
38150 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
38160 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  OK );.      if( 
38170 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20 29 7b  ALWAYS(pList) ){
38180 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61  .        rc = pa
38190 67 65 72 57 61 6c 46 72 61 6d 65 73 28 70 50 61  gerWalFrames(pPa
381a0 67 65 72 2c 20 70 4c 69 73 74 2c 20 70 50 61 67  ger, pList, pPag
381b0 65 72 2d 3e 64 62 53 69 7a 65 2c 20 31 29 3b 0a  er->dbSize, 1);.
381c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
381d0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
381e0 70 50 61 67 65 4f 6e 65 29 3b 0a 20 20 20 20 20  pPageOne);.     
381f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
38200 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  OK ){.        sq
38210 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 6e  lite3PcacheClean
38220 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50 43 61  All(pPager->pPCa
38230 63 68 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  che);.      }.  
38240 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
38250 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
38260 62 6c 6f 63 6b 20 75 70 64 61 74 65 73 20 74 68  block updates th
38270 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
38280 2e 20 45 78 61 63 74 6c 79 20 68 6f 77 20 69 74  . Exactly how it
38290 0a 20 20 20 20 20 20 2a 2a 20 64 6f 65 73 20 74  .      ** does t
382a0 68 69 73 20 64 65 70 65 6e 64 73 20 6f 6e 20 77  his depends on w
382b0 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
382c0 65 20 61 74 6f 6d 69 63 2d 75 70 64 61 74 65 20  e atomic-update 
382d0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 20 20 20  optimization.   
382e0 20 20 20 2a 2a 20 77 61 73 20 65 6e 61 62 6c 65     ** was enable
382f0 64 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d  d at compile tim
38300 65 2c 20 61 6e 64 20 69 66 20 74 68 69 73 20 74  e, and if this t
38310 72 61 6e 73 61 63 74 69 6f 6e 20 6d 65 65 74 73  ransaction meets
38320 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 72   the .      ** r
38330 75 6e 74 69 6d 65 20 63 72 69 74 65 72 69 61 20  untime criteria 
38340 74 6f 20 75 73 65 20 74 68 65 20 6f 70 65 72 61  to use the opera
38350 74 69 6f 6e 3a 20 0a 20 20 20 20 20 20 2a 2a 0a  tion: .      **.
38360 20 20 20 20 20 20 2a 2a 20 20 20 20 2a 20 54 68        **    * Th
38370 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73 75  e file-system su
38380 70 70 6f 72 74 73 20 74 68 65 20 61 74 6f 6d 69  pports the atomi
38390 63 2d 77 72 69 74 65 20 70 72 6f 70 65 72 74 79  c-write property
383a0 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 20 20   for.      **   
383b0 20 20 20 62 6c 6f 63 6b 73 20 6f 66 20 73 69 7a     blocks of siz
383c0 65 20 70 61 67 65 2d 73 69 7a 65 2c 20 61 6e 64  e page-size, and
383d0 20 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 2a 20   .      **    * 
383e0 54 68 69 73 20 63 6f 6d 6d 69 74 20 69 73 20 6e  This commit is n
383f0 6f 74 20 70 61 72 74 20 6f 66 20 61 20 6d 75 6c  ot part of a mul
38400 74 69 2d 66 69 6c 65 20 74 72 61 6e 73 61 63 74  ti-file transact
38410 69 6f 6e 2c 20 61 6e 64 0a 20 20 20 20 20 20 2a  ion, and.      *
38420 2a 20 20 20 20 2a 20 45 78 61 63 74 6c 79 20 6f  *    * Exactly o
38430 6e 65 20 70 61 67 65 20 68 61 73 20 62 65 65 6e  ne page has been
38440 20 6d 6f 64 69 66 69 65 64 20 61 6e 64 20 73 74   modified and st
38450 6f 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ore in the journ
38460 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a  al file..      *
38470 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68  *.      ** If th
38480 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 77  e optimization w
38490 61 73 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20 61  as not enabled a
384a0 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20  t compile time, 
384b0 74 68 65 6e 20 74 68 65 0a 20 20 20 20 20 20 2a  then the.      *
384c0 2a 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61  * pager_incr_cha
384d0 6e 67 65 63 6f 75 6e 74 65 72 28 29 20 66 75 6e  ngecounter() fun
384e0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
384f0 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 63 68  to update the ch
38500 61 6e 67 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f  ange.      ** co
38510 75 6e 74 65 72 20 69 6e 20 27 69 6e 64 69 72 65  unter in 'indire
38520 63 74 2d 6d 6f 64 65 27 2e 20 49 66 20 74 68 65  ct-mode'. If the
38530 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73   optimization is
38540 20 63 6f 6d 70 69 6c 65 64 20 69 6e 20 62 75 74   compiled in but
38550 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74  .      ** is not
38560 20 61 70 70 6c 69 63 61 62 6c 65 20 74 6f 20 74   applicable to t
38570 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  his transaction,
38580 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 4a 6f 75   call sqlite3Jou
38590 72 6e 61 6c 43 72 65 61 74 65 28 29 0a 20 20 20  rnalCreate().   
385a0 20 20 20 2a 2a 20 74 6f 20 6d 61 6b 65 20 73 75     ** to make su
385b0 72 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  re the journal f
385c0 69 6c 65 20 68 61 73 20 61 63 74 75 61 6c 6c 79  ile has actually
385d0 20 62 65 65 6e 20 63 72 65 61 74 65 64 2c 20 74   been created, t
385e0 68 65 6e 20 63 61 6c 6c 0a 20 20 20 20 20 20 2a  hen call.      *
385f0 2a 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61  * pager_incr_cha
38600 6e 67 65 63 6f 75 6e 74 65 72 28 29 20 74 6f 20  ngecounter() to 
38610 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67  update the chang
38620 65 2d 63 6f 75 6e 74 65 72 20 69 6e 20 69 6e 64  e-counter in ind
38630 69 72 65 63 74 0a 20 20 20 20 20 20 2a 2a 20 6d  irect.      ** m
38640 6f 64 65 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20  ode. .      **. 
38650 20 20 20 20 20 2a 2a 20 4f 74 68 65 72 77 69 73       ** Otherwis
38660 65 2c 20 69 66 20 74 68 65 20 6f 70 74 69 6d 69  e, if the optimi
38670 7a 61 74 69 6f 6e 20 69 73 20 62 6f 74 68 20 65  zation is both e
38680 6e 61 62 6c 65 64 20 61 6e 64 20 61 70 70 6c 69  nabled and appli
38690 63 61 62 6c 65 2c 0a 20 20 20 20 20 20 2a 2a 20  cable,.      ** 
386a0 74 68 65 6e 20 63 61 6c 6c 20 70 61 67 65 72 5f  then call pager_
386b0 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74  incr_changecount
386c0 65