/ Hex Artifact Content
Login

Artifact d83d2ea6d2025554e079f891854b133924305e19:


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 6c 6f 67 2e 68 22 0a 0a 2f 2a 0a 2a 2a 2a 2a  "log.h"../*.****
0380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0390: 20 4e 4f 54 45 53 20 4f 4e 20 54 48 45 20 44 45   NOTES ON THE DE
03a0: 53 49 47 4e 20 4f 46 20 54 48 45 20 50 41 47 45  SIGN OF THE PAGE
03b0: 52 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  R **************
03c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
03d0: 20 57 69 74 68 69 6e 20 74 68 69 73 20 63 6f 6d   Within this com
03e0: 6d 65 6e 74 20 62 6c 6f 63 6b 2c 20 61 20 70 61  ment block, a pa
03f0: 67 65 20 69 73 20 64 65 65 6d 65 64 20 74 6f 20  ge is deemed to 
0400: 68 61 76 65 20 62 65 65 6e 20 73 79 6e 63 65 64  have been synced
0410: 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  .** automaticall
0420: 79 20 61 73 20 73 6f 6f 6e 20 61 73 20 69 74 20  y as soon as it 
0430: 69 73 20 77 72 69 74 74 65 6e 20 77 68 65 6e 20  is written when 
0440: 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f  PRAGMA synchrono
0450: 75 73 3d 4f 46 46 2e 0a 2a 2a 20 4f 74 68 65 72  us=OFF..** Other
0460: 77 69 73 65 2c 20 74 68 65 20 70 61 67 65 20 69  wise, the page i
0470: 73 20 6e 6f 74 20 73 79 6e 63 65 64 20 75 6e 74  s not synced unt
0480: 69 6c 20 74 68 65 20 78 53 79 6e 63 20 6d 65 74  il the xSync met
0490: 68 6f 64 20 6f 66 20 74 68 65 20 56 46 53 0a 2a  hod of the VFS.*
04a0: 2a 20 69 73 20 63 61 6c 6c 65 64 20 73 75 63 63  * is called succ
04b0: 65 73 73 66 75 6c 6c 79 20 6f 6e 20 74 68 65 20  essfully on the 
04c0: 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  file containing 
04d0: 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  the page..**.** 
04e0: 44 65 66 69 6e 69 74 69 6f 6e 3a 20 20 41 20 70  Definition:  A p
04f0: 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  age of the datab
0500: 61 73 65 20 66 69 6c 65 20 69 73 20 73 61 69 64  ase file is said
0510: 20 74 6f 20 62 65 20 22 6f 76 65 72 77 72 69 74   to be "overwrit
0520: 65 61 62 6c 65 22 20 69 66 0a 2a 2a 20 6f 6e 65  eable" if.** one
0530: 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20   or more of the 
0540: 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72  following are tr
0550: 75 65 20 61 62 6f 75 74 20 74 68 65 20 70 61 67  ue about the pag
0560: 65 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 28 61  e:.** .**     (a
0570: 29 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20  )  The original 
0580: 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70  content of the p
0590: 61 67 65 20 61 73 20 69 74 20 77 61 73 20 61 74  age as it was at
05a0: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
05b0: 66 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 74 68  f.**          th
05c0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  e transaction ha
05d0: 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 69  s been written i
05e0: 6e 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  nto the rollback
05f0: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 0a 2a 2a 20   journal and.** 
0600: 20 20 20 20 20 20 20 20 20 73 79 6e 63 65 64 2e           synced.
0610: 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 28 62 29 20  .** .**     (b) 
0620: 20 54 68 65 20 70 61 67 65 20 77 61 73 20 61 20   The page was a 
0630: 66 72 65 65 6c 69 73 74 20 6c 65 61 66 20 70 61  freelist leaf pa
0640: 67 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20  ge at the start 
0650: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
0660: 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 28  on..** .**     (
0670: 63 29 20 20 54 68 65 20 70 61 67 65 20 6e 75 6d  c)  The page num
0680: 62 65 72 20 69 73 20 67 72 65 61 74 65 72 20 74  ber is greater t
0690: 68 61 6e 20 74 68 65 20 6c 61 72 67 65 73 74 20  han the largest 
06a0: 70 61 67 65 20 74 68 61 74 20 65 78 69 73 74 65  page that existe
06b0: 64 20 69 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20  d in.**         
06c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
06d0: 6c 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20  le at the start 
06e0: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
06f0: 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 28 31 29 20 41  on..** .** (1) A
0700: 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
0710: 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6e 65  abase file is ne
0720: 76 65 72 20 6f 76 65 72 77 72 69 74 74 65 6e 20  ver overwritten 
0730: 75 6e 6c 65 73 73 20 6f 6e 65 20 6f 66 20 74 68  unless one of th
0740: 65 0a 2a 2a 20 20 20 20 20 66 6f 6c 6c 6f 77 69  e.**     followi
0750: 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 20  ng are true:.** 
0760: 0a 2a 2a 20 20 20 20 20 28 61 29 20 54 68 65 20  .**     (a) The 
0770: 70 61 67 65 20 61 6e 64 20 61 6c 6c 20 6f 74 68  page and all oth
0780: 65 72 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20  er pages on the 
0790: 73 61 6d 65 20 73 65 63 74 6f 72 20 61 72 65 20  same sector are 
07a0: 6f 76 65 72 77 72 69 74 65 61 62 6c 65 2e 0a 2a  overwriteable..*
07b0: 2a 20 0a 2a 2a 20 20 20 20 20 28 62 29 20 54 68  * .**     (b) Th
07c0: 65 20 61 74 6f 6d 69 63 20 70 61 67 65 20 77 72  e atomic page wr
07d0: 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ite optimization
07e0: 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 61 6e 64   is enabled, and
07f0: 20 74 68 65 20 65 6e 74 69 72 65 0a 2a 2a 20 20   the entire.**  
0800: 20 20 20 20 20 20 20 74 72 61 6e 73 61 63 74 69         transacti
0810: 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68  on other than th
0820: 65 20 75 70 64 61 74 65 20 6f 66 20 74 68 65 20  e update of the 
0830: 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 65 71 75  transaction sequ
0840: 65 6e 63 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  ence.**         
0850: 6e 75 6d 62 65 72 20 63 6f 6e 73 69 73 74 73 20  number consists 
0860: 6f 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  of a single page
0870: 20 63 68 61 6e 67 65 2e 0a 2a 2a 20 0a 2a 2a 20   change..** .** 
0880: 28 32 29 20 54 68 65 20 63 6f 6e 74 65 6e 74 20  (2) The content 
0890: 6f 66 20 61 20 70 61 67 65 20 77 72 69 74 74 65  of a page writte
08a0: 6e 20 69 6e 74 6f 20 74 68 65 20 72 6f 6c 6c 62  n into the rollb
08b0: 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 65 78 61 63  ack journal exac
08c0: 74 6c 79 20 6d 61 74 63 68 65 73 0a 2a 2a 20 20  tly matches.**  
08d0: 20 20 20 62 6f 74 68 20 74 68 65 20 63 6f 6e 74     both the cont
08e0: 65 6e 74 20 69 6e 20 74 68 65 20 64 61 74 61 62  ent in the datab
08f0: 61 73 65 20 77 68 65 6e 20 74 68 65 20 72 6f 6c  ase when the rol
0900: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 77 61  lback journal wa
0910: 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 20 20 20  s written.**    
0920: 20 61 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e 74   and the content
0930: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
0940: 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
0950: 67 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  g of the current
0960: 0a 2a 2a 20 20 20 20 20 74 72 61 6e 73 61 63 74  .**     transact
0970: 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 28 33 29 20  ion..** .** (3) 
0980: 57 72 69 74 65 73 20 74 6f 20 74 68 65 20 64 61  Writes to the da
0990: 74 61 62 61 73 65 20 66 69 6c 65 20 61 72 65 20  tabase file are 
09a0: 61 6e 20 69 6e 74 65 67 65 72 20 6d 75 6c 74 69  an integer multi
09b0: 70 6c 65 20 6f 66 20 74 68 65 20 70 61 67 65 20  ple of the page 
09c0: 73 69 7a 65 0a 2a 2a 20 20 20 20 20 69 6e 20 6c  size.**     in l
09d0: 65 6e 67 74 68 20 61 6e 64 20 61 72 65 20 61 6c  ength and are al
09e0: 69 67 6e 65 64 20 74 6f 20 61 20 70 61 67 65 20  igned to a page 
09f0: 62 6f 75 6e 64 61 72 79 2e 0a 2a 2a 20 0a 2a 2a  boundary..** .**
0a00: 20 28 34 29 20 52 65 61 64 73 20 66 72 6f 6d 20   (4) Reads from 
0a10: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
0a20: 65 20 61 72 65 20 65 69 74 68 65 72 20 61 6c 69  e are either ali
0a30: 67 6e 65 64 20 6f 6e 20 61 20 70 61 67 65 20 62  gned on a page b
0a40: 6f 75 6e 64 61 72 79 20 61 6e 64 0a 2a 2a 20 20  oundary and.**  
0a50: 20 20 20 61 6e 20 69 6e 74 65 67 65 72 20 6d 75     an integer mu
0a60: 6c 74 69 70 6c 65 20 6f 66 20 74 68 65 20 70 61  ltiple of the pa
0a70: 67 65 20 73 69 7a 65 20 69 6e 20 6c 65 6e 67 74  ge size in lengt
0a80: 68 20 6f 72 20 61 72 65 20 74 61 6b 65 6e 20 66  h or are taken f
0a90: 72 6f 6d 20 74 68 65 0a 2a 2a 20 20 20 20 20 66  rom the.**     f
0aa0: 69 72 73 74 20 31 30 30 20 62 79 74 65 73 20 6f  irst 100 bytes o
0ab0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
0ac0: 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 28 35 29 20  ile..** .** (5) 
0ad0: 41 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 74 68  All writes to th
0ae0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
0af0: 61 72 65 20 73 79 6e 63 65 64 20 70 72 69 6f 72  are synced prior
0b00: 20 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   to the rollback
0b10: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
0b20: 62 65 69 6e 67 20 64 65 6c 65 74 65 64 2c 20 74  being deleted, t
0b30: 72 75 6e 63 61 74 65 64 2c 20 6f 72 20 7a 65 72  runcated, or zer
0b40: 6f 65 64 2e 0a 2a 2a 20 0a 2a 2a 20 28 36 29 20  oed..** .** (6) 
0b50: 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  If a master jour
0b60: 6e 61 6c 20 66 69 6c 65 20 69 73 20 75 73 65 64  nal file is used
0b70: 2c 20 74 68 65 6e 20 61 6c 6c 20 77 72 69 74 65  , then all write
0b80: 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
0b90: 65 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 61 72  e file.**     ar
0ba0: 65 20 73 79 6e 63 65 64 20 70 72 69 6f 72 20 74  e synced prior t
0bb0: 6f 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  o the master jou
0bc0: 72 6e 61 6c 20 62 65 69 6e 67 20 64 65 6c 65 74  rnal being delet
0bd0: 65 64 2e 0a 2a 2a 20 0a 2a 2a 20 44 65 66 69 6e  ed..** .** Defin
0be0: 69 74 69 6f 6e 3a 20 54 77 6f 20 64 61 74 61 62  ition: Two datab
0bf0: 61 73 65 73 20 28 6f 72 20 74 68 65 20 73 61 6d  ases (or the sam
0c00: 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74 77  e database at tw
0c10: 6f 20 70 6f 69 6e 74 73 20 69 74 20 74 69 6d 65  o points it time
0c20: 29 0a 2a 2a 20 61 72 65 20 73 61 69 64 20 74 6f  ).** are said to
0c30: 20 62 65 20 22 6c 6f 67 69 63 61 6c 6c 79 20 65   be "logically e
0c40: 71 75 69 76 61 6c 65 6e 74 22 20 69 66 20 74 68  quivalent" if th
0c50: 65 79 20 67 69 76 65 20 74 68 65 20 73 61 6d 65  ey give the same
0c60: 20 61 6e 73 77 65 72 20 74 6f 0a 2a 2a 20 61 6c   answer to.** al
0c70: 6c 20 71 75 65 72 69 65 73 2e 20 20 4e 6f 74 65  l queries.  Note
0c80: 20 69 6e 20 70 61 72 74 69 63 75 6c 61 72 20 74   in particular t
0c90: 68 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  he the content o
0ca0: 66 20 66 72 65 65 6c 69 73 74 20 6c 65 61 66 0a  f freelist leaf.
0cb0: 2a 2a 20 70 61 67 65 73 20 63 61 6e 20 62 65 20  ** pages can be 
0cc0: 63 68 61 6e 67 65 64 20 61 72 62 69 74 61 72 69  changed arbitari
0cd0: 6c 79 20 77 69 74 68 6f 75 74 20 65 66 66 65 63  ly without effec
0ce0: 74 69 6e 67 20 74 68 65 20 6c 6f 67 69 63 61 6c  ting the logical
0cf0: 20 65 71 75 69 76 61 6c 65 6e 63 65 0a 2a 2a 20   equivalence.** 
0d00: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
0d10: 0a 2a 2a 20 0a 2a 2a 20 28 37 29 20 41 74 20 61  .** .** (7) At a
0d20: 6e 79 20 74 69 6d 65 2c 20 69 66 20 61 6e 79 20  ny time, if any 
0d30: 73 75 62 73 65 74 2c 20 69 6e 63 6c 75 64 69 6e  subset, includin
0d40: 67 20 74 68 65 20 65 6d 70 74 79 20 73 65 74 20  g the empty set 
0d50: 61 6e 64 20 74 68 65 20 74 6f 74 61 6c 20 73 65  and the total se
0d60: 74 2c 0a 2a 2a 20 20 20 20 20 6f 66 20 74 68 65  t,.**     of the
0d70: 20 75 6e 73 79 6e 63 65 64 20 63 68 61 6e 67 65   unsynced change
0d80: 73 20 74 6f 20 61 20 72 6f 6c 6c 62 61 63 6b 20  s to a rollback 
0d90: 6a 6f 75 72 6e 61 6c 20 61 72 65 20 72 65 6d 6f  journal are remo
0da0: 76 65 64 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20  ved and the .** 
0db0: 20 20 20 20 6a 6f 75 72 6e 61 6c 20 69 73 20 72      journal is r
0dc0: 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20  olled back, the 
0dd0: 72 65 73 75 6c 74 69 6e 67 20 64 61 74 61 62 61  resulting databa
0de0: 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20  se file will be 
0df0: 6c 6f 67 69 63 61 6c 0a 2a 2a 20 20 20 20 20 65  logical.**     e
0e00: 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 74 68 65  quivalent to the
0e10: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
0e20: 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
0e30: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
0e40: 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 28 38 29 20 57  on..** .** (8) W
0e50: 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f  hen a transactio
0e60: 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
0e70: 2c 20 74 68 65 20 78 54 72 75 6e 63 61 74 65 20  , the xTruncate 
0e80: 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20 56 46  method of the VF
0e90: 53 0a 2a 2a 20 20 20 20 20 69 73 20 63 61 6c 6c  S.**     is call
0ea0: 65 64 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  ed to restore th
0eb0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
0ec0: 74 6f 20 74 68 65 20 73 61 6d 65 20 73 69 7a 65  to the same size
0ed0: 20 69 74 20 77 61 73 20 61 74 0a 2a 2a 20 20 20   it was at.**   
0ee0: 20 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20    the beginning 
0ef0: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
0f00: 6f 6e 2e 20 20 28 49 6e 20 73 6f 6d 65 20 56 46  on.  (In some VF
0f10: 53 65 73 2c 20 74 68 65 20 78 54 72 75 6e 63 61  Ses, the xTrunca
0f20: 74 65 0a 2a 2a 20 20 20 20 20 6d 65 74 68 6f 64  te.**     method
0f30: 20 69 73 20 61 20 6e 6f 2d 6f 70 2c 20 62 75 74   is a no-op, but
0f40: 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 63   that does not c
0f50: 68 61 6e 67 65 20 74 68 65 20 66 61 63 74 20 74  hange the fact t
0f60: 68 65 20 53 51 4c 69 74 65 20 77 69 6c 6c 0a 2a  he SQLite will.*
0f70: 2a 20 20 20 20 20 69 6e 76 6f 6b 65 20 69 74 2e  *     invoke it.
0f80: 29 0a 2a 2a 20 0a 2a 2a 20 28 39 29 20 57 68 65  ).** .** (9) Whe
0f90: 6e 65 76 65 72 20 74 68 65 20 64 61 74 61 62 61  never the databa
0fa0: 73 65 20 66 69 6c 65 20 69 73 20 6d 6f 64 69 66  se file is modif
0fb0: 69 65 64 2c 20 61 74 20 6c 65 61 73 74 20 6f 6e  ied, at least on
0fc0: 65 20 62 69 74 20 69 6e 20 74 68 65 20 72 61 6e  e bit in the ran
0fd0: 67 65 0a 2a 2a 20 20 20 20 20 6f 66 20 62 79 74  ge.**     of byt
0fe0: 65 73 20 66 72 6f 6d 20 32 34 20 74 68 72 6f 75  es from 24 throu
0ff0: 67 68 20 33 39 20 69 6e 63 6c 75 73 69 76 65 20  gh 39 inclusive 
1000: 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 20  will be changed 
1010: 70 72 69 6f 72 20 74 6f 20 72 65 6c 65 61 73 69  prior to releasi
1020: 6e 67 0a 2a 2a 20 20 20 20 20 74 68 65 20 45 58  ng.**     the EX
1030: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 0a 2a 2a  CLUSIVE lock..**
1040: 0a 2a 2a 20 28 31 30 29 20 54 68 65 20 70 61 74  .** (10) The pat
1050: 74 65 72 6e 20 6f 66 20 62 69 74 73 20 69 6e 20  tern of bits in 
1060: 62 79 74 65 73 20 32 34 20 74 68 72 6f 75 67 68  bytes 24 through
1070: 20 33 39 20 73 68 61 6c 6c 20 6e 6f 74 20 72 65   39 shall not re
1080: 70 65 61 74 20 69 6e 20 6c 65 73 73 0a 2a 2a 20  peat in less.** 
1090: 20 20 20 20 20 74 68 61 6e 20 6f 6e 65 20 62 69       than one bi
10a0: 6c 6c 69 6f 6e 20 74 72 61 6e 73 61 63 74 69 6f  llion transactio
10b0: 6e 73 2e 0a 2a 2a 0a 2a 2a 20 28 31 31 29 20 41  ns..**.** (11) A
10c0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
10d0: 73 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 61 74  s well-formed at
10e0: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 61   the beginning a
10f0: 6e 64 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75  nd at the conclu
1100: 73 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 6f 66 20  sion.**      of 
1110: 65 76 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f  every transactio
1120: 6e 2e 0a 2a 2a 0a 2a 2a 20 28 31 32 29 20 41 6e  n..**.** (12) An
1130: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
1140: 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  is held on the d
1150: 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68 65  atabase file whe
1160: 6e 20 77 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20  n writing to.** 
1170: 20 20 20 20 20 74 68 65 20 64 61 74 61 62 61 73       the databas
1180: 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 28 31  e file..**.** (1
1190: 33 29 20 41 20 53 48 41 52 45 44 20 6c 6f 63 6b  3) A SHARED lock
11a0: 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20   is held on the 
11b0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68  database file wh
11c0: 69 6c 65 20 72 65 61 64 69 6e 67 20 61 6e 79 0a  ile reading any.
11d0: 2a 2a 20 20 20 20 20 20 63 6f 6e 74 65 6e 74 20  **      content 
11e0: 6f 75 74 20 6f 66 20 74 68 65 20 64 61 74 61 62  out of the datab
11f0: 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 0a 2f 2a  ase file..*/../*
1200: 0a 2a 2a 20 4d 61 63 72 6f 73 20 66 6f 72 20 74  .** Macros for t
1210: 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20  roubleshooting. 
1220: 20 4e 6f 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64   Normally turned
1230: 20 6f 66 66 0a 2a 2f 0a 23 69 66 20 30 0a 69 6e   off.*/.#if 0.in
1240: 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  t sqlite3PagerTr
1250: 61 63 65 3d 31 3b 20 20 2f 2a 20 54 72 75 65 20  ace=1;  /* True 
1260: 74 6f 20 65 6e 61 62 6c 65 20 74 72 61 63 69 6e  to enable tracin
1270: 67 20 2a 2f 0a 23 64 65 66 69 6e 65 20 73 71 6c  g */.#define sql
1280: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 20  ite3DebugPrintf 
1290: 70 72 69 6e 74 66 0a 23 64 65 66 69 6e 65 20 50  printf.#define P
12a0: 41 47 45 52 54 52 41 43 45 28 58 29 20 20 20 20  AGERTRACE(X)    
12b0: 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65   if( sqlite3Page
12c0: 72 54 72 61 63 65 20 29 7b 20 73 71 6c 69 74 65  rTrace ){ sqlite
12d0: 33 44 65 62 75 67 50 72 69 6e 74 66 20 58 3b 20  3DebugPrintf X; 
12e0: 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  }.#else.#define 
12f0: 50 41 47 45 52 54 52 41 43 45 28 58 29 0a 23 65  PAGERTRACE(X).#e
1300: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
1310: 66 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61  following two ma
1320: 63 72 6f 73 20 61 72 65 20 75 73 65 64 20 77 69  cros are used wi
1330: 74 68 69 6e 20 74 68 65 20 50 41 47 45 52 54 52  thin the PAGERTR
1340: 41 43 45 28 29 20 6d 61 63 72 6f 73 20 61 62 6f  ACE() macros abo
1350: 76 65 0a 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f  ve.** to print o
1360: 75 74 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74  ut file-descript
1370: 6f 72 73 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45  ors. .**.** PAGE
1380: 52 49 44 28 29 20 74 61 6b 65 73 20 61 20 70 6f  RID() takes a po
1390: 69 6e 74 65 72 20 74 6f 20 61 20 50 61 67 65 72  inter to a Pager
13a0: 20 73 74 72 75 63 74 20 61 73 20 69 74 73 20 61   struct as its a
13b0: 72 67 75 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20  rgument. The.** 
13c0: 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65 2d  associated file-
13d0: 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 72 65  descriptor is re
13e0: 74 75 72 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44  turned. FILEHAND
13f0: 4c 45 49 44 28 29 20 74 61 6b 65 73 20 61 6e 20  LEID() takes an 
1400: 73 71 6c 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20  sqlite3_file.** 
1410: 73 74 72 75 63 74 20 61 73 20 69 74 73 20 61 72  struct as its ar
1420: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69  gument..*/.#defi
1430: 6e 65 20 50 41 47 45 52 49 44 28 70 29 20 28 28  ne PAGERID(p) ((
1440: 69 6e 74 29 28 70 2d 3e 66 64 29 29 0a 23 64 65  int)(p->fd)).#de
1450: 66 69 6e 65 20 46 49 4c 45 48 41 4e 44 4c 45 49  fine FILEHANDLEI
1460: 44 28 66 64 29 20 28 28 69 6e 74 29 66 64 29 0a  D(fd) ((int)fd).
1470: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  ./*.** The page 
1480: 63 61 63 68 65 20 61 73 20 61 20 77 68 6f 6c 65  cache as a whole
1490: 20 69 73 20 61 6c 77 61 79 73 20 69 6e 20 6f 6e   is always in on
14a0: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
14b0: 6e 67 0a 2a 2a 20 73 74 61 74 65 73 3a 0a 2a 2a  ng.** states:.**
14c0: 0a 2a 2a 20 20 20 50 41 47 45 52 5f 55 4e 4c 4f  .**   PAGER_UNLO
14d0: 43 4b 20 20 20 20 20 20 20 20 54 68 65 20 70 61  CK        The pa
14e0: 67 65 20 63 61 63 68 65 20 69 73 20 6e 6f 74 20  ge cache is not 
14f0: 63 75 72 72 65 6e 74 6c 79 20 72 65 61 64 69 6e  currently readin
1500: 67 20 6f 72 20 0a 2a 2a 20 20 20 20 20 20 20 20  g or .**        
1510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
1520: 72 69 74 69 6e 67 20 74 68 65 20 64 61 74 61 62  riting the datab
1530: 61 73 65 20 66 69 6c 65 2e 20 20 54 68 65 72 65  ase file.  There
1540: 20 69 73 20 6e 6f 0a 2a 2a 20 20 20 20 20 20 20   is no.**       
1550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1560: 64 61 74 61 20 68 65 6c 64 20 69 6e 20 6d 65 6d  data held in mem
1570: 6f 72 79 2e 20 20 54 68 69 73 20 69 73 20 74 68  ory.  This is th
1580: 65 20 69 6e 69 74 69 61 6c 0a 2a 2a 20 20 20 20  e initial.**    
1590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a0: 20 20 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20     state..**.** 
15b0: 20 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 20    PAGER_SHARED  
15c0: 20 20 20 20 20 20 54 68 65 20 70 61 67 65 20 63        The page c
15d0: 61 63 68 65 20 69 73 20 72 65 61 64 69 6e 67 20  ache is reading 
15e0: 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
15f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1600: 20 20 20 20 20 20 20 57 72 69 74 69 6e 67 20 69         Writing i
1610: 73 20 6e 6f 74 20 70 65 72 6d 69 74 74 65 64 2e  s not permitted.
1620: 20 20 54 68 65 72 65 20 63 61 6e 20 62 65 0a 2a    There can be.*
1630: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1640: 20 20 20 20 20 20 20 20 6d 75 6c 74 69 70 6c 65          multiple
1650: 20 72 65 61 64 65 72 73 20 61 63 63 65 73 73 69   readers accessi
1660: 6e 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  ng the same data
1670: 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  base.**         
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69                fi
1690: 6c 65 20 61 74 20 74 68 65 20 73 61 6d 65 20 74  le at the same t
16a0: 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47  ime..**.**   PAG
16b0: 45 52 5f 52 45 53 45 52 56 45 44 20 20 20 20 20  ER_RESERVED     
16c0: 20 54 68 69 73 20 70 72 6f 63 65 73 73 20 68 61   This process ha
16d0: 73 20 72 65 73 65 72 76 65 64 20 74 68 65 20 64  s reserved the d
16e0: 61 74 61 62 61 73 65 20 66 6f 72 20 77 72 69 74  atabase for writ
16f0: 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ing.**          
1700: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 75 74               but
1710: 20 68 61 73 20 6e 6f 74 20 79 65 74 20 6d 61 64   has not yet mad
1720: 65 20 61 6e 79 20 63 68 61 6e 67 65 73 2e 20 20  e any changes.  
1730: 4f 6e 6c 79 20 6f 6e 65 20 70 72 6f 63 65 73 73  Only one process
1740: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1750: 20 20 20 20 20 20 20 20 20 20 61 74 20 61 20 74            at a t
1760: 69 6d 65 20 63 61 6e 20 72 65 73 65 72 76 65 20  ime can reserve 
1770: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
1780: 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20  he original.**  
1790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a0: 20 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69       database fi
17b0: 6c 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  le has not been 
17c0: 6d 6f 64 69 66 69 65 64 20 73 6f 20 6f 74 68 65  modified so othe
17d0: 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  r.**            
17e0: 20 20 20 20 20 20 20 20 20 20 20 70 72 6f 63 65             proce
17f0: 73 73 65 73 20 6d 61 79 20 73 74 69 6c 6c 20 62  sses may still b
1800: 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 6f 6e  e reading the on
1810: 2d 64 69 73 6b 0a 2a 2a 20 20 20 20 20 20 20 20  -disk.**        
1820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
1830: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
1840: 0a 2a 2a 20 20 20 50 41 47 45 52 5f 45 58 43 4c  .**   PAGER_EXCL
1850: 55 53 49 56 45 20 20 20 20 20 54 68 65 20 70 61  USIVE     The pa
1860: 67 65 20 63 61 63 68 65 20 69 73 20 77 72 69 74  ge cache is writ
1870: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
1880: 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ..**            
1890: 20 20 20 20 20 20 20 20 20 20 20 41 63 63 65 73             Acces
18a0: 73 20 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20  s is exclusive. 
18b0: 20 4e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73   No other proces
18c0: 73 65 73 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20  ses or.**       
18d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e0: 74 68 72 65 61 64 73 20 63 61 6e 20 62 65 20 72  threads can be r
18f0: 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
1900: 67 20 77 68 69 6c 65 20 6f 6e 65 0a 2a 2a 20 20  g while one.**  
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1920: 20 20 20 20 20 70 72 6f 63 65 73 73 20 69 73 20       process is 
1930: 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20  writing..**.**  
1940: 20 50 41 47 45 52 5f 53 59 4e 43 45 44 20 20 20   PAGER_SYNCED   
1950: 20 20 20 20 20 54 68 65 20 70 61 67 65 72 20 6d       The pager m
1960: 6f 76 65 73 20 74 6f 20 74 68 69 73 20 73 74 61  oves to this sta
1970: 74 65 20 66 72 6f 6d 20 50 41 47 45 52 5f 45 58  te from PAGER_EX
1980: 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 20 20  CLUSIVE.**      
1990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a0: 20 61 66 74 65 72 20 61 6c 6c 20 64 69 72 74 79   after all dirty
19b0: 20 70 61 67 65 73 20 68 61 76 65 20 62 65 65 6e   pages have been
19c0: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a   written to the.
19d0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
19e0: 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
19f0: 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66  e file and the f
1a00: 69 6c 65 20 68 61 73 20 62 65 65 6e 20 73 79 6e  ile has been syn
1a10: 63 65 64 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20  ced to.**       
1a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a30: 64 69 73 6b 2e 20 41 6c 6c 20 74 68 61 74 20 72  disk. All that r
1a40: 65 6d 61 69 6e 73 20 74 6f 20 64 6f 20 69 73 20  emains to do is 
1a50: 74 6f 20 72 65 6d 6f 76 65 20 6f 72 0a 2a 2a 20  to remove or.** 
1a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a70: 20 20 20 20 20 20 74 72 75 6e 63 61 74 65 20 74        truncate t
1a80: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1a90: 61 6e 64 20 74 68 65 20 74 72 61 6e 73 61 63 74  and the transact
1aa0: 69 6f 6e 20 0a 2a 2a 20 20 20 20 20 20 20 20 20  ion .**         
1ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 69                wi
1ac0: 6c 6c 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 2e  ll be committed.
1ad0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  .**.** The page 
1ae0: 63 61 63 68 65 20 63 6f 6d 65 73 20 75 70 20 69  cache comes up i
1af0: 6e 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20  n PAGER_UNLOCK. 
1b00: 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   The first time 
1b10: 61 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65  a.** sqlite3Page
1b20: 72 47 65 74 28 29 20 6f 63 63 75 72 73 2c 20 74  rGet() occurs, t
1b30: 68 65 20 73 74 61 74 65 20 74 72 61 6e 73 69 74  he state transit
1b40: 69 6f 6e 73 20 74 6f 20 50 41 47 45 52 5f 53 48  ions to PAGER_SH
1b50: 41 52 45 44 2e 0a 2a 2a 20 41 66 74 65 72 20 61  ARED..** After a
1b60: 6c 6c 20 70 61 67 65 73 20 68 61 76 65 20 62 65  ll pages have be
1b70: 65 6e 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e  en released usin
1b80: 67 20 73 71 6c 69 74 65 5f 70 61 67 65 5f 75 6e  g sqlite_page_un
1b90: 72 65 66 28 29 2c 0a 2a 2a 20 74 68 65 20 73 74  ref(),.** the st
1ba0: 61 74 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  ate transitions 
1bb0: 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 55 4e  back to PAGER_UN
1bc0: 4c 4f 43 4b 2e 20 20 54 68 65 20 66 69 72 73 74  LOCK.  The first
1bd0: 20 74 69 6d 65 0a 2a 2a 20 74 68 61 74 20 73 71   time.** that sq
1be0: 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1bf0: 29 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  ) is called, the
1c00: 20 73 74 61 74 65 20 74 72 61 6e 73 69 74 69 6f   state transitio
1c10: 6e 73 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 52  ns to.** PAGER_R
1c20: 45 53 45 52 56 45 44 2e 20 20 28 4e 6f 74 65 20  ESERVED.  (Note 
1c30: 74 68 61 74 20 73 71 6c 69 74 65 33 50 61 67 65  that sqlite3Page
1c40: 72 57 72 69 74 65 28 29 20 63 61 6e 20 6f 6e 6c  rWrite() can onl
1c50: 79 20 62 65 0a 2a 2a 20 63 61 6c 6c 65 64 20 6f  y be.** called o
1c60: 6e 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67  n an outstanding
1c70: 20 70 61 67 65 20 77 68 69 63 68 20 6d 65 61 6e   page which mean
1c80: 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  s that the pager
1c90: 20 6d 75 73 74 0a 2a 2a 20 62 65 20 69 6e 20 50   must.** be in P
1ca0: 41 47 45 52 5f 53 48 41 52 45 44 20 62 65 66 6f  AGER_SHARED befo
1cb0: 72 65 20 69 74 20 74 72 61 6e 73 69 74 69 6f 6e  re it transition
1cc0: 73 20 74 6f 20 50 41 47 45 52 5f 52 45 53 45 52  s to PAGER_RESER
1cd0: 56 45 44 2e 29 0a 2a 2a 20 50 41 47 45 52 5f 52  VED.).** PAGER_R
1ce0: 45 53 45 52 56 45 44 20 6d 65 61 6e 73 20 74 68  ESERVED means th
1cf0: 61 74 20 74 68 65 72 65 20 69 73 20 61 6e 20 6f  at there is an o
1d00: 70 65 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  pen rollback jou
1d10: 72 6e 61 6c 2e 0a 2a 2a 20 54 68 65 20 74 72 61  rnal..** The tra
1d20: 6e 73 69 74 69 6f 6e 20 74 6f 20 50 41 47 45 52  nsition to PAGER
1d30: 5f 45 58 43 4c 55 53 49 56 45 20 6f 63 63 75 72  _EXCLUSIVE occur
1d40: 73 20 62 65 66 6f 72 65 20 61 6e 79 20 63 68 61  s before any cha
1d50: 6e 67 65 73 0a 2a 2a 20 61 72 65 20 6d 61 64 65  nges.** are made
1d60: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1d70: 20 66 69 6c 65 2c 20 74 68 6f 75 67 68 20 77 72   file, though wr
1d80: 69 74 65 73 20 74 6f 20 74 68 65 20 72 6f 6c 6c  ites to the roll
1d90: 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  back.** journal 
1da0: 6f 63 63 75 72 73 20 77 69 74 68 20 6a 75 73 74  occurs with just
1db0: 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 2e   PAGER_RESERVED.
1dc0: 20 20 41 66 74 65 72 20 61 6e 20 73 71 6c 69 74    After an sqlit
1dd0: 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
1de0: 29 0a 2a 2a 20 6f 72 20 73 71 6c 69 74 65 33 50  ).** or sqlite3P
1df0: 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54  agerCommitPhaseT
1e00: 77 6f 28 29 2c 20 74 68 65 20 73 74 61 74 65 20  wo(), the state 
1e10: 63 61 6e 20 67 6f 20 62 61 63 6b 20 74 6f 20 50  can go back to P
1e20: 41 47 45 52 5f 53 48 41 52 45 44 2c 0a 2a 2a 20  AGER_SHARED,.** 
1e30: 6f 72 20 69 74 20 63 61 6e 20 73 74 61 79 20 61  or it can stay a
1e40: 74 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  t PAGER_EXCLUSIV
1e50: 45 20 69 66 20 77 65 20 61 72 65 20 69 6e 20 65  E if we are in e
1e60: 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73 20  xclusive access 
1e70: 6d 6f 64 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  mode..*/.#define
1e80: 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 20 20   PAGER_UNLOCK   
1e90: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 50 41 47     0.#define PAG
1ea0: 45 52 5f 53 48 41 52 45 44 20 20 20 20 20 20 31  ER_SHARED      1
1eb0: 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 53 48     /* same as SH
1ec0: 41 52 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65  ARED_LOCK */.#de
1ed0: 66 69 6e 65 20 50 41 47 45 52 5f 52 45 53 45 52  fine PAGER_RESER
1ee0: 56 45 44 20 20 20 20 32 20 20 20 2f 2a 20 73 61  VED    2   /* sa
1ef0: 6d 65 20 61 73 20 52 45 53 45 52 56 45 44 5f 4c  me as RESERVED_L
1f00: 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  OCK */.#define P
1f10: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 20  AGER_EXCLUSIVE  
1f20: 20 34 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20   4   /* same as 
1f30: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 2a  EXCLUSIVE_LOCK *
1f40: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
1f50: 53 59 4e 43 45 44 20 20 20 20 20 20 35 0a 0a 2f  SYNCED      5../
1f60: 2a 0a 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73 65  *.** A macro use
1f70: 64 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74  d for invoking t
1f80: 68 65 20 63 6f 64 65 63 20 69 66 20 74 68 65 72  he codec if ther
1f90: 65 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64  e is one.*/.#ifd
1fa0: 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
1fb0: 44 45 43 0a 23 20 64 65 66 69 6e 65 20 43 4f 44  DEC.# define COD
1fc0: 45 43 31 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 5c  EC1(P,D,N,X,E) \
1fd0: 0a 20 20 20 20 69 66 28 20 50 2d 3e 78 43 6f 64  .    if( P->xCod
1fe0: 65 63 20 26 26 20 50 2d 3e 78 43 6f 64 65 63 28  ec && P->xCodec(
1ff0: 50 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29  P->pCodec,D,N,X)
2000: 3d 3d 30 20 29 7b 20 45 3b 20 7d 0a 23 20 64 65  ==0 ){ E; }.# de
2010: 66 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c  fine CODEC2(P,D,
2020: 4e 2c 58 2c 45 2c 4f 29 20 5c 0a 20 20 20 20 69  N,X,E,O) \.    i
2030: 66 28 20 50 2d 3e 78 43 6f 64 65 63 3d 3d 30 20  f( P->xCodec==0 
2040: 29 7b 20 4f 3d 28 63 68 61 72 2a 29 44 3b 20 7d  ){ O=(char*)D; }
2050: 65 6c 73 65 20 5c 0a 20 20 20 20 69 66 28 20 28  else \.    if( (
2060: 4f 3d 28 63 68 61 72 2a 29 28 50 2d 3e 78 43 6f  O=(char*)(P->xCo
2070: 64 65 63 28 50 2d 3e 70 43 6f 64 65 63 2c 44 2c  dec(P->pCodec,D,
2080: 4e 2c 58 29 29 29 3d 3d 30 20 29 7b 20 45 3b 20  N,X)))==0 ){ E; 
2090: 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
20a0: 20 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 2c   CODEC1(P,D,N,X,
20b0: 45 29 20 20 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f  E)   /* NO-OP */
20c0: 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32  .# define CODEC2
20d0: 28 50 2c 44 2c 4e 2c 58 2c 45 2c 4f 29 20 4f 3d  (P,D,N,X,E,O) O=
20e0: 28 63 68 61 72 2a 29 44 0a 23 65 6e 64 69 66 0a  (char*)D.#endif.
20f0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d  ./*.** The maxim
2100: 75 6d 20 61 6c 6c 6f 77 65 64 20 73 65 63 74 6f  um allowed secto
2110: 72 20 73 69 7a 65 2e 20 36 34 4b 69 42 2e 20 49  r size. 64KiB. I
2120: 66 20 74 68 65 20 78 53 65 63 74 6f 72 73 69 7a  f the xSectorsiz
2130: 65 28 29 20 6d 65 74 68 6f 64 20 0a 2a 2a 20 72  e() method .** r
2140: 65 74 75 72 6e 73 20 61 20 76 61 6c 75 65 20 6c  eturns a value l
2150: 61 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 2c  arger than this,
2160: 20 74 68 65 6e 20 4d 41 58 5f 53 45 43 54 4f 52   then MAX_SECTOR
2170: 5f 53 49 5a 45 20 69 73 20 75 73 65 64 20 69 6e  _SIZE is used in
2180: 73 74 65 61 64 2e 0a 2a 2a 20 54 68 69 73 20 63  stead..** This c
2190: 6f 75 6c 64 20 63 6f 6e 63 65 69 76 61 62 6c 79  ould conceivably
21a0: 20 63 61 75 73 65 20 63 6f 72 72 75 70 74 69 6f   cause corruptio
21b0: 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f  n following a po
21c0: 77 65 72 20 66 61 69 6c 75 72 65 20 6f 6e 0a 2a  wer failure on.*
21d0: 2a 20 73 75 63 68 20 61 20 73 79 73 74 65 6d 2e  * such a system.
21e0: 20 54 68 69 73 20 69 73 20 63 75 72 72 65 6e 74   This is current
21f0: 6c 79 20 61 6e 20 75 6e 64 6f 63 75 6d 65 6e 74  ly an undocument
2200: 65 64 20 6c 69 6d 69 74 2e 0a 2a 2f 0a 23 64 65  ed limit..*/.#de
2210: 66 69 6e 65 20 4d 41 58 5f 53 45 43 54 4f 52 5f  fine MAX_SECTOR_
2220: 53 49 5a 45 20 30 78 31 30 30 30 30 0a 0a 2f 2a  SIZE 0x10000../*
2230: 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20  .** An instance 
2240: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
2250: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61 6c   structure is al
2260: 6c 6f 63 61 74 65 64 20 66 6f 72 20 65 61 63 68  located for each
2270: 20 61 63 74 69 76 65 0a 2a 2a 20 73 61 76 65 70   active.** savep
2280: 6f 69 6e 74 20 61 6e 64 20 73 74 61 74 65 6d 65  oint and stateme
2290: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  nt transaction i
22a0: 6e 20 74 68 65 20 73 79 73 74 65 6d 2e 20 41 6c  n the system. Al
22b0: 6c 20 73 75 63 68 20 73 74 72 75 63 74 75 72 65  l such structure
22c0: 73 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 20  s.** are stored 
22d0: 69 6e 20 74 68 65 20 50 61 67 65 72 2e 61 53 61  in the Pager.aSa
22e0: 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 2c  vepoint[] array,
22f0: 20 77 68 69 63 68 20 69 73 20 61 6c 6c 6f 63 61   which is alloca
2300: 74 65 64 20 61 6e 64 0a 2a 2a 20 72 65 73 69 7a  ted and.** resiz
2310: 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ed using sqlite3
2320: 52 65 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a  Realloc()..**.**
2330: 20 57 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e   When a savepoin
2340: 74 20 69 73 20 63 72 65 61 74 65 64 2c 20 74 68  t is created, th
2350: 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e PagerSavepoint
2360: 2e 69 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c  .iHdrOffset fiel
2370: 64 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30  d is.** set to 0
2380: 2e 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 2d 68  . If a journal-h
2390: 65 61 64 65 72 20 69 73 20 77 72 69 74 74 65 6e  eader is written
23a0: 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 6a   into the main j
23b0: 6f 75 72 6e 61 6c 20 77 68 69 6c 65 0a 2a 2a 20  ournal while.** 
23c0: 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 69 73  the savepoint is
23d0: 20 61 63 74 69 76 65 2c 20 74 68 65 6e 20 69 48   active, then iH
23e0: 64 72 4f 66 66 73 65 74 20 69 73 20 73 65 74 20  drOffset is set 
23f0: 74 6f 20 74 68 65 20 62 79 74 65 20 6f 66 66 73  to the byte offs
2400: 65 74 20 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65  et .** immediate
2410: 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ly following the
2420: 20 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 20 72 65   last journal re
2430: 63 6f 72 64 20 77 72 69 74 74 65 6e 20 69 6e 74  cord written int
2440: 6f 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f  o the main.** jo
2450: 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 74 68 65  urnal before the
2460: 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 2e   journal-header.
2470: 20 54 68 69 73 20 69 73 20 72 65 71 75 69 72 65   This is require
2480: 64 20 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69  d during savepoi
2490: 6e 74 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 28  nt.** rollback (
24a0: 73 65 65 20 70 61 67 65 72 50 6c 61 79 62 61 63  see pagerPlaybac
24b0: 6b 53 61 76 65 70 6f 69 6e 74 28 29 29 2e 0a 2a  kSavepoint())..*
24c0: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
24d0: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
24e0: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 3b 0a  PagerSavepoint;.
24f0: 73 74 72 75 63 74 20 50 61 67 65 72 53 61 76 65  struct PagerSave
2500: 70 6f 69 6e 74 20 7b 0a 20 20 69 36 34 20 69 4f  point {.  i64 iO
2510: 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20  ffset;          
2520: 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 69         /* Starti
2530: 6e 67 20 6f 66 66 73 65 74 20 69 6e 20 6d 61 69  ng offset in mai
2540: 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69  n journal */.  i
2550: 36 34 20 69 48 64 72 4f 66 66 73 65 74 3b 20 20  64 iHdrOffset;  
2560: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
2570: 65 65 20 61 62 6f 76 65 20 2a 2f 0a 20 20 42 69  ee above */.  Bi
2580: 74 76 65 63 20 2a 70 49 6e 53 61 76 65 70 6f 69  tvec *pInSavepoi
2590: 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 65  nt;        /* Se
25a0: 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  t of pages in th
25b0: 69 73 20 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a  is savepoint */.
25c0: 20 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20    Pgno nOrig;   
25d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25e0: 2a 20 4f 72 69 67 69 6e 61 6c 20 6e 75 6d 62 65  * Original numbe
25f0: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 66 69  r of pages in fi
2600: 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 53 75  le */.  Pgno iSu
2610: 62 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  bRec;           
2620: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
2630: 20 66 69 72 73 74 20 72 65 63 6f 72 64 20 69 6e   first record in
2640: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   sub-journal */.
2650: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6f 70 65 6e  };../*.** A open
2660: 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20 61   page cache is a
2670: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
2680: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
2690: 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 65 72 72  cture..**.** err
26a0: 43 6f 64 65 0a 2a 2a 0a 2a 2a 20 20 20 50 61 67  Code.**.**   Pag
26b0: 65 72 2e 65 72 72 43 6f 64 65 20 6d 61 79 20 62  er.errCode may b
26c0: 65 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f  e set to SQLITE_
26d0: 49 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f  IOERR, SQLITE_CO
26e0: 52 52 55 50 54 2c 20 6f 72 0a 2a 2a 20 20 20 6f  RRUPT, or.**   o
26f0: 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2e 20 4f  r SQLITE_FULL. O
2700: 6e 63 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 66  nce one of the f
2710: 69 72 73 74 20 74 68 72 65 65 20 65 72 72 6f 72  irst three error
2720: 73 20 6f 63 63 75 72 73 2c 20 69 74 20 70 65 72  s occurs, it per
2730: 73 69 73 74 73 0a 2a 2a 20 20 20 61 6e 64 20 69  sists.**   and i
2740: 73 20 72 65 74 75 72 6e 65 64 20 61 73 20 74 68  s returned as th
2750: 65 20 72 65 73 75 6c 74 20 6f 66 20 65 76 65 72  e result of ever
2760: 79 20 6d 61 6a 6f 72 20 70 61 67 65 72 20 41 50  y major pager AP
2770: 49 20 63 61 6c 6c 2e 20 20 54 68 65 0a 2a 2a 20  I call.  The.** 
2780: 20 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 72 65    SQLITE_FULL re
2790: 74 75 72 6e 20 63 6f 64 65 20 69 73 20 73 6c 69  turn code is sli
27a0: 67 68 74 6c 79 20 64 69 66 66 65 72 65 6e 74 2e  ghtly different.
27b0: 20 49 74 20 70 65 72 73 69 73 74 73 20 6f 6e 6c   It persists onl
27c0: 79 20 75 6e 74 69 6c 20 74 68 65 0a 2a 2a 20 20  y until the.**  
27d0: 20 6e 65 78 74 20 73 75 63 63 65 73 73 66 75 6c   next successful
27e0: 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 70 65 72   rollback is per
27f0: 66 6f 72 6d 65 64 20 6f 6e 20 74 68 65 20 70 61  formed on the pa
2800: 67 65 72 20 63 61 63 68 65 2e 20 41 6c 73 6f 2c  ger cache. Also,
2810: 0a 2a 2a 20 20 20 53 51 4c 49 54 45 5f 46 55 4c  .**   SQLITE_FUL
2820: 4c 20 64 6f 65 73 20 6e 6f 74 20 61 66 66 65 63  L does not affec
2830: 74 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67  t the sqlite3Pag
2840: 65 72 47 65 74 28 29 20 61 6e 64 20 73 71 6c 69  erGet() and sqli
2850: 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29  te3PagerLookup()
2860: 0a 2a 2a 20 20 20 41 50 49 73 2c 20 74 68 65 79  .**   APIs, they
2870: 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 75 73   may still be us
2880: 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e  ed successfully.
2890: 0a 2a 2a 0a 2a 2a 20 64 62 53 69 7a 65 56 61 6c  .**.** dbSizeVal
28a0: 69 64 2c 20 64 62 53 69 7a 65 2c 20 64 62 4f 72  id, dbSize, dbOr
28b0: 69 67 53 69 7a 65 2c 20 64 62 46 69 6c 65 53 69  igSize, dbFileSi
28c0: 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 4d 61 6e 61 67  ze.**.**   Manag
28d0: 69 6e 67 20 74 68 65 20 73 69 7a 65 20 6f 66 20  ing the size of 
28e0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
28f0: 65 20 69 6e 20 70 61 67 65 73 20 69 73 20 61 20  e in pages is a 
2900: 6c 69 74 74 6c 65 20 63 6f 6d 70 6c 69 63 61 74  little complicat
2910: 65 64 2e 0a 2a 2a 20 20 20 54 68 65 20 76 61 72  ed..**   The var
2920: 69 61 62 6c 65 20 50 61 67 65 72 2e 64 62 53 69  iable Pager.dbSi
2930: 7a 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ze contains the 
2940: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
2950: 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73  that the databas
2960: 65 0a 2a 2a 20 20 20 69 6d 61 67 65 20 63 75 72  e.**   image cur
2970: 72 65 6e 74 6c 79 20 63 6f 6e 74 61 69 6e 73 2e  rently contains.
2980: 20 41 73 20 74 68 65 20 64 61 74 61 62 61 73 65   As the database
2990: 20 69 6d 61 67 65 20 67 72 6f 77 73 20 6f 72 20   image grows or 
29a0: 73 68 72 69 6e 6b 73 20 74 68 69 73 0a 2a 2a 20  shrinks this.** 
29b0: 20 20 76 61 72 69 61 62 6c 65 20 69 73 20 75 70    variable is up
29c0: 64 61 74 65 64 2e 20 54 68 65 20 76 61 72 69 61  dated. The varia
29d0: 62 6c 65 20 50 61 67 65 72 2e 64 62 46 69 6c 65  ble Pager.dbFile
29e0: 53 69 7a 65 20 63 6f 6e 74 61 69 6e 73 20 74 68  Size contains th
29f0: 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 20 20 6f 66  e number.**   of
2a00: 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
2a10: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 69  tabase file. Thi
2a20: 73 20 6d 61 79 20 62 65 20 64 69 66 66 65 72 65  s may be differe
2a30: 6e 74 20 66 72 6f 6d 20 50 61 67 65 72 2e 64 62  nt from Pager.db
2a40: 53 69 7a 65 0a 2a 2a 20 20 20 69 66 20 73 6f 6d  Size.**   if som
2a50: 65 20 70 61 67 65 73 20 68 61 76 65 20 62 65 65  e pages have bee
2a60: 6e 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68  n appended to th
2a70: 65 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65  e database image
2a80: 20 62 75 74 20 6e 6f 74 20 79 65 74 20 77 72 69   but not yet wri
2a90: 74 74 65 6e 0a 2a 2a 20 20 20 6f 75 74 20 66 72  tten.**   out fr
2aa0: 6f 6d 20 74 68 65 20 63 61 63 68 65 20 74 6f 20  om the cache to 
2ab0: 74 68 65 20 61 63 74 75 61 6c 20 66 69 6c 65 20  the actual file 
2ac0: 6f 6e 20 64 69 73 6b 2e 20 4f 72 20 69 66 20 74  on disk. Or if t
2ad0: 68 65 20 69 6d 61 67 65 20 68 61 73 20 62 65 65  he image has bee
2ae0: 6e 0a 2a 2a 20 20 20 74 72 75 6e 63 61 74 65 64  n.**   truncated
2af0: 20 62 79 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74   by an increment
2b00: 61 6c 2d 76 61 63 75 75 6d 20 6f 70 65 72 61 74  al-vacuum operat
2b10: 69 6f 6e 2e 20 54 68 65 20 50 61 67 65 72 2e 64  ion. The Pager.d
2b20: 62 4f 72 69 67 53 69 7a 65 20 76 61 72 69 61 62  bOrigSize variab
2b30: 6c 65 0a 2a 2a 20 20 20 63 6f 6e 74 61 69 6e 73  le.**   contains
2b40: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
2b50: 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ages in the data
2b60: 62 61 73 65 20 69 6d 61 67 65 20 77 68 65 6e 20  base image when 
2b70: 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 20  the current.**  
2b80: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
2b90: 20 6f 70 65 6e 65 64 2e 20 54 68 65 20 63 6f 6e   opened. The con
2ba0: 74 65 6e 74 73 20 6f 66 20 61 6c 6c 20 74 68 72  tents of all thr
2bb0: 65 65 20 6f 66 20 74 68 65 73 65 20 76 61 72 69  ee of these vari
2bc0: 61 62 6c 65 73 20 69 73 0a 2a 2a 20 20 20 6f 6e  ables is.**   on
2bd0: 6c 79 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  ly guaranteed to
2be0: 20 62 65 20 63 6f 72 72 65 63 74 20 69 66 20 74   be correct if t
2bf0: 68 65 20 62 6f 6f 6c 65 61 6e 20 50 61 67 65 72  he boolean Pager
2c00: 2e 64 62 53 69 7a 65 56 61 6c 69 64 20 69 73 20  .dbSizeValid is 
2c10: 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 4f  true..**.**   TO
2c20: 44 4f 3a 20 55 6e 64 65 72 20 77 68 61 74 20 63  DO: Under what c
2c30: 6f 6e 64 69 74 69 6f 6e 73 20 69 73 20 64 62 53  onditions is dbS
2c40: 69 7a 65 56 61 6c 69 64 20 73 65 74 3f 20 43 6c  izeValid set? Cl
2c50: 65 61 72 65 64 3f 0a 2a 2a 0a 2a 2a 20 63 68 61  eared?.**.** cha
2c60: 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 0a 2a 2a 0a  ngeCountDone.**.
2c70: 2a 2a 20 20 20 54 68 69 73 20 62 6f 6f 6c 65 61  **   This boolea
2c80: 6e 20 76 61 72 69 61 62 6c 65 20 69 73 20 75 73  n variable is us
2c90: 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ed to make sure 
2ca0: 74 68 61 74 20 74 68 65 20 63 68 61 6e 67 65 2d  that the change-
2cb0: 63 6f 75 6e 74 65 72 20 0a 2a 2a 20 20 20 28 74  counter .**   (t
2cc0: 68 65 20 34 2d 62 79 74 65 20 68 65 61 64 65 72  he 4-byte header
2cd0: 20 66 69 65 6c 64 20 61 74 20 62 79 74 65 20 6f   field at byte o
2ce0: 66 66 73 65 74 20 32 34 20 6f 66 20 74 68 65 20  ffset 24 of the 
2cf0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 29 20 69  database file) i
2d00: 73 20 0a 2a 2a 20 20 20 6e 6f 74 20 75 70 64 61  s .**   not upda
2d10: 74 65 64 20 6d 6f 72 65 20 6f 66 74 65 6e 20 74  ted more often t
2d20: 68 61 6e 20 6e 65 63 65 73 73 61 72 79 2e 20 0a  han necessary. .
2d30: 2a 2a 0a 2a 2a 20 20 20 49 74 20 69 73 20 73 65  **.**   It is se
2d40: 74 20 74 6f 20 74 72 75 65 20 77 68 65 6e 20 74  t to true when t
2d50: 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
2d60: 72 20 66 69 65 6c 64 20 69 73 20 75 70 64 61 74  r field is updat
2d70: 65 64 2c 20 77 68 69 63 68 20 0a 2a 2a 20 20 20  ed, which .**   
2d80: 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20  can only happen 
2d90: 69 66 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  if an exclusive 
2da0: 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20  lock is held on 
2db0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2dc0: 65 2e 0a 2a 2a 20 20 20 49 74 20 69 73 20 63 6c  e..**   It is cl
2dd0: 65 61 72 65 64 20 28 73 65 74 20 74 6f 20 66 61  eared (set to fa
2de0: 6c 73 65 29 20 77 68 65 6e 65 76 65 72 20 61 6e  lse) whenever an
2df0: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
2e00: 69 73 20 0a 2a 2a 20 20 20 72 65 6c 69 6e 71 75  is .**   relinqu
2e10: 69 73 68 65 64 20 6f 6e 20 74 68 65 20 64 61 74  ished on the dat
2e20: 61 62 61 73 65 20 66 69 6c 65 2e 20 45 61 63 68  abase file. Each
2e30: 20 74 69 6d 65 20 61 20 74 72 61 6e 73 61 63 74   time a transact
2e40: 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64  ion is committed
2e50: 2c 0a 2a 2a 20 20 20 54 68 65 20 63 68 61 6e 67  ,.**   The chang
2e60: 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20  eCountDone flag 
2e70: 69 73 20 69 6e 73 70 65 63 74 65 64 2e 20 49 66  is inspected. If
2e80: 20 69 74 20 69 73 20 74 72 75 65 2c 20 74 68 65   it is true, the
2e90: 20 77 6f 72 6b 20 6f 66 0a 2a 2a 20 20 20 75 70   work of.**   up
2ea0: 64 61 74 69 6e 67 20 74 68 65 20 63 68 61 6e 67  dating the chang
2eb0: 65 2d 63 6f 75 6e 74 65 72 20 69 73 20 6f 6d 69  e-counter is omi
2ec0: 74 74 65 64 20 66 6f 72 20 74 68 65 20 63 75 72  tted for the cur
2ed0: 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
2ee0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20 6d  ..**.**   This m
2ef0: 65 63 68 61 6e 69 73 6d 20 6d 65 61 6e 73 20 74  echanism means t
2f00: 68 61 74 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67  hat when running
2f10: 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
2f20: 64 65 2c 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e  de, a connection
2f30: 20 0a 2a 2a 20 20 20 6e 65 65 64 20 6f 6e 6c 79   .**   need only
2f40: 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e   update the chan
2f50: 67 65 2d 63 6f 75 6e 74 65 72 20 6f 6e 63 65 2c  ge-counter once,
2f60: 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 74   for the first t
2f70: 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20  ransaction.**   
2f80: 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a  committed..**.**
2f90: 20 64 62 4d 6f 64 69 66 69 65 64 0a 2a 2a 0a 2a   dbModified.**.*
2fa0: 2a 20 20 20 54 68 65 20 64 62 4d 6f 64 69 66 69  *   The dbModifi
2fb0: 65 64 20 66 6c 61 67 20 69 73 20 73 65 74 20 77  ed flag is set w
2fc0: 68 65 6e 65 76 65 72 20 61 20 64 61 74 61 62 61  henever a databa
2fd0: 73 65 20 70 61 67 65 20 69 73 20 64 69 72 74 69  se page is dirti
2fe0: 65 64 2e 0a 2a 2a 20 20 20 49 74 20 69 73 20 63  ed..**   It is c
2ff0: 6c 65 61 72 65 64 20 61 74 20 74 68 65 20 65 6e  leared at the en
3000: 64 20 6f 66 20 65 61 63 68 20 74 72 61 6e 73 61  d of each transa
3010: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 49  ction..**.**   I
3020: 74 20 69 73 20 75 73 65 64 20 77 68 65 6e 20 63  t is used when c
3030: 6f 6d 6d 69 74 74 69 6e 67 20 6f 72 20 6f 74 68  ommitting or oth
3040: 65 72 77 69 73 65 20 65 6e 64 69 6e 67 20 61 20  erwise ending a 
3050: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 0a  transaction. If.
3060: 2a 2a 20 20 20 74 68 65 20 64 62 4d 6f 64 69 66  **   the dbModif
3070: 69 65 64 20 66 6c 61 67 20 69 73 20 63 6c 65 61  ied flag is clea
3080: 72 20 74 68 65 6e 20 6c 65 73 73 20 77 6f 72 6b  r then less work
3090: 20 68 61 73 20 74 6f 20 62 65 20 64 6f 6e 65 2e   has to be done.
30a0: 0a 2a 2a 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 53 74  .**.** journalSt
30b0: 61 72 74 65 64 0a 2a 2a 0a 2a 2a 20 20 20 54 68  arted.**.**   Th
30c0: 69 73 20 66 6c 61 67 20 69 73 20 73 65 74 20 77  is flag is set w
30d0: 68 65 6e 65 76 65 72 20 74 68 65 20 74 68 65 20  henever the the 
30e0: 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 69 73 20  main journal is 
30f0: 6f 70 65 6e 65 64 20 61 6e 64 0a 2a 2a 20 20 20  opened and.**   
3100: 69 6e 69 74 69 61 6c 69 7a 65 64 0a 2a 2a 0a 2a  initialized.**.*
3110: 2a 20 20 20 54 68 65 20 70 6f 69 6e 74 20 6f 66  *   The point of
3120: 20 74 68 69 73 20 66 6c 61 67 20 69 73 20 74 68   this flag is th
3130: 61 74 20 69 74 20 6d 75 73 74 20 62 65 20 73 65  at it must be se
3140: 74 20 61 66 74 65 72 20 74 68 65 20 0a 2a 2a 20  t after the .** 
3150: 20 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20    first journal 
3160: 68 65 61 64 65 72 20 69 6e 20 61 20 6a 6f 75 72  header in a jour
3170: 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 62 65 65  nal file has bee
3180: 6e 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  n synced to disk
3190: 2e 0a 2a 2a 20 20 20 41 66 74 65 72 20 74 68 69  ..**   After thi
31a0: 73 20 68 61 73 20 68 61 70 70 65 6e 65 64 2c 20  s has happened, 
31b0: 6e 65 77 20 70 61 67 65 73 20 61 70 70 65 6e 64  new pages append
31c0: 65 64 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ed to the databa
31d0: 73 65 20 0a 2a 2a 20 20 20 64 6f 20 6e 6f 74 20  se .**   do not 
31e0: 6e 65 65 64 20 74 68 65 20 50 47 48 44 52 5f 4e  need the PGHDR_N
31f0: 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 73 65  EED_SYNC flag se
3200: 74 2c 20 61 73 20 74 68 65 79 20 64 6f 20 6e 6f  t, as they do no
3210: 74 20 6e 65 65 64 0a 2a 2a 20 20 20 74 6f 20 77  t need.**   to w
3220: 61 69 74 20 66 6f 72 20 61 20 6a 6f 75 72 6e 61  ait for a journa
3230: 6c 20 73 79 6e 63 20 62 65 66 6f 72 65 20 74 68  l sync before th
3240: 65 79 20 63 61 6e 20 62 65 20 77 72 69 74 74 65  ey can be writte
3250: 6e 20 6f 75 74 20 74 6f 0a 2a 2a 20 20 20 74 68  n out to.**   th
3260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
3270: 28 73 65 65 20 66 75 6e 63 74 69 6f 6e 20 70 61  (see function pa
3280: 67 65 72 5f 77 72 69 74 65 28 29 29 2e 0a 2a 2a  ger_write())..**
3290: 20 20 20 0a 2a 2a 20 73 65 74 4d 61 73 74 65 72     .** setMaster
32a0: 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20 76 61  .**.**   This va
32b0: 72 69 61 62 6c 65 20 69 73 20 75 73 65 64 20 74  riable is used t
32c0: 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68  o ensure that th
32d0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
32e0: 20 66 69 6c 65 20 6e 61 6d 65 0a 2a 2a 20 20 20   file name.**   
32f0: 28 69 66 20 61 6e 79 29 20 69 73 20 6f 6e 6c 79  (if any) is only
3300: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
3310: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  e journal file o
3320: 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 57 68 65  nce..**.**   Whe
3330: 6e 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74  n committing a t
3340: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 20  ransaction, the 
3350: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
3360: 69 6c 65 20 6e 61 6d 65 20 28 69 66 20 61 6e 79  ile name (if any
3370: 29 0a 2a 2a 20 20 20 6d 61 79 20 62 65 20 77 72  ).**   may be wr
3380: 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a  itten into the j
3390: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 69 6c  ournal file whil
33a0: 65 20 74 68 65 20 70 61 67 65 72 20 69 73 20 73  e the pager is s
33b0: 74 69 6c 6c 20 69 6e 0a 2a 2a 20 20 20 50 41 47  till in.**   PAG
33c0: 45 52 5f 52 45 53 45 52 56 45 44 20 73 74 61 74  ER_RESERVED stat
33d0: 65 20 28 73 65 65 20 43 6f 6d 6d 69 74 50 68 61  e (see CommitPha
33e0: 73 65 4f 6e 65 28 29 20 66 6f 72 20 74 68 65 20  seOne() for the 
33f0: 61 63 74 69 6f 6e 29 2e 20 49 74 0a 2a 2a 20 20  action). It.**  
3400: 20 74 68 65 6e 20 61 74 74 65 6d 70 74 73 20 74   then attempts t
3410: 6f 20 75 70 67 72 61 64 65 20 74 6f 20 61 6e 20  o upgrade to an 
3420: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 20  exclusive lock. 
3430: 49 66 20 74 68 69 73 20 61 74 74 65 6d 70 74 0a  If this attempt.
3440: 2a 2a 20 20 20 66 61 69 6c 73 2c 20 74 68 65 6e  **   fails, then
3450: 20 53 51 4c 49 54 45 5f 42 55 53 59 20 6d 61 79   SQLITE_BUSY may
3460: 20 62 65 20 72 65 74 75 72 6e 65 64 20 74 6f 20   be returned to 
3470: 74 68 65 20 75 73 65 72 20 61 6e 64 20 74 68 65  the user and the
3480: 20 75 73 65 72 0a 2a 2a 20 20 20 6d 61 79 20 61   user.**   may a
3490: 74 74 65 6d 70 74 20 74 6f 20 63 6f 6d 6d 69 74  ttempt to commit
34a0: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
34b0: 20 61 67 61 69 6e 20 6c 61 74 65 72 20 28 63 61   again later (ca
34c0: 6c 6c 69 6e 67 0a 2a 2a 20 20 20 43 6f 6d 6d 69  lling.**   Commi
34d0: 74 50 68 61 73 65 4f 6e 65 28 29 20 61 67 61 69  tPhaseOne() agai
34e0: 6e 29 2e 20 54 68 69 73 20 66 6c 61 67 20 69 73  n). This flag is
34f0: 20 75 73 65 64 20 74 6f 20 65 6e 73 75 72 65 20   used to ensure 
3500: 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 20 20 6d  that the .**   m
3510: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
3520: 6d 65 20 69 73 20 6f 6e 6c 79 20 77 72 69 74 74  me is only writt
3530: 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
3540: 6c 20 66 69 6c 65 20 74 68 65 20 66 69 72 73 74  l file the first
3550: 0a 2a 2a 20 20 20 74 69 6d 65 20 43 6f 6d 6d 69  .**   time Commi
3560: 74 50 68 61 73 65 4f 6e 65 28 29 20 69 73 20 63  tPhaseOne() is c
3570: 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 64 6f 4e  alled..**.** doN
3580: 6f 74 53 79 6e 63 0a 2a 2a 0a 2a 2a 20 20 20 57  otSync.**.**   W
3590: 68 65 6e 20 65 6e 61 62 6c 65 64 2c 20 63 61 63  hen enabled, cac
35a0: 68 65 20 73 70 69 6c 6c 73 20 61 72 65 20 70 72  he spills are pr
35b0: 6f 68 69 62 69 74 65 64 20 61 6e 64 20 74 68 65  ohibited and the
35c0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 61   journal file ca
35d0: 6e 6e 6f 74 0a 2a 2a 20 20 20 62 65 20 73 79 6e  nnot.**   be syn
35e0: 63 65 64 2e 20 20 54 68 69 73 20 76 61 72 69 61  ced.  This varia
35f0: 62 6c 65 20 69 73 20 73 65 74 20 61 6e 64 20 63  ble is set and c
3600: 6c 65 61 72 65 64 20 62 79 20 73 71 6c 69 74 65  leared by sqlite
3610: 33 50 61 67 65 72 57 72 69 74 65 28 29 20 0a 2a  3PagerWrite() .*
3620: 2a 20 20 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  *   in order to 
3630: 70 72 65 76 65 6e 74 20 61 20 6a 6f 75 72 6e 61  prevent a journa
3640: 6c 20 73 79 6e 63 20 66 72 6f 6d 20 68 61 70 70  l sync from happ
3650: 65 6e 69 6e 67 20 69 6e 20 62 65 74 77 65 65 6e  ening in between
3660: 20 74 68 65 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61   the.**   journa
3670: 6c 6c 69 6e 67 20 6f 66 20 74 77 6f 20 70 61 67  lling of two pag
3680: 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 73  es on the same s
3690: 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 6e 65 65  ector..**.** nee
36a0: 64 53 79 6e 63 0a 2a 2a 0a 2a 2a 20 20 20 54 4f  dSync.**.**   TO
36b0: 44 4f 3a 20 49 74 20 6d 69 67 68 74 20 62 65 20  DO: It might be 
36c0: 65 61 73 69 65 72 20 74 6f 20 73 65 74 20 74 68  easier to set th
36d0: 69 73 20 76 61 72 69 61 62 6c 65 20 69 6e 20 77  is variable in w
36e0: 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 29  riteJournalHdr()
36f0: 0a 2a 2a 20 20 20 61 6e 64 20 77 72 69 74 65 4d  .**   and writeM
3700: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 29 20 6f  asterJournal() o
3710: 6e 6c 79 2e 20 43 68 61 6e 67 65 20 69 74 73 20  nly. Change its 
3720: 6d 65 61 6e 69 6e 67 20 74 6f 20 22 75 6e 73 79  meaning to "unsy
3730: 6e 63 65 64 20 64 61 74 61 0a 2a 2a 20 20 20 68  nced data.**   h
3740: 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  as been written 
3750: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 22 2e  to the journal".
3760: 0a 2a 2a 0a 2a 2a 20 73 75 62 6a 49 6e 4d 65 6d  .**.** subjInMem
3770: 6f 72 79 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73  ory.**.**   This
3780: 20 69 73 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61   is a boolean va
3790: 72 69 61 62 6c 65 2e 20 49 66 20 74 72 75 65 2c  riable. If true,
37a0: 20 74 68 65 6e 20 61 6e 79 20 72 65 71 75 69 72   then any requir
37b0: 65 64 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a  ed sub-journal.*
37c0: 2a 20 20 20 69 73 20 6f 70 65 6e 65 64 20 61 73  *   is opened as
37d0: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f   an in-memory jo
37e0: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 66  urnal file. If f
37f0: 61 6c 73 65 2c 20 74 68 65 6e 20 69 6e 2d 6d 65  alse, then in-me
3800: 6d 6f 72 79 0a 2a 2a 20 20 20 73 75 62 2d 6a 6f  mory.**   sub-jo
3810: 75 72 6e 61 6c 73 20 61 72 65 20 6f 6e 6c 79 20  urnals are only 
3820: 75 73 65 64 20 66 6f 72 20 69 6e 2d 6d 65 6d 6f  used for in-memo
3830: 72 79 20 70 61 67 65 72 20 66 69 6c 65 73 2e 0a  ry pager files..
3840: 2a 2f 0a 73 74 72 75 63 74 20 50 61 67 65 72 20  */.struct Pager 
3850: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  {.  sqlite3_vfs 
3860: 2a 70 56 66 73 3b 20 20 20 20 20 20 20 20 20 20  *pVfs;          
3870: 2f 2a 20 4f 53 20 66 75 6e 63 74 69 6f 6e 73 20  /* OS functions 
3880: 74 6f 20 75 73 65 20 66 6f 72 20 49 4f 20 2a 2f  to use for IO */
3890: 0a 20 20 75 38 20 65 78 63 6c 75 73 69 76 65 4d  .  u8 exclusiveM
38a0: 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ode;           /
38b0: 2a 20 42 6f 6f 6c 65 61 6e 2e 20 54 72 75 65 20  * Boolean. True 
38c0: 69 66 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  if locking_mode=
38d0: 3d 45 58 43 4c 55 53 49 56 45 20 2a 2f 0a 20 20  =EXCLUSIVE */.  
38e0: 75 38 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3b 20  u8 journalMode; 
38f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
3900: 6e 20 6f 66 20 74 68 65 20 50 41 47 45 52 5f 4a  n of the PAGER_J
3910: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 2a 20 76 61 6c  OURNALMODE_* val
3920: 75 65 73 20 2a 2f 0a 20 20 75 38 20 75 73 65 4a  ues */.  u8 useJ
3930: 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20  ournal;         
3940: 20 20 20 20 20 2f 2a 20 55 73 65 20 61 20 72 6f       /* Use a ro
3950: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6f  llback journal o
3960: 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20  n this file */. 
3970: 20 75 38 20 6e 6f 52 65 61 64 6c 6f 63 6b 3b 20   u8 noReadlock; 
3980: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3990: 44 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 74 6f  Do not bother to
39a0: 20 6f 62 74 61 69 6e 20 72 65 61 64 6c 6f 63 6b   obtain readlock
39b0: 73 20 2a 2f 0a 20 20 75 38 20 6e 6f 53 79 6e 63  s */.  u8 noSync
39c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
39d0: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 79 6e     /* Do not syn
39e0: 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 66  c the journal if
39f0: 20 74 72 75 65 20 2a 2f 0a 20 20 75 38 20 66 75   true */.  u8 fu
3a00: 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20  llSync;         
3a10: 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 65 78 74         /* Do ext
3a20: 72 61 20 73 79 6e 63 73 20 6f 66 20 74 68 65 20  ra syncs of the 
3a30: 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 6f 62 75  journal for robu
3a40: 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75 38 20 73  stness */.  u8 s
3a50: 79 6e 63 5f 66 6c 61 67 73 3b 20 20 20 20 20 20  ync_flags;      
3a60: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
3a70: 66 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72  f SYNC_NORMAL or
3a80: 20 53 59 4e 43 5f 46 55 4c 4c 20 2a 2f 0a 20 20   SYNC_FULL */.  
3a90: 75 38 20 74 65 6d 70 46 69 6c 65 3b 20 20 20 20  u8 tempFile;    
3aa0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a              /* z
3ab0: 46 69 6c 65 6e 61 6d 65 20 69 73 20 61 20 74 65  Filename is a te
3ac0: 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 2a 2f 0a  mporary file */.
3ad0: 20 20 75 38 20 72 65 61 64 4f 6e 6c 79 3b 20 20    u8 readOnly;  
3ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3af0: 20 54 72 75 65 20 66 6f 72 20 61 20 72 65 61 64   True for a read
3b00: 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a  -only database *
3b10: 2f 0a 20 20 75 38 20 6d 65 6d 44 62 3b 20 20 20  /.  u8 memDb;   
3b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b30: 2f 2a 20 54 72 75 65 20 74 6f 20 69 6e 68 69 62  /* True to inhib
3b40: 69 74 20 61 6c 6c 20 66 69 6c 65 20 49 2f 4f 20  it all file I/O 
3b50: 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c  */..  /* The fol
3b60: 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 63 6f 6e  lowing block con
3b70: 74 61 69 6e 73 20 74 68 6f 73 65 20 63 6c 61 73  tains those clas
3b80: 73 20 6d 65 6d 62 65 72 73 20 74 68 61 74 20 61  s members that a
3b90: 72 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 20  re dynamically. 
3ba0: 20 2a 2a 20 6d 6f 64 69 66 69 65 64 20 64 75 72   ** modified dur
3bb0: 69 6e 67 20 6e 6f 72 6d 61 6c 20 6f 70 65 72 61  ing normal opera
3bc0: 74 69 6f 6e 73 2e 20 54 68 65 20 6f 74 68 65 72  tions. The other
3bd0: 20 76 61 72 69 61 62 6c 65 73 20 69 6e 20 74 68   variables in th
3be0: 69 73 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a  is structure.  *
3bf0: 2a 20 61 72 65 20 65 69 74 68 65 72 20 63 6f 6e  * are either con
3c00: 73 74 61 6e 74 20 74 68 72 6f 75 67 68 6f 75 74  stant throughout
3c10: 20 74 68 65 20 6c 69 66 65 74 69 6d 65 20 6f 66   the lifetime of
3c20: 20 74 68 65 20 70 61 67 65 72 2c 20 6f 72 20 65   the pager, or e
3c30: 6c 73 65 0a 20 20 2a 2a 20 75 73 65 64 20 74 6f  lse.  ** used to
3c40: 20 73 74 6f 72 65 20 63 6f 6e 66 69 67 75 72 61   store configura
3c50: 74 69 6f 6e 20 70 61 72 61 6d 65 74 65 72 73 20  tion parameters 
3c60: 74 68 61 74 20 61 66 66 65 63 74 20 74 68 65 20  that affect the 
3c70: 77 61 79 20 74 68 65 20 70 61 67 65 72 20 0a 20  way the pager . 
3c80: 20 2a 2a 20 6f 70 65 72 61 74 65 73 2e 0a 20 20   ** operates..  
3c90: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 27 73 74 61  **.  ** The 'sta
3ca0: 74 65 27 20 76 61 72 69 61 62 6c 65 20 69 73 20  te' variable is 
3cb0: 64 65 73 63 72 69 62 65 64 20 69 6e 20 6d 6f 72  described in mor
3cc0: 65 20 64 65 74 61 69 6c 20 61 6c 6f 6e 67 20 77  e detail along w
3cd0: 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 64 65 73  ith the.  ** des
3ce0: 63 72 69 70 74 69 6f 6e 73 20 6f 66 20 74 68 65  criptions of the
3cf0: 20 76 61 6c 75 65 73 20 69 74 20 6d 61 79 20 74   values it may t
3d00: 61 6b 65 20 2d 20 50 41 47 45 52 5f 55 4e 4c 4f  ake - PAGER_UNLO
3d10: 43 4b 20 65 74 63 2e 20 4d 61 6e 79 20 6f 66 20  CK etc. Many of 
3d20: 74 68 65 0a 20 20 2a 2a 20 6f 74 68 65 72 20 76  the.  ** other v
3d30: 61 72 69 61 62 6c 65 73 20 69 6e 20 74 68 69 73  ariables in this
3d40: 20 62 6c 6f 63 6b 20 61 72 65 20 64 65 73 63 72   block are descr
3d50: 69 62 65 64 20 69 6e 20 74 68 65 20 63 6f 6d 6d  ibed in the comm
3d60: 65 6e 74 20 64 69 72 65 63 74 6c 79 20 0a 20 20  ent directly .  
3d70: 2a 2a 20 61 62 6f 76 65 20 74 68 69 73 20 63 6c  ** above this cl
3d80: 61 73 73 20 64 65 66 69 6e 69 74 69 6f 6e 2e 0a  ass definition..
3d90: 20 20 2a 2f 0a 20 20 75 38 20 73 74 61 74 65 3b    */.  u8 state;
3da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3db0: 20 20 20 2f 2a 20 50 41 47 45 52 5f 55 4e 4c 4f     /* PAGER_UNLO
3dc0: 43 4b 2c 20 5f 53 48 41 52 45 44 2c 20 5f 52 45  CK, _SHARED, _RE
3dd0: 53 45 52 56 45 44 2c 20 65 74 63 2e 20 2a 2f 0a  SERVED, etc. */.
3de0: 20 20 75 38 20 64 62 4d 6f 64 69 66 69 65 64 3b    u8 dbModified;
3df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3e00: 20 54 72 75 65 20 69 66 20 74 68 65 72 65 20 61   True if there a
3e10: 72 65 20 61 6e 79 20 63 68 61 6e 67 65 73 20 74  re any changes t
3e20: 6f 20 74 68 65 20 44 62 20 2a 2f 0a 20 20 75 38  o the Db */.  u8
3e30: 20 6e 65 65 64 53 79 6e 63 3b 20 20 20 20 20 20   needSync;      
3e40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
3e50: 65 20 69 66 20 61 6e 20 66 73 79 6e 63 28 29 20  e if an fsync() 
3e60: 69 73 20 6e 65 65 64 65 64 20 6f 6e 20 74 68 65  is needed on the
3e70: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38   journal */.  u8
3e80: 20 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 3b   journalStarted;
3e90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
3ea0: 65 20 69 66 20 68 65 61 64 65 72 20 6f 66 20 6a  e if header of j
3eb0: 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
3ec0: 20 2a 2f 0a 20 20 75 38 20 63 68 61 6e 67 65 43   */.  u8 changeC
3ed0: 6f 75 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20 20  ountDone;       
3ee0: 20 20 2f 2a 20 53 65 74 20 61 66 74 65 72 20 69    /* Set after i
3ef0: 6e 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20  ncrementing the 
3f00: 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 2a  change-counter *
3f10: 2f 0a 20 20 75 38 20 73 65 74 4d 61 73 74 65 72  /.  u8 setMaster
3f20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3f30: 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6d 2d 6a  /* True if a m-j
3f40: 20 6e 61 6d 65 20 68 61 73 20 62 65 65 6e 20 77   name has been w
3f50: 72 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20 2a  ritten to jrnl *
3f60: 2f 0a 20 20 75 38 20 64 6f 4e 6f 74 53 79 6e 63  /.  u8 doNotSync
3f70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3f80: 2f 2a 20 42 6f 6f 6c 65 61 6e 2e 20 57 68 69 6c  /* Boolean. Whil
3f90: 65 20 74 72 75 65 2c 20 64 6f 20 6e 6f 74 20 73  e true, do not s
3fa0: 70 69 6c 6c 20 74 68 65 20 63 61 63 68 65 20 2a  pill the cache *
3fb0: 2f 0a 20 20 75 38 20 64 62 53 69 7a 65 56 61 6c  /.  u8 dbSizeVal
3fc0: 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  id;             
3fd0: 2f 2a 20 53 65 74 20 77 68 65 6e 20 64 62 53 69  /* Set when dbSi
3fe0: 7a 65 20 69 73 20 63 6f 72 72 65 63 74 20 2a 2f  ze is correct */
3ff0: 0a 20 20 75 38 20 73 75 62 6a 49 6e 4d 65 6d 6f  .  u8 subjInMemo
4000: 72 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ry;            /
4010: 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20 69 6e  * True to use in
4020: 2d 6d 65 6d 6f 72 79 20 73 75 62 2d 6a 6f 75 72  -memory sub-jour
4030: 6e 61 6c 73 20 2a 2f 0a 20 20 50 67 6e 6f 20 64  nals */.  Pgno d
4040: 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  bSize;          
4050: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
4060: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
4070: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 50 67  database */.  Pg
4080: 6e 6f 20 64 62 4f 72 69 67 53 69 7a 65 3b 20 20  no dbOrigSize;  
4090: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62 53            /* dbS
40a0: 69 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20 63  ize before the c
40b0: 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
40c0: 6f 6e 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 46  on */.  Pgno dbF
40d0: 69 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20  ileSize;        
40e0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
40f0: 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
4100: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
4110: 20 69 6e 74 20 65 72 72 43 6f 64 65 3b 20 20 20   int errCode;   
4120: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4130: 4f 6e 65 20 6f 66 20 73 65 76 65 72 61 6c 20 6b  One of several k
4140: 69 6e 64 73 20 6f 66 20 65 72 72 6f 72 73 20 2a  inds of errors *
4150: 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20  /.  int nRec;   
4160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4170: 2f 2a 20 50 61 67 65 73 20 6a 6f 75 72 6e 61 6c  /* Pages journal
4180: 6c 65 64 20 73 69 6e 63 65 20 6c 61 73 74 20 6a  led since last j
4190: 2d 68 65 61 64 65 72 20 77 72 69 74 74 65 6e 20  -header written 
41a0: 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 49 6e  */.  u32 cksumIn
41b0: 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  it;             
41c0: 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64 6f 6d   /* Quasi-random
41d0: 20 76 61 6c 75 65 20 61 64 64 65 64 20 74 6f 20   value added to 
41e0: 65 76 65 72 79 20 63 68 65 63 6b 73 75 6d 20 2a  every checksum *
41f0: 2f 0a 20 20 75 33 32 20 6e 53 75 62 52 65 63 3b  /.  u32 nSubRec;
4200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4210: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63  /* Number of rec
4220: 6f 72 64 73 20 77 72 69 74 74 65 6e 20 74 6f 20  ords written to 
4230: 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  sub-journal */. 
4240: 20 42 69 74 76 65 63 20 2a 70 49 6e 4a 6f 75 72   Bitvec *pInJour
4250: 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  nal;         /* 
4260: 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68  One bit for each
4270: 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74   page in the dat
4280: 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
4290: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
42a0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ;           /* F
42b0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66  ile descriptor f
42c0: 6f 72 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  or database */. 
42d0: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 6a   sqlite3_file *j
42e0: 66 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  fd;          /* 
42f0: 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
4300: 66 6f 72 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  for main journal
4310: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
4320: 6c 65 20 2a 73 6a 66 64 3b 20 20 20 20 20 20 20  le *sjfd;       
4330: 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69    /* File descri
4340: 70 74 6f 72 20 66 6f 72 20 73 75 62 2d 6a 6f 75  ptor for sub-jou
4350: 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 6a 6f  rnal */.  i64 jo
4360: 75 72 6e 61 6c 4f 66 66 3b 20 20 20 20 20 20 20  urnalOff;       
4370: 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
4380: 20 77 72 69 74 65 20 6f 66 66 73 65 74 20 69 6e   write offset in
4390: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
43a0: 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e  e */.  i64 journ
43b0: 61 6c 48 64 72 3b 20 20 20 20 20 20 20 20 20 20  alHdr;          
43c0: 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65     /* Byte offse
43d0: 74 20 74 6f 20 70 72 65 76 69 6f 75 73 20 6a 6f  t to previous jo
43e0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a  urnal header */.
43f0: 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a    i64 journalSiz
4400: 65 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 2f 2a  eLimit;       /*
4410: 20 53 69 7a 65 20 6c 69 6d 69 74 20 66 6f 72 20   Size limit for 
4420: 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e  persistent journ
4430: 61 6c 20 66 69 6c 65 73 20 2a 2f 0a 20 20 50 61  al files */.  Pa
4440: 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 61 53  gerSavepoint *aS
4450: 61 76 65 70 6f 69 6e 74 3b 20 2f 2a 20 41 72 72  avepoint; /* Arr
4460: 61 79 20 6f 66 20 61 63 74 69 76 65 20 73 61 76  ay of active sav
4470: 65 70 6f 69 6e 74 73 20 2a 2f 0a 20 20 69 6e 74  epoints */.  int
4480: 20 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20 20 20   nSavepoint;    
4490: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
44a0: 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69  er of elements i
44b0: 6e 20 61 53 61 76 65 70 6f 69 6e 74 5b 5d 20 2a  n aSavepoint[] *
44c0: 2f 0a 20 20 63 68 61 72 20 64 62 46 69 6c 65 56  /.  char dbFileV
44d0: 65 72 73 5b 31 36 5d 3b 20 20 20 20 20 20 20 20  ers[16];        
44e0: 2f 2a 20 43 68 61 6e 67 65 73 20 77 68 65 6e 65  /* Changes whene
44f0: 76 65 72 20 64 61 74 61 62 61 73 65 20 66 69 6c  ver database fil
4500: 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 75  e changes */.  u
4510: 33 32 20 73 65 63 74 6f 72 53 69 7a 65 3b 20 20  32 sectorSize;  
4520: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73             /* As
4530: 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69 7a  sumed sector siz
4540: 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63  e during rollbac
4550: 6b 20 2a 2f 0a 0a 20 20 75 31 36 20 6e 45 78 74  k */..  u16 nExt
4560: 72 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ra;             
4570: 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73 20      /* Add this 
4580: 6d 61 6e 79 20 62 79 74 65 73 20 74 6f 20 65 61  many bytes to ea
4590: 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ch in-memory pag
45a0: 65 20 2a 2f 0a 20 20 69 31 36 20 6e 52 65 73 65  e */.  i16 nRese
45b0: 72 76 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  rve;            
45c0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
45d0: 75 6e 75 73 65 64 20 62 79 74 65 73 20 61 74 20  unused bytes at 
45e0: 65 6e 64 20 6f 66 20 65 61 63 68 20 70 61 67 65  end of each page
45f0: 20 2a 2f 0a 20 20 75 33 32 20 76 66 73 46 6c 61   */.  u32 vfsFla
4600: 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gs;             
4610: 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f 72 20 73    /* Flags for s
4620: 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e  qlite3_vfs.xOpen
4630: 28 29 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65  () */.  int page
4640: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
4650: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
4660: 20 62 79 74 65 73 20 69 6e 20 61 20 70 61 67 65   bytes in a page
4670: 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 6e   */.  Pgno mxPgn
4680: 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
4690: 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6c 6c    /* Maximum all
46a0: 6f 77 65 64 20 73 69 7a 65 20 6f 66 20 74 68 65  owed size of the
46b0: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63   database */.  c
46c0: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20  har *zFilename; 
46d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
46e0: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
46f0: 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61  se file */.  cha
4700: 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20 20  r *zJournal;    
4710: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
4720: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
4730: 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 28 2a  file */.  int (*
4740: 78 42 75 73 79 48 61 6e 64 6c 65 72 29 28 76 6f  xBusyHandler)(vo
4750: 69 64 2a 29 3b 20 2f 2a 20 46 75 6e 63 74 69 6f  id*); /* Functio
4760: 6e 20 74 6f 20 63 61 6c 6c 20 77 68 65 6e 20 62  n to call when b
4770: 75 73 79 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  usy */.  void *p
4780: 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 3b 20  BusyHandlerArg; 
4790: 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20       /* Context 
47a0: 61 72 67 75 6d 65 6e 74 20 66 6f 72 20 78 42 75  argument for xBu
47b0: 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a 23 69 66  syHandler */.#if
47c0: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
47d0: 20 20 69 6e 74 20 6e 48 69 74 2c 20 6e 4d 69 73    int nHit, nMis
47e0: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  s;            /*
47f0: 20 43 61 63 68 65 20 68 69 74 73 20 61 6e 64 20   Cache hits and 
4800: 6d 69 73 73 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  missing */.  int
4810: 20 6e 52 65 61 64 2c 20 6e 57 72 69 74 65 3b 20   nRead, nWrite; 
4820: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
4830: 62 61 73 65 20 70 61 67 65 73 20 72 65 61 64 2f  base pages read/
4840: 77 72 69 74 74 65 6e 20 2a 2f 0a 23 65 6e 64 69  written */.#endi
4850: 66 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69 6e  f.  void (*xRein
4860: 69 74 65 72 29 28 44 62 50 61 67 65 2a 29 3b 20  iter)(DbPage*); 
4870: 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f 75  /* Call this rou
4880: 74 69 6e 65 20 77 68 65 6e 20 72 65 6c 6f 61 64  tine when reload
4890: 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a 23 69 66  ing pages */.#if
48a0: 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
48b0: 4f 44 45 43 0a 20 20 76 6f 69 64 20 2a 28 2a 78  ODEC.  void *(*x
48c0: 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69  Codec)(void*,voi
48d0: 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20 2f 2a  d*,Pgno,int); /*
48e0: 20 52 6f 75 74 69 6e 65 20 66 6f 72 20 65 6e 2f   Routine for en/
48f0: 64 65 63 6f 64 69 6e 67 20 64 61 74 61 20 2a 2f  decoding data */
4900: 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64 65 63  .  void (*xCodec
4910: 53 69 7a 65 43 68 6e 67 29 28 76 6f 69 64 2a 2c  SizeChng)(void*,
4920: 69 6e 74 2c 69 6e 74 29 3b 20 2f 2a 20 4e 6f 74  int,int); /* Not
4930: 69 66 79 20 6f 66 20 70 61 67 65 20 73 69 7a 65  ify of page size
4940: 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 76 6f   changes */.  vo
4950: 69 64 20 28 2a 78 43 6f 64 65 63 46 72 65 65 29  id (*xCodecFree)
4960: 28 76 6f 69 64 2a 29 3b 20 20 20 20 20 20 20 20  (void*);        
4970: 20 20 20 20 20 2f 2a 20 44 65 73 74 72 75 63 74       /* Destruct
4980: 6f 72 20 66 6f 72 20 74 68 65 20 63 6f 64 65 63  or for the codec
4990: 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64   */.  void *pCod
49a0: 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
49b0: 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d    /* First argum
49c0: 65 6e 74 20 74 6f 20 78 43 6f 64 65 63 2e 2e 2e  ent to xCodec...
49d0: 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 23 65 6e 64   methods */.#end
49e0: 69 66 0a 20 20 63 68 61 72 20 2a 70 54 6d 70 53  if.  char *pTmpS
49f0: 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20  pace;           
4a00: 20 2f 2a 20 50 61 67 65 72 2e 70 61 67 65 53 69   /* Pager.pageSi
4a10: 7a 65 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  ze bytes of spac
4a20: 65 20 66 6f 72 20 74 6d 70 20 75 73 65 20 2a 2f  e for tmp use */
4a30: 0a 20 20 50 43 61 63 68 65 20 2a 70 50 43 61 63  .  PCache *pPCac
4a40: 68 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  he;            /
4a50: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67  * Pointer to pag
4a60: 65 20 63 61 63 68 65 20 6f 62 6a 65 63 74 20 2a  e cache object *
4a70: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b  /.  sqlite3_back
4a80: 75 70 20 2a 70 42 61 63 6b 75 70 3b 20 20 20 20  up *pBackup;    
4a90: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6c 69  /* Pointer to li
4aa0: 73 74 20 6f 66 20 6f 6e 67 6f 69 6e 67 20 62 61  st of ongoing ba
4ab0: 63 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20 2a  ckup processes *
4ac0: 2f 0a 20 20 4c 6f 67 20 2a 70 4c 6f 67 3b 20 20  /.  Log *pLog;  
4ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ae0: 2f 2a 20 4c 6f 67 20 75 73 65 64 20 62 79 20 22  /* Log used by "
4af0: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c  journal_mode=wal
4b00: 22 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54  " */.};../*.** T
4b10: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f  he following glo
4b20: 62 61 6c 20 76 61 72 69 61 62 6c 65 73 20 68 6f  bal variables ho
4b30: 6c 64 20 63 6f 75 6e 74 65 72 73 20 75 73 65 64  ld counters used
4b40: 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20   for.** testing 
4b50: 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79 2e 20 20  purposes only.  
4b60: 54 68 65 73 65 20 76 61 72 69 61 62 6c 65 73 20  These variables 
4b70: 64 6f 20 6e 6f 74 20 65 78 69 73 74 20 69 6e 0a  do not exist in.
4b80: 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73 74 69 6e 67  ** a non-testing
4b90: 20 62 75 69 6c 64 2e 20 20 54 68 65 73 65 20 76   build.  These v
4ba0: 61 72 69 61 62 6c 65 73 20 61 72 65 20 6e 6f 74  ariables are not
4bb0: 20 74 68 72 65 61 64 2d 73 61 66 65 2e 0a 2a 2f   thread-safe..*/
4bc0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
4bd0: 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  EST.int sqlite3_
4be0: 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75  pager_readdb_cou
4bf0: 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75  nt = 0;    /* Nu
4c00: 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70 61 67  mber of full pag
4c10: 65 73 20 72 65 61 64 20 66 72 6f 6d 20 44 42 20  es read from DB 
4c20: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70  */.int sqlite3_p
4c30: 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75  ager_writedb_cou
4c40: 6e 74 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d  nt = 0;   /* Num
4c50: 62 65 72 20 6f 66 20 66 75 6c 6c 20 70 61 67 65  ber of full page
4c60: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 44 42 20  s written to DB 
4c70: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70  */.int sqlite3_p
4c80: 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e  ager_writej_coun
4c90: 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d  t = 0;    /* Num
4ca0: 62 65 72 20 6f 66 20 70 61 67 65 73 20 77 72 69  ber of pages wri
4cb0: 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c 20  tten to journal 
4cc0: 2a 2f 0a 23 20 64 65 66 69 6e 65 20 50 41 47 45  */.# define PAGE
4cd0: 52 5f 49 4e 43 52 28 76 29 20 20 76 2b 2b 0a 23  R_INCR(v)  v++.#
4ce0: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 50 41  else.# define PA
4cf0: 47 45 52 5f 49 4e 43 52 28 76 29 0a 23 65 6e 64  GER_INCR(v).#end
4d00: 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72  if..../*.** Jour
4d10: 6e 61 6c 20 66 69 6c 65 73 20 62 65 67 69 6e 20  nal files begin 
4d20: 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69  with the followi
4d30: 6e 67 20 6d 61 67 69 63 20 73 74 72 69 6e 67 2e  ng magic string.
4d40: 20 20 54 68 65 20 64 61 74 61 0a 2a 2a 20 77 61    The data.** wa
4d50: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
4d60: 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e 20 20 49 74  /dev/random.  It
4d70: 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 61 73   is used only as
4d80: 20 61 20 73 61 6e 69 74 79 20 63 68 65 63 6b 2e   a sanity check.
4d90: 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20 76 65 72  .**.** Since ver
4da0: 73 69 6f 6e 20 32 2e 38 2e 30 2c 20 74 68 65 20  sion 2.8.0, the 
4db0: 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63  journal format c
4dc0: 6f 6e 74 61 69 6e 73 20 61 64 64 69 74 69 6f 6e  ontains addition
4dd0: 61 6c 20 73 61 6e 69 74 79 0a 2a 2a 20 63 68 65  al sanity.** che
4de0: 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  cking informatio
4df0: 6e 2e 20 20 49 66 20 74 68 65 20 70 6f 77 65 72  n.  If the power
4e00: 20 66 61 69 6c 73 20 77 68 69 6c 65 20 74 68 65   fails while the
4e10: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e   journal is bein
4e20: 67 0a 2a 2a 20 77 72 69 74 74 65 6e 2c 20 73 65  g.** written, se
4e30: 6d 69 2d 72 61 6e 64 6f 6d 20 67 61 72 62 61 67  mi-random garbag
4e40: 65 20 64 61 74 61 20 6d 69 67 68 74 20 61 70 70  e data might app
4e50: 65 61 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ear in the journ
4e60: 61 6c 0a 2a 2a 20 66 69 6c 65 20 61 66 74 65 72  al.** file after
4e70: 20 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72   power is restor
4e80: 65 64 2e 20 20 49 66 20 61 6e 20 61 74 74 65 6d  ed.  If an attem
4e90: 70 74 20 69 73 20 74 68 65 6e 20 6d 61 64 65 0a  pt is then made.
4ea0: 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74 68 65 20 6a  ** to roll the j
4eb0: 6f 75 72 6e 61 6c 20 62 61 63 6b 2c 20 74 68 65  ournal back, the
4ec0: 20 64 61 74 61 62 61 73 65 20 63 6f 75 6c 64 20   database could 
4ed0: 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20 20 54  be corrupted.  T
4ee0: 68 65 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a  he additional.**
4ef0: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   sanity checking
4f00: 20 64 61 74 61 20 69 73 20 61 6e 20 61 74 74 65   data is an atte
4f10: 6d 70 74 20 74 6f 20 64 69 73 63 6f 76 65 72 20  mpt to discover 
4f20: 74 68 65 20 67 61 72 62 61 67 65 20 69 6e 20 74  the garbage in t
4f30: 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e  he.** journal an
4f40: 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a  d ignore it..**.
4f50: 2a 2a 20 54 68 65 20 73 61 6e 69 74 79 20 63 68  ** The sanity ch
4f60: 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  ecking informati
4f70: 6f 6e 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6a  on for the new j
4f80: 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f  ournal format co
4f90: 6e 73 69 73 74 73 0a 2a 2a 20 6f 66 20 61 20 33  nsists.** of a 3
4fa0: 32 2d 62 69 74 20 63 68 65 63 6b 73 75 6d 20 6f  2-bit checksum o
4fb0: 6e 20 65 61 63 68 20 70 61 67 65 20 6f 66 20 64  n each page of d
4fc0: 61 74 61 2e 20 20 54 68 65 20 63 68 65 63 6b 73  ata.  The checks
4fd0: 75 6d 20 63 6f 76 65 72 73 20 62 6f 74 68 0a 2a  um covers both.*
4fe0: 2a 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  * the page numbe
4ff0: 72 20 61 6e 64 20 74 68 65 20 70 50 61 67 65 72  r and the pPager
5000: 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73  ->pageSize bytes
5010: 20 6f 66 20 64 61 74 61 20 66 6f 72 20 74 68 65   of data for the
5020: 20 70 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63   page..** This c
5030: 6b 73 75 6d 20 69 73 20 69 6e 69 74 69 61 6c 69  ksum is initiali
5040: 7a 65 64 20 74 6f 20 61 20 33 32 2d 62 69 74 20  zed to a 32-bit 
5050: 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 74 68 61  random value tha
5060: 74 20 61 70 70 65 61 72 73 20 69 6e 20 74 68 65  t appears in the
5070: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
5080: 20 72 69 67 68 74 20 61 66 74 65 72 20 74 68 65   right after the
5090: 20 68 65 61 64 65 72 2e 20 20 54 68 65 20 72 61   header.  The ra
50a0: 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 69 7a 65 72  ndom initializer
50b0: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a   is important,.*
50c0: 2a 20 62 65 63 61 75 73 65 20 67 61 72 62 61 67  * because garbag
50d0: 65 20 64 61 74 61 20 74 68 61 74 20 61 70 70 65  e data that appe
50e0: 61 72 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ars at the end o
50f0: 66 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c  f a journal is l
5100: 69 6b 65 6c 79 0a 2a 2a 20 64 61 74 61 20 74 68  ikely.** data th
5110: 61 74 20 77 61 73 20 6f 6e 63 65 20 69 6e 20 6f  at was once in o
5120: 74 68 65 72 20 66 69 6c 65 73 20 74 68 61 74 20  ther files that 
5130: 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 64 65  have now been de
5140: 6c 65 74 65 64 2e 20 20 49 66 20 74 68 65 0a 2a  leted.  If the.*
5150: 2a 20 67 61 72 62 61 67 65 20 64 61 74 61 20 63  * garbage data c
5160: 61 6d 65 20 66 72 6f 6d 20 61 6e 20 6f 62 73 6f  ame from an obso
5170: 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  lete journal fil
5180: 65 2c 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73  e, the checksums
5190: 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 63 6f 72   might.** be cor
51a0: 72 65 63 74 2e 20 20 42 75 74 20 62 79 20 69 6e  rect.  But by in
51b0: 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 63  itializing the c
51c0: 68 65 63 6b 73 75 6d 20 74 6f 20 72 61 6e 64 6f  hecksum to rando
51d0: 6d 20 76 61 6c 75 65 20 77 68 69 63 68 0a 2a 2a  m value which.**
51e0: 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 6f   is different fo
51f0: 72 20 65 76 65 72 79 20 6a 6f 75 72 6e 61 6c 2c  r every journal,
5200: 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68 61   we minimize tha
5210: 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69  t risk..*/.stati
5220: 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  c const unsigned
5230: 20 63 68 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61   char aJournalMa
5240: 67 69 63 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39  gic[] = {.  0xd9
5250: 2c 20 30 78 64 35 2c 20 30 78 30 35 2c 20 30 78  , 0xd5, 0x05, 0x
5260: 66 39 2c 20 30 78 32 30 2c 20 30 78 61 31 2c 20  f9, 0x20, 0xa1, 
5270: 30 78 36 33 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a  0x63, 0xd7,.};..
5280: 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f  /*.** The size o
5290: 66 20 74 68 65 20 6f 66 20 65 61 63 68 20 70 61  f the of each pa
52a0: 67 65 20 72 65 63 6f 72 64 20 69 6e 20 74 68 65  ge record in the
52b0: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 67 69 76 65   journal is give
52c0: 6e 20 62 79 0a 2a 2a 20 74 68 65 20 66 6f 6c 6c  n by.** the foll
52d0: 6f 77 69 6e 67 20 6d 61 63 72 6f 2e 0a 2a 2f 0a  owing macro..*/.
52e0: 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f  #define JOURNAL_
52f0: 50 47 5f 53 5a 28 70 50 61 67 65 72 29 20 20 28  PG_SZ(pPager)  (
5300: 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  (pPager->pageSiz
5310: 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a 20 54  e) + 8)../*.** T
5320: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
5330: 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20  r size for this 
5340: 70 61 67 65 72 2e 20 54 68 69 73 20 69 73 20 75  pager. This is u
5350: 73 75 61 6c 6c 79 20 74 68 65 20 73 61 6d 65 20  sually the same 
5360: 0a 2a 2a 20 73 69 7a 65 20 61 73 20 61 20 73 69  .** size as a si
5370: 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72  ngle disk sector
5380: 2e 20 53 65 65 20 61 6c 73 6f 20 73 65 74 53 65  . See also setSe
5390: 63 74 6f 72 53 69 7a 65 28 29 2e 0a 2a 2f 0a 23  ctorSize()..*/.#
53a0: 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48  define JOURNAL_H
53b0: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 28 70  DR_SZ(pPager) (p
53c0: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
53d0: 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61  e)../*.** The ma
53e0: 63 72 6f 20 4d 45 4d 44 42 20 69 73 20 74 72 75  cro MEMDB is tru
53f0: 65 20 69 66 20 77 65 20 61 72 65 20 64 65 61 6c  e if we are deal
5400: 69 6e 67 20 77 69 74 68 20 61 6e 20 69 6e 2d 6d  ing with an in-m
5410: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a  emory database..
5420: 2a 2a 20 57 65 20 64 6f 20 74 68 69 73 20 61 73  ** We do this as
5430: 20 61 20 6d 61 63 72 6f 20 73 6f 20 74 68 61 74   a macro so that
5440: 20 69 66 20 74 68 65 20 53 51 4c 49 54 45 5f 4f   if the SQLITE_O
5450: 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 6d 61 63  MIT_MEMORYDB mac
5460: 72 6f 20 69 73 20 73 65 74 2c 0a 2a 2a 20 74 68  ro is set,.** th
5470: 65 20 76 61 6c 75 65 20 6f 66 20 4d 45 4d 44 42  e value of MEMDB
5480: 20 77 69 6c 6c 20 62 65 20 61 20 63 6f 6e 73 74   will be a const
5490: 61 6e 74 20 61 6e 64 20 74 68 65 20 63 6f 6d 70  ant and the comp
54a0: 69 6c 65 72 20 77 69 6c 6c 20 6f 70 74 69 6d 69  iler will optimi
54b0: 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f 64 65 20 74  ze.** out code t
54c0: 68 61 74 20 77 6f 75 6c 64 20 6e 65 76 65 72 20  hat would never 
54d0: 65 78 65 63 75 74 65 2e 0a 2a 2f 0a 23 69 66 64  execute..*/.#ifd
54e0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  ef SQLITE_OMIT_M
54f0: 45 4d 4f 52 59 44 42 0a 23 20 64 65 66 69 6e 65  EMORYDB.# define
5500: 20 4d 45 4d 44 42 20 30 0a 23 65 6c 73 65 0a 23   MEMDB 0.#else.#
5510: 20 64 65 66 69 6e 65 20 4d 45 4d 44 42 20 70 50   define MEMDB pP
5520: 61 67 65 72 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64  ager->memDb.#end
5530: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61  if../*.** The ma
5540: 78 69 6d 75 6d 20 6c 65 67 61 6c 20 70 61 67 65  ximum legal page
5550: 20 6e 75 6d 62 65 72 20 69 73 20 28 32 5e 33 31   number is (2^31
5560: 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e   - 1)..*/.#defin
5570: 65 20 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f  e PAGER_MAX_PGNO
5580: 20 32 31 34 37 34 38 33 36 34 37 0a 0a 23 69 66   2147483647..#if
5590: 6e 64 65 66 20 4e 44 45 42 55 47 20 0a 2f 2a 0a  ndef NDEBUG ./*.
55a0: 2a 2a 20 55 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20  ** Usage:.**.** 
55b0: 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74    assert( assert
55c0: 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61  _pager_state(pPa
55d0: 67 65 72 29 20 29 3b 0a 2a 2f 0a 73 74 61 74 69  ger) );.*/.stati
55e0: 63 20 69 6e 74 20 61 73 73 65 72 74 5f 70 61 67  c int assert_pag
55f0: 65 72 5f 73 74 61 74 65 28 50 61 67 65 72 20 2a  er_state(Pager *
5600: 70 50 61 67 65 72 29 7b 0a 0a 20 20 2f 2a 20 41  pPager){..  /* A
5610: 20 74 65 6d 70 2d 66 69 6c 65 20 69 73 20 61 6c   temp-file is al
5620: 77 61 79 73 20 69 6e 20 50 41 47 45 52 5f 45 58  ways in PAGER_EX
5630: 43 4c 55 53 49 56 45 20 6f 72 20 50 41 47 45 52  CLUSIVE or PAGER
5640: 5f 53 59 4e 43 45 44 20 73 74 61 74 65 2e 20 2a  _SYNCED state. *
5650: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
5660: 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20  er->tempFile==0 
5670: 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  || pPager->state
5680: 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  >=PAGER_EXCLUSIV
5690: 45 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 63  E );..  /* The c
56a0: 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66  hangeCountDone f
56b0: 6c 61 67 20 69 73 20 61 6c 77 61 79 73 20 73 65  lag is always se
56c0: 74 20 66 6f 72 20 74 65 6d 70 2d 66 69 6c 65 73  t for temp-files
56d0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
56e0: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d  ager->tempFile==
56f0: 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 63 68 61  0 || pPager->cha
5700: 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 29 3b 0a  ngeCountDone );.
5710: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23  .  return 1;.}.#
5720: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  endif../*.** Ret
5730: 75 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 69  urn true if it i
5740: 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77  s necessary to w
5750: 72 69 74 65 20 70 61 67 65 20 2a 70 50 67 20 69  rite page *pPg i
5760: 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  nto the sub-jour
5770: 6e 61 6c 2e 0a 2a 2a 20 41 20 70 61 67 65 20 6e  nal..** A page n
5780: 65 65 64 73 20 74 6f 20 62 65 20 77 72 69 74 74  eeds to be writt
5790: 65 6e 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d  en into the sub-
57a0: 6a 6f 75 72 6e 61 6c 20 69 66 20 74 68 65 72 65  journal if there
57b0: 20 65 78 69 73 74 73 20 6f 6e 65 0a 2a 2a 20 6f   exists one.** o
57c0: 72 20 6d 6f 72 65 20 6f 70 65 6e 20 73 61 76 65  r more open save
57d0: 70 6f 69 6e 74 73 20 66 6f 72 20 77 68 69 63 68  points for which
57e0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20  :.**.**   * The 
57f0: 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 6c  page-number is l
5800: 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
5810: 6c 20 74 6f 20 50 61 67 65 72 53 61 76 65 70 6f  l to PagerSavepo
5820: 69 6e 74 2e 6e 4f 72 69 67 2c 20 61 6e 64 0a 2a  int.nOrig, and.*
5830: 2a 20 20 20 2a 20 54 68 65 20 62 69 74 20 63 6f  *   * The bit co
5840: 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74  rresponding to t
5850: 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69  he page-number i
5860: 73 20 6e 6f 74 20 73 65 74 20 69 6e 0a 2a 2a 20  s not set in.** 
5870: 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69      PagerSavepoi
5880: 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2e  nt.pInSavepoint.
5890: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
58a0: 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28  ubjRequiresPage(
58b0: 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
58c0: 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 67 2d 3e  gno pgno = pPg->
58d0: 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70  pgno;.  Pager *p
58e0: 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
58f0: 67 65 72 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ger;.  int i;.  
5900: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65  for(i=0; i<pPage
5910: 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69  r->nSavepoint; i
5920: 2b 2b 29 7b 0a 20 20 20 20 50 61 67 65 72 53 61  ++){.    PagerSa
5930: 76 65 70 6f 69 6e 74 20 2a 70 20 3d 20 26 70 50  vepoint *p = &pP
5940: 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
5950: 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  [i];.    if( p->
5960: 6e 4f 72 69 67 3e 3d 70 67 6e 6f 20 26 26 20 30  nOrig>=pgno && 0
5970: 3d 3d 73 71 6c 69 74 65 33 42 69 74 76 65 63 54  ==sqlite3BitvecT
5980: 65 73 74 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f  est(p->pInSavepo
5990: 69 6e 74 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20  int, pgno) ){.  
59a0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
59b0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
59c0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   0;.}../*.** Ret
59d0: 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20  urn true if the 
59e0: 70 61 67 65 20 69 73 20 61 6c 72 65 61 64 79 20  page is already 
59f0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
5a00: 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
5a10: 6e 74 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c  nt pageInJournal
5a20: 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
5a30: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42 69  return sqlite3Bi
5a40: 74 76 65 63 54 65 73 74 28 70 50 67 2d 3e 70 50  tvecTest(pPg->pP
5a50: 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
5a60: 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 7d 0a  , pPg->pgno);.}.
5a70: 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33 32  ./*.** Read a 32
5a80: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 66 72 6f  -bit integer fro
5a90: 6d 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65  m the given file
5aa0: 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 53 74   descriptor.  St
5ab0: 6f 72 65 20 74 68 65 20 69 6e 74 65 67 65 72 0a  ore the integer.
5ac0: 2a 2a 20 74 68 61 74 20 69 73 20 72 65 61 64 20  ** that is read 
5ad0: 69 6e 20 2a 70 52 65 73 2e 20 20 52 65 74 75 72  in *pRes.  Retur
5ae0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65  n SQLITE_OK if e
5af0: 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 65 64  verything worked
5b00: 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65 72 72 6f 72  , or an.** error
5b10: 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69   code is somethi
5b20: 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a  ng goes wrong..*
5b30: 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75 65 73 20  *.** All values 
5b40: 61 72 65 20 73 74 6f 72 65 64 20 6f 6e 20 64 69  are stored on di
5b50: 73 6b 20 61 73 20 62 69 67 2d 65 6e 64 69 61 6e  sk as big-endian
5b60: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
5b70: 72 65 61 64 33 32 62 69 74 73 28 73 71 6c 69 74  read32bits(sqlit
5b80: 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34  e3_file *fd, i64
5b90: 20 6f 66 66 73 65 74 2c 20 75 33 32 20 2a 70 52   offset, u32 *pR
5ba0: 65 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  es){.  unsigned 
5bb0: 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 69 6e  char ac[4];.  in
5bc0: 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73  t rc = sqlite3Os
5bd0: 52 65 61 64 28 66 64 2c 20 61 63 2c 20 73 69 7a  Read(fd, ac, siz
5be0: 65 6f 66 28 61 63 29 2c 20 6f 66 66 73 65 74 29  eof(ac), offset)
5bf0: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
5c00: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52  TE_OK ){.    *pR
5c10: 65 73 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34  es = sqlite3Get4
5c20: 62 79 74 65 28 61 63 29 3b 0a 20 20 7d 0a 20 20  byte(ac);.  }.  
5c30: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
5c40: 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62  .** Write a 32-b
5c50: 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20  it integer into 
5c60: 61 20 73 74 72 69 6e 67 20 62 75 66 66 65 72 20  a string buffer 
5c70: 69 6e 20 62 69 67 2d 65 6e 64 69 61 6e 20 62 79  in big-endian by
5c80: 74 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 23 64 65  te order..*/.#de
5c90: 66 69 6e 65 20 70 75 74 33 32 62 69 74 73 28 41  fine put32bits(A
5ca0: 2c 42 29 20 20 73 71 6c 69 74 65 33 50 75 74 34  ,B)  sqlite3Put4
5cb0: 62 79 74 65 28 28 75 38 2a 29 41 2c 42 29 0a 0a  byte((u8*)A,B)..
5cc0: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32  /*.** Write a 32
5cd0: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74  -bit integer int
5ce0: 6f 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65  o the given file
5cf0: 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 52 65   descriptor.  Re
5d00: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  turn SQLITE_OK.*
5d10: 2a 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20  * on success or 
5d20: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
5d30: 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20   something goes 
5d40: 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  wrong..*/.static
5d50: 20 69 6e 74 20 77 72 69 74 65 33 32 62 69 74 73   int write32bits
5d60: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66  (sqlite3_file *f
5d70: 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20 75  d, i64 offset, u
5d80: 33 32 20 76 61 6c 29 7b 0a 20 20 63 68 61 72 20  32 val){.  char 
5d90: 61 63 5b 34 5d 3b 0a 20 20 70 75 74 33 32 62 69  ac[4];.  put32bi
5da0: 74 73 28 61 63 2c 20 76 61 6c 29 3b 0a 20 20 72  ts(ac, val);.  r
5db0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 57  eturn sqlite3OsW
5dc0: 72 69 74 65 28 66 64 2c 20 61 63 2c 20 34 2c 20  rite(fd, ac, 4, 
5dd0: 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  offset);.}../*.*
5de0: 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 74  * The argument t
5df0: 6f 20 74 68 69 73 20 6d 61 63 72 6f 20 69 73 20  o this macro is 
5e00: 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  a file descripto
5e10: 72 20 28 74 79 70 65 20 73 71 6c 69 74 65 33 5f  r (type sqlite3_
5e20: 66 69 6c 65 2a 29 2e 0a 2a 2a 20 52 65 74 75 72  file*)..** Retur
5e30: 6e 20 30 20 69 66 20 69 74 20 69 73 20 6e 6f 74  n 0 if it is not
5e40: 20 6f 70 65 6e 2c 20 6f 72 20 6e 6f 6e 2d 7a 65   open, or non-ze
5e50: 72 6f 20 28 62 75 74 20 6e 6f 74 20 31 29 20 69  ro (but not 1) i
5e60: 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54  f it is..**.** T
5e70: 68 69 73 20 69 73 20 73 6f 20 74 68 61 74 20 65  his is so that e
5e80: 78 70 72 65 73 73 69 6f 6e 73 20 63 61 6e 20 62  xpressions can b
5e90: 65 20 77 72 69 74 74 65 6e 20 61 73 3a 0a 2a 2a  e written as:.**
5ea0: 0a 2a 2a 20 20 20 69 66 28 20 69 73 4f 70 65 6e  .**   if( isOpen
5eb0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b  (pPager->jfd) ){
5ec0: 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 69 6e 73 74 65   ....**.** inste
5ed0: 61 64 20 6f 66 0a 2a 2a 0a 2a 2a 20 20 20 69 66  ad of.**.**   if
5ee0: 28 20 70 50 61 67 65 72 2d 3e 6a 66 64 2d 3e 70  ( pPager->jfd->p
5ef0: 4d 65 74 68 6f 64 73 20 29 7b 20 2e 2e 2e 0a 2a  Methods ){ ....*
5f00: 2f 0a 23 64 65 66 69 6e 65 20 69 73 4f 70 65 6e  /.#define isOpen
5f10: 28 70 46 64 29 20 28 28 70 46 64 29 2d 3e 70 4d  (pFd) ((pFd)->pM
5f20: 65 74 68 6f 64 73 29 0a 0a 2f 2a 0a 2a 2a 20 49  ethods)../*.** I
5f30: 66 20 66 69 6c 65 20 70 46 64 20 69 73 20 6f 70  f file pFd is op
5f40: 65 6e 2c 20 63 61 6c 6c 20 73 71 6c 69 74 65 33  en, call sqlite3
5f50: 4f 73 55 6e 6c 6f 63 6b 28 29 20 6f 6e 20 69 74  OsUnlock() on it
5f60: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
5f70: 6f 73 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33  osUnlock(sqlite3
5f80: 5f 66 69 6c 65 20 2a 70 46 64 2c 20 69 6e 74 20  _file *pFd, int 
5f90: 65 4c 6f 63 6b 29 7b 0a 20 20 69 66 28 20 21 69  eLock){.  if( !i
5fa0: 73 4f 70 65 6e 28 70 46 64 29 20 29 7b 0a 20 20  sOpen(pFd) ){.  
5fb0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
5fc0: 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OK;.  }.  return
5fd0: 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b   sqlite3OsUnlock
5fe0: 28 70 46 64 2c 20 65 4c 6f 63 6b 29 3b 0a 7d 0a  (pFd, eLock);.}.
5ff0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
6000: 74 69 6f 6e 20 64 65 74 65 72 6d 69 6e 65 73 20  tion determines 
6010: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
6020: 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20  he atomic-write 
6030: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20  optimization.** 
6040: 63 61 6e 20 62 65 20 75 73 65 64 20 77 69 74 68  can be used with
6050: 20 74 68 69 73 20 70 61 67 65 72 2e 20 54 68 65   this pager. The
6060: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61   optimization ca
6070: 6e 20 62 65 20 75 73 65 64 20 69 66 3a 0a 2a 2a  n be used if:.**
6080: 0a 2a 2a 20 20 28 61 29 20 74 68 65 20 76 61 6c  .**  (a) the val
6090: 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f  ue returned by O
60a0: 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
60b0: 69 73 74 69 63 73 28 29 20 69 6e 64 69 63 61 74  istics() indicat
60c0: 65 73 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20  es that.**      
60d0: 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  a database page 
60e0: 6d 61 79 20 62 65 20 77 72 69 74 74 65 6e 20 61  may be written a
60f0: 74 6f 6d 69 63 61 6c 6c 79 2c 20 61 6e 64 0a 2a  tomically, and.*
6100: 2a 20 20 28 62 29 20 74 68 65 20 76 61 6c 75 65  *  (b) the value
6110: 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73 53   returned by OsS
6120: 65 63 74 6f 72 53 69 7a 65 28 29 20 69 73 20 6c  ectorSize() is l
6130: 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
6140: 6c 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74 68 65  l.**      to the
6150: 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a   page size..**.*
6160: 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a 61 74 69  * The optimizati
6170: 6f 6e 20 69 73 20 61 6c 73 6f 20 61 6c 77 61 79  on is also alway
6180: 73 20 65 6e 61 62 6c 65 64 20 66 6f 72 20 74 65  s enabled for te
6190: 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 49  mporary files. I
61a0: 74 20 69 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72  t is.** an error
61b0: 20 74 6f 20 63 61 6c 6c 20 74 68 69 73 20 66 75   to call this fu
61c0: 6e 63 74 69 6f 6e 20 69 66 20 70 50 61 67 65 72  nction if pPager
61d0: 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 6e   is opened on an
61e0: 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61   in-memory.** da
61f0: 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  tabase..**.** If
6200: 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f   the optimizatio
6210: 6e 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64  n cannot be used
6220: 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65 64 2e  , 0 is returned.
6230: 20 49 66 20 69 74 20 63 61 6e 20 62 65 20 75 73   If it can be us
6240: 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20  ed,.** then the 
6250: 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69  value returned i
6260: 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  s the size of th
6270: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77  e journal file w
6280: 68 65 6e 20 69 74 0a 2a 2a 20 63 6f 6e 74 61 69  hen it.** contai
6290: 6e 73 20 72 6f 6c 6c 62 61 63 6b 20 64 61 74 61  ns rollback data
62a0: 20 66 6f 72 20 65 78 61 63 74 6c 79 20 6f 6e 65   for exactly one
62b0: 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66 64 65 66   page..*/.#ifdef
62c0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
62d0: 54 4f 4d 49 43 5f 57 52 49 54 45 0a 73 74 61 74  TOMIC_WRITE.stat
62e0: 69 63 20 69 6e 74 20 6a 72 6e 6c 42 75 66 66 65  ic int jrnlBuffe
62f0: 72 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61  rSize(Pager *pPa
6300: 67 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ger){.  assert( 
6310: 21 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66 28 20  !MEMDB );.  if( 
6320: 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
6330: 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 64 63 3b  e ){.    int dc;
6340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6350: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
6360: 76 69 63 65 20 63 68 61 72 61 63 74 65 72 69 73  vice characteris
6370: 74 69 63 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20  tics */.    int 
6380: 6e 53 65 63 74 6f 72 3b 20 20 20 20 20 20 20 20  nSector;        
6390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
63a0: 20 53 65 63 74 6f 72 20 73 69 7a 65 20 2a 2f 0a   Sector size */.
63b0: 20 20 20 20 69 6e 74 20 73 7a 50 61 67 65 3b 20      int szPage; 
63c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
63d0: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 73 69        /* Page si
63e0: 7a 65 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72  ze */..    asser
63f0: 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
6400: 2d 3e 66 64 29 20 29 3b 0a 20 20 20 20 64 63 20  ->fd) );.    dc 
6410: 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63  = sqlite3OsDevic
6420: 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
6430: 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  (pPager->fd);.  
6440: 20 20 6e 53 65 63 74 6f 72 20 3d 20 70 50 61 67    nSector = pPag
6450: 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a  er->sectorSize;.
6460: 20 20 20 20 73 7a 50 61 67 65 20 3d 20 70 50 61      szPage = pPa
6470: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 0a  ger->pageSize;..
6480: 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54      assert(SQLIT
6490: 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31  E_IOCAP_ATOMIC51
64a0: 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20  2==(512>>8));.  
64b0: 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f    assert(SQLITE_
64c0: 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d  IOCAP_ATOMIC64K=
64d0: 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20  =(65536>>8));.  
64e0: 20 20 69 66 28 20 30 3d 3d 28 64 63 26 28 53 51    if( 0==(dc&(SQ
64f0: 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
6500: 43 7c 28 73 7a 50 61 67 65 3e 3e 38 29 29 20 7c  C|(szPage>>8)) |
6510: 7c 20 6e 53 65 63 74 6f 72 3e 73 7a 50 61 67 65  | nSector>szPage
6520: 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
6530: 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  n 0;.    }.  }..
6540: 20 20 72 65 74 75 72 6e 20 4a 4f 55 52 4e 41 4c    return JOURNAL
6550: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
6560: 2b 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  + JOURNAL_PG_SZ(
6570: 70 50 61 67 65 72 29 3b 0a 7d 0a 23 65 6e 64 69  pPager);.}.#endi
6580: 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 49  f../*.** If SQLI
6590: 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 20 69  TE_CHECK_PAGES i
65a0: 73 20 64 65 66 69 6e 65 64 20 74 68 65 6e 20 77  s defined then w
65b0: 65 20 64 6f 20 73 6f 6d 65 20 73 61 6e 69 74 79  e do some sanity
65c0: 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 6f 6e 20   checking.** on 
65d0: 74 68 65 20 63 61 63 68 65 20 75 73 69 6e 67 20  the cache using 
65e0: 61 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 2e  a hash function.
65f0: 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 66    This is used f
6600: 6f 72 20 74 65 73 74 69 6e 67 0a 2a 2a 20 61 6e  or testing.** an
6610: 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79  d debugging only
6620: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
6630: 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 2f  TE_CHECK_PAGES./
6640: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 33 32  *.** Return a 32
6650: 2d 62 69 74 20 68 61 73 68 20 6f 66 20 74 68 65  -bit hash of the
6660: 20 70 61 67 65 20 64 61 74 61 20 66 6f 72 20 70   page data for p
6670: 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Page..*/.static 
6680: 75 33 32 20 70 61 67 65 72 5f 64 61 74 61 68 61  u32 pager_dataha
6690: 73 68 28 69 6e 74 20 6e 42 79 74 65 2c 20 75 6e  sh(int nByte, un
66a0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44 61  signed char *pDa
66b0: 74 61 29 7b 0a 20 20 75 33 32 20 68 61 73 68 20  ta){.  u32 hash 
66c0: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  = 0;.  int i;.  
66d0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 79 74 65  for(i=0; i<nByte
66e0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 68 61 73 68  ; i++){.    hash
66f0: 20 3d 20 28 68 61 73 68 2a 31 30 33 39 29 20 2b   = (hash*1039) +
6700: 20 70 44 61 74 61 5b 69 5d 3b 0a 20 20 7d 0a 20   pData[i];.  }. 
6710: 20 72 65 74 75 72 6e 20 68 61 73 68 3b 0a 7d 0a   return hash;.}.
6720: 73 74 61 74 69 63 20 75 33 32 20 70 61 67 65 72  static u32 pager
6730: 5f 70 61 67 65 68 61 73 68 28 50 67 48 64 72 20  _pagehash(PgHdr 
6740: 2a 70 50 61 67 65 29 7b 0a 20 20 72 65 74 75 72  *pPage){.  retur
6750: 6e 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68  n pager_datahash
6760: 28 70 50 61 67 65 2d 3e 70 50 61 67 65 72 2d 3e  (pPage->pPager->
6770: 70 61 67 65 53 69 7a 65 2c 20 28 75 6e 73 69 67  pageSize, (unsig
6780: 6e 65 64 20 63 68 61 72 20 2a 29 70 50 61 67 65  ned char *)pPage
6790: 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a 73 74 61 74  ->pData);.}.stat
67a0: 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 73 65  ic void pager_se
67b0: 74 5f 70 61 67 65 68 61 73 68 28 50 67 48 64 72  t_pagehash(PgHdr
67c0: 20 2a 70 50 61 67 65 29 7b 0a 20 20 70 50 61 67   *pPage){.  pPag
67d0: 65 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61  e->pageHash = pa
67e0: 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 61  ger_pagehash(pPa
67f0: 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ge);.}../*.** Th
6800: 65 20 43 48 45 43 4b 5f 50 41 47 45 20 6d 61 63  e CHECK_PAGE mac
6810: 72 6f 20 74 61 6b 65 73 20 61 20 50 67 48 64 72  ro takes a PgHdr
6820: 2a 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74  * as an argument
6830: 2e 20 49 66 20 53 51 4c 49 54 45 5f 43 48 45 43  . If SQLITE_CHEC
6840: 4b 5f 50 41 47 45 53 0a 2a 2a 20 69 73 20 64 65  K_PAGES.** is de
6850: 66 69 6e 65 64 2c 20 61 6e 64 20 4e 44 45 42 55  fined, and NDEBU
6860: 47 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64  G is not defined
6870: 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20 73 74  , an assert() st
6880: 61 74 65 6d 65 6e 74 20 63 68 65 63 6b 73 0a 2a  atement checks.*
6890: 2a 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  * that the page 
68a0: 69 73 20 65 69 74 68 65 72 20 64 69 72 74 79 20  is either dirty 
68b0: 6f 72 20 73 74 69 6c 6c 20 6d 61 74 63 68 65 73  or still matches
68c0: 20 74 68 65 20 63 61 6c 63 75 6c 61 74 65 64 20   the calculated 
68d0: 70 61 67 65 2d 68 61 73 68 2e 0a 2a 2f 0a 23 64  page-hash..*/.#d
68e0: 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41 47 45  efine CHECK_PAGE
68f0: 28 78 29 20 63 68 65 63 6b 50 61 67 65 28 78 29  (x) checkPage(x)
6900: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 65  .static void che
6910: 63 6b 50 61 67 65 28 50 67 48 64 72 20 2a 70 50  ckPage(PgHdr *pP
6920: 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g){.  Pager *pPa
6930: 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
6940: 72 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 50  r;.  assert( !pP
6950: 67 2d 3e 70 61 67 65 48 61 73 68 20 7c 7c 20 70  g->pageHash || p
6960: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 0a 20  Pager->errCode. 
6970: 20 20 20 20 20 7c 7c 20 28 70 50 67 2d 3e 66 6c       || (pPg->fl
6980: 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 29  ags&PGHDR_DIRTY)
6990: 20 7c 7c 20 70 50 67 2d 3e 70 61 67 65 48 61 73   || pPg->pageHas
69a0: 68 3d 3d 70 61 67 65 72 5f 70 61 67 65 68 61 73  h==pager_pagehas
69b0: 68 28 70 50 67 29 20 29 3b 0a 7d 0a 0a 23 65 6c  h(pPg) );.}..#el
69c0: 73 65 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72  se.#define pager
69d0: 5f 64 61 74 61 68 61 73 68 28 58 2c 59 29 20 20  _datahash(X,Y)  
69e0: 30 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f  0.#define pager_
69f0: 70 61 67 65 68 61 73 68 28 58 29 20 20 30 0a 23  pagehash(X)  0.#
6a00: 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41 47  define CHECK_PAG
6a10: 45 28 78 29 0a 23 65 6e 64 69 66 20 20 2f 2a 20  E(x).#endif  /* 
6a20: 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
6a30: 45 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57 68 65  ES */../*.** Whe
6a40: 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64  n this is called
6a50: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
6a60: 65 20 66 6f 72 20 70 61 67 65 72 20 70 50 61 67  e for pager pPag
6a70: 65 72 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e  er must be open.
6a80: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
6a90: 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65  n attempts to re
6aa0: 61 64 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  ad a master jour
6ab0: 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 66 72  nal file name fr
6ac0: 6f 6d 20 74 68 65 20 0a 2a 2a 20 65 6e 64 20 6f  om the .** end o
6ad0: 66 20 74 68 65 20 66 69 6c 65 20 61 6e 64 2c 20  f the file and, 
6ae0: 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 63  if successful, c
6af0: 6f 70 69 65 73 20 69 74 20 69 6e 74 6f 20 6d 65  opies it into me
6b00: 6d 6f 72 79 20 73 75 70 70 6c 69 65 64 20 0a 2a  mory supplied .*
6b10: 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e  * by the caller.
6b20: 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62   See comments ab
6b30: 6f 76 65 20 77 72 69 74 65 4d 61 73 74 65 72 4a  ove writeMasterJ
6b40: 6f 75 72 6e 61 6c 28 29 20 66 6f 72 20 74 68 65  ournal() for the
6b50: 20 66 6f 72 6d 61 74 0a 2a 2a 20 75 73 65 64 20   format.** used 
6b60: 74 6f 20 73 74 6f 72 65 20 61 20 6d 61 73 74 65  to store a maste
6b70: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
6b80: 61 6d 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ame at the end o
6b90: 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  f a journal file
6ba0: 2e 0a 2a 2a 0a 2a 2a 20 7a 4d 61 73 74 65 72 20  ..**.** zMaster 
6bb0: 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 20  must point to a 
6bc0: 62 75 66 66 65 72 20 6f 66 20 61 74 20 6c 65 61  buffer of at lea
6bd0: 73 74 20 6e 4d 61 73 74 65 72 20 62 79 74 65 73  st nMaster bytes
6be0: 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a   allocated by.**
6bf0: 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 54 68 69   the caller. Thi
6c00: 73 20 73 68 6f 75 6c 64 20 62 65 20 73 71 6c 69  s should be sqli
6c10: 74 65 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61  te3_vfs.mxPathna
6c20: 6d 65 2b 31 20 28 74 6f 20 65 6e 73 75 72 65 20  me+1 (to ensure 
6c30: 74 68 65 72 65 20 69 73 0a 2a 2a 20 65 6e 6f 75  there is.** enou
6c40: 67 68 20 73 70 61 63 65 20 74 6f 20 77 72 69 74  gh space to writ
6c50: 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
6c60: 72 6e 61 6c 20 6e 61 6d 65 29 2e 20 49 66 20 74  rnal name). If t
6c70: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
6c80: 6c 0a 2a 2a 20 6e 61 6d 65 20 69 6e 20 74 68 65  l.** name in the
6c90: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 6f 6e 67   journal is long
6ca0: 65 72 20 74 68 61 6e 20 6e 4d 61 73 74 65 72 20  er than nMaster 
6cb0: 62 79 74 65 73 20 28 69 6e 63 6c 75 64 69 6e 67  bytes (including
6cc0: 20 61 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e   a.** nul-termin
6cd0: 61 74 6f 72 29 2c 20 74 68 65 6e 20 74 68 69 73  ator), then this
6ce0: 20 69 73 20 68 61 6e 64 6c 65 64 20 61 73 20 69   is handled as i
6cf0: 66 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72  f no master jour
6d00: 6e 61 6c 20 6e 61 6d 65 0a 2a 2a 20 77 65 72 65  nal name.** were
6d10: 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20   present in the 
6d20: 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49  journal..**.** I
6d30: 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
6d40: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20  al file name is 
6d50: 70 72 65 73 65 6e 74 20 61 74 20 74 68 65 20 65  present at the e
6d60: 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  nd of the journa
6d70: 6c 0a 2a 2a 20 66 69 6c 65 2c 20 74 68 65 6e 20  l.** file, then 
6d80: 69 74 20 69 73 20 63 6f 70 69 65 64 20 69 6e 74  it is copied int
6d90: 6f 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69  o the buffer poi
6da0: 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d 61 73 74  nted to by zMast
6db0: 65 72 2e 20 41 0a 2a 2a 20 6e 75 6c 2d 74 65 72  er. A.** nul-ter
6dc0: 6d 69 6e 61 74 6f 72 20 62 79 74 65 20 69 73 20  minator byte is 
6dd0: 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20  appended to the 
6de0: 62 75 66 66 65 72 20 66 6f 6c 6c 6f 77 69 6e 67  buffer following
6df0: 20 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a   the master.** j
6e00: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
6e10: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73  ..**.** If it is
6e20: 20 64 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74   determined that
6e30: 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   no master journ
6e40: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20  al file name is 
6e50: 70 72 65 73 65 6e 74 20 0a 2a 2a 20 7a 4d 61 73  present .** zMas
6e60: 74 65 72 5b 30 5d 20 69 73 20 73 65 74 20 74 6f  ter[0] is set to
6e70: 20 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b   0 and SQLITE_OK
6e80: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
6e90: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
6ea0: 75 72 73 20 77 68 69 6c 65 20 72 65 61 64 69 6e  urs while readin
6eb0: 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  g from the journ
6ec0: 61 6c 20 66 69 6c 65 2c 20 61 6e 20 53 51 4c 69  al file, an SQLi
6ed0: 74 65 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65  te.** error code
6ee0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
6ef0: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64  .static int read
6f00: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 73 71  MasterJournal(sq
6f10: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 72 6e  lite3_file *pJrn
6f20: 6c 2c 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  l, char *zMaster
6f30: 2c 20 75 33 32 20 6e 4d 61 73 74 65 72 29 7b 0a  , u32 nMaster){.
6f40: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
6f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6f60: 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
6f70: 20 75 33 32 20 6c 65 6e 3b 20 20 20 20 20 20 20   u32 len;       
6f80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
6f90: 65 6e 67 74 68 20 69 6e 20 62 79 74 65 73 20 6f  ength in bytes o
6fa0: 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  f master journal
6fb0: 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 36 34 20 73   name */.  i64 s
6fc0: 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  zJ;             
6fd0: 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73        /* Total s
6fe0: 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20  ize in bytes of 
6ff0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 70 4a 72  journal file pJr
7000: 6e 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75  nl */.  u32 cksu
7010: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
7020: 20 20 20 2f 2a 20 4d 4a 20 63 68 65 63 6b 73 75     /* MJ checksu
7030: 6d 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f  m value read fro
7040: 6d 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75  m journal */.  u
7050: 33 32 20 75 3b 20 20 20 20 20 20 20 20 20 20 20  32 u;           
7060: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73            /* Uns
7070: 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74  igned loop count
7080: 65 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  er */.  unsigned
7090: 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b   char aMagic[8];
70a0: 20 20 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74     /* A buffer t
70b0: 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63  o hold the magic
70c0: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 7a 4d 61   header */.  zMa
70d0: 73 74 65 72 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a  ster[0] = '\0';.
70e0: 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
70f0: 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  !=(rc = sqlite3O
7100: 73 46 69 6c 65 53 69 7a 65 28 70 4a 72 6e 6c 2c  sFileSize(pJrnl,
7110: 20 26 73 7a 4a 29 29 0a 20 20 20 7c 7c 20 73 7a   &szJ)).   || sz
7120: 4a 3c 31 36 0a 20 20 20 7c 7c 20 53 51 4c 49 54  J<16.   || SQLIT
7130: 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64  E_OK!=(rc = read
7140: 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a  32bits(pJrnl, sz
7150: 4a 2d 31 36 2c 20 26 6c 65 6e 29 29 0a 20 20 20  J-16, &len)).   
7160: 7c 7c 20 6c 65 6e 3e 3d 6e 4d 61 73 74 65 72 20  || len>=nMaster 
7170: 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b  .   || SQLITE_OK
7180: 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69  !=(rc = read32bi
7190: 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 32  ts(pJrnl, szJ-12
71a0: 2c 20 26 63 6b 73 75 6d 29 29 0a 20 20 20 7c 7c  , &cksum)).   ||
71b0: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
71c0: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
71d0: 70 4a 72 6e 6c 2c 20 61 4d 61 67 69 63 2c 20 38  pJrnl, aMagic, 8
71e0: 2c 20 73 7a 4a 2d 38 29 29 0a 20 20 20 7c 7c 20  , szJ-8)).   || 
71f0: 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61  memcmp(aMagic, a
7200: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29  JournalMagic, 8)
7210: 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b  .   || SQLITE_OK
7220: 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  !=(rc = sqlite3O
7230: 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 7a 4d 61  sRead(pJrnl, zMa
7240: 73 74 65 72 2c 20 6c 65 6e 2c 20 73 7a 4a 2d 31  ster, len, szJ-1
7250: 36 2d 6c 65 6e 29 29 0a 20 20 29 7b 0a 20 20 20  6-len)).  ){.   
7260: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
7270: 0a 20 20 2f 2a 20 53 65 65 20 69 66 20 74 68 65  .  /* See if the
7280: 20 63 68 65 63 6b 73 75 6d 20 6d 61 74 63 68 65   checksum matche
7290: 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  s the master jou
72a0: 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 66  rnal name */.  f
72b0: 6f 72 28 75 3d 30 3b 20 75 3c 6c 65 6e 3b 20 75  or(u=0; u<len; u
72c0: 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2d  ++){.    cksum -
72d0: 3d 20 7a 4d 61 73 74 65 72 5b 75 5d 3b 0a 20 20  = zMaster[u];.  
72e0: 7d 0a 20 20 69 66 28 20 63 6b 73 75 6d 20 29 7b  }.  if( cksum ){
72f0: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63  .    /* If the c
7300: 68 65 63 6b 73 75 6d 20 64 6f 65 73 6e 27 74 20  hecksum doesn't 
7310: 61 64 64 20 75 70 2c 20 74 68 65 6e 20 6f 6e 65  add up, then one
7320: 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20   or more of the 
7330: 64 69 73 6b 20 73 65 63 74 6f 72 73 0a 20 20 20  disk sectors.   
7340: 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74   ** containing t
7350: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
7360: 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 63 6f  l filename is co
7370: 72 72 75 70 74 65 64 2e 20 54 68 69 73 20 6d 65  rrupted. This me
7380: 61 6e 73 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e  ans.    ** defin
7390: 69 74 65 6c 79 20 72 6f 6c 6c 20 62 61 63 6b 2c  itely roll back,
73a0: 20 73 6f 20 6a 75 73 74 20 72 65 74 75 72 6e 20   so just return 
73b0: 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65  SQLITE_OK and re
73c0: 70 6f 72 74 20 61 20 28 6e 75 6c 29 0a 20 20 20  port a (nul).   
73d0: 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e   ** master-journ
73e0: 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 20  al filename..   
73f0: 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 30 3b   */.    len = 0;
7400: 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 5b 6c  .  }.  zMaster[l
7410: 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 0a  en] = '\0';.   .
7420: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7430: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  OK;.}../*.** Ret
7440: 75 72 6e 20 74 68 65 20 6f 66 66 73 65 74 20 6f  urn the offset o
7450: 66 20 74 68 65 20 73 65 63 74 6f 72 20 62 6f 75  f the sector bou
7460: 6e 64 61 72 79 20 61 74 20 6f 72 20 69 6d 6d 65  ndary at or imme
7470: 64 69 61 74 65 6c 79 20 0a 2a 2a 20 66 6f 6c 6c  diately .** foll
7480: 6f 77 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20  owing the value 
7490: 69 6e 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  in pPager->journ
74a0: 61 6c 4f 66 66 2c 20 61 73 73 75 6d 69 6e 67 20  alOff, assuming 
74b0: 61 20 73 65 63 74 6f 72 20 0a 2a 2a 20 73 69 7a  a sector .** siz
74c0: 65 20 6f 66 20 70 50 61 67 65 72 2d 3e 73 65 63  e of pPager->sec
74d0: 74 6f 72 53 69 7a 65 20 62 79 74 65 73 2e 0a 2a  torSize bytes..*
74e0: 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72 20 61 20 73  *.** i.e for a s
74f0: 65 63 74 6f 72 20 73 69 7a 65 20 6f 66 20 35 31  ector size of 51
7500: 32 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 61 67 65 72  2:.**.**   Pager
7510: 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 20 20 20 20  .journalOff     
7520: 20 20 20 20 20 52 65 74 75 72 6e 20 76 61 6c 75       Return valu
7530: 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  e.**   ---------
7540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
7560: 2a 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20  *   0           
7570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0a                0.
7580: 2a 2a 20 20 20 35 31 32 20 20 20 20 20 20 20 20  **   512        
7590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35                 5
75a0: 31 32 0a 2a 2a 20 20 20 31 30 30 20 20 20 20 20  12.**   100     
75b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
75c0: 20 20 35 31 32 0a 2a 2a 20 20 20 32 30 30 30 20    512.**   2000 
75d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
75e0: 20 20 20 20 20 32 30 34 38 0a 2a 2a 20 0a 2a 2f       2048.** .*/
75f0: 0a 73 74 61 74 69 63 20 69 36 34 20 6a 6f 75 72  .static i64 jour
7600: 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 50 61 67  nalHdrOffset(Pag
7610: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
7620: 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20  64 offset = 0;. 
7630: 20 69 36 34 20 63 20 3d 20 70 50 61 67 65 72 2d   i64 c = pPager-
7640: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 69  >journalOff;.  i
7650: 66 28 20 63 20 29 7b 0a 20 20 20 20 6f 66 66 73  f( c ){.    offs
7660: 65 74 20 3d 20 28 28 63 2d 31 29 2f 4a 4f 55 52  et = ((c-1)/JOUR
7670: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
7680: 72 29 20 2b 20 31 29 20 2a 20 4a 4f 55 52 4e 41  r) + 1) * JOURNA
7690: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
76a0: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
76b0: 6f 66 66 73 65 74 25 4a 4f 55 52 4e 41 4c 5f 48  offset%JOURNAL_H
76c0: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 30  DR_SZ(pPager)==0
76d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66   );.  assert( of
76e0: 66 73 65 74 3e 3d 63 20 29 3b 0a 20 20 61 73 73  fset>=c );.  ass
76f0: 65 72 74 28 20 28 6f 66 66 73 65 74 2d 63 29 3c  ert( (offset-c)<
7700: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
7710: 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74 75  Pager) );.  retu
7720: 72 6e 20 6f 66 66 73 65 74 3b 0a 7d 0a 0a 2f 2a  rn offset;.}../*
7730: 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  .** The journal 
7740: 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65  file must be ope
7750: 6e 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  n when this func
7760: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tion is called..
7770: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
7780: 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69  ion is a no-op i
7790: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
77a0: 6c 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  le has not been 
77b0: 77 72 69 74 74 65 6e 20 74 6f 0a 2a 2a 20 77 69  written to.** wi
77c0: 74 68 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  thin the current
77d0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69 2e   transaction (i.
77e0: 65 2e 20 69 66 20 50 61 67 65 72 2e 6a 6f 75 72  e. if Pager.jour
77f0: 6e 61 6c 4f 66 66 3d 3d 30 29 2e 0a 2a 2a 0a 2a  nalOff==0)..**.*
7800: 2a 20 49 66 20 64 6f 54 72 75 6e 63 61 74 65 20  * If doTruncate 
7810: 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 72 20 74  is non-zero or t
7820: 68 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  he Pager.journal
7830: 53 69 7a 65 4c 69 6d 69 74 20 76 61 72 69 61 62  SizeLimit variab
7840: 6c 65 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20  le is.** set to 
7850: 30 2c 20 74 68 65 6e 20 74 72 75 6e 63 61 74 65  0, then truncate
7860: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
7870: 65 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 20  e to zero bytes 
7880: 69 6e 20 73 69 7a 65 2e 20 4f 74 68 65 72 77 69  in size. Otherwi
7890: 73 65 2c 0a 2a 2a 20 7a 65 72 6f 20 74 68 65 20  se,.** zero the 
78a0: 32 38 2d 62 79 74 65 20 68 65 61 64 65 72 20 61  28-byte header a
78b0: 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
78c0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
78d0: 20 49 6e 20 65 69 74 68 65 72 20 63 61 73 65 2c   In either case,
78e0: 20 0a 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65   .** if the page
78f0: 72 20 69 73 20 6e 6f 74 20 69 6e 20 6e 6f 2d 73  r is not in no-s
7900: 79 6e 63 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74  ync mode, sync t
7910: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
7920: 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a 2a 2a 20  immediately .** 
7930: 61 66 74 65 72 20 77 72 69 74 69 6e 67 20 6f 72  after writing or
7940: 20 74 72 75 6e 63 61 74 69 6e 67 20 69 74 2e 0a   truncating it..
7950: 2a 2a 0a 2a 2a 20 49 66 20 50 61 67 65 72 2e 6a  **.** If Pager.j
7960: 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20  ournalSizeLimit 
7970: 69 73 20 73 65 74 20 74 6f 20 61 20 70 6f 73 69  is set to a posi
7980: 74 69 76 65 2c 20 6e 6f 6e 2d 7a 65 72 6f 20 76  tive, non-zero v
7990: 61 6c 75 65 2c 20 61 6e 64 0a 2a 2a 20 66 6f 6c  alue, and.** fol
79a0: 6c 6f 77 69 6e 67 20 74 68 65 20 74 72 75 6e 63  lowing the trunc
79b0: 61 74 69 6f 6e 20 6f 72 20 7a 65 72 6f 69 6e 67  ation or zeroing
79c0: 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65   described above
79d0: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
79e0: 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   .** journal fil
79f0: 65 20 69 6e 20 62 79 74 65 73 20 69 73 20 6c 61  e in bytes is la
7a00: 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 20 76  rger than this v
7a10: 61 6c 75 65 2c 20 74 68 65 6e 20 74 72 75 6e 63  alue, then trunc
7a20: 61 74 65 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e  ate the.** journ
7a30: 61 6c 20 66 69 6c 65 20 74 6f 20 50 61 67 65 72  al file to Pager
7a40: 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69  .journalSizeLimi
7a50: 74 20 62 79 74 65 73 2e 20 54 68 65 20 6a 6f 75  t bytes. The jou
7a60: 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 0a 2a  rnal file does.*
7a70: 2a 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  * not need to be
7a80: 20 73 79 6e 63 65 64 20 66 6f 6c 6c 6f 77 69 6e   synced followin
7a90: 67 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  g this operation
7aa0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f  ..**.** If an IO
7ab0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61   error occurs, a
7ac0: 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73 73 69 6e  bandon processin
7ad0: 67 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65  g and return the
7ae0: 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a   IO error code..
7af0: 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65  ** Otherwise, re
7b00: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  turn SQLITE_OK..
7b10: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 7a 65  */.static int ze
7b20: 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67  roJournalHdr(Pag
7b30: 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
7b40: 64 6f 54 72 75 6e 63 61 74 65 29 7b 0a 20 20 69  doTruncate){.  i
7b50: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
7b60: 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
7b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b80: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
7b90: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  */.  assert( isO
7ba0: 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
7bb0: 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
7bc0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a  ->journalOff ){.
7bd0: 20 20 20 20 63 6f 6e 73 74 20 69 36 34 20 69 4c      const i64 iL
7be0: 69 6d 69 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a  imit = pPager->j
7bf0: 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b  ournalSizeLimit;
7c00: 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63      /* Local cac
7c10: 68 65 20 6f 66 20 6a 73 6c 20 2a 2f 0a 0a 20 20  he of jsl */..  
7c20: 20 20 49 4f 54 52 41 43 45 28 28 22 4a 5a 45 52    IOTRACE(("JZER
7c30: 4f 48 44 52 20 25 70 5c 6e 22 2c 20 70 50 61 67  OHDR %p\n", pPag
7c40: 65 72 29 29 0a 20 20 20 20 69 66 28 20 64 6f 54  er)).    if( doT
7c50: 72 75 6e 63 61 74 65 20 7c 7c 20 69 4c 69 6d 69  runcate || iLimi
7c60: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  t==0 ){.      rc
7c70: 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e   = sqlite3OsTrun
7c80: 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  cate(pPager->jfd
7c90: 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 0);.    }else{
7ca0: 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f  .      static co
7cb0: 6e 73 74 20 63 68 61 72 20 7a 65 72 6f 48 64 72  nst char zeroHdr
7cc0: 5b 32 38 5d 20 3d 20 7b 30 7d 3b 0a 20 20 20 20  [28] = {0};.    
7cd0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
7ce0: 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  Write(pPager->jf
7cf0: 64 2c 20 7a 65 72 6f 48 64 72 2c 20 73 69 7a 65  d, zeroHdr, size
7d00: 6f 66 28 7a 65 72 6f 48 64 72 29 2c 20 30 29 3b  of(zeroHdr), 0);
7d10: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
7d20: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
7d30: 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20  !pPager->noSync 
7d40: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
7d50: 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67  lite3OsSync(pPag
7d60: 65 72 2d 3e 6a 66 64 2c 20 53 51 4c 49 54 45 5f  er->jfd, SQLITE_
7d70: 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 7c 70 50  SYNC_DATAONLY|pP
7d80: 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73  ager->sync_flags
7d90: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
7da0: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74   At this point t
7db0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
7dc0: 73 20 63 6f 6d 6d 69 74 74 65 64 20 62 75 74 20  s committed but 
7dd0: 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 0a  the write lock .
7de0: 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20      ** is still 
7df0: 68 65 6c 64 20 6f 6e 20 74 68 65 20 66 69 6c 65  held on the file
7e00: 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20  . If there is a 
7e10: 73 69 7a 65 20 6c 69 6d 69 74 20 63 6f 6e 66 69  size limit confi
7e20: 67 75 72 65 64 20 66 6f 72 20 0a 20 20 20 20 2a  gured for .    *
7e30: 2a 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74  * the persistent
7e40: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 65   journal and the
7e50: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 75   journal file cu
7e60: 72 72 65 6e 74 6c 79 20 63 6f 6e 73 75 6d 65 73  rrently consumes
7e70: 20 6d 6f 72 65 0a 20 20 20 20 2a 2a 20 73 70 61   more.    ** spa
7e80: 63 65 20 74 68 61 6e 20 74 68 61 74 20 6c 69 6d  ce than that lim
7e90: 69 74 20 61 6c 6c 6f 77 73 20 66 6f 72 2c 20 74  it allows for, t
7ea0: 72 75 6e 63 61 74 65 20 69 74 20 6e 6f 77 2e 20  runcate it now. 
7eb0: 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  There is no need
7ec0: 0a 20 20 20 20 2a 2a 20 74 6f 20 73 79 6e 63 20  .    ** to sync 
7ed0: 74 68 65 20 66 69 6c 65 20 66 6f 6c 6c 6f 77 69  the file followi
7ee0: 6e 67 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f  ng this operatio
7ef0: 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
7f00: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
7f10: 26 26 20 69 4c 69 6d 69 74 3e 30 20 29 7b 0a 20  && iLimit>0 ){. 
7f20: 20 20 20 20 20 69 36 34 20 73 7a 3b 0a 20 20 20       i64 sz;.   
7f30: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
7f40: 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
7f50: 2d 3e 6a 66 64 2c 20 26 73 7a 29 3b 0a 20 20 20  ->jfd, &sz);.   
7f60: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
7f70: 45 5f 4f 4b 20 26 26 20 73 7a 3e 69 4c 69 6d 69  E_OK && sz>iLimi
7f80: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  t ){.        rc 
7f90: 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63  = sqlite3OsTrunc
7fa0: 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ate(pPager->jfd,
7fb0: 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20   iLimit);.      
7fc0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
7fd0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
7fe0: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
7ff0: 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20  le must be open 
8000: 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
8010: 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a  e is called. A j
8020: 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65 61 64 65 72  ournal.** header
8030: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
8040: 20 62 79 74 65 73 29 20 69 73 20 77 72 69 74 74   bytes) is writt
8050: 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  en into the jour
8060: 6e 61 6c 20 66 69 6c 65 20 61 74 20 74 68 65 0a  nal file at the.
8070: 2a 2a 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  ** current locat
8080: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  ion..**.** The f
8090: 6f 72 6d 61 74 20 66 6f 72 20 74 68 65 20 6a 6f  ormat for the jo
80a0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20  urnal header is 
80b0: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d  as follows:.** -
80c0: 20 38 20 62 79 74 65 73 3a 20 4d 61 67 69 63 20   8 bytes: Magic 
80d0: 69 64 65 6e 74 69 66 79 69 6e 67 20 6a 6f 75 72  identifying jour
80e0: 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d  nal format..** -
80f0: 20 34 20 62 79 74 65 73 3a 20 4e 75 6d 62 65 72   4 bytes: Number
8100: 20 6f 66 20 72 65 63 6f 72 64 73 20 69 6e 20 6a   of records in j
8110: 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f  ournal, or -1 no
8120: 2d 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 6f 6e  -sync mode is on
8130: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
8140: 52 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 75 73  Random number us
8150: 65 64 20 66 6f 72 20 70 61 67 65 20 68 61 73 68  ed for page hash
8160: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
8170: 49 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73 65  Initial database
8180: 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20   page count..** 
8190: 2d 20 34 20 62 79 74 65 73 3a 20 53 65 63 74 6f  - 4 bytes: Secto
81a0: 72 20 73 69 7a 65 20 75 73 65 64 20 62 79 20 74  r size used by t
81b0: 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20  he process that 
81c0: 77 72 6f 74 65 20 74 68 69 73 20 6a 6f 75 72 6e  wrote this journ
81d0: 61 6c 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73  al..** - 4 bytes
81e0: 3a 20 44 61 74 61 62 61 73 65 20 70 61 67 65 20  : Database page 
81f0: 73 69 7a 65 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c  size..** .** Fol
8200: 6c 6f 77 65 64 20 62 79 20 28 4a 4f 55 52 4e 41  lowed by (JOURNA
8210: 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38 29 20 62  L_HDR_SZ - 28) b
8220: 79 74 65 73 20 6f 66 20 75 6e 75 73 65 64 20 73  ytes of unused s
8230: 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pace..*/.static 
8240: 69 6e 74 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  int writeJournal
8250: 48 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  Hdr(Pager *pPage
8260: 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
8270: 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
8280: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
8290: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 63 68  urn code */.  ch
82a0: 61 72 20 2a 7a 48 65 61 64 65 72 20 3d 20 70 50  ar *zHeader = pP
82b0: 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
82c0: 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 73    /* Temporary s
82d0: 70 61 63 65 20 75 73 65 64 20 74 6f 20 62 75 69  pace used to bui
82e0: 6c 64 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75  ld header */.  u
82f0: 33 32 20 6e 48 65 61 64 65 72 20 3d 20 70 50 61  32 nHeader = pPa
8300: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20 20  ger->pageSize;  
8310: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75     /* Size of bu
8320: 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20  ffer pointed to 
8330: 62 79 20 7a 48 65 61 64 65 72 20 2a 2f 0a 20 20  by zHeader */.  
8340: 75 33 32 20 6e 57 72 69 74 65 3b 20 20 20 20 20  u32 nWrite;     
8350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8360: 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
8370: 68 65 61 64 65 72 20 73 65 63 74 6f 72 20 77 72  header sector wr
8380: 69 74 74 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  itten */.  int i
8390: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
83a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
83b0: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
83c0: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  /..  assert( isO
83d0: 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
83e0: 20 29 3b 20 20 20 20 20 20 2f 2a 20 4a 6f 75 72   );      /* Jour
83f0: 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65  nal file must be
8400: 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20 69 66 28   open. */..  if(
8410: 20 6e 48 65 61 64 65 72 3e 4a 4f 55 52 4e 41 4c   nHeader>JOURNAL
8420: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
8430: 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20 3d  ){.    nHeader =
8440: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
8450: 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20  pPager);.  }..  
8460: 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
8470: 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74  active savepoint
8480: 73 20 61 6e 64 20 61 6e 79 20 6f 66 20 74 68 65  s and any of the
8490: 6d 20 77 65 72 65 20 63 72 65 61 74 65 64 20 0a  m were created .
84a0: 20 20 2a 2a 20 73 69 6e 63 65 20 74 68 65 20 6d    ** since the m
84b0: 6f 73 74 20 72 65 63 65 6e 74 20 6a 6f 75 72 6e  ost recent journ
84c0: 61 6c 20 68 65 61 64 65 72 20 77 61 73 20 77 72  al header was wr
84d0: 69 74 74 65 6e 2c 20 75 70 64 61 74 65 20 74 68  itten, update th
84e0: 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 53 61 76  e .  ** PagerSav
84f0: 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65  epoint.iHdrOffse
8500: 74 20 66 69 65 6c 64 73 20 6e 6f 77 2e 0a 20 20  t fields now..  
8510: 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  */.  for(ii=0; i
8520: 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70  i<pPager->nSavep
8530: 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  oint; ii++){.   
8540: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 53 61   if( pPager->aSa
8550: 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69 48 64 72  vepoint[ii].iHdr
8560: 4f 66 66 73 65 74 3d 3d 30 20 29 7b 0a 20 20 20  Offset==0 ){.   
8570: 20 20 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65     pPager->aSave
8580: 70 6f 69 6e 74 5b 69 69 5d 2e 69 48 64 72 4f 66  point[ii].iHdrOf
8590: 66 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a  fset = pPager->j
85a0: 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 7d  ournalOff;.    }
85b0: 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e  .  }..  pPager->
85c0: 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61  journalHdr = pPa
85d0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
85e0: 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73  = journalHdrOffs
85f0: 65 74 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 2f  et(pPager);..  /
8600: 2a 20 0a 20 20 2a 2a 20 57 72 69 74 65 20 74 68  * .  ** Write th
8610: 65 20 6e 52 65 63 20 46 69 65 6c 64 20 2d 20 74  e nRec Field - t
8620: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
8630: 65 20 72 65 63 6f 72 64 73 20 74 68 61 74 20 66  e records that f
8640: 6f 6c 6c 6f 77 20 74 68 69 73 0a 20 20 2a 2a 20  ollow this.  ** 
8650: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20  journal header. 
8660: 4e 6f 72 6d 61 6c 6c 79 2c 20 7a 65 72 6f 20 69  Normally, zero i
8670: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 69  s written to thi
8680: 73 20 76 61 6c 75 65 20 61 74 20 74 68 69 73 20  s value at this 
8690: 74 69 6d 65 2e 0a 20 20 2a 2a 20 41 66 74 65 72  time..  ** After
86a0: 20 74 68 65 20 72 65 63 6f 72 64 73 20 61 72 65   the records are
86b0: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6a 6f   added to the jo
86c0: 75 72 6e 61 6c 20 28 61 6e 64 20 74 68 65 20 6a  urnal (and the j
86d0: 6f 75 72 6e 61 6c 20 73 79 6e 63 65 64 2c 20 0a  ournal synced, .
86e0: 20 20 2a 2a 20 69 66 20 69 6e 20 66 75 6c 6c 2d    ** if in full-
86f0: 73 79 6e 63 20 6d 6f 64 65 29 2c 20 74 68 65 20  sync mode), the 
8700: 7a 65 72 6f 20 69 73 20 6f 76 65 72 77 72 69 74  zero is overwrit
8710: 74 65 6e 20 77 69 74 68 20 74 68 65 20 74 72 75  ten with the tru
8720: 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 6f 66  e number.  ** of
8730: 20 72 65 63 6f 72 64 73 20 28 73 65 65 20 73 79   records (see sy
8740: 6e 63 4a 6f 75 72 6e 61 6c 28 29 29 2e 0a 20 20  ncJournal())..  
8750: 2a 2a 0a 20 20 2a 2a 20 41 20 66 61 73 74 65 72  **.  ** A faster
8760: 20 61 6c 74 65 72 6e 61 74 69 76 65 20 69 73 20   alternative is 
8770: 74 6f 20 77 72 69 74 65 20 30 78 46 46 46 46 46  to write 0xFFFFF
8780: 46 46 46 20 74 6f 20 74 68 65 20 6e 52 65 63 20  FFF to the nRec 
8790: 66 69 65 6c 64 2e 20 57 68 65 6e 0a 20 20 2a 2a  field. When.  **
87a0: 20 72 65 61 64 69 6e 67 20 74 68 65 20 6a 6f 75   reading the jou
87b0: 72 6e 61 6c 20 74 68 69 73 20 76 61 6c 75 65 20  rnal this value 
87c0: 74 65 6c 6c 73 20 53 51 4c 69 74 65 20 74 6f 20  tells SQLite to 
87d0: 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 0a  assume that the.
87e0: 20 20 2a 2a 20 72 65 73 74 20 6f 66 20 74 68 65    ** rest of the
87f0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f   journal file co
8800: 6e 74 61 69 6e 73 20 76 61 6c 69 64 20 70 61 67  ntains valid pag
8810: 65 20 72 65 63 6f 72 64 73 2e 20 54 68 69 73 20  e records. This 
8820: 61 73 73 75 6d 70 74 69 6f 6e 0a 20 20 2a 2a 20  assumption.  ** 
8830: 69 73 20 64 61 6e 67 65 72 6f 75 73 2c 20 61 73  is dangerous, as
8840: 20 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f 63   if a failure oc
8850: 63 75 72 72 65 64 20 77 68 69 6c 73 74 20 77 72  curred whilst wr
8860: 69 74 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75  iting to the jou
8870: 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69  rnal.  ** file i
8880: 74 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 73 6f  t may contain so
8890: 6d 65 20 67 61 72 62 61 67 65 20 64 61 74 61 2e  me garbage data.
88a0: 20 54 68 65 72 65 20 61 72 65 20 74 77 6f 20 73   There are two s
88b0: 63 65 6e 61 72 69 6f 73 0a 20 20 2a 2a 20 77 68  cenarios.  ** wh
88c0: 65 72 65 20 74 68 69 73 20 72 69 73 6b 20 63 61  ere this risk ca
88d0: 6e 20 62 65 20 69 67 6e 6f 72 65 64 3a 0a 20 20  n be ignored:.  
88e0: 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e  **.  **   * When
88f0: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
8900: 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 43   no-sync mode. C
8910: 6f 72 72 75 70 74 69 6f 6e 20 63 61 6e 20 66 6f  orruption can fo
8920: 6c 6c 6f 77 20 61 0a 20 20 2a 2a 20 20 20 20 20  llow a.  **     
8930: 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 69 6e  power failure in
8940: 20 74 68 69 73 20 63 61 73 65 20 61 6e 79 77 61   this case anywa
8950: 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a  y..  **.  **   *
8960: 20 57 68 65 6e 20 74 68 65 20 53 51 4c 49 54 45   When the SQLITE
8970: 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45  _IOCAP_SAFE_APPE
8980: 4e 44 20 66 6c 61 67 20 69 73 20 73 65 74 2e 20  ND flag is set. 
8990: 54 68 69 73 20 67 75 61 72 61 6e 74 65 65 73 0a  This guarantees.
89a0: 20 20 2a 2a 20 20 20 20 20 74 68 61 74 20 67 61    **     that ga
89b0: 72 62 61 67 65 20 64 61 74 61 20 69 73 20 6e 65  rbage data is ne
89c0: 76 65 72 20 61 70 70 65 6e 64 65 64 20 74 6f 20  ver appended to 
89d0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
89e0: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
89f0: 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
8a00: 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e  fd) || pPager->n
8a10: 6f 53 79 6e 63 20 29 3b 0a 20 20 69 66 28 20 28  oSync );.  if( (
8a20: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 29 20  pPager->noSync) 
8a30: 7c 7c 20 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72  || (pPager->jour
8a40: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
8a50: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
8a60: 59 29 0a 20 20 20 7c 7c 20 28 73 71 6c 69 74 65  Y).   || (sqlite
8a70: 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
8a80: 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
8a90: 3e 66 64 29 26 53 51 4c 49 54 45 5f 49 4f 43 41  >fd)&SQLITE_IOCA
8aa0: 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20 0a  P_SAFE_APPEND) .
8ab0: 20 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28    ){.    memcpy(
8ac0: 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61  zHeader, aJourna
8ad0: 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61  lMagic, sizeof(a
8ae0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a  JournalMagic));.
8af0: 20 20 20 20 70 75 74 33 32 62 69 74 73 28 26 7a      put32bits(&z
8b00: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
8b10: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 30  ournalMagic)], 0
8b20: 78 66 66 66 66 66 66 66 66 29 3b 0a 20 20 7d 65  xffffffff);.  }e
8b30: 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28  lse{.    memset(
8b40: 7a 48 65 61 64 65 72 2c 20 30 2c 20 73 69 7a 65  zHeader, 0, size
8b50: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
8b60: 29 2b 34 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  )+4);.  }..  /* 
8b70: 54 68 65 20 72 61 6e 64 6f 6d 20 63 68 65 63 6b  The random check
8b80: 2d 68 61 73 68 20 69 6e 69 74 69 61 6c 69 73 65  -hash initialise
8b90: 72 20 2a 2f 20 0a 20 20 73 71 6c 69 74 65 33 5f  r */ .  sqlite3_
8ba0: 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f  randomness(sizeo
8bb0: 66 28 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  f(pPager->cksumI
8bc0: 6e 69 74 29 2c 20 26 70 50 61 67 65 72 2d 3e 63  nit), &pPager->c
8bd0: 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 70 75 74  ksumInit);.  put
8be0: 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
8bf0: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
8c00: 61 67 69 63 29 2b 34 5d 2c 20 70 50 61 67 65 72  agic)+4], pPager
8c10: 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20  ->cksumInit);.  
8c20: 2f 2a 20 54 68 65 20 69 6e 69 74 69 61 6c 20 64  /* The initial d
8c30: 61 74 61 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a  atabase size */.
8c40: 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65    put32bits(&zHe
8c50: 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
8c60: 72 6e 61 6c 4d 61 67 69 63 29 2b 38 5d 2c 20 70  rnalMagic)+8], p
8c70: 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
8c80: 65 29 3b 0a 20 20 2f 2a 20 54 68 65 20 61 73 73  e);.  /* The ass
8c90: 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65  umed sector size
8ca0: 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73   for this proces
8cb0: 73 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73  s */.  put32bits
8cc0: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
8cd0: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
8ce0: 31 32 5d 2c 20 70 50 61 67 65 72 2d 3e 73 65 63  12], pPager->sec
8cf0: 74 6f 72 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20  torSize);..  /* 
8d00: 54 68 65 20 70 61 67 65 20 73 69 7a 65 20 2a 2f  The page size */
8d10: 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48  .  put32bits(&zH
8d20: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
8d30: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 36 5d 2c  urnalMagic)+16],
8d40: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
8d50: 65 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61  e);..  /* Initia
8d60: 6c 69 7a 69 6e 67 20 74 68 65 20 74 61 69 6c 20  lizing the tail 
8d70: 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 69 73  of the buffer is
8d80: 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 2e 20   not necessary. 
8d90: 20 45 76 65 72 79 74 68 69 6e 67 0a 20 20 2a 2a   Everything.  **
8da0: 20 77 6f 72 6b 73 20 66 69 6e 64 20 69 66 20 74   works find if t
8db0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 65 6d  he following mem
8dc0: 73 65 74 28 29 20 69 73 20 6f 6d 69 74 74 65 64  set() is omitted
8dd0: 2e 20 20 42 75 74 20 69 6e 69 74 69 61 6c 69 7a  .  But initializ
8de0: 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 65 6d  ing.  ** the mem
8df0: 6f 72 79 20 70 72 65 76 65 6e 74 73 20 76 61 6c  ory prevents val
8e00: 67 72 69 6e 64 20 66 72 6f 6d 20 63 6f 6d 70 6c  grind from compl
8e10: 61 69 6e 69 6e 67 2c 20 73 6f 20 77 65 20 61 72  aining, so we ar
8e20: 65 20 77 69 6c 6c 69 6e 67 20 74 6f 0a 20 20 2a  e willing to.  *
8e30: 2a 20 74 61 6b 65 20 74 68 65 20 70 65 72 66 6f  * take the perfo
8e40: 72 6d 61 6e 63 65 20 68 69 74 2e 0a 20 20 2a 2f  rmance hit..  */
8e50: 0a 20 20 6d 65 6d 73 65 74 28 26 7a 48 65 61 64  .  memset(&zHead
8e60: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
8e70: 61 6c 4d 61 67 69 63 29 2b 32 30 5d 2c 20 30 2c  alMagic)+20], 0,
8e80: 0a 20 20 20 20 20 20 20 20 20 6e 48 65 61 64 65  .         nHeade
8e90: 72 2d 28 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  r-(sizeof(aJourn
8ea0: 61 6c 4d 61 67 69 63 29 2b 32 30 29 29 3b 0a 0a  alMagic)+20));..
8eb0: 20 20 2f 2a 20 49 6e 20 74 68 65 6f 72 79 2c 20    /* In theory, 
8ec0: 69 74 20 69 73 20 6f 6e 6c 79 20 6e 65 63 65 73  it is only neces
8ed0: 73 61 72 79 20 74 6f 20 77 72 69 74 65 20 74 68  sary to write th
8ee0: 65 20 32 38 20 62 79 74 65 73 20 74 68 61 74 20  e 28 bytes that 
8ef0: 74 68 65 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  the .  ** journa
8f00: 6c 20 68 65 61 64 65 72 20 63 6f 6e 73 75 6d 65  l header consume
8f10: 73 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s to the journal
8f20: 20 66 69 6c 65 20 68 65 72 65 2e 20 54 68 65 6e   file here. Then
8f30: 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 0a   increment the .
8f40: 20 20 2a 2a 20 50 61 67 65 72 2e 6a 6f 75 72 6e    ** Pager.journ
8f50: 61 6c 4f 66 66 20 76 61 72 69 61 62 6c 65 20 62  alOff variable b
8f60: 79 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  y JOURNAL_HDR_SZ
8f70: 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e 65 78   so that the nex
8f80: 74 20 0a 20 20 2a 2a 20 72 65 63 6f 72 64 20 69  t .  ** record i
8f90: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  s written to the
8fa0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 63 74 6f   following secto
8fb0: 72 20 28 6c 65 61 76 69 6e 67 20 61 20 67 61 70  r (leaving a gap
8fc0: 20 69 6e 20 74 68 65 20 66 69 6c 65 0a 20 20 2a   in the file.  *
8fd0: 2a 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 69  * that will be i
8fe0: 6d 70 6c 69 63 69 74 6c 79 20 66 69 6c 6c 65 64  mplicitly filled
8ff0: 20 69 6e 20 62 79 20 74 68 65 20 4f 53 29 2e 0a   in by the OS)..
9000: 20 20 2a 2a 0a 20 20 2a 2a 20 48 6f 77 65 76 65    **.  ** Howeve
9010: 72 20 69 74 20 68 61 73 20 62 65 65 6e 20 64 69  r it has been di
9020: 73 63 6f 76 65 72 65 64 20 74 68 61 74 20 6f 6e  scovered that on
9030: 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 20 74 68   some systems th
9040: 69 73 20 70 61 74 74 65 72 6e 20 63 61 6e 20 0a  is pattern can .
9050: 20 20 2a 2a 20 62 65 20 73 69 67 6e 69 66 69 63    ** be signific
9060: 61 6e 74 6c 79 20 73 6c 6f 77 65 72 20 74 68 61  antly slower tha
9070: 6e 20 63 6f 6e 74 69 67 75 6f 75 73 6c 79 20 77  n contiguously w
9080: 72 69 74 69 6e 67 20 64 61 74 61 20 74 6f 20 74  riting data to t
9090: 68 65 20 66 69 6c 65 2c 0a 20 20 2a 2a 20 65 76  he file,.  ** ev
90a0: 65 6e 20 69 66 20 74 68 61 74 20 6d 65 61 6e 73  en if that means
90b0: 20 65 78 70 6c 69 63 69 74 6c 79 20 77 72 69 74   explicitly writ
90c0: 69 6e 67 20 64 61 74 61 20 74 6f 20 74 68 65 20  ing data to the 
90d0: 62 6c 6f 63 6b 20 6f 66 20 0a 20 20 2a 2a 20 28  block of .  ** (
90e0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d  JOURNAL_HDR_SZ -
90f0: 20 32 38 29 20 62 79 74 65 73 20 74 68 61 74 20   28) bytes that 
9100: 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 73 65 64  will not be used
9110: 2e 20 53 6f 20 74 68 61 74 20 69 73 20 77 68 61  . So that is wha
9120: 74 0a 20 20 2a 2a 20 69 73 20 64 6f 6e 65 2e 20  t.  ** is done. 
9130: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6c  .  **.  ** The l
9140: 6f 6f 70 20 69 73 20 72 65 71 75 69 72 65 64 20  oop is required 
9150: 68 65 72 65 20 69 6e 20 63 61 73 65 20 74 68 65  here in case the
9160: 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 69 73 20   sector-size is 
9170: 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20  larger than the 
9180: 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 70  .  ** database p
9190: 61 67 65 20 73 69 7a 65 2e 20 53 69 6e 63 65 20  age size. Since 
91a0: 74 68 65 20 7a 48 65 61 64 65 72 20 62 75 66 66  the zHeader buff
91b0: 65 72 20 69 73 20 6f 6e 6c 79 20 50 61 67 65 72  er is only Pager
91c0: 2e 70 61 67 65 53 69 7a 65 0a 20 20 2a 2a 20 62  .pageSize.  ** b
91d0: 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 6d 6f  ytes in size, mo
91e0: 72 65 20 74 68 61 6e 20 6f 6e 65 20 63 61 6c 6c  re than one call
91f0: 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 57 72 69   to sqlite3OsWri
9200: 74 65 28 29 20 6d 61 79 20 62 65 20 72 65 71 75  te() may be requ
9210: 69 72 65 64 0a 20 20 2a 2a 20 74 6f 20 70 6f 70  ired.  ** to pop
9220: 75 6c 61 74 65 20 74 68 65 20 65 6e 74 69 72 65  ulate the entire
9230: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
9240: 73 65 63 74 6f 72 2e 0a 20 20 2a 2f 20 0a 20 20  sector..  */ .  
9250: 66 6f 72 28 6e 57 72 69 74 65 3d 30 3b 20 72 63  for(nWrite=0; rc
9260: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 26 26 6e 57 72  ==SQLITE_OK&&nWr
9270: 69 74 65 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ite<JOURNAL_HDR_
9280: 53 5a 28 70 50 61 67 65 72 29 3b 20 6e 57 72 69  SZ(pPager); nWri
9290: 74 65 2b 3d 6e 48 65 61 64 65 72 29 7b 0a 20 20  te+=nHeader){.  
92a0: 20 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52    IOTRACE(("JHDR
92b0: 20 25 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20   %p %lld %d\n", 
92c0: 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
92d0: 6a 6f 75 72 6e 61 6c 48 64 72 2c 20 6e 48 65 61  journalHdr, nHea
92e0: 64 65 72 29 29 0a 20 20 20 20 72 63 20 3d 20 73  der)).    rc = s
92f0: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
9300: 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64  ager->jfd, zHead
9310: 65 72 2c 20 6e 48 65 61 64 65 72 2c 20 70 50 61  er, nHeader, pPa
9320: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  ger->journalOff)
9330: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
9340: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
9350: 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   <= pPager->jour
9360: 6e 61 6c 4f 66 66 20 29 3b 0a 20 20 20 20 70 50  nalOff );.    pP
9370: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
9380: 20 2b 3d 20 6e 48 65 61 64 65 72 3b 0a 20 20 7d   += nHeader;.  }
9390: 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
93a0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72  ../*.** The jour
93b0: 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65  nal file must be
93c0: 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20   open when this 
93d0: 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75  is called. A jou
93e0: 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65  rnal header file
93f0: 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52  .** (JOURNAL_HDR
9400: 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20 72 65  _SZ bytes) is re
9410: 61 64 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72  ad from the curr
9420: 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20  ent location in 
9430: 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66  the journal.** f
9440: 69 6c 65 2e 20 54 68 65 20 63 75 72 72 65 6e 74  ile. The current
9450: 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65   location in the
9460: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
9470: 20 67 69 76 65 6e 20 62 79 0a 2a 2a 20 70 50 61   given by.** pPa
9480: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2e  ger->journalOff.
9490: 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62   See comments ab
94a0: 6f 76 65 20 66 75 6e 63 74 69 6f 6e 20 77 72 69  ove function wri
94b0: 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 66  teJournalHdr() f
94c0: 6f 72 0a 2a 2a 20 61 20 64 65 73 63 72 69 70 74  or.** a descript
94d0: 69 6f 6e 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ion of the journ
94e0: 61 6c 20 68 65 61 64 65 72 20 66 6f 72 6d 61 74  al header format
94f0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 68  ..**.** If the h
9500: 65 61 64 65 72 20 69 73 20 72 65 61 64 20 73 75  eader is read su
9510: 63 63 65 73 73 66 75 6c 6c 79 2c 20 2a 70 4e 52  ccessfully, *pNR
9520: 65 63 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ec is set to the
9530: 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61   number of.** pa
9540: 67 65 20 72 65 63 6f 72 64 73 20 66 6f 6c 6c 6f  ge records follo
9550: 77 69 6e 67 20 74 68 69 73 20 68 65 61 64 65 72  wing this header
9560: 20 61 6e 64 20 2a 70 44 62 53 69 7a 65 20 69 73   and *pDbSize is
9570: 20 73 65 74 20 74 6f 20 74 68 65 20 73 69 7a 65   set to the size
9580: 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   of the.** datab
9590: 61 73 65 20 62 65 66 6f 72 65 20 74 68 65 20 74  ase before the t
95a0: 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 67 61 6e  ransaction began
95b0: 2c 20 69 6e 20 70 61 67 65 73 2e 20 41 6c 73 6f  , in pages. Also
95c0: 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  , pPager->cksumI
95d0: 6e 69 74 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f  nit.** is set to
95e0: 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20   the value read 
95f0: 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
9600: 20 68 65 61 64 65 72 2e 20 53 51 4c 49 54 45 5f   header. SQLITE_
9610: 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a  OK is returned.*
9620: 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  * in this case..
9630: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75  **.** If the jou
9640: 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65  rnal header file
9650: 20 61 70 70 65 61 72 73 20 74 6f 20 62 65 20 63   appears to be c
9660: 6f 72 72 75 70 74 65 64 2c 20 53 51 4c 49 54 45  orrupted, SQLITE
9670: 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20 72 65 74 75  _DONE is.** retu
9680: 72 6e 65 64 20 61 6e 64 20 2a 70 4e 52 65 63 20  rned and *pNRec 
9690: 61 6e 64 20 2a 50 44 62 53 69 7a 65 20 61 72 65  and *PDbSize are
96a0: 20 75 6e 64 65 66 69 6e 65 64 2e 20 20 49 66 20   undefined.  If 
96b0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62  JOURNAL_HDR_SZ b
96c0: 79 74 65 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62  ytes.** cannot b
96d0: 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
96e0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 20  journal file an 
96f0: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
9700: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
9710: 63 20 69 6e 74 20 72 65 61 64 4a 6f 75 72 6e 61  c int readJourna
9720: 6c 48 64 72 28 0a 20 20 50 61 67 65 72 20 2a 70  lHdr(.  Pager *p
9730: 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20  Pager,          
9740: 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62       /* Pager ob
9750: 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73  ject */.  int is
9760: 48 6f 74 2c 0a 20 20 69 36 34 20 6a 6f 75 72 6e  Hot,.  i64 journ
9770: 61 6c 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20  alSize,         
9780: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
9790: 68 65 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20  he open journal 
97a0: 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f  file in bytes */
97b0: 0a 20 20 75 33 32 20 2a 70 4e 52 65 63 2c 20 20  .  u32 *pNRec,  
97c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
97d0: 2f 2a 20 4f 55 54 3a 20 56 61 6c 75 65 20 72 65  /* OUT: Value re
97e0: 61 64 20 66 72 6f 6d 20 74 68 65 20 6e 52 65 63  ad from the nRec
97f0: 20 66 69 65 6c 64 20 2a 2f 0a 20 20 75 33 32 20   field */.  u32 
9800: 2a 70 44 62 53 69 7a 65 20 20 20 20 20 20 20 20  *pDbSize        
9810: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
9820: 20 56 61 6c 75 65 20 6f 66 20 6f 72 69 67 69 6e   Value of origin
9830: 61 6c 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  al database size
9840: 20 66 69 65 6c 64 20 2a 2f 0a 29 7b 0a 20 20 69   field */.){.  i
9850: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
9860: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
9870: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
9880: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d  unsigned char aM
9890: 61 67 69 63 5b 38 5d 3b 20 20 20 20 20 2f 2a 20  agic[8];     /* 
98a0: 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64  A buffer to hold
98b0: 20 74 68 65 20 6d 61 67 69 63 20 68 65 61 64 65   the magic heade
98c0: 72 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72 4f  r */.  i64 iHdrO
98d0: 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
98e0: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66      /* Offset of
98f0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
9900: 62 65 69 6e 67 20 72 65 61 64 20 2a 2f 0a 0a 20  being read */.. 
9910: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
9920: 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20  pPager->jfd) ); 
9930: 20 20 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20       /* Journal 
9940: 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65  file must be ope
9950: 6e 2e 20 2a 2f 0a 0a 20 20 2f 2a 20 41 64 76 61  n. */..  /* Adva
9960: 6e 63 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61  nce Pager.journa
9970: 6c 4f 66 66 20 74 6f 20 74 68 65 20 73 74 61 72  lOff to the star
9980: 74 20 6f 66 20 74 68 65 20 6e 65 78 74 20 73 65  t of the next se
9990: 63 74 6f 72 2e 20 49 66 20 74 68 65 0a 20 20 2a  ctor. If the.  *
99a0: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  * journal file i
99b0: 73 20 74 6f 6f 20 73 6d 61 6c 6c 20 66 6f 72 20  s too small for 
99c0: 74 68 65 72 65 20 74 6f 20 62 65 20 61 20 68 65  there to be a he
99d0: 61 64 65 72 20 73 74 6f 72 65 64 20 61 74 20 74  ader stored at t
99e0: 68 69 73 0a 20 20 2a 2a 20 70 6f 69 6e 74 2c 20  his.  ** point, 
99f0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
9a00: 4e 45 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65  NE..  */.  pPage
9a10: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
9a20: 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74  journalHdrOffset
9a30: 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
9a40: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
9a50: 66 66 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  ff+JOURNAL_HDR_S
9a60: 5a 28 70 50 61 67 65 72 29 20 3e 20 6a 6f 75 72  Z(pPager) > jour
9a70: 6e 61 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 72  nalSize ){.    r
9a80: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
9a90: 45 3b 0a 20 20 7d 0a 20 20 69 48 64 72 4f 66 66  E;.  }.  iHdrOff
9aa0: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
9ab0: 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 52 65 61  alOff;..  /* Rea
9ac0: 64 20 69 6e 20 74 68 65 20 66 69 72 73 74 20 38  d in the first 8
9ad0: 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6a 6f   bytes of the jo
9ae0: 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 49 66  urnal header. If
9af0: 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 6d 61 74   they do not mat
9b00: 63 68 0a 20 20 2a 2a 20 74 68 65 20 20 6d 61 67  ch.  ** the  mag
9b10: 69 63 20 73 74 72 69 6e 67 20 66 6f 75 6e 64 20  ic string found 
9b20: 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
9b30: 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20 68 65 61  each journal hea
9b40: 64 65 72 2c 20 72 65 74 75 72 6e 0a 20 20 2a 2a  der, return.  **
9b50: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 20 49 66   SQLITE_DONE. If
9b60: 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
9b70: 75 72 73 2c 20 72 65 74 75 72 6e 20 61 6e 20 65  urs, return an e
9b80: 72 72 6f 72 20 63 6f 64 65 2e 20 4f 74 68 65 72  rror code. Other
9b90: 77 69 73 65 2c 0a 20 20 2a 2a 20 70 72 6f 63 65  wise,.  ** proce
9ba0: 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  ed..  */.  if( i
9bb0: 73 48 6f 74 20 7c 7c 20 69 48 64 72 4f 66 66 21  sHot || iHdrOff!
9bc0: 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
9bd0: 48 64 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  Hdr ){.    rc = 
9be0: 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
9bf0: 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69  ager->jfd, aMagi
9c00: 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63  c, sizeof(aMagic
9c10: 29 2c 20 69 48 64 72 4f 66 66 29 3b 0a 20 20 20  ), iHdrOff);.   
9c20: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
9c30: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
9c40: 7d 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70  }.    if( memcmp
9c50: 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61  (aMagic, aJourna
9c60: 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61  lMagic, sizeof(a
9c70: 4d 61 67 69 63 29 29 21 3d 30 20 29 7b 0a 20 20  Magic))!=0 ){.  
9c80: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
9c90: 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20  E_DONE;.    }.  
9ca0: 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65  }..  /* Read the
9cb0: 20 66 69 72 73 74 20 74 68 72 65 65 20 33 32 2d   first three 32-
9cc0: 62 69 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68  bit fields of th
9cd0: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
9ce0: 3a 20 54 68 65 20 6e 52 65 63 0a 20 20 2a 2a 20  : The nRec.  ** 
9cf0: 66 69 65 6c 64 2c 20 74 68 65 20 63 68 65 63 6b  field, the check
9d00: 73 75 6d 2d 69 6e 69 74 69 61 6c 69 7a 65 72 20  sum-initializer 
9d10: 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  and the database
9d20: 20 73 69 7a 65 20 61 74 20 74 68 65 20 73 74 61   size at the sta
9d30: 72 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 74  rt.  ** of the t
9d40: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 52 65 74 75  ransaction. Retu
9d50: 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  rn an error code
9d60: 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65   if anything goe
9d70: 73 20 77 72 6f 6e 67 2e 0a 20 20 2a 2f 0a 20 20  s wrong..  */.  
9d80: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28  if( SQLITE_OK!=(
9d90: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
9da0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
9db0: 72 4f 66 66 2b 38 2c 20 70 4e 52 65 63 29 29 0a  rOff+8, pNRec)).
9dc0: 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21     || SQLITE_OK!
9dd0: 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74  =(rc = read32bit
9de0: 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69  s(pPager->jfd, i
9df0: 48 64 72 4f 66 66 2b 31 32 2c 20 26 70 50 61 67  HdrOff+12, &pPag
9e00: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 29 0a  er->cksumInit)).
9e10: 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21     || SQLITE_OK!
9e20: 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74  =(rc = read32bit
9e30: 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69  s(pPager->jfd, i
9e40: 48 64 72 4f 66 66 2b 31 36 2c 20 70 44 62 53 69  HdrOff+16, pDbSi
9e50: 7a 65 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  ze)).  ){.    re
9e60: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
9e70: 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
9e80: 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20  nalOff==0 ){.   
9e90: 20 75 33 32 20 69 50 61 67 65 53 69 7a 65 3b 20   u32 iPageSize; 
9ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9eb0: 20 50 61 67 65 2d 73 69 7a 65 20 66 69 65 6c 64   Page-size field
9ec0: 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64   of journal head
9ed0: 65 72 20 2a 2f 0a 20 20 20 20 75 33 32 20 69 53  er */.    u32 iS
9ee0: 65 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20  ectorSize;      
9ef0: 20 20 20 20 20 20 20 2f 2a 20 53 65 63 74 6f 72         /* Sector
9f00: 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 6a  -size field of j
9f10: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f  ournal header */
9f20: 0a 20 20 20 20 75 31 36 20 69 50 61 67 65 53 69  .    u16 iPageSi
9f30: 7a 65 31 36 3b 20 20 20 20 20 20 20 20 20 20 20  ze16;           
9f40: 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 69 50 61    /* Copy of iPa
9f50: 67 65 53 69 7a 65 20 69 6e 20 31 36 2d 62 69 74  geSize in 16-bit
9f60: 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 0a 20 20   variable */..  
9f70: 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 70 61    /* Read the pa
9f80: 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65 63 74  ge-size and sect
9f90: 6f 72 2d 73 69 7a 65 20 6a 6f 75 72 6e 61 6c 20  or-size journal 
9fa0: 68 65 61 64 65 72 20 66 69 65 6c 64 73 2e 20 2a  header fields. *
9fb0: 2f 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45  /.    if( SQLITE
9fc0: 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33  _OK!=(rc = read3
9fd0: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
9fe0: 64 2c 20 69 48 64 72 4f 66 66 2b 32 30 2c 20 26  d, iHdrOff+20, &
9ff0: 69 53 65 63 74 6f 72 53 69 7a 65 29 29 0a 20 20  iSectorSize)).  
a000: 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21     || SQLITE_OK!
a010: 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74  =(rc = read32bit
a020: 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69  s(pPager->jfd, i
a030: 48 64 72 4f 66 66 2b 32 34 2c 20 26 69 50 61 67  HdrOff+24, &iPag
a040: 65 53 69 7a 65 29 29 0a 20 20 20 20 29 7b 0a 20  eSize)).    ){. 
a050: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
a060: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68      }..    /* Ch
a070: 65 63 6b 20 74 68 61 74 20 74 68 65 20 76 61 6c  eck that the val
a080: 75 65 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68  ues read from th
a090: 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20  e page-size and 
a0a0: 73 65 63 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c  sector-size fiel
a0b0: 64 73 0a 20 20 20 20 2a 2a 20 61 72 65 20 77 69  ds.    ** are wi
a0c0: 74 68 69 6e 20 72 61 6e 67 65 2e 20 54 6f 20 62  thin range. To b
a0d0: 65 20 27 69 6e 20 72 61 6e 67 65 27 2c 20 62 6f  e 'in range', bo
a0e0: 74 68 20 76 61 6c 75 65 73 20 6e 65 65 64 20 74  th values need t
a0f0: 6f 20 62 65 20 61 20 70 6f 77 65 72 0a 20 20 20  o be a power.   
a100: 20 2a 2a 20 6f 66 20 74 77 6f 20 67 72 65 61 74   ** of two great
a110: 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  er than or equal
a120: 20 74 6f 20 35 31 32 20 6f 72 20 33 32 2c 20 61   to 512 or 32, a
a130: 6e 64 20 6e 6f 74 20 67 72 65 61 74 65 72 20 74  nd not greater t
a140: 68 61 6e 20 74 68 65 69 72 20 0a 20 20 20 20 2a  han their .    *
a150: 2a 20 72 65 73 70 65 63 74 69 76 65 20 63 6f 6d  * respective com
a160: 70 69 6c 65 20 74 69 6d 65 20 6d 61 78 69 6d 75  pile time maximu
a170: 6d 20 6c 69 6d 69 74 73 2e 0a 20 20 20 20 2a 2f  m limits..    */
a180: 0a 20 20 20 20 69 66 28 20 69 50 61 67 65 53 69  .    if( iPageSi
a190: 7a 65 3c 35 31 32 20 20 20 20 20 20 20 20 20 20  ze<512          
a1a0: 20 20 20 20 20 20 20 20 7c 7c 20 69 53 65 63 74          || iSect
a1b0: 6f 72 53 69 7a 65 3c 33 32 0a 20 20 20 20 20 7c  orSize<32.     |
a1c0: 7c 20 69 50 61 67 65 53 69 7a 65 3e 53 51 4c 49  | iPageSize>SQLI
a1d0: 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
a1e0: 20 7c 7c 20 69 53 65 63 74 6f 72 53 69 7a 65 3e   || iSectorSize>
a1f0: 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 0a  MAX_SECTOR_SIZE.
a200: 20 20 20 20 20 7c 7c 20 28 28 69 50 61 67 65 53       || ((iPageS
a210: 69 7a 65 2d 31 29 26 69 50 61 67 65 53 69 7a 65  ize-1)&iPageSize
a220: 29 21 3d 30 20 20 20 7c 7c 20 28 28 69 53 65 63  )!=0   || ((iSec
a230: 74 6f 72 53 69 7a 65 2d 31 29 26 69 53 65 63 74  torSize-1)&iSect
a240: 6f 72 53 69 7a 65 29 21 3d 30 20 0a 20 20 20 20  orSize)!=0 .    
a250: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
a260: 68 65 20 65 69 74 68 65 72 20 74 68 65 20 70 61  he either the pa
a270: 67 65 2d 73 69 7a 65 20 6f 72 20 73 65 63 74 6f  ge-size or secto
a280: 72 2d 73 69 7a 65 20 69 6e 20 74 68 65 20 6a 6f  r-size in the jo
a290: 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 69 73 20  urnal-header is 
a2a0: 0a 20 20 20 20 20 20 2a 2a 20 69 6e 76 61 6c 69  .      ** invali
a2b0: 64 2c 20 74 68 65 6e 20 74 68 65 20 70 72 6f 63  d, then the proc
a2c0: 65 73 73 20 74 68 61 74 20 77 72 6f 74 65 20 74  ess that wrote t
a2d0: 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65  he journal-heade
a2e0: 72 20 6d 75 73 74 20 68 61 76 65 20 0a 20 20 20  r must have .   
a2f0: 20 20 20 2a 2a 20 63 72 61 73 68 65 64 20 62 65     ** crashed be
a300: 66 6f 72 65 20 74 68 65 20 68 65 61 64 65 72 20  fore the header 
a310: 77 61 73 20 73 79 6e 63 65 64 2e 20 49 6e 20 74  was synced. In t
a320: 68 69 73 20 63 61 73 65 20 73 74 6f 70 20 72 65  his case stop re
a330: 61 64 69 6e 67 20 0a 20 20 20 20 20 20 2a 2a 20  ading .      ** 
a340: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
a350: 20 68 65 72 65 2e 0a 20 20 20 20 20 20 2a 2f 0a   here..      */.
a360: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
a370: 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a  ITE_DONE;.    }.
a380: 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74  .    /* Update t
a390: 68 65 20 70 61 67 65 2d 73 69 7a 65 20 74 6f 20  he page-size to 
a3a0: 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75 65 20  match the value 
a3b0: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f  read from the jo
a3c0: 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2a 20 55  urnal. .    ** U
a3d0: 73 65 20 61 20 74 65 73 74 63 61 73 65 28 29 20  se a testcase() 
a3e0: 6d 61 63 72 6f 20 74 6f 20 6d 61 6b 65 20 73 75  macro to make su
a3f0: 72 65 20 74 68 61 74 20 6d 61 6c 6c 6f 63 20 66  re that malloc f
a400: 61 69 6c 75 72 65 20 77 69 74 68 69 6e 20 0a 20  ailure within . 
a410: 20 20 20 2a 2a 20 50 61 67 65 72 53 65 74 50 61     ** PagerSetPa
a420: 67 65 73 69 7a 65 28 29 20 69 73 20 74 65 73 74  gesize() is test
a430: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
a440: 50 61 67 65 53 69 7a 65 31 36 20 3d 20 28 75 31  PageSize16 = (u1
a450: 36 29 69 50 61 67 65 53 69 7a 65 3b 0a 20 20 20  6)iPageSize;.   
a460: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
a470: 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 50  erSetPagesize(pP
a480: 61 67 65 72 2c 20 26 69 50 61 67 65 53 69 7a 65  ager, &iPageSize
a490: 31 36 2c 20 2d 31 29 3b 0a 20 20 20 20 74 65 73  16, -1);.    tes
a4a0: 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54  tcase( rc!=SQLIT
a4b0: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 61 73 73 65  E_OK );.    asse
a4c0: 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
a4d0: 4b 20 7c 7c 20 69 50 61 67 65 53 69 7a 65 31 36  K || iPageSize16
a4e0: 3d 3d 28 75 31 36 29 69 50 61 67 65 53 69 7a 65  ==(u16)iPageSize
a4f0: 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61   );..    /* Upda
a500: 74 65 20 74 68 65 20 61 73 73 75 6d 65 64 20 73  te the assumed s
a510: 65 63 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61  ector-size to ma
a520: 74 63 68 20 74 68 65 20 76 61 6c 75 65 20 75 73  tch the value us
a530: 65 64 20 62 79 20 0a 20 20 20 20 2a 2a 20 74 68  ed by .    ** th
a540: 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 63  e process that c
a550: 72 65 61 74 65 64 20 74 68 69 73 20 6a 6f 75 72  reated this jour
a560: 6e 61 6c 2e 20 49 66 20 74 68 69 73 20 6a 6f 75  nal. If this jou
a570: 72 6e 61 6c 20 77 61 73 0a 20 20 20 20 2a 2a 20  rnal was.    ** 
a580: 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f  created by a pro
a590: 63 65 73 73 20 6f 74 68 65 72 20 74 68 61 6e 20  cess other than 
a5a0: 74 68 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20 74  this one, then t
a5b0: 68 69 73 20 72 6f 75 74 69 6e 65 0a 20 20 20 20  his routine.    
a5c0: 2a 2a 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c  ** is being call
a5d0: 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 70  ed from within p
a5e0: 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e  ager_playback().
a5f0: 20 54 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65   The local value
a600: 0a 20 20 20 20 2a 2a 20 6f 66 20 50 61 67 65 72  .    ** of Pager
a610: 2e 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20 72  .sectorSize is r
a620: 65 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 65  estored at the e
a630: 6e 64 20 6f 66 20 74 68 61 74 20 72 6f 75 74 69  nd of that routi
a640: 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  ne..    */.    p
a650: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
a660: 65 20 3d 20 69 53 65 63 74 6f 72 53 69 7a 65 3b  e = iSectorSize;
a670: 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e  .  }..  pPager->
a680: 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f  journalOff += JO
a690: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
a6a0: 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ger);.  return r
a6b0: 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  c;.}.../*.** Wri
a6c0: 74 65 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  te the supplied 
a6d0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
a6e0: 61 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ame into the jou
a6f0: 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61  rnal file for pa
a700: 67 65 72 0a 2a 2a 20 70 50 61 67 65 72 20 61 74  ger.** pPager at
a710: 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63   the current loc
a720: 61 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65  ation. The maste
a730: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d  r journal name m
a740: 75 73 74 20 62 65 20 74 68 65 20 6c 61 73 74 0a  ust be the last.
a750: 2a 2a 20 74 68 69 6e 67 20 77 72 69 74 74 65 6e  ** thing written
a760: 20 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69   to a journal fi
a770: 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67 65 72  le. If the pager
a780: 20 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63   is in full-sync
a790: 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f   mode, the.** jo
a7a0: 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72  urnal file descr
a7b0: 69 70 74 6f 72 20 69 73 20 61 64 76 61 6e 63 65  iptor is advance
a7c0: 64 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65  d to the next se
a7d0: 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 62 65  ctor boundary be
a7e0: 66 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67  fore.** anything
a7f0: 20 69 73 20 77 72 69 74 74 65 6e 2e 20 54 68 65   is written. The
a800: 20 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a   format is:.**.*
a810: 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20 50  *   + 4 bytes: P
a820: 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a  AGER_MJ_PGNO..**
a830: 20 20 20 2b 20 4e 20 62 79 74 65 73 3a 20 4d 61     + N bytes: Ma
a840: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
a850: 65 6e 61 6d 65 20 69 6e 20 75 74 66 2d 38 2e 0a  ename in utf-8..
a860: 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20  **   + 4 bytes: 
a870: 4e 20 28 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73  N (length of mas
a880: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
a890: 20 69 6e 20 62 79 74 65 73 2c 20 6e 6f 20 6e 75   in bytes, no nu
a8a0: 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2e 0a 2a  l-terminator)..*
a8b0: 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20 4d  *   + 4 bytes: M
a8c0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
a8d0: 6d 65 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20  me checksum..** 
a8e0: 20 20 2b 20 38 20 62 79 74 65 73 3a 20 61 4a 6f    + 8 bytes: aJo
a8f0: 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a  urnalMagic[]..**
a900: 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a  .** The master j
a910: 6f 75 72 6e 61 6c 20 70 61 67 65 20 63 68 65 63  ournal page chec
a920: 6b 73 75 6d 20 69 73 20 74 68 65 20 73 75 6d 20  ksum is the sum 
a930: 6f 66 20 74 68 65 20 62 79 74 65 73 20 69 6e 20  of the bytes in 
a940: 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f  the master.** jo
a950: 75 72 6e 61 6c 20 6e 61 6d 65 2c 20 77 68 65 72  urnal name, wher
a960: 65 20 65 61 63 68 20 62 79 74 65 20 69 73 20 69  e each byte is i
a970: 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 61 20  nterpreted as a 
a980: 73 69 67 6e 65 64 20 38 2d 62 69 74 20 69 6e 74  signed 8-bit int
a990: 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a  eger..**.** If z
a9a0: 4d 61 73 74 65 72 20 69 73 20 61 20 4e 55 4c 4c  Master is a NULL
a9b0: 20 70 6f 69 6e 74 65 72 20 28 6f 63 63 75 72 73   pointer (occurs
a9c0: 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 64 61   for a single da
a9d0: 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69  tabase transacti
a9e0: 6f 6e 29 2c 20 0a 2a 2a 20 74 68 69 73 20 63 61  on), .** this ca
a9f0: 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ll is a no-op..*
aa00: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69  /.static int wri
aa10: 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  teMasterJournal(
aa20: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63  Pager *pPager, c
aa30: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74  onst char *zMast
aa40: 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  er){.  int rc;  
aa50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa60: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
aa70: 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
aa80: 6e 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20 20  nMaster;        
aa90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
aaa0: 4c 65 6e 67 74 68 20 6f 66 20 73 74 72 69 6e 67  Length of string
aab0: 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 20 20 69 36   zMaster */.  i6
aac0: 34 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20  4 iHdrOff;      
aad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
aae0: 2a 20 4f 66 66 73 65 74 20 6f 66 20 68 65 61 64  * Offset of head
aaf0: 65 72 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69  er in journal fi
ab00: 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 72 6e 6c  le */.  i64 jrnl
ab10: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
ab20: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
ab30: 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   of journal file
ab40: 20 6f 6e 20 64 69 73 6b 20 2a 2f 0a 20 20 75 33   on disk */.  u3
ab50: 32 20 63 6b 73 75 6d 20 3d 20 30 3b 20 20 20 20  2 cksum = 0;    
ab60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ab70: 2a 20 43 68 65 63 6b 73 75 6d 20 6f 66 20 73 74  * Checksum of st
ab80: 72 69 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a  ring zMaster */.
ab90: 0a 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20  .  if( !zMaster 
aba0: 7c 7c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  || pPager->setMa
abb0: 73 74 65 72 0a 20 20 20 7c 7c 20 70 50 61 67 65  ster.   || pPage
abc0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
abd0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
abe0: 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 7c 7c 20  E_MEMORY .   || 
abf0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
ac00: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
ac10: 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 29 7b  ALMODE_OFF .  ){
ac20: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
ac30: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 61  TE_OK;.  }.  pPa
ac40: 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d  ger->setMaster =
ac50: 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73   1;.  assert( is
ac60: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
ac70: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
ac80: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
ac90: 72 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  r <= pPager->jou
aca0: 72 6e 61 6c 4f 66 66 20 29 3b 0a 0a 20 20 2f 2a  rnalOff );..  /*
acb0: 20 43 61 6c 63 75 6c 61 74 65 20 74 68 65 20 6c   Calculate the l
acc0: 65 6e 67 74 68 20 69 6e 20 62 79 74 65 73 20 61  ength in bytes a
acd0: 6e 64 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  nd the checksum 
ace0: 6f 66 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 20 20  of zMaster */.  
acf0: 66 6f 72 28 6e 4d 61 73 74 65 72 3d 30 3b 20 7a  for(nMaster=0; z
ad00: 4d 61 73 74 65 72 5b 6e 4d 61 73 74 65 72 5d 3b  Master[nMaster];
ad10: 20 6e 4d 61 73 74 65 72 2b 2b 29 7b 0a 20 20 20   nMaster++){.   
ad20: 20 63 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73 74 65   cksum += zMaste
ad30: 72 5b 6e 4d 61 73 74 65 72 5d 3b 0a 20 20 7d 0a  r[nMaster];.  }.
ad40: 0a 20 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c  .  /* If in full
ad50: 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 61 64 76 61  -sync mode, adva
ad60: 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20  nce to the next 
ad70: 64 69 73 6b 20 73 65 63 74 6f 72 20 62 65 66 6f  disk sector befo
ad80: 72 65 20 77 72 69 74 69 6e 67 0a 20 20 2a 2a 20  re writing.  ** 
ad90: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
ada0: 61 6c 20 6e 61 6d 65 2e 20 54 68 69 73 20 69 73  al name. This is
adb0: 20 69 6e 20 63 61 73 65 20 74 68 65 20 70 72 65   in case the pre
adc0: 76 69 6f 75 73 20 70 61 67 65 20 77 72 69 74 74  vious page writt
add0: 65 6e 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6a  en to.  ** the j
ade0: 6f 75 72 6e 61 6c 20 68 61 73 20 61 6c 72 65 61  ournal has alrea
adf0: 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a  dy been synced..
ae00: 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
ae10: 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20  r->fullSync ){. 
ae20: 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
ae30: 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48  alOff = journalH
ae40: 64 72 4f 66 66 73 65 74 28 70 50 61 67 65 72 29  drOffset(pPager)
ae50: 3b 0a 20 20 7d 0a 20 20 69 48 64 72 4f 66 66 20  ;.  }.  iHdrOff 
ae60: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
ae70: 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 57 72 69 74  lOff;..  /* Writ
ae80: 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
ae90: 72 6e 61 6c 20 64 61 74 61 20 74 6f 20 74 68 65  rnal data to the
aea0: 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75 72   end of the jour
aeb0: 6e 61 6c 20 66 69 6c 65 2e 20 49 66 0a 20 20 2a  nal file. If.  *
aec0: 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  * an error occur
aed0: 73 2c 20 72 65 74 75 72 6e 20 74 68 65 20 65 72  s, return the er
aee0: 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20  ror code to the 
aef0: 63 61 6c 6c 65 72 2e 0a 20 20 2a 2f 0a 20 20 69  caller..  */.  i
af00: 66 28 20 28 30 20 21 3d 20 28 72 63 20 3d 20 77  f( (0 != (rc = w
af10: 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
af20: 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2c  r->jfd, iHdrOff,
af30: 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70   PAGER_MJ_PGNO(p
af40: 50 61 67 65 72 29 29 29 29 0a 20 20 20 7c 7c 20  Pager)))).   || 
af50: 28 30 20 21 3d 20 28 72 63 20 3d 20 73 71 6c 69  (0 != (rc = sqli
af60: 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
af70: 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c  r->jfd, zMaster,
af80: 20 6e 4d 61 73 74 65 72 2c 20 69 48 64 72 4f 66   nMaster, iHdrOf
af90: 66 2b 34 29 29 29 0a 20 20 20 7c 7c 20 28 30 20  f+4))).   || (0 
afa0: 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65 33 32  != (rc = write32
afb0: 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
afc0: 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73  , iHdrOff+4+nMas
afd0: 74 65 72 2c 20 6e 4d 61 73 74 65 72 29 29 29 0a  ter, nMaster))).
afe0: 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20     || (0 != (rc 
aff0: 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
b000: 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f  ager->jfd, iHdrO
b010: 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2b 34 2c 20  ff+4+nMaster+4, 
b020: 63 6b 73 75 6d 29 29 29 0a 20 20 20 7c 7c 20 28  cksum))).   || (
b030: 30 20 21 3d 20 28 72 63 20 3d 20 73 71 6c 69 74  0 != (rc = sqlit
b040: 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
b050: 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d  ->jfd, aJournalM
b060: 61 67 69 63 2c 20 38 2c 20 69 48 64 72 4f 66 66  agic, 8, iHdrOff
b070: 2b 34 2b 6e 4d 61 73 74 65 72 2b 38 29 29 29 0a  +4+nMaster+8))).
b080: 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
b090: 72 63 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  rc;.  }.  pPager
b0a0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20  ->journalOff += 
b0b0: 28 6e 4d 61 73 74 65 72 2b 32 30 29 3b 0a 20 20  (nMaster+20);.  
b0c0: 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
b0d0: 20 3d 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79   = !pPager->noSy
b0e0: 6e 63 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  nc;..  /* If the
b0f0: 20 70 61 67 65 72 20 69 73 20 69 6e 20 70 65 72   pager is in per
b100: 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 20 6d  istent-journal m
b110: 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20 70 68  ode, then the ph
b120: 79 73 69 63 61 6c 20 0a 20 20 2a 2a 20 6a 6f 75  ysical .  ** jou
b130: 72 6e 61 6c 2d 66 69 6c 65 20 6d 61 79 20 65 78  rnal-file may ex
b140: 74 65 6e 64 20 70 61 73 74 20 74 68 65 20 65 6e  tend past the en
b150: 64 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 2d  d of the master-
b160: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 20 20 2a  journal name.  *
b170: 2a 20 61 6e 64 20 38 20 62 79 74 65 73 20 6f 66  * and 8 bytes of
b180: 20 6d 61 67 69 63 20 64 61 74 61 20 6a 75 73 74   magic data just
b190: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
b1a0: 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 0a 20  file. This is . 
b1b0: 20 2a 2a 20 64 61 6e 67 65 72 6f 75 73 20 62 65   ** dangerous be
b1c0: 63 61 75 73 65 20 74 68 65 20 63 6f 64 65 20 74  cause the code t
b1d0: 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 68 6f 74  o rollback a hot
b1e0: 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20  -journal file.  
b1f0: 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61  ** will not be a
b200: 62 6c 65 20 74 6f 20 66 69 6e 64 20 74 68 65 20  ble to find the 
b210: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e  master-journal n
b220: 61 6d 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  ame to determine
b230: 20 0a 20 20 2a 2a 20 77 68 65 74 68 65 72 20 6f   .  ** whether o
b240: 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61  r not the journa
b250: 6c 20 69 73 20 68 6f 74 2e 20 0a 20 20 2a 2a 0a  l is hot. .  **.
b260: 20 20 2a 2a 20 45 61 73 69 65 73 74 20 74 68 69    ** Easiest thi
b270: 6e 67 20 74 6f 20 64 6f 20 69 6e 20 74 68 69 73  ng to do in this
b280: 20 73 63 65 6e 61 72 69 6f 20 69 73 20 74 6f 20   scenario is to 
b290: 74 72 75 6e 63 61 74 65 20 74 68 65 20 6a 6f 75  truncate the jou
b2a0: 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20  rnal .  ** file 
b2b0: 74 6f 20 74 68 65 20 72 65 71 75 69 72 65 64 20  to the required 
b2c0: 73 69 7a 65 2e 0a 20 20 2a 2f 20 0a 20 20 69 66  size..  */ .  if
b2d0: 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63  ( SQLITE_OK==(rc
b2e0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
b2f0: 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  Size(pPager->jfd
b300: 2c 20 26 6a 72 6e 6c 53 69 7a 65 29 29 0a 20 20  , &jrnlSize)).  
b310: 20 26 26 20 6a 72 6e 6c 53 69 7a 65 3e 70 50 61   && jrnlSize>pPa
b320: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a  ger->journalOff.
b330: 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71    ){.    rc = sq
b340: 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
b350: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
b360: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  ger->journalOff)
b370: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
b380: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64  c;.}../*.** Find
b390: 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 68   a page in the h
b3a0: 61 73 68 20 74 61 62 6c 65 20 67 69 76 65 6e 20  ash table given 
b3b0: 69 74 73 20 70 61 67 65 20 6e 75 6d 62 65 72 2e  its page number.
b3c0: 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69   Return.** a poi
b3d0: 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
b3e0: 20 6f 72 20 4e 55 4c 4c 20 69 66 20 74 68 65 20   or NULL if the 
b3f0: 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69  requested page i
b400: 73 20 6e 6f 74 20 0a 2a 2a 20 61 6c 72 65 61 64  s not .** alread
b410: 79 20 69 6e 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a  y in memory..*/.
b420: 73 74 61 74 69 63 20 50 67 48 64 72 20 2a 70 61  static PgHdr *pa
b430: 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72  ger_lookup(Pager
b440: 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70   *pPager, Pgno p
b450: 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  gno){.  PgHdr *p
b460: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b470: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
b480: 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20  urn value */..  
b490: 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73  /* It is not pos
b4a0: 73 69 62 6c 65 20 66 6f 72 20 61 20 63 61 6c 6c  sible for a call
b4b0: 20 74 6f 20 50 63 61 63 68 65 46 65 74 63 68 28   to PcacheFetch(
b4c0: 29 20 77 69 74 68 20 63 72 65 61 74 65 46 6c 61  ) with createFla
b4d0: 67 3d 3d 30 20 74 6f 0a 20 20 2a 2a 20 66 61 69  g==0 to.  ** fai
b4e0: 6c 2c 20 73 69 6e 63 65 20 6e 6f 20 61 74 74 65  l, since no atte
b4f0: 6d 70 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  mpt to allocate 
b500: 64 79 6e 61 6d 69 63 20 6d 65 6d 6f 72 79 20 77  dynamic memory w
b510: 69 6c 6c 20 62 65 20 6d 61 64 65 2e 0a 20 20 2a  ill be made..  *
b520: 2f 0a 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65  /.  (void)sqlite
b530: 33 50 63 61 63 68 65 46 65 74 63 68 28 70 50 61  3PcacheFetch(pPa
b540: 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67  ger->pPCache, pg
b550: 6e 6f 2c 20 30 2c 20 26 70 29 3b 0a 20 20 72 65  no, 0, &p);.  re
b560: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
b570: 20 55 6e 6c 65 73 73 20 74 68 65 20 70 61 67 65   Unless the page
b580: 72 20 69 73 20 69 6e 20 65 72 72 6f 72 2d 73 74  r is in error-st
b590: 61 74 65 2c 20 64 69 73 63 61 72 64 20 61 6c 6c  ate, discard all
b5a0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73   in-memory pages
b5b0: 2e 20 49 66 0a 2a 2a 20 74 68 65 20 70 61 67 65  . If.** the page
b5c0: 72 20 69 73 20 69 6e 20 65 72 72 6f 72 2d 73 74  r is in error-st
b5d0: 61 74 65 2c 20 74 68 65 6e 20 74 68 69 73 20 63  ate, then this c
b5e0: 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  all is a no-op..
b5f0: 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 57 68 79 20  **.** TODO: Why 
b600: 63 61 6e 20 77 65 20 6e 6f 74 20 72 65 73 65 74  can we not reset
b610: 20 74 68 65 20 70 61 67 65 72 20 77 68 69 6c 65   the pager while
b620: 20 69 6e 20 65 72 72 6f 72 20 73 74 61 74 65 3f   in error state?
b630: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
b640: 70 61 67 65 72 5f 72 65 73 65 74 28 50 61 67 65  pager_reset(Page
b650: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66  r *pPager){.  if
b660: 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 70 50 61  ( SQLITE_OK==pPa
b670: 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a  ger->errCode ){.
b680: 20 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75      sqlite3Backu
b690: 70 52 65 73 74 61 72 74 28 70 50 61 67 65 72 2d  pRestart(pPager-
b6a0: 3e 70 42 61 63 6b 75 70 29 3b 0a 20 20 20 20 73  >pBackup);.    s
b6b0: 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61  qlite3PcacheClea
b6c0: 72 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  r(pPager->pPCach
b6d0: 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  e);.    pPager->
b6e0: 64 62 53 69 7a 65 56 61 6c 69 64 20 3d 20 30 3b  dbSizeValid = 0;
b6f0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  .  }.}../*.** Fr
b700: 65 65 20 61 6c 6c 20 73 74 72 75 63 74 75 72 65  ee all structure
b710: 73 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e 61  s in the Pager.a
b720: 53 61 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61  Savepoint[] arra
b730: 79 20 61 6e 64 20 73 65 74 20 62 6f 74 68 0a 2a  y and set both.*
b740: 2a 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69  * Pager.aSavepoi
b750: 6e 74 20 61 6e 64 20 50 61 67 65 72 2e 6e 53 61  nt and Pager.nSa
b760: 76 65 70 6f 69 6e 74 20 74 6f 20 7a 65 72 6f 2e  vepoint to zero.
b770: 20 43 6c 6f 73 65 20 74 68 65 20 73 75 62 2d 6a   Close the sub-j
b780: 6f 75 72 6e 61 6c 0a 2a 2a 20 69 66 20 69 74 20  ournal.** if it 
b790: 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20  is open and the 
b7a0: 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20  pager is not in 
b7b0: 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 0a  exclusive mode..
b7c0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
b7d0: 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69  eleaseAllSavepoi
b7e0: 6e 74 73 28 50 61 67 65 72 20 2a 70 50 61 67 65  nts(Pager *pPage
b7f0: 72 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20 20  r){.  int ii;   
b800: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
b810: 74 65 72 61 74 6f 72 20 66 6f 72 20 6c 6f 6f 70  terator for loop
b820: 69 6e 67 20 74 68 72 6f 75 67 68 20 50 61 67 65  ing through Page
b830: 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 2a 2f 0a  r.aSavepoint */.
b840: 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
b850: 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
b860: 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 73 71  t; ii++){.    sq
b870: 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
b880: 6f 79 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65  oy(pPager->aSave
b890: 70 6f 69 6e 74 5b 69 69 5d 2e 70 49 6e 53 61 76  point[ii].pInSav
b8a0: 65 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a 20 20 69  epoint);.  }.  i
b8b0: 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  f( !pPager->excl
b8c0: 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 73 71 6c  usiveMode || sql
b8d0: 69 74 65 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c  ite3IsMemJournal
b8e0: 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29  (pPager->sjfd) )
b8f0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
b900: 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 73 6a 66  lose(pPager->sjf
b910: 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  d);.  }.  sqlite
b920: 33 5f 66 72 65 65 28 70 50 61 67 65 72 2d 3e 61  3_free(pPager->a
b930: 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 70 50  Savepoint);.  pP
b940: 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
b950: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
b960: 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a  nSavepoint = 0;.
b970: 20 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65    pPager->nSubRe
b980: 63 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  c = 0;.}../*.** 
b990: 53 65 74 20 74 68 65 20 62 69 74 20 6e 75 6d 62  Set the bit numb
b9a0: 65 72 20 70 67 6e 6f 20 69 6e 20 74 68 65 20 50  er pgno in the P
b9b0: 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49  agerSavepoint.pI
b9c0: 6e 53 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 62  nSavepoint .** b
b9d0: 69 74 76 65 63 73 20 6f 66 20 61 6c 6c 20 6f 70  itvecs of all op
b9e0: 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 52  en savepoints. R
b9f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
ba00: 69 66 20 73 75 63 63 65 73 73 66 75 6c 0a 2a 2a  if successful.**
ba10: 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d   or SQLITE_NOMEM
ba20: 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69   if a malloc fai
ba30: 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a  lure occurs..*/.
ba40: 73 74 61 74 69 63 20 69 6e 74 20 61 64 64 54 6f  static int addTo
ba50: 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73  SavepointBitvecs
ba60: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
ba70: 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e  Pgno pgno){.  in
ba80: 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  t ii;           
ba90: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
baa0: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
bab0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
bac0: 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
bad0: 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 66 6f 72 28   code */..  for(
bae0: 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d  ii=0; ii<pPager-
baf0: 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b  >nSavepoint; ii+
bb00: 2b 29 7b 0a 20 20 20 20 50 61 67 65 72 53 61 76  +){.    PagerSav
bb10: 65 70 6f 69 6e 74 20 2a 70 20 3d 20 26 70 50 61  epoint *p = &pPa
bb20: 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b  ger->aSavepoint[
bb30: 69 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 67 6e  ii];.    if( pgn
bb40: 6f 3c 3d 70 2d 3e 6e 4f 72 69 67 20 29 7b 0a 20  o<=p->nOrig ){. 
bb50: 20 20 20 20 20 72 63 20 7c 3d 20 73 71 6c 69 74       rc |= sqlit
bb60: 65 33 42 69 74 76 65 63 53 65 74 28 70 2d 3e 70  e3BitvecSet(p->p
bb70: 49 6e 53 61 76 65 70 6f 69 6e 74 2c 20 70 67 6e  InSavepoint, pgn
bb80: 6f 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  o);.      testca
bb90: 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  se( rc==SQLITE_N
bba0: 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 61 73  OMEM );.      as
bbb0: 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
bbc0: 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  _OK || rc==SQLIT
bbd0: 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 7d  E_NOMEM );.    }
bbe0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
bbf0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
bc00: 6e 20 74 72 75 65 20 69 66 20 74 68 69 73 20 70  n true if this p
bc10: 61 67 65 72 20 75 73 65 73 20 61 20 77 72 69 74  ager uses a writ
bc20: 65 2d 61 68 65 61 64 20 6c 6f 67 20 69 6e 73 74  e-ahead log inst
bc30: 65 61 64 20 6f 66 20 74 68 65 20 75 73 75 61 6c  ead of the usual
bc40: 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  .** rollback jou
bc50: 72 6e 61 6c 2e 20 4f 74 68 65 72 77 69 73 65 20  rnal. Otherwise 
bc60: 66 61 6c 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  false..*/.static
bc70: 20 69 6e 74 20 70 61 67 65 72 55 73 65 4c 6f 67   int pagerUseLog
bc80: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
bc90: 0a 20 20 72 65 74 75 72 6e 20 28 70 50 61 67 65  .  return (pPage
bca0: 72 2d 3e 70 4c 6f 67 21 3d 30 29 3b 0a 7d 0a 0a  r->pLog!=0);.}..
bcb0: 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65  /*.** Unlock the
bcc0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
bcd0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
bce0: 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20   a no-op if the 
bcf0: 70 61 67 65 72 0a 2a 2a 20 69 73 20 69 6e 20 65  pager.** is in e
bd00: 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 0a 2a  xclusive mode..*
bd10: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
bd20: 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 69  r is currently i
bd30: 6e 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 64  n error state, d
bd40: 69 73 63 61 72 64 20 74 68 65 20 63 6f 6e 74 65  iscard the conte
bd50: 6e 74 73 20 6f 66 20 0a 2a 2a 20 74 68 65 20 63  nts of .** the c
bd60: 61 63 68 65 20 61 6e 64 20 72 65 73 65 74 20 74  ache and reset t
bd70: 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75  he Pager structu
bd80: 72 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74  re internal stat
bd90: 65 2e 20 49 66 20 74 68 65 72 65 20 69 73 0a 2a  e. If there is.*
bda0: 2a 20 61 6e 20 6f 70 65 6e 20 6a 6f 75 72 6e 61  * an open journa
bdb0: 6c 2d 66 69 6c 65 2c 20 74 68 65 6e 20 74 68 65  l-file, then the
bdc0: 20 6e 65 78 74 20 74 69 6d 65 20 61 20 73 68 61   next time a sha
bdd0: 72 65 64 2d 6c 6f 63 6b 20 69 73 20 6f 62 74 61  red-lock is obta
bde0: 69 6e 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 70  ined.** on the p
bdf0: 61 67 65 72 20 66 69 6c 65 20 28 62 79 20 74 68  ager file (by th
be00: 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20  is or any other 
be10: 70 72 6f 63 65 73 73 29 2c 20 69 74 20 77 69 6c  process), it wil
be20: 6c 20 62 65 0a 2a 2a 20 74 72 65 61 74 65 64 20  l be.** treated 
be30: 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  as a hot-journal
be40: 20 61 6e 64 20 72 6f 6c 6c 65 64 20 62 61 63 6b   and rolled back
be50: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
be60: 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 50 61   pager_unlock(Pa
be70: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
be80: 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63  if( !pPager->exc
be90: 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20  lusiveMode ){.  
bea0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
beb0: 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 2f  E_OK;          /
bec0: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
bed0: 0a 0a 20 20 20 20 2f 2a 20 41 6c 77 61 79 73 20  ..    /* Always 
bee0: 63 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72 6e 61  close the journa
bef0: 6c 20 66 69 6c 65 20 77 68 65 6e 20 64 72 6f 70  l file when drop
bf00: 70 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ping the databas
bf10: 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2a 20 4f  e lock..    ** O
bf20: 74 68 65 72 77 69 73 65 2c 20 61 6e 6f 74 68 65  therwise, anothe
bf30: 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74  r connection wit
bf40: 68 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 64  h journal_mode=d
bf50: 65 6c 65 74 65 20 6d 69 67 68 74 0a 20 20 20 20  elete might.    
bf60: 2a 2a 20 64 65 6c 65 74 65 20 74 68 65 20 66 69  ** delete the fi
bf70: 6c 65 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65  le out from unde
bf80: 72 20 75 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  r us..    */.   
bf90: 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
bfa0: 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
bfb0: 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
bfc0: 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70  estroy(pPager->p
bfd0: 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  InJournal);.    
bfe0: 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
bff0: 61 6c 20 3d 20 30 3b 0a 20 20 20 20 72 65 6c 65  al = 0;.    rele
c000: 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73  aseAllSavepoints
c010: 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 20 20 2f  (pPager);..    /
c020: 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73  * If the file is
c030: 20 75 6e 6c 6f 63 6b 65 64 2c 20 73 6f 6d 65 62   unlocked, someb
c040: 6f 64 79 20 65 6c 73 65 20 6d 69 67 68 74 20 63  ody else might c
c050: 68 61 6e 67 65 20 69 74 2e 20 54 68 65 0a 20 20  hange it. The.  
c060: 20 20 2a 2a 20 76 61 6c 75 65 73 20 73 74 6f 72    ** values stor
c070: 65 64 20 69 6e 20 50 61 67 65 72 2e 64 62 53 69  ed in Pager.dbSi
c080: 7a 65 20 65 74 63 2e 20 6d 69 67 68 74 20 62 65  ze etc. might be
c090: 63 6f 6d 65 20 69 6e 76 61 6c 69 64 20 69 66 0a  come invalid if.
c0a0: 20 20 20 20 2a 2a 20 74 68 69 73 20 68 61 70 70      ** this happ
c0b0: 65 6e 73 2e 20 20 4f 6e 65 20 63 61 6e 20 61 72  ens.  One can ar
c0c0: 67 75 65 20 74 68 61 74 20 74 68 69 73 20 64 6f  gue that this do
c0d0: 65 73 6e 27 74 20 6e 65 65 64 20 74 6f 20 62 65  esn't need to be
c0e0: 20 63 6c 65 61 72 65 64 0a 20 20 20 20 2a 2a 20   cleared.    ** 
c0f0: 75 6e 74 69 6c 20 74 68 65 20 63 68 61 6e 67 65  until the change
c100: 2d 63 6f 75 6e 74 65 72 20 63 68 65 63 6b 20 66  -counter check f
c110: 61 69 6c 73 20 69 6e 20 50 61 67 65 72 53 68 61  ails in PagerSha
c120: 72 65 64 4c 6f 63 6b 28 29 2e 0a 20 20 20 20 2a  redLock()..    *
c130: 2a 20 43 6c 65 61 72 69 6e 67 20 74 68 65 20 70  * Clearing the p
c140: 61 67 65 20 73 69 7a 65 20 63 61 63 68 65 20 68  age size cache h
c150: 65 72 65 20 69 73 20 62 65 69 6e 67 20 63 6f 6e  ere is being con
c160: 73 65 72 76 61 74 69 76 65 2e 0a 20 20 20 20 2a  servative..    *
c170: 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  /.    pPager->db
c180: 53 69 7a 65 56 61 6c 69 64 20 3d 20 30 3b 0a 0a  SizeValid = 0;..
c190: 20 20 20 20 69 66 28 20 70 61 67 65 72 55 73 65      if( pagerUse
c1a0: 4c 6f 67 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Log(pPager) ){. 
c1b0: 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 67 43       sqlite3LogC
c1c0: 6c 6f 73 65 53 6e 61 70 73 68 6f 74 28 70 50 61  loseSnapshot(pPa
c1d0: 67 65 72 2d 3e 70 4c 6f 67 29 3b 0a 20 20 20 20  ger->pLog);.    
c1e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
c1f0: 3d 20 6f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65  = osUnlock(pPage
c200: 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  r->fd, NO_LOCK);
c210: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
c220: 63 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  c ){.      pPage
c230: 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63 3b  r->errCode = rc;
c240: 0a 20 20 20 20 7d 0a 20 20 20 20 49 4f 54 52 41  .    }.    IOTRA
c250: 43 45 28 28 22 55 4e 4c 4f 43 4b 20 25 70 5c 6e  CE(("UNLOCK %p\n
c260: 22 2c 20 70 50 61 67 65 72 29 29 0a 0a 20 20 20  ", pPager))..   
c270: 20 2f 2a 20 49 66 20 50 61 67 65 72 2e 65 72 72   /* If Pager.err
c280: 43 6f 64 65 20 69 73 20 73 65 74 2c 20 74 68 65  Code is set, the
c290: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
c2a0: 20 70 61 67 65 72 20 63 61 63 68 65 20 63 61 6e   pager cache can
c2b0: 6e 6f 74 20 62 65 0a 20 20 20 20 2a 2a 20 74 72  not be.    ** tr
c2c0: 75 73 74 65 64 2e 20 4e 6f 77 20 74 68 61 74 20  usted. Now that 
c2d0: 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 20 69  the pager file i
c2e0: 73 20 75 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 20  s unlocked, the 
c2f0: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a  contents of the.
c300: 20 20 20 20 2a 2a 20 63 61 63 68 65 20 63 61 6e      ** cache can
c310: 20 62 65 20 64 69 73 63 61 72 64 65 64 20 61 6e   be discarded an
c320: 64 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  d the error code
c330: 20 73 61 66 65 6c 79 20 63 6c 65 61 72 65 64 2e   safely cleared.
c340: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
c350: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
c360: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  ){.      if( rc=
c370: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
c380: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72        pPager->er
c390: 72 43 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 4f  rCode = SQLITE_O
c3a0: 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
c3b0: 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61   pager_reset(pPa
c3c0: 67 65 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ger);.    }..   
c3d0: 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
c3e0: 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20  ountDone = 0;.  
c3f0: 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
c400: 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a  = PAGER_UNLOCK;.
c410: 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f      pPager->dbMo
c420: 64 69 66 69 65 64 20 3d 20 30 3b 0a 20 20 7d 0a  dified = 0;.  }.
c430: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
c440: 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65  nction should be
c450: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20   called when an 
c460: 49 4f 45 52 52 2c 20 43 4f 52 52 55 50 54 20 6f  IOERR, CORRUPT o
c470: 72 20 46 55 4c 4c 20 65 72 72 6f 72 0a 2a 2a 20  r FULL error.** 
c480: 6d 61 79 20 68 61 76 65 20 6f 63 63 75 72 72 65  may have occurre
c490: 64 2e 20 54 68 65 20 66 69 72 73 74 20 61 72 67  d. The first arg
c4a0: 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74  ument is a point
c4b0: 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 72 20  er to the pager 
c4c0: 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2c 20 74  .** structure, t
c4d0: 68 65 20 73 65 63 6f 6e 64 20 74 68 65 20 65 72  he second the er
c4e0: 72 6f 72 2d 63 6f 64 65 20 61 62 6f 75 74 20 74  ror-code about t
c4f0: 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79  o be returned by
c500: 20 61 20 70 61 67 65 72 20 0a 2a 2a 20 41 50 49   a pager .** API
c510: 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20 76   function. The v
c520: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73  alue returned is
c530: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73   a copy of the s
c540: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 0a  econd argument .
c550: 2a 2a 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  ** to this funct
c560: 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ion. .**.** If t
c570: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
c580: 6e 74 20 69 73 20 53 51 4c 49 54 45 5f 49 4f 45  nt is SQLITE_IOE
c590: 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  RR, SQLITE_CORRU
c5a0: 50 54 2c 20 6f 72 20 53 51 4c 49 54 45 5f 46 55  PT, or SQLITE_FU
c5b0: 4c 4c 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 20  LL.** the error 
c5c0: 62 65 63 6f 6d 65 73 20 70 65 72 73 69 73 74 65  becomes persiste
c5d0: 6e 74 2e 20 55 6e 74 69 6c 20 74 68 65 20 70 65  nt. Until the pe
c5e0: 72 73 69 73 74 65 6e 20 65 72 72 6f 72 20 69 73  rsisten error is
c5f0: 20 63 6c 65 61 72 65 64 2c 0a 2a 2a 20 73 75 62   cleared,.** sub
c600: 73 65 71 75 65 6e 74 20 41 50 49 20 63 61 6c 6c  sequent API call
c610: 73 20 6f 6e 20 74 68 69 73 20 50 61 67 65 72 20  s on this Pager 
c620: 77 69 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79  will immediately
c630: 20 72 65 74 75 72 6e 20 74 68 65 20 73 61 6d 65   return the same
c640: 20 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 2e   .** error code.
c650: 0a 2a 2a 0a 2a 2a 20 41 20 70 65 72 73 69 73 74  .**.** A persist
c660: 65 6e 74 20 65 72 72 6f 72 20 69 6e 64 69 63 61  ent error indica
c670: 74 65 73 20 74 68 61 74 20 74 68 65 20 63 6f 6e  tes that the con
c680: 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
c690: 65 72 2d 63 61 63 68 65 20 0a 2a 2a 20 63 61 6e  er-cache .** can
c6a0: 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e 20  not be trusted. 
c6b0: 54 68 69 73 20 73 74 61 74 65 20 63 61 6e 20 62  This state can b
c6c0: 65 20 63 6c 65 61 72 65 64 20 62 79 20 63 6f 6d  e cleared by com
c6d0: 70 6c 65 74 65 6c 79 20 64 69 73 63 61 72 64 69  pletely discardi
c6e0: 6e 67 20 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65  ng .** the conte
c6f0: 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72  nts of the pager
c700: 2d 63 61 63 68 65 2e 20 49 66 20 61 20 74 72 61  -cache. If a tra
c710: 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 61 63 74  nsaction was act
c720: 69 76 65 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20  ive when.** the 
c730: 70 65 72 73 69 73 74 65 6e 74 20 65 72 72 6f 72  persistent error
c740: 20 6f 63 63 75 72 72 65 64 2c 20 74 68 65 6e 20   occurred, then 
c750: 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
c760: 72 6e 61 6c 20 6d 61 79 20 6e 65 65 64 0a 2a 2a  rnal may need.**
c770: 20 74 6f 20 62 65 20 72 65 70 6c 61 79 65 64 20   to be replayed 
c780: 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 63  to restore the c
c790: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 64  ontents of the d
c7a0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 61 73  atabase file (as
c7b0: 20 69 66 0a 2a 2a 20 69 74 20 77 65 72 65 20 61   if.** it were a
c7c0: 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a   hot-journal)..*
c7d0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
c7e0: 65 72 5f 65 72 72 6f 72 28 50 61 67 65 72 20 2a  er_error(Pager *
c7f0: 70 50 61 67 65 72 2c 20 69 6e 74 20 72 63 29 7b  pPager, int rc){
c800: 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 72 63 20  .  int rc2 = rc 
c810: 26 20 30 78 66 66 3b 0a 20 20 61 73 73 65 72 74  & 0xff;.  assert
c820: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
c830: 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61  || !MEMDB );.  a
c840: 73 73 65 72 74 28 0a 20 20 20 20 20 20 20 70 50  ssert(.       pP
c850: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
c860: 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20  QLITE_FULL ||.  
c870: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72       pPager->err
c880: 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code==SQLITE_OK 
c890: 7c 7c 0a 20 20 20 20 20 20 20 28 70 50 61 67 65  ||.       (pPage
c8a0: 72 2d 3e 65 72 72 43 6f 64 65 20 26 20 30 78 66  r->errCode & 0xf
c8b0: 66 29 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  f)==SQLITE_IOERR
c8c0: 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63 32 3d  .  );.  if( rc2=
c8d0: 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 20  =SQLITE_FULL || 
c8e0: 72 63 32 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52  rc2==SQLITE_IOER
c8f0: 52 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  R ){.    pPager-
c900: 3e 65 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20  >errCode = rc;. 
c910: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
c920: 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65  }../*.** Execute
c930: 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 66 20 61   a rollback if a
c940: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
c950: 61 63 74 69 76 65 20 61 6e 64 20 75 6e 6c 6f 63  active and unloc
c960: 6b 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61  k the .** databa
c970: 73 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20  se file. .**.** 
c980: 49 66 20 74 68 65 20 70 61 67 65 72 20 68 61 73  If the pager has
c990: 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64   already entered
c9a0: 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
c9b0: 2c 20 64 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74  , do not attempt
c9c0: 20 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63   .** the rollbac
c9d0: 6b 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20  k at this time. 
c9e0: 49 6e 73 74 65 61 64 2c 20 70 61 67 65 72 5f 75  Instead, pager_u
c9f0: 6e 6c 6f 63 6b 28 29 20 69 73 20 63 61 6c 6c 65  nlock() is calle
ca00: 64 2e 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 20 74  d. The.** call t
ca10: 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29  o pager_unlock()
ca20: 20 77 69 6c 6c 20 64 69 73 63 61 72 64 20 61 6c   will discard al
ca30: 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  l in-memory page
ca40: 73 2c 20 75 6e 6c 6f 63 6b 0a 2a 2a 20 74 68 65  s, unlock.** the
ca50: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
ca60: 6e 64 20 63 6c 65 61 72 20 74 68 65 20 65 72 72  nd clear the err
ca70: 6f 72 20 73 74 61 74 65 2e 20 49 66 20 74 68 69  or state. If thi
ca80: 73 20 6d 65 61 6e 73 20 74 68 61 74 0a 2a 2a 20  s means that.** 
ca90: 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 2d 6a  there is a hot-j
caa0: 6f 75 72 6e 61 6c 20 6c 65 66 74 20 69 6e 20 74  ournal left in t
cab0: 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20  he file-system, 
cac0: 74 68 65 20 6e 65 78 74 20 63 6f 6e 6e 65 63 74  the next connect
cad0: 69 6f 6e 0a 2a 2a 20 74 6f 20 6f 62 74 61 69 6e  ion.** to obtain
cae0: 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f   a shared lock o
caf0: 6e 20 74 68 65 20 70 61 67 65 72 20 28 77 68 69  n the pager (whi
cb00: 63 68 20 6d 61 79 20 62 65 20 74 68 69 73 20 6f  ch may be this o
cb10: 6e 65 29 20 77 69 6c 6c 0a 2a 2a 20 72 6f 6c 6c  ne) will.** roll
cb20: 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20   it back..**.** 
cb30: 49 66 20 74 68 65 20 70 61 67 65 72 20 68 61 73  If the pager has
cb40: 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 6e 74   not already ent
cb50: 65 72 65 64 20 74 68 65 20 65 72 72 6f 72 20 73  ered the error s
cb60: 74 61 74 65 2c 20 62 75 74 20 61 6e 20 49 4f 20  tate, but an IO 
cb70: 6f 72 0a 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72 72  or.** malloc err
cb80: 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
cb90: 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65   a rollback, the
cba0: 6e 20 74 68 69 73 20 77 69 6c 6c 20 69 74 73 65  n this will itse
cbb0: 6c 66 20 63 61 75 73 65 20 0a 2a 2a 20 74 68 65  lf cause .** the
cbc0: 20 70 61 67 65 72 20 74 6f 20 65 6e 74 65 72 20   pager to enter 
cbd0: 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2e  the error state.
cbe0: 20 57 68 69 63 68 20 77 69 6c 6c 20 62 65 20 63   Which will be c
cbf0: 6c 65 61 72 65 64 20 62 79 20 74 68 65 0a 2a 2a  leared by the.**
cc00: 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75   call to pager_u
cc10: 6e 6c 6f 63 6b 28 29 2c 20 61 73 20 64 65 73 63  nlock(), as desc
cc20: 72 69 62 65 64 20 61 62 6f 76 65 2e 0a 2a 2f 0a  ribed above..*/.
cc30: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
cc40: 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61  rUnlockAndRollba
cc50: 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
cc60: 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ){.  if( pPager-
cc70: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
cc80: 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 73  _OK && pPager->s
cc90: 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45  tate>=PAGER_RESE
cca0: 52 56 45 44 20 29 7b 0a 20 20 20 20 73 71 6c 69  RVED ){.    sqli
ccb0: 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
ccc0: 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 73 71 6c 69  lloc();.    sqli
ccd0: 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b  te3PagerRollback
cce0: 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 73 71  (pPager);.    sq
ccf0: 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
cd00: 6c 6c 6f 63 28 29 3b 0a 20 20 7d 0a 20 20 70 61  lloc();.  }.  pa
cd10: 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65  ger_unlock(pPage
cd20: 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  r);.}../*.** Thi
cd30: 73 20 72 6f 75 74 69 6e 65 20 65 6e 64 73 20 61  s routine ends a
cd40: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20   transaction. A 
cd50: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 75  transaction is u
cd60: 73 75 61 6c 6c 79 20 65 6e 64 65 64 20 62 79 20  sually ended by 
cd70: 0a 2a 2a 20 65 69 74 68 65 72 20 61 20 43 4f 4d  .** either a COM
cd80: 4d 49 54 20 6f 72 20 61 20 52 4f 4c 4c 42 41 43  MIT or a ROLLBAC
cd90: 4b 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68 69  K operation. Thi
cda0: 73 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 62 65  s routine may be
cdb0: 20 63 61 6c 6c 65 64 20 0a 2a 2a 20 61 66 74 65   called .** afte
cdc0: 72 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20  r rollback of a 
cdd0: 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20  hot-journal, or 
cde0: 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
cdf0: 72 73 20 77 68 69 6c 65 20 6f 70 65 6e 69 6e 67  rs while opening
ce00: 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  .** the journal 
ce10: 66 69 6c 65 20 6f 72 20 77 72 69 74 69 6e 67 20  file or writing 
ce20: 74 68 65 20 76 65 72 79 20 66 69 72 73 74 20 6a  the very first j
ce30: 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 6f 66  ournal-header of
ce40: 20 61 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74   a.** database t
ce50: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 0a  ransaction..** .
ce60: 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  ** If the pager 
ce70: 69 73 20 69 6e 20 50 41 47 45 52 5f 53 48 41 52  is in PAGER_SHAR
ce80: 45 44 20 6f 72 20 50 41 47 45 52 5f 55 4e 4c 4f  ED or PAGER_UNLO
ce90: 43 4b 20 73 74 61 74 65 20 77 68 65 6e 20 74 68  CK state when th
cea0: 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73  is.** routine is
ceb0: 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61   called, it is a
cec0: 20 6e 6f 2d 6f 70 20 28 72 65 74 75 72 6e 73 20   no-op (returns 
ced0: 53 51 4c 49 54 45 5f 4f 4b 29 2e 0a 2a 2a 0a 2a  SQLITE_OK)..**.*
cee0: 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 79  * Otherwise, any
cef0: 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e   active savepoin
cf00: 74 73 20 61 72 65 20 72 65 6c 65 61 73 65 64 2e  ts are released.
cf10: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f  .**.** If the jo
cf20: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70  urnal file is op
cf30: 65 6e 2c 20 74 68 65 6e 20 69 74 20 69 73 20 22  en, then it is "
cf40: 66 69 6e 61 6c 69 7a 65 64 22 2e 20 4f 6e 63 65  finalized". Once
cf50: 20 61 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 66   a journal .** f
cf60: 69 6c 65 20 68 61 73 20 62 65 65 6e 20 66 69 6e  ile has been fin
cf70: 61 6c 69 7a 65 64 20 69 74 20 69 73 20 6e 6f 74  alized it is not
cf80: 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 75 73 65   possible to use
cf90: 20 69 74 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b   it to roll back
cfa0: 20 61 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69   a .** transacti
cfb0: 6f 6e 2e 20 4e 6f 72 20 77 69 6c 6c 20 69 74 20  on. Nor will it 
cfc0: 62 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f  be considered to
cfd0: 20 62 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   be a hot-journa
cfe0: 6c 20 62 79 20 74 68 69 73 0a 2a 2a 20 6f 72 20  l by this.** or 
cff0: 61 6e 79 20 6f 74 68 65 72 20 64 61 74 61 62 61  any other databa
d000: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 45  se connection. E
d010: 78 61 63 74 6c 79 20 68 6f 77 20 61 20 6a 6f 75  xactly how a jou
d020: 72 6e 61 6c 20 69 73 20 66 69 6e 61 6c 69 7a 65  rnal is finalize
d030: 64 0a 2a 2a 20 64 65 70 65 6e 64 73 20 6f 6e 20  d.** depends on 
d040: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
d050: 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e  he pager is runn
d060: 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65  ing in exclusive
d070: 20 6d 6f 64 65 20 61 6e 64 0a 2a 2a 20 74 68 65   mode and.** the
d080: 20 63 75 72 72 65 6e 74 20 6a 6f 75 72 6e 61 6c   current journal
d090: 2d 6d 6f 64 65 20 28 50 61 67 65 72 2e 6a 6f 75  -mode (Pager.jou
d0a0: 72 6e 61 6c 4d 6f 64 65 20 76 61 6c 75 65 29 2c  rnalMode value),
d0b0: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
d0c0: 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65  **   journalMode
d0d0: 3d 3d 4d 45 4d 4f 52 59 0a 2a 2a 20 20 20 20 20  ==MEMORY.**     
d0e0: 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73  Journal file des
d0f0: 63 72 69 70 74 6f 72 20 69 73 20 73 69 6d 70 6c  criptor is simpl
d100: 79 20 63 6c 6f 73 65 64 2e 20 54 68 69 73 20 64  y closed. This d
d110: 65 73 74 72 6f 79 73 20 61 6e 20 0a 2a 2a 20 20  estroys an .**  
d120: 20 20 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75     in-memory jou
d130: 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f  rnal..**.**   jo
d140: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 54 52 55 4e 43  urnalMode==TRUNC
d150: 41 54 45 0a 2a 2a 20 20 20 20 20 4a 6f 75 72 6e  ATE.**     Journ
d160: 61 6c 20 66 69 6c 65 20 69 73 20 74 72 75 6e 63  al file is trunc
d170: 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 62 79 74  ated to zero byt
d180: 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a  es in size..**.*
d190: 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  *   journalMode=
d1a0: 3d 50 45 52 53 49 53 54 0a 2a 2a 20 20 20 20 20  =PERSIST.**     
d1b0: 54 68 65 20 66 69 72 73 74 20 32 38 20 62 79 74  The first 28 byt
d1c0: 65 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  es of the journa
d1d0: 6c 20 66 69 6c 65 20 61 72 65 20 7a 65 72 6f 65  l file are zeroe
d1e0: 64 2e 20 54 68 69 73 20 69 6e 76 61 6c 69 64 61  d. This invalida
d1f0: 74 65 73 0a 2a 2a 20 20 20 20 20 74 68 65 20 66  tes.**     the f
d200: 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  irst journal hea
d210: 64 65 72 20 69 6e 20 74 68 65 20 66 69 6c 65 2c  der in the file,
d220: 20 61 6e 64 20 68 65 6e 63 65 20 74 68 65 20 65   and hence the e
d230: 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  ntire journal.**
d240: 20 20 20 20 20 66 69 6c 65 2e 20 41 6e 20 69 6e       file. An in
d250: 76 61 6c 69 64 20 6a 6f 75 72 6e 61 6c 20 66 69  valid journal fi
d260: 6c 65 20 63 61 6e 6e 6f 74 20 62 65 20 72 6f 6c  le cannot be rol
d270: 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  led back..**.** 
d280: 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 44    journalMode==D
d290: 45 4c 45 54 45 0a 2a 2a 20 20 20 20 20 54 68 65  ELETE.**     The
d2a0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
d2b0: 20 63 6c 6f 73 65 64 20 61 6e 64 20 64 65 6c 65   closed and dele
d2c0: 74 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65  ted using sqlite
d2d0: 33 4f 73 44 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a  3OsDelete()..**.
d2e0: 2a 2a 20 20 20 20 20 49 66 20 74 68 65 20 70 61  **     If the pa
d2f0: 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69  ger is running i
d300: 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
d310: 2c 20 74 68 69 73 20 6d 65 74 68 6f 64 20 6f 66  , this method of
d320: 20 66 69 6e 61 6c 69 7a 69 6e 67 0a 2a 2a 20 20   finalizing.**  
d330: 20 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66     the journal f
d340: 69 6c 65 20 69 73 20 6e 65 76 65 72 20 75 73 65  ile is never use
d350: 64 2e 20 49 6e 73 74 65 61 64 2c 20 69 66 20 74  d. Instead, if t
d360: 68 65 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 69  he journalMode i
d370: 73 0a 2a 2a 20 20 20 20 20 44 45 4c 45 54 45 20  s.**     DELETE 
d380: 61 6e 64 20 74 68 65 20 70 61 67 65 72 20 69 73  and the pager is
d390: 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
d3a0: 64 65 2c 20 74 68 65 20 6d 65 74 68 6f 64 20 64  de, the method d
d3b0: 65 73 63 72 69 62 65 64 20 75 6e 64 65 72 0a 2a  escribed under.*
d3c0: 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64  *     journalMod
d3d0: 65 3d 3d 50 45 52 53 49 53 54 20 69 73 20 75 73  e==PERSIST is us
d3e0: 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a  ed instead..**.*
d3f0: 2a 20 41 66 74 65 72 20 74 68 65 20 6a 6f 75 72  * After the jour
d400: 6e 61 6c 20 69 73 20 66 69 6e 61 6c 69 7a 65 64  nal is finalized
d410: 2c 20 69 66 20 72 75 6e 6e 69 6e 67 20 69 6e 20  , if running in 
d420: 6e 6f 6e 2d 65 78 63 6c 75 73 69 76 65 20 6d 6f  non-exclusive mo
d430: 64 65 2c 20 74 68 65 0a 2a 2a 20 70 61 67 65 72  de, the.** pager
d440: 20 6d 6f 76 65 73 20 74 6f 20 50 41 47 45 52 5f   moves to PAGER_
d450: 53 48 41 52 45 44 20 73 74 61 74 65 20 28 61 6e  SHARED state (an
d460: 64 20 64 6f 77 6e 67 72 61 64 65 73 20 74 68 65  d downgrades the
d470: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 2a 2a 20   lock on the.** 
d480: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 63  database file ac
d490: 63 6f 72 64 69 6e 67 6c 79 29 2e 0a 2a 2a 0a 2a  cordingly)..**.*
d4a0: 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
d4b0: 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63  s running in exc
d4c0: 6c 75 73 69 76 65 20 6d 6f 64 65 20 61 6e 64 20  lusive mode and 
d4d0: 69 73 20 69 6e 20 50 41 47 45 52 5f 53 59 4e 43  is in PAGER_SYNC
d4e0: 45 44 20 73 74 61 74 65 2c 0a 2a 2a 20 69 74 20  ED state,.** it 
d4f0: 6d 6f 76 65 73 20 74 6f 20 50 41 47 45 52 5f 45  moves to PAGER_E
d500: 58 43 4c 55 53 49 56 45 2e 20 4e 6f 20 6c 6f 63  XCLUSIVE. No loc
d510: 6b 73 20 61 72 65 20 64 6f 77 6e 67 72 61 64 65  ks are downgrade
d520: 64 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69  d when running i
d530: 6e 0a 2a 2a 20 65 78 63 6c 75 73 69 76 65 20 6d  n.** exclusive m
d540: 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  ode..**.** SQLIT
d550: 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
d560: 20 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63   if no error occ
d570: 75 72 73 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  urs. If an error
d580: 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 0a 2a   occurs during.*
d590: 2a 20 61 6e 79 20 6f 66 20 74 68 65 20 49 4f 20  * any of the IO 
d5a0: 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 66 69  operations to fi
d5b0: 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e  nalize the journ
d5c0: 61 6c 20 66 69 6c 65 20 6f 72 20 75 6e 6c 6f 63  al file or unloc
d5d0: 6b 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  k the.** databas
d5e0: 65 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72  e then the IO er
d5f0: 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
d600: 72 6e 65 64 20 74 6f 20 74 68 65 20 75 73 65 72  rned to the user
d610: 2e 20 49 66 20 74 68 65 20 0a 2a 2a 20 6f 70 65  . If the .** ope
d620: 72 61 74 69 6f 6e 20 74 6f 20 66 69 6e 61 6c 69  ration to finali
d630: 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ze the journal f
d640: 69 6c 65 20 66 61 69 6c 73 2c 20 74 68 65 6e 20  ile fails, then 
d650: 74 68 65 20 63 6f 64 65 20 73 74 69 6c 6c 0a 2a  the code still.*
d660: 2a 20 74 72 69 65 73 20 74 6f 20 75 6e 6c 6f 63  * tries to unloc
d670: 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  k the database f
d680: 69 6c 65 20 69 66 20 6e 6f 74 20 69 6e 20 65 78  ile if not in ex
d690: 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 20 49 66  clusive mode. If
d6a0: 20 74 68 65 0a 2a 2a 20 75 6e 6c 6f 63 6b 20 6f   the.** unlock o
d6b0: 70 65 72 61 74 69 6f 6e 20 66 61 69 6c 73 20 61  peration fails a
d6c0: 73 20 77 65 6c 6c 2c 20 74 68 65 6e 20 74 68 65  s well, then the
d6d0: 20 66 69 72 73 74 20 65 72 72 6f 72 20 63 6f 64   first error cod
d6e0: 65 20 72 65 6c 61 74 65 64 0a 2a 2a 20 74 6f 20  e related.** to 
d6f0: 74 68 65 20 66 69 72 73 74 20 65 72 72 6f 72 20  the first error 
d700: 65 6e 63 6f 75 6e 74 65 72 65 64 20 28 74 68 65  encountered (the
d710: 20 6a 6f 75 72 6e 61 6c 20 66 69 6e 61 6c 69 7a   journal finaliz
d720: 61 74 69 6f 6e 20 6f 6e 65 29 20 69 73 0a 2a 2a  ation one) is.**
d730: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
d740: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65  atic int pager_e
d750: 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 50  nd_transaction(P
d760: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
d770: 74 20 68 61 73 4d 61 73 74 65 72 29 7b 0a 20 20  t hasMaster){.  
d780: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
d790: 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 45 72 72 6f  OK;      /* Erro
d7a0: 72 20 63 6f 64 65 20 66 72 6f 6d 20 6a 6f 75 72  r code from jour
d7b0: 6e 61 6c 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e  nal finalization
d7c0: 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20   operation */.  
d7d0: 69 6e 74 20 72 63 32 20 3d 20 53 51 4c 49 54 45  int rc2 = SQLITE
d7e0: 5f 4f 4b 3b 20 20 20 20 20 2f 2a 20 45 72 72 6f  _OK;     /* Erro
d7f0: 72 20 63 6f 64 65 20 66 72 6f 6d 20 64 62 20 66  r code from db f
d800: 69 6c 65 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61  ile unlock opera
d810: 74 69 6f 6e 20 2a 2f 0a 0a 20 20 69 66 28 20 70  tion */..  if( p
d820: 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41 47  Pager->state<PAG
d830: 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20  ER_RESERVED ){. 
d840: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
d850: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61  _OK;.  }.  relea
d860: 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28  seAllSavepoints(
d870: 70 50 61 67 65 72 29 3b 0a 0a 20 20 61 73 73 65  pPager);..  asse
d880: 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
d890: 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 50 61 67 65  r->jfd) || pPage
d8a0: 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->pInJournal==0
d8b0: 20 29 3b 0a 20 20 69 66 28 20 69 73 4f 70 65 6e   );.  if( isOpen
d8c0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b  (pPager->jfd) ){
d8d0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 61  .    assert( !pa
d8e0: 67 65 72 55 73 65 4c 6f 67 28 70 50 61 67 65 72  gerUseLog(pPager
d8f0: 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6e  ) );..    /* Fin
d900: 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61  alize the journa
d910: 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69  l file. */.    i
d920: 66 28 20 73 71 6c 69 74 65 33 49 73 4d 65 6d 4a  f( sqlite3IsMemJ
d930: 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a  ournal(pPager->j
d940: 66 64 29 20 29 7b 0a 20 20 20 20 20 20 61 73 73  fd) ){.      ass
d950: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
d960: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
d970: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
d980: 52 59 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  RY );.      sqli
d990: 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
d9a0: 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 65 6c  r->jfd);.    }el
d9b0: 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  se if( pPager->j
d9c0: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
d9d0: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52  R_JOURNALMODE_TR
d9e0: 55 4e 43 41 54 45 20 29 7b 0a 20 20 20 20 20 20  UNCATE ){.      
d9f0: 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
da00: 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20  nalOff==0 ){.   
da10: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
da20: 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  _OK;.      }else
da30: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
da40: 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
da50: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29  (pPager->jfd, 0)
da60: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
da70: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
da80: 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  ff = 0;.      pP
da90: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61  ager->journalSta
daa0: 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 7d 65  rted = 0;.    }e
dab0: 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e  lse if( pPager->
dac0: 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20  exclusiveMode . 
dad0: 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a      || pPager->j
dae0: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
daf0: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45  R_JOURNALMODE_PE
db00: 52 53 49 53 54 0a 20 20 20 20 29 7b 0a 20 20 20  RSIST.    ){.   
db10: 20 20 20 72 63 20 3d 20 7a 65 72 6f 4a 6f 75 72     rc = zeroJour
db20: 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 68  nalHdr(pPager, h
db30: 61 73 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20  asMaster);.     
db40: 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
db50: 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20  ger, rc);.      
db60: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
db70: 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  ff = 0;.      pP
db80: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61  ager->journalSta
db90: 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 7d 65  rted = 0;.    }e
dba0: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  lse{.      /* Th
dbb0: 69 73 20 62 72 61 6e 63 68 20 6d 61 79 20 62 65  is branch may be
dbc0: 20 65 78 65 63 75 74 65 64 20 77 69 74 68 20 50   executed with P
dbd0: 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ager.journalMode
dbe0: 3d 3d 4d 45 4d 4f 52 59 20 69 66 0a 20 20 20 20  ==MEMORY if.    
dbf0: 20 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e    ** a hot-journ
dc00: 61 6c 20 77 61 73 20 6a 75 73 74 20 72 6f 6c 6c  al was just roll
dc10: 65 64 20 62 61 63 6b 2e 20 49 6e 20 74 68 69 73  ed back. In this
dc20: 20 63 61 73 65 20 74 68 65 20 6a 6f 75 72 6e 61   case the journa
dc30: 6c 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20  l.      ** file 
dc40: 73 68 6f 75 6c 64 20 62 65 20 63 6c 6f 73 65 64  should be closed
dc50: 20 61 6e 64 20 64 65 6c 65 74 65 64 2e 20 49 66   and deleted. If
dc60: 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e   this connection
dc70: 20 77 72 69 74 65 73 20 74 6f 0a 20 20 20 20 20   writes to.     
dc80: 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65   ** the database
dc90: 20 66 69 6c 65 2c 20 69 74 20 77 69 6c 6c 20 64   file, it will d
dca0: 6f 20 73 6f 20 75 73 69 6e 67 20 61 6e 20 69 6e  o so using an in
dcb0: 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e  -memory journal.
dcc0: 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20   .      */.     
dcd0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
dce0: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
dcf0: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
dd00: 44 45 4c 45 54 45 20 0a 20 20 20 20 20 20 20 20  DELETE .        
dd10: 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f     || pPager->jo
dd20: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
dd30: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
dd40: 4f 52 59 20 0a 20 20 20 20 20 20 20 20 20 20 20  ORY .           
dd50: 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  || pPager->journ
dd60: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
dd70: 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20  URNALMODE_WAL . 
dd80: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 73 71       );.      sq
dd90: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
dda0: 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20  ger->jfd);.     
ddb0: 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65   if( !pPager->te
ddc0: 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20  mpFile ){.      
ddd0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
dde0: 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 70  Delete(pPager->p
ddf0: 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
de00: 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20  urnal, 0);.     
de10: 20 7d 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66   }.    }..#ifdef
de20: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
de30: 47 45 53 0a 20 20 20 20 73 71 6c 69 74 65 33 50  GES.    sqlite3P
de40: 63 61 63 68 65 49 74 65 72 61 74 65 44 69 72 74  cacheIterateDirt
de50: 79 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  y(pPager->pPCach
de60: 65 2c 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67  e, pager_set_pag
de70: 65 68 61 73 68 29 3b 0a 23 65 6e 64 69 66 0a 20  ehash);.#endif. 
de80: 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76   }.  sqlite3Bitv
de90: 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72  ecDestroy(pPager
dea0: 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20  ->pInJournal);. 
deb0: 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
dec0: 6e 61 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  nal = 0;.  pPage
ded0: 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 73  r->nRec = 0;.  s
dee0: 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61  qlite3PcacheClea
def0: 6e 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50 43  nAll(pPager->pPC
df00: 61 63 68 65 29 3b 0a 0a 20 20 69 66 28 20 70 61  ache);..  if( pa
df10: 67 65 72 55 73 65 4c 6f 67 28 70 50 61 67 65 72  gerUseLog(pPager
df20: 29 20 29 7b 0a 20 20 20 20 72 63 32 20 3d 20 73  ) ){.    rc2 = s
df30: 71 6c 69 74 65 33 4c 6f 67 57 72 69 74 65 4c 6f  qlite3LogWriteLo
df40: 63 6b 28 70 50 61 67 65 72 2d 3e 70 4c 6f 67 2c  ck(pPager->pLog,
df50: 20 30 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d   0);.    pPager-
df60: 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53  >state = PAGER_S
df70: 48 41 52 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69  HARED;.  }else i
df80: 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  f( !pPager->excl
df90: 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20  usiveMode ){.   
dfa0: 20 72 63 32 20 3d 20 6f 73 55 6e 6c 6f 63 6b 28   rc2 = osUnlock(
dfb0: 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 48 41 52  pPager->fd, SHAR
dfc0: 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 70 50  ED_LOCK);.    pP
dfd0: 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
dfe0: 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20  GER_SHARED;.    
dff0: 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
e000: 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d  untDone = 0;.  }
e010: 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d  else if( pPager-
e020: 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 59  >state==PAGER_SY
e030: 4e 43 45 44 20 29 7b 0a 20 20 20 20 70 50 61 67  NCED ){.    pPag
e040: 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
e050: 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 7d  R_EXCLUSIVE;.  }
e060: 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  .  pPager->setMa
e070: 73 74 65 72 20 3d 20 30 3b 0a 20 20 70 50 61 67  ster = 0;.  pPag
e080: 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  er->needSync = 0
e090: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f  ;.  pPager->dbMo
e0a0: 64 69 66 69 65 64 20 3d 20 30 3b 0a 0a 20 20 2f  dified = 0;..  /
e0b0: 2a 20 54 4f 44 4f 3a 20 49 73 20 74 68 69 73 20  * TODO: Is this 
e0c0: 6f 70 74 69 6d 61 6c 3f 20 57 68 79 20 69 73 20  optimal? Why is 
e0d0: 74 68 65 20 64 62 20 73 69 7a 65 20 69 6e 76 61  the db size inva
e0e0: 6c 69 64 61 74 65 64 20 68 65 72 65 20 0a 20 20  lidated here .  
e0f0: 2a 2a 20 77 68 65 6e 20 74 68 65 20 64 61 74 61  ** when the data
e100: 62 61 73 65 20 66 69 6c 65 20 69 73 20 6e 6f 74  base file is not
e110: 20 75 6e 6c 6f 63 6b 65 64 3f 20 2a 2f 0a 20 20   unlocked? */.  
e120: 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
e130: 7a 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  ze = 0;.  sqlite
e140: 33 50 63 61 63 68 65 54 72 75 6e 63 61 74 65 28  3PcacheTruncate(
e150: 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
e160: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29   pPager->dbSize)
e170: 3b 0a 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29  ;.  if( !MEMDB )
e180: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  {.    pPager->db
e190: 53 69 7a 65 56 61 6c 69 64 20 3d 20 30 3b 0a 20  SizeValid = 0;. 
e1a0: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 28 72 63   }..  return (rc
e1b0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f 72 63 32 3a  ==SQLITE_OK?rc2:
e1c0: 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61  rc);.}../*.** Pa
e1d0: 72 61 6d 65 74 65 72 20 61 44 61 74 61 20 6d 75  rameter aData mu
e1e0: 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75  st point to a bu
e1f0: 66 66 65 72 20 6f 66 20 70 50 61 67 65 72 2d 3e  ffer of pPager->
e200: 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 0a 2a  pageSize bytes.*
e210: 2a 20 6f 66 20 64 61 74 61 2e 20 43 6f 6d 70 75  * of data. Compu
e220: 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  te and return a 
e230: 63 68 65 63 6b 73 75 6d 20 62 61 73 65 64 20 6f  checksum based o
e240: 6e 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  nt the contents 
e250: 6f 66 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 20  of the .** page 
e260: 6f 66 20 64 61 74 61 20 61 6e 64 20 74 68 65 20  of data and the 
e270: 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66  current value of
e280: 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e   pPager->cksumIn
e290: 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  it..**.** This i
e2a0: 73 20 6e 6f 74 20 61 20 72 65 61 6c 20 63 68 65  s not a real che
e2b0: 63 6b 73 75 6d 2e 20 49 74 20 69 73 20 72 65 61  cksum. It is rea
e2c0: 6c 6c 79 20 6a 75 73 74 20 74 68 65 20 73 75 6d  lly just the sum
e2d0: 20 6f 66 20 74 68 65 20 0a 2a 2a 20 72 61 6e 64   of the .** rand
e2e0: 6f 6d 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65  om initial value
e2f0: 20 28 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49   (pPager->cksumI
e300: 6e 69 74 29 20 61 6e 64 20 65 76 65 72 79 20 32  nit) and every 2
e310: 30 30 74 68 20 62 79 74 65 0a 2a 2a 20 6f 66 20  00th byte.** of 
e320: 74 68 65 20 70 61 67 65 20 64 61 74 61 2c 20 73  the page data, s
e330: 74 61 72 74 69 6e 67 20 77 69 74 68 20 62 79 74  tarting with byt
e340: 65 20 6f 66 66 73 65 74 20 28 70 50 61 67 65 72  e offset (pPager
e350: 2d 3e 70 61 67 65 53 69 7a 65 25 32 30 30 29 2e  ->pageSize%200).
e360: 0a 2a 2a 20 45 61 63 68 20 62 79 74 65 20 69 73  .** Each byte is
e370: 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20   interpreted as 
e380: 61 6e 20 38 2d 62 69 74 20 75 6e 73 69 67 6e 65  an 8-bit unsigne
e390: 64 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a  d integer..**.**
e3a0: 20 43 68 61 6e 67 69 6e 67 20 74 68 65 20 66 6f   Changing the fo
e3b0: 72 6d 75 6c 61 20 75 73 65 64 20 74 6f 20 63 6f  rmula used to co
e3c0: 6d 70 75 74 65 20 74 68 69 73 20 63 68 65 63 6b  mpute this check
e3d0: 73 75 6d 20 72 65 73 75 6c 74 73 20 69 6e 20 61  sum results in a
e3e0: 6e 0a 2a 2a 20 69 6e 63 6f 6d 70 61 74 69 62 6c  n.** incompatibl
e3f0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
e400: 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ormat..**.** If 
e410: 6a 6f 75 72 6e 61 6c 20 63 6f 72 72 75 70 74 69  journal corrupti
e420: 6f 6e 20 6f 63 63 75 72 73 20 64 75 65 20 74 6f  on occurs due to
e430: 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65   a power failure
e440: 2c 20 74 68 65 20 6d 6f 73 74 20 6c 69 6b 65 6c  , the most likel
e450: 79 20 0a 2a 2a 20 73 63 65 6e 61 72 69 6f 20 69  y .** scenario i
e460: 73 20 74 68 61 74 20 6f 6e 65 20 65 6e 64 20 6f  s that one end o
e470: 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74  r the other of t
e480: 68 65 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62  he record will b
e490: 65 20 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49  e changed. .** I
e4a0: 74 20 69 73 20 6d 75 63 68 20 6c 65 73 73 20 6c  t is much less l
e4b0: 69 6b 65 6c 79 20 74 68 61 74 20 74 68 65 20 74  ikely that the t
e4c0: 77 6f 20 65 6e 64 73 20 6f 66 20 74 68 65 20 6a  wo ends of the j
e4d0: 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77 69  ournal record wi
e4e0: 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72 72 65 63 74  ll be.** correct
e4f0: 20 61 6e 64 20 74 68 65 20 6d 69 64 64 6c 65 20   and the middle 
e500: 62 65 20 63 6f 72 72 75 70 74 2e 20 20 54 68 75  be corrupt.  Thu
e510: 73 2c 20 74 68 69 73 20 22 63 68 65 63 6b 73 75  s, this "checksu
e520: 6d 22 20 73 63 68 65 6d 65 2c 0a 2a 2a 20 74 68  m" scheme,.** th
e530: 6f 75 67 68 20 66 61 73 74 20 61 6e 64 20 73 69  ough fast and si
e540: 6d 70 6c 65 2c 20 63 61 74 63 68 65 73 20 74 68  mple, catches th
e550: 65 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c 79 20  e mostly likely 
e560: 6b 69 6e 64 20 6f 66 20 63 6f 72 72 75 70 74 69  kind of corrupti
e570: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33  on..*/.static u3
e580: 32 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 50 61  2 pager_cksum(Pa
e590: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e  ger *pPager, con
e5a0: 73 74 20 75 38 20 2a 61 44 61 74 61 29 7b 0a 20  st u8 *aData){. 
e5b0: 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 70 50 61   u32 cksum = pPa
e5c0: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 20  ger->cksumInit; 
e5d0: 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
e5e0: 73 75 6d 20 76 61 6c 75 65 20 74 6f 20 72 65 74  sum value to ret
e5f0: 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d  urn */.  int i =
e600: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
e610: 65 2d 32 30 30 3b 20 20 20 20 20 20 20 20 20 20  e-200;          
e620: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
e630: 2a 2f 0a 20 20 77 68 69 6c 65 28 20 69 3e 30 20  */.  while( i>0 
e640: 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20  ){.    cksum += 
e650: 61 44 61 74 61 5b 69 5d 3b 0a 20 20 20 20 69 20  aData[i];.    i 
e660: 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a 20 20 72 65  -= 200;.  }.  re
e670: 74 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f  turn cksum;.}../
e680: 2a 0a 2a 2a 20 52 65 61 64 20 61 20 73 69 6e 67  *.** Read a sing
e690: 6c 65 20 70 61 67 65 20 66 72 6f 6d 20 65 69 74  le page from eit
e6a0: 68 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  her the journal 
e6b0: 66 69 6c 65 20 28 69 66 20 69 73 4d 61 69 6e 4a  file (if isMainJ
e6c0: 72 6e 6c 3d 3d 31 29 20 6f 72 0a 2a 2a 20 66 72  rnl==1) or.** fr
e6d0: 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  om the sub-journ
e6e0: 61 6c 20 28 69 66 20 69 73 4d 61 69 6e 4a 72 6e  al (if isMainJrn
e6f0: 6c 3d 3d 30 29 20 61 6e 64 20 70 6c 61 79 62 61  l==0) and playba
e700: 63 6b 20 74 68 61 74 20 70 61 67 65 2e 0a 2a 2a  ck that page..**
e710: 20 54 68 65 20 70 61 67 65 20 62 65 67 69 6e 73   The page begins
e720: 20 61 74 20 6f 66 66 73 65 74 20 2a 70 4f 66 66   at offset *pOff
e730: 73 65 74 20 69 6e 74 6f 20 74 68 65 20 66 69 6c  set into the fil
e740: 65 2e 20 54 68 65 20 2a 70 4f 66 66 73 65 74 0a  e. The *pOffset.
e750: 2a 2a 20 76 61 6c 75 65 20 69 73 20 69 6e 63 72  ** value is incr
e760: 65 61 73 65 64 20 74 6f 20 74 68 65 20 73 74 61  eased to the sta
e770: 72 74 20 6f 66 20 74 68 65 20 6e 65 78 74 20 70  rt of the next p
e780: 61 67 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  age in the journ
e790: 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73  al..**.** The is
e7a0: 4d 61 69 6e 4a 72 6e 6c 20 66 6c 61 67 20 69 73  MainJrnl flag is
e7b0: 20 74 72 75 65 20 69 66 20 74 68 69 73 20 69 73   true if this is
e7c0: 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61   the main rollba
e7d0: 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 0a 2a  ck journal and.*
e7e0: 2a 20 66 61 6c 73 65 20 66 6f 72 20 74 68 65 20  * false for the 
e7f0: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
e800: 6c 2e 20 20 54 68 65 20 6d 61 69 6e 20 72 6f 6c  l.  The main rol
e810: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 75 73  lback journal us
e820: 65 73 0a 2a 2a 20 63 68 65 63 6b 73 75 6d 73 20  es.** checksums 
e830: 2d 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  - the statement 
e840: 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74  journal does not
e850: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
e860: 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
e870: 65 20 70 61 67 65 20 72 65 63 6f 72 64 20 72 65  e page record re
e880: 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62  ad from the (sub
e890: 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  -)journal file.*
e8a0: 2a 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  * is greater tha
e8b0: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61  n the current va
e8c0: 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62 53  lue of Pager.dbS
e8d0: 69 7a 65 2c 20 74 68 65 6e 20 70 6c 61 79 62 61  ize, then playba
e8e0: 63 6b 20 69 73 0a 2a 2a 20 73 6b 69 70 70 65 64  ck is.** skipped
e8f0: 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69   and SQLITE_OK i
e900: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
e910: 2a 20 49 66 20 70 44 6f 6e 65 20 69 73 20 6e 6f  * If pDone is no
e920: 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20  t NULL, then it 
e930: 69 73 20 61 20 72 65 63 6f 72 64 20 6f 66 20 70  is a record of p
e940: 61 67 65 73 20 74 68 61 74 20 68 61 76 65 20 61  ages that have a
e950: 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20 70  lready.** been p
e960: 6c 61 79 65 64 20 62 61 63 6b 2e 20 20 49 66 20  layed back.  If 
e970: 74 68 65 20 70 61 67 65 20 61 74 20 2a 70 4f 66  the page at *pOf
e980: 66 73 65 74 20 68 61 73 20 61 6c 72 65 61 64 79  fset has already
e990: 20 62 65 65 6e 20 70 6c 61 79 65 64 20 62 61 63   been played bac
e9a0: 6b 0a 2a 2a 20 28 69 66 20 74 68 65 20 63 6f 72  k.** (if the cor
e9b0: 72 65 73 70 6f 6e 64 69 6e 67 20 70 44 6f 6e 65  responding pDone
e9c0: 20 62 69 74 20 69 73 20 73 65 74 29 20 74 68 65   bit is set) the
e9d0: 6e 20 73 6b 69 70 20 74 68 65 20 70 6c 61 79 62  n skip the playb
e9e0: 61 63 6b 2e 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ack..** Make sur
e9f0: 65 20 74 68 65 20 70 44 6f 6e 65 20 62 69 74 20  e the pDone bit 
ea00: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
ea10: 20 74 68 65 20 2a 70 4f 66 66 73 65 74 20 70 61   the *pOffset pa
ea20: 67 65 20 69 73 20 73 65 74 0a 2a 2a 20 70 72 69  ge is set.** pri
ea30: 6f 72 20 74 6f 20 72 65 74 75 72 6e 69 6e 67 2e  or to returning.
ea40: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
ea50: 67 65 20 72 65 63 6f 72 64 20 69 73 20 73 75 63  ge record is suc
ea60: 63 65 73 73 66 75 6c 6c 79 20 72 65 61 64 20 66  cessfully read f
ea70: 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f  rom the (sub-)jo
ea80: 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 61 6e  urnal file.** an
ea90: 64 20 70 6c 61 79 65 64 20 62 61 63 6b 2c 20 74  d played back, t
eaa0: 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  hen SQLITE_OK is
eab0: 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e   returned. If an
eac0: 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
ead0: 0a 2a 2a 20 77 68 69 6c 65 20 72 65 61 64 69 6e  .** while readin
eae0: 67 20 74 68 65 20 72 65 63 6f 72 64 20 66 72 6f  g the record fro
eaf0: 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72  m the (sub-)jour
eb00: 6e 61 6c 20 66 69 6c 65 20 6f 72 20 77 68 69 6c  nal file or whil
eb10: 65 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 6f 20  e writing.** to 
eb20: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
eb30: 65 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65  e, then the IO e
eb40: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
eb50: 75 72 6e 65 64 2e 20 49 66 20 64 61 74 61 0a 2a  urned. If data.*
eb60: 2a 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c  * is successfull
eb70: 79 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  y read from the 
eb80: 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69  (sub-)journal fi
eb90: 6c 65 20 62 75 74 20 61 70 70 65 61 72 73 20 74  le but appears t
eba0: 6f 20 62 65 0a 2a 2a 20 63 6f 72 72 75 70 74 65  o be.** corrupte
ebb0: 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69  d, SQLITE_DONE i
ebc0: 73 20 72 65 74 75 72 6e 65 64 2e 20 44 61 74 61  s returned. Data
ebd0: 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 63   is considered c
ebe0: 6f 72 72 75 70 74 65 64 20 69 6e 0a 2a 2a 20 74  orrupted in.** t
ebf0: 77 6f 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73  wo circumstances
ec00: 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 2a 20 49 66 20  :.** .**   * If 
ec10: 74 68 65 20 72 65 63 6f 72 64 20 70 61 67 65 2d  the record page-
ec20: 6e 75 6d 62 65 72 20 69 73 20 69 6c 6c 65 67 61  number is illega
ec30: 6c 20 28 30 20 6f 72 20 50 41 47 45 52 5f 4d 4a  l (0 or PAGER_MJ
ec40: 5f 50 47 4e 4f 29 2c 20 6f 72 0a 2a 2a 20 20 20  _PGNO), or.**   
ec50: 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72 64 20  * If the record 
ec60: 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20  is being rolled 
ec70: 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61  back from the ma
ec80: 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  in journal file.
ec90: 2a 2a 20 20 20 20 20 61 6e 64 20 74 68 65 20 63  **     and the c
eca0: 68 65 63 6b 73 75 6d 20 66 69 65 6c 64 20 64 6f  hecksum field do
ecb0: 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65  es not match the
ecc0: 20 72 65 63 6f 72 64 20 63 6f 6e 74 65 6e 74 2e   record content.
ecd0: 0a 2a 2a 0a 2a 2a 20 4e 65 69 74 68 65 72 20 6f  .**.** Neither o
ece0: 66 20 74 68 65 73 65 20 74 77 6f 20 73 63 65 6e  f these two scen
ecf0: 61 72 69 6f 73 20 61 72 65 20 70 6f 73 73 69 62  arios are possib
ed00: 6c 65 20 64 75 72 69 6e 67 20 61 20 73 61 76 65  le during a save
ed10: 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 2e 0a  point rollback..
ed20: 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 69 73  **.** If this is
ed30: 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c   a savepoint rol
ed40: 6c 62 61 63 6b 2c 20 74 68 65 6e 20 6d 65 6d 6f  lback, then memo
ed50: 72 79 20 6d 61 79 20 68 61 76 65 20 74 6f 20 62  ry may have to b
ed60: 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 2a 2a  e dynamically.**
ed70: 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68   allocated by th
ed80: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 20  is function. If 
ed90: 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65  this is the case
eda0: 20 61 6e 64 20 61 6e 20 61 6c 6c 6f 63 61 74 69   and an allocati
edb0: 6f 6e 20 66 61 69 6c 73 2c 0a 2a 2a 20 53 51 4c  on fails,.** SQL
edc0: 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74  ITE_NOMEM is ret
edd0: 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
ede0: 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62   int pager_playb
edf0: 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 0a 20 20  ack_one_page(.  
ee00: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
ee10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ee20: 20 54 68 65 20 70 61 67 65 72 20 62 65 69 6e 67   The pager being
ee30: 20 70 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a   played back */.
ee40: 20 20 69 36 34 20 2a 70 4f 66 66 73 65 74 2c 20    i64 *pOffset, 
ee50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee60: 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 72 65 63  /* Offset of rec
ee70: 6f 72 64 20 74 6f 20 70 6c 61 79 62 61 63 6b 20  ord to playback 
ee80: 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 44 6f  */.  Bitvec *pDo
ee90: 6e 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ne,             
eea0: 20 20 20 2f 2a 20 42 69 74 76 65 63 20 6f 66 20     /* Bitvec of 
eeb0: 70 61 67 65 73 20 61 6c 72 65 61 64 79 20 70 6c  pages already pl
eec0: 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69  ayed back */.  i
eed0: 6e 74 20 69 73 4d 61 69 6e 4a 72 6e 6c 2c 20 20  nt isMainJrnl,  
eee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
eef0: 31 20 2d 3e 20 6d 61 69 6e 20 6a 6f 75 72 6e 61  1 -> main journa
ef00: 6c 2e 20 30 20 2d 3e 20 73 75 62 2d 6a 6f 75 72  l. 0 -> sub-jour
ef10: 6e 61 6c 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 73  nal. */.  int is
ef20: 53 61 76 65 70 6e 74 20 20 20 20 20 20 20 20 20  Savepnt         
ef30: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
ef40: 66 6f 72 20 61 20 73 61 76 65 70 6f 69 6e 74 20  for a savepoint 
ef50: 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 29 7b 0a 20  rollback */.){. 
ef60: 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72   int rc;.  PgHdr
ef70: 20 2a 70 50 67 3b 20 20 20 20 20 20 20 20 20 20   *pPg;          
ef80: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65           /* An e
ef90: 78 69 73 74 69 6e 67 20 70 61 67 65 20 69 6e 20  xisting page in 
efa0: 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 50  the cache */.  P
efb0: 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20  gno pgno;       
efc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
efd0: 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  The page number 
efe0: 6f 66 20 61 20 70 61 67 65 20 69 6e 20 6a 6f 75  of a page in jou
eff0: 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b  rnal */.  u32 ck
f000: 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  sum;            
f010: 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
f020: 73 75 6d 20 75 73 65 64 20 66 6f 72 20 73 61 6e  sum used for san
f030: 69 74 79 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a  ity checking */.
f040: 20 20 63 68 61 72 20 2a 61 44 61 74 61 3b 20 20    char *aData;  
f050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f060: 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 73 74 6f  /* Temporary sto
f070: 72 61 67 65 20 66 6f 72 20 74 68 65 20 70 61 67  rage for the pag
f080: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  e */.  sqlite3_f
f090: 69 6c 65 20 2a 6a 66 64 3b 20 20 20 20 20 20 20  ile *jfd;       
f0a0: 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65       /* The file
f0b0: 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20   descriptor for 
f0c0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
f0d0: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53 79 6e 63   */.  int isSync
f0e0: 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ed;             
f0f0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6a      /* True if j
f100: 6f 75 72 6e 61 6c 20 70 61 67 65 20 69 73 20 73  ournal page is s
f110: 79 6e 63 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65  ynced */..  asse
f120: 72 74 28 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 26  rt( (isMainJrnl&
f130: 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f  ~1)==0 );      /
f140: 2a 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 69 73 20  * isMainJrnl is 
f150: 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65  0 or 1 */.  asse
f160: 72 74 28 20 28 69 73 53 61 76 65 70 6e 74 26 7e  rt( (isSavepnt&~
f170: 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 2f  1)==0 );       /
f180: 2a 20 69 73 53 61 76 65 70 6e 74 20 69 73 20 30  * isSavepnt is 0
f190: 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65 72   or 1 */.  asser
f1a0: 74 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 7c 7c  t( isMainJrnl ||
f1b0: 20 70 44 6f 6e 65 20 29 3b 20 20 20 20 20 2f 2a   pDone );     /*
f1c0: 20 70 44 6f 6e 65 20 61 6c 77 61 79 73 20 75 73   pDone always us
f1d0: 65 64 20 6f 6e 20 73 75 62 2d 6a 6f 75 72 6e 61  ed on sub-journa
f1e0: 6c 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ls */.  assert( 
f1f0: 69 73 53 61 76 65 70 6e 74 20 7c 7c 20 70 44 6f  isSavepnt || pDo
f200: 6e 65 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 70 44  ne==0 );   /* pD
f210: 6f 6e 65 20 6e 65 76 65 72 20 75 73 65 64 20 6f  one never used o
f220: 6e 20 6e 6f 6e 2d 73 61 76 65 70 6f 69 6e 74 20  n non-savepoint 
f230: 2a 2f 0a 0a 20 20 61 44 61 74 61 20 3d 20 70 50  */..  aData = pP
f240: 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
f250: 0a 20 20 61 73 73 65 72 74 28 20 61 44 61 74 61  .  assert( aData
f260: 20 29 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54   );         /* T
f270: 65 6d 70 20 73 74 6f 72 61 67 65 20 6d 75 73 74  emp storage must
f280: 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
f290: 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a  en allocated */.
f2a0: 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 70  .  /* Read the p
f2b0: 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 70  age number and p
f2c0: 61 67 65 20 64 61 74 61 20 66 72 6f 6d 20 74 68  age data from th
f2d0: 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 73 75 62  e journal or sub
f2e0: 2d 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69  -journal.  ** fi
f2f0: 6c 65 2e 20 52 65 74 75 72 6e 20 61 6e 20 65 72  le. Return an er
f300: 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20  ror code to the 
f310: 63 61 6c 6c 65 72 20 69 66 20 61 6e 20 49 4f 20  caller if an IO 
f320: 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 20 20  error occurs..  
f330: 2a 2f 0a 20 20 6a 66 64 20 3d 20 69 73 4d 61 69  */.  jfd = isMai
f340: 6e 4a 72 6e 6c 20 3f 20 70 50 61 67 65 72 2d 3e  nJrnl ? pPager->
f350: 6a 66 64 20 3a 20 70 50 61 67 65 72 2d 3e 73 6a  jfd : pPager->sj
f360: 66 64 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 33  fd;.  rc = read3
f370: 32 62 69 74 73 28 6a 66 64 2c 20 2a 70 4f 66 66  2bits(jfd, *pOff
f380: 73 65 74 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69  set, &pgno);.  i
f390: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
f3a0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
f3b0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
f3c0: 61 64 28 6a 66 64 2c 20 28 75 38 2a 29 61 44 61  ad(jfd, (u8*)aDa
f3d0: 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
f3e0: 53 69 7a 65 2c 20 28 2a 70 4f 66 66 73 65 74 29  Size, (*pOffset)
f3f0: 2b 34 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  +4);.  if( rc!=S
f400: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
f410: 6e 20 72 63 3b 0a 20 20 2a 70 4f 66 66 73 65 74  n rc;.  *pOffset
f420: 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65   += pPager->page
f430: 53 69 7a 65 20 2b 20 34 20 2b 20 69 73 4d 61 69  Size + 4 + isMai
f440: 6e 4a 72 6e 6c 2a 34 3b 0a 0a 20 20 2f 2a 20 53  nJrnl*4;..  /* S
f450: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f  anity checking o
f460: 6e 20 74 68 65 20 70 61 67 65 2e 20 20 54 68 69  n the page.  Thi
f470: 73 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74  s is more import
f480: 61 6e 74 20 74 68 61 74 20 49 20 6f 72 69 67 69  ant that I origi
f490: 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67  nally.  ** thoug
f4a0: 68 74 2e 20 20 49 66 20 61 20 70 6f 77 65 72 20  ht.  If a power 
f4b0: 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77  failure occurs w
f4c0: 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  hile the journal
f4d0: 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65   is being writte
f4e0: 6e 2c 0a 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64  n,.  ** it could
f4f0: 20 63 61 75 73 65 20 69 6e 76 61 6c 69 64 20 64   cause invalid d
f500: 61 74 61 20 74 6f 20 62 65 20 77 72 69 74 74 65  ata to be writte
f510: 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  n into the journ
f520: 61 6c 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 0a  al.  We need to.
f530: 20 20 2a 2a 20 64 65 74 65 63 74 20 74 68 69 73    ** detect this
f540: 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20 28 77   invalid data (w
f550: 69 74 68 20 68 69 67 68 20 70 72 6f 62 61 62 69  ith high probabi
f560: 6c 69 74 79 29 20 61 6e 64 20 69 67 6e 6f 72 65  lity) and ignore
f570: 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20   it..  */.  if( 
f580: 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d  pgno==0 || pgno=
f590: 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
f5a0: 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 61 73  Pager) ){.    as
f5b0: 73 65 72 74 28 20 21 69 73 53 61 76 65 70 6e 74  sert( !isSavepnt
f5c0: 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   );.    return S
f5d0: 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a  QLITE_DONE;.  }.
f5e0: 20 20 69 66 28 20 70 67 6e 6f 3e 28 50 67 6e 6f    if( pgno>(Pgno
f5f0: 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  )pPager->dbSize 
f600: 7c 7c 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  || sqlite3Bitvec
f610: 54 65 73 74 28 70 44 6f 6e 65 2c 20 70 67 6e 6f  Test(pDone, pgno
f620: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
f630: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
f640: 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20   if( isMainJrnl 
f650: 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64  ){.    rc = read
f660: 33 32 62 69 74 73 28 6a 66 64 2c 20 28 2a 70 4f  32bits(jfd, (*pO
f670: 66 66 73 65 74 29 2d 34 2c 20 26 63 6b 73 75 6d  ffset)-4, &cksum
f680: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
f690: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 69  return rc;.    i
f6a0: 66 28 20 21 69 73 53 61 76 65 70 6e 74 20 26 26  f( !isSavepnt &&
f6b0: 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61   pager_cksum(pPa
f6c0: 67 65 72 2c 20 28 75 38 2a 29 61 44 61 74 61 29  ger, (u8*)aData)
f6d0: 21 3d 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20  !=cksum ){.     
f6e0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
f6f0: 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ONE;.    }.  }..
f700: 20 20 69 66 28 20 70 44 6f 6e 65 20 26 26 20 28    if( pDone && (
f710: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  rc = sqlite3Bitv
f720: 65 63 53 65 74 28 70 44 6f 6e 65 2c 20 70 67 6e  ecSet(pDone, pgn
f730: 6f 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  o))!=SQLITE_OK )
f740: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
f750: 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
f760: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
f770: 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 7c 7c  AGER_RESERVED ||
f780: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
f790: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
f7a0: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
f7b0: 70 61 67 65 72 20 69 73 20 69 6e 20 52 45 53 45  pager is in RESE
f7c0: 52 56 45 44 20 73 74 61 74 65 2c 20 74 68 65 6e  RVED state, then
f7d0: 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 61   there must be a
f7e0: 20 63 6f 70 79 20 6f 66 20 74 68 69 73 0a 20 20   copy of this.  
f7f0: 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20 70  ** page in the p
f800: 61 67 65 72 20 63 61 63 68 65 2e 20 49 6e 20 74  ager cache. In t
f810: 68 69 73 20 63 61 73 65 20 6a 75 73 74 20 75 70  his case just up
f820: 64 61 74 65 20 74 68 65 20 70 61 67 65 72 20 63  date the pager c
f830: 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74  ache,.  ** not t
f840: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
f850: 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 6c 65  . The page is le
f860: 66 74 20 6d 61 72 6b 65 64 20 64 69 72 74 79 20  ft marked dirty 
f870: 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20  in this case..  
f880: 2a 2a 0a 20 20 2a 2a 20 41 6e 20 65 78 63 65 70  **.  ** An excep
f890: 74 69 6f 6e 20 74 6f 20 74 68 65 20 61 62 6f 76  tion to the abov
f8a0: 65 20 72 75 6c 65 3a 20 49 66 20 74 68 65 20 64  e rule: If the d
f8b0: 61 74 61 62 61 73 65 20 69 73 20 69 6e 20 6e 6f  atabase is in no
f8c0: 2d 73 79 6e 63 20 6d 6f 64 65 0a 20 20 2a 2a 20  -sync mode.  ** 
f8d0: 61 6e 64 20 61 20 70 61 67 65 20 69 73 20 6d 6f  and a page is mo
f8e0: 76 65 64 20 64 75 72 69 6e 67 20 61 6e 20 69 6e  ved during an in
f8f0: 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d  cremental vacuum
f900: 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d   then the page m
f910: 61 79 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20 69  ay.  ** not be i
f920: 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  n the pager cach
f930: 65 2e 20 4c 61 74 65 72 3a 20 69 66 20 61 20 6d  e. Later: if a m
f940: 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20 65 72  alloc() or IO er
f950: 72 6f 72 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20  ror occurs.  ** 
f960: 64 75 72 69 6e 67 20 61 20 4d 6f 76 65 70 61 67  during a Movepag
f970: 65 28 29 20 63 61 6c 6c 2c 20 74 68 65 6e 20 74  e() call, then t
f980: 68 65 20 70 61 67 65 20 6d 61 79 20 6e 6f 74 20  he page may not 
f990: 62 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 0a  be in the cache.
f9a0: 20 20 2a 2a 20 65 69 74 68 65 72 2e 20 53 6f 20    ** either. So 
f9b0: 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65  the condition de
f9c0: 73 63 72 69 62 65 64 20 69 6e 20 74 68 65 20 61  scribed in the a
f9d0: 62 6f 76 65 20 70 61 72 61 67 72 61 70 68 20 69  bove paragraph i
f9e0: 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 73 73 65 72  s not.  ** asser
f9f0: 74 28 29 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20  t()able..  **.  
fa00: 2a 2a 20 49 66 20 69 6e 20 45 58 43 4c 55 53 49  ** If in EXCLUSI
fa10: 56 45 20 73 74 61 74 65 2c 20 74 68 65 6e 20 77  VE state, then w
fa20: 65 20 75 70 64 61 74 65 20 74 68 65 20 70 61 67  e update the pag
fa30: 65 72 20 63 61 63 68 65 20 69 66 20 69 74 20 65  er cache if it e
fa40: 78 69 73 74 73 0a 20 20 2a 2a 20 61 6e 64 20 74  xists.  ** and t
fa50: 68 65 20 6d 61 69 6e 20 66 69 6c 65 2e 20 54 68  he main file. Th
fa60: 65 20 70 61 67 65 20 69 73 20 74 68 65 6e 20 6d  e page is then m
fa70: 61 72 6b 65 64 20 6e 6f 74 20 64 69 72 74 79 2e  arked not dirty.
fa80: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 69 63 6b 65  .  **.  ** Ticke
fa90: 74 20 23 31 31 37 31 3a 20 20 54 68 65 20 73 74  t #1171:  The st
faa0: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
fab0: 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 70 61  might contain pa
fac0: 67 65 20 63 6f 6e 74 65 6e 74 20 74 68 61 74 20  ge content that 
fad0: 69 73 0a 20 20 2a 2a 20 64 69 66 66 65 72 65 6e  is.  ** differen
fae0: 74 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20  t from the page 
faf0: 63 6f 6e 74 65 6e 74 20 61 74 20 74 68 65 20 73  content at the s
fb00: 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e  tart of the tran
fb10: 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68  saction..  ** Th
fb20: 69 73 20 6f 63 63 75 72 73 20 77 68 65 6e 20 61  is occurs when a
fb30: 20 70 61 67 65 20 69 73 20 63 68 61 6e 67 65 64   page is changed
fb40: 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74   prior to the st
fb50: 61 72 74 20 6f 66 20 61 20 73 74 61 74 65 6d 65  art of a stateme
fb60: 6e 74 0a 20 20 2a 2a 20 74 68 65 6e 20 63 68 61  nt.  ** then cha
fb70: 6e 67 65 64 20 61 67 61 69 6e 20 77 69 74 68 69  nged again withi
fb80: 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2e  n the statement.
fb90: 20 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62    When rolling b
fba0: 61 63 6b 20 73 75 63 68 20 61 0a 20 20 2a 2a 20  ack such a.  ** 
fbb0: 73 74 61 74 65 6d 65 6e 74 20 77 65 20 6d 75 73  statement we mus
fbc0: 74 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74  t not write to t
fbd0: 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
fbe0: 62 61 73 65 20 75 6e 6c 65 73 73 20 77 65 20 6b  base unless we k
fbf0: 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72 20 63 65 72  now.  ** for cer
fc00: 74 61 69 6e 20 74 68 61 74 20 6f 72 69 67 69 6e  tain that origin
fc10: 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73  al page contents
fc20: 20 61 72 65 20 73 79 6e 63 65 64 20 69 6e 74 6f   are synced into
fc30: 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61   the main rollba
fc40: 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e  ck.  ** journal.
fc50: 20 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20 70    Otherwise, a p
fc60: 6f 77 65 72 20 6c 6f 73 73 20 6d 69 67 68 74 20  ower loss might 
fc70: 6c 65 61 76 65 20 6d 6f 64 69 66 69 65 64 20 64  leave modified d
fc80: 61 74 61 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20  ata in the.  ** 
fc90: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69  database file wi
fca0: 74 68 6f 75 74 20 61 6e 20 65 6e 74 72 79 20 69  thout an entry i
fcb0: 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  n the rollback j
fcc0: 6f 75 72 6e 61 6c 20 74 68 61 74 20 63 61 6e 0a  ournal that can.
fcd0: 20 20 2a 2a 20 72 65 73 74 6f 72 65 20 74 68 65    ** restore the
fce0: 20 64 61 74 61 62 61 73 65 20 74 6f 20 69 74 73   database to its
fcf0: 20 6f 72 69 67 69 6e 61 6c 20 66 6f 72 6d 2e 20   original form. 
fd00: 20 54 77 6f 20 63 6f 6e 64 69 74 69 6f 6e 73 20   Two conditions 
fd10: 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6d 65 74  must be.  ** met
fd20: 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20   before writing 
fd30: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
fd40: 66 69 6c 65 73 2e 20 28 31 29 20 74 68 65 20 64  files. (1) the d
fd50: 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 0a  atabase must be.
fd60: 20 20 2a 2a 20 6c 6f 63 6b 65 64 2e 20 20 28 32    ** locked.  (2
fd70: 29 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74  ) we know that t
fd80: 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  he original page
fd90: 20 63 6f 6e 74 65 6e 74 20 69 73 20 66 75 6c 6c   content is full
fda0: 79 20 73 79 6e 63 65 64 0a 20 20 2a 2a 20 69 6e  y synced.  ** in
fdb0: 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
fdc0: 6c 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65  l either because
fdd0: 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
fde0: 20 69 6e 20 63 61 63 68 65 20 6f 72 20 65 6c 73   in cache or els
fdf0: 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20  e.  ** the page 
fe00: 69 73 20 6d 61 72 6b 65 64 20 61 73 20 6e 65 65  is marked as nee
fe10: 64 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2a 0a 20  dSync==0..  **. 
fe20: 20 2a 2a 20 32 30 30 38 2d 30 34 2d 31 34 3a 20   ** 2008-04-14: 
fe30: 20 57 68 65 6e 20 61 74 74 65 6d 70 74 69 6e 67   When attempting
fe40: 20 74 6f 20 76 61 63 75 75 6d 20 61 20 63 6f 72   to vacuum a cor
fe50: 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66 69  rupt database fi
fe60: 6c 65 2c 20 69 74 0a 20 20 2a 2a 20 69 73 20 70  le, it.  ** is p
fe70: 6f 73 73 69 62 6c 65 20 74 6f 20 66 61 69 6c 20  ossible to fail 
fe80: 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20 61  a statement on a
fe90: 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20 64   database that d
fea0: 6f 65 73 20 6e 6f 74 20 79 65 74 20 65 78 69 73  oes not yet exis
feb0: 74 2e 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74 20 61  t..  ** Do not a
fec0: 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20  ttempt to write 
fed0: 69 66 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  if database file
fee0: 20 68 61 73 20 6e 65 76 65 72 20 62 65 65 6e 20   has never been 
fef0: 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 70  opened..  */.  p
ff00: 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75  Pg = pager_looku
ff10: 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  p(pPager, pgno);
ff20: 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 20 7c  .  assert( pPg |
ff30: 7c 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 50 41  | !MEMDB );.  PA
ff40: 47 45 52 54 52 41 43 45 28 28 22 50 4c 41 59 42  GERTRACE(("PLAYB
ff50: 41 43 4b 20 25 64 20 70 61 67 65 20 25 64 20 68  ACK %d page %d h
ff60: 61 73 68 28 25 30 38 78 29 20 25 73 5c 6e 22 2c  ash(%08x) %s\n",
ff70: 0a 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45  .           PAGE
ff80: 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e  RID(pPager), pgn
ff90: 6f 2c 20 70 61 67 65 72 5f 64 61 74 61 68 61 73  o, pager_datahas
ffa0: 68 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  h(pPager->pageSi
ffb0: 7a 65 2c 20 28 75 38 2a 29 61 44 61 74 61 29 2c  ze, (u8*)aData),
ffc0: 0a 20 20 20 20 20 20 20 20 20 20 20 28 69 73 4d  .           (isM
ffd0: 61 69 6e 4a 72 6e 6c 3f 22 6d 61 69 6e 2d 6a 6f  ainJrnl?"main-jo
ffe0: 75 72 6e 61 6c 22 3a 22 73 75 62 2d 6a 6f 75 72  urnal":"sub-jour
fff0: 6e 61 6c 22 29 0a 20 20 29 29 3b 0a 20 20 69 66  nal").  ));.  if
10000 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a  ( isMainJrnl ){.
10010 20 20 20 20 69 73 53 79 6e 63 65 64 20 3d 20 70      isSynced = p
10020 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 7c 7c  Pager->noSync ||
10030 20 28 2a 70 4f 66 66 73 65 74 20 3c 3d 20 70 50   (*pOffset <= pP
10040 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
10050 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
10060 69 73 53 79 6e 63 65 64 20 3d 20 28 70 50 67 3d  isSynced = (pPg=
10070 3d 30 20 7c 7c 20 30 3d 3d 28 70 50 67 2d 3e 66  =0 || 0==(pPg->f
10080 6c 61 67 73 20 26 20 50 47 48 44 52 5f 4e 45 45  lags & PGHDR_NEE
10090 44 5f 53 59 4e 43 29 29 3b 0a 20 20 7d 0a 20 20  D_SYNC));.  }.  
100a0 69 66 28 20 28 70 50 61 67 65 72 2d 3e 73 74 61  if( (pPager->sta
100b0 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53  te>=PAGER_EXCLUS
100c0 49 56 45 29 0a 20 20 20 26 26 20 69 73 4f 70 65  IVE).   && isOpe
100d0 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 0a 20 20  n(pPager->fd).  
100e0 20 26 26 20 69 73 53 79 6e 63 65 64 0a 20 20 29   && isSynced.  )
100f0 7b 0a 20 20 20 20 69 36 34 20 6f 66 73 74 20 3d  {.    i64 ofst =
10100 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70   (pgno-1)*(i64)p
10110 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
10120 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 21  .    testcase( !
10130 69 73 53 61 76 65 70 6e 74 20 26 26 20 70 50 67  isSavepnt && pPg
10140 21 3d 30 20 26 26 20 28 70 50 67 2d 3e 66 6c 61  !=0 && (pPg->fla
10150 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
10160 4e 43 29 21 3d 30 20 29 3b 0a 20 20 20 20 72 63  NC)!=0 );.    rc
10170 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
10180 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 75  e(pPager->fd, (u
10190 38 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65 72  8*)aData, pPager
101a0 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 73 74  ->pageSize, ofst
101b0 29 3b 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3e  );.    if( pgno>
101c0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
101d0 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  ze ){.      pPag
101e0 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d  er->dbFileSize =
101f0 20 70 67 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20   pgno;.    }.   
10200 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 42 61   if( pPager->pBa
10210 63 6b 75 70 20 29 7b 0a 20 20 20 20 20 20 43 4f  ckup ){.      CO
10220 44 45 43 31 28 70 50 61 67 65 72 2c 20 61 44 61  DEC1(pPager, aDa
10230 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20 72 63 3d  ta, pgno, 3, rc=
10240 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20  SQLITE_NOMEM);. 
10250 20 20 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b       sqlite3Back
10260 75 70 55 70 64 61 74 65 28 70 50 61 67 65 72 2d  upUpdate(pPager-
10270 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20  >pBackup, pgno, 
10280 28 75 38 2a 29 61 44 61 74 61 29 3b 0a 20 20 20  (u8*)aData);.   
10290 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72     CODEC2(pPager
102a0 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20 37  , aData, pgno, 7
102b0 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45  , rc=SQLITE_NOME
102c0 4d 2c 20 61 44 61 74 61 29 3b 0a 20 20 20 20 7d  M, aData);.    }
102d0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 69 73  .  }else if( !is
102e0 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 70 50 67 3d  MainJrnl && pPg=
102f0 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  =0 ){.    /* If 
10300 74 68 69 73 20 69 73 20 61 20 72 6f 6c 6c 62 61  this is a rollba
10310 63 6b 20 6f 66 20 61 20 73 61 76 65 70 6f 69 6e  ck of a savepoin
10320 74 20 61 6e 64 20 64 61 74 61 20 77 61 73 20 6e  t and data was n
10330 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20  ot written to.  
10340 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73    ** the databas
10350 65 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 69  e and the page i
10360 73 20 6e 6f 74 20 69 6e 2d 6d 65 6d 6f 72 79 2c  s not in-memory,
10370 20 74 68 65 72 65 20 69 73 20 61 20 70 6f 74 65   there is a pote
10380 6e 74 69 61 6c 0a 20 20 20 20 2a 2a 20 70 72 6f  ntial.    ** pro
10390 62 6c 65 6d 2e 20 57 68 65 6e 20 74 68 65 20 70  blem. When the p
103a0 61 67 65 20 69 73 20 6e 65 78 74 20 66 65 74 63  age is next fetc
103b0 68 65 64 20 62 79 20 74 68 65 20 62 2d 74 72 65  hed by the b-tre
103c0 65 20 6c 61 79 65 72 2c 20 69 74 20 0a 20 20 20  e layer, it .   
103d0 20 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 61 64   ** will be read
103e0 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
103f0 73 65 20 66 69 6c 65 2c 20 77 68 69 63 68 20 6d  se file, which m
10400 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65  ay or may not be
10410 20 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74   .    ** current
10420 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  . .    **.    **
10430 20 54 68 65 72 65 20 61 72 65 20 61 20 63 6f 75   There are a cou
10440 70 6c 65 20 6f 66 20 64 69 66 66 65 72 65 6e 74  ple of different
10450 20 77 61 79 73 20 74 68 69 73 20 63 61 6e 20 68   ways this can h
10460 61 70 70 65 6e 2e 20 41 6c 6c 20 61 72 65 20 71  appen. All are q
10470 75 69 74 65 0a 20 20 20 20 2a 2a 20 6f 62 73 63  uite.    ** obsc
10480 75 72 65 2e 20 57 68 65 6e 20 72 75 6e 6e 69 6e  ure. When runnin
10490 67 20 69 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73  g in synchronous
104a0 20 6d 6f 64 65 2c 20 74 68 69 73 20 63 61 6e 20   mode, this can 
104b0 6f 6e 6c 79 20 68 61 70 70 65 6e 20 0a 20 20 20  only happen .   
104c0 20 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65 20   ** if the page 
104d0 69 73 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c  is on the free-l
104e0 69 73 74 20 61 74 20 74 68 65 20 73 74 61 72 74  ist at the start
104f0 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   of the transact
10500 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a  ion, then.    **
10510 20 70 6f 70 75 6c 61 74 65 64 2c 20 74 68 65 6e   populated, then
10520 20 6d 6f 76 65 64 20 75 73 69 6e 67 20 73 71 6c   moved using sql
10530 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67  ite3PagerMovepag
10540 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  e()..    **.    
10550 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20  ** The solution 
10560 69 73 20 74 6f 20 61 64 64 20 61 6e 20 69 6e 2d  is to add an in-
10570 6d 65 6d 6f 72 79 20 70 61 67 65 20 74 6f 20 74  memory page to t
10580 68 65 20 63 61 63 68 65 20 63 6f 6e 74 61 69 6e  he cache contain
10590 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 64  ing.    ** the d
105a0 61 74 61 20 6a 75 73 74 20 72 65 61 64 20 66 72  ata just read fr
105b0 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  om the sub-journ
105c0 61 6c 2e 20 4d 61 72 6b 20 74 68 65 20 70 61 67  al. Mark the pag
105d0 65 20 61 73 20 64 69 72 74 79 20 0a 20 20 20 20  e as dirty .    
105e0 2a 2a 20 61 6e 64 20 69 66 20 74 68 65 20 70 61  ** and if the pa
105f0 67 65 72 20 72 65 71 75 69 72 65 73 20 61 20 6a  ger requires a j
10600 6f 75 72 6e 61 6c 2d 73 79 6e 63 2c 20 74 68 65  ournal-sync, the
10610 6e 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20  n mark the page 
10620 61 73 20 0a 20 20 20 20 2a 2a 20 72 65 71 75 69  as .    ** requi
10630 72 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 2d 73  ring a journal-s
10640 79 6e 63 20 62 65 66 6f 72 65 20 69 74 20 69 73  ync before it is
10650 20 77 72 69 74 74 65 6e 2e 0a 20 20 20 20 2a 2f   written..    */
10660 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73 53  .    assert( isS
10670 61 76 65 70 6e 74 20 29 3b 0a 20 20 20 20 69 66  avepnt );.    if
10680 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50  ( (rc = sqlite3P
10690 61 67 65 72 41 63 71 75 69 72 65 28 70 50 61 67  agerAcquire(pPag
106a0 65 72 2c 20 70 67 6e 6f 2c 20 26 70 50 67 2c 20  er, pgno, &pPg, 
106b0 31 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  1))!=SQLITE_OK )
106c0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
106d0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67  c;.    }.    pPg
106e0 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 50 47 48 44  ->flags &= ~PGHD
106f0 52 5f 4e 45 45 44 5f 52 45 41 44 3b 0a 20 20 20  R_NEED_READ;.   
10700 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61   sqlite3PcacheMa
10710 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20  keDirty(pPg);.  
10720 7d 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20  }.  if( pPg ){. 
10730 20 20 20 2f 2a 20 4e 6f 20 70 61 67 65 20 73 68     /* No page sh
10740 6f 75 6c 64 20 65 76 65 72 20 62 65 20 65 78 70  ould ever be exp
10750 6c 69 63 69 74 6c 79 20 72 6f 6c 6c 65 64 20 62  licitly rolled b
10760 61 63 6b 20 74 68 61 74 20 69 73 20 69 6e 20 75  ack that is in u
10770 73 65 2c 20 65 78 63 65 70 74 0a 20 20 20 20 2a  se, except.    *
10780 2a 20 66 6f 72 20 70 61 67 65 20 31 20 77 68 69  * for page 1 whi
10790 63 68 20 69 73 20 68 65 6c 64 20 69 6e 20 75 73  ch is held in us
107a0 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65  e in order to ke
107b0 65 70 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74  ep the lock on t
107c0 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
107d0 73 65 20 61 63 74 69 76 65 2e 20 48 6f 77 65 76  se active. Howev
107e0 65 72 20 73 75 63 68 20 61 20 70 61 67 65 20 6d  er such a page m
107f0 61 79 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  ay be rolled bac
10800 6b 20 61 73 20 61 20 72 65 73 75 6c 74 0a 20 20  k as a result.  
10810 20 20 2a 2a 20 6f 66 20 61 6e 20 69 6e 74 65 72    ** of an inter
10820 6e 61 6c 20 65 72 72 6f 72 20 72 65 73 75 6c 74  nal error result
10830 69 6e 67 20 69 6e 20 61 6e 20 61 75 74 6f 6d 61  ing in an automa
10840 74 69 63 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20  tic call to.    
10850 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  ** sqlite3PagerR
10860 6f 6c 6c 62 61 63 6b 28 29 2e 0a 20 20 20 20 2a  ollback()..    *
10870 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74  /.    void *pDat
10880 61 3b 0a 20 20 20 20 70 44 61 74 61 20 3d 20 70  a;.    pData = p
10890 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20 6d  Pg->pData;.    m
108a0 65 6d 63 70 79 28 70 44 61 74 61 2c 20 28 75 38  emcpy(pData, (u8
108b0 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d  *)aData, pPager-
108c0 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
108d0 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65  pPager->xReinite
108e0 72 28 70 50 67 29 3b 0a 20 20 20 20 69 66 28 20  r(pPg);.    if( 
108f0 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 28 21  isMainJrnl && (!
10900 69 73 53 61 76 65 70 6e 74 20 7c 7c 20 2a 70 4f  isSavepnt || *pO
10910 66 66 73 65 74 3c 3d 70 50 61 67 65 72 2d 3e 6a  ffset<=pPager->j
10920 6f 75 72 6e 61 6c 48 64 72 29 20 29 7b 0a 20 20  ournalHdr) ){.  
10930 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f      /* If the co
10940 6e 74 65 6e 74 73 20 6f 66 20 74 68 69 73 20 70  ntents of this p
10950 61 67 65 20 77 65 72 65 20 6a 75 73 74 20 72 65  age were just re
10960 73 74 6f 72 65 64 20 66 72 6f 6d 20 74 68 65 20  stored from the 
10970 6d 61 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20 6a  main .      ** j
10980 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65  ournal file, the
10990 6e 20 69 74 73 20 63 6f 6e 74 65 6e 74 20 6d 75  n its content mu
109a0 73 74 20 62 65 20 61 73 20 74 68 65 79 20 77 65  st be as they we
109b0 72 65 20 77 68 65 6e 20 74 68 65 20 0a 20 20 20  re when the .   
109c0 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
109d0 6e 20 77 61 73 20 66 69 72 73 74 20 6f 70 65 6e  n was first open
109e0 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
109f0 20 77 65 20 63 61 6e 20 6d 61 72 6b 20 74 68 65   we can mark the
10a00 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 61   page.      ** a
10a10 73 20 63 6c 65 61 6e 2c 20 73 69 6e 63 65 20 74  s clean, since t
10a20 68 65 72 65 20 77 69 6c 6c 20 62 65 20 6e 6f 20  here will be no 
10a30 6e 65 65 64 20 74 6f 20 77 72 69 74 65 20 69 74  need to write it
10a40 20 6f 75 74 20 74 6f 20 74 68 65 0a 20 20 20 20   out to the.    
10a50 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a 20    ** database.. 
10a60 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
10a70 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 65 78   There is one ex
10a80 63 65 70 74 69 6f 6e 20 74 6f 20 74 68 69 73 20  ception to this 
10a90 72 75 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67  rule. If the pag
10aa0 65 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65  e is being rolle
10ab0 64 0a 20 20 20 20 20 20 2a 2a 20 62 61 63 6b 20  d.      ** back 
10ac0 61 73 20 70 61 72 74 20 6f 66 20 61 20 73 61 76  as part of a sav
10ad0 65 70 6f 69 6e 74 20 28 6f 72 20 73 74 61 74 65  epoint (or state
10ae0 6d 65 6e 74 29 20 72 6f 6c 6c 62 61 63 6b 20 66  ment) rollback f
10af0 72 6f 6d 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a  rom an .      **
10b00 20 75 6e 73 79 6e 63 65 64 20 70 6f 72 74 69 6f   unsynced portio
10b10 6e 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  n of the main jo
10b20 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e  urnal file, then
10b30 20 69 74 20 69 73 20 6e 6f 74 20 73 61 66 65 0a   it is not safe.
10b40 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61 72 6b        ** to mark
10b50 20 74 68 65 20 70 61 67 65 20 61 73 20 63 6c 65   the page as cle
10b60 61 6e 2e 20 54 68 69 73 20 69 73 20 62 65 63 61  an. This is beca
10b70 75 73 65 20 6d 61 72 6b 69 6e 67 20 74 68 65 20  use marking the 
10b80 70 61 67 65 20 61 73 0a 20 20 20 20 20 20 2a 2a  page as.      **
10b90 20 63 6c 65 61 6e 20 77 69 6c 6c 20 63 6c 65 61   clean will clea
10ba0 72 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44  r the PGHDR_NEED
10bb0 5f 53 59 4e 43 20 66 6c 61 67 2e 20 53 69 6e 63  _SYNC flag. Sinc
10bc0 65 20 74 68 65 20 70 61 67 65 20 69 73 0a 20 20  e the page is.  
10bd0 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 69      ** already i
10be0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
10bf0 6c 65 20 28 72 65 63 6f 72 64 65 64 20 69 6e 20  le (recorded in 
10c00 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c  Pager.pInJournal
10c10 29 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 74  ) and.      ** t
10c20 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  he PGHDR_NEED_SY
10c30 4e 43 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72  NC flag is clear
10c40 65 64 2c 20 69 66 20 74 68 65 20 70 61 67 65 20  ed, if the page 
10c50 69 73 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20  is written to.  
10c60 20 20 20 20 2a 2a 20 61 67 61 69 6e 20 77 69 74      ** again wit
10c70 68 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63  hin this transac
10c80 74 69 6f 6e 2c 20 69 74 20 77 69 6c 6c 20 62 65  tion, it will be
10c90 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79   marked as dirty
10ca0 20 62 75 74 0a 20 20 20 20 20 20 2a 2a 20 74 68   but.      ** th
10cb0 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  e PGHDR_NEED_SYN
10cc0 43 20 66 6c 61 67 20 77 69 6c 6c 20 6e 6f 74 20  C flag will not 
10cd0 62 65 20 73 65 74 2e 20 49 74 20 63 6f 75 6c 64  be set. It could
10ce0 20 74 68 65 6e 20 70 6f 74 65 6e 74 69 61 6c 6c   then potentiall
10cf0 79 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 77 72  y.      ** be wr
10d00 69 74 74 65 6e 20 6f 75 74 20 69 6e 74 6f 20 74  itten out into t
10d10 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
10d20 20 62 65 66 6f 72 65 20 69 74 73 20 6a 6f 75 72   before its jour
10d30 6e 61 6c 20 66 69 6c 65 0a 20 20 20 20 20 20 2a  nal file.      *
10d40 2a 20 73 65 67 6d 65 6e 74 20 69 73 20 73 79 6e  * segment is syn
10d50 63 65 64 2e 20 49 66 20 61 20 63 72 61 73 68 20  ced. If a crash 
10d60 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6f 72  occurs during or
10d70 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 2c   following this,
10d80 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61  .      ** databa
10d90 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 6d 61  se corruption ma
10da0 79 20 65 6e 73 75 65 2e 0a 20 20 20 20 20 20 2a  y ensue..      *
10db0 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  /.      sqlite3P
10dc0 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70  cacheMakeClean(p
10dd0 50 67 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65  Pg);.    }.#ifde
10de0 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
10df0 41 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61  AGES.    pPg->pa
10e00 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70  geHash = pager_p
10e10 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65  agehash(pPg);.#e
10e20 6e 64 69 66 0a 20 20 20 20 2f 2a 20 49 66 20 74  ndif.    /* If t
10e30 68 69 73 20 77 61 73 20 70 61 67 65 20 31 2c 20  his was page 1, 
10e40 74 68 65 6e 20 72 65 73 74 6f 72 65 20 74 68 65  then restore the
10e50 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e   value of Pager.
10e60 64 62 46 69 6c 65 56 65 72 73 2e 0a 20 20 20 20  dbFileVers..    
10e70 2a 2a 20 44 6f 20 74 68 69 73 20 62 65 66 6f 72  ** Do this befor
10e80 65 20 61 6e 79 20 64 65 63 6f 64 69 6e 67 2e 20  e any decoding. 
10e90 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3d  */.    if( pgno=
10ea0 3d 31 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  =1 ){.      memc
10eb0 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69  py(&pPager->dbFi
10ec0 6c 65 56 65 72 73 2c 20 26 28 28 75 38 2a 29 70  leVers, &((u8*)p
10ed0 44 61 74 61 29 5b 32 34 5d 2c 73 69 7a 65 6f 66  Data)[24],sizeof
10ee0 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
10ef0 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ers));.    }..  
10f00 20 20 2f 2a 20 44 65 63 6f 64 65 20 74 68 65 20    /* Decode the 
10f10 70 61 67 65 20 6a 75 73 74 20 72 65 61 64 20 66  page just read f
10f20 72 6f 6d 20 64 69 73 6b 20 2a 2f 0a 20 20 20 20  rom disk */.    
10f30 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 70  CODEC1(pPager, p
10f40 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  Data, pPg->pgno,
10f50 20 33 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f   3, rc=SQLITE_NO
10f60 4d 45 4d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  MEM);.    sqlite
10f70 33 50 63 61 63 68 65 52 65 6c 65 61 73 65 28 70  3PcacheRelease(p
10f80 50 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Pg);.  }.  retur
10f90 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  n rc;.}../*.** P
10fa0 61 72 61 6d 65 74 65 72 20 7a 4d 61 73 74 65 72  arameter zMaster
10fb0 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
10fc0 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
10fd0 20 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65 20   file. A single 
10fe0 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20  journal.** file 
10ff0 74 68 61 74 20 72 65 66 65 72 72 65 64 20 74 6f  that referred to
11000 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
11010 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6a 75 73  nal file has jus
11020 74 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61  t been rolled ba
11030 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ck..** This rout
11040 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 69 74  ine checks if it
11050 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
11060 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
11070 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 0a  r journal file,.
11080 2a 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f 20 69  ** and does so i
11090 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 41  f it is..**.** A
110a0 72 67 75 6d 65 6e 74 20 7a 4d 61 73 74 65 72 20  rgument zMaster 
110b0 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 50 61 67  may point to Pag
110c0 65 72 2e 70 54 6d 70 53 70 61 63 65 2e 20 53 6f  er.pTmpSpace. So
110d0 20 74 68 61 74 20 62 75 66 66 65 72 20 69 73 20   that buffer is 
110e0 6e 6f 74 20 0a 2a 2a 20 61 76 61 69 6c 61 62 6c  not .** availabl
110f0 65 20 66 6f 72 20 75 73 65 20 77 69 74 68 69 6e  e for use within
11100 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
11110 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 6d 61 73  **.** When a mas
11120 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
11130 20 69 73 20 63 72 65 61 74 65 64 2c 20 69 74 20   is created, it 
11140 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  is populated wit
11150 68 20 74 68 65 20 6e 61 6d 65 73 20 0a 2a 2a 20  h the names .** 
11160 6f 66 20 61 6c 6c 20 6f 66 20 69 74 73 20 63 68  of all of its ch
11170 69 6c 64 20 6a 6f 75 72 6e 61 6c 73 2c 20 6f 6e  ild journals, on
11180 65 20 61 66 74 65 72 20 61 6e 6f 74 68 65 72 2c  e after another,
11190 20 66 6f 72 6d 61 74 74 65 64 20 61 73 20 75 74   formatted as ut
111a0 66 2d 38 20 0a 2a 2a 20 65 6e 63 6f 64 65 64 20  f-8 .** encoded 
111b0 74 65 78 74 2e 20 54 68 65 20 65 6e 64 20 6f 66  text. The end of
111c0 20 65 61 63 68 20 63 68 69 6c 64 20 6a 6f 75 72   each child jour
111d0 6e 61 6c 20 66 69 6c 65 20 69 73 20 6d 61 72 6b  nal file is mark
111e0 65 64 20 77 69 74 68 20 61 20 0a 2a 2a 20 6e 75  ed with a .** nu
111f0 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74  l-terminator byt
11200 65 20 28 30 78 30 30 29 2e 20 69 2e 65 2e 20 74  e (0x00). i.e. t
11210 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e  he entire conten
11220 74 73 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a  ts of a master j
11230 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 66  ournal.** file f
11240 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  or a transaction
11250 20 69 6e 76 6f 6c 76 69 6e 67 20 74 77 6f 20 64   involving two d
11260 61 74 61 62 61 73 65 73 20 6d 69 67 68 74 20 62  atabases might b
11270 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 2f 68 6f 6d  e:.**.**   "/hom
11280 65 2f 62 69 6c 6c 2f 61 2e 64 62 2d 6a 6f 75 72  e/bill/a.db-jour
11290 6e 61 6c 5c 78 30 30 2f 68 6f 6d 65 2f 62 69 6c  nal\x00/home/bil
112a0 6c 2f 62 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78  l/b.db-journal\x
112b0 30 30 22 0a 2a 2a 0a 2a 2a 20 41 20 6d 61 73 74  00".**.** A mast
112c0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
112d0 6d 61 79 20 6f 6e 6c 79 20 62 65 20 64 65 6c 65  may only be dele
112e0 74 65 64 20 6f 6e 63 65 20 61 6c 6c 20 6f 66 20  ted once all of 
112f0 69 74 73 20 63 68 69 6c 64 20 0a 2a 2a 20 6a 6f  its child .** jo
11300 75 72 6e 61 6c 73 20 68 61 76 65 20 62 65 65 6e  urnals have been
11310 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a   rolled back..**
11320 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
11330 6e 20 72 65 61 64 73 20 74 68 65 20 63 6f 6e 74  n reads the cont
11340 65 6e 74 73 20 6f 66 20 74 68 65 20 6d 61 73 74  ents of the mast
11350 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er-journal file 
11360 69 6e 74 6f 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20  into .** memory 
11370 61 6e 64 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67  and loops throug
11380 68 20 65 61 63 68 20 6f 66 20 74 68 65 20 63 68  h each of the ch
11390 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ild journal name
113a0 73 2e 20 46 6f 72 0a 2a 2a 20 65 61 63 68 20 63  s. For.** each c
113b0 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 2c 20 69 74  hild journal, it
113c0 20 63 68 65 63 6b 73 20 69 66 3a 0a 2a 2a 0a 2a   checks if:.**.*
113d0 2a 20 20 20 2a 20 69 66 20 74 68 65 20 63 68 69  *   * if the chi
113e0 6c 64 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74  ld journal exist
113f0 73 2c 20 61 6e 64 20 69 66 20 73 6f 0a 2a 2a 20  s, and if so.** 
11400 20 20 2a 20 69 66 20 74 68 65 20 63 68 69 6c 64    * if the child
11410 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e   journal contain
11420 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  s a reference to
11430 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
11440 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20 7a 4d 61  .**     file zMa
11450 73 74 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ster.**.** If a 
11460 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61  child journal ca
11470 6e 20 62 65 20 66 6f 75 6e 64 20 74 68 61 74 20  n be found that 
11480 6d 61 74 63 68 65 73 20 62 6f 74 68 20 6f 66 20  matches both of 
11490 74 68 65 20 63 72 69 74 65 72 69 61 0a 2a 2a 20  the criteria.** 
114a0 61 62 6f 76 65 2c 20 74 68 69 73 20 66 75 6e 63  above, this func
114b0 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 74  tion returns wit
114c0 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68  hout doing anyth
114d0 69 6e 67 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ing. Otherwise, 
114e0 69 66 0a 2a 2a 20 6e 6f 20 73 75 63 68 20 63 68  if.** no such ch
114f0 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20  ild journal can 
11500 62 65 20 66 6f 75 6e 64 2c 20 66 69 6c 65 20 7a  be found, file z
11510 4d 61 73 74 65 72 20 69 73 20 64 65 6c 65 74 65  Master is delete
11520 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 66 69  d from.** the fi
11530 6c 65 2d 73 79 73 74 65 6d 20 75 73 69 6e 67 20  le-system using 
11540 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
11550 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49  )..**.** If an I
11560 4f 20 65 72 72 6f 72 20 77 69 74 68 69 6e 20 74  O error within t
11570 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 6e  his function, an
11580 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
11590 65 74 75 72 6e 65 64 2e 20 54 68 69 73 0a 2a 2a  eturned. This.**
115a0 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61   function alloca
115b0 74 65 73 20 6d 65 6d 6f 72 79 20 62 79 20 63 61  tes memory by ca
115c0 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 4d 61 6c  lling sqlite3Mal
115d0 6c 6f 63 28 29 2e 20 49 66 20 61 6e 20 61 6c 6c  loc(). If an all
115e0 6f 63 61 74 69 6f 6e 0a 2a 2a 20 66 61 69 6c 73  ocation.** fails
115f0 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69  , SQLITE_NOMEM i
11600 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
11610 72 77 69 73 65 2c 20 69 66 20 6e 6f 20 49 4f 20  rwise, if no IO 
11620 6f 72 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73  or malloc errors
11630 20 0a 2a 2a 20 6f 63 63 75 72 2c 20 53 51 4c 49   .** occur, SQLI
11640 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
11650 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 54  d..**.** TODO: T
11660 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c  his function all
11670 6f 63 61 74 65 73 20 61 20 73 69 6e 67 6c 65 20  ocates a single 
11680 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79 20  block of memory 
11690 74 6f 20 6c 6f 61 64 0a 2a 2a 20 74 68 65 20 65  to load.** the e
116a0 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f  ntire contents o
116b0 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  f the master jou
116c0 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20  rnal file. This 
116d0 63 6f 75 6c 64 20 62 65 0a 2a 2a 20 61 20 63 6f  could be.** a co
116e0 75 70 6c 65 20 6f 66 20 6b 69 6c 6f 62 79 74 65  uple of kilobyte
116f0 73 20 6f 72 20 73 6f 20 2d 20 70 6f 74 65 6e 74  s or so - potent
11700 69 61 6c 6c 79 20 6c 61 72 67 65 72 20 74 68 61  ially larger tha
11710 6e 20 74 68 65 20 70 61 67 65 20 0a 2a 2a 20 73  n the page .** s
11720 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ize..*/.static i
11730 6e 74 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74  nt pager_delmast
11740 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  er(Pager *pPager
11750 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d  , const char *zM
11760 61 73 74 65 72 29 7b 0a 20 20 73 71 6c 69 74 65  aster){.  sqlite
11770 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50  3_vfs *pVfs = pP
11780 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e  ager->pVfs;.  in
11790 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
117a0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
117b0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69  n code */.  sqli
117c0 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65  te3_file *pMaste
117d0 72 3b 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27  r;    /* Malloc'
117e0 64 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  d master-journal
117f0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
11800 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
11810 6c 65 20 2a 70 4a 6f 75 72 6e 61 6c 3b 20 20 20  le *pJournal;   
11820 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20 63 68 69 6c  /* Malloc'd chil
11830 64 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  d-journal file d
11840 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 63  escriptor */.  c
11850 68 61 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75 72  har *zMasterJour
11860 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74  nal = 0; /* Cont
11870 65 6e 74 73 20 6f 66 20 6d 61 73 74 65 72 20 6a  ents of master j
11880 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
11890 20 69 36 34 20 6e 4d 61 73 74 65 72 4a 6f 75 72   i64 nMasterJour
118a0 6e 61 6c 3b 20 20 20 20 20 20 20 2f 2a 20 53 69  nal;       /* Si
118b0 7a 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  ze of master jou
118c0 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 0a 20 20  rnal file */..  
118d0 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63  /* Allocate spac
118e0 65 20 66 6f 72 20 62 6f 74 68 20 74 68 65 20 70  e for both the p
118f0 4a 6f 75 72 6e 61 6c 20 61 6e 64 20 70 4d 61 73  Journal and pMas
11900 74 65 72 20 66 69 6c 65 20 64 65 73 63 72 69 70  ter file descrip
11910 74 6f 72 73 2e 0a 20 20 2a 2a 20 49 66 20 73 75  tors..  ** If su
11920 63 63 65 73 73 66 75 6c 2c 20 6f 70 65 6e 20 74  ccessful, open t
11930 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
11940 6c 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64 69  l file for readi
11950 6e 67 2e 0a 20 20 2a 2f 0a 20 20 70 4d 61 73 74  ng..  */.  pMast
11960 65 72 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69  er = (sqlite3_fi
11970 6c 65 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c  le *)sqlite3Mall
11980 6f 63 5a 65 72 6f 28 70 56 66 73 2d 3e 73 7a 4f  ocZero(pVfs->szO
11990 73 46 69 6c 65 20 2a 20 32 29 3b 0a 20 20 70 4a  sFile * 2);.  pJ
119a0 6f 75 72 6e 61 6c 20 3d 20 28 73 71 6c 69 74 65  ournal = (sqlite
119b0 33 5f 66 69 6c 65 20 2a 29 28 28 28 75 38 20 2a  3_file *)(((u8 *
119c0 29 70 4d 61 73 74 65 72 29 20 2b 20 70 56 66 73  )pMaster) + pVfs
119d0 2d 3e 73 7a 4f 73 46 69 6c 65 29 3b 0a 20 20 69  ->szOsFile);.  i
119e0 66 28 20 21 70 4d 61 73 74 65 72 20 29 7b 0a 20  f( !pMaster ){. 
119f0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
11a00 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  OMEM;.  }else{. 
11a10 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61     const int fla
11a20 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45  gs = (SQLITE_OPE
11a30 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54  N_READONLY|SQLIT
11a40 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f  E_OPEN_MASTER_JO
11a50 55 52 4e 41 4c 29 3b 0a 20 20 20 20 72 63 20 3d  URNAL);.    rc =
11a60 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70   sqlite3OsOpen(p
11a70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 70 4d  Vfs, zMaster, pM
11a80 61 73 74 65 72 2c 20 66 6c 61 67 73 2c 20 30 29  aster, flags, 0)
11a90 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d  ;.  }.  if( rc!=
11aa0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
11ab0 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
11ac0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
11ad0 73 46 69 6c 65 53 69 7a 65 28 70 4d 61 73 74 65  sFileSize(pMaste
11ae0 72 2c 20 26 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  r, &nMasterJourn
11af0 61 6c 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  al);.  if( rc!=S
11b00 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
11b10 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a  delmaster_out;..
11b20 20 20 69 66 28 20 6e 4d 61 73 74 65 72 4a 6f 75    if( nMasterJou
11b30 72 6e 61 6c 3e 30 20 29 7b 0a 20 20 20 20 63 68  rnal>0 ){.    ch
11b40 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 0a 20 20  ar *zJournal;.  
11b50 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 50    char *zMasterP
11b60 74 72 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  tr = 0;.    int 
11b70 6e 4d 61 73 74 65 72 50 74 72 20 3d 20 70 56 66  nMasterPtr = pVf
11b80 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b  s->mxPathname+1;
11b90 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61 64 20 74 68  ..    /* Load th
11ba0 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72 20  e entire master 
11bb0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74  journal file int
11bc0 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64  o space obtained
11bd0 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 73 71 6c   from.    ** sql
11be0 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e  ite3_malloc() an
11bf0 64 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  d pointed to by 
11c00 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20  zMasterJournal. 
11c10 0a 20 20 20 20 2a 2f 0a 20 20 20 20 7a 4d 61 73  .    */.    zMas
11c20 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c  terJournal = sql
11c30 69 74 65 33 4d 61 6c 6c 6f 63 28 28 69 6e 74 29  ite3Malloc((int)
11c40 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 2b  nMasterJournal +
11c50 20 6e 4d 61 73 74 65 72 50 74 72 20 2b 20 31 29   nMasterPtr + 1)
11c60 3b 0a 20 20 20 20 69 66 28 20 21 7a 4d 61 73 74  ;.    if( !zMast
11c70 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  erJournal ){.   
11c80 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
11c90 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f  OMEM;.      goto
11ca0 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
11cb0 20 20 20 20 7d 0a 20 20 20 20 7a 4d 61 73 74 65      }.    zMaste
11cc0 72 50 74 72 20 3d 20 26 7a 4d 61 73 74 65 72 4a  rPtr = &zMasterJ
11cd0 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f  ournal[nMasterJo
11ce0 75 72 6e 61 6c 2b 31 5d 3b 0a 20 20 20 20 72 63  urnal+1];.    rc
11cf0 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
11d00 28 70 4d 61 73 74 65 72 2c 20 7a 4d 61 73 74 65  (pMaster, zMaste
11d10 72 4a 6f 75 72 6e 61 6c 2c 20 28 69 6e 74 29 6e  rJournal, (int)n
11d20 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 30  MasterJournal, 0
11d30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
11d40 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
11d50 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
11d60 20 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61     zMasterJourna
11d70 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  l[nMasterJournal
11d80 5d 20 3d 20 30 3b 0a 0a 20 20 20 20 7a 4a 6f 75  ] = 0;..    zJou
11d90 72 6e 61 6c 20 3d 20 7a 4d 61 73 74 65 72 4a 6f  rnal = zMasterJo
11da0 75 72 6e 61 6c 3b 0a 20 20 20 20 77 68 69 6c 65  urnal;.    while
11db0 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d 61 73  ( (zJournal-zMas
11dc0 74 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d 61 73  terJournal)<nMas
11dd0 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  terJournal ){.  
11de0 20 20 20 20 69 6e 74 20 65 78 69 73 74 73 3b 0a      int exists;.
11df0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
11e00 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c  e3OsAccess(pVfs,
11e10 20 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54   zJournal, SQLIT
11e20 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c  E_ACCESS_EXISTS,
11e30 20 26 65 78 69 73 74 73 29 3b 0a 20 20 20 20 20   &exists);.     
11e40 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
11e50 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
11e60 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
11e70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
11e80 69 66 28 20 65 78 69 73 74 73 20 29 7b 0a 20 20  if( exists ){.  
11e90 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
11ea0 74 68 65 20 6a 6f 75 72 6e 61 6c 73 20 70 6f 69  the journals poi
11eb0 6e 74 65 64 20 74 6f 20 62 79 20 74 68 65 20 6d  nted to by the m
11ec0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 65 78  aster journal ex
11ed0 69 73 74 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a  ists..        **
11ee0 20 4f 70 65 6e 20 69 74 20 61 6e 64 20 63 68 65   Open it and che
11ef0 63 6b 20 69 66 20 69 74 20 70 6f 69 6e 74 73 20  ck if it points 
11f00 61 74 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  at the master jo
11f10 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 20 20  urnal. If.      
11f20 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e 20    ** so, return 
11f30 77 69 74 68 6f 75 74 20 64 65 6c 65 74 69 6e 67  without deleting
11f40 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
11f50 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20  nal file..      
11f60 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74    */.        int
11f70 20 63 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   c;.        int 
11f80 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f  flags = (SQLITE_
11f90 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51  OPEN_READONLY|SQ
11fa0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
11fb0 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 20 20 20  OURNAL);.       
11fc0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
11fd0 70 65 6e 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e  pen(pVfs, zJourn
11fe0 61 6c 2c 20 70 4a 6f 75 72 6e 61 6c 2c 20 66 6c  al, pJournal, fl
11ff0 61 67 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ags, 0);.       
12000 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
12010 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
12020 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
12030 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  ut;.        }.. 
12040 20 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64         rc = read
12050 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 4a  MasterJournal(pJ
12060 6f 75 72 6e 61 6c 2c 20 7a 4d 61 73 74 65 72 50  ournal, zMasterP
12070 74 72 2c 20 6e 4d 61 73 74 65 72 50 74 72 29 3b  tr, nMasterPtr);
12080 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
12090 4f 73 43 6c 6f 73 65 28 70 4a 6f 75 72 6e 61 6c  OsClose(pJournal
120a0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
120b0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
120c0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64            goto d
120d0 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
120e0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
120f0 20 63 20 3d 20 7a 4d 61 73 74 65 72 50 74 72 5b   c = zMasterPtr[
12100 30 5d 21 3d 30 20 26 26 20 73 74 72 63 6d 70 28  0]!=0 && strcmp(
12110 7a 4d 61 73 74 65 72 50 74 72 2c 20 7a 4d 61 73  zMasterPtr, zMas
12120 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20  ter)==0;.       
12130 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20 20 20   if( c ){.      
12140 20 20 20 20 2f 2a 20 57 65 20 68 61 76 65 20 61      /* We have a
12150 20 6d 61 74 63 68 2e 20 44 6f 20 6e 6f 74 20 64   match. Do not d
12160 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
12170 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a   journal file. *
12180 2f 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  /.          goto
12190 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
121a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
121b0 7d 0a 20 20 20 20 20 20 7a 4a 6f 75 72 6e 61 6c  }.      zJournal
121c0 20 2b 3d 20 28 73 71 6c 69 74 65 33 53 74 72 6c   += (sqlite3Strl
121d0 65 6e 33 30 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31  en30(zJournal)+1
121e0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a  );.    }.  }.  .
121f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
12200 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61  Delete(pVfs, zMa
12210 73 74 65 72 2c 20 30 29 3b 0a 0a 64 65 6c 6d 61  ster, 0);..delma
12220 73 74 65 72 5f 6f 75 74 3a 0a 20 20 69 66 28 20  ster_out:.  if( 
12230 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29  zMasterJournal )
12240 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
12250 65 65 28 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  ee(zMasterJourna
12260 6c 29 3b 0a 20 20 7d 20 20 0a 20 20 69 66 28 20  l);.  }  .  if( 
12270 70 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 73  pMaster ){.    s
12280 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4d  qlite3OsClose(pM
12290 61 73 74 65 72 29 3b 0a 20 20 20 20 61 73 73 65  aster);.    asse
122a0 72 74 28 20 21 69 73 4f 70 65 6e 28 70 4a 6f 75  rt( !isOpen(pJou
122b0 72 6e 61 6c 29 20 29 3b 0a 20 20 7d 0a 20 20 73  rnal) );.  }.  s
122c0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4d 61 73  qlite3_free(pMas
122d0 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ter);.  return r
122e0 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  c;.}.../*.** Thi
122f0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
12300 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65  ed to change the
12310 20 61 63 74 75 61 6c 20 73 69 7a 65 20 6f 66 20   actual size of 
12320 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a  the database .**
12330 20 66 69 6c 65 20 69 6e 20 74 68 65 20 66 69 6c   file in the fil
12340 65 2d 73 79 73 74 65 6d 2e 20 54 68 69 73 20 6f  e-system. This o
12350 6e 6c 79 20 68 61 70 70 65 6e 73 20 77 68 65 6e  nly happens when
12360 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72   committing a tr
12370 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 6f 72  ansaction,.** or
12380 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20   rolling back a 
12390 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69 6e 63  transaction (inc
123a0 6c 75 64 69 6e 67 20 72 6f 6c 6c 69 6e 67 20 62  luding rolling b
123b0 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  ack a hot-journa
123c0 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  l)..**.** If the
123d0 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66   main database f
123e0 69 6c 65 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c  ile is not open,
123f0 20 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65   or an exclusive
12400 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 0a 2a 2a 20   lock is not.** 
12410 68 65 6c 64 2c 20 74 68 69 73 20 66 75 6e 63 74  held, this funct
12420 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  ion is a no-op. 
12430 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 73  Otherwise, the s
12440 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ize of the file 
12450 69 73 0a 2a 2a 20 63 68 61 6e 67 65 64 20 74 6f  is.** changed to
12460 20 6e 50 61 67 65 20 70 61 67 65 73 20 28 6e 50   nPage pages (nP
12470 61 67 65 2a 70 50 61 67 65 72 2d 3e 70 61 67 65  age*pPager->page
12480 53 69 7a 65 20 62 79 74 65 73 29 2e 20 49 66 20  Size bytes). If 
12490 74 68 65 20 66 69 6c 65 0a 2a 2a 20 6f 6e 20 64  the file.** on d
124a0 69 73 6b 20 69 73 20 63 75 72 72 65 6e 74 6c 79  isk is currently
124b0 20 6c 61 72 67 65 72 20 74 68 61 6e 20 6e 50 61   larger than nPa
124c0 67 65 20 70 61 67 65 73 2c 20 74 68 65 6e 20 75  ge pages, then u
124d0 73 65 20 74 68 65 20 56 46 53 0a 2a 2a 20 78 54  se the VFS.** xT
124e0 72 75 6e 63 61 74 65 28 29 20 6d 65 74 68 6f 64  runcate() method
124f0 20 74 6f 20 74 72 75 6e 63 61 74 65 20 69 74 2e   to truncate it.
12500 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 74 20 6d 69  .**.** Or, it mi
12510 67 68 74 20 6d 69 67 68 74 20 62 65 20 74 68 65  ght might be the
12520 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20 66   case that the f
12530 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 73  ile on disk is s
12540 6d 61 6c 6c 65 72 20 74 68 61 6e 20 0a 2a 2a 20  maller than .** 
12550 6e 50 61 67 65 20 70 61 67 65 73 2e 20 53 6f 6d  nPage pages. Som
12560 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
12570 65 6d 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  em implementatio
12580 6e 73 20 63 61 6e 20 67 65 74 20 63 6f 6e 66 75  ns can get confu
12590 73 65 64 20 69 66 20 0a 2a 2a 20 79 6f 75 20 74  sed if .** you t
125a0 72 79 20 74 6f 20 74 72 75 6e 63 61 74 65 20 61  ry to truncate a
125b0 20 66 69 6c 65 20 74 6f 20 73 6f 6d 65 20 73 69   file to some si
125c0 7a 65 20 74 68 61 74 20 69 73 20 6c 61 72 67 65  ze that is large
125d0 72 20 74 68 61 6e 20 69 74 20 0a 2a 2a 20 63 75  r than it .** cu
125e0 72 72 65 6e 74 6c 79 20 69 73 2c 20 73 6f 20 64  rrently is, so d
125f0 65 74 65 63 74 20 74 68 69 73 20 63 61 73 65 20  etect this case 
12600 61 6e 64 20 77 72 69 74 65 20 61 20 73 69 6e 67  and write a sing
12610 6c 65 20 7a 65 72 6f 20 62 79 74 65 20 74 6f 20  le zero byte to 
12620 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 74  .** the end of t
12630 68 65 20 6e 65 77 20 66 69 6c 65 20 69 6e 73 74  he new file inst
12640 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  ead..**.** If su
12650 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e  ccessful, return
12660 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61   SQLITE_OK. If a
12670 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
12680 73 20 77 68 69 6c 65 20 6d 6f 64 69 66 79 69 6e  s while modifyin
12690 67 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  g.** the databas
126a0 65 20 66 69 6c 65 2c 20 72 65 74 75 72 6e 20 74  e file, return t
126b0 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f  he error code to
126c0 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a   the caller..*/.
126d0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
126e0 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65 72 20  _truncate(Pager 
126f0 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50  *pPager, Pgno nP
12700 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  age){.  int rc =
12710 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
12720 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
12730 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45  =PAGER_EXCLUSIVE
12740 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65   && isOpen(pPage
12750 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 69 36  r->fd) ){.    i6
12760 34 20 63 75 72 72 65 6e 74 53 69 7a 65 2c 20 6e  4 currentSize, n
12770 65 77 53 69 7a 65 3b 0a 20 20 20 20 2f 2a 20 54  ewSize;.    /* T
12780 4f 44 4f 3a 20 49 73 20 69 74 20 73 61 66 65 20  ODO: Is it safe 
12790 74 6f 20 75 73 65 20 50 61 67 65 72 2e 64 62 46  to use Pager.dbF
127a0 69 6c 65 53 69 7a 65 20 68 65 72 65 3f 20 2a 2f  ileSize here? */
127b0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
127c0 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
127d0 65 72 2d 3e 66 64 2c 20 26 63 75 72 72 65 6e 74  er->fd, &current
127e0 53 69 7a 65 29 3b 0a 20 20 20 20 6e 65 77 53 69  Size);.    newSi
127f0 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  ze = pPager->pag
12800 65 53 69 7a 65 2a 28 69 36 34 29 6e 50 61 67 65  eSize*(i64)nPage
12810 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
12820 4c 49 54 45 5f 4f 4b 20 26 26 20 63 75 72 72 65  LITE_OK && curre
12830 6e 74 53 69 7a 65 21 3d 6e 65 77 53 69 7a 65 20  ntSize!=newSize 
12840 29 7b 0a 20 20 20 20 20 20 69 66 28 20 63 75 72  ){.      if( cur
12850 72 65 6e 74 53 69 7a 65 3e 6e 65 77 53 69 7a 65  rentSize>newSize
12860 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
12870 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
12880 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 6e  te(pPager->fd, n
12890 65 77 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d  ewSize);.      }
128a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
128b0 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
128c0 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 22 22  e(pPager->fd, ""
128d0 2c 20 31 2c 20 6e 65 77 53 69 7a 65 2d 31 29 3b  , 1, newSize-1);
128e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
128f0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
12900 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67   ){.        pPag
12910 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d  er->dbFileSize =
12920 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a   nPage;.      }.
12930 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
12940 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
12950 53 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  Set the value of
12960 20 74 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f   the Pager.secto
12970 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 66  rSize variable f
12980 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  or the given.** 
12990 70 61 67 65 72 20 62 61 73 65 64 20 6f 6e 20 74  pager based on t
129a0 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
129b0 64 20 62 79 20 74 68 65 20 78 53 65 63 74 6f 72  d by the xSector
129c0 53 69 7a 65 20 6d 65 74 68 6f 64 0a 2a 2a 20 6f  Size method.** o
129d0 66 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62  f the open datab
129e0 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 73 65  ase file. The se
129f0 63 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62  ctor size will b
12a00 65 20 75 73 65 64 20 75 73 65 64 20 0a 2a 2a 20  e used used .** 
12a10 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
12a20 20 73 69 7a 65 20 61 6e 64 20 61 6c 69 67 6e 6d   size and alignm
12a30 65 6e 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68  ent of journal h
12a40 65 61 64 65 72 20 61 6e 64 20 0a 2a 2a 20 6d 61  eader and .** ma
12a50 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster journal poi
12a60 6e 74 65 72 73 20 77 69 74 68 69 6e 20 63 72 65  nters within cre
12a70 61 74 65 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ated journal fil
12a80 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65  es..**.** For te
12a90 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20 74 68  mporary files th
12aa0 65 20 65 66 66 65 63 74 69 76 65 20 73 65 63 74  e effective sect
12ab0 6f 72 20 73 69 7a 65 20 69 73 20 61 6c 77 61 79  or size is alway
12ac0 73 20 35 31 32 20 62 79 74 65 73 2e 0a 2a 2a 0a  s 512 bytes..**.
12ad0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 66 6f  ** Otherwise, fo
12ae0 72 20 6e 6f 6e 2d 74 65 6d 70 6f 72 61 72 79 20  r non-temporary 
12af0 66 69 6c 65 73 2c 20 74 68 65 20 65 66 66 65 63  files, the effec
12b00 74 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65  tive sector size
12b10 20 69 73 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65   is.** the value
12b20 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65   returned by the
12b30 20 78 53 65 63 74 6f 72 53 69 7a 65 28 29 20 6d   xSectorSize() m
12b40 65 74 68 6f 64 20 72 6f 75 6e 64 65 64 20 75 70  ethod rounded up
12b50 20 74 6f 20 33 32 20 69 66 0a 2a 2a 20 69 74 20   to 32 if.** it 
12b60 69 73 20 6c 65 73 73 20 74 68 61 6e 20 33 32 2c  is less than 32,
12b70 20 6f 72 20 72 6f 75 6e 64 65 64 20 64 6f 77 6e   or rounded down
12b80 20 74 6f 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53   to MAX_SECTOR_S
12b90 49 5a 45 20 69 66 20 69 74 0a 2a 2a 20 69 73 20  IZE if it.** is 
12ba0 67 72 65 61 74 65 72 20 74 68 61 6e 20 4d 41 58  greater than MAX
12bb0 5f 53 45 43 54 4f 52 5f 53 49 5a 45 2e 0a 2a 2f  _SECTOR_SIZE..*/
12bc0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74  .static void set
12bd0 53 65 63 74 6f 72 53 69 7a 65 28 50 61 67 65 72  SectorSize(Pager
12be0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73   *pPager){.  ass
12bf0 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
12c00 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65  er->fd) || pPage
12c10 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 0a  r->tempFile );..
12c20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74    if( !pPager->t
12c30 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 2f  empFile ){.    /
12c40 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 64 6f  * Sector size do
12c50 65 73 6e 27 74 20 6d 61 74 74 65 72 20 66 6f 72  esn't matter for
12c60 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   temporary files
12c70 2e 20 41 6c 73 6f 2c 20 74 68 65 20 66 69 6c 65  . Also, the file
12c80 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20  .    ** may not 
12c90 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65 64  have been opened
12ca0 20 79 65 74 2c 20 69 6e 20 77 68 69 63 68 20 63   yet, in which c
12cb0 61 73 65 20 74 68 65 20 4f 73 53 65 63 74 6f 72  ase the OsSector
12cc0 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20 63 61  Size().    ** ca
12cd0 6c 6c 20 77 69 6c 6c 20 73 65 67 66 61 75 6c 74  ll will segfault
12ce0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61  ..    */.    pPa
12cf0 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
12d00 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f  = sqlite3OsSecto
12d10 72 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64  rSize(pPager->fd
12d20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  );.  }.  if( pPa
12d30 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3c  ger->sectorSize<
12d40 33 32 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  32 ){.    pPager
12d50 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 35  ->sectorSize = 5
12d60 31 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  12;.  }.  if( pP
12d70 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
12d80 3e 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45  >MAX_SECTOR_SIZE
12d90 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
12da0 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3e  MAX_SECTOR_SIZE>
12db0 3d 35 31 32 20 29 3b 0a 20 20 20 20 70 50 61 67  =512 );.    pPag
12dc0 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  er->sectorSize =
12dd0 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45   MAX_SECTOR_SIZE
12de0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  ;.  }.}../*.** P
12df0 6c 61 79 62 61 63 6b 20 74 68 65 20 6a 6f 75 72  layback the jour
12e00 6e 61 6c 20 61 6e 64 20 74 68 75 73 20 72 65 73  nal and thus res
12e10 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73  tore the databas
12e20 65 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74 68 65  e file to.** the
12e30 20 73 74 61 74 65 20 69 74 20 77 61 73 20 69 6e   state it was in
12e40 20 62 65 66 6f 72 65 20 77 65 20 73 74 61 72 74   before we start
12e50 65 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65  ed making change
12e60 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a  s.  .**.** The j
12e70 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d  ournal file form
12e80 61 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73  at is as follows
12e90 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20 20 38  : .**.**  (1)  8
12ea0 20 62 79 74 65 20 70 72 65 66 69 78 2e 20 20 41   byte prefix.  A
12eb0 20 63 6f 70 79 20 6f 66 20 61 4a 6f 75 72 6e 61   copy of aJourna
12ec0 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32  lMagic[]..**  (2
12ed0 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e  )  4 byte big-en
12ee0 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  dian integer whi
12ef0 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ch is the number
12f00 20 6f 66 20 76 61 6c 69 64 20 70 61 67 65 20 72   of valid page r
12f10 65 63 6f 72 64 73 0a 2a 2a 20 20 20 20 20 20 20  ecords.**       
12f20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  in the journal. 
12f30 20 49 66 20 74 68 69 73 20 76 61 6c 75 65 20 69   If this value i
12f40 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74 68  s 0xffffffff, th
12f50 65 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a  en compute the.*
12f60 2a 20 20 20 20 20 20 20 6e 75 6d 62 65 72 20 6f  *       number o
12f70 66 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66  f page records f
12f80 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
12f90 73 69 7a 65 2e 0a 2a 2a 20 20 28 33 29 20 20 34  size..**  (3)  4
12fa0 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e   byte big-endian
12fb0 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
12fc0 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76 61  s the initial va
12fd0 6c 75 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20  lue for the .** 
12fe0 20 20 20 20 20 20 73 61 6e 69 74 79 20 63 68 65        sanity che
12ff0 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34 29 20 20  cksum..**  (4)  
13000 34 20 62 79 74 65 20 69 6e 74 65 67 65 72 20 77  4 byte integer w
13010 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62  hich is the numb
13020 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20 74  er of pages to t
13030 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 20  runcate the.**  
13040 20 20 20 20 20 64 61 74 61 62 61 73 65 20 74 6f       database to
13050 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61   during a rollba
13060 63 6b 2e 0a 2a 2a 20 20 28 35 29 20 20 34 20 62  ck..**  (5)  4 b
13070 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  yte big-endian i
13080 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
13090 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 2e  the sector size.
130a0 20 20 54 68 65 20 68 65 61 64 65 72 0a 2a 2a 20    The header.** 
130b0 20 20 20 20 20 20 69 73 20 74 68 69 73 20 6d 61        is this ma
130c0 6e 79 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ny bytes in size
130d0 2e 0a 2a 2a 20 20 28 36 29 20 20 34 20 62 79 74  ..**  (6)  4 byt
130e0 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
130f0 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
13100 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20  e page size..** 
13110 20 28 37 29 20 20 7a 65 72 6f 20 70 61 64 64 69   (7)  zero paddi
13120 6e 67 20 6f 75 74 20 74 6f 20 74 68 65 20 6e 65  ng out to the ne
13130 78 74 20 73 65 63 74 6f 72 20 73 69 7a 65 2e 0a  xt sector size..
13140 2a 2a 20 20 28 38 29 20 20 5a 65 72 6f 20 6f 72  **  (8)  Zero or
13150 20 6d 6f 72 65 20 70 61 67 65 73 20 69 6e 73 74   more pages inst
13160 61 6e 63 65 73 2c 20 65 61 63 68 20 61 73 20 66  ances, each as f
13170 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20 20  ollows:.**      
13180 20 20 2b 20 20 34 20 62 79 74 65 20 70 61 67 65    +  4 byte page
13190 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20 20   number..**     
131a0 20 20 20 2b 20 20 70 50 61 67 65 72 2d 3e 70 61     +  pPager->pa
131b0 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20  geSize bytes of 
131c0 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20 20  data..**        
131d0 2b 20 20 34 20 62 79 74 65 20 63 68 65 63 6b 73  +  4 byte checks
131e0 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 65  um.**.** When we
131f0 20 73 70 65 61 6b 20 6f 66 20 74 68 65 20 6a 6f   speak of the jo
13200 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 77 65  urnal header, we
13210 20 6d 65 61 6e 20 74 68 65 20 66 69 72 73 74 20   mean the first 
13220 37 20 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a 2a  7 items above..*
13230 2a 20 45 61 63 68 20 65 6e 74 72 79 20 69 6e 20  * Each entry in 
13240 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61  the journal is a
13250 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
13260 65 20 38 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a  e 8th item..**.*
13270 2a 20 43 61 6c 6c 20 74 68 65 20 76 61 6c 75 65  * Call the value
13280 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64   from the second
13290 20 62 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e 20   bullet "nRec". 
132a0 20 6e 52 65 63 20 69 73 20 74 68 65 20 6e 75 6d   nRec is the num
132b0 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64 20  ber of.** valid 
132c0 70 61 67 65 20 65 6e 74 72 69 65 73 20 69 6e 20  page entries in 
132d0 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e  the journal.  In
132e0 20 6d 6f 73 74 20 63 61 73 65 73 2c 20 79 6f 75   most cases, you
132f0 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65   can compute the
13300 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52 65  .** value of nRe
13310 63 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20  c from the size 
13320 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
13330 69 6c 65 2e 20 20 42 75 74 20 69 66 20 61 20 70  ile.  But if a p
13340 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 20  ower.** failure 
13350 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65 20 74  occurred while t
13360 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62  he journal was b
13370 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20 69 74  eing written, it
13380 20 63 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a 2a   could be the.**
13390 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20 73   case that the s
133a0 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
133b0 61 6c 20 66 69 6c 65 20 68 61 64 20 61 6c 72 65  al file had alre
133c0 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65 61 73  ady been increas
133d0 65 64 20 62 75 74 0a 2a 2a 20 74 68 65 20 65 78  ed but.** the ex
133e0 74 72 61 20 65 6e 74 72 69 65 73 20 68 61 64 20  tra entries had 
133f0 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 69 74 20  not yet made it 
13400 73 61 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e 20  safely to disk. 
13410 20 49 6e 20 73 75 63 68 20 61 20 63 61 73 65 2c   In such a case,
13420 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66  .** the value of
13430 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66   nRec computed f
13440 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a  rom the file siz
13450 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20 6c  e would be too l
13460 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68  arge.  For.** th
13470 61 74 20 72 65 61 73 6f 6e 2c 20 77 65 20 61 6c  at reason, we al
13480 77 61 79 73 20 75 73 65 20 74 68 65 20 6e 52 65  ways use the nRe
13490 63 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 68  c value in the h
134a0 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  eader..**.** If 
134b0 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69  the nRec value i
134c0 73 20 30 78 66 66 66 66 66 66 66 66 20 69 74 20  s 0xffffffff it 
134d0 6d 65 61 6e 73 20 74 68 61 74 20 6e 52 65 63 20  means that nRec 
134e0 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74  should be comput
134f0 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66  ed.** from the f
13500 69 6c 65 20 73 69 7a 65 2e 20 20 54 68 69 73 20  ile size.  This 
13510 76 61 6c 75 65 20 69 73 20 75 73 65 64 20 77 68  value is used wh
13520 65 6e 20 74 68 65 20 75 73 65 72 20 73 65 6c 65  en the user sele
13530 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79  cts the.** no-sy
13540 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74 68  nc option for th
13550 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70 6f  e journal.  A po
13560 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c  wer failure coul
13570 64 20 6c 65 61 64 20 74 6f 20 63 6f 72 72 75 70  d lead to corrup
13580 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73 20  tion.** in this 
13590 63 61 73 65 2e 20 20 42 75 74 20 66 6f 72 20 74  case.  But for t
135a0 68 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70 6f  hings like tempo
135b0 72 61 72 79 20 74 61 62 6c 65 20 28 77 68 69 63  rary table (whic
135c0 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c  h will be.** del
135d0 65 74 65 64 20 77 68 65 6e 20 74 68 65 20 70 6f  eted when the po
135e0 77 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 29  wer is restored)
135f0 20 77 65 20 64 6f 6e 27 74 20 63 61 72 65 2e 20   we don't care. 
13600 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66   .**.** If the f
13610 69 6c 65 20 6f 70 65 6e 65 64 20 61 73 20 74 68  ile opened as th
13620 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
13630 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72  s not a well-for
13640 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  med.** journal f
13650 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70 61 67  ile then all pag
13660 65 73 20 75 70 20 74 6f 20 74 68 65 20 66 69 72  es up to the fir
13670 73 74 20 63 6f 72 72 75 70 74 65 64 20 70 61 67  st corrupted pag
13680 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20  e are rolled.** 
13690 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61 67 65  back (or no page
136a0 73 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s if the journal
136b0 20 68 65 61 64 65 72 20 69 73 20 63 6f 72 72 75   header is corru
136c0 70 74 65 64 29 2e 20 54 68 65 20 6a 6f 75 72 6e  pted). The journ
136d0 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 74 68  al file.** is th
136e0 65 6e 20 64 65 6c 65 74 65 64 20 61 6e 64 20 53  en deleted and S
136f0 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
13700 64 2c 20 6a 75 73 74 20 61 73 20 69 66 20 6e 6f  d, just as if no
13710 20 63 6f 72 72 75 70 74 69 6f 6e 20 68 61 64 0a   corruption had.
13720 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65  ** been encounte
13730 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  red..**.** If an
13740 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29   I/O or malloc()
13750 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
13760 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20  he journal-file 
13770 69 73 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a 2a  is not deleted.*
13780 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63  * and an error c
13790 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
137a0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 48 6f 74  .**.** The isHot
137b0 20 70 61 72 61 6d 65 74 65 72 20 69 6e 64 69 63   parameter indic
137c0 61 74 65 73 20 74 68 61 74 20 77 65 20 61 72 65  ates that we are
137d0 20 74 72 79 69 6e 67 20 74 6f 20 72 6f 6c 6c 62   trying to rollb
137e0 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  ack a journal.**
137f0 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 61   that might be a
13800 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f   hot journal.  O
13810 72 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 20 74  r, it could be t
13820 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
13830 69 73 20 0a 2a 2a 20 70 72 65 73 65 72 76 65 64  is .** preserved
13840 20 62 65 63 61 75 73 65 20 6f 66 20 4a 4f 55 52   because of JOUR
13850 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20  NALMODE_PERSIST 
13860 6f 72 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54  or JOURNALMODE_T
13870 52 55 4e 43 41 54 45 2e 0a 2a 2a 20 49 66 20 74  RUNCATE..** If t
13880 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 61 6c 6c  he journal reall
13890 79 20 69 73 20 68 6f 74 2c 20 72 65 73 65 74 20  y is hot, reset 
138a0 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20  the pager cache 
138b0 70 72 69 6f 72 20 72 6f 6c 6c 69 6e 67 0a 2a 2a  prior rolling.**
138c0 20 62 61 63 6b 20 61 6e 79 20 63 6f 6e 74 65 6e   back any conten
138d0 74 2e 20 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  t.  If the journ
138e0 61 6c 20 69 73 20 6d 65 72 65 6c 79 20 70 65 72  al is merely per
138f0 73 69 73 74 65 6e 74 2c 20 6e 6f 20 72 65 73 65  sistent, no rese
13900 74 20 69 73 0a 2a 2a 20 6e 65 65 64 65 64 2e 0a  t is.** needed..
13910 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
13920 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 50 61 67  ger_playback(Pag
13930 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
13940 69 73 48 6f 74 29 7b 0a 20 20 73 71 6c 69 74 65  isHot){.  sqlite
13950 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50  3_vfs *pVfs = pP
13960 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 36  ager->pVfs;.  i6
13970 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20  4 szJ;          
13980 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
13990 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
139a0 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  le in bytes */. 
139b0 20 75 33 32 20 6e 52 65 63 3b 20 20 20 20 20 20   u32 nRec;      
139c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
139d0 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20 69  ber of Records i
139e0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f  n the journal */
139f0 0a 20 20 75 33 32 20 75 3b 20 20 20 20 20 20 20  .  u32 u;       
13a00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
13a10 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75  nsigned loop cou
13a20 6e 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d  nter */.  Pgno m
13a30 78 50 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20  xPg = 0;        
13a40 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
13a50 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 20  e original file 
13a60 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e  in pages */.  in
13a70 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
13a80 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
13a90 20 63 6f 64 65 20 6f 66 20 61 20 73 75 62 72 6f   code of a subro
13aa0 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72  utine */.  int r
13ab0 65 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20  es = 1;         
13ac0 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74      /* Value ret
13ad0 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33  urned by sqlite3
13ae0 4f 73 41 63 63 65 73 73 28 29 20 2a 2f 0a 20 20  OsAccess() */.  
13af0 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20  char *zMaster = 
13b00 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  0;       /* Name
13b10 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   of master journ
13b20 61 6c 20 66 69 6c 65 20 69 66 20 61 6e 79 20 2a  al file if any *
13b30 2f 0a 20 20 69 6e 74 20 6e 65 65 64 50 61 67 65  /.  int needPage
13b40 72 52 65 73 65 74 3b 20 20 20 20 20 20 2f 2a 20  rReset;      /* 
13b50 54 72 75 65 20 74 6f 20 72 65 73 65 74 20 70 61  True to reset pa
13b60 67 65 20 70 72 69 6f 72 20 74 6f 20 66 69 72 73  ge prior to firs
13b70 74 20 70 61 67 65 20 72 6f 6c 6c 62 61 63 6b 20  t page rollback 
13b80 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20  */..  /* Figure 
13b90 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63  out how many rec
13ba0 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68 65 20  ords are in the 
13bb0 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f 72 74 20  journal.  Abort 
13bc0 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a 20 74 68  early if.  ** th
13bd0 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 65 6d 70  e journal is emp
13be0 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ty..  */.  asser
13bf0 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
13c00 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 72 63 20 3d  ->jfd) );.  rc =
13c10 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
13c20 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ze(pPager->jfd, 
13c30 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63 21  &szJ);.  if( rc!
13c40 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 7a  =SQLITE_OK || sz
13c50 4a 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f  J==0 ){.    goto
13c60 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
13c70 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68   }..  /* Read th
13c80 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
13c90 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 6a   name from the j
13ca0 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 69 73  ournal, if it is
13cb0 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2a 20 49   present..  ** I
13cc0 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
13cd0 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20  al file name is 
13ce0 73 70 65 63 69 66 69 65 64 2c 20 62 75 74 20 74  specified, but t
13cf0 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a 20  he file is not. 
13d00 20 2a 2a 20 70 72 65 73 65 6e 74 20 6f 6e 20 64   ** present on d
13d10 69 73 6b 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f  isk, then the jo
13d20 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 68 6f 74  urnal is not hot
13d30 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6e 65   and does not ne
13d40 65 64 20 74 6f 20 62 65 0a 20 20 2a 2a 20 70 6c  ed to be.  ** pl
13d50 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2a 0a  ayed back..  **.
13d60 20 20 2a 2a 20 54 4f 44 4f 3a 20 54 65 63 68 6e    ** TODO: Techn
13d70 69 63 61 6c 6c 79 20 74 68 65 20 66 6f 6c 6c 6f  ically the follo
13d80 77 69 6e 67 20 69 73 20 61 6e 20 65 72 72 6f 72  wing is an error
13d90 20 62 65 63 61 75 73 65 20 69 74 20 61 73 73 75   because it assu
13da0 6d 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 62 75  mes that.  ** bu
13db0 66 66 65 72 20 50 61 67 65 72 2e 70 54 6d 70 53  ffer Pager.pTmpS
13dc0 70 61 63 65 20 69 73 20 28 6d 78 50 61 74 68 6e  pace is (mxPathn
13dd0 61 6d 65 2b 31 29 20 62 79 74 65 73 20 6f 72 20  ame+1) bytes or 
13de0 6c 61 72 67 65 72 2e 20 69 2e 65 2e 20 74 68 61  larger. i.e. tha
13df0 74 0a 20 20 2a 2a 20 28 70 50 61 67 65 72 2d 3e  t.  ** (pPager->
13e00 70 61 67 65 53 69 7a 65 20 3e 3d 20 70 50 61 67  pageSize >= pPag
13e10 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68  er->pVfs->mxPath
13e20 6e 61 6d 65 2b 31 29 2e 20 55 73 69 6e 67 20 6f  name+1). Using o
13e30 73 5f 75 6e 69 78 2e 63 2c 0a 20 20 2a 2a 20 20  s_unix.c,.  **  
13e40 6d 78 50 61 74 68 6e 61 6d 65 20 69 73 20 35 31  mxPathname is 51
13e50 32 2c 20 77 68 69 63 68 20 69 73 20 74 68 65 20  2, which is the 
13e60 73 61 6d 65 20 61 73 20 74 68 65 20 6d 69 6e 69  same as the mini
13e70 6d 75 6d 20 61 6c 6c 6f 77 61 62 6c 65 20 76 61  mum allowable va
13e80 6c 75 65 0a 20 20 2a 2a 20 66 6f 72 20 70 61 67  lue.  ** for pag
13e90 65 53 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 7a 4d  eSize..  */.  zM
13ea0 61 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d 3e  aster = pPager->
13eb0 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 72 63 20  pTmpSpace;.  rc 
13ec0 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72  = readMasterJour
13ed0 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  nal(pPager->jfd,
13ee0 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72   zMaster, pPager
13ef0 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  ->pVfs->mxPathna
13f00 6d 65 2b 31 29 3b 0a 20 20 69 66 28 20 72 63 3d  me+1);.  if( rc=
13f10 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d  =SQLITE_OK && zM
13f20 61 73 74 65 72 5b 30 5d 20 29 7b 0a 20 20 20 20  aster[0] ){.    
13f30 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63  rc = sqlite3OsAc
13f40 63 65 73 73 28 70 56 66 73 2c 20 7a 4d 61 73 74  cess(pVfs, zMast
13f50 65 72 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53  er, SQLITE_ACCES
13f60 53 5f 45 58 49 53 54 53 2c 20 26 72 65 73 29 3b  S_EXISTS, &res);
13f70 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 20 3d  .  }.  zMaster =
13f80 20 30 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51   0;.  if( rc!=SQ
13f90 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 72 65 73 20  LITE_OK || !res 
13fa0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  ){.    goto end_
13fb0 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20  playback;.  }.  
13fc0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
13fd0 66 66 20 3d 20 30 3b 0a 20 20 6e 65 65 64 50 61  ff = 0;.  needPa
13fe0 67 65 72 52 65 73 65 74 20 3d 20 69 73 48 6f 74  gerReset = isHot
13ff0 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f  ;..  /* This loo
14000 70 20 74 65 72 6d 69 6e 61 74 65 73 20 65 69 74  p terminates eit
14010 68 65 72 20 77 68 65 6e 20 61 20 72 65 61 64 4a  her when a readJ
14020 6f 75 72 6e 61 6c 48 64 72 28 29 20 6f 72 20 0a  ournalHdr() or .
14030 20 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79 62    ** pager_playb
14040 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20 63  ack_one_page() c
14050 61 6c 6c 20 72 65 74 75 72 6e 73 20 53 51 4c 49  all returns SQLI
14060 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 49 4f  TE_DONE or an IO
14070 20 65 72 72 6f 72 20 0a 20 20 2a 2a 20 6f 63 63   error .  ** occ
14080 75 72 73 2e 20 0a 20 20 2a 2f 0a 20 20 77 68 69  urs. .  */.  whi
14090 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 2f 2a 20  le( 1 ){.    /* 
140a0 52 65 61 64 20 74 68 65 20 6e 65 78 74 20 6a 6f  Read the next jo
140b0 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 72 6f  urnal header fro
140c0 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  m the journal fi
140d0 6c 65 2e 20 20 49 66 20 74 68 65 72 65 20 61 72  le.  If there ar
140e0 65 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f  e.    ** not eno
140f0 75 67 68 20 62 79 74 65 73 20 6c 65 66 74 20 69  ugh bytes left i
14100 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
14110 6c 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c 65 74  le for a complet
14120 65 20 68 65 61 64 65 72 2c 20 6f 72 0a 20 20 20  e header, or.   
14130 20 2a 2a 20 69 74 20 69 73 20 63 6f 72 72 75 70   ** it is corrup
14140 74 65 64 2c 20 74 68 65 6e 20 61 20 70 72 6f 63  ted, then a proc
14150 65 73 73 20 6d 75 73 74 20 6f 66 20 66 61 69 6c  ess must of fail
14160 65 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67  ed while writing
14170 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73   it..    ** This
14180 20 69 6e 64 69 63 61 74 65 73 20 6e 6f 74 68 69   indicates nothi
14190 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73 20 74 6f  ng more needs to
141a0 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   be rolled back.
141b0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
141c0 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28   readJournalHdr(
141d0 70 50 61 67 65 72 2c 20 69 73 48 6f 74 2c 20 73  pPager, isHot, s
141e0 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 6d 78 50 67  zJ, &nRec, &mxPg
141f0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
14200 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20 20  QLITE_OK ){ .   
14210 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
14220 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  E_DONE ){.      
14230 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
14240 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
14250 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
14260 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
14270 20 49 66 20 6e 52 65 63 20 69 73 20 30 78 66 66   If nRec is 0xff
14280 66 66 66 66 66 66 2c 20 74 68 65 6e 20 74 68 69  ffffff, then thi
14290 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 63 72  s journal was cr
142a0 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65  eated by a proce
142b0 73 73 0a 20 20 20 20 2a 2a 20 77 6f 72 6b 69 6e  ss.    ** workin
142c0 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64  g in no-sync mod
142d0 65 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68  e. This means th
142e0 61 74 20 74 68 65 20 72 65 73 74 20 6f 66 20 74  at the rest of t
142f0 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a  he journal.    *
14300 2a 20 66 69 6c 65 20 63 6f 6e 73 69 73 74 73 20  * file consists 
14310 6f 66 20 70 61 67 65 73 2c 20 74 68 65 72 65 20  of pages, there 
14320 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75 72  are no more jour
14330 6e 61 6c 20 68 65 61 64 65 72 73 2e 20 43 6f 6d  nal headers. Com
14340 70 75 74 65 0a 20 20 20 20 2a 2a 20 74 68 65 20  pute.    ** the 
14350 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 62 61  value of nRec ba
14360 73 65 64 20 6f 6e 20 74 68 69 73 20 61 73 73 75  sed on this assu
14370 6d 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  mption..    */. 
14380 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 78 66     if( nRec==0xf
14390 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20 20  fffffff ){.     
143a0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
143b0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55  >journalOff==JOU
143c0 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
143d0 65 72 29 20 29 3b 0a 20 20 20 20 20 20 6e 52 65  er) );.      nRe
143e0 63 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d  c = (int)((szJ -
143f0 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
14400 70 50 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41 4c  pPager))/JOURNAL
14410 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b  _PG_SZ(pPager));
14420 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
14430 66 20 6e 52 65 63 20 69 73 20 30 20 61 6e 64 20  f nRec is 0 and 
14440 74 68 69 73 20 72 6f 6c 6c 62 61 63 6b 20 69 73  this rollback is
14450 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   of a transactio
14460 6e 20 63 72 65 61 74 65 64 20 62 79 20 74 68 69  n created by thi
14470 73 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73  s.    ** process
14480 20 61 6e 64 20 69 66 20 74 68 69 73 20 69 73 20   and if this is 
14490 74 68 65 20 66 69 6e 61 6c 20 68 65 61 64 65 72  the final header
144a0 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c   in the journal,
144b0 20 74 68 65 6e 20 69 74 20 6d 65 61 6e 73 0a 20   then it means. 
144c0 20 20 20 2a 2a 20 74 68 61 74 20 74 68 69 73 20     ** that this 
144d0 70 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  part of the jour
144e0 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 66 69  nal was being fi
144f0 6c 6c 65 64 20 62 75 74 20 68 61 73 20 6e 6f 74  lled but has not
14500 20 79 65 74 20 62 65 65 6e 0a 20 20 20 20 2a 2a   yet been.    **
14510 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e   synced to disk.
14520 20 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6e 75    Compute the nu
14530 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 62 61  mber of pages ba
14540 73 65 64 20 6f 6e 20 74 68 65 20 72 65 6d 61 69  sed on the remai
14550 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 73 69 7a 65  ning.    ** size
14560 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a 20 20   of the file..  
14570 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
14580 74 68 69 72 64 20 74 65 72 6d 20 6f 66 20 74 68  third term of th
14590 65 20 74 65 73 74 20 77 61 73 20 61 64 64 65 64  e test was added
145a0 20 74 6f 20 66 69 78 20 74 69 63 6b 65 74 20 23   to fix ticket #
145b0 32 35 36 35 2e 0a 20 20 20 20 2a 2a 20 57 68 65  2565..    ** Whe
145c0 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61  n rolling back a
145d0 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2c 20 6e 52   hot journal, nR
145e0 65 63 3d 3d 30 20 61 6c 77 61 79 73 20 6d 65 61  ec==0 always mea
145f0 6e 73 20 74 68 61 74 20 74 68 65 20 6e 65 78 74  ns that the next
14600 0a 20 20 20 20 2a 2a 20 63 68 75 6e 6b 20 6f 66  .    ** chunk of
14610 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e   the journal con
14620 74 61 69 6e 73 20 7a 65 72 6f 20 70 61 67 65 73  tains zero pages
14630 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61   to be rolled ba
14640 63 6b 2e 20 20 42 75 74 0a 20 20 20 20 2a 2a 20  ck.  But.    ** 
14650 77 68 65 6e 20 64 6f 69 6e 67 20 61 20 52 4f 4c  when doing a ROL
14660 4c 42 41 43 4b 20 61 6e 64 20 74 68 65 20 6e 52  LBACK and the nR
14670 65 63 3d 3d 30 20 63 68 75 6e 6b 20 69 73 20 74  ec==0 chunk is t
14680 68 65 20 6c 61 73 74 20 63 68 75 6e 6b 20 69 6e  he last chunk in
14690 0a 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72  .    ** the jour
146a0 6e 61 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  nal, it means th
146b0 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d  at the journal m
146c0 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 61 64 64  ight contain add
146d0 69 74 69 6f 6e 61 6c 0a 20 20 20 20 2a 2a 20 70  itional.    ** p
146e0 61 67 65 73 20 74 68 61 74 20 6e 65 65 64 20 74  ages that need t
146f0 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  o be rolled back
14700 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 6e 75   and that the nu
14710 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 0a 20  mber of pages . 
14720 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20     ** should be 
14730 63 6f 6d 70 75 74 65 64 20 62 61 73 65 64 20 6f  computed based o
14740 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
14750 6c 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a  le size..    */.
14760 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 20      if( nRec==0 
14770 26 26 20 21 69 73 48 6f 74 20 26 26 0a 20 20 20  && !isHot &&.   
14780 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
14790 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f  rnalHdr+JOURNAL_
147a0 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d  HDR_SZ(pPager)==
147b0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
147c0 66 66 20 29 7b 0a 20 20 20 20 20 20 6e 52 65 63  ff ){.      nRec
147d0 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d 20   = (int)((szJ - 
147e0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
147f0 66 66 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47  ff) / JOURNAL_PG
14800 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20  _SZ(pPager));.  
14810 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
14820 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
14830 20 68 65 61 64 65 72 20 72 65 61 64 20 66 72 6f   header read fro
14840 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74  m the journal, t
14850 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20 20 20  runcate the.    
14860 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
14870 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69   back to its ori
14880 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20 20  ginal size..    
14890 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  */.    if( pPage
148a0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a  r->journalOff==J
148b0 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
148c0 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72  ager) ){.      r
148d0 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61  c = pager_trunca
148e0 74 65 28 70 50 61 67 65 72 2c 20 6d 78 50 67 29  te(pPager, mxPg)
148f0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
14900 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
14910 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c       goto end_pl
14920 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d 0a  ayback;.      }.
14930 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
14940 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a 20 20 20  Size = mxPg;.   
14950 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20   }..    /* Copy 
14960 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 6f  original pages o
14970 75 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ut of the journa
14980 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20  l and back into 
14990 74 68 65 20 0a 20 20 20 20 2a 2a 20 64 61 74 61  the .    ** data
149a0 62 61 73 65 20 66 69 6c 65 20 61 6e 64 2f 6f 72  base file and/or
149b0 20 70 61 67 65 20 63 61 63 68 65 2e 0a 20 20 20   page cache..   
149c0 20 2a 2f 0a 20 20 20 20 66 6f 72 28 75 3d 30 3b   */.    for(u=0;
149d0 20 75 3c 6e 52 65 63 3b 20 75 2b 2b 29 7b 0a 20   u<nRec; u++){. 
149e0 20 20 20 20 20 69 66 28 20 6e 65 65 64 50 61 67       if( needPag
149f0 65 72 52 65 73 65 74 20 29 7b 0a 20 20 20 20 20  erReset ){.     
14a00 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70     pager_reset(p
14a10 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
14a20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 20 3d  needPagerReset =
14a30 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
14a40 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
14a50 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70  yback_one_page(p
14a60 50 61 67 65 72 2c 26 70 50 61 67 65 72 2d 3e 6a  Pager,&pPager->j
14a70 6f 75 72 6e 61 6c 4f 66 66 2c 30 2c 31 2c 30 29  ournalOff,0,1,0)
14a80 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
14a90 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
14aa0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
14ab0 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
14ac0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
14ad0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  E_OK;.          
14ae0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
14af0 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 20 20  ff = szJ;.      
14b00 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
14b10 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d     }else if( rc=
14b20 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  =SQLITE_IOERR_SH
14b30 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20  ORT_READ ){.    
14b40 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
14b50 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65 65 6e  journal has been
14b60 20 74 72 75 6e 63 61 74 65 64 2c 20 73 69 6d 70   truncated, simp
14b70 6c 79 20 73 74 6f 70 20 72 65 61 64 69 6e 67 20  ly stop reading 
14b80 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  and.          **
14b90 20 70 72 6f 63 65 73 73 69 6e 67 20 74 68 65 20   processing the 
14ba0 6a 6f 75 72 6e 61 6c 2e 20 54 68 69 73 20 6d 69  journal. This mi
14bb0 67 68 74 20 68 61 70 70 65 6e 20 69 66 20 74 68  ght happen if th
14bc0 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20  e journal was.  
14bd0 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 63          ** not c
14be0 6f 6d 70 6c 65 74 65 6c 79 20 77 72 69 74 74 65  ompletely writte
14bf0 6e 20 61 6e 64 20 73 79 6e 63 65 64 20 70 72 69  n and synced pri
14c00 6f 72 20 74 6f 20 61 20 63 72 61 73 68 2e 20 20  or to a crash.  
14c10 49 6e 20 74 68 61 74 0a 20 20 20 20 20 20 20 20  In that.        
14c20 20 20 2a 2a 20 63 61 73 65 2c 20 74 68 65 20 64    ** case, the d
14c30 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64 20 68  atabase should h
14c40 61 76 65 20 6e 65 76 65 72 20 62 65 65 6e 20 77  ave never been w
14c50 72 69 74 74 65 6e 20 69 6e 20 74 68 65 0a 20 20  ritten in the.  
14c60 20 20 20 20 20 20 20 20 2a 2a 20 66 69 72 73 74          ** first
14c70 20 70 6c 61 63 65 20 73 6f 20 69 74 20 69 73 20   place so it is 
14c80 4f 4b 20 74 6f 20 73 69 6d 70 6c 79 20 61 62 61  OK to simply aba
14c90 6e 64 6f 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63  ndon the rollbac
14ca0 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  k. */.          
14cb0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
14cc0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
14cd0 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  nd_playback;.   
14ce0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
14cf0 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61        /* If we a
14d00 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 72 6f 6c  re unable to rol
14d10 6c 62 61 63 6b 2c 20 71 75 69 74 20 61 6e 64 20  lback, quit and 
14d20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72  return the error
14d30 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  .          ** co
14d40 64 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 63  de.  This will c
14d50 61 75 73 65 20 74 68 65 20 70 61 67 65 72 20 74  ause the pager t
14d60 6f 20 65 6e 74 65 72 20 74 68 65 20 65 72 72 6f  o enter the erro
14d70 72 20 73 74 61 74 65 0a 20 20 20 20 20 20 20 20  r state.        
14d80 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 6e 6f 20    ** so that no 
14d90 66 75 72 74 68 65 72 20 68 61 72 6d 20 77 69 6c  further harm wil
14da0 6c 20 62 65 20 64 6f 6e 65 2e 20 20 50 65 72 68  l be done.  Perh
14db0 61 70 73 20 74 68 65 20 6e 65 78 74 0a 20 20 20  aps the next.   
14dc0 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73         ** proces
14dd0 73 20 74 6f 20 63 6f 6d 65 20 61 6c 6f 6e 67 20  s to come along 
14de0 77 69 6c 6c 20 62 65 20 61 62 6c 65 20 74 6f 20  will be able to 
14df0 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 64 61 74  rollback the dat
14e00 61 62 61 73 65 2e 0a 20 20 20 20 20 20 20 20 20  abase..         
14e10 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 67 6f   */.          go
14e20 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
14e30 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
14e40 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f   }.    }.  }.  /
14e50 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a 20 20  *NOTREACHED*/.  
14e60 61 73 73 65 72 74 28 20 30 20 29 3b 0a 0a 65 6e  assert( 0 );..en
14e70 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20 2f 2a  d_playback:.  /*
14e80 20 46 6f 6c 6c 6f 77 69 6e 67 20 61 20 72 6f 6c   Following a rol
14e90 6c 62 61 63 6b 2c 20 74 68 65 20 64 61 74 61 62  lback, the datab
14ea0 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c 64 20  ase file should 
14eb0 62 65 20 62 61 63 6b 20 69 6e 20 69 74 73 20 6f  be back in its o
14ec0 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 73 74 61  riginal.  ** sta
14ed0 74 65 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  te prior to the 
14ee0 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61  start of the tra
14ef0 6e 73 61 63 74 69 6f 6e 2c 20 73 6f 20 69 6e 76  nsaction, so inv
14f00 6f 6b 65 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c  oke the.  ** SQL
14f10 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43  ITE_FCNTL_DB_UNC
14f20 48 41 4e 47 45 44 20 66 69 6c 65 2d 63 6f 6e 74  HANGED file-cont
14f30 72 6f 6c 20 6d 65 74 68 6f 64 20 74 6f 20 64 69  rol method to di
14f40 73 61 62 6c 65 20 74 68 65 0a 20 20 2a 2a 20 61  sable the.  ** a
14f50 73 73 65 72 74 69 6f 6e 20 74 68 61 74 20 74 68  ssertion that th
14f60 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  e transaction co
14f70 75 6e 74 65 72 20 77 61 73 20 6d 6f 64 69 66 69  unter was modifi
14f80 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ed..  */.  asser
14f90 74 28 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 66  t(.    pPager->f
14fa0 64 2d 3e 70 4d 65 74 68 6f 64 73 3d 3d 30 20 7c  d->pMethods==0 |
14fb0 7c 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46  |.    sqlite3OsF
14fc0 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 50 61 67 65  ileControl(pPage
14fd0 72 2d 3e 66 64 2c 53 51 4c 49 54 45 5f 46 43 4e  r->fd,SQLITE_FCN
14fe0 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 2c  TL_DB_UNCHANGED,
14ff0 30 29 3e 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  0)>=SQLITE_OK.  
15000 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  );..  /* If this
15010 20 70 6c 61 79 62 61 63 6b 20 69 73 20 68 61 70   playback is hap
15020 70 65 6e 69 6e 67 20 61 75 74 6f 6d 61 74 69 63  pening automatic
15030 61 6c 6c 79 20 61 73 20 61 20 72 65 73 75 6c 74  ally as a result
15040 20 6f 66 20 61 6e 20 49 4f 20 6f 72 20 0a 20 20   of an IO or .  
15050 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20  ** malloc error 
15060 74 68 61 74 20 6f 63 63 75 72 72 65 64 20 61 66  that occurred af
15070 74 65 72 20 74 68 65 20 63 68 61 6e 67 65 2d 63  ter the change-c
15080 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64 61 74  ounter was updat
15090 65 64 20 62 75 74 20 0a 20 20 2a 2a 20 62 65 66  ed but .  ** bef
150a0 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74  ore the transact
150b0 69 6f 6e 20 77 61 73 20 63 6f 6d 6d 69 74 74 65  ion was committe
150c0 64 2c 20 74 68 65 6e 20 74 68 65 20 63 68 61 6e  d, then the chan
150d0 67 65 2d 63 6f 75 6e 74 65 72 20 0a 20 20 2a 2a  ge-counter .  **
150e0 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20 6d 61   modification ma
150f0 79 20 6a 75 73 74 20 68 61 76 65 20 62 65 65 6e  y just have been
15100 20 72 65 76 65 72 74 65 64 2e 20 49 66 20 74 68   reverted. If th
15110 69 73 20 68 61 70 70 65 6e 73 20 69 6e 20 65 78  is happens in ex
15120 63 6c 75 73 69 76 65 20 0a 20 20 2a 2a 20 6d 6f  clusive .  ** mo
15130 64 65 2c 20 74 68 65 6e 20 73 75 62 73 65 71 75  de, then subsequ
15140 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ent transactions
15150 20 70 65 72 66 6f 72 6d 65 64 20 62 79 20 74 68   performed by th
15160 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 6c  e connection wil
15170 6c 20 6e 6f 74 0a 20 20 2a 2a 20 75 70 64 61 74  l not.  ** updat
15180 65 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  e the change-cou
15190 6e 74 65 72 20 61 74 20 61 6c 6c 2e 20 54 68 69  nter at all. Thi
151a0 73 20 6d 61 79 20 6c 65 61 64 20 74 6f 20 63 61  s may lead to ca
151b0 63 68 65 20 69 6e 63 6f 6e 73 69 73 74 65 6e 63  che inconsistenc
151c0 79 0a 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 73 20  y.  ** problems 
151d0 66 6f 72 20 6f 74 68 65 72 20 70 72 6f 63 65 73  for other proces
151e0 73 65 73 20 61 74 20 73 6f 6d 65 20 70 6f 69 6e  ses at some poin
151f0 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2e  t in the future.
15200 20 53 6f 2c 20 6a 75 73 74 0a 20 20 2a 2a 20 69   So, just.  ** i
15210 6e 20 63 61 73 65 20 74 68 69 73 20 68 61 73 20  n case this has 
15220 68 61 70 70 65 6e 65 64 2c 20 63 6c 65 61 72 20  happened, clear 
15230 74 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44  the changeCountD
15240 6f 6e 65 20 66 6c 61 67 20 6e 6f 77 2e 0a 20 20  one flag now..  
15250 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 63 68 61  */.  pPager->cha
15260 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70  ngeCountDone = p
15270 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b  Pager->tempFile;
15280 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
15290 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 7a 4d 61  TE_OK ){.    zMa
152a0 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70  ster = pPager->p
152b0 54 6d 70 53 70 61 63 65 3b 0a 20 20 20 20 72 63  TmpSpace;.    rc
152c0 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75   = readMasterJou
152d0 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64  rnal(pPager->jfd
152e0 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65  , zMaster, pPage
152f0 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  r->pVfs->mxPathn
15300 61 6d 65 2b 31 29 3b 0a 20 20 20 20 74 65 73 74  ame+1);.    test
15310 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45  case( rc!=SQLITE
15320 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28  _OK );.  }.  if(
15330 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
15340 26 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  & pPager->noSync
15350 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 73  ==0 && pPager->s
15360 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c  tate>=PAGER_EXCL
15370 55 53 49 56 45 20 29 7b 0a 20 20 20 20 72 63 20  USIVE ){.    rc 
15380 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
15390 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67  pPager->fd, pPag
153a0 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b  er->sync_flags);
153b0 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
153c0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67  QLITE_OK && pPag
153d0 65 72 2d 3e 6e 6f 53 79 6e 63 3d 3d 30 20 26 26  er->noSync==0 &&
153e0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
153f0 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
15400 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
15410 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72  te3OsSync(pPager
15420 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79  ->fd, pPager->sy
15430 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 7d 0a 20  nc_flags);.  }. 
15440 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
15450 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  OK ){.    rc = p
15460 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
15470 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 7a 4d 61  tion(pPager, zMa
15480 73 74 65 72 5b 30 5d 21 3d 27 5c 30 27 29 3b 0a  ster[0]!='\0');.
15490 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
154a0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
154b0 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
154c0 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65  ITE_OK && zMaste
154d0 72 5b 30 5d 20 26 26 20 72 65 73 20 29 7b 0a 20  r[0] && res ){. 
154e0 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77     /* If there w
154f0 61 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  as a master jour
15500 6e 61 6c 20 61 6e 64 20 74 68 69 73 20 72 6f 75  nal and this rou
15510 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e  tine will return
15520 20 73 75 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a   success,.    **
15530 20 73 65 65 20 69 66 20 69 74 20 69 73 20 70 6f   see if it is po
15540 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65  ssible to delete
15550 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
15560 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  nal..    */.    
15570 72 63 20 3d 20 70 61 67 65 72 5f 64 65 6c 6d 61  rc = pager_delma
15580 73 74 65 72 28 70 50 61 67 65 72 2c 20 7a 4d 61  ster(pPager, zMa
15590 73 74 65 72 29 3b 0a 20 20 20 20 74 65 73 74 63  ster);.    testc
155a0 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ase( rc!=SQLITE_
155b0 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  OK );.  }..  /* 
155c0 54 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f 72  The Pager.sector
155d0 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 6d 61  Size variable ma
155e0 79 20 68 61 76 65 20 62 65 65 6e 20 75 70 64 61  y have been upda
155f0 74 65 64 20 77 68 69 6c 65 20 72 6f 6c 6c 69 6e  ted while rollin
15600 67 0a 20 20 2a 2a 20 62 61 63 6b 20 61 20 6a 6f  g.  ** back a jo
15610 75 72 6e 61 6c 20 63 72 65 61 74 65 64 20 62 79  urnal created by
15620 20 61 20 70 72 6f 63 65 73 73 20 77 69 74 68 20   a process with 
15630 61 20 64 69 66 66 65 72 65 6e 74 20 73 65 63 74  a different sect
15640 6f 72 20 73 69 7a 65 0a 20 20 2a 2a 20 76 61 6c  or size.  ** val
15650 75 65 2e 20 52 65 73 65 74 20 69 74 20 74 6f 20  ue. Reset it to 
15660 74 68 65 20 63 6f 72 72 65 63 74 20 76 61 6c 75  the correct valu
15670 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65  e for this proce
15680 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 65 74 53 65  ss..  */.  setSe
15690 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29  ctorSize(pPager)
156a0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
156b0 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68  .../*.** Read th
156c0 65 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 70 61  e content for pa
156d0 67 65 20 70 50 67 20 6f 75 74 20 6f 66 20 74 68  ge pPg out of th
156e0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
156f0 61 6e 64 20 69 6e 74 6f 20 0a 2a 2a 20 70 50 67  and into .** pPg
15700 2d 3e 70 44 61 74 61 2e 20 41 20 73 68 61 72 65  ->pData. A share
15710 64 20 6c 6f 63 6b 20 6f 72 20 67 72 65 61 74 65  d lock or greate
15720 72 20 6d 75 73 74 20 62 65 20 68 65 6c 64 20 6f  r must be held o
15730 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  n the database.*
15740 2a 20 66 69 6c 65 20 62 65 66 6f 72 65 20 74 68  * file before th
15750 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
15760 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  alled..**.** If 
15770 70 61 67 65 20 31 20 69 73 20 72 65 61 64 2c 20  page 1 is read, 
15780 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 6f  then the value o
15790 66 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65  f Pager.dbFileVe
157a0 72 73 5b 5d 20 69 73 20 73 65 74 20 74 6f 0a 2a  rs[] is set to.*
157b0 2a 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64  * the value read
157c0 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
157d0 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  se file..**.** I
157e0 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
157f0 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65 20 49  curs, then the I
15800 4f 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72  O error is retur
15810 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ned to the calle
15820 72 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  r..** Otherwise,
15830 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
15840 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
15850 63 20 69 6e 74 20 72 65 61 64 44 62 50 61 67 65  c int readDbPage
15860 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
15870 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
15880 70 50 67 2d 3e 70 50 61 67 65 72 3b 20 2f 2a 20  pPg->pPager; /* 
15890 50 61 67 65 72 20 6f 62 6a 65 63 74 20 61 73 73  Pager object ass
158a0 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 61 67  ociated with pag
158b0 65 20 70 50 67 20 2a 2f 0a 20 20 50 67 6e 6f 20  e pPg */.  Pgno 
158c0 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f  pgno = pPg->pgno
158d0 3b 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20  ;       /* Page 
158e0 6e 75 6d 62 65 72 20 74 6f 20 72 65 61 64 20 2a  number to read *
158f0 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
15900 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
15910 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
15920 2a 2f 0a 20 20 69 36 34 20 69 4f 66 66 73 65 74  */.  i64 iOffset
15930 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
15940 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65 74    /* Byte offset
15950 20 6f 66 20 66 69 6c 65 20 74 6f 20 72 65 61 64   of file to read
15960 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69   from */.  int i
15970 73 49 6e 4c 6f 67 20 3d 20 30 3b 20 20 20 20 20  sInLog = 0;     
15980 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
15990 69 66 20 70 61 67 65 20 69 73 20 69 6e 20 6c 6f  if page is in lo
159a0 67 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 61 73 73  g file */..  ass
159b0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
159c0 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44  te>=PAGER_SHARED
159d0 20 26 26 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20   && !MEMDB );.  
159e0 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
159f0 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 0a 20  Pager->fd) );.. 
15a00 20 69 66 28 20 4e 45 56 45 52 28 21 69 73 4f 70   if( NEVER(!isOp
15a10 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 29 20  en(pPager->fd)) 
15a20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
15a30 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
15a40 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50  );.    memset(pP
15a50 67 2d 3e 70 44 61 74 61 2c 20 30 2c 20 70 50 61  g->pData, 0, pPa
15a60 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
15a70 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
15a80 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  E_OK;.  }..  if(
15a90 20 70 61 67 65 72 55 73 65 4c 6f 67 28 70 50 61   pagerUseLog(pPa
15aa0 67 65 72 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54  ger) ){.    /* T
15ab0 72 79 20 74 6f 20 70 75 6c 6c 20 74 68 65 20 70  ry to pull the p
15ac0 61 67 65 20 66 72 6f 6d 20 74 68 65 20 77 72 69  age from the wri
15ad0 74 65 2d 61 68 65 61 64 20 6c 6f 67 2e 20 2a 2f  te-ahead log. */
15ae0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
15af0 33 4c 6f 67 52 65 61 64 28 70 50 61 67 65 72 2d  3LogRead(pPager-
15b00 3e 70 4c 6f 67 2c 20 70 67 6e 6f 2c 20 26 69 73  >pLog, pgno, &is
15b10 49 6e 4c 6f 67 2c 20 70 50 67 2d 3e 70 44 61 74  InLog, pPg->pDat
15b20 61 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  a);.  }.  if( rc
15b30 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21  ==SQLITE_OK && !
15b40 69 73 49 6e 4c 6f 67 20 29 7b 0a 20 20 20 20 69  isInLog ){.    i
15b50 4f 66 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31  Offset = (pgno-1
15b60 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70  )*(i64)pPager->p
15b70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 72 63 20  ageSize;.    rc 
15b80 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
15b90 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 67 2d  pPager->fd, pPg-
15ba0 3e 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e  >pData, pPager->
15bb0 70 61 67 65 53 69 7a 65 2c 20 69 4f 66 66 73 65  pageSize, iOffse
15bc0 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  t);.    if( rc==
15bd0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
15be0 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20  RT_READ ){.     
15bf0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
15c00 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
15c10 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20  ( pgno==1 ){.   
15c20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
15c30 20 2f 2a 20 49 66 20 74 68 65 20 72 65 61 64 20   /* If the read 
15c40 69 73 20 75 6e 73 75 63 63 65 73 73 66 75 6c 2c  is unsuccessful,
15c50 20 73 65 74 20 74 68 65 20 64 62 46 69 6c 65 56   set the dbFileV
15c60 65 72 73 5b 5d 20 74 6f 20 73 6f 6d 65 74 68 69  ers[] to somethi
15c70 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74  ng.      ** that
15c80 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 61   will never be a
15c90 20 76 61 6c 69 64 20 66 69 6c 65 20 76 65 72 73   valid file vers
15ca0 69 6f 6e 2e 20 20 64 62 46 69 6c 65 56 65 72 73  ion.  dbFileVers
15cb0 5b 5d 20 69 73 20 61 20 63 6f 70 79 0a 20 20 20  [] is a copy.   
15cc0 20 20 20 2a 2a 20 6f 66 20 62 79 74 65 73 20 32     ** of bytes 2
15cd0 34 2e 2e 33 39 20 6f 66 20 74 68 65 20 64 61 74  4..39 of the dat
15ce0 61 62 61 73 65 2e 20 20 42 79 74 65 73 20 32 38  abase.  Bytes 28
15cf0 2e 2e 33 31 20 73 68 6f 75 6c 64 20 61 6c 77 61  ..31 should alwa
15d00 79 73 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 7a  ys be.      ** z
15d10 65 72 6f 2e 20 20 42 79 74 65 73 20 33 32 2e 2e  ero.  Bytes 32..
15d20 33 35 20 61 6e 64 20 33 35 2e 2e 33 39 20 73 68  35 and 35..39 sh
15d30 6f 75 6c 64 20 62 65 20 70 61 67 65 20 6e 75 6d  ould be page num
15d40 62 65 72 73 20 77 68 69 63 68 20 61 72 65 0a 20  bers which are. 
15d50 20 20 20 20 20 2a 2a 20 6e 65 76 65 72 20 30 78       ** never 0x
15d60 66 66 66 66 66 66 66 66 2e 20 20 53 6f 20 66 69  ffffffff.  So fi
15d70 6c 6c 69 6e 67 20 70 50 61 67 65 72 2d 3e 64 62  lling pPager->db
15d80 46 69 6c 65 56 65 72 73 5b 5d 20 77 69 74 68 20  FileVers[] with 
15d90 61 6c 6c 20 30 78 66 66 0a 20 20 20 20 20 20 2a  all 0xff.      *
15da0 2a 20 62 79 74 65 73 20 73 68 6f 75 6c 64 20 73  * bytes should s
15db0 75 66 66 69 63 65 2e 0a 20 20 20 20 20 20 2a 2a  uffice..      **
15dc0 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 61 6e  .      ** For an
15dd0 20 65 6e 63 72 79 70 74 65 64 20 64 61 74 61 62   encrypted datab
15de0 61 73 65 2c 20 74 68 65 20 73 69 74 75 61 74 69  ase, the situati
15df0 6f 6e 20 69 73 20 6d 6f 72 65 20 63 6f 6d 70 6c  on is more compl
15e00 65 78 3a 20 20 62 79 74 65 73 0a 20 20 20 20 20  ex:  bytes.     
15e10 20 2a 2a 20 32 34 2e 2e 33 39 20 6f 66 20 74 68   ** 24..39 of th
15e20 65 20 64 61 74 61 62 61 73 65 20 61 72 65 20 77  e database are w
15e30 68 69 74 65 20 6e 6f 69 73 65 2e 20 20 42 75 74  hite noise.  But
15e40 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74 79   the probability
15e50 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 77 68 69   of.      ** whi
15e60 74 65 20 6e 6f 69 73 69 6e 67 20 65 71 75 61 6c  te noising equal
15e70 69 6e 67 20 31 36 20 62 79 74 65 73 20 6f 66 20  ing 16 bytes of 
15e80 30 78 66 66 20 69 73 20 76 61 6e 69 73 68 69 6e  0xff is vanishin
15e90 67 6c 79 20 73 6d 61 6c 6c 20 73 6f 0a 20 20 20  gly small so.   
15ea0 20 20 20 2a 2a 20 77 65 20 73 68 6f 75 6c 64 20     ** we should 
15eb0 73 74 69 6c 6c 20 62 65 20 6f 6b 2e 0a 20 20 20  still be ok..   
15ec0 20 20 20 2a 2f 0a 20 20 20 20 20 20 6d 65 6d 73     */.      mems
15ed0 65 74 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  et(pPager->dbFil
15ee0 65 56 65 72 73 2c 20 30 78 66 66 2c 20 73 69 7a  eVers, 0xff, siz
15ef0 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69  eof(pPager->dbFi
15f00 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d 65  leVers));.    }e
15f10 6c 73 65 7b 0a 20 20 20 20 20 20 75 38 20 2a 64  lse{.      u8 *d
15f20 62 46 69 6c 65 56 65 72 73 20 3d 20 26 28 28 75  bFileVers = &((u
15f30 38 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 5b 32  8*)pPg->pData)[2
15f40 34 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  4];.      memcpy
15f50 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  (&pPager->dbFile
15f60 56 65 72 73 2c 20 64 62 46 69 6c 65 56 65 72 73  Vers, dbFileVers
15f70 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  , sizeof(pPager-
15f80 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20  >dbFileVers));. 
15f90 20 20 20 7d 0a 20 20 7d 0a 20 20 43 4f 44 45 43     }.  }.  CODEC
15fa0 31 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70  1(pPager, pPg->p
15fb0 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20 72  Data, pgno, 3, r
15fc0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
15fd0 29 3b 0a 0a 20 20 50 41 47 45 52 5f 49 4e 43 52  );..  PAGER_INCR
15fe0 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72  (sqlite3_pager_r
15ff0 65 61 64 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20  eaddb_count);.  
16000 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65  PAGER_INCR(pPage
16010 72 2d 3e 6e 52 65 61 64 29 3b 0a 20 20 49 4f 54  r->nRead);.  IOT
16020 52 41 43 45 28 28 22 50 47 49 4e 20 25 70 20 25  RACE(("PGIN %p %
16030 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67  d\n", pPager, pg
16040 6e 6f 29 29 3b 0a 20 20 50 41 47 45 52 54 52 41  no));.  PAGERTRA
16050 43 45 28 28 22 46 45 54 43 48 20 25 64 20 70 61  CE(("FETCH %d pa
16060 67 65 20 25 64 20 68 61 73 68 28 25 30 38 78 29  ge %d hash(%08x)
16070 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
16080 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67      PAGERID(pPag
16090 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72  er), pgno, pager
160a0 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 29 29  _pagehash(pPg)))
160b0 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  ;..  return rc;.
160c0 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  }..static int pa
160d0 67 65 72 52 6f 6c 6c 62 61 63 6b 4c 6f 67 28 50  gerRollbackLog(P
160e0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
160f0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
16100 5f 4f 4b 3b 0a 20 20 50 67 48 64 72 20 2a 70 4c  _OK;.  PgHdr *pL
16110 69 73 74 20 3d 20 73 71 6c 69 74 65 33 50 63 61  ist = sqlite3Pca
16120 63 68 65 44 69 72 74 79 4c 69 73 74 28 70 50 61  cheDirtyList(pPa
16130 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
16140 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
16150 3d 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  = pPager->dbOrig
16160 53 69 7a 65 3b 0a 20 20 77 68 69 6c 65 28 20 70  Size;.  while( p
16170 4c 69 73 74 20 26 26 20 72 63 3d 3d 53 51 4c 49  List && rc==SQLI
16180 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 67 48  TE_OK ){.    PgH
16190 64 72 20 2a 70 4e 65 78 74 20 3d 20 70 4c 69 73  dr *pNext = pLis
161a0 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 69  t->pDirty;.    i
161b0 66 28 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  f( sqlite3Pcache
161c0 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 4c 69  PageRefcount(pLi
161d0 73 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  st)==0 ){.      
161e0 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b  sqlite3PagerLook
161f0 75 70 28 70 50 61 67 65 72 2c 20 70 4c 69 73 74  up(pPager, pList
16200 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 73  ->pgno);.      s
16210 71 6c 69 74 65 33 50 63 61 63 68 65 44 72 6f 70  qlite3PcacheDrop
16220 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d 65 6c  (pList);.    }el
16230 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72  se{.      rc = r
16240 65 61 64 44 62 50 61 67 65 28 70 4c 69 73 74 29  eadDbPage(pList)
16250 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
16260 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
16270 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65       pPager->xRe
16280 69 6e 69 74 65 72 28 70 4c 69 73 74 29 3b 0a 20  initer(pList);. 
16290 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
162a0 20 70 4c 69 73 74 20 3d 20 70 4e 65 78 74 3b 0a   pList = pNext;.
162b0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
162c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61  .}../*.** Playba
162d0 63 6b 20 73 61 76 65 70 6f 69 6e 74 20 70 53 61  ck savepoint pSa
162e0 76 65 70 6f 69 6e 74 2e 20 4f 72 2c 20 69 66 20  vepoint. Or, if 
162f0 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c  pSavepoint==NULL
16300 2c 20 74 68 65 6e 20 70 6c 61 79 62 61 63 6b 0a  , then playback.
16310 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61  ** the entire ma
16320 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
16330 65 2e 20 54 68 65 20 63 61 73 65 20 70 53 61 76  e. The case pSav
16340 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 20 6f 63 63  epoint==NULL occ
16350 75 72 73 20 77 68 65 6e 20 0a 2a 2a 20 61 20 52  urs when .** a R
16360 4f 4c 4c 42 41 43 4b 20 54 4f 20 63 6f 6d 6d 61  OLLBACK TO comma
16370 6e 64 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e  nd is invoked on
16380 20 61 20 53 41 56 45 50 4f 49 4e 54 20 74 68 61   a SAVEPOINT tha
16390 74 20 69 73 20 61 20 74 72 61 6e 73 61 63 74 69  t is a transacti
163a0 6f 6e 20 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74  on .** savepoint
163b0 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 53 61  ..**.** When pSa
163c0 76 65 70 6f 69 6e 74 20 69 73 20 6e 6f 74 20 4e  vepoint is not N
163d0 55 4c 4c 20 28 6d 65 61 6e 69 6e 67 20 61 20 6e  ULL (meaning a n
163e0 6f 6e 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  on-transaction s
163f0 61 76 65 70 6f 69 6e 74 20 69 73 20 0a 2a 2a 20  avepoint is .** 
16400 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63  being rolled bac
16410 6b 29 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 6c  k), then the rol
16420 6c 62 61 63 6b 20 63 6f 6e 73 69 73 74 73 20 6f  lback consists o
16430 66 20 75 70 20 74 6f 20 74 68 72 65 65 20 73 74  f up to three st
16440 61 67 65 73 2c 0a 2a 2a 20 70 65 72 66 6f 72 6d  ages,.** perform
16450 65 64 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20  ed in the order 
16460 73 70 65 63 69 66 69 65 64 3a 0a 2a 2a 0a 2a 2a  specified:.**.**
16470 20 20 20 2a 20 50 61 67 65 73 20 61 72 65 20 70     * Pages are p
16480 6c 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20  layed back from 
16490 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
164a0 20 73 74 61 72 74 69 6e 67 20 61 74 20 62 79 74   starting at byt
164b0 65 0a 2a 2a 20 20 20 20 20 6f 66 66 73 65 74 20  e.**     offset 
164c0 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
164d0 4f 66 66 73 65 74 20 61 6e 64 20 63 6f 6e 74 69  Offset and conti
164e0 6e 75 69 6e 67 20 74 6f 20 0a 2a 2a 20 20 20 20  nuing to .**    
164f0 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
16500 69 48 64 72 4f 66 66 73 65 74 2c 20 6f 72 20 74  iHdrOffset, or t
16510 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
16520 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a   main journal.**
16530 20 20 20 20 20 66 69 6c 65 20 69 66 20 50 61 67       file if Pag
16540 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72  erSavepoint.iHdr
16550 4f 66 66 73 65 74 20 69 73 20 7a 65 72 6f 2e 0a  Offset is zero..
16560 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 50 61 67  **.**   * If Pag
16570 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72  erSavepoint.iHdr
16580 4f 66 66 73 65 74 20 69 73 20 6e 6f 74 20 7a 65  Offset is not ze
16590 72 6f 2c 20 74 68 65 6e 20 70 61 67 65 73 20 61  ro, then pages a
165a0 72 65 20 70 6c 61 79 65 64 0a 2a 2a 20 20 20 20  re played.**    
165b0 20 62 61 63 6b 20 73 74 61 72 74 69 6e 67 20 66   back starting f
165c0 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
165d0 68 65 61 64 65 72 20 69 6d 6d 65 64 69 61 74 65  header immediate
165e0 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a  ly following .**
165f0 20 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f       PagerSavepo
16600 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 74  int.iHdrOffset t
16610 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
16620 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   main journal fi
16630 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61  le..**.**   * Pa
16640 67 65 73 20 61 72 65 20 74 68 65 6e 20 70 6c 61  ges are then pla
16650 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68  yed back from th
16660 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69  e sub-journal fi
16670 6c 65 2c 20 73 74 61 72 74 69 6e 67 0a 2a 2a 20  le, starting.** 
16680 20 20 20 20 77 69 74 68 20 74 68 65 20 50 61 67      with the Pag
16690 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 53 75 62  erSavepoint.iSub
166a0 52 65 63 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69  Rec and continui
166b0 6e 67 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  ng to the end of
166c0 0a 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f 75 72  .**     the jour
166d0 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  nal file..**.** 
166e0 54 68 72 6f 75 67 68 6f 75 74 20 74 68 65 20 72  Throughout the r
166f0 6f 6c 6c 62 61 63 6b 20 70 72 6f 63 65 73 73 2c  ollback process,
16700 20 65 61 63 68 20 74 69 6d 65 20 61 20 70 61 67   each time a pag
16710 65 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  e is rolled back
16720 2c 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70  , the.** corresp
16730 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 73 65  onding bit is se
16740 74 20 69 6e 20 61 20 62 69 74 76 65 63 20 73 74  t in a bitvec st
16750 72 75 63 74 75 72 65 20 28 76 61 72 69 61 62 6c  ructure (variabl
16760 65 20 70 44 6f 6e 65 20 69 6e 20 74 68 65 0a 2a  e pDone in the.*
16770 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * implementation
16780 20 62 65 6c 6f 77 29 2e 20 54 68 69 73 20 69 73   below). This is
16790 20 75 73 65 64 20 74 6f 20 65 6e 73 75 72 65 20   used to ensure 
167a0 74 68 61 74 20 61 20 70 61 67 65 20 69 73 20 6f  that a page is o
167b0 6e 6c 79 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61  nly.** rolled ba
167c0 63 6b 20 74 68 65 20 66 69 72 73 74 20 74 69 6d  ck the first tim
167d0 65 20 69 74 20 69 73 20 65 6e 63 6f 75 6e 74 65  e it is encounte
167e0 72 65 64 20 69 6e 20 65 69 74 68 65 72 20 6a 6f  red in either jo
167f0 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urnal..**.** If 
16800 70 53 61 76 65 70 6f 69 6e 74 20 69 73 20 4e 55  pSavepoint is NU
16810 4c 4c 2c 20 74 68 65 6e 20 70 61 67 65 73 20 61  LL, then pages a
16820 72 65 20 6f 6e 6c 79 20 70 6c 61 79 65 64 20 62  re only played b
16830 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69  ack from the mai
16840 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  n.** journal fil
16850 65 2e 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e  e. There is no n
16860 65 65 64 20 66 6f 72 20 61 20 62 69 74 76 65 63  eed for a bitvec
16870 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
16880 2a 0a 2a 2a 20 49 6e 20 65 69 74 68 65 72 20 63  *.** In either c
16890 61 73 65 2c 20 62 65 66 6f 72 65 20 70 6c 61 79  ase, before play
168a0 62 61 63 6b 20 63 6f 6d 6d 65 6e 63 65 73 20 74  back commences t
168b0 68 65 20 50 61 67 65 72 2e 64 62 53 69 7a 65 20  he Pager.dbSize 
168c0 76 61 72 69 61 62 6c 65 0a 2a 2a 20 69 73 20 72  variable.** is r
168d0 65 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75  eset to the valu
168e0 65 20 74 68 61 74 20 69 74 20 68 65 6c 64 20 61  e that it held a
168f0 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
16900 68 65 20 73 61 76 65 70 6f 69 6e 74 20 0a 2a 2a  he savepoint .**
16910 20 28 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e   (or transaction
16920 29 2e 20 4e 6f 20 70 61 67 65 20 77 69 74 68 20  ). No page with 
16930 61 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 67 72  a page-number gr
16940 65 61 74 65 72 20 74 68 61 6e 20 74 68 69 73 20  eater than this 
16950 76 61 6c 75 65 0a 2a 2a 20 69 73 20 70 6c 61 79  value.** is play
16960 65 64 20 62 61 63 6b 2e 20 49 66 20 6f 6e 65 20  ed back. If one 
16970 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69  is encountered i
16980 74 20 69 73 20 73 69 6d 70 6c 79 20 73 6b 69 70  t is simply skip
16990 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ped..*/.static i
169a0 6e 74 20 70 61 67 65 72 50 6c 61 79 62 61 63 6b  nt pagerPlayback
169b0 53 61 76 65 70 6f 69 6e 74 28 50 61 67 65 72 20  Savepoint(Pager 
169c0 2a 70 50 61 67 65 72 2c 20 50 61 67 65 72 53 61  *pPager, PagerSa
169d0 76 65 70 6f 69 6e 74 20 2a 70 53 61 76 65 70 6f  vepoint *pSavepo
169e0 69 6e 74 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b  int){.  i64 szJ;
169f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a00 20 2f 2a 20 45 66 66 65 63 74 69 76 65 20 73 69   /* Effective si
16a10 7a 65 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a  ze of the main j
16a20 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20  ournal */.  i64 
16a30 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20  iHdrOff;        
16a40 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 66       /* End of f
16a50 69 72 73 74 20 73 65 67 6d 65 6e 74 20 6f 66 20  irst segment of 
16a60 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 20 72 65 63  main-journal rec
16a70 6f 72 64 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ords */.  int rc
16a80 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
16a90 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
16aa0 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70  e */.  Bitvec *p
16ab0 44 6f 6e 65 20 3d 20 30 3b 20 20 20 20 20 20 20  Done = 0;       
16ac0 2f 2a 20 42 69 74 76 65 63 20 74 6f 20 65 6e 73  /* Bitvec to ens
16ad0 75 72 65 20 70 61 67 65 73 20 70 6c 61 79 65 64  ure pages played
16ae0 20 62 61 63 6b 20 6f 6e 6c 79 20 6f 6e 63 65 20   back only once 
16af0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
16b00 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
16b10 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 0a 20 20  ER_SHARED );..  
16b20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 62 69  /* Allocate a bi
16b30 74 76 65 63 20 74 6f 20 75 73 65 20 74 6f 20 73  tvec to use to s
16b40 74 6f 72 65 20 74 68 65 20 73 65 74 20 6f 66 20  tore the set of 
16b50 70 61 67 65 73 20 72 6f 6c 6c 65 64 20 62 61 63  pages rolled bac
16b60 6b 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65  k */.  if( pSave
16b70 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 70 44 6f  point ){.    pDo
16b80 6e 65 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  ne = sqlite3Bitv
16b90 65 63 43 72 65 61 74 65 28 70 53 61 76 65 70 6f  ecCreate(pSavepo
16ba0 69 6e 74 2d 3e 6e 4f 72 69 67 29 3b 0a 20 20 20  int->nOrig);.   
16bb0 20 69 66 28 20 21 70 44 6f 6e 65 20 29 7b 0a 20   if( !pDone ){. 
16bc0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
16bd0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
16be0 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68    }..  /* Set th
16bf0 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
16c00 62 61 63 6b 20 74 6f 20 74 68 65 20 76 61 6c 75  back to the valu
16c10 65 20 69 74 20 77 61 73 20 62 65 66 6f 72 65 20  e it was before 
16c20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 0a 20  the savepoint . 
16c30 20 2a 2a 20 62 65 69 6e 67 20 72 65 76 65 72 74   ** being revert
16c40 65 64 20 77 61 73 20 6f 70 65 6e 65 64 2e 0a 20  ed was opened.. 
16c50 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62   */.  pPager->db
16c60 53 69 7a 65 20 3d 20 70 53 61 76 65 70 6f 69 6e  Size = pSavepoin
16c70 74 20 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e  t ? pSavepoint->
16c80 6e 4f 72 69 67 20 3a 20 70 50 61 67 65 72 2d 3e  nOrig : pPager->
16c90 64 62 4f 72 69 67 53 69 7a 65 3b 0a 0a 20 20 69  dbOrigSize;..  i
16ca0 66 28 20 21 70 53 61 76 65 70 6f 69 6e 74 20 26  f( !pSavepoint &
16cb0 26 20 70 61 67 65 72 55 73 65 4c 6f 67 28 70 50  & pagerUseLog(pP
16cc0 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65 74  ager) ){.    ret
16cd0 75 72 6e 20 70 61 67 65 72 52 6f 6c 6c 62 61 63  urn pagerRollbac
16ce0 6b 4c 6f 67 28 70 50 61 67 65 72 29 3b 0a 20 20  kLog(pPager);.  
16cf0 7d 0a 0a 20 20 2f 2a 20 55 73 65 20 70 50 61 67  }..  /* Use pPag
16d00 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 61  er->journalOff a
16d10 73 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20  s the effective 
16d20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d 61 69 6e  size of the main
16d30 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a   rollback.  ** j
16d40 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20 61 63 74  ournal.  The act
16d50 75 61 6c 20 66 69 6c 65 20 6d 69 67 68 74 20 62  ual file might b
16d60 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  e larger than th
16d70 69 73 20 69 6e 0a 20 20 2a 2a 20 50 41 47 45 52  is in.  ** PAGER
16d80 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55  _JOURNALMODE_TRU
16d90 4e 43 41 54 45 20 6f 72 20 50 41 47 45 52 5f 4a  NCATE or PAGER_J
16da0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49  OURNALMODE_PERSI
16db0 53 54 2e 20 20 42 75 74 20 61 6e 79 74 68 69 6e  ST.  But anythin
16dc0 67 0a 20 20 2a 2a 20 70 61 73 74 20 70 50 61 67  g.  ** past pPag
16dd0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 69  er->journalOff i
16de0 73 20 6f 66 66 2d 6c 69 6d 69 74 73 20 74 6f 20  s off-limits to 
16df0 75 73 2e 0a 20 20 2a 2f 0a 20 20 73 7a 4a 20 3d  us..  */.  szJ =
16e00 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
16e10 4f 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Off;.  assert( p
16e20 61 67 65 72 55 73 65 4c 6f 67 28 70 50 61 67 65  agerUseLog(pPage
16e30 72 29 3d 3d 30 20 7c 7c 20 73 7a 4a 3d 3d 30 20  r)==0 || szJ==0 
16e40 29 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 62  );..  /* Begin b
16e50 79 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 72  y rolling back r
16e60 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20  ecords from the 
16e70 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61  main journal sta
16e80 72 74 69 6e 67 20 61 74 0a 20 20 2a 2a 20 50 61  rting at.  ** Pa
16e90 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f 66  gerSavepoint.iOf
16ea0 66 73 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75  fset and continu
16eb0 69 6e 67 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ing to the next 
16ec0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a  journal header..
16ed0 20 20 2a 2a 20 54 68 65 72 65 20 6d 69 67 68 74    ** There might
16ee0 20 62 65 20 72 65 63 6f 72 64 73 20 69 6e 20 74   be records in t
16ef0 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
16f00 74 68 61 74 20 68 61 76 65 20 61 20 70 61 67 65  that have a page
16f10 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 67 72 65   number.  ** gre
16f20 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 63 75  ater than the cu
16f30 72 72 65 6e 74 20 64 61 74 61 62 61 73 65 20 73  rrent database s
16f40 69 7a 65 20 28 70 50 61 67 65 72 2d 3e 64 62 53  ize (pPager->dbS
16f50 69 7a 65 29 20 62 75 74 20 74 68 6f 73 65 0a 20  ize) but those. 
16f60 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b 69 70   ** will be skip
16f70 70 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ped automaticall
16f80 79 2e 20 20 50 61 67 65 73 20 61 72 65 20 61 64  y.  Pages are ad
16f90 64 65 64 20 74 6f 20 70 44 6f 6e 65 20 61 73 20  ded to pDone as 
16fa0 74 68 65 79 0a 20 20 2a 2a 20 61 72 65 20 70 6c  they.  ** are pl
16fb0 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2f 0a  ayed back..  */.
16fc0 20 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e 74    if( pSavepoint
16fd0 20 26 26 20 21 70 61 67 65 72 55 73 65 4c 6f 67   && !pagerUseLog
16fe0 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
16ff0 69 48 64 72 4f 66 66 20 3d 20 70 53 61 76 65 70  iHdrOff = pSavep
17000 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65 74  oint->iHdrOffset
17010 20 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69   ? pSavepoint->i
17020 48 64 72 4f 66 66 73 65 74 20 3a 20 73 7a 4a 3b  HdrOffset : szJ;
17030 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
17040 72 6e 61 6c 4f 66 66 20 3d 20 70 53 61 76 65 70  rnalOff = pSavep
17050 6f 69 6e 74 2d 3e 69 4f 66 66 73 65 74 3b 0a 20  oint->iOffset;. 
17060 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51     while( rc==SQ
17070 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65  LITE_OK && pPage
17080 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 69 48  r->journalOff<iH
17090 64 72 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 72  drOff ){.      r
170a0 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
170b0 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67  ck_one_page(pPag
170c0 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75  er, &pPager->jou
170d0 72 6e 61 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c 20  rnalOff, pDone, 
170e0 31 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  1, 1);.    }.   
170f0 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
17100 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 65  ITE_DONE );.  }e
17110 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  lse{.    pPager-
17120 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
17130 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 74 69  .  }..  /* Conti
17140 6e 75 65 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  nue rolling back
17150 20 72 65 63 6f 72 64 73 20 6f 75 74 20 6f 66 20   records out of 
17160 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
17170 20 73 74 61 72 74 69 6e 67 20 61 74 0a 20 20 2a   starting at.  *
17180 2a 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72  * the first jour
17190 6e 61 6c 20 68 65 61 64 65 72 20 73 65 65 6e 20  nal header seen 
171a0 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 75  and continuing u
171b0 6e 74 69 6c 20 74 68 65 20 65 66 66 65 63 74 69  ntil the effecti
171c0 76 65 20 65 6e 64 0a 20 20 2a 2a 20 6f 66 20 74  ve end.  ** of t
171d0 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
171e0 66 69 6c 65 2e 20 20 43 6f 6e 74 69 6e 75 65 20  file.  Continue 
171f0 74 6f 20 73 6b 69 70 20 6f 75 74 2d 6f 66 2d 72  to skip out-of-r
17200 61 6e 67 65 20 70 61 67 65 73 20 61 6e 64 0a 20  ange pages and. 
17210 20 2a 2a 20 63 6f 6e 74 69 6e 75 65 20 61 64 64   ** continue add
17220 69 6e 67 20 70 61 67 65 73 20 72 6f 6c 6c 65 64  ing pages rolled
17230 20 62 61 63 6b 20 74 6f 20 70 44 6f 6e 65 2e 0a   back to pDone..
17240 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 72 63    */.  while( rc
17250 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
17260 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
17270 66 3c 73 7a 4a 20 29 7b 0a 20 20 20 20 75 33 32  f<szJ ){.    u32
17280 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20   ii;            
17290 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
172a0 2a 2f 0a 20 20 20 20 75 33 32 20 6e 4a 52 65 63  */.    u32 nJRec
172b0 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75 6d   = 0;     /* Num
172c0 62 65 72 20 6f 66 20 4a 6f 75 72 6e 61 6c 20 52  ber of Journal R
172d0 65 63 6f 72 64 73 20 2a 2f 0a 20 20 20 20 75 33  ecords */.    u3
172e0 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20 72 63 20  2 dummy;.    rc 
172f0 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72  = readJournalHdr
17300 28 70 50 61 67 65 72 2c 20 30 2c 20 73 7a 4a 2c  (pPager, 0, szJ,
17310 20 26 6e 4a 52 65 63 2c 20 26 64 75 6d 6d 79 29   &nJRec, &dummy)
17320 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  ;.    assert( rc
17330 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b  !=SQLITE_DONE );
17340 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
17350 54 68 65 20 22 70 50 61 67 65 72 2d 3e 6a 6f 75  The "pPager->jou
17360 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f  rnalHdr+JOURNAL_
17370 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d  HDR_SZ(pPager)==
17380 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
17390 66 66 22 0a 20 20 20 20 2a 2a 20 74 65 73 74 20  ff".    ** test 
173a0 69 73 20 72 65 6c 61 74 65 64 20 74 6f 20 74 69  is related to ti
173b0 63 6b 65 74 20 23 32 35 36 35 2e 20 20 53 65 65  cket #2565.  See
173c0 20 74 68 65 20 64 69 73 63 75 73 73 69 6f 6e 20   the discussion 
173d0 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 61  in the.    ** pa
173e0 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 66  ger_playback() f
173f0 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61 64 64 69  unction for addi
17400 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
17410 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  on..    */.    i
17420 66 28 20 6e 4a 52 65 63 3d 3d 30 20 0a 20 20 20  f( nJRec==0 .   
17430 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75    && pPager->jou
17440 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f  rnalHdr+JOURNAL_
17450 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d  HDR_SZ(pPager)==
17460 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
17470 66 66 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  ff.    ){.      
17480 6e 4a 52 65 63 20 3d 20 28 75 33 32 29 28 28 73  nJRec = (u32)((s
17490 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  zJ - pPager->jou
174a0 72 6e 61 6c 4f 66 66 29 2f 4a 4f 55 52 4e 41 4c  rnalOff)/JOURNAL
174b0 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b  _PG_SZ(pPager));
174c0 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
174d0 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
174e0 4f 4b 20 26 26 20 69 69 3c 6e 4a 52 65 63 20 26  OK && ii<nJRec &
174f0 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
17500 6c 4f 66 66 3c 73 7a 4a 3b 20 69 69 2b 2b 29 7b  lOff<szJ; ii++){
17510 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
17520 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
17530 61 67 65 28 70 50 61 67 65 72 2c 20 26 70 50 61  age(pPager, &pPa
17540 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ger->journalOff,
17550 20 70 44 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a 20   pDone, 1, 1);. 
17560 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
17570 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc!=SQLITE_DONE
17580 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   );.  }.  assert
17590 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
175a0 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  || pPager->journ
175b0 61 6c 4f 66 66 3d 3d 73 7a 4a 20 29 3b 0a 0a 20  alOff==szJ );.. 
175c0 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 20 72 6f   /* Finally,  ro
175d0 6c 6c 62 61 63 6b 20 70 61 67 65 73 20 66 72 6f  llback pages fro
175e0 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  m the sub-journa
175f0 6c 2e 20 20 50 61 67 65 20 74 68 61 74 20 77 65  l.  Page that we
17600 72 65 0a 20 20 2a 2a 20 70 72 65 76 69 6f 75 73  re.  ** previous
17610 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 6f  ly rolled back o
17620 75 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a  ut of the main j
17630 6f 75 72 6e 61 6c 20 28 61 6e 64 20 61 72 65 20  ournal (and are 
17640 68 65 6e 63 65 20 69 6e 20 70 44 6f 6e 65 29 0a  hence in pDone).
17650 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b 69    ** will be ski
17660 70 70 65 64 2e 20 20 4f 75 74 2d 6f 66 2d 72 61  pped.  Out-of-ra
17670 6e 67 65 20 70 61 67 65 73 20 61 72 65 20 61 6c  nge pages are al
17680 73 6f 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f  so skipped..  */
17690 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e  .  if( pSavepoin
176a0 74 20 29 7b 0a 20 20 20 20 75 33 32 20 69 69 3b  t ){.    u32 ii;
176b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
176c0 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
176d0 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20     i64 offset = 
176e0 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62  pSavepoint->iSub
176f0 52 65 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70  Rec*(4+pPager->p
17700 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 66 6f  ageSize);.    fo
17710 72 28 69 69 3d 70 53 61 76 65 70 6f 69 6e 74 2d  r(ii=pSavepoint-
17720 3e 69 53 75 62 52 65 63 3b 20 72 63 3d 3d 53 51  >iSubRec; rc==SQ
17730 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c 70 50  LITE_OK && ii<pP
17740 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 3b 20 69  ager->nSubRec; i
17750 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65  i++){.      asse
17760 72 74 28 20 6f 66 66 73 65 74 3d 3d 69 69 2a 28  rt( offset==ii*(
17770 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  4+pPager->pageSi
17780 7a 65 29 20 29 3b 0a 20 20 20 20 20 20 72 63 20  ze) );.      rc 
17790 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
177a0 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72  _one_page(pPager
177b0 2c 20 26 6f 66 66 73 65 74 2c 20 70 44 6f 6e 65  , &offset, pDone
177c0 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20  , 0, 1);.    }. 
177d0 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
177e0 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20  QLITE_DONE );.  
177f0 7d 0a 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76  }..  sqlite3Bitv
17800 65 63 44 65 73 74 72 6f 79 28 70 44 6f 6e 65 29  ecDestroy(pDone)
17810 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
17820 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61  TE_OK ){.    pPa
17830 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
17840 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 20 20 72 65 74  = szJ;.  }.  ret
17850 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
17860 20 43 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69   Change the maxi
17870 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e  mum number of in
17880 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 74 68  -memory pages th
17890 61 74 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a  at are allowed..
178a0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
178b0 61 67 65 72 53 65 74 43 61 63 68 65 73 69 7a 65  agerSetCachesize
178c0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
178d0 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 73  int mxPage){.  s
178e0 71 6c 69 74 65 33 50 63 61 63 68 65 53 65 74 43  qlite3PcacheSetC
178f0 61 63 68 65 73 69 7a 65 28 70 50 61 67 65 72 2d  achesize(pPager-
17900 3e 70 50 43 61 63 68 65 2c 20 6d 78 50 61 67 65  >pPCache, mxPage
17910 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75  );.}../*.** Adju
17920 73 74 20 74 68 65 20 72 6f 62 75 73 74 6e 65 73  st the robustnes
17930 73 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  s of the databas
17940 65 20 74 6f 20 64 61 6d 61 67 65 20 64 75 65 20  e to damage due 
17950 74 6f 20 4f 53 20 63 72 61 73 68 65 73 0a 2a 2a  to OS crashes.**
17960 20 6f 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72   or power failur
17970 65 73 20 62 79 20 63 68 61 6e 67 69 6e 67 20 74  es by changing t
17980 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e  he number of syn
17990 63 73 28 29 73 20 77 68 65 6e 20 77 72 69 74 69  cs()s when writi
179a0 6e 67 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61  ng.** the rollba
179b0 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65  ck journal.  The
179c0 72 65 20 61 72 65 20 74 68 72 65 65 20 6c 65 76  re are three lev
179d0 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46  els:.**.**    OF
179e0 46 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  F       sqlite3O
179f0 73 53 79 6e 63 28 29 20 69 73 20 6e 65 76 65 72  sSync() is never
17a00 20 63 61 6c 6c 65 64 2e 20 20 54 68 69 73 20 69   called.  This i
17a10 73 20 74 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a  s the default.**
17a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f                fo
17a30 72 20 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 20  r temporary and 
17a40 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e  transient files.
17a50 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c  .**.**    NORMAL
17a60 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20      The journal 
17a70 69 73 20 73 79 6e 63 65 64 20 6f 6e 63 65 20 62  is synced once b
17a80 65 66 6f 72 65 20 77 72 69 74 65 73 20 62 65 67  efore writes beg
17a90 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20  in on the.**    
17aa0 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61            databa
17ab0 73 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72  se.  This is nor
17ac0 6d 61 6c 6c 79 20 61 64 65 71 75 61 74 65 20 70  mally adequate p
17ad0 72 6f 74 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a  rotection, but.*
17ae0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  *              i
17af0 74 20 69 73 20 74 68 65 6f 72 65 74 69 63 61 6c  t is theoretical
17b00 6c 79 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f  ly possible, tho
17b10 75 67 68 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c  ugh very unlikel
17b20 79 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  y,.**           
17b30 20 20 20 74 68 61 74 20 61 6e 20 69 6e 6f 70 65     that an inope
17b40 72 74 75 6e 65 20 70 6f 77 65 72 20 66 61 69 6c  rtune power fail
17b50 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 76 65 20  ure could leave 
17b60 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20  the journal.**  
17b70 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 20 61              in a
17b80 20 73 74 61 74 65 20 77 68 69 63 68 20 77 6f 75   state which wou
17b90 6c 64 20 63 61 75 73 65 20 64 61 6d 61 67 65 20  ld cause damage 
17ba0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  to the database.
17bb0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
17bc0 77 68 65 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65  when it is rolle
17bd0 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20  d back..**.**   
17be0 20 46 55 4c 4c 20 20 20 20 20 20 54 68 65 20 6a   FULL      The j
17bf0 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
17c00 20 74 77 69 63 65 20 62 65 66 6f 72 65 20 77 72   twice before wr
17c10 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68  ites begin on th
17c20 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
17c30 20 20 64 61 74 61 62 61 73 65 20 28 77 69 74 68    database (with
17c40 20 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c   some additional
17c50 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74   information - t
17c60 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a  he nRec field.**
17c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66                of
17c80 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
17c90 64 65 72 20 2d 20 62 65 69 6e 67 20 77 72 69 74  der - being writ
17ca0 74 65 6e 20 69 6e 20 62 65 74 77 65 65 6e 20 74  ten in between t
17cb0 68 65 20 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20  he two.**       
17cc0 20 20 20 20 20 20 20 73 79 6e 63 73 29 2e 20 20         syncs).  
17cd0 49 66 20 77 65 20 61 73 73 75 6d 65 20 74 68 61  If we assume tha
17ce0 74 20 77 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20  t writing a.**  
17cf0 20 20 20 20 20 20 20 20 20 20 20 20 73 69 6e 67              sing
17d00 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72 20 69  le disk sector i
17d10 73 20 61 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74  s atomic, then t
17d20 68 69 73 20 6d 6f 64 65 20 70 72 6f 76 69 64 65  his mode provide
17d30 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  s.**            
17d40 20 20 61 73 73 75 72 61 6e 63 65 20 74 68 61 74    assurance that
17d50 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c   the journal wil
17d60 6c 20 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74  l not be corrupt
17d70 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20  ed to the.**    
17d80 20 20 20 20 20 20 20 20 20 20 70 6f 69 6e 74 20            point 
17d90 6f 66 20 63 61 75 73 69 6e 67 20 64 61 6d 61 67  of causing damag
17da0 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  e to the databas
17db0 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63  e during rollbac
17dc0 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63  k..**.** Numeric
17dd0 20 76 61 6c 75 65 73 20 61 73 73 6f 63 69 61 74   values associat
17de0 65 64 20 77 69 74 68 20 74 68 65 73 65 20 73 74  ed with these st
17df0 61 74 65 73 20 61 72 65 20 4f 46 46 3d 3d 31 2c  ates are OFF==1,
17e00 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e   NORMAL=2,.** an
17e10 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69 66  d FULL=3..*/.#if
17e20 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
17e30 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 76  _PAGER_PRAGMAS.v
17e40 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
17e50 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28 50  SetSafetyLevel(P
17e60 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
17e70 74 20 6c 65 76 65 6c 2c 20 69 6e 74 20 62 46 75  t level, int bFu
17e80 6c 6c 46 73 79 6e 63 29 7b 0a 20 20 70 50 61 67  llFsync){.  pPag
17e90 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20 28 6c  er->noSync =  (l
17ea0 65 76 65 6c 3d 3d 31 20 7c 7c 20 70 50 61 67 65  evel==1 || pPage
17eb0 72 2d 3e 74 65 6d 70 46 69 6c 65 29 20 3f 31 3a  r->tempFile) ?1:
17ec0 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c  0;.  pPager->ful
17ed0 6c 53 79 6e 63 20 3d 20 28 6c 65 76 65 6c 3d 3d  lSync = (level==
17ee0 33 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65  3 && !pPager->te
17ef0 6d 70 46 69 6c 65 29 20 3f 31 3a 30 3b 0a 20 20  mpFile) ?1:0;.  
17f00 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61  pPager->sync_fla
17f10 67 73 20 3d 20 28 62 46 75 6c 6c 46 73 79 6e 63  gs = (bFullFsync
17f20 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c  ?SQLITE_SYNC_FUL
17f30 4c 3a 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f  L:SQLITE_SYNC_NO
17f40 52 4d 41 4c 29 3b 0a 20 20 69 66 28 20 70 50 61  RMAL);.  if( pPa
17f50 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 20 70 50  ger->noSync ) pP
17f60 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
17f70 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a   0;.}.#endif../*
17f80 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
17f90 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c  g global variabl
17fa0 65 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  e is incremented
17fb0 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 6c 69   whenever the li
17fc0 62 72 61 72 79 0a 2a 2a 20 61 74 74 65 6d 70 74  brary.** attempt
17fd0 73 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70  s to open a temp
17fe0 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 54 68 69  orary file.  Thi
17ff0 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  s information is
18000 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73   used for.** tes
18010 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69  ting and analysi
18020 73 20 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 23 69 66  s only.  .*/.#if
18030 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
18040 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  int sqlite3_open
18050 74 65 6d 70 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a  temp_count = 0;.
18060 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70  #endif../*.** Op
18070 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  en a temporary f
18080 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65  ile..**.** Write
18090 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
180a0 70 74 6f 72 20 69 6e 74 6f 20 2a 70 46 69 6c 65  ptor into *pFile
180b0 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  . Return SQLITE_
180c0 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 0a 2a  OK on success .*
180d0 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20  * or some other 
180e0 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65  error code if we
180f0 20 66 61 69 6c 2e 20 54 68 65 20 4f 53 20 77 69   fail. The OS wi
18100 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ll automatically
18110 20 0a 2a 2a 20 64 65 6c 65 74 65 20 74 68 65 20   .** delete the 
18120 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 77  temporary file w
18130 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64  hen it is closed
18140 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67  ..**.** The flag
18150 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20  s passed to the 
18160 56 46 53 20 6c 61 79 65 72 20 78 4f 70 65 6e 28  VFS layer xOpen(
18170 29 20 63 61 6c 6c 20 61 72 65 20 74 68 6f 73 65  ) call are those
18180 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 62 79   specified.** by
18190 20 70 61 72 61 6d 65 74 65 72 20 76 66 73 46 6c   parameter vfsFl
181a0 61 67 73 20 4f 52 65 64 20 77 69 74 68 20 74 68  ags ORed with th
181b0 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
181c0 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50  **     SQLITE_OP
181d0 45 4e 5f 52 45 41 44 57 52 49 54 45 0a 2a 2a 20  EN_READWRITE.** 
181e0 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
181f0 43 52 45 41 54 45 0a 2a 2a 20 20 20 20 20 53 51  CREATE.**     SQ
18200 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53  LITE_OPEN_EXCLUS
18210 49 56 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54  IVE.**     SQLIT
18220 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43  E_OPEN_DELETEONC
18230 4c 4f 53 45 0a 2a 2f 0a 73 74 61 74 69 63 20 69  LOSE.*/.static i
18240 6e 74 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70  nt pagerOpentemp
18250 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
18260 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  r,        /* The
18270 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f   pager object */
18280 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
18290 2a 70 46 69 6c 65 2c 20 20 2f 2a 20 57 72 69 74  *pFile,  /* Writ
182a0 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  e the file descr
182b0 69 70 74 6f 72 20 68 65 72 65 20 2a 2f 0a 20 20  iptor here */.  
182c0 69 6e 74 20 76 66 73 46 6c 61 67 73 20 20 20 20  int vfsFlags    
182d0 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70        /* Flags p
182e0 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f  assed through to
182f0 20 74 68 65 20 56 46 53 20 2a 2f 0a 29 7b 0a 20   the VFS */.){. 
18300 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
18310 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
18320 20 63 6f 64 65 20 2a 2f 0a 0a 23 69 66 64 65 66   code */..#ifdef
18330 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73   SQLITE_TEST.  s
18340 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f  qlite3_opentemp_
18350 63 6f 75 6e 74 2b 2b 3b 20 20 2f 2a 20 55 73 65  count++;  /* Use
18360 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e  d for testing an
18370 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 20  d analysis only 
18380 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 76 66 73  */.#endif..  vfs
18390 46 6c 61 67 73 20 7c 3d 20 20 53 51 4c 49 54 45  Flags |=  SQLITE
183a0 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20  _OPEN_READWRITE 
183b0 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  | SQLITE_OPEN_CR
183c0 45 41 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20  EATE |.         
183d0 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45     SQLITE_OPEN_E
183e0 58 43 4c 55 53 49 56 45 20 7c 20 53 51 4c 49 54  XCLUSIVE | SQLIT
183f0 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43  E_OPEN_DELETEONC
18400 4c 4f 53 45 3b 0a 20 20 72 63 20 3d 20 73 71 6c  LOSE;.  rc = sql
18410 69 74 65 33 4f 73 4f 70 65 6e 28 70 50 61 67 65  ite3OsOpen(pPage
18420 72 2d 3e 70 56 66 73 2c 20 30 2c 20 70 46 69 6c  r->pVfs, 0, pFil
18430 65 2c 20 76 66 73 46 6c 61 67 73 2c 20 30 29 3b  e, vfsFlags, 0);
18440 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53  .  assert( rc!=S
18450 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70  QLITE_OK || isOp
18460 65 6e 28 70 46 69 6c 65 29 20 29 3b 0a 20 20 72  en(pFile) );.  r
18470 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
18480 2a 2a 20 53 65 74 20 74 68 65 20 62 75 73 79 20  ** Set the busy 
18490 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e  handler function
184a0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65  ..**.** The page
184b0 72 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 62 75  r invokes the bu
184c0 73 79 2d 68 61 6e 64 6c 65 72 20 69 66 20 73 71  sy-handler if sq
184d0 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 20 72 65  lite3OsLock() re
184e0 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45  turns .** SQLITE
184f0 5f 42 55 53 59 20 77 68 65 6e 20 74 72 79 69 6e  _BUSY when tryin
18500 67 20 74 6f 20 75 70 67 72 61 64 65 20 66 72 6f  g to upgrade fro
18510 6d 20 6e 6f 2d 6c 6f 63 6b 20 74 6f 20 61 20 53  m no-lock to a S
18520 48 41 52 45 44 20 6c 6f 63 6b 2c 0a 2a 2a 20 6f  HARED lock,.** o
18530 72 20 77 68 65 6e 20 74 72 79 69 6e 67 20 74 6f  r when trying to
18540 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20 61 20   upgrade from a 
18550 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 74 6f  RESERVED lock to
18560 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 0a 2a   an EXCLUSIVE .*
18570 2a 20 6c 6f 63 6b 2e 20 49 74 20 64 6f 65 73 20  * lock. It does 
18580 2a 6e 6f 74 2a 20 69 6e 76 6f 6b 65 20 74 68 65  *not* invoke the
18590 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 77 68   busy handler wh
185a0 65 6e 20 75 70 67 72 61 64 69 6e 67 20 66 72 6f  en upgrading fro
185b0 6d 0a 2a 2a 20 53 48 41 52 45 44 20 74 6f 20 52  m.** SHARED to R
185c0 45 53 45 52 56 45 44 2c 20 6f 72 20 77 68 65 6e  ESERVED, or when
185d0 20 75 70 67 72 61 64 69 6e 67 20 66 72 6f 6d 20   upgrading from 
185e0 53 48 41 52 45 44 20 74 6f 20 45 58 43 4c 55 53  SHARED to EXCLUS
185f0 49 56 45 0a 2a 2a 20 28 77 68 69 63 68 20 6f 63  IVE.** (which oc
18600 63 75 72 73 20 64 75 72 69 6e 67 20 68 6f 74 2d  curs during hot-
18610 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
18620 29 2e 20 53 75 6d 6d 61 72 79 3a 0a 2a 2a 0a 2a  ). Summary:.**.*
18630 2a 20 20 20 54 72 61 6e 73 69 74 69 6f 6e 20 20  *   Transition  
18640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18650 20 20 20 20 20 20 7c 20 49 6e 76 6f 6b 65 73 20        | Invokes 
18660 78 42 75 73 79 48 61 6e 64 6c 65 72 0a 2a 2a 20  xBusyHandler.** 
18670 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
18680 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18690 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
186a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20  ----------.**   
186b0 4e 4f 5f 4c 4f 43 4b 20 20 20 20 20 20 20 2d 3e  NO_LOCK       ->
186c0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 20   SHARED_LOCK    
186d0 20 20 7c 20 59 65 73 0a 2a 2a 20 20 20 53 48 41    | Yes.**   SHA
186e0 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 52 45  RED_LOCK   -> RE
186f0 53 45 52 56 45 44 5f 4c 4f 43 4b 20 20 20 20 7c  SERVED_LOCK    |
18700 20 4e 6f 0a 2a 2a 20 20 20 53 48 41 52 45 44 5f   No.**   SHARED_
18710 4c 4f 43 4b 20 20 20 2d 3e 20 45 58 43 4c 55 53  LOCK   -> EXCLUS
18720 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20 4e 6f 0a  IVE_LOCK   | No.
18730 2a 2a 20 20 20 52 45 53 45 52 56 45 44 5f 4c 4f  **   RESERVED_LO
18740 43 4b 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 5f  CK -> EXCLUSIVE_
18750 4c 4f 43 4b 20 20 20 7c 20 59 65 73 0a 2a 2a 0a  LOCK   | Yes.**.
18760 2a 2a 20 49 66 20 74 68 65 20 62 75 73 79 2d 68  ** If the busy-h
18770 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20  andler callback 
18780 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f  returns non-zero
18790 2c 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 0a 2a  , the lock is .*
187a0 2a 20 72 65 74 72 69 65 64 2e 20 49 66 20 69 74  * retried. If it
187b0 20 72 65 74 75 72 6e 73 20 7a 65 72 6f 2c 20 74   returns zero, t
187c0 68 65 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 42  hen the SQLITE_B
187d0 55 53 59 20 65 72 72 6f 72 20 69 73 0a 2a 2a 20  USY error is.** 
187e0 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20  returned to the 
187f0 63 61 6c 6c 65 72 20 6f 66 20 74 68 65 20 70 61  caller of the pa
18800 67 65 72 20 41 50 49 20 66 75 6e 63 74 69 6f 6e  ger API function
18810 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
18820 33 50 61 67 65 72 53 65 74 42 75 73 79 68 61 6e  3PagerSetBusyhan
18830 64 6c 65 72 28 0a 20 20 50 61 67 65 72 20 2a 70  dler(.  Pager *p
18840 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20  Pager,          
18850 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18860 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  Pager object */.
18870 20 20 69 6e 74 20 28 2a 78 42 75 73 79 48 61 6e    int (*xBusyHan
18880 64 6c 65 72 29 28 76 6f 69 64 20 2a 29 2c 20 20  dler)(void *),  
18890 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
188a0 72 20 74 6f 20 62 75 73 79 2d 68 61 6e 64 6c 65  r to busy-handle
188b0 72 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  r function */.  
188c0 76 6f 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c  void *pBusyHandl
188d0 65 72 41 72 67 20 20 20 20 20 20 20 20 20 20 20  erArg           
188e0 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74       /* Argument
188f0 20 74 6f 20 70 61 73 73 20 74 6f 20 78 42 75 73   to pass to xBus
18900 79 48 61 6e 64 6c 65 72 20 2a 2f 0a 29 7b 20 20  yHandler */.){  
18910 0a 20 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79  .  pPager->xBusy
18920 48 61 6e 64 6c 65 72 20 3d 20 78 42 75 73 79 48  Handler = xBusyH
18930 61 6e 64 6c 65 72 3b 0a 20 20 70 50 61 67 65 72  andler;.  pPager
18940 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72  ->pBusyHandlerAr
18950 67 20 3d 20 70 42 75 73 79 48 61 6e 64 6c 65 72  g = pBusyHandler
18960 41 72 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  Arg;.}../*.** Re
18970 70 6f 72 74 20 74 68 65 20 63 75 72 72 65 6e 74  port the current
18980 20 70 61 67 65 20 73 69 7a 65 20 61 6e 64 20 6e   page size and n
18990 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76 65  umber of reserve
189a0 64 20 62 79 74 65 73 20 62 61 63 6b 0a 2a 2a 20  d bytes back.** 
189b0 74 6f 20 74 68 65 20 63 6f 64 65 63 2e 0a 2a 2f  to the codec..*/
189c0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
189d0 41 53 5f 43 4f 44 45 43 0a 73 74 61 74 69 63 20  AS_CODEC.static 
189e0 76 6f 69 64 20 70 61 67 65 72 52 65 70 6f 72 74  void pagerReport
189f0 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67  Size(Pager *pPag
18a00 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65  er){.  if( pPage
18a10 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65 43 68 6e  r->xCodecSizeChn
18a20 67 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  g ){.    pPager-
18a30 3e 78 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 28  >xCodecSizeChng(
18a40 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 2c 20  pPager->pCodec, 
18a50 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
18a60 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
18a70 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69 6e               (in
18a80 74 29 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72  t)pPager->nReser
18a90 76 65 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65  ve);.  }.}.#else
18aa0 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72 52  .# define pagerR
18ab0 65 70 6f 72 74 53 69 7a 65 28 58 29 20 20 20 20  eportSize(X)    
18ac0 20 2f 2a 20 4e 6f 2d 6f 70 20 69 66 20 77 65 20   /* No-op if we 
18ad0 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 61  do not support a
18ae0 20 63 6f 64 65 63 20 2a 2f 0a 23 65 6e 64 69 66   codec */.#endif
18af0 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
18b00 68 65 20 70 61 67 65 20 73 69 7a 65 20 75 73 65  he page size use
18b10 64 20 62 79 20 74 68 65 20 50 61 67 65 72 20 6f  d by the Pager o
18b20 62 6a 65 63 74 2e 20 54 68 65 20 6e 65 77 20 70  bject. The new p
18b30 61 67 65 20 73 69 7a 65 20 0a 2a 2a 20 69 73 20  age size .** is 
18b40 70 61 73 73 65 64 20 69 6e 20 2a 70 50 61 67 65  passed in *pPage
18b50 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  Size..**.** If t
18b60 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 74  he pager is in t
18b70 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 77  he error state w
18b80 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
18b90 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 0a  n is called, it.
18ba0 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 54  ** is a no-op. T
18bb0 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
18bc0 64 20 69 73 20 74 68 65 20 65 72 72 6f 72 20 73  d is the error s
18bd0 74 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  tate error code 
18be0 28 69 2e 65 2e 20 0a 2a 2a 20 6f 6e 65 20 6f 66  (i.e. .** one of
18bf0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53   SQLITE_IOERR, S
18c00 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 6f 72  QLITE_CORRUPT or
18c10 20 53 51 4c 49 54 45 5f 46 55 4c 4c 29 2e 0a 2a   SQLITE_FULL)..*
18c20 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
18c30 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f  if all of the fo
18c40 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65  llowing are true
18c50 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 20  :.**.**   * the 
18c60 6e 65 77 20 70 61 67 65 20 73 69 7a 65 20 28 76  new page size (v
18c70 61 6c 75 65 20 6f 66 20 2a 70 50 61 67 65 53 69  alue of *pPageSi
18c80 7a 65 29 20 69 73 20 76 61 6c 69 64 20 28 61 20  ze) is valid (a 
18c90 70 6f 77 65 72 20 0a 2a 2a 20 20 20 20 20 6f 66  power .**     of
18ca0 20 74 77 6f 20 62 65 74 77 65 65 6e 20 35 31 32   two between 512
18cb0 20 61 6e 64 20 53 51 4c 49 54 45 5f 4d 41 58 5f   and SQLITE_MAX_
18cc0 50 41 47 45 5f 53 49 5a 45 2c 20 69 6e 63 6c 75  PAGE_SIZE, inclu
18cd0 73 69 76 65 29 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a  sive), and.**.**
18ce0 20 20 20 2a 20 74 68 65 72 65 20 61 72 65 20 6e     * there are n
18cf0 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  o outstanding pa
18d00 67 65 20 72 65 66 65 72 65 6e 63 65 73 2c 20 61  ge references, a
18d10 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65  nd.**.**   * the
18d20 20 64 61 74 61 62 61 73 65 20 69 73 20 65 69 74   database is eit
18d30 68 65 72 20 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65  her not an in-me
18d40 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 6f 72  mory database or
18d50 20 69 74 20 69 73 0a 2a 2a 20 20 20 20 20 61 6e   it is.**     an
18d60 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
18d70 61 73 65 20 74 68 61 74 20 63 75 72 72 65 6e 74  ase that current
18d80 6c 79 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 7a  ly consists of z
18d90 65 72 6f 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a  ero pages..**.**
18da0 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 72 20   then the pager 
18db0 6f 62 6a 65 63 74 20 70 61 67 65 20 73 69 7a 65  object page size
18dc0 20 69 73 20 73 65 74 20 74 6f 20 2a 70 50 61 67   is set to *pPag
18dd0 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  eSize..**.** If 
18de0 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
18df0 20 63 68 61 6e 67 65 64 2c 20 74 68 65 6e 20 74   changed, then t
18e00 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 75 73 65  his function use
18e10 73 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61  s sqlite3PagerMa
18e20 6c 6c 6f 63 28 29 20 0a 2a 2a 20 74 6f 20 6f 62  lloc() .** to ob
18e30 74 61 69 6e 20 61 20 6e 65 77 20 50 61 67 65 72  tain a new Pager
18e40 2e 70 54 6d 70 53 70 61 63 65 20 62 75 66 66 65  .pTmpSpace buffe
18e50 72 2e 20 49 66 20 74 68 69 73 20 61 6c 6c 6f 63  r. If this alloc
18e60 61 74 69 6f 6e 20 61 74 74 65 6d 70 74 20 0a 2a  ation attempt .*
18e70 2a 20 66 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f  * fails, SQLITE_
18e80 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65  NOMEM is returne
18e90 64 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 73  d and the page s
18ea0 69 7a 65 20 72 65 6d 61 69 6e 73 20 75 6e 63 68  ize remains unch
18eb0 61 6e 67 65 64 2e 20 0a 2a 2a 20 49 6e 20 61 6c  anged. .** In al
18ec0 6c 20 6f 74 68 65 72 20 63 61 73 65 73 2c 20 53  l other cases, S
18ed0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
18ee0 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rned..**.** If t
18ef0 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  he page size is 
18f00 6e 6f 74 20 63 68 61 6e 67 65 64 2c 20 65 69 74  not changed, eit
18f10 68 65 72 20 62 65 63 61 75 73 65 20 6f 6e 65 20  her because one 
18f20 6f 66 20 74 68 65 20 65 6e 75 6d 65 72 61 74 65  of the enumerate
18f30 64 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20  d.** conditions 
18f40 61 62 6f 76 65 20 69 73 20 6e 6f 74 20 74 72 75  above is not tru
18f50 65 2c 20 74 68 65 20 70 61 67 65 72 20 77 61 73  e, the pager was
18f60 20 69 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20   in error state 
18f70 77 68 65 6e 20 74 68 69 73 0a 2a 2a 20 66 75 6e  when this.** fun
18f80 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64  ction was called
18f90 2c 20 6f 72 20 62 65 63 61 75 73 65 20 74 68 65  , or because the
18fa0 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
18fb0 6f 6e 20 61 74 74 65 6d 70 74 20 66 61 69 6c 65  on attempt faile
18fc0 64 2c 20 0a 2a 2a 20 74 68 65 6e 20 2a 70 50 61  d, .** then *pPa
18fd0 67 65 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f  geSize is set to
18fe0 20 74 68 65 20 6f 6c 64 2c 20 72 65 74 61 69 6e   the old, retain
18ff0 65 64 20 70 61 67 65 20 73 69 7a 65 20 62 65 66  ed page size bef
19000 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
19010 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
19020 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 50 61  erSetPagesize(Pa
19030 67 65 72 20 2a 70 50 61 67 65 72 2c 20 75 31 36  ger *pPager, u16
19040 20 2a 70 50 61 67 65 53 69 7a 65 2c 20 69 6e 74   *pPageSize, int
19050 20 6e 52 65 73 65 72 76 65 29 7b 0a 20 20 69 6e   nReserve){.  in
19060 74 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65  t rc = pPager->e
19070 72 72 43 6f 64 65 3b 0a 0a 20 20 69 66 28 20 72  rrCode;..  if( r
19080 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
19090 20 20 20 20 75 31 36 20 70 61 67 65 53 69 7a 65      u16 pageSize
190a0 20 3d 20 2a 70 50 61 67 65 53 69 7a 65 3b 0a 20   = *pPageSize;. 
190b0 20 20 20 61 73 73 65 72 74 28 20 70 61 67 65 53     assert( pageS
190c0 69 7a 65 3d 3d 30 20 7c 7c 20 28 70 61 67 65 53  ize==0 || (pageS
190d0 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65  ize>=512 && page
190e0 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58  Size<=SQLITE_MAX
190f0 5f 50 41 47 45 5f 53 49 5a 45 29 20 29 3b 0a 20  _PAGE_SIZE) );. 
19100 20 20 20 69 66 28 20 28 70 50 61 67 65 72 2d 3e     if( (pPager->
19110 6d 65 6d 44 62 3d 3d 30 20 7c 7c 20 70 50 61 67  memDb==0 || pPag
19120 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 29 0a 20  er->dbSize==0). 
19130 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 50 63      && sqlite3Pc
19140 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61  acheRefCount(pPa
19150 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30  ger->pPCache)==0
19160 20 0a 20 20 20 20 20 26 26 20 70 61 67 65 53 69   .     && pageSi
19170 7a 65 20 26 26 20 70 61 67 65 53 69 7a 65 21 3d  ze && pageSize!=
19180 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
19190 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 63   .    ){.      c
191a0 68 61 72 20 2a 70 4e 65 77 20 3d 20 28 63 68 61  har *pNew = (cha
191b0 72 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 4d  r *)sqlite3PageM
191c0 61 6c 6c 6f 63 28 70 61 67 65 53 69 7a 65 29 3b  alloc(pageSize);
191d0 0a 20 20 20 20 20 20 69 66 28 20 21 70 4e 65 77  .      if( !pNew
191e0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
191f0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
19200 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
19210 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
19220 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
19230 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
19240 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20  e = pageSize;.  
19250 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
19260 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54  eFree(pPager->pT
19270 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20 20 20  mpSpace);.      
19280 20 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70    pPager->pTmpSp
19290 61 63 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20  ace = pNew;.    
192a0 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
192b0 65 53 65 74 50 61 67 65 53 69 7a 65 28 70 50 61  eSetPageSize(pPa
192c0 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 61  ger->pPCache, pa
192d0 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d  geSize);.      }
192e0 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 50 61 67  .    }.    *pPag
192f0 65 53 69 7a 65 20 3d 20 28 75 31 36 29 70 50 61  eSize = (u16)pPa
19300 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
19310 20 20 20 69 66 28 20 6e 52 65 73 65 72 76 65 3c     if( nReserve<
19320 30 20 29 20 6e 52 65 73 65 72 76 65 20 3d 20 70  0 ) nReserve = p
19330 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 3b  Pager->nReserve;
19340 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 52 65  .    assert( nRe
19350 73 65 72 76 65 3e 3d 30 20 26 26 20 6e 52 65 73  serve>=0 && nRes
19360 65 72 76 65 3c 31 30 30 30 20 29 3b 0a 20 20 20  erve<1000 );.   
19370 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76   pPager->nReserv
19380 65 20 3d 20 28 69 31 36 29 6e 52 65 73 65 72 76  e = (i16)nReserv
19390 65 3b 0a 20 20 20 20 70 61 67 65 72 52 65 70 6f  e;.    pagerRepo
193a0 72 74 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a  rtSize(pPager);.
193b0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
193c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
193d0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
193e0 65 20 22 74 65 6d 70 6f 72 61 72 79 20 70 61 67  e "temporary pag
193f0 65 22 20 62 75 66 66 65 72 20 68 65 6c 64 20 69  e" buffer held i
19400 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 62 79 20  nternally.** by 
19410 74 68 65 20 70 61 67 65 72 2e 20 20 54 68 69 73  the pager.  This
19420 20 69 73 20 61 20 62 75 66 66 65 72 20 74 68 61   is a buffer tha
19430 74 20 69 73 20 62 69 67 20 65 6e 6f 75 67 68 20  t is big enough 
19440 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 65  to hold the.** e
19450 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66  ntire content of
19460 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65   a database page
19470 2e 20 20 54 68 69 73 20 62 75 66 66 65 72 20 69  .  This buffer i
19480 73 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c  s used internall
19490 79 0a 2a 2a 20 64 75 72 69 6e 67 20 72 6f 6c 6c  y.** during roll
194a0 62 61 63 6b 20 61 6e 64 20 77 69 6c 6c 20 62 65  back and will be
194b0 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77 68 65   overwritten whe
194c0 6e 65 76 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b  never a rollback
194d0 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 20 42 75 74  .** occurs.  But
194e0 20 6f 74 68 65 72 20 6d 6f 64 75 6c 65 73 20 61   other modules a
194f0 72 65 20 66 72 65 65 20 74 6f 20 75 73 65 20 69  re free to use i
19500 74 20 74 6f 6f 2c 20 61 73 20 6c 6f 6e 67 20 61  t too, as long a
19510 73 0a 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b  s.** no rollback
19520 73 20 61 72 65 20 68 61 70 70 65 6e 69 6e 67 2e  s are happening.
19530 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
19540 33 50 61 67 65 72 54 65 6d 70 53 70 61 63 65 28  3PagerTempSpace(
19550 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
19560 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
19570 3e 70 54 6d 70 53 70 61 63 65 3b 0a 7d 0a 0a 2f  >pTmpSpace;.}../
19580 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20  *.** Attempt to 
19590 73 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  set the maximum 
195a0 64 61 74 61 62 61 73 65 20 70 61 67 65 20 63 6f  database page co
195b0 75 6e 74 20 69 66 20 6d 78 50 61 67 65 20 69 73  unt if mxPage is
195c0 20 70 6f 73 69 74 69 76 65 2e 20 0a 2a 2a 20 4d   positive. .** M
195d0 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 20 69  ake no changes i
195e0 66 20 6d 78 50 61 67 65 20 69 73 20 7a 65 72 6f  f mxPage is zero
195f0 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 20 20 41   or negative.  A
19600 6e 64 20 6e 65 76 65 72 20 72 65 64 75 63 65 20  nd never reduce 
19610 74 68 65 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20 70  the.** maximum p
19620 61 67 65 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20  age count below 
19630 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65  the current size
19640 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
19650 2e 0a 2a 2a 0a 2a 2a 20 52 65 67 61 72 64 6c 65  ..**.** Regardle
19660 73 73 20 6f 66 20 6d 78 50 61 67 65 2c 20 72 65  ss of mxPage, re
19670 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74  turn the current
19680 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f   maximum page co
19690 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  unt..*/.int sqli
196a0 74 65 33 50 61 67 65 72 4d 61 78 50 61 67 65 43  te3PagerMaxPageC
196b0 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  ount(Pager *pPag
196c0 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b  er, int mxPage){
196d0 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 0a 20 20  .  int nPage;.  
196e0 69 66 28 20 6d 78 50 61 67 65 3e 30 20 29 7b 0a  if( mxPage>0 ){.
196f0 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67      pPager->mxPg
19700 6e 6f 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d  no = mxPage;.  }
19710 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  .  sqlite3PagerP
19720 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c  agecount(pPager,
19730 20 26 6e 50 61 67 65 29 3b 0a 20 20 61 73 73 65   &nPage);.  asse
19740 72 74 28 20 70 50 61 67 65 72 2d 3e 6d 78 50 67  rt( pPager->mxPg
19750 6e 6f 3e 3d 6e 50 61 67 65 20 29 3b 0a 20 20 72  no>=nPage );.  r
19760 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6d 78  eturn pPager->mx
19770 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Pgno;.}../*.** T
19780 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 74  he following set
19790 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 61 72 65   of routines are
197a0 20 75 73 65 64 20 74 6f 20 64 69 73 61 62 6c 65   used to disable
197b0 20 74 68 65 20 73 69 6d 75 6c 61 74 65 64 0a 2a   the simulated.*
197c0 2a 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65 63 68  * I/O error mech
197d0 61 6e 69 73 6d 2e 20 20 54 68 65 73 65 20 72 6f  anism.  These ro
197e0 75 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20  utines are used 
197f0 74 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c 61 74  to avoid simulat
19800 65 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69 6e 20  ed.** errors in 
19810 70 6c 61 63 65 73 20 77 68 65 72 65 20 77 65 20  places where we 
19820 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75  do not care abou
19830 74 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20  t errors..**.** 
19840 55 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54 45 5f  Unless -DSQLITE_
19850 54 45 53 54 3d 31 20 69 73 20 75 73 65 64 2c 20  TEST=1 is used, 
19860 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61  these routines a
19870 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a  re all no-ops.**
19880 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20 6e 6f   and generate no
19890 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64 65 66   code..*/.#ifdef
198a0 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 65 78 74   SQLITE_TEST.ext
198b0 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
198c0 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67  io_error_pending
198d0 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c  ;.extern int sql
198e0 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69  ite3_io_error_hi
198f0 74 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61  t;.static int sa
19900 76 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20 64 69  ved_cnt;.void di
19910 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  sable_simulated_
19920 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b  io_errors(void){
19930 0a 20 20 73 61 76 65 64 5f 63 6e 74 20 3d 20 73  .  saved_cnt = s
19940 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
19950 70 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c 69 74  pending;.  sqlit
19960 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64  e3_io_error_pend
19970 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64  ing = -1;.}.void
19980 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65   enable_simulate
19990 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64  d_io_errors(void
199a0 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f  ){.  sqlite3_io_
199b0 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20  error_pending = 
199c0 73 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c  saved_cnt;.}.#el
199d0 73 65 0a 23 20 64 65 66 69 6e 65 20 64 69 73 61  se.# define disa
199e0 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
199f0 5f 65 72 72 6f 72 73 28 29 0a 23 20 64 65 66 69  _errors().# defi
19a00 6e 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61  ne enable_simula
19a10 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a  ted_io_errors().
19a20 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
19a30 61 64 20 74 68 65 20 66 69 72 73 74 20 4e 20 62  ad the first N b
19a40 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20 62 65  ytes from the be
19a50 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 66  ginning of the f
19a60 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a  ile into memory.
19a70 2a 2a 20 74 68 61 74 20 70 44 65 73 74 20 70 6f  ** that pDest po
19a80 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20  ints to. .**.** 
19a90 49 66 20 74 68 65 20 70 61 67 65 72 20 77 61 73  If the pager was
19aa0 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 74 72 61   opened on a tra
19ab0 6e 73 69 65 6e 74 20 66 69 6c 65 20 28 7a 46 69  nsient file (zFi
19ac0 6c 65 6e 61 6d 65 3d 3d 22 22 29 2c 20 6f 72 0a  lename==""), or.
19ad0 2a 2a 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 66  ** opened on a f
19ae0 69 6c 65 20 6c 65 73 73 20 74 68 61 6e 20 4e 20  ile less than N 
19af0 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 74  bytes in size, t
19b00 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  he output buffer
19b10 20 69 73 0a 2a 2a 20 7a 65 72 6f 65 64 20 61 6e   is.** zeroed an
19b20 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
19b30 72 6e 65 64 2e 20 54 68 65 20 72 61 74 69 6f 6e  rned. The ration
19b40 61 6c 65 20 66 6f 72 20 74 68 69 73 20 69 73 20  ale for this is 
19b50 74 68 61 74 20 74 68 69 73 20 0a 2a 2a 20 66 75  that this .** fu
19b60 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
19b70 6f 20 72 65 61 64 20 64 61 74 61 62 61 73 65 20  o read database 
19b80 68 65 61 64 65 72 73 2c 20 61 6e 64 20 61 20 6e  headers, and a n
19b90 65 77 20 74 72 61 6e 73 69 65 6e 74 20 6f 72 0a  ew transient or.
19ba0 2a 2a 20 7a 65 72 6f 20 73 69 7a 65 64 20 64 61  ** zero sized da
19bb0 74 61 62 61 73 65 20 68 61 73 20 61 20 68 65 61  tabase has a hea
19bc0 64 65 72 20 74 68 61 6e 20 63 6f 6e 73 69 73 74  der than consist
19bd0 73 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 7a 65  s entirely of ze
19be0 72 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  roes..**.** If a
19bf0 6e 79 20 49 4f 20 65 72 72 6f 72 20 61 70 61 72  ny IO error apar
19c00 74 20 66 72 6f 6d 20 53 51 4c 49 54 45 5f 49 4f  t from SQLITE_IO
19c10 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 69  ERR_SHORT_READ i
19c20 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 0a 2a  s encountered,.*
19c30 2a 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  * the error code
19c40 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20   is returned to 
19c50 74 68 65 20 63 61 6c 6c 65 72 20 61 6e 64 20 74  the caller and t
19c60 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
19c70 68 65 0a 2a 2a 20 6f 75 74 70 75 74 20 62 75 66  he.** output buf
19c80 66 65 72 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a  fer undefined..*
19c90 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
19ca0 65 72 52 65 61 64 46 69 6c 65 68 65 61 64 65 72  erReadFileheader
19cb0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
19cc0 69 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65 64 20  int N, unsigned 
19cd0 63 68 61 72 20 2a 70 44 65 73 74 29 7b 0a 20 20  char *pDest){.  
19ce0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
19cf0 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74 28 70 44 65  OK;.  memset(pDe
19d00 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 61 73 73  st, 0, N);.  ass
19d10 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
19d20 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65  er->fd) || pPage
19d30 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20  r->tempFile );. 
19d40 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
19d50 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 49  er->fd) ){.    I
19d60 4f 54 52 41 43 45 28 28 22 44 42 48 44 52 20 25  OTRACE(("DBHDR %
19d70 70 20 30 20 25 64 5c 6e 22 2c 20 70 50 61 67 65  p 0 %d\n", pPage
19d80 72 2c 20 4e 29 29 0a 20 20 20 20 72 63 20 3d 20  r, N)).    rc = 
19d90 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
19da0 61 67 65 72 2d 3e 66 64 2c 20 70 44 65 73 74 2c  ager->fd, pDest,
19db0 20 4e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   N, 0);.    if( 
19dc0 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc==SQLITE_IOERR
19dd0 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20  _SHORT_READ ){. 
19de0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
19df0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  _OK;.    }.  }. 
19e00 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
19e10 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
19e20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
19e30 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  pages in the dat
19e40 61 62 61 73 65 20 66 69 6c 65 20 61 73 73 6f 63  abase file assoc
19e50 69 61 74 65 64 20 0a 2a 2a 20 77 69 74 68 20 70  iated .** with p
19e60 50 61 67 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c  Pager. Normally,
19e70 20 74 68 69 73 20 69 73 20 63 61 6c 63 75 6c 61   this is calcula
19e80 74 65 64 20 61 73 20 28 3c 64 62 20 66 69 6c 65  ted as (<db file
19e90 20 73 69 7a 65 3e 2f 3c 70 61 67 65 2d 73 69 7a   size>/<page-siz
19ea0 65 3e 29 2e 0a 2a 2a 20 48 6f 77 65 76 65 72 2c  e>)..** However,
19eb0 20 69 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   if the file is 
19ec0 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 3c 70  between 1 and <p
19ed0 61 67 65 2d 73 69 7a 65 3e 20 62 79 74 65 73 20  age-size> bytes 
19ee0 69 6e 20 73 69 7a 65 2c 20 74 68 65 6e 20 0a 2a  in size, then .*
19ef0 2a 20 74 68 69 73 20 69 73 20 63 6f 6e 73 69 64  * this is consid
19f00 65 72 65 64 20 61 20 31 20 70 61 67 65 20 66 69  ered a 1 page fi
19f10 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  le..**.** If the
19f20 20 70 61 67 65 72 20 69 73 20 69 6e 20 65 72 72   pager is in err
19f30 6f 72 20 73 74 61 74 65 20 77 68 65 6e 20 74 68  or state when th
19f40 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
19f50 61 6c 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 0a  alled, then the.
19f60 2a 2a 20 65 72 72 6f 72 20 73 74 61 74 65 20 65  ** error state e
19f70 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
19f80 75 72 6e 65 64 20 61 6e 64 20 2a 70 6e 50 61 67  urned and *pnPag
19f90 65 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64  e left unchanged
19fa0 2e 20 4f 72 2c 0a 2a 2a 20 69 66 20 74 68 65 20  . Or,.** if the 
19fb0 66 69 6c 65 20 73 79 73 74 65 6d 20 68 61 73 20  file system has 
19fc0 74 6f 20 62 65 20 71 75 65 72 69 65 64 20 66 6f  to be queried fo
19fd0 72 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  r the size of th
19fe0 65 20 66 69 6c 65 20 61 6e 64 0a 2a 2a 20 74 68  e file and.** th
19ff0 65 20 71 75 65 72 79 20 61 74 74 65 6d 70 74 20  e query attempt 
1a000 72 65 74 75 72 6e 73 20 61 6e 20 49 4f 20 65 72  returns an IO er
1a010 72 6f 72 2c 20 74 68 65 20 49 4f 20 65 72 72 6f  ror, the IO erro
1a020 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
1a030 65 64 0a 2a 2a 20 61 6e 64 20 2a 70 6e 50 61 67  ed.** and *pnPag
1a040 65 20 69 73 20 6c 65 66 74 20 75 6e 63 68 61 6e  e is left unchan
1a050 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  ged..**.** Other
1a060 77 69 73 65 2c 20 69 66 20 65 76 65 72 79 74 68  wise, if everyth
1a070 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75  ing is successfu
1a080 6c 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f  l, then SQLITE_O
1a090 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a  K is returned.**
1a0a0 20 61 6e 64 20 2a 70 6e 50 61 67 65 20 69 73 20   and *pnPage is 
1a0b0 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  set to the numbe
1a0c0 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
1a0d0 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 69  e database..*/.i
1a0e0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  nt sqlite3PagerP
1a0f0 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a  agecount(Pager *
1a100 70 50 61 67 65 72 2c 20 69 6e 74 20 2a 70 6e 50  pPager, int *pnP
1a110 61 67 65 29 7b 0a 20 20 50 67 6e 6f 20 6e 50 61  age){.  Pgno nPa
1a120 67 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ge = 0;         
1a130 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65    /* Value to re
1a140 74 75 72 6e 20 76 69 61 20 2a 70 6e 50 61 67 65  turn via *pnPage
1a150 20 2a 2f 0a 0a 20 20 2f 2a 20 44 65 74 65 72 6d   */..  /* Determ
1a160 69 6e 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ine the number o
1a170 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 66  f pages in the f
1a180 69 6c 65 2e 20 53 74 6f 72 65 20 74 68 69 73 20  ile. Store this 
1a190 69 6e 20 6e 50 61 67 65 2e 20 2a 2f 0a 20 20 69  in nPage. */.  i
1a1a0 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  f( pPager->dbSiz
1a1b0 65 56 61 6c 69 64 20 29 7b 0a 20 20 20 20 6e 50  eValid ){.    nP
1a1c0 61 67 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  age = pPager->db
1a1d0 53 69 7a 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Size;.  }else{. 
1a1e0 20 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20     int rc;      
1a1f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72             /* Er
1a200 72 6f 72 20 72 65 74 75 72 6e 65 64 20 62 79 20  ror returned by 
1a210 4f 73 46 69 6c 65 53 69 7a 65 28 29 20 2a 2f 0a  OsFileSize() */.
1a220 20 20 20 20 69 36 34 20 6e 20 3d 20 30 3b 20 20      i64 n = 0;  
1a230 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1a240 69 6c 65 20 73 69 7a 65 20 69 6e 20 62 79 74 65  ile size in byte
1a250 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73  s returned by Os
1a260 46 69 6c 65 53 69 7a 65 28 29 20 2a 2f 0a 0a 20  FileSize() */.. 
1a270 20 20 20 69 66 28 20 70 61 67 65 72 55 73 65 4c     if( pagerUseL
1a280 6f 67 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  og(pPager) ){.  
1a290 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 67 44 62      sqlite3LogDb
1a2a0 73 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 4c 6f  size(pPager->pLo
1a2b0 67 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20  g, &nPage);.    
1a2c0 7d 0a 0a 20 20 20 20 69 66 28 20 6e 50 61 67 65  }..    if( nPage
1a2d0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ==0 ){.      ass
1a2e0 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
1a2f0 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65  er->fd) || pPage
1a300 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20  r->tempFile );. 
1a310 20 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28       if( isOpen(
1a320 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20  pPager->fd) ){. 
1a330 20 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54         if( SQLIT
1a340 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69  E_OK!=(rc = sqli
1a350 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
1a360 61 67 65 72 2d 3e 66 64 2c 20 26 6e 29 29 20 29  ager->fd, &n)) )
1a370 7b 0a 20 20 20 20 20 20 20 20 20 20 70 61 67 65  {.          page
1a380 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
1a390 72 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  rc);.          r
1a3a0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1a3b0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1a3c0 20 20 69 66 28 20 6e 3e 30 20 26 26 20 6e 3c 70    if( n>0 && n<p
1a3d0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
1a3e0 29 7b 0a 20 20 20 20 20 20 20 20 6e 50 61 67 65  ){.        nPage
1a3f0 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 1;.      }els
1a400 65 7b 0a 20 20 20 20 20 20 20 20 6e 50 61 67 65  e{.        nPage
1a410 20 3d 20 28 50 67 6e 6f 29 28 6e 20 2f 20 70 50   = (Pgno)(n / pP
1a420 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
1a430 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1a440 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73     if( pPager->s
1a450 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate!=PAGER_UNLO
1a460 43 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  CK ){.      pPag
1a470 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61  er->dbSize = nPa
1a480 67 65 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  ge;.      pPager
1a490 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 6e  ->dbFileSize = n
1a4a0 50 61 67 65 3b 0a 20 20 20 20 20 20 70 50 61 67  Page;.      pPag
1a4b0 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20  er->dbSizeValid 
1a4c0 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 1;.    }.  }..
1a4d0 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 72    /* If the curr
1a4e0 65 6e 74 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  ent number of pa
1a4f0 67 65 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20  ges in the file 
1a500 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
1a510 74 68 65 20 0a 20 20 2a 2a 20 63 6f 6e 66 69 67  the .  ** config
1a520 75 72 65 64 20 6d 61 78 69 6d 75 6d 20 70 61 67  ured maximum pag
1a530 65 72 20 6e 75 6d 62 65 72 2c 20 69 6e 63 72 65  er number, incre
1a540 61 73 65 20 74 68 65 20 61 6c 6c 6f 77 65 64 20  ase the allowed 
1a550 6c 69 6d 69 74 20 73 6f 0a 20 20 2a 2a 20 74 68  limit so.  ** th
1a560 61 74 20 74 68 65 20 66 69 6c 65 20 63 61 6e 20  at the file can 
1a570 62 65 20 72 65 61 64 2e 0a 20 20 2a 2f 0a 20 20  be read..  */.  
1a580 69 66 28 20 6e 50 61 67 65 3e 70 50 61 67 65 72  if( nPage>pPager
1a590 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20  ->mxPgno ){.    
1a5a0 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d  pPager->mxPgno =
1a5b0 20 28 50 67 6e 6f 29 6e 50 61 67 65 3b 0a 20 20   (Pgno)nPage;.  
1a5c0 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  }..  /* Set the 
1a5d0 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 20  output variable 
1a5e0 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
1a5f0 45 5f 4f 4b 20 2a 2f 0a 20 20 2a 70 6e 50 61 67  E_OK */.  *pnPag
1a600 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 72 65 74  e = nPage;.  ret
1a610 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1a620 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20  .../*.** Try to 
1a630 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 66  obtain a lock of
1a640 20 74 79 70 65 20 6c 6f 63 6b 74 79 70 65 20 6f   type locktype o
1a650 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
1a660 69 6c 65 2e 20 49 66 0a 2a 2a 20 61 20 73 69 6d  ile. If.** a sim
1a670 69 6c 61 72 20 6f 72 20 67 72 65 61 74 65 72 20  ilar or greater 
1a680 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20  lock is already 
1a690 68 65 6c 64 2c 20 74 68 69 73 20 66 75 6e 63 74  held, this funct
1a6a0 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 0a 2a  ion is a no-op.*
1a6b0 2a 20 28 72 65 74 75 72 6e 69 6e 67 20 53 51 4c  * (returning SQL
1a6c0 49 54 45 5f 4f 4b 20 69 6d 6d 65 64 69 61 74 65  ITE_OK immediate
1a6d0 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  ly)..**.** Other
1a6e0 77 69 73 65 2c 20 61 74 74 65 6d 70 74 20 74 6f  wise, attempt to
1a6f0 20 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f 63 6b   obtain the lock
1a700 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73   using sqlite3Os
1a710 4c 6f 63 6b 28 29 2e 20 49 6e 76 6f 6b 65 20 0a  Lock(). Invoke .
1a720 2a 2a 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c  ** the busy call
1a730 62 61 63 6b 20 69 66 20 74 68 65 20 6c 6f 63 6b  back if the lock
1a740 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6e 6f   is currently no
1a750 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 52 65 70  t available. Rep
1a760 65 61 74 20 0a 2a 2a 20 75 6e 74 69 6c 20 74 68  eat .** until th
1a770 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20  e busy callback 
1a780 72 65 74 75 72 6e 73 20 66 61 6c 73 65 20 6f 72  returns false or
1a790 20 75 6e 74 69 6c 20 74 68 65 20 61 74 74 65 6d   until the attem
1a7a0 70 74 20 74 6f 20 0a 2a 2a 20 6f 62 74 61 69 6e  pt to .** obtain
1a7b0 20 74 68 65 20 6c 6f 63 6b 20 73 75 63 63 65 65   the lock succee
1a7c0 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ds..**.** Return
1a7d0 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
1a7e0 63 63 65 73 73 20 61 6e 64 20 61 6e 20 65 72 72  ccess and an err
1a7f0 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20 63 61  or code if we ca
1a800 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a 20 74  nnot obtain.** t
1a810 68 65 20 6c 6f 63 6b 2e 20 49 66 20 74 68 65 20  he lock. If the 
1a820 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64  lock is obtained
1a830 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 73   successfully, s
1a840 65 74 20 74 68 65 20 50 61 67 65 72 2e 73 74 61  et the Pager.sta
1a850 74 65 20 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20  te .** variable 
1a860 74 6f 20 6c 6f 63 6b 74 79 70 65 20 62 65 66 6f  to locktype befo
1a870 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f  re returning..*/
1a880 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
1a890 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 50  r_wait_on_lock(P
1a8a0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
1a8b0 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69  t locktype){.  i
1a8c0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
1a8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a8e0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
1a8f0 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20  de */..  /* The 
1a900 4f 53 20 6c 6f 63 6b 20 76 61 6c 75 65 73 20 6d  OS lock values m
1a910 75 73 74 20 62 65 20 74 68 65 20 73 61 6d 65 20  ust be the same 
1a920 61 73 20 74 68 65 20 50 61 67 65 72 20 6c 6f 63  as the Pager loc
1a930 6b 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 61 73  k values */.  as
1a940 73 65 72 74 28 20 50 41 47 45 52 5f 53 48 41 52  sert( PAGER_SHAR
1a950 45 44 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ED==SHARED_LOCK 
1a960 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47  );.  assert( PAG
1a970 45 52 5f 52 45 53 45 52 56 45 44 3d 3d 52 45 53  ER_RESERVED==RES
1a980 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  ERVED_LOCK );.  
1a990 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 45 58  assert( PAGER_EX
1a9a0 43 4c 55 53 49 56 45 3d 3d 45 58 43 4c 55 53 49  CLUSIVE==EXCLUSI
1a9b0 56 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a  VE_LOCK );..  /*
1a9c0 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   If the file is 
1a9d0 63 75 72 72 65 6e 74 6c 79 20 75 6e 6c 6f 63 6b  currently unlock
1a9e0 65 64 20 74 68 65 6e 20 74 68 65 20 73 69 7a 65  ed then the size
1a9f0 20 6d 75 73 74 20 62 65 20 75 6e 6b 6e 6f 77 6e   must be unknown
1aa00 2e 20 49 74 0a 20 20 2a 2a 20 6d 75 73 74 20 6e  . It.  ** must n
1aa10 6f 74 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64  ot have been mod
1aa20 69 66 69 65 64 20 61 74 20 74 68 69 73 20 70 6f  ified at this po
1aa30 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  int..  */.  asse
1aa40 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
1aa50 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e>=PAGER_SHARED 
1aa60 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  || pPager->dbSiz
1aa70 65 56 61 6c 69 64 3d 3d 30 20 29 3b 0a 20 20 61  eValid==0 );.  a
1aa80 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
1aa90 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52  tate>=PAGER_SHAR
1aaa0 45 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62  ED || pPager->db
1aab0 4d 6f 64 69 66 69 65 64 3d 3d 30 20 29 3b 0a 0a  Modified==0 );..
1aac0 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
1aad0 74 68 69 73 20 69 73 20 65 69 74 68 65 72 20 61  this is either a
1aae0 20 6e 6f 2d 6f 70 20 28 62 65 63 61 75 73 65 20   no-op (because 
1aaf0 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
1ab00 63 6b 20 69 73 20 0a 20 20 2a 2a 20 61 6c 72 65  ck is .  ** alre
1ab10 61 64 79 20 68 65 6c 64 2c 20 6f 72 20 6f 6e 65  ady held, or one
1ab20 20 6f 66 20 74 68 65 20 74 72 61 6e 73 69 73 74   of the transist
1ab30 69 6f 6e 73 20 74 68 61 74 20 74 68 65 20 62 75  ions that the bu
1ab40 73 79 2d 68 61 6e 64 6c 65 72 0a 20 20 2a 2a 20  sy-handler.  ** 
1ab50 6d 61 79 20 62 65 20 69 6e 76 6f 6b 65 64 20 64  may be invoked d
1ab60 75 72 69 6e 67 2c 20 61 63 63 6f 72 64 69 6e 67  uring, according
1ab70 20 74 6f 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20   to the comment 
1ab80 61 62 6f 76 65 0a 20 20 2a 2a 20 73 71 6c 69 74  above.  ** sqlit
1ab90 65 33 50 61 67 65 72 53 65 74 42 75 73 79 68 61  e3PagerSetBusyha
1aba0 6e 64 6c 65 72 28 29 2e 0a 20 20 2a 2f 0a 20 20  ndler()..  */.  
1abb0 61 73 73 65 72 74 28 20 28 70 50 61 67 65 72 2d  assert( (pPager-
1abc0 3e 73 74 61 74 65 3e 3d 6c 6f 63 6b 74 79 70 65  >state>=locktype
1abd0 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61  ).       || (pPa
1abe0 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
1abf0 52 5f 55 4e 4c 4f 43 4b 20 26 26 20 6c 6f 63 6b  R_UNLOCK && lock
1ac00 74 79 70 65 3d 3d 50 41 47 45 52 5f 53 48 41 52  type==PAGER_SHAR
1ac10 45 44 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 70  ED).       || (p
1ac20 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
1ac30 47 45 52 5f 52 45 53 45 52 56 45 44 20 26 26 20  GER_RESERVED && 
1ac40 6c 6f 63 6b 74 79 70 65 3d 3d 50 41 47 45 52 5f  locktype==PAGER_
1ac50 45 58 43 4c 55 53 49 56 45 29 0a 20 20 29 3b 0a  EXCLUSIVE).  );.
1ac60 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
1ac70 74 61 74 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29  tate>=locktype )
1ac80 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
1ac90 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E_OK;.  }else{. 
1aca0 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 72 63     do {.      rc
1acb0 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b   = sqlite3OsLock
1acc0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 6c 6f 63  (pPager->fd, loc
1acd0 6b 74 79 70 65 29 3b 0a 20 20 20 20 7d 77 68 69  ktype);.    }whi
1ace0 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42  le( rc==SQLITE_B
1acf0 55 53 59 20 26 26 20 70 50 61 67 65 72 2d 3e 78  USY && pPager->x
1ad00 42 75 73 79 48 61 6e 64 6c 65 72 28 70 50 61 67  BusyHandler(pPag
1ad10 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72  er->pBusyHandler
1ad20 41 72 67 29 20 29 3b 0a 20 20 20 20 69 66 28 20  Arg) );.    if( 
1ad30 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1ad40 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73  .      pPager->s
1ad50 74 61 74 65 20 3d 20 28 75 38 29 6c 6f 63 6b 74  tate = (u8)lockt
1ad60 79 70 65 3b 0a 20 20 20 20 20 20 49 4f 54 52 41  ype;.      IOTRA
1ad70 43 45 28 28 22 4c 4f 43 4b 20 25 70 20 25 64 5c  CE(("LOCK %p %d\
1ad80 6e 22 2c 20 70 50 61 67 65 72 2c 20 6c 6f 63 6b  n", pPager, lock
1ad90 74 79 70 65 29 29 0a 20 20 20 20 7d 0a 20 20 7d  type)).    }.  }
1ada0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1adb0 0a 2f 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20  ./*.** Function 
1adc0 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f  assertTruncateCo
1add0 6e 73 74 72 61 69 6e 74 28 70 50 61 67 65 72 29  nstraint(pPager)
1ade0 20 63 68 65 63 6b 73 20 74 68 61 74 20 6f 6e 65   checks that one
1adf0 20 6f 66 20 74 68 65 20 0a 2a 2a 20 66 6f 6c 6c   of the .** foll
1ae00 6f 77 69 6e 67 20 69 73 20 74 72 75 65 20 66 6f  owing is true fo
1ae10 72 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65  r all dirty page
1ae20 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74  s currently in t
1ae30 68 65 20 70 61 67 65 2d 63 61 63 68 65 3a 0a 2a  he page-cache:.*
1ae40 2a 0a 2a 2a 20 20 20 61 29 20 54 68 65 20 70 61  *.**   a) The pa
1ae50 67 65 20 6e 75 6d 62 65 72 20 69 73 20 6c 65 73  ge number is les
1ae60 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  s than or equal 
1ae70 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  to the size of t
1ae80 68 65 20 0a 2a 2a 20 20 20 20 20 20 63 75 72 72  he .**      curr
1ae90 65 6e 74 20 64 61 74 61 62 61 73 65 20 69 6d 61  ent database ima
1aea0 67 65 2c 20 69 6e 20 70 61 67 65 73 2c 20 4f 52  ge, in pages, OR
1aeb0 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 69 66 20 74  .**.**   b) if t
1aec0 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  he page content 
1aed0 77 65 72 65 20 77 72 69 74 74 65 6e 20 61 74 20  were written at 
1aee0 74 68 69 73 20 74 69 6d 65 2c 20 69 74 20 77 6f  this time, it wo
1aef0 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20  uld not.**      
1af00 62 65 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  be necessary to 
1af10 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e  write the curren
1af20 74 20 63 6f 6e 74 65 6e 74 20 6f 75 74 20 74 6f  t content out to
1af30 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
1af40 0a 2a 2a 20 20 20 20 20 20 28 61 73 20 64 65 74  .**      (as det
1af50 65 72 6d 69 6e 65 64 20 62 79 20 66 75 6e 63 74  ermined by funct
1af60 69 6f 6e 20 73 75 62 6a 52 65 71 75 69 72 65 73  ion subjRequires
1af70 50 61 67 65 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 49  Page())..**.** I
1af80 66 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20  f the condition 
1af90 61 73 73 65 72 74 65 64 20 62 79 20 74 68 69 73  asserted by this
1afa0 20 66 75 6e 63 74 69 6f 6e 20 77 65 72 65 20 6e   function were n
1afb0 6f 74 20 74 72 75 65 2c 20 61 6e 64 20 74 68 65  ot true, and the
1afc0 0a 2a 2a 20 64 69 72 74 79 20 70 61 67 65 20 77  .** dirty page w
1afd0 65 72 65 20 74 6f 20 62 65 20 64 69 73 63 61 72  ere to be discar
1afe0 64 65 64 20 66 72 6f 6d 20 74 68 65 20 63 61 63  ded from the cac
1aff0 68 65 20 76 69 61 20 74 68 65 20 70 61 67 65 72  he via the pager
1b000 53 74 72 65 73 73 28 29 0a 2a 2a 20 72 6f 75 74  Stress().** rout
1b010 69 6e 65 2c 20 70 61 67 65 72 53 74 72 65 73 73  ine, pagerStress
1b020 28 29 20 77 6f 75 6c 64 20 6e 6f 74 20 77 72 69  () would not wri
1b030 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  te the current p
1b040 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 6f 0a 2a  age content to.*
1b050 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
1b060 69 6c 65 2e 20 49 66 20 61 20 73 61 76 65 70 6f  ile. If a savepo
1b070 69 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  int transaction 
1b080 77 65 72 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  were rolled back
1b090 20 61 66 74 65 72 0a 2a 2a 20 74 68 69 73 20 68   after.** this h
1b0a0 61 70 70 65 6e 65 64 2c 20 74 68 65 20 63 6f 72  appened, the cor
1b0b0 72 65 63 74 20 62 65 68 61 76 69 6f 75 72 20 77  rect behaviour w
1b0c0 6f 75 6c 64 20 62 65 20 74 6f 20 72 65 73 74 6f  ould be to resto
1b0d0 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a  re the current.*
1b0e0 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  * content of the
1b0f0 20 70 61 67 65 2e 20 48 6f 77 65 76 65 72 2c 20   page. However, 
1b100 73 69 6e 63 65 20 74 68 69 73 20 63 6f 6e 74 65  since this conte
1b110 6e 74 20 69 73 20 6e 6f 74 20 70 72 65 73 65 6e  nt is not presen
1b120 74 20 69 6e 20 65 69 74 68 65 72 0a 2a 2a 20 74  t in either.** t
1b130 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1b140 20 6f 72 20 74 68 65 20 70 6f 72 74 69 6f 6e 20   or the portion 
1b150 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  of the rollback 
1b160 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 0a 2a 2a 20  journal and .** 
1b170 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  sub-journal roll
1b180 65 64 20 62 61 63 6b 20 74 68 65 20 63 6f 6e 74  ed back the cont
1b190 65 6e 74 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  ent could not be
1b1a0 20 72 65 73 74 6f 72 65 64 20 61 6e 64 20 74 68   restored and th
1b1b0 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6d  e.** database im
1b1c0 61 67 65 20 77 6f 75 6c 64 20 62 65 63 6f 6d 65  age would become
1b1d0 20 63 6f 72 72 75 70 74 2e 20 49 74 20 69 73 20   corrupt. It is 
1b1e0 74 68 65 72 65 66 6f 72 65 20 66 6f 72 74 75 6e  therefore fortun
1b1f0 61 74 65 20 74 68 61 74 20 0a 2a 2a 20 74 68 69  ate that .** thi
1b200 73 20 63 69 72 63 75 6d 73 74 61 6e 63 65 20 63  s circumstance c
1b210 61 6e 6e 6f 74 20 61 72 69 73 65 2e 0a 2a 2f 0a  annot arise..*/.
1b220 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
1b230 54 45 5f 44 45 42 55 47 29 0a 73 74 61 74 69 63  TE_DEBUG).static
1b240 20 76 6f 69 64 20 61 73 73 65 72 74 54 72 75 6e   void assertTrun
1b250 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 62  cateConstraintCb
1b260 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
1b270 61 73 73 65 72 74 28 20 70 50 67 2d 3e 66 6c 61  assert( pPg->fla
1b280 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 20 29  gs&PGHDR_DIRTY )
1b290 3b 0a 20 20 61 73 73 65 72 74 28 20 21 73 75 62  ;.  assert( !sub
1b2a0 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50  jRequiresPage(pP
1b2b0 67 29 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3c  g) || pPg->pgno<
1b2c0 3d 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 64 62  =pPg->pPager->db
1b2d0 53 69 7a 65 20 29 3b 0a 7d 0a 73 74 61 74 69 63  Size );.}.static
1b2e0 20 76 6f 69 64 20 61 73 73 65 72 74 54 72 75 6e   void assertTrun
1b2f0 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 50  cateConstraint(P
1b300 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
1b310 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 49 74   sqlite3PcacheIt
1b320 65 72 61 74 65 44 69 72 74 79 28 70 50 61 67 65  erateDirty(pPage
1b330 72 2d 3e 70 50 43 61 63 68 65 2c 20 61 73 73 65  r->pPCache, asse
1b340 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72  rtTruncateConstr
1b350 61 69 6e 74 43 62 29 3b 0a 7d 0a 23 65 6c 73 65  aintCb);.}.#else
1b360 0a 23 20 64 65 66 69 6e 65 20 61 73 73 65 72 74  .# define assert
1b370 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69  TruncateConstrai
1b380 6e 74 28 70 50 61 67 65 72 29 0a 23 65 6e 64 69  nt(pPager).#endi
1b390 66 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74  f../*.** Truncat
1b3a0 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  e the in-memory 
1b3b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6d  database file im
1b3c0 61 67 65 20 74 6f 20 6e 50 61 67 65 20 70 61 67  age to nPage pag
1b3d0 65 73 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e  es. This .** fun
1b3e0 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 61  ction does not a
1b3f0 63 74 75 61 6c 6c 79 20 6d 6f 64 69 66 79 20 74  ctually modify t
1b400 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1b410 20 6f 6e 20 64 69 73 6b 2e 20 49 74 20 0a 2a 2a   on disk. It .**
1b420 20 6a 75 73 74 20 73 65 74 73 20 74 68 65 20 69   just sets the i
1b430 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20 6f 66  nternal state of
1b440 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63   the pager objec
1b450 74 20 73 6f 20 74 68 61 74 20 74 68 65 20 0a 2a  t so that the .*
1b460 2a 20 74 72 75 6e 63 61 74 69 6f 6e 20 77 69 6c  * truncation wil
1b470 6c 20 62 65 20 64 6f 6e 65 20 77 68 65 6e 20 74  l be done when t
1b480 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  he current trans
1b490 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74  action is commit
1b4a0 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ted..*/.void sql
1b4b0 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74  ite3PagerTruncat
1b4c0 65 49 6d 61 67 65 28 50 61 67 65 72 20 2a 70 50  eImage(Pager *pP
1b4d0 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65  ager, Pgno nPage
1b4e0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ){.  assert( pPa
1b4f0 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64  ger->dbSizeValid
1b500 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
1b510 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 6e 50  ager->dbSize>=nP
1b520 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  age );.  assert(
1b530 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
1b540 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
1b550 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69  ;.  pPager->dbSi
1b560 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 61 73  ze = nPage;.  as
1b570 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73  sertTruncateCons
1b580 74 72 61 69 6e 74 28 70 50 61 67 65 72 29 3b 0a  traint(pPager);.
1b590 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  }.../*.** This f
1b5a0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
1b5b0 64 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74  d before attempt
1b5c0 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  ing a hot-journa
1b5d0 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 74 0a 2a  l rollback. It.*
1b5e0 2a 20 73 79 6e 63 73 20 74 68 65 20 6a 6f 75 72  * syncs the jour
1b5f0 6e 61 6c 20 66 69 6c 65 20 74 6f 20 64 69 73 6b  nal file to disk
1b600 2c 20 74 68 65 6e 20 73 65 74 73 20 70 50 61 67  , then sets pPag
1b610 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 74  er->journalHdr t
1b620 6f 20 74 68 65 0a 2a 2a 20 73 69 7a 65 20 6f 66  o the.** size of
1b630 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1b640 65 20 73 6f 20 74 68 61 74 20 74 68 65 20 70 61  e so that the pa
1b650 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 72  ger_playback() r
1b660 6f 75 74 69 6e 65 20 6b 6e 6f 77 73 0a 2a 2a 20  outine knows.** 
1b670 74 68 61 74 20 74 68 65 20 65 6e 74 69 72 65 20  that the entire 
1b680 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73  journal file has
1b690 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 2a 2a   been synced..**
1b6a0 0a 2a 2a 20 53 79 6e 63 69 6e 67 20 61 20 68 6f  .** Syncing a ho
1b6b0 74 2d 6a 6f 75 72 6e 61 6c 20 74 6f 20 64 69 73  t-journal to dis
1b6c0 6b 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74  k before attempt
1b6d0 69 6e 67 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62  ing to roll it b
1b6e0 61 63 6b 20 65 6e 73 75 72 65 73 20 0a 2a 2a 20  ack ensures .** 
1b6f0 74 68 61 74 20 69 66 20 61 20 70 6f 77 65 72 2d  that if a power-
1b700 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 64  failure occurs d
1b710 75 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61  uring the rollba
1b720 63 6b 2c 20 74 68 65 20 70 72 6f 63 65 73 73 20  ck, the process 
1b730 74 68 61 74 0a 2a 2a 20 61 74 74 65 6d 70 74 73  that.** attempts
1b740 20 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77   rollback follow
1b750 69 6e 67 20 73 79 73 74 65 6d 20 72 65 63 6f 76  ing system recov
1b760 65 72 79 20 73 65 65 73 20 74 68 65 20 73 61 6d  ery sees the sam
1b770 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63 6f 6e  e journal.** con
1b780 74 65 6e 74 20 61 73 20 74 68 69 73 20 70 72 6f  tent as this pro
1b790 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65  cess..**.** If e
1b7a0 76 65 72 79 74 68 69 6e 67 20 67 6f 65 73 20 61  verything goes a
1b7b0 73 20 70 6c 61 6e 6e 65 64 2c 20 53 51 4c 49 54  s planned, SQLIT
1b7c0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
1b7d0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 0a 2a 2a  . Otherwise, .**
1b7e0 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
1b7f0 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   code..*/.static
1b800 20 69 6e 74 20 70 61 67 65 72 53 79 6e 63 48 6f   int pagerSyncHo
1b810 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  tJournal(Pager *
1b820 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
1b830 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1b840 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f   if( !pPager->no
1b850 53 79 6e 63 20 29 7b 0a 20 20 20 20 72 63 20 3d  Sync ){.    rc =
1b860 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
1b870 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c 49  Pager->jfd, SQLI
1b880 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b  TE_SYNC_NORMAL);
1b890 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
1b8a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1b8b0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
1b8c0 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a  leSize(pPager->j
1b8d0 66 64 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75  fd, &pPager->jou
1b8e0 72 6e 61 6c 48 64 72 29 3b 0a 20 20 7d 0a 20 20  rnalHdr);.  }.  
1b8f0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1b900 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65  .** Shutdown the
1b910 20 70 61 67 65 20 63 61 63 68 65 2e 20 20 46 72   page cache.  Fr
1b920 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e  ee all memory an
1b930 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65  d close all file
1b940 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72  s..**.** If a tr
1b950 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 69 6e  ansaction was in
1b960 20 70 72 6f 67 72 65 73 73 20 77 68 65 6e 20 74   progress when t
1b970 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
1b980 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74  alled, that.** t
1b990 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
1b9a0 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20  lled back.  All 
1b9b0 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  outstanding page
1b9c0 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65  s are invalidate
1b9d0 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72 20 6d  d.** and their m
1b9e0 65 6d 6f 72 79 20 69 73 20 66 72 65 65 64 2e 20  emory is freed. 
1b9f0 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20   Any attempt to 
1ba00 75 73 65 20 61 20 70 61 67 65 20 61 73 73 6f 63  use a page assoc
1ba10 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68  iated.** with th
1ba20 69 73 20 70 61 67 65 20 63 61 63 68 65 20 61 66  is page cache af
1ba30 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ter this functio
1ba40 6e 20 72 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c  n returns will l
1ba50 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20  ikely.** result 
1ba60 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a  in a coredump..*
1ba70 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1ba80 6f 6e 20 61 6c 77 61 79 73 20 73 75 63 63 65 65  on always succee
1ba90 64 73 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63  ds. If a transac
1baa0 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61  tion is active a
1bab0 6e 20 61 74 74 65 6d 70 74 0a 2a 2a 20 69 73 20  n attempt.** is 
1bac0 6d 61 64 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20  made to roll it 
1bad0 62 61 63 6b 2e 20 49 66 20 61 6e 20 65 72 72 6f  back. If an erro
1bae0 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  r occurs during 
1baf0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a  the rollback .**
1bb00 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d   a hot journal m
1bb10 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68  ay be left in th
1bb20 65 20 66 69 6c 65 73 79 73 74 65 6d 20 62 75 74  e filesystem but
1bb30 20 6e 6f 20 65 72 72 6f 72 20 69 73 20 72 65 74   no error is ret
1bb40 75 72 6e 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20  urned.** to the 
1bb50 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73  caller..*/.int s
1bb60 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65  qlite3PagerClose
1bb70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
1bb80 0a 20 20 75 38 20 2a 70 54 6d 70 20 3d 20 28 75  .  u8 *pTmp = (u
1bb90 38 20 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d 70  8 *)pPager->pTmp
1bba0 53 70 61 63 65 3b 0a 0a 20 20 64 69 73 61 62 6c  Space;..  disabl
1bbb0 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
1bbc0 72 72 6f 72 73 28 29 3b 0a 20 20 73 71 6c 69 74  rrors();.  sqlit
1bbd0 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
1bbe0 6c 6f 63 28 29 3b 0a 20 20 70 50 61 67 65 72 2d  loc();.  pPager-
1bbf0 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b 0a 20 20  >errCode = 0;.  
1bc00 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
1bc10 65 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 73 71 6c  eMode = 0;.  sql
1bc20 69 74 65 33 4c 6f 67 43 6c 6f 73 65 28 70 50 61  ite3LogClose(pPa
1bc30 67 65 72 2d 3e 70 4c 6f 67 2c 20 70 50 61 67 65  ger->pLog, pPage
1bc40 72 2d 3e 66 64 2c 20 0a 20 20 20 20 28 70 50 61  r->fd, .    (pPa
1bc50 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3f 20 30 20  ger->noSync ? 0 
1bc60 3a 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66  : pPager->sync_f
1bc70 6c 61 67 73 29 2c 20 70 54 6d 70 0a 20 20 29 3b  lags), pTmp.  );
1bc80 0a 20 20 70 50 61 67 65 72 2d 3e 70 4c 6f 67 20  .  pPager->pLog 
1bc90 3d 20 30 3b 0a 20 20 70 61 67 65 72 5f 72 65 73  = 0;.  pager_res
1bca0 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  et(pPager);.  if
1bcb0 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70  ( MEMDB ){.    p
1bcc0 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67  ager_unlock(pPag
1bcd0 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  er);.  }else{.  
1bce0 20 20 2f 2a 20 53 65 74 20 50 61 67 65 72 2e 6a    /* Set Pager.j
1bcf0 6f 75 72 6e 61 6c 48 64 72 20 74 6f 20 2d 31 20  ournalHdr to -1 
1bd00 66 6f 72 20 74 68 65 20 62 65 6e 65 66 69 74 20  for the benefit 
1bd10 6f 66 20 74 68 65 20 70 61 67 65 72 5f 70 6c 61  of the pager_pla
1bd20 79 62 61 63 6b 28 29 20 0a 20 20 20 20 2a 2a 20  yback() .    ** 
1bd30 63 61 6c 6c 20 77 68 69 63 68 20 6d 61 79 20 62  call which may b
1bd40 65 20 6d 61 64 65 20 66 72 6f 6d 20 77 69 74 68  e made from with
1bd50 69 6e 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e  in pagerUnlockAn
1bd60 64 52 6f 6c 6c 62 61 63 6b 28 29 2e 20 49 66 20  dRollback(). If 
1bd70 69 74 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74  it.    ** is not
1bd80 20 2d 31 2c 20 74 68 65 6e 20 74 68 65 20 75 6e   -1, then the un
1bd90 73 79 6e 63 65 64 20 70 6f 72 74 69 6f 6e 20 6f  synced portion o
1bda0 66 20 61 6e 20 6f 70 65 6e 20 6a 6f 75 72 6e 61  f an open journa
1bdb0 6c 20 66 69 6c 65 20 6d 61 79 0a 20 20 20 20 2a  l file may.    *
1bdc0 2a 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b  * be played back
1bdd0 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
1bde0 73 65 2e 20 49 66 20 61 20 70 6f 77 65 72 20 66  se. If a power f
1bdf0 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77 68  ailure occurs wh
1be00 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 69 73 20  ile.    ** this 
1be10 69 73 20 68 61 70 70 65 6e 69 6e 67 2c 20 74 68  is happening, th
1be20 65 20 64 61 74 61 62 61 73 65 20 6d 61 79 20 62  e database may b
1be30 65 63 6f 6d 65 20 63 6f 72 72 75 70 74 2e 0a 20  ecome corrupt.. 
1be40 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 73     */.    if( is
1be50 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
1be60 29 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  ) ){.      pPage
1be70 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 70 61 67  r->errCode = pag
1be80 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c  erSyncHotJournal
1be90 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a  (pPager);.    }.
1bea0 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41      pagerUnlockA
1beb0 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  ndRollback(pPage
1bec0 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  r);.  }.  sqlite
1bed0 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
1bee0 28 29 3b 0a 20 20 65 6e 61 62 6c 65 5f 73 69 6d  ();.  enable_sim
1bef0 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
1bf00 28 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45  ();.  PAGERTRACE
1bf10 28 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22 2c 20  (("CLOSE %d\n", 
1bf20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
1bf30 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 43  );.  IOTRACE(("C
1bf40 4c 4f 53 45 20 25 70 5c 6e 22 2c 20 70 50 61 67  LOSE %p\n", pPag
1bf50 65 72 29 29 0a 20 20 73 71 6c 69 74 65 33 4f 73  er)).  sqlite3Os
1bf60 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64  Close(pPager->fd
1bf70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
1bf80 46 72 65 65 28 70 54 6d 70 29 3b 0a 20 20 73 71  Free(pTmp);.  sq
1bf90 6c 69 74 65 33 50 63 61 63 68 65 43 6c 6f 73 65  lite3PcacheClose
1bfa0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
1bfb0 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  );..#ifdef SQLIT
1bfc0 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 69 66  E_HAS_CODEC.  if
1bfd0 28 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63  ( pPager->xCodec
1bfe0 46 72 65 65 20 29 20 70 50 61 67 65 72 2d 3e 78  Free ) pPager->x
1bff0 43 6f 64 65 63 46 72 65 65 28 70 50 61 67 65 72  CodecFree(pPager
1c000 2d 3e 70 43 6f 64 65 63 29 3b 0a 23 65 6e 64 69  ->pCodec);.#endi
1c010 66 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 50  f..  assert( !pP
1c020 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
1c030 20 26 26 20 21 70 50 61 67 65 72 2d 3e 70 49 6e   && !pPager->pIn
1c040 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73  Journal );.  ass
1c050 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50 61  ert( !isOpen(pPa
1c060 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 21 69 73  ger->jfd) && !is
1c070 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66  Open(pPager->sjf
1c080 64 29 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33  d) );..  sqlite3
1c090 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20  _free(pPager);. 
1c0a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1c0b0 4b 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e  K;.}..#if !defin
1c0c0 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20 64 65  ed(NDEBUG) || de
1c0d0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
1c0e0 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  T)./*.** Return 
1c0f0 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
1c100 66 6f 72 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f  for page pPg..*/
1c110 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33 50 61 67  .Pgno sqlite3Pag
1c120 65 72 50 61 67 65 6e 75 6d 62 65 72 28 44 62 50  erPagenumber(DbP
1c130 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65 74  age *pPg){.  ret
1c140 75 72 6e 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 7d  urn pPg->pgno;.}
1c150 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49  .#endif../*.** I
1c160 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66  ncrement the ref
1c170 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72  erence count for
1c180 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a 76 6f   page pPg..*/.vo
1c190 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  id sqlite3PagerR
1c1a0 65 66 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  ef(DbPage *pPg){
1c1b0 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
1c1c0 52 65 66 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a  Ref(pPg);.}../*.
1c1d0 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72  ** Sync the jour
1c1e0 6e 61 6c 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f  nal. In other wo
1c1f0 72 64 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 61  rds, make sure a
1c200 6c 6c 20 74 68 65 20 70 61 67 65 73 20 74 68 61  ll the pages tha
1c210 74 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 77  t have.** been w
1c220 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f  ritten to the jo
1c230 75 72 6e 61 6c 20 68 61 76 65 20 61 63 74 75 61  urnal have actua
1c240 6c 6c 79 20 72 65 61 63 68 65 64 20 74 68 65 20  lly reached the 
1c250 73 75 72 66 61 63 65 20 6f 66 20 74 68 65 0a 2a  surface of the.*
1c260 2a 20 64 69 73 6b 20 61 6e 64 20 63 61 6e 20 62  * disk and can b
1c270 65 20 72 65 73 74 6f 72 65 64 20 69 6e 20 74 68  e restored in th
1c280 65 20 65 76 65 6e 74 20 6f 66 20 61 20 68 6f 74  e event of a hot
1c290 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
1c2a0 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  k..**.** If the 
1c2b0 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63 20 66  Pager.needSync f
1c2c0 6c 61 67 20 69 73 20 6e 6f 74 20 73 65 74 2c 20  lag is not set, 
1c2d0 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  then this functi
1c2e0 6f 6e 20 69 73 20 61 0a 2a 2a 20 6e 6f 2d 6f 70  on is a.** no-op
1c2f0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65  . Otherwise, the
1c300 20 61 63 74 69 6f 6e 73 20 72 65 71 75 69 72 65   actions require
1c310 64 20 64 65 70 65 6e 64 20 6f 6e 20 74 68 65 20  d depend on the 
1c320 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 0a 2a 2a 20  journal-mode.** 
1c330 61 6e 64 20 74 68 65 20 64 65 76 69 63 65 20 63  and the device c
1c340 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 6f  haracteristics o
1c350 66 20 74 68 65 20 74 68 65 20 66 69 6c 65 2d 73  f the the file-s
1c360 79 73 74 65 6d 2c 20 61 73 20 66 6f 6c 6c 6f 77  ystem, as follow
1c370 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20  s:.**.**   * If 
1c380 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1c390 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   is an in-memory
1c3a0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6e   journal file, n
1c3b0 6f 20 61 63 74 69 6f 6e 20 6e 65 65 64 0a 2a 2a  o action need.**
1c3c0 20 20 20 20 20 62 65 20 74 61 6b 65 6e 2e 0a 2a       be taken..*
1c3d0 2a 0a 2a 2a 20 20 20 2a 20 4f 74 68 65 72 77 69  *.**   * Otherwi
1c3e0 73 65 2c 20 69 66 20 74 68 65 20 64 65 76 69 63  se, if the devic
1c3f0 65 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f  e does not suppo
1c400 72 74 20 74 68 65 20 53 41 46 45 5f 41 50 50 45  rt the SAFE_APPE
1c410 4e 44 20 70 72 6f 70 65 72 74 79 2c 0a 2a 2a 20  ND property,.** 
1c420 20 20 20 20 74 68 65 6e 20 74 68 65 20 6e 52 65      then the nRe
1c430 63 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 6d  c field of the m
1c440 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 77 72 69  ost recently wri
1c450 74 74 65 6e 20 6a 6f 75 72 6e 61 6c 20 68 65 61  tten journal hea
1c460 64 65 72 0a 2a 2a 20 20 20 20 20 69 73 20 75 70  der.**     is up
1c470 64 61 74 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e  dated to contain
1c480 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6a   the number of j
1c490 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 73 20 74  ournal records t
1c4a0 68 61 74 20 68 61 76 65 0a 2a 2a 20 20 20 20 20  hat have.**     
1c4b0 62 65 65 6e 20 77 72 69 74 74 65 6e 20 66 6f 6c  been written fol
1c4c0 6c 6f 77 69 6e 67 20 69 74 2e 20 49 66 20 74 68  lowing it. If th
1c4d0 65 20 70 61 67 65 72 20 69 73 20 6f 70 65 72 61  e pager is opera
1c4e0 74 69 6e 67 20 69 6e 20 66 75 6c 6c 2d 73 79 6e  ting in full-syn
1c4f0 63 0a 2a 2a 20 20 20 20 20 6d 6f 64 65 2c 20 74  c.**     mode, t
1c500 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
1c510 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64 20 62  file is synced b
1c520 65 66 6f 72 65 20 74 68 69 73 20 66 69 65 6c 64  efore this field
1c530 20 69 73 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a   is updated..**.
1c540 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20 64 65  **   * If the de
1c550 76 69 63 65 20 64 6f 65 73 20 6e 6f 74 20 73 75  vice does not su
1c560 70 70 6f 72 74 20 74 68 65 20 53 45 51 55 45 4e  pport the SEQUEN
1c570 54 49 41 4c 20 70 72 6f 70 65 72 74 79 2c 20 74  TIAL property, t
1c580 68 65 6e 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72  hen .**     jour
1c590 6e 61 6c 20 66 69 6c 65 20 69 73 20 73 79 6e 63  nal file is sync
1c5a0 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 6e  ed..**.** Or, in
1c5b0 20 70 73 65 75 64 6f 2d 63 6f 64 65 3a 0a 2a 2a   pseudo-code:.**
1c5c0 0a 2a 2a 20 20 20 69 66 28 20 4e 4f 54 20 3c 69  .**   if( NOT <i
1c5d0 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c  n-memory journal
1c5e0 3e 20 29 7b 0a 2a 2a 20 20 20 20 20 69 66 28 20  > ){.**     if( 
1c5f0 4e 4f 54 20 53 41 46 45 5f 41 50 50 45 4e 44 20  NOT SAFE_APPEND 
1c600 29 7b 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20  ){.**       if( 
1c610 3c 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 3e  <full-sync mode>
1c620 20 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72 6e 61   ) xSync(<journa
1c630 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20 20  l file>);.**    
1c640 20 20 20 3c 75 70 64 61 74 65 20 6e 52 65 63 20     <update nRec 
1c650 66 69 65 6c 64 3e 0a 2a 2a 20 20 20 20 20 7d 20  field>.**     } 
1c660 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f 54 20  .**     if( NOT 
1c670 53 45 51 55 45 4e 54 49 41 4c 20 29 20 78 53 79  SEQUENTIAL ) xSy
1c680 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  nc(<journal file
1c690 3e 29 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a  >);.**   }.**.**
1c6a0 20 54 68 65 20 50 61 67 65 72 2e 6e 65 65 64 53   The Pager.needS
1c6b0 79 6e 63 20 66 6c 61 67 20 69 73 20 6e 65 76 65  ync flag is neve
1c6c0 72 20 62 65 20 73 65 74 20 66 6f 72 20 74 65 6d  r be set for tem
1c6d0 70 6f 72 61 72 79 20 66 69 6c 65 73 2c 20 6f 72  porary files, or
1c6e0 20 61 6e 79 0a 2a 2a 20 66 69 6c 65 20 6f 70 65   any.** file ope
1c6f0 72 61 74 69 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e  rating in no-syn
1c700 63 20 6d 6f 64 65 20 28 50 61 67 65 72 2e 6e 6f  c mode (Pager.no
1c710 53 79 6e 63 20 73 65 74 20 74 6f 20 6e 6f 6e 2d  Sync set to non-
1c720 7a 65 72 6f 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  zero)..**.** If 
1c730 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68 69 73  successful, this
1c740 20 72 6f 75 74 69 6e 65 20 63 6c 65 61 72 73 20   routine clears 
1c750 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53  the PGHDR_NEED_S
1c760 59 4e 43 20 66 6c 61 67 20 6f 66 20 65 76 65 72  YNC flag of ever
1c770 79 20 0a 2a 2a 20 70 61 67 65 20 63 75 72 72 65  y .** page curre
1c780 6e 74 6c 79 20 68 65 6c 64 20 69 6e 20 6d 65 6d  ntly held in mem
1c790 6f 72 79 20 62 65 66 6f 72 65 20 72 65 74 75 72  ory before retur
1c7a0 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  ning SQLITE_OK. 
1c7b0 49 66 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f  If an IO.** erro
1c7c0 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  r is encountered
1c7d0 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72  , then the IO er
1c7e0 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
1c7f0 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c  rned to the call
1c800 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
1c810 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61  t syncJournal(Pa
1c820 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
1c830 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  if( pPager->need
1c840 53 79 6e 63 20 29 7b 0a 20 20 20 20 61 73 73 65  Sync ){.    asse
1c850 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d  rt( !pPager->tem
1c860 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 69 66 28  pFile );.    if(
1c870 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1c880 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode!=PAGER_JOUR
1c890 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29  NALMODE_MEMORY )
1c8a0 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b 20  {.      int rc; 
1c8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c8d0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
1c8e0 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69       const int i
1c8f0 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  Dc = sqlite3OsDe
1c900 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
1c910 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ics(pPager->fd);
1c920 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
1c930 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
1c940 64 29 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28  d) );..      if(
1c950 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f   0==(iDc&SQLITE_
1c960 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e  IOCAP_SAFE_APPEN
1c970 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  D) ){.        /*
1c980 20 54 68 69 73 20 62 6c 6f 63 6b 20 64 65 61 6c   This block deal
1c990 73 20 77 69 74 68 20 61 6e 20 6f 62 73 63 75 72  s with an obscur
1c9a0 65 20 70 72 6f 62 6c 65 6d 2e 20 49 66 20 74 68  e problem. If th
1c9b0 65 20 6c 61 73 74 20 63 6f 6e 6e 65 63 74 69 6f  e last connectio
1c9c0 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61  n.        ** tha
1c9d0 74 20 77 72 6f 74 65 20 74 6f 20 74 68 69 73 20  t wrote to this 
1c9e0 64 61 74 61 62 61 73 65 20 77 61 73 20 6f 70 65  database was ope
1c9f0 72 61 74 69 6e 67 20 69 6e 20 70 65 72 73 69 73  rating in persis
1ca00 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20  tent-journal.   
1ca10 20 20 20 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68       ** mode, th
1ca20 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
1ca30 69 6c 65 20 6d 61 79 20 61 74 20 74 68 69 73 20  ile may at this 
1ca40 70 6f 69 6e 74 20 61 63 74 75 61 6c 6c 79 20 62  point actually b
1ca50 65 20 6c 61 72 67 65 72 0a 20 20 20 20 20 20 20  e larger.       
1ca60 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 6a   ** than Pager.j
1ca70 6f 75 72 6e 61 6c 4f 66 66 20 62 79 74 65 73 2e  ournalOff bytes.
1ca80 20 49 66 20 74 68 65 20 6e 65 78 74 20 74 68 69   If the next thi
1ca90 6e 67 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ng in the journa
1caa0 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69 6c  l.        ** fil
1cab0 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20  e happens to be 
1cac0 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72  a journal-header
1cad0 20 28 77 72 69 74 74 65 6e 20 61 73 20 70 61 72   (written as par
1cae0 74 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20  t of the.       
1caf0 20 2a 2a 20 70 72 65 76 69 6f 75 73 20 63 6f 6e   ** previous con
1cb00 6e 65 63 74 69 6f 6e 27 73 20 74 72 61 6e 73 61  nection's transa
1cb10 63 74 69 6f 6e 29 2c 20 61 6e 64 20 61 20 63 72  ction), and a cr
1cb20 61 73 68 20 6f 72 20 70 6f 77 65 72 2d 66 61 69  ash or power-fai
1cb30 6c 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a 2a  lure .        **
1cb40 20 6f 63 63 75 72 73 20 61 66 74 65 72 20 6e 52   occurs after nR
1cb50 65 63 20 69 73 20 75 70 64 61 74 65 64 20 62 75  ec is updated bu
1cb60 74 20 62 65 66 6f 72 65 20 74 68 69 73 20 63 6f  t before this co
1cb70 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74 65 73 20  nnection writes 
1cb80 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 79 74  .        ** anyt
1cb90 68 69 6e 67 20 65 6c 73 65 20 74 6f 20 74 68 65  hing else to the
1cba0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f   journal file (o
1cbb0 72 20 63 6f 6d 6d 69 74 73 2f 72 6f 6c 6c 73 20  r commits/rolls 
1cbc0 62 61 63 6b 20 69 74 73 20 0a 20 20 20 20 20 20  back its .      
1cbd0 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
1cbe0 29 2c 20 74 68 65 6e 20 53 51 4c 69 74 65 20 6d  ), then SQLite m
1cbf0 61 79 20 62 65 63 6f 6d 65 20 63 6f 6e 66 75 73  ay become confus
1cc00 65 64 20 77 68 65 6e 20 64 6f 69 6e 67 20 74 68  ed when doing th
1cc10 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 6f  e .        ** ho
1cc20 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
1cc30 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 65 63  ck following rec
1cc40 6f 76 65 72 79 2e 20 49 74 20 6d 61 79 20 72 6f  overy. It may ro
1cc50 6c 6c 20 62 61 63 6b 20 61 6c 6c 0a 20 20 20 20  ll back all.    
1cc60 20 20 20 20 2a 2a 20 6f 66 20 74 68 69 73 20 63      ** of this c
1cc70 6f 6e 6e 65 63 74 69 6f 6e 73 20 64 61 74 61 2c  onnections data,
1cc80 20 74 68 65 6e 20 70 72 6f 63 65 65 64 20 74 6f   then proceed to
1cc90 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 74 68   rolling back th
1cca0 65 20 6f 6c 64 2c 0a 20 20 20 20 20 20 20 20 2a  e old,.        *
1ccb0 2a 20 6f 75 74 2d 6f 66 2d 64 61 74 65 20 64 61  * out-of-date da
1ccc0 74 61 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20  ta that follows 
1ccd0 69 74 2e 20 44 61 74 61 62 61 73 65 20 63 6f 72  it. Database cor
1cce0 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20  ruption..       
1ccf0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54   **.        ** T
1cd00 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68  o work around th
1cd10 69 73 2c 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  is, if the journ
1cd20 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 61 70 70  al file does app
1cd30 65 61 72 20 74 6f 20 63 6f 6e 74 61 69 6e 0a 20  ear to contain. 
1cd40 20 20 20 20 20 20 20 2a 2a 20 61 20 76 61 6c 69         ** a vali
1cd50 64 20 68 65 61 64 65 72 20 66 6f 6c 6c 6f 77 69  d header followi
1cd60 6e 67 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  ng Pager.journal
1cd70 4f 66 66 2c 20 74 68 65 6e 20 77 72 69 74 65 20  Off, then write 
1cd80 61 20 30 78 30 30 0a 20 20 20 20 20 20 20 20 2a  a 0x00.        *
1cd90 2a 20 62 79 74 65 20 74 6f 20 74 68 65 20 73 74  * byte to the st
1cda0 61 72 74 20 6f 66 20 69 74 20 74 6f 20 70 72 65  art of it to pre
1cdb0 76 65 6e 74 20 69 74 20 66 72 6f 6d 20 62 65 69  vent it from bei
1cdc0 6e 67 20 72 65 63 6f 67 6e 69 7a 65 64 2e 0a 20  ng recognized.. 
1cdd0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
1cde0 20 20 2a 2a 20 56 61 72 69 61 62 6c 65 20 69 4e    ** Variable iN
1cdf0 65 78 74 48 64 72 4f 66 66 73 65 74 20 69 73 20  extHdrOffset is 
1ce00 73 65 74 20 74 6f 20 74 68 65 20 6f 66 66 73 65  set to the offse
1ce10 74 20 61 74 20 77 68 69 63 68 20 74 68 69 73 0a  t at which this.
1ce20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 62 6c          ** probl
1ce30 65 6d 61 74 69 63 20 68 65 61 64 65 72 20 77 69  ematic header wi
1ce40 6c 6c 20 6f 63 63 75 72 2c 20 69 66 20 69 74 20  ll occur, if it 
1ce50 65 78 69 73 74 73 2e 20 61 4d 61 67 69 63 20 69  exists. aMagic i
1ce60 73 20 75 73 65 64 20 0a 20 20 20 20 20 20 20 20  s used .        
1ce70 2a 2a 20 61 73 20 61 20 74 65 6d 70 6f 72 61 72  ** as a temporar
1ce80 79 20 62 75 66 66 65 72 20 74 6f 20 69 6e 73 70  y buffer to insp
1ce90 65 63 74 20 74 68 65 20 66 69 72 73 74 20 63 6f  ect the first co
1cea0 75 70 6c 65 20 6f 66 20 62 79 74 65 73 20 6f 66  uple of bytes of
1ceb0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
1cec0 70 6f 74 65 6e 74 69 61 6c 20 6a 6f 75 72 6e 61  potential journa
1ced0 6c 20 68 65 61 64 65 72 2e 0a 20 20 20 20 20 20  l header..      
1cee0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 36 34    */.        i64
1cef0 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 3b   iNextHdrOffset;
1cf00 0a 20 20 20 20 20 20 20 20 75 38 20 61 4d 61 67  .        u8 aMag
1cf10 69 63 5b 38 5d 3b 0a 20 20 20 20 20 20 20 20 75  ic[8];.        u
1cf20 38 20 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  8 zHeader[sizeof
1cf30 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
1cf40 34 5d 3b 0a 0a 20 20 20 20 20 20 20 20 6d 65 6d  4];..        mem
1cf50 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f  cpy(zHeader, aJo
1cf60 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65  urnalMagic, size
1cf70 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
1cf80 29 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 33  ));.        put3
1cf90 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
1cfa0 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
1cfb0 67 69 63 29 5d 2c 20 70 50 61 67 65 72 2d 3e 6e  gic)], pPager->n
1cfc0 52 65 63 29 3b 0a 0a 20 20 20 20 20 20 20 20 69  Rec);..        i
1cfd0 4e 65 78 74 48 64 72 4f 66 66 73 65 74 20 3d 20  NextHdrOffset = 
1cfe0 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74  journalHdrOffset
1cff0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
1d000 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1d010 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64  Read(pPager->jfd
1d020 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 69 4e 65  , aMagic, 8, iNe
1d030 78 74 48 64 72 4f 66 66 73 65 74 29 3b 0a 20 20  xtHdrOffset);.  
1d040 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1d050 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 6d 65  LITE_OK && 0==me
1d060 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f  mcmp(aMagic, aJo
1d070 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 20 29  urnalMagic, 8) )
1d080 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 61 74  {.          stat
1d090 69 63 20 63 6f 6e 73 74 20 75 38 20 7a 65 72 6f  ic const u8 zero
1d0a0 62 79 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  byte = 0;.      
1d0b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1d0c0 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
1d0d0 6a 66 64 2c 20 26 7a 65 72 6f 62 79 74 65 2c 20  jfd, &zerobyte, 
1d0e0 31 2c 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65  1, iNextHdrOffse
1d0f0 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
1d100 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1d110 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53  LITE_OK && rc!=S
1d120 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
1d130 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20  T_READ ){.      
1d140 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1d150 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
1d160 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e    /* Write the n
1d170 52 65 63 20 76 61 6c 75 65 20 69 6e 74 6f 20 74  Rec value into t
1d180 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1d190 68 65 61 64 65 72 2e 20 49 66 20 69 6e 0a 20 20  header. If in.  
1d1a0 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c 2d 73 79        ** full-sy
1d1b0 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20  nchronous mode, 
1d1c0 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
1d1d0 20 66 69 72 73 74 2e 20 54 68 69 73 20 65 6e 73   first. This ens
1d1e0 75 72 65 73 20 74 68 61 74 0a 20 20 20 20 20 20  ures that.      
1d1f0 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61 20 68 61    ** all data ha
1d200 73 20 72 65 61 6c 6c 79 20 68 69 74 20 74 68 65  s really hit the
1d210 20 64 69 73 6b 20 62 65 66 6f 72 65 20 6e 52 65   disk before nRe
1d220 63 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20  c is updated to 
1d230 6d 61 72 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20  mark.        ** 
1d240 69 74 20 61 73 20 61 20 63 61 6e 64 69 64 61 74  it as a candidat
1d250 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e 0a  e for rollback..
1d260 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
1d270 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f     ** This is no
1d280 74 20 72 65 71 75 69 72 65 64 20 69 66 20 74 68  t required if th
1d290 65 20 70 65 72 73 69 73 74 65 6e 74 20 6d 65 64  e persistent med
1d2a0 69 61 20 73 75 70 70 6f 72 74 73 20 74 68 65 0a  ia supports the.
1d2b0 20 20 20 20 20 20 20 20 2a 2a 20 53 41 46 45 5f          ** SAFE_
1d2c0 41 50 50 45 4e 44 20 70 72 6f 70 65 72 74 79 2e  APPEND property.
1d2d0 20 42 65 63 61 75 73 65 20 69 6e 20 74 68 69 73   Because in this
1d2e0 20 63 61 73 65 20 69 74 20 69 73 20 6e 6f 74 20   case it is not 
1d2f0 70 6f 73 73 69 62 6c 65 20 0a 20 20 20 20 20 20  possible .      
1d300 20 20 2a 2a 20 66 6f 72 20 67 61 72 62 61 67 65    ** for garbage
1d310 20 64 61 74 61 20 74 6f 20 62 65 20 61 70 70 65   data to be appe
1d320 6e 64 65 64 20 74 6f 20 74 68 65 20 66 69 6c 65  nded to the file
1d330 2c 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  , the nRec field
1d340 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 70  .        ** is p
1d350 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 30 78  opulated with 0x
1d360 46 46 46 46 46 46 46 46 20 77 68 65 6e 20 74 68  FFFFFFFF when th
1d370 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
1d380 20 69 73 20 77 72 69 74 74 65 6e 0a 20 20 20 20   is written.    
1d390 20 20 20 20 2a 2a 20 61 6e 64 20 6e 65 76 65 72      ** and never
1d3a0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70 64   needs to be upd
1d3b0 61 74 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ated..        */
1d3c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
1d3d0 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26 26  ger->fullSync &&
1d3e0 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f   0==(iDc&SQLITE_
1d3f0 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c  IOCAP_SEQUENTIAL
1d400 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50  ) ){.          P
1d410 41 47 45 52 54 52 41 43 45 28 28 22 53 59 4e 43  AGERTRACE(("SYNC
1d420 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e   journal of %d\n
1d430 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
1d440 72 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  r)));.          
1d450 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20  IOTRACE(("JSYNC 
1d460 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %p\n", pPager)).
1d470 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
1d480 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
1d490 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
1d4a0 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20  ->sync_flags);. 
1d4b0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
1d4c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
1d4d0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
1d4e0 7d 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43  }.        IOTRAC
1d4f0 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64  E(("JHDR %p %lld
1d500 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61  \n", pPager, pPa
1d510 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29  ger->journalHdr)
1d520 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
1d530 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 0a  sqlite3OsWrite(.
1d540 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67              pPag
1d550 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72  er->jfd, zHeader
1d560 2c 20 73 69 7a 65 6f 66 28 7a 48 65 61 64 65 72  , sizeof(zHeader
1d570 29 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  ), pPager->journ
1d580 61 6c 48 64 72 0a 20 20 20 20 20 20 20 20 29 3b  alHdr.        );
1d590 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
1d5a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
1d5b0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
1d5c0 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44        if( 0==(iD
1d5d0 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  c&SQLITE_IOCAP_S
1d5e0 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20  EQUENTIAL) ){.  
1d5f0 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
1d600 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20  (("SYNC journal 
1d610 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  of %d\n", PAGERI
1d620 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20  D(pPager)));.   
1d630 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a       IOTRACE(("J
1d640 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67  SYNC %p\n", pPag
1d650 65 72 29 29 0a 20 20 20 20 20 20 20 20 72 63 20  er)).        rc 
1d660 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
1d670 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
1d680 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 7c  ger->sync_flags|
1d690 20 0a 20 20 20 20 20 20 20 20 20 20 28 70 50 61   .          (pPa
1d6a0 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 3d  ger->sync_flags=
1d6b0 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c  =SQLITE_SYNC_FUL
1d6c0 4c 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41  L?SQLITE_SYNC_DA
1d6d0 54 41 4f 4e 4c 59 3a 30 29 0a 20 20 20 20 20 20  TAONLY:0).      
1d6e0 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28    );.        if(
1d6f0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1d700 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1d710 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
1d720 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
1d730 6c 65 20 77 61 73 20 6a 75 73 74 20 73 75 63 63  le was just succ
1d740 65 73 73 66 75 6c 6c 79 20 73 79 6e 63 65 64 2e  essfully synced.
1d750 20 53 65 74 20 50 61 67 65 72 2e 6e 65 65 64 53   Set Pager.needS
1d760 79 6e 63 20 0a 20 20 20 20 2a 2a 20 74 6f 20 7a  ync .    ** to z
1d770 65 72 6f 20 61 6e 64 20 63 6c 65 61 72 20 74 68  ero and clear th
1d780 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  e PGHDR_NEED_SYN
1d790 43 20 66 6c 61 67 20 6f 6e 20 61 6c 6c 20 70 61  C flag on all pa
1d7a0 67 65 73 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  gess..    */.   
1d7b0 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
1d7c0 63 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  c = 0;.    pPage
1d7d0 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  r->journalStarte
1d7e0 64 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65  d = 1;.    pPage
1d7f0 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20  r->journalHdr = 
1d800 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1d810 66 66 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  ff;.    sqlite3P
1d820 63 61 63 68 65 43 6c 65 61 72 53 79 6e 63 46 6c  cacheClearSyncFl
1d830 61 67 73 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ags(pPager->pPCa
1d840 63 68 65 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  che);.  }..  ret
1d850 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1d860 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75  ../*.** The argu
1d870 6d 65 6e 74 20 69 73 20 74 68 65 20 66 69 72 73  ment is the firs
1d880 74 20 69 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69  t in a linked li
1d890 73 74 20 6f 66 20 64 69 72 74 79 20 70 61 67 65  st of dirty page
1d8a0 73 20 63 6f 6e 6e 65 63 74 65 64 0a 2a 2a 20 62  s connected.** b
1d8b0 79 20 74 68 65 20 50 67 48 64 72 2e 70 44 69 72  y the PgHdr.pDir
1d8c0 74 79 20 70 6f 69 6e 74 65 72 2e 20 54 68 69 73  ty pointer. This
1d8d0 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 73   function writes
1d8e0 20 65 61 63 68 20 6f 6e 65 20 6f 66 20 74 68 65   each one of the
1d8f0 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  .** in-memory pa
1d900 67 65 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20  ges in the list 
1d910 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
1d920 66 69 6c 65 2e 20 54 68 65 20 61 72 67 75 6d 65  file. The argume
1d930 6e 74 20 6d 61 79 0a 2a 2a 20 62 65 20 4e 55 4c  nt may.** be NUL
1d940 4c 2c 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20  L, representing 
1d950 61 6e 20 65 6d 70 74 79 20 6c 69 73 74 2e 20 49  an empty list. I
1d960 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 69 73  n this case this
1d970 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20   function is.** 
1d980 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54  a no-op..**.** T
1d990 68 65 20 70 61 67 65 72 20 6d 75 73 74 20 68 6f  he pager must ho
1d9a0 6c 64 20 61 74 20 6c 65 61 73 74 20 61 20 52 45  ld at least a RE
1d9b0 53 45 52 56 45 44 20 6c 6f 63 6b 20 77 68 65 6e  SERVED lock when
1d9c0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
1d9d0 2a 20 69 73 20 63 61 6c 6c 65 64 2e 20 42 65 66  * is called. Bef
1d9e0 6f 72 65 20 77 72 69 74 69 6e 67 20 61 6e 79 74  ore writing anyt
1d9f0 68 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61  hing to the data
1da00 62 61 73 65 20 66 69 6c 65 2c 20 74 68 69 73 20  base file, this 
1da10 6c 6f 63 6b 0a 2a 2a 20 69 73 20 75 70 67 72 61  lock.** is upgra
1da20 64 65 64 20 74 6f 20 61 6e 20 45 58 43 4c 55 53  ded to an EXCLUS
1da30 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 74 68 65  IVE lock. If the
1da40 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62 65 20   lock cannot be 
1da50 6f 62 74 61 69 6e 65 64 2c 0a 2a 2a 20 53 51 4c  obtained,.** SQL
1da60 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75  ITE_BUSY is retu
1da70 72 6e 65 64 20 61 6e 64 20 6e 6f 20 64 61 74 61  rned and no data
1da80 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74   is written to t
1da90 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1daa0 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20  ..** .** If the 
1dab0 70 61 67 65 72 20 69 73 20 61 20 74 65 6d 70 2d  pager is a temp-
1dac0 66 69 6c 65 20 70 61 67 65 72 20 61 6e 64 20 74  file pager and t
1dad0 68 65 20 61 63 74 75 61 6c 20 66 69 6c 65 2d 73  he actual file-s
1dae0 79 73 74 65 6d 20 66 69 6c 65 0a 2a 2a 20 69 73  ystem file.** is
1daf0 20 6e 6f 74 20 79 65 74 20 6f 70 65 6e 2c 20 69   not yet open, i
1db00 74 20 69 73 20 63 72 65 61 74 65 64 20 61 6e 64  t is created and
1db10 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20 61   opened before a
1db20 6e 79 20 64 61 74 61 20 69 73 20 0a 2a 2a 20 77  ny data is .** w
1db30 72 69 74 74 65 6e 20 6f 75 74 2e 0a 2a 2a 0a 2a  ritten out..**.*
1db40 2a 20 4f 6e 63 65 20 74 68 65 20 6c 6f 63 6b 20  * Once the lock 
1db50 68 61 73 20 62 65 65 6e 20 75 70 67 72 61 64 65  has been upgrade
1db60 64 20 61 6e 64 2c 20 69 66 20 6e 65 63 65 73 73  d and, if necess
1db70 61 72 79 2c 20 74 68 65 20 66 69 6c 65 20 6f 70  ary, the file op
1db80 65 6e 65 64 2c 0a 2a 2a 20 74 68 65 20 70 61 67  ened,.** the pag
1db90 65 73 20 61 72 65 20 77 72 69 74 74 65 6e 20 6f  es are written o
1dba0 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ut to the databa
1dbb0 73 65 20 66 69 6c 65 20 69 6e 20 6c 69 73 74 20  se file in list 
1dbc0 6f 72 64 65 72 2e 20 57 72 69 74 69 6e 67 0a 2a  order. Writing.*
1dbd0 2a 20 61 20 70 61 67 65 20 69 73 20 73 6b 69 70  * a page is skip
1dbe0 70 65 64 20 69 66 20 69 74 20 6d 65 65 74 73 20  ped if it meets 
1dbf0 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 66 6f  either of the fo
1dc00 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65 72 69 61  llowing criteria
1dc10 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20  :.**.**   * The 
1dc20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 67  page number is g
1dc30 72 65 61 74 65 72 20 74 68 61 6e 20 50 61 67 65  reater than Page
1dc40 72 2e 64 62 53 69 7a 65 2c 20 6f 72 0a 2a 2a 20  r.dbSize, or.** 
1dc50 20 20 2a 20 54 68 65 20 50 47 48 44 52 5f 44 4f    * The PGHDR_DO
1dc60 4e 54 5f 57 52 49 54 45 20 66 6c 61 67 20 69 73  NT_WRITE flag is
1dc70 20 73 65 74 20 6f 6e 20 74 68 65 20 70 61 67 65   set on the page
1dc80 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 69 74 69  ..**.** If writi
1dc90 6e 67 20 6f 75 74 20 61 20 70 61 67 65 20 63 61  ng out a page ca
1dca0 75 73 65 73 20 74 68 65 20 64 61 74 61 62 61 73  uses the databas
1dcb0 65 20 66 69 6c 65 20 74 6f 20 67 72 6f 77 2c 20  e file to grow, 
1dcc0 50 61 67 65 72 2e 64 62 46 69 6c 65 53 69 7a 65  Pager.dbFileSize
1dcd0 0a 2a 2a 20 69 73 20 75 70 64 61 74 65 64 20 61  .** is updated a
1dce0 63 63 6f 72 64 69 6e 67 6c 79 2e 20 49 66 20 70  ccordingly. If p
1dcf0 61 67 65 20 31 20 69 73 20 77 72 69 74 74 65 6e  age 1 is written
1dd00 20 6f 75 74 2c 20 74 68 65 6e 20 74 68 65 20 76   out, then the v
1dd10 61 6c 75 65 20 63 61 63 68 65 64 0a 2a 2a 20 69  alue cached.** i
1dd20 6e 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65  n Pager.dbFileVe
1dd30 72 73 5b 5d 20 69 73 20 75 70 64 61 74 65 64 20  rs[] is updated 
1dd40 74 6f 20 6d 61 74 63 68 20 74 68 65 20 6e 65 77  to match the new
1dd50 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e   value stored in
1dd60 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
1dd70 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   file..**.** If 
1dd80 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75  everything is su
1dd90 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45  ccessful, SQLITE
1dda0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
1ddb0 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
1ddc0 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 61 6e 20 49  .** occurs, an I
1ddd0 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  O error code is 
1dde0 72 65 74 75 72 6e 65 64 2e 20 4f 72 2c 20 69 66  returned. Or, if
1ddf0 20 74 68 65 20 45 58 43 4c 55 53 49 56 45 20 6c   the EXCLUSIVE l
1de00 6f 63 6b 20 63 61 6e 6e 6f 74 0a 2a 2a 20 62 65  ock cannot.** be
1de10 20 6f 62 74 61 69 6e 65 64 2c 20 53 51 4c 49 54   obtained, SQLIT
1de20 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e  E_BUSY is return
1de30 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
1de40 74 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61  t pager_write_pa
1de50 67 65 6c 69 73 74 28 50 67 48 64 72 20 2a 70 4c  gelist(PgHdr *pL
1de60 69 73 74 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  ist){.  Pager *p
1de70 50 61 67 65 72 3b 20 20 20 20 20 20 20 20 20 20  Pager;          
1de80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1de90 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  Pager object */.
1dea0 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
1deb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dec0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
1ded0 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 69 66 28 20   code */..  if( 
1dee0 4e 45 56 45 52 28 70 4c 69 73 74 3d 3d 30 29 20  NEVER(pList==0) 
1def0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
1df00 4f 4b 3b 0a 20 20 70 50 61 67 65 72 20 3d 20 70  OK;.  pPager = p
1df10 4c 69 73 74 2d 3e 70 50 61 67 65 72 3b 0a 0a 20  List->pPager;.. 
1df20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
1df30 74 20 74 68 65 72 65 20 6d 61 79 20 62 65 20 65  t there may be e
1df40 69 74 68 65 72 20 61 20 52 45 53 45 52 56 45 44  ither a RESERVED
1df50 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   or EXCLUSIVE lo
1df60 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64  ck on the.  ** d
1df70 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
1df80 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64   there is alread
1df90 79 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  y an EXCLUSIVE l
1dfa0 6f 63 6b 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ock, the followi
1dfb0 6e 67 0a 20 20 2a 2a 20 63 61 6c 6c 20 69 73 20  ng.  ** call is 
1dfc0 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2a 0a 20 20  a no-op..  **.  
1dfd0 2a 2a 20 4d 6f 76 69 6e 67 20 74 68 65 20 6c 6f  ** Moving the lo
1dfe0 63 6b 20 66 72 6f 6d 20 52 45 53 45 52 56 45 44  ck from RESERVED
1dff0 20 74 6f 20 45 58 43 4c 55 53 49 56 45 20 61 63   to EXCLUSIVE ac
1e000 74 75 61 6c 6c 79 20 69 6e 76 6f 6c 76 65 73 20  tually involves 
1e010 67 6f 69 6e 67 0a 20 20 2a 2a 20 74 68 72 6f 75  going.  ** throu
1e020 67 68 20 61 6e 20 69 6e 74 65 72 6d 65 64 69 61  gh an intermedia
1e030 74 65 20 73 74 61 74 65 20 50 45 4e 44 49 4e 47  te state PENDING
1e040 2e 20 20 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f  .   A PENDING lo
1e050 63 6b 20 70 72 65 76 65 6e 74 73 20 6e 65 77 0a  ck prevents new.
1e060 20 20 2a 2a 20 72 65 61 64 65 72 73 20 66 72 6f    ** readers fro
1e070 6d 20 61 74 74 61 63 68 69 6e 67 20 74 6f 20 74  m attaching to t
1e080 68 65 20 64 61 74 61 62 61 73 65 20 62 75 74 20  he database but 
1e090 69 73 20 75 6e 73 75 66 66 69 63 69 65 6e 74 20  is unsufficient 
1e0a0 66 6f 72 20 75 73 20 74 6f 0a 20 20 2a 2a 20 77  for us to.  ** w
1e0b0 72 69 74 65 2e 20 20 54 68 65 20 69 64 65 61 20  rite.  The idea 
1e0c0 6f 66 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63  of a PENDING loc
1e0d0 6b 20 69 73 20 74 6f 20 70 72 65 76 65 6e 74 20  k is to prevent 
1e0e0 6e 65 77 20 72 65 61 64 65 72 73 20 66 72 6f 6d  new readers from
1e0f0 0a 20 20 2a 2a 20 63 6f 6d 69 6e 67 20 69 6e 20  .  ** coming in 
1e100 77 68 69 6c 65 20 77 65 20 77 61 69 74 20 66 6f  while we wait fo
1e110 72 20 65 78 69 73 74 69 6e 67 20 72 65 61 64 65  r existing reade
1e120 72 73 20 74 6f 20 63 6c 65 61 72 2e 0a 20 20 2a  rs to clear..  *
1e130 2a 0a 20 20 2a 2a 20 57 68 69 6c 65 20 74 68 65  *.  ** While the
1e140 20 70 61 67 65 72 20 69 73 20 69 6e 20 74 68 65   pager is in the
1e150 20 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2c   RESERVED state,
1e160 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
1e170 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20 2a 2a  tabase file.  **
1e180 20 69 73 20 75 6e 63 68 61 6e 67 65 64 20 61 6e   is unchanged an
1e190 64 20 77 65 20 63 61 6e 20 72 6f 6c 6c 62 61 63  d we can rollbac
1e1a0 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67  k without having
1e1b0 20 74 6f 20 70 6c 61 79 62 61 63 6b 20 74 68 65   to playback the
1e1c0 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 6e  .  ** journal in
1e1d0 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  to the original 
1e1e0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
1e1f0 4f 6e 63 65 20 77 65 20 74 72 61 6e 73 69 74 69  Once we transiti
1e200 6f 6e 20 74 6f 0a 20 20 2a 2a 20 45 58 43 4c 55  on to.  ** EXCLU
1e210 53 49 56 45 2c 20 69 74 20 6d 65 61 6e 73 20 74  SIVE, it means t
1e220 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1e230 20 68 61 73 20 62 65 65 6e 20 63 68 61 6e 67 65   has been change
1e240 64 20 61 6e 64 20 61 6e 79 20 72 6f 6c 6c 62 61  d and any rollba
1e250 63 6b 0a 20 20 2a 2a 20 77 69 6c 6c 20 72 65 71  ck.  ** will req
1e260 75 69 72 65 20 61 20 6a 6f 75 72 6e 61 6c 20 70  uire a journal p
1e270 6c 61 79 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20  layback..  */.  
1e280 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73  assert( !pagerUs
1e290 65 4c 6f 67 28 70 4c 69 73 74 2d 3e 70 50 61 67  eLog(pList->pPag
1e2a0 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  er) );.  assert(
1e2b0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
1e2c0 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
1e2d0 3b 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77  ;.  rc = pager_w
1e2e0 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67  ait_on_lock(pPag
1e2f0 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  er, EXCLUSIVE_LO
1e300 43 4b 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  CK);..  /* If th
1e310 65 20 66 69 6c 65 20 69 73 20 61 20 74 65 6d 70  e file is a temp
1e320 2d 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 79 65  -file has not ye
1e330 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f  t been opened, o
1e340 70 65 6e 20 69 74 20 6e 6f 77 2e 20 49 74 0a 20  pen it now. It. 
1e350 20 2a 2a 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   ** is not possi
1e360 62 6c 65 20 66 6f 72 20 72 63 20 74 6f 20 62 65  ble for rc to be
1e370 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49   other than SQLI
1e380 54 45 5f 4f 4b 20 69 66 20 74 68 69 73 20 62 72  TE_OK if this br
1e390 61 6e 63 68 0a 20 20 2a 2a 20 69 73 20 74 61 6b  anch.  ** is tak
1e3a0 65 6e 2c 20 61 73 20 70 61 67 65 72 5f 77 61 69  en, as pager_wai
1e3b0 74 5f 6f 6e 5f 6c 6f 63 6b 28 29 20 69 73 20 61  t_on_lock() is a
1e3c0 20 6e 6f 2d 6f 70 20 66 6f 72 20 74 65 6d 70 2d   no-op for temp-
1e3d0 66 69 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  files..  */.  if
1e3e0 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  ( !isOpen(pPager
1e3f0 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73  ->fd) ){.    ass
1e400 65 72 74 28 20 70 50 61 67 65 72 2d 3e 74 65 6d  ert( pPager->tem
1e410 70 46 69 6c 65 20 26 26 20 72 63 3d 3d 53 51 4c  pFile && rc==SQL
1e420 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 72 63  ITE_OK );.    rc
1e430 20 3d 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70   = pagerOpentemp
1e440 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d  (pPager, pPager-
1e450 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 76 66 73  >fd, pPager->vfs
1e460 46 6c 61 67 73 29 3b 0a 20 20 7d 0a 0a 20 20 77  Flags);.  }..  w
1e470 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
1e480 5f 4f 4b 20 26 26 20 70 4c 69 73 74 20 29 7b 0a  _OK && pList ){.
1e490 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20      Pgno pgno = 
1e4a0 70 4c 69 73 74 2d 3e 70 67 6e 6f 3b 0a 0a 20 20  pList->pgno;..  
1e4b0 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
1e4c0 65 20 64 69 72 74 79 20 70 61 67 65 73 20 69 6e  e dirty pages in
1e4d0 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 20   the page cache 
1e4e0 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72  with page number
1e4f0 73 20 67 72 65 61 74 65 72 0a 20 20 20 20 2a 2a  s greater.    **
1e500 20 74 68 61 6e 20 50 61 67 65 72 2e 64 62 53 69   than Pager.dbSi
1e510 7a 65 2c 20 74 68 69 73 20 6d 65 61 6e 73 20 73  ze, this means s
1e520 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63  qlite3PagerTrunc
1e530 61 74 65 49 6d 61 67 65 28 29 20 77 61 73 20 63  ateImage() was c
1e540 61 6c 6c 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20  alled to.    ** 
1e550 6d 61 6b 65 20 74 68 65 20 66 69 6c 65 20 73 6d  make the file sm
1e560 61 6c 6c 65 72 20 28 70 72 65 73 75 6d 61 62 6c  aller (presumabl
1e570 79 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d  y by auto-vacuum
1e580 20 63 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20 77   code). Do not w
1e590 72 69 74 65 0a 20 20 20 20 2a 2a 20 61 6e 79 20  rite.    ** any 
1e5a0 73 75 63 68 20 70 61 67 65 73 20 74 6f 20 74 68  such pages to th
1e5b0 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20  e file..    **. 
1e5c0 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 64 6f 20 6e     ** Also, do n
1e5d0 6f 74 20 77 72 69 74 65 20 6f 75 74 20 61 6e 79  ot write out any
1e5e0 20 70 61 67 65 20 74 68 61 74 20 68 61 73 20 74   page that has t
1e5f0 68 65 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52  he PGHDR_DONT_WR
1e600 49 54 45 20 66 6c 61 67 0a 20 20 20 20 2a 2a 20  ITE flag.    ** 
1e610 73 65 74 20 28 73 65 74 20 62 79 20 73 71 6c 69  set (set by sqli
1e620 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74  te3PagerDontWrit
1e630 65 28 29 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  e())..    */.   
1e640 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67 65   if( pgno<=pPage
1e650 72 2d 3e 64 62 53 69 7a 65 20 26 26 20 30 3d 3d  r->dbSize && 0==
1e660 28 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26 50 47  (pList->flags&PG
1e670 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 29 20  HDR_DONT_WRITE) 
1e680 29 7b 0a 20 20 20 20 20 20 69 36 34 20 6f 66 66  ){.      i64 off
1e690 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28  set = (pgno-1)*(
1e6a0 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65  i64)pPager->page
1e6b0 53 69 7a 65 3b 20 20 20 2f 2a 20 4f 66 66 73 65  Size;   /* Offse
1e6c0 74 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20  t to write */.  
1e6d0 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 3b      char *pData;
1e6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e700 20 20 20 2f 2a 20 44 61 74 61 20 74 6f 20 77 72     /* Data to wr
1e710 69 74 65 20 2a 2f 20 20 20 20 0a 0a 20 20 20 20  ite */    ..    
1e720 20 20 2f 2a 20 45 6e 63 6f 64 65 20 74 68 65 20    /* Encode the 
1e730 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20 20  database */.    
1e740 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c    CODEC2(pPager,
1e750 20 70 4c 69 73 74 2d 3e 70 44 61 74 61 2c 20 70   pList->pData, p
1e760 67 6e 6f 2c 20 36 2c 20 72 65 74 75 72 6e 20 53  gno, 6, return S
1e770 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61  QLITE_NOMEM, pDa
1e780 74 61 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57  ta);..      /* W
1e790 72 69 74 65 20 6f 75 74 20 74 68 65 20 70 61 67  rite out the pag
1e7a0 65 20 64 61 74 61 2e 20 2a 2f 0a 20 20 20 20 20  e data. */.     
1e7b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
1e7c0 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  rite(pPager->fd,
1e7d0 20 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e   pData, pPager->
1e7e0 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74  pageSize, offset
1e7f0 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  );..      /* If 
1e800 70 61 67 65 20 31 20 77 61 73 20 6a 75 73 74 20  page 1 was just 
1e810 77 72 69 74 74 65 6e 2c 20 75 70 64 61 74 65 20  written, update 
1e820 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73  Pager.dbFileVers
1e830 20 74 6f 20 6d 61 74 63 68 0a 20 20 20 20 20 20   to match.      
1e840 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6e 6f 77  ** the value now
1e850 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 64   stored in the d
1e860 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
1e870 20 77 72 69 74 69 6e 67 20 74 68 69 73 20 0a 20   writing this . 
1e880 20 20 20 20 20 2a 2a 20 70 61 67 65 20 63 61 75       ** page cau
1e890 73 65 64 20 74 68 65 20 64 61 74 61 62 61 73 65  sed the database
1e8a0 20 66 69 6c 65 20 74 6f 20 67 72 6f 77 2c 20 75   file to grow, u
1e8b0 70 64 61 74 65 20 64 62 46 69 6c 65 53 69 7a 65  pdate dbFileSize
1e8c0 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  . .      */.    
1e8d0 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b    if( pgno==1 ){
1e8e0 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
1e8f0 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  &pPager->dbFileV
1e900 65 72 73 2c 20 26 70 44 61 74 61 5b 32 34 5d 2c  ers, &pData[24],
1e910 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e   sizeof(pPager->
1e920 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20  dbFileVers));.  
1e930 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1e940 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46  pgno>pPager->dbF
1e950 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  ileSize ){.     
1e960 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c     pPager->dbFil
1e970 65 53 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20 20  eSize = pgno;.  
1e980 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
1e990 55 70 64 61 74 65 20 61 6e 79 20 62 61 63 6b 75  Update any backu
1e9a0 70 20 6f 62 6a 65 63 74 73 20 63 6f 70 79 69 6e  p objects copyin
1e9b0 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  g the contents o
1e9c0 66 20 74 68 69 73 20 70 61 67 65 72 2e 20 2a 2f  f this pager. */
1e9d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 61  .      sqlite3Ba
1e9e0 63 6b 75 70 55 70 64 61 74 65 28 70 50 61 67 65  ckupUpdate(pPage
1e9f0 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f  r->pBackup, pgno
1ea00 2c 20 28 75 38 2a 29 70 4c 69 73 74 2d 3e 70 44  , (u8*)pList->pD
1ea10 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 50 41 47  ata);..      PAG
1ea20 45 52 54 52 41 43 45 28 28 22 53 54 4f 52 45 20  ERTRACE(("STORE 
1ea30 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28  %d page %d hash(
1ea40 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20  %08x)\n",.      
1ea50 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47               PAG
1ea60 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67  ERID(pPager), pg
1ea70 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61  no, pager_pageha
1ea80 73 68 28 70 4c 69 73 74 29 29 29 3b 0a 20 20 20  sh(pList)));.   
1ea90 20 20 20 49 4f 54 52 41 43 45 28 28 22 50 47 4f     IOTRACE(("PGO
1eaa0 55 54 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  UT %p %d\n", pPa
1eab0 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20  ger, pgno));.   
1eac0 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71     PAGER_INCR(sq
1ead0 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74  lite3_pager_writ
1eae0 65 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20  edb_count);.    
1eaf0 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61    PAGER_INCR(pPa
1eb00 67 65 72 2d 3e 6e 57 72 69 74 65 29 3b 0a 20 20  ger->nWrite);.  
1eb10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 50    }else{.      P
1eb20 41 47 45 52 54 52 41 43 45 28 28 22 4e 4f 53 54  AGERTRACE(("NOST
1eb30 4f 52 45 20 25 64 20 70 61 67 65 20 25 64 5c 6e  ORE %d page %d\n
1eb40 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
1eb50 72 29 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20  r), pgno));.    
1eb60 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
1eb70 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20  CHECK_PAGES.    
1eb80 70 4c 69 73 74 2d 3e 70 61 67 65 48 61 73 68 20  pList->pageHash 
1eb90 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  = pager_pagehash
1eba0 28 70 4c 69 73 74 29 3b 0a 23 65 6e 64 69 66 0a  (pList);.#endif.
1ebb0 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4c 69 73      pList = pLis
1ebc0 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d 0a 0a  t->pDirty;.  }..
1ebd0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1ebe0 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 72  /*.** Append a r
1ebf0 65 63 6f 72 64 20 6f 66 20 74 68 65 20 63 75 72  ecord of the cur
1ec00 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20 70 61  rent state of pa
1ec10 67 65 20 70 50 67 20 74 6f 20 74 68 65 20 73 75  ge pPg to the su
1ec20 62 2d 6a 6f 75 72 6e 61 6c 2e 20 0a 2a 2a 20 49  b-journal. .** I
1ec30 74 20 69 73 20 74 68 65 20 63 61 6c 6c 65 72 73  t is the callers
1ec40 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
1ec50 74 6f 20 75 73 65 20 73 75 62 6a 52 65 71 75 69  to use subjRequi
1ec60 72 65 73 50 61 67 65 28 29 20 74 6f 20 63 68 65  resPage() to che
1ec70 63 6b 20 0a 2a 2a 20 74 68 61 74 20 69 74 20 69  ck .** that it i
1ec80 73 20 72 65 61 6c 6c 79 20 72 65 71 75 69 72 65  s really require
1ec90 64 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67  d before calling
1eca0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
1ecb0 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
1ecc0 66 75 6c 2c 20 73 65 74 20 74 68 65 20 62 69 74  ful, set the bit
1ecd0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
1ece0 6f 20 70 50 67 2d 3e 70 67 6e 6f 20 69 6e 20 74  o pPg->pgno in t
1ecf0 68 65 20 62 69 74 76 65 63 73 0a 2a 2a 20 66 6f  he bitvecs.** fo
1ed00 72 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70  r all open savep
1ed10 6f 69 6e 74 73 20 62 65 66 6f 72 65 20 72 65 74  oints before ret
1ed20 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  urning..**.** Th
1ed30 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
1ed40 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  rns SQLITE_OK if
1ed50 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73   everything is s
1ed60 75 63 63 65 73 73 66 75 6c 2c 20 61 6e 20 49 4f  uccessful, an IO
1ed70 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69  .** error code i
1ed80 66 20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f  f the attempt to
1ed90 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 73 75   write to the su
1eda0 62 2d 6a 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c  b-journal fails,
1edb0 20 6f 72 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e   or .** SQLITE_N
1edc0 4f 4d 45 4d 20 69 66 20 61 20 6d 61 6c 6c 6f 63  OMEM if a malloc
1edd0 20 66 61 69 6c 73 20 77 68 69 6c 65 20 73 65 74   fails while set
1ede0 74 69 6e 67 20 61 20 62 69 74 20 69 6e 20 61 20  ting a bit in a 
1edf0 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20 62 69 74  savepoint.** bit
1ee00 76 65 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  vec..*/.static i
1ee10 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67  nt subjournalPag
1ee20 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
1ee30 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1ee40 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  _OK;.  Pager *pP
1ee50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
1ee60 65 72 3b 0a 20 20 69 66 28 20 69 73 4f 70 65 6e  er;.  if( isOpen
1ee70 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29  (pPager->sjfd) )
1ee80 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74  {.    void *pDat
1ee90 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a  a = pPg->pData;.
1eea0 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d      i64 offset =
1eeb0 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63   pPager->nSubRec
1eec0 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65  *(4+pPager->page
1eed0 53 69 7a 65 29 3b 0a 20 20 20 20 63 68 61 72 20  Size);.    char 
1eee0 2a 70 44 61 74 61 32 3b 0a 0a 20 20 20 20 43 4f  *pData2;..    CO
1eef0 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 44 61  DEC2(pPager, pDa
1ef00 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37  ta, pPg->pgno, 7
1ef10 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
1ef20 4e 4f 4d 45 4d 2c 20 70 44 61 74 61 32 29 3b 0a  NOMEM, pData2);.
1ef30 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28      PAGERTRACE((
1ef40 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64  "STMT-JOURNAL %d
1ef50 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47   page %d\n", PAG
1ef60 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
1ef70 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 0a 20 20  g->pgno));.  .  
1ef80 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55    assert( pagerU
1ef90 73 65 4c 6f 67 28 70 50 61 67 65 72 29 20 0a 20  seLog(pPager) . 
1efa0 20 20 20 20 20 20 20 20 7c 7c 20 70 61 67 65 49          || pageI
1efb0 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 0a 20  nJournal(pPg) . 
1efc0 20 20 20 20 20 20 20 20 7c 7c 20 70 50 67 2d 3e          || pPg->
1efd0 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 4f  pgno>pPager->dbO
1efe0 72 69 67 53 69 7a 65 20 0a 20 20 20 20 29 3b 0a  rigSize .    );.
1eff0 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32      rc = write32
1f000 62 69 74 73 28 70 50 61 67 65 72 2d 3e 73 6a 66  bits(pPager->sjf
1f010 64 2c 20 6f 66 66 73 65 74 2c 20 70 50 67 2d 3e  d, offset, pPg->
1f020 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 72  pgno);.    if( r
1f030 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1f040 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1f050 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
1f060 2d 3e 73 6a 66 64 2c 20 70 44 61 74 61 32 2c 20  ->sjfd, pData2, 
1f070 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1f080 2c 20 6f 66 66 73 65 74 2b 34 29 3b 0a 20 20 20  , offset+4);.   
1f090 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d   }.  }.  if( rc=
1f0a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1f0b0 20 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65    pPager->nSubRe
1f0c0 63 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28  c++;.    assert(
1f0d0 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f   pPager->nSavepo
1f0e0 69 6e 74 3e 30 20 29 3b 0a 20 20 20 20 72 63 20  int>0 );.    rc 
1f0f0 3d 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74  = addToSavepoint
1f100 42 69 74 76 65 63 73 28 70 50 61 67 65 72 2c 20  Bitvecs(pPager, 
1f110 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a  pPg->pgno);.  }.
1f120 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1f130 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
1f140 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62  tion is called b
1f150 79 20 74 68 65 20 70 63 61 63 68 65 20 6c 61 79  y the pcache lay
1f160 65 72 20 77 68 65 6e 20 69 74 20 68 61 73 20 72  er when it has r
1f170 65 61 63 68 65 64 20 73 6f 6d 65 0a 2a 2a 20 73  eached some.** s
1f180 6f 66 74 20 6d 65 6d 6f 72 79 20 6c 69 6d 69 74  oft memory limit
1f190 2e 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75  . The first argu
1f1a0 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65  ment is a pointe
1f1b0 72 20 74 6f 20 61 20 50 61 67 65 72 20 6f 62 6a  r to a Pager obj
1f1c0 65 63 74 0a 2a 2a 20 28 63 61 73 74 20 61 73 20  ect.** (cast as 
1f1d0 61 20 76 6f 69 64 2a 29 2e 20 54 68 65 20 70 61  a void*). The pa
1f1e0 67 65 72 20 69 73 20 61 6c 77 61 79 73 20 27 70  ger is always 'p
1f1f0 75 72 67 65 61 62 6c 65 27 20 28 6e 6f 74 20 61  urgeable' (not a
1f200 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64  n in-memory.** d
1f210 61 74 61 62 61 73 65 29 2e 20 54 68 65 20 73 65  atabase). The se
1f220 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
1f230 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
1f240 61 20 70 61 67 65 20 74 68 61 74 20 69 73 20 0a  a page that is .
1f250 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 64 69 72  ** currently dir
1f260 74 79 20 62 75 74 20 68 61 73 20 6e 6f 20 6f 75  ty but has no ou
1f270 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
1f280 6e 63 65 73 2e 20 54 68 65 20 70 61 67 65 0a 2a  nces. The page.*
1f290 2a 20 69 73 20 61 6c 77 61 79 73 20 61 73 73 6f  * is always asso
1f2a0 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
1f2b0 50 61 67 65 72 20 6f 62 6a 65 63 74 20 70 61 73  Pager object pas
1f2c0 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
1f2d0 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a   .** argument..*
1f2e0 2a 0a 2a 2a 20 54 68 65 20 6a 6f 62 20 6f 66 20  *.** The job of 
1f2f0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
1f300 20 74 6f 20 6d 61 6b 65 20 70 50 67 20 63 6c 65   to make pPg cle
1f310 61 6e 20 62 79 20 77 72 69 74 69 6e 67 20 69 74  an by writing it
1f320 73 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 75  s contents.** ou
1f330 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  t to the databas
1f340 65 20 66 69 6c 65 2c 20 69 66 20 70 6f 73 73 69  e file, if possi
1f350 62 6c 65 2e 20 54 68 69 73 20 6d 61 79 20 69 6e  ble. This may in
1f360 76 6f 6c 76 65 20 73 79 6e 63 69 6e 67 20 74 68  volve syncing th
1f370 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e.** journal fil
1f380 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  e. .**.** If suc
1f390 63 65 73 73 66 75 6c 2c 20 73 71 6c 69 74 65 33  cessful, sqlite3
1f3a0 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28  PcacheMakeClean(
1f3b0 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74  ) is called on t
1f3c0 68 65 20 70 61 67 65 20 61 6e 64 0a 2a 2a 20 53  he page and.** S
1f3d0 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
1f3e0 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  d. If an IO erro
1f3f0 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74  r occurs while t
1f400 72 79 69 6e 67 20 74 6f 20 6d 61 6b 65 20 74 68  rying to make th
1f410 65 0a 2a 2a 20 70 61 67 65 20 63 6c 65 61 6e 2c  e.** page clean,
1f420 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f   the IO error co
1f430 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  de is returned. 
1f440 49 66 20 74 68 65 20 70 61 67 65 20 63 61 6e 6e  If the page cann
1f450 6f 74 20 62 65 0a 2a 2a 20 6d 61 64 65 20 63 6c  ot be.** made cl
1f460 65 61 6e 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68  ean for some oth
1f470 65 72 20 72 65 61 73 6f 6e 2c 20 62 75 74 20 6e  er reason, but n
1f480 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  o error occurs, 
1f490 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  then SQLITE_OK.*
1f4a0 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 62 79  * is returned by
1f4b0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61   sqlite3PcacheMa
1f4c0 6b 65 43 6c 65 61 6e 28 29 20 69 73 20 6e 6f 74  keClean() is not
1f4d0 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74   called..*/.stat
1f4e0 69 63 20 69 6e 74 20 70 61 67 65 72 53 74 72 65  ic int pagerStre
1f4f0 73 73 28 76 6f 69 64 20 2a 70 2c 20 50 67 48 64  ss(void *p, PgHd
1f500 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  r *pPg){.  Pager
1f510 20 2a 70 50 61 67 65 72 20 3d 20 28 50 61 67 65   *pPager = (Page
1f520 72 20 2a 29 70 3b 0a 20 20 69 6e 74 20 72 63 20  r *)p;.  int rc 
1f530 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
1f540 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61  assert( pPg->pPa
1f550 67 65 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20  ger==pPager );. 
1f560 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 66 6c   assert( pPg->fl
1f570 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 20  ags&PGHDR_DIRTY 
1f580 29 3b 0a 0a 20 20 70 50 67 2d 3e 70 44 69 72 74  );..  pPg->pDirt
1f590 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 61 67  y = 0;.  if( pag
1f5a0 65 72 55 73 65 4c 6f 67 28 70 50 61 67 65 72 29  erUseLog(pPager)
1f5b0 20 29 7b 0a 20 20 20 20 2f 2a 20 57 72 69 74 65   ){.    /* Write
1f5c0 20 61 20 73 69 6e 67 6c 65 20 66 72 61 6d 65 20   a single frame 
1f5d0 66 6f 72 20 74 68 69 73 20 70 61 67 65 20 74 6f  for this page to
1f5e0 20 74 68 65 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20   the log. */.   
1f5f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67   rc = sqlite3Log
1f600 46 72 61 6d 65 73 28 70 50 61 67 65 72 2d 3e 70  Frames(pPager->p
1f610 4c 6f 67 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  Log, pPager->pag
1f620 65 53 69 7a 65 2c 20 70 50 67 2c 20 30 2c 20 30  eSize, pPg, 0, 0
1f630 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  , 0);.  }else{. 
1f640 20 20 20 2f 2a 20 54 68 65 20 64 6f 4e 6f 74 53     /* The doNotS
1f650 79 6e 63 20 66 6c 61 67 20 69 73 20 73 65 74 20  ync flag is set 
1f660 62 79 20 74 68 65 20 73 71 6c 69 74 65 33 50 61  by the sqlite3Pa
1f670 67 65 72 57 72 69 74 65 28 29 20 66 75 6e 63 74  gerWrite() funct
1f680 69 6f 6e 20 77 68 69 6c 65 20 69 74 0a 20 20 20  ion while it.   
1f690 20 2a 2a 20 69 73 20 6a 6f 75 72 6e 61 6c 6c 69   ** is journalli
1f6a0 6e 67 20 61 20 73 65 74 20 6f 66 20 74 77 6f 20  ng a set of two 
1f6b0 6f 72 20 6d 6f 72 65 20 64 61 74 61 62 61 73 65  or more database
1f6c0 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20   pages that are 
1f6d0 73 74 6f 72 65 64 0a 20 20 20 20 2a 2a 20 6f 6e  stored.    ** on
1f6e0 20 74 68 65 20 73 61 6d 65 20 64 69 73 6b 20 73   the same disk s
1f6f0 65 63 74 6f 72 2e 20 53 79 6e 63 69 6e 67 20 74  ector. Syncing t
1f700 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f  he journal is no
1f710 74 20 61 6c 6c 6f 77 65 64 20 77 68 69 6c 65 0a  t allowed while.
1f720 20 20 20 20 2a 2a 20 74 68 69 73 20 69 73 20 68      ** this is h
1f730 61 70 70 65 6e 69 6e 67 20 61 73 20 69 74 20 69  appening as it i
1f740 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74  s important that
1f750 20 61 6c 6c 20 6d 65 6d 62 65 72 73 20 6f 66 20   all members of 
1f760 73 75 63 68 20 61 0a 20 20 20 20 2a 2a 20 73 65  such a.    ** se
1f770 74 20 6f 66 20 70 61 67 65 73 20 61 72 65 20 73  t of pages are s
1f780 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20 74 6f  ynced to disk to
1f790 67 65 74 68 65 72 2e 20 53 6f 2c 20 69 66 20 74  gether. So, if t
1f7a0 68 65 20 70 61 67 65 20 74 68 69 73 20 66 75 6e  he page this fun
1f7b0 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 69 73 20  ction.    ** is 
1f7c0 74 72 79 69 6e 67 20 74 6f 20 6d 61 6b 65 20 63  trying to make c
1f7d0 6c 65 61 6e 20 77 69 6c 6c 20 72 65 71 75 69 72  lean will requir
1f7e0 65 20 61 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63  e a journal sync
1f7f0 20 61 6e 64 20 74 68 65 20 64 6f 4e 6f 74 53 79   and the doNotSy
1f800 6e 63 0a 20 20 20 20 2a 2a 20 66 6c 61 67 20 69  nc.    ** flag i
1f810 73 20 73 65 74 2c 20 72 65 74 75 72 6e 20 77 69  s set, return wi
1f820 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74  thout doing anyt
1f830 68 69 6e 67 2e 20 54 68 65 20 70 63 61 63 68 65  hing. The pcache
1f840 20 6c 61 79 65 72 20 77 69 6c 6c 0a 20 20 20 20   layer will.    
1f850 2a 2a 20 6a 75 73 74 20 68 61 76 65 20 74 6f 20  ** just have to 
1f860 67 6f 20 61 68 65 61 64 20 61 6e 64 20 61 6c 6c  go ahead and all
1f870 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65  ocate a new page
1f880 20 62 75 66 66 65 72 20 69 6e 73 74 65 61 64 20   buffer instead 
1f890 6f 66 0a 20 20 20 20 2a 2a 20 72 65 75 73 69 6e  of.    ** reusin
1f8a0 67 20 70 50 67 2e 0a 20 20 20 20 2a 2a 0a 20 20  g pPg..    **.  
1f8b0 20 20 2a 2a 20 53 69 6d 69 6c 61 72 6c 79 2c 20    ** Similarly, 
1f8c0 69 66 20 74 68 65 20 70 61 67 65 72 20 68 61 73  if the pager has
1f8d0 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64   already entered
1f8e0 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
1f8f0 2c 20 64 6f 20 6e 6f 74 0a 20 20 20 20 2a 2a 20  , do not.    ** 
1f900 74 72 79 20 74 6f 20 77 72 69 74 65 20 74 68 65  try to write the
1f910 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 50 67   contents of pPg
1f920 20 74 6f 20 64 69 73 6b 2e 0a 20 20 20 20 2a 2f   to disk..    */
1f930 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 70  .    if( NEVER(p
1f940 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 0a  Pager->errCode).
1f950 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d       || (pPager-
1f960 3e 64 6f 4e 6f 74 53 79 6e 63 20 26 26 20 70 50  >doNotSync && pP
1f970 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  g->flags&PGHDR_N
1f980 45 45 44 5f 53 59 4e 43 29 0a 20 20 20 20 29 7b  EED_SYNC).    ){
1f990 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1f9a0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
1f9b0 20 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68   .    /* Sync th
1f9c0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
1f9d0 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20  f required. */. 
1f9e0 20 20 20 69 66 28 20 70 50 67 2d 3e 66 6c 61 67     if( pPg->flag
1f9f0 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
1fa00 43 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  C ){.      rc = 
1fa10 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67  syncJournal(pPag
1fa20 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  er);.      if( r
1fa30 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1fa40 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
1fa50 20 26 26 20 0a 20 20 20 20 20 20 20 20 21 28 70   && .        !(p
1fa60 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
1fa70 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
1fa80 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 29 20 26 26  LMODE_MEMORY) &&
1fa90 0a 20 20 20 20 20 20 20 20 21 28 73 71 6c 69 74  .        !(sqlit
1faa0 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  e3OsDeviceCharac
1fab0 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72  teristics(pPager
1fac0 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f 49 4f 43  ->fd)&SQLITE_IOC
1fad0 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 0a  AP_SAFE_APPEND).
1fae0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
1faf0 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20   pPager->nRec = 
1fb00 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  0;.        rc = 
1fb10 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
1fb20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 7d  pPager);.      }
1fb30 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
1fb40 20 49 66 20 74 68 65 20 70 61 67 65 20 6e 75 6d   If the page num
1fb50 62 65 72 20 6f 66 20 74 68 69 73 20 70 61 67 65  ber of this page
1fb60 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
1fb70 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65  the current size
1fb80 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 64   of.    ** the d
1fb90 61 74 61 62 61 73 65 20 69 6d 61 67 65 2c 20 69  atabase image, i
1fba0 74 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 62 65  t may need to be
1fbb0 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
1fbc0 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20  sub-journal..   
1fbd0 20 2a 2a 20 54 68 69 73 20 69 73 20 62 65 63 61   ** This is beca
1fbe0 75 73 65 20 74 68 65 20 63 61 6c 6c 20 74 6f 20  use the call to 
1fbf0 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65  pager_write_page
1fc00 6c 69 73 74 28 29 20 62 65 6c 6f 77 20 77 69 6c  list() below wil
1fc10 6c 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 61 63 74  l not.    ** act
1fc20 75 61 6c 6c 79 20 77 72 69 74 65 20 64 61 74 61  ually write data
1fc30 20 74 6f 20 74 68 65 20 66 69 6c 65 20 69 6e 20   to the file in 
1fc40 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20 20 2a  this case..    *
1fc50 2a 0a 20 20 20 20 2a 2a 20 43 6f 6e 73 69 64 65  *.    ** Conside
1fc60 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  r the following 
1fc70 73 65 71 75 65 6e 63 65 20 6f 66 20 65 76 65 6e  sequence of even
1fc80 74 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ts:.    **.    *
1fc90 2a 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 2a  *   BEGIN;.    *
1fca0 2a 20 20 20 20 20 3c 6a 6f 75 72 6e 61 6c 20 70  *     <journal p
1fcb0 61 67 65 20 58 3e 0a 20 20 20 20 2a 2a 20 20 20  age X>.    **   
1fcc0 20 20 3c 6d 6f 64 69 66 79 20 70 61 67 65 20 58    <modify page X
1fcd0 3e 0a 20 20 20 20 2a 2a 20 20 20 20 20 53 41 56  >.    **     SAV
1fce0 45 50 4f 49 4e 54 20 73 70 3b 0a 20 20 20 20 2a  EPOINT sp;.    *
1fcf0 2a 20 20 20 20 20 20 20 3c 73 68 72 69 6e 6b 20  *       <shrink 
1fd00 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
1fd10 20 59 20 70 61 67 65 73 3e 0a 20 20 20 20 2a 2a   Y pages>.    **
1fd20 20 20 20 20 20 20 20 70 61 67 65 72 53 74 72 65         pagerStre
1fd30 73 73 28 70 61 67 65 20 58 29 0a 20 20 20 20 2a  ss(page X).    *
1fd40 2a 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54  *     ROLLBACK T
1fd50 4f 20 73 70 3b 0a 20 20 20 20 2a 2a 0a 20 20 20  O sp;.    **.   
1fd60 20 2a 2a 20 49 66 20 28 58 3e 59 29 2c 20 74 68   ** If (X>Y), th
1fd70 65 6e 20 77 68 65 6e 20 70 61 67 65 72 53 74 72  en when pagerStr
1fd80 65 73 73 20 69 73 20 63 61 6c 6c 65 64 20 70 61  ess is called pa
1fd90 67 65 20 58 20 77 69 6c 6c 20 6e 6f 74 20 62 65  ge X will not be
1fda0 20 77 72 69 74 74 65 6e 0a 20 20 20 20 2a 2a 20   written.    ** 
1fdb0 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  out to the datab
1fdc0 61 73 65 20 66 69 6c 65 2c 20 62 75 74 20 77 69  ase file, but wi
1fdd0 6c 6c 20 62 65 20 64 72 6f 70 70 65 64 20 66 72  ll be dropped fr
1fde0 6f 6d 20 74 68 65 20 63 61 63 68 65 2e 20 54 68  om the cache. Th
1fdf0 65 6e 2c 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f  en,.    ** follo
1fe00 77 69 6e 67 20 74 68 65 20 22 52 4f 4c 4c 42 41  wing the "ROLLBA
1fe10 43 4b 20 54 4f 20 73 70 22 20 73 74 61 74 65 6d  CK TO sp" statem
1fe20 65 6e 74 2c 20 72 65 61 64 69 6e 67 20 70 61 67  ent, reading pag
1fe30 65 20 58 20 77 69 6c 6c 20 72 65 61 64 0a 20 20  e X will read.  
1fe40 20 20 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74    ** data from t
1fe50 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1fe60 2e 20 54 68 69 73 20 77 69 6c 6c 20 62 65 20 74  . This will be t
1fe70 68 65 20 63 6f 70 79 20 6f 66 20 70 61 67 65 20  he copy of page 
1fe80 58 20 61 73 20 69 74 0a 20 20 20 20 2a 2a 20 77  X as it.    ** w
1fe90 61 73 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e  as when the tran
1fea0 73 61 63 74 69 6f 6e 20 73 74 61 72 74 65 64 2c  saction started,
1feb0 20 6e 6f 74 20 61 73 20 69 74 20 77 61 73 20 77   not as it was w
1fec0 68 65 6e 20 22 53 41 56 45 50 4f 49 4e 54 20 73  hen "SAVEPOINT s
1fed0 70 22 0a 20 20 20 20 2a 2a 20 77 61 73 20 65 78  p".    ** was ex
1fee0 65 63 75 74 65 64 2e 0a 20 20 20 20 2a 2a 0a 20  ecuted..    **. 
1fef0 20 20 20 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69     ** The soluti
1ff00 6f 6e 20 69 73 20 74 6f 20 77 72 69 74 65 20 74  on is to write t
1ff10 68 65 20 63 75 72 72 65 6e 74 20 64 61 74 61 20  he current data 
1ff20 66 6f 72 20 70 61 67 65 20 58 20 69 6e 74 6f 20  for page X into 
1ff30 74 68 65 20 0a 20 20 20 20 2a 2a 20 73 75 62 2d  the .    ** sub-
1ff40 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f 77  journal file now
1ff50 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61   (if it is not a
1ff60 6c 72 65 61 64 79 20 74 68 65 72 65 29 2c 20 73  lready there), s
1ff70 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c 0a 20  o that it will. 
1ff80 20 20 20 2a 2a 20 62 65 20 72 65 73 74 6f 72 65     ** be restore
1ff90 64 20 74 6f 20 69 74 73 20 63 75 72 72 65 6e 74  d to its current
1ffa0 20 76 61 6c 75 65 20 77 68 65 6e 20 74 68 65 20   value when the 
1ffb0 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70 22  "ROLLBACK TO sp"
1ffc0 20 69 73 20 0a 20 20 20 20 2a 2a 20 65 78 65 63   is .    ** exec
1ffd0 75 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  uted..    */.   
1ffe0 20 69 66 28 20 4e 45 56 45 52 28 0a 20 20 20 20   if( NEVER(.    
1fff0 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f      rc==SQLITE_O
20000 4b 20 26 26 20 70 50 67 2d 3e 70 67 6e 6f 3e 70  K && pPg->pgno>p
20010 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 26 26  Pager->dbSize &&
20020 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67   subjRequiresPag
20030 65 28 70 50 67 29 0a 20 20 20 20 29 20 29 7b 0a  e(pPg).    ) ){.
20040 20 20 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f        rc = subjo
20050 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29 3b 0a  urnalPage(pPg);.
20060 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
20070 57 72 69 74 65 20 74 68 65 20 63 6f 6e 74 65 6e  Write the conten
20080 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 6f  ts of the page o
20090 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ut to the databa
200a0 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  se file. */.    
200b0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
200c0 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
200d0 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65  pager_write_page
200e0 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 7d  list(pPg);.    }
200f0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20  .  }..  /* Mark 
20100 74 68 65 20 70 61 67 65 20 61 73 20 63 6c 65 61  the page as clea
20110 6e 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  n. */.  if( rc==
20120 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
20130 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53 54   PAGERTRACE(("ST
20140 52 45 53 53 20 25 64 20 70 61 67 65 20 25 64 5c  RESS %d page %d\
20150 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
20160 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29  er), pPg->pgno))
20170 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  ;.    sqlite3Pca
20180 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67  cheMakeClean(pPg
20190 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
201a0 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
201b0 67 65 72 2c 20 72 63 29 3b 0a 7d 0a 0a 0a 2f 2a  ger, rc);.}.../*
201c0 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64  .** Allocate and
201d0 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e 65   initialize a ne
201e0 77 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 61  w Pager object a
201f0 6e 64 20 70 75 74 20 61 20 70 6f 69 6e 74 65 72  nd put a pointer
20200 20 74 6f 20 69 74 0a 2a 2a 20 69 6e 20 2a 70 70   to it.** in *pp
20210 50 61 67 65 72 2e 20 54 68 65 20 70 61 67 65 72  Pager. The pager
20220 20 73 68 6f 75 6c 64 20 65 76 65 6e 74 75 61 6c   should eventual
20230 6c 79 20 62 65 20 66 72 65 65 64 20 62 79 20 70  ly be freed by p
20240 61 73 73 69 6e 67 20 69 74 0a 2a 2a 20 74 6f 20  assing it.** to 
20250 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73  sqlite3PagerClos
20260 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a  e()..**.** The z
20270 46 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e  Filename argumen
20280 74 20 69 73 20 74 68 65 20 70 61 74 68 20 74 6f  t is the path to
20290 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
202a0 6c 65 20 74 6f 20 6f 70 65 6e 2e 0a 2a 2a 20 49  le to open..** I
202b0 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e  f zFilename is N
202c0 55 4c 4c 20 74 68 65 6e 20 61 20 72 61 6e 64 6f  ULL then a rando
202d0 6d 6c 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72  mly-named tempor
202e0 61 72 79 20 66 69 6c 65 20 69 73 20 63 72 65 61  ary file is crea
202f0 74 65 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20  ted.** and used 
20300 61 73 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62  as the file to b
20310 65 20 63 61 63 68 65 64 2e 20 54 65 6d 70 6f 72  e cached. Tempor
20320 61 72 79 20 66 69 6c 65 73 20 61 72 65 20 62 65  ary files are be
20330 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f   deleted.** auto
20340 6d 61 74 69 63 61 6c 6c 79 20 77 68 65 6e 20 74  matically when t
20350 68 65 79 20 61 72 65 20 63 6c 6f 73 65 64 2e 20  hey are closed. 
20360 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  If zFilename is 
20370 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20  ":memory:" then 
20380 0a 2a 2a 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74  .** all informat
20390 69 6f 6e 20 69 73 20 68 65 6c 64 20 69 6e 20 63  ion is held in c
203a0 61 63 68 65 2e 20 49 74 20 69 73 20 6e 65 76 65  ache. It is neve
203b0 72 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73  r written to dis
203c0 6b 2e 20 0a 2a 2a 20 54 68 69 73 20 63 61 6e 20  k. .** This can 
203d0 62 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65  be used to imple
203e0 6d 65 6e 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  ment an in-memor
203f0 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  y database..**.*
20400 2a 20 54 68 65 20 6e 45 78 74 72 61 20 70 61 72  * The nExtra par
20410 61 6d 65 74 65 72 20 73 70 65 63 69 66 69 65 73  ameter specifies
20420 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
20430 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 6c  ytes of space al
20440 6c 6f 63 61 74 65 64 0a 2a 2a 20 61 6c 6f 6e 67  located.** along
20450 20 77 69 74 68 20 65 61 63 68 20 70 61 67 65 20   with each page 
20460 72 65 66 65 72 65 6e 63 65 2e 20 54 68 69 73 20  reference. This 
20470 73 70 61 63 65 20 69 73 20 61 76 61 69 6c 61 62  space is availab
20480 6c 65 20 74 6f 20 74 68 65 20 75 73 65 72 0a 2a  le to the user.*
20490 2a 20 76 69 61 20 74 68 65 20 73 71 6c 69 74 65  * via the sqlite
204a0 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 29  3PagerGetExtra()
204b0 20 41 50 49 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20   API..**.** The 
204c0 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 20 69  flags argument i
204d0 73 20 75 73 65 64 20 74 6f 20 73 70 65 63 69 66  s used to specif
204e0 79 20 70 72 6f 70 65 72 74 69 65 73 20 74 68 61  y properties tha
204f0 74 20 61 66 66 65 63 74 20 74 68 65 0a 2a 2a 20  t affect the.** 
20500 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  operation of the
20510 20 70 61 67 65 72 2e 20 49 74 20 73 68 6f 75 6c   pager. It shoul
20520 64 20 62 65 20 70 61 73 73 65 64 20 73 6f 6d 65  d be passed some
20530 20 62 69 74 77 69 73 65 20 63 6f 6d 62 69 6e 61   bitwise combina
20540 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 50  tion.** of the P
20550 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41  AGER_OMIT_JOURNA
20560 4c 20 61 6e 64 20 50 41 47 45 52 5f 4e 4f 5f 52  L and PAGER_NO_R
20570 45 41 44 4c 4f 43 4b 20 66 6c 61 67 73 2e 0a 2a  EADLOCK flags..*
20580 2a 0a 2a 2a 20 54 68 65 20 76 66 73 46 6c 61 67  *.** The vfsFlag
20590 73 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61  s parameter is a
205a0 20 62 69 74 6d 61 73 6b 20 74 6f 20 70 61 73 73   bitmask to pass
205b0 20 74 6f 20 74 68 65 20 66 6c 61 67 73 20 70 61   to the flags pa
205c0 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 66 20 74 68  rameter.** of th
205d0 65 20 78 4f 70 65 6e 28 29 20 6d 65 74 68 6f 64  e xOpen() method
205e0 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65 64   of the supplied
205f0 20 56 46 53 20 77 68 65 6e 20 6f 70 65 6e 69 6e   VFS when openin
20600 67 20 66 69 6c 65 73 2e 20 0a 2a 2a 0a 2a 2a 20  g files. .**.** 
20610 49 66 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a  If the pager obj
20620 65 63 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ect is allocated
20630 20 61 6e 64 20 74 68 65 20 73 70 65 63 69 66 69   and the specifi
20640 65 64 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 0a  ed file opened .
20650 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c  ** successfully,
20660 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
20670 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61  turned and *ppPa
20680 67 65 72 20 73 65 74 20 74 6f 20 70 6f 69 6e 74  ger set to point
20690 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 65 77 20 70   to.** the new p
206a0 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 49 66 20  ager object. If 
206b0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
206c0 20 2a 70 70 50 61 67 65 72 20 69 73 20 73 65 74   *ppPager is set
206d0 20 74 6f 20 4e 55 4c 4c 0a 2a 2a 20 61 6e 64 20   to NULL.** and 
206e0 65 72 72 6f 72 20 63 6f 64 65 20 72 65 74 75 72  error code retur
206f0 6e 65 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ned. This functi
20700 6f 6e 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51  on may return SQ
20710 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 28 73  LITE_NOMEM.** (s
20720 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29 20 69  qlite3Malloc() i
20730 73 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61  s used to alloca
20740 74 65 20 6d 65 6d 6f 72 79 29 2c 20 53 51 4c 49  te memory), SQLI
20750 54 45 5f 43 41 4e 54 4f 50 45 4e 20 6f 72 20 0a  TE_CANTOPEN or .
20760 2a 2a 20 76 61 72 69 6f 75 73 20 53 51 4c 49 54  ** various SQLIT
20770 45 5f 49 4f 5f 58 58 58 20 65 72 72 6f 72 73 2e  E_IO_XXX errors.
20780 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
20790 61 67 65 72 4f 70 65 6e 28 0a 20 20 73 71 6c 69  agerOpen(.  sqli
207a0 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20  te3_vfs *pVfs,  
207b0 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74       /* The virt
207c0 75 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 20  ual file system 
207d0 74 6f 20 75 73 65 20 2a 2f 0a 20 20 50 61 67 65  to use */.  Page
207e0 72 20 2a 2a 70 70 50 61 67 65 72 2c 20 20 20 20  r **ppPager,    
207f0 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 74       /* OUT: Ret
20800 75 72 6e 20 74 68 65 20 50 61 67 65 72 20 73 74  urn the Pager st
20810 72 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a  ructure here */.
20820 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
20830 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61  ilename,   /* Na
20840 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
20850 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20  se file to open 
20860 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c  */.  int nExtra,
20870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20880 20 45 78 74 72 61 20 62 79 74 65 73 20 61 70 70   Extra bytes app
20890 65 6e 64 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d  end to each in-m
208a0 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20  emory page */.  
208b0 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20  int flags,      
208c0 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67           /* flag
208d0 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74 68  s controlling th
208e0 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  is file */.  int
208f0 20 76 66 73 46 6c 61 67 73 2c 20 20 20 20 20 20   vfsFlags,      
20900 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 70        /* flags p
20910 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f  assed through to
20920 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70   sqlite3_vfs.xOp
20930 65 6e 28 29 20 2a 2f 0a 20 20 76 6f 69 64 20 28  en() */.  void (
20940 2a 78 52 65 69 6e 69 74 29 28 44 62 50 61 67 65  *xReinit)(DbPage
20950 2a 29 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74  *) /* Function t
20960 6f 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 20 70  o reinitialize p
20970 61 67 65 73 20 2a 2f 0a 29 7b 0a 20 20 75 38 20  ages */.){.  u8 
20980 2a 70 50 74 72 3b 0a 20 20 50 61 67 65 72 20 2a  *pPtr;.  Pager *
20990 70 50 61 67 65 72 20 3d 20 30 3b 20 20 20 20 20  pPager = 0;     
209a0 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63    /* Pager objec
209b0 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 6e  t to allocate an
209c0 64 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e  d return */.  in
209d0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
209e0 3b 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e  ;      /* Return
209f0 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 74   code */.  int t
20a00 65 6d 70 46 69 6c 65 20 3d 20 30 3b 20 20 20 20  empFile = 0;    
20a10 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
20a20 74 65 6d 70 20 66 69 6c 65 73 20 28 69 6e 63 6c  temp files (incl
20a30 2e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  . in-memory file
20a40 73 29 20 2a 2f 0a 20 20 69 6e 74 20 6d 65 6d 44  s) */.  int memD
20a50 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  b = 0;          
20a60 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
20a70 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   is an in-memory
20a80 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72   file */.  int r
20a90 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 20 20 20 20  eadOnly = 0;    
20aa0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
20ab0 68 69 73 20 69 73 20 61 20 72 65 61 64 2d 6f 6e  his is a read-on
20ac0 6c 79 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  ly file */.  int
20ad0 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65   journalFileSize
20ae0 3b 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 74  ;     /* Bytes t
20af0 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72 20 65  o allocate for e
20b00 61 63 68 20 6a 6f 75 72 6e 61 6c 20 66 64 20 2a  ach journal fd *
20b10 2f 0a 20 20 63 68 61 72 20 2a 7a 50 61 74 68 6e  /.  char *zPathn
20b20 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  ame = 0;     /* 
20b30 46 75 6c 6c 20 70 61 74 68 20 74 6f 20 64 61 74  Full path to dat
20b40 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
20b50 69 6e 74 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20  int nPathname = 
20b60 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  0;       /* Numb
20b70 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 7a  er of bytes in z
20b80 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e  Pathname */.  in
20b90 74 20 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28  t useJournal = (
20ba0 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4f 4d  flags & PAGER_OM
20bb0 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b 20  IT_JOURNAL)==0; 
20bc0 2f 2a 20 46 61 6c 73 65 20 74 6f 20 6f 6d 69 74  /* False to omit
20bd0 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e   journal */.  in
20be0 74 20 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 28  t noReadlock = (
20bf0 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4e 4f  flags & PAGER_NO
20c00 5f 52 45 41 44 4c 4f 43 4b 29 21 3d 30 3b 20 20  _READLOCK)!=0;  
20c10 2f 2a 20 54 72 75 65 20 74 6f 20 6f 6d 69 74 20  /* True to omit 
20c20 72 65 61 64 2d 6c 6f 63 6b 20 2a 2f 0a 20 20 69  read-lock */.  i
20c30 6e 74 20 70 63 61 63 68 65 53 69 7a 65 20 3d 20  nt pcacheSize = 
20c40 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 69 7a  sqlite3PcacheSiz
20c50 65 28 29 3b 20 20 20 20 20 20 20 2f 2a 20 42 79  e();       /* By
20c60 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  tes to allocate 
20c70 66 6f 72 20 50 43 61 63 68 65 20 2a 2f 0a 20 20  for PCache */.  
20c80 75 31 36 20 73 7a 50 61 67 65 44 66 6c 74 20 3d  u16 szPageDflt =
20c90 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
20ca0 50 41 47 45 5f 53 49 5a 45 3b 20 20 2f 2a 20 44  PAGE_SIZE;  /* D
20cb0 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65  efault page size
20cc0 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65   */..  /* Figure
20cd0 20 6f 75 74 20 68 6f 77 20 6d 75 63 68 20 73 70   out how much sp
20ce0 61 63 65 20 69 73 20 72 65 71 75 69 72 65 64 20  ace is required 
20cf0 66 6f 72 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c  for each journal
20d00 20 66 69 6c 65 2d 68 61 6e 64 6c 65 0a 20 20 2a   file-handle.  *
20d10 2a 20 28 74 68 65 72 65 20 61 72 65 20 74 77 6f  * (there are two
20d20 20 6f 66 20 74 68 65 6d 2c 20 74 68 65 20 6d 61   of them, the ma
20d30 69 6e 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74  in journal and t
20d40 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 29 2e  he sub-journal).
20d50 20 54 68 69 73 0a 20 20 2a 2a 20 69 73 20 74 68   This.  ** is th
20d60 65 20 6d 61 78 69 6d 75 6d 20 73 70 61 63 65 20  e maximum space 
20d70 72 65 71 75 69 72 65 64 20 66 6f 72 20 61 6e 20  required for an 
20d80 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61  in-memory journa
20d90 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 0a 20  l file handle . 
20da0 20 2a 2a 20 61 6e 64 20 61 20 72 65 67 75 6c 61   ** and a regula
20db0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 68  r journal file-h
20dc0 61 6e 64 6c 65 2e 20 4e 6f 74 65 20 74 68 61 74  andle. Note that
20dd0 20 61 20 22 72 65 67 75 6c 61 72 20 6a 6f 75 72   a "regular jour
20de0 6e 61 6c 2d 68 61 6e 64 6c 65 22 0a 20 20 2a 2a  nal-handle".  **
20df0 20 6d 61 79 20 62 65 20 61 20 77 72 61 70 70 65   may be a wrappe
20e00 72 20 63 61 70 61 62 6c 65 20 6f 66 20 63 61 63  r capable of cac
20e10 68 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 70  hing the first p
20e20 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6a 6f  ortion of the jo
20e30 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20  urnal.  ** file 
20e40 69 6e 20 6d 65 6d 6f 72 79 20 74 6f 20 69 6d 70  in memory to imp
20e50 6c 65 6d 65 6e 74 20 74 68 65 20 61 74 6f 6d 69  lement the atomi
20e60 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61  c-write optimiza
20e70 74 69 6f 6e 20 28 73 65 65 20 0a 20 20 2a 2a 20  tion (see .  ** 
20e80 73 6f 75 72 63 65 20 66 69 6c 65 20 6a 6f 75 72  source file jour
20e90 6e 61 6c 2e 63 29 2e 0a 20 20 2a 2f 0a 20 20 69  nal.c)..  */.  i
20ea0 66 28 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61  f( sqlite3Journa
20eb0 6c 53 69 7a 65 28 70 56 66 73 29 3e 73 71 6c 69  lSize(pVfs)>sqli
20ec0 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a  te3MemJournalSiz
20ed0 65 28 29 20 29 7b 0a 20 20 20 20 6a 6f 75 72 6e  e() ){.    journ
20ee0 61 6c 46 69 6c 65 53 69 7a 65 20 3d 20 52 4f 55  alFileSize = ROU
20ef0 4e 44 38 28 73 71 6c 69 74 65 33 4a 6f 75 72 6e  ND8(sqlite3Journ
20f00 61 6c 53 69 7a 65 28 70 56 66 73 29 29 3b 0a 20  alSize(pVfs));. 
20f10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6a 6f 75 72   }else{.    jour
20f20 6e 61 6c 46 69 6c 65 53 69 7a 65 20 3d 20 52 4f  nalFileSize = RO
20f30 55 4e 44 38 28 73 71 6c 69 74 65 33 4d 65 6d 4a  UND8(sqlite3MemJ
20f40 6f 75 72 6e 61 6c 53 69 7a 65 28 29 29 3b 0a 20  ournalSize());. 
20f50 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65   }..  /* Set the
20f60 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65   output variable
20f70 20 74 6f 20 4e 55 4c 4c 20 69 6e 20 63 61 73 65   to NULL in case
20f80 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
20f90 2e 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72 20  . */.  *ppPager 
20fa0 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75  = 0;..  /* Compu
20fb0 74 65 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  te and store the
20fc0 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 69   full pathname i
20fd0 6e 20 61 6e 20 61 6c 6c 6f 63 61 74 65 64 20 62  n an allocated b
20fe0 75 66 66 65 72 20 70 6f 69 6e 74 65 64 0a 20 20  uffer pointed.  
20ff0 2a 2a 20 74 6f 20 62 79 20 7a 50 61 74 68 6e 61  ** to by zPathna
21000 6d 65 2c 20 6c 65 6e 67 74 68 20 6e 50 61 74 68  me, length nPath
21010 6e 61 6d 65 2e 20 4f 72 2c 20 69 66 20 74 68 69  name. Or, if thi
21020 73 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79  s is a temporary
21030 20 66 69 6c 65 2c 0a 20 20 2a 2a 20 6c 65 61 76   file,.  ** leav
21040 65 20 62 6f 74 68 20 6e 50 61 74 68 6e 61 6d 65  e both nPathname
21050 20 61 6e 64 20 7a 50 61 74 68 6e 61 6d 65 20 73   and zPathname s
21060 65 74 20 74 6f 20 30 2e 0a 20 20 2a 2f 0a 20 20  et to 0..  */.  
21070 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26  if( zFilename &&
21080 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b   zFilename[0] ){
21090 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d  .    nPathname =
210a0 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
210b0 65 2b 31 3b 0a 20 20 20 20 7a 50 61 74 68 6e 61  e+1;.    zPathna
210c0 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  me = sqlite3Mall
210d0 6f 63 28 6e 50 61 74 68 6e 61 6d 65 2a 32 29 3b  oc(nPathname*2);
210e0 0a 20 20 20 20 69 66 28 20 7a 50 61 74 68 6e 61  .    if( zPathna
210f0 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  me==0 ){.      r
21100 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
21110 45 4d 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  EM;.    }.#ifnde
21120 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  f SQLITE_OMIT_ME
21130 4d 4f 52 59 44 42 0a 20 20 20 20 69 66 28 20 73  MORYDB.    if( s
21140 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c  trcmp(zFilename,
21150 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 20 29  ":memory:")==0 )
21160 7b 0a 20 20 20 20 20 20 6d 65 6d 44 62 20 3d 20  {.      memDb = 
21170 31 3b 0a 20 20 20 20 20 20 7a 50 61 74 68 6e 61  1;.      zPathna
21180 6d 65 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 7d  me[0] = 0;.    }
21190 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20  else.#endif.    
211a0 7b 0a 20 20 20 20 20 20 7a 50 61 74 68 6e 61 6d  {.      zPathnam
211b0 65 5b 30 5d 20 3d 20 30 3b 20 2f 2a 20 4d 61 6b  e[0] = 0; /* Mak
211c0 65 20 73 75 72 65 20 69 6e 69 74 69 61 6c 69 7a  e sure initializ
211d0 65 64 20 65 76 65 6e 20 69 66 20 46 75 6c 6c 50  ed even if FullP
211e0 61 74 68 6e 61 6d 65 28 29 20 66 61 69 6c 73 20  athname() fails 
211f0 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  */.      rc = sq
21200 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e  lite3OsFullPathn
21210 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e  ame(pVfs, zFilen
21220 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 2c 20  ame, nPathname, 
21230 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  zPathname);.    
21240 7d 0a 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65  }..    nPathname
21250 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
21260 33 30 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20  30(zPathname);. 
21270 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
21280 45 5f 4f 4b 20 26 26 20 6e 50 61 74 68 6e 61 6d  E_OK && nPathnam
21290 65 2b 38 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68  e+8>pVfs->mxPath
212a0 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a  name ){.      /*
212b0 20 54 68 69 73 20 62 72 61 6e 63 68 20 69 73 20   This branch is 
212c0 74 61 6b 65 6e 20 77 68 65 6e 20 74 68 65 20 6a  taken when the j
212d0 6f 75 72 6e 61 6c 20 70 61 74 68 20 72 65 71 75  ournal path requ
212e0 69 72 65 64 20 62 79 0a 20 20 20 20 20 20 2a 2a  ired by.      **
212f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65   the database be
21300 69 6e 67 20 6f 70 65 6e 65 64 20 77 69 6c 6c 20  ing opened will 
21310 62 65 20 6d 6f 72 65 20 74 68 61 6e 20 70 56 66  be more than pVf
21320 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 0a 20 20  s->mxPathname.  
21330 20 20 20 20 2a 2a 20 62 79 74 65 73 20 69 6e 20      ** bytes in 
21340 6c 65 6e 67 74 68 2e 20 54 68 69 73 20 6d 65 61  length. This mea
21350 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ns the database 
21360 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64  cannot be opened
21370 2c 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 69 74  ,.      ** as it
21380 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 70 6f 73   will not be pos
21390 73 69 62 6c 65 20 74 6f 20 6f 70 65 6e 20 74 68  sible to open th
213a0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  e journal file o
213b0 72 20 65 76 65 6e 0a 20 20 20 20 20 20 2a 2a 20  r even.      ** 
213c0 63 68 65 63 6b 20 66 6f 72 20 61 20 68 6f 74 2d  check for a hot-
213d0 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 72  journal before r
213e0 65 61 64 69 6e 67 2e 0a 20 20 20 20 20 20 2a 2f  eading..      */
213f0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
21400 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54  TE_CANTOPEN_BKPT
21410 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
21420 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
21430 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
21440 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a  ree(zPathname);.
21450 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
21460 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
21470 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79   Allocate memory
21480 20 66 6f 72 20 74 68 65 20 50 61 67 65 72 20 73   for the Pager s
21490 74 72 75 63 74 75 72 65 2c 20 50 43 61 63 68 65  tructure, PCache
214a0 20 6f 62 6a 65 63 74 2c 20 74 68 65 0a 20 20 2a   object, the.  *
214b0 2a 20 74 68 72 65 65 20 66 69 6c 65 20 64 65 73  * three file des
214c0 63 72 69 70 74 6f 72 73 2c 20 74 68 65 20 64 61  criptors, the da
214d0 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65  tabase file name
214e0 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c   and the journal
214f0 20 0a 20 20 2a 2a 20 66 69 6c 65 20 6e 61 6d 65   .  ** file name
21500 2e 20 54 68 65 20 6c 61 79 6f 75 74 20 69 6e 20  . The layout in 
21510 6d 65 6d 6f 72 79 20 69 73 20 61 73 20 66 6f 6c  memory is as fol
21520 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  lows:.  **.  ** 
21530 20 20 20 20 50 61 67 65 72 20 6f 62 6a 65 63 74      Pager object
21540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21550 20 20 20 20 28 73 69 7a 65 6f 66 28 50 61 67 65      (sizeof(Page
21560 72 29 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20  r) bytes).  **  
21570 20 20 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74     PCache object
21580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21590 20 20 20 28 73 71 6c 69 74 65 33 50 63 61 63 68     (sqlite3Pcach
215a0 65 53 69 7a 65 28 29 20 62 79 74 65 73 29 0a 20  eSize() bytes). 
215b0 20 2a 2a 20 20 20 20 20 44 61 74 61 62 61 73 65   **     Database
215c0 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20   file handle    
215d0 20 20 20 20 20 20 20 20 28 70 56 66 73 2d 3e 73          (pVfs->s
215e0 7a 4f 73 46 69 6c 65 20 62 79 74 65 73 29 0a 20  zOsFile bytes). 
215f0 20 2a 2a 20 20 20 20 20 53 75 62 2d 6a 6f 75 72   **     Sub-jour
21600 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20  nal file handle 
21610 20 20 20 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c          (journal
21620 46 69 6c 65 53 69 7a 65 20 62 79 74 65 73 29 0a  FileSize bytes).
21630 20 20 2a 2a 20 20 20 20 20 4d 61 69 6e 20 6a 6f    **     Main jo
21640 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c  urnal file handl
21650 65 20 20 20 20 20 20 20 20 28 6a 6f 75 72 6e 61  e        (journa
21660 6c 46 69 6c 65 53 69 7a 65 20 62 79 74 65 73 29  lFileSize bytes)
21670 0a 20 20 2a 2a 20 20 20 20 20 44 61 74 61 62 61  .  **     Databa
21680 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 20 20 20  se file name    
21690 20 20 20 20 20 20 20 20 20 20 28 6e 50 61 74 68            (nPath
216a0 6e 61 6d 65 2b 31 20 62 79 74 65 73 29 0a 20 20  name+1 bytes).  
216b0 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66  **     Journal f
216c0 69 6c 65 20 6e 61 6d 65 20 20 20 20 20 20 20 20  ile name        
216d0 20 20 20 20 20 20 20 28 6e 50 61 74 68 6e 61 6d         (nPathnam
216e0 65 2b 38 2b 31 20 62 79 74 65 73 29 0a 20 20 2a  e+8+1 bytes).  *
216f0 2f 0a 20 20 70 50 74 72 20 3d 20 28 75 38 20 2a  /.  pPtr = (u8 *
21700 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65  )sqlite3MallocZe
21710 72 6f 28 0a 20 20 20 20 52 4f 55 4e 44 38 28 73  ro(.    ROUND8(s
21720 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 29 20  izeof(*pPager)) 
21730 2b 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20  +      /* Pager 
21740 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20  structure */.   
21750 20 52 4f 55 4e 44 38 28 70 63 61 63 68 65 53 69   ROUND8(pcacheSi
21760 7a 65 29 20 2b 20 20 20 20 20 20 20 20 20 20 20  ze) +           
21770 2f 2a 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74  /* PCache object
21780 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44 38 28 70   */.    ROUND8(p
21790 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 20 2b  Vfs->szOsFile) +
217a0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61         /* The ma
217b0 69 6e 20 64 62 20 66 69 6c 65 20 2a 2f 0a 20 20  in db file */.  
217c0 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a    journalFileSiz
217d0 65 20 2a 20 32 20 2b 20 20 20 20 20 20 20 20 20  e * 2 +         
217e0 20 2f 2a 20 54 68 65 20 74 77 6f 20 6a 6f 75 72   /* The two jour
217f0 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 20 0a 20 20  nal files */ .  
21800 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31 20    nPathname + 1 
21810 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  +               
21820 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 2a 2f   /* zFilename */
21830 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b  .    nPathname +
21840 20 38 20 2b 20 31 20 20 20 20 20 20 20 20 20 20   8 + 1          
21850 20 20 20 20 2f 2a 20 7a 4a 6f 75 72 6e 61 6c 20      /* zJournal 
21860 2a 2f 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74  */.  );.  assert
21870 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
21880 47 4e 4d 45 4e 54 28 53 51 4c 49 54 45 5f 49 4e  GNMENT(SQLITE_IN
21890 54 5f 54 4f 5f 50 54 52 28 6a 6f 75 72 6e 61 6c  T_TO_PTR(journal
218a0 46 69 6c 65 53 69 7a 65 29 29 20 29 3b 0a 20 20  FileSize)) );.  
218b0 69 66 28 20 21 70 50 74 72 20 29 7b 0a 20 20 20  if( !pPtr ){.   
218c0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50   sqlite3_free(zP
218d0 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65  athname);.    re
218e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
218f0 4d 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 20  M;.  }.  pPager 
21900 3d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  =              (
21910 50 61 67 65 72 2a 29 28 70 50 74 72 29 3b 0a 20  Pager*)(pPtr);. 
21920 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65   pPager->pPCache
21930 20 3d 20 20 20 20 28 50 43 61 63 68 65 2a 29 28   =    (PCache*)(
21940 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 73  pPtr += ROUND8(s
21950 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 29 29  izeof(*pPager)))
21960 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 64 20 3d  ;.  pPager->fd =
21970 20 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65     (sqlite3_file
21980 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44  *)(pPtr += ROUND
21990 38 28 70 63 61 63 68 65 53 69 7a 65 29 29 3b 0a  8(pcacheSize));.
219a0 20 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 20 3d    pPager->sjfd =
219b0 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29   (sqlite3_file*)
219c0 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28  (pPtr += ROUND8(
219d0 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 29  pVfs->szOsFile))
219e0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 66 64 20  ;.  pPager->jfd 
219f0 3d 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  =  (sqlite3_file
21a00 2a 29 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e  *)(pPtr += journ
21a10 61 6c 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20 70  alFileSize);.  p
21a20 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
21a30 20 3d 20 20 20 20 28 63 68 61 72 2a 29 28 70 50   =    (char*)(pP
21a40 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c  tr += journalFil
21a50 65 53 69 7a 65 29 3b 0a 20 20 61 73 73 65 72 74  eSize);.  assert
21a60 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
21a70 47 4e 4d 45 4e 54 28 70 50 61 67 65 72 2d 3e 6a  GNMENT(pPager->j
21a80 66 64 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c  fd) );..  /* Fil
21a90 6c 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e 7a  l in the Pager.z
21aa0 46 69 6c 65 6e 61 6d 65 20 61 6e 64 20 50 61 67  Filename and Pag
21ab0 65 72 2e 7a 4a 6f 75 72 6e 61 6c 20 62 75 66 66  er.zJournal buff
21ac0 65 72 73 2c 20 69 66 20 72 65 71 75 69 72 65 64  ers, if required
21ad0 2e 20 2a 2f 0a 20 20 69 66 28 20 7a 50 61 74 68  . */.  if( zPath
21ae0 6e 61 6d 65 20 29 7b 0a 20 20 20 20 70 50 61 67  name ){.    pPag
21af0 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 20  er->zJournal =  
21b00 20 28 63 68 61 72 2a 29 28 70 50 74 72 20 2b 3d   (char*)(pPtr +=
21b10 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31 29 3b   nPathname + 1);
21b20 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67  .    memcpy(pPag
21b30 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a  er->zFilename, z
21b40 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e  Pathname, nPathn
21b50 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  ame);.    memcpy
21b60 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  (pPager->zJourna
21b70 6c 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50  l, zPathname, nP
21b80 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65  athname);.    me
21b90 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 4a  mcpy(&pPager->zJ
21ba0 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65  ournal[nPathname
21bb0 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22 2c 20 38  ], "-journal", 8
21bc0 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
21bd0 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d  r->zFilename[0]=
21be0 3d 30 20 29 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  =0 ) pPager->zJo
21bf0 75 72 6e 61 6c 5b 30 5d 20 3d 20 30 3b 0a 20 20  urnal[0] = 0;.  
21c00 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
21c10 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20  Pathname);.  }. 
21c20 20 70 50 61 67 65 72 2d 3e 70 56 66 73 20 3d 20   pPager->pVfs = 
21c30 70 56 66 73 3b 0a 20 20 70 50 61 67 65 72 2d 3e  pVfs;.  pPager->
21c40 76 66 73 46 6c 61 67 73 20 3d 20 76 66 73 46 6c  vfsFlags = vfsFl
21c50 61 67 73 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20  ags;..  /* Open 
21c60 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a  the pager file..
21c70 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65    */.  if( zFile
21c80 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d  name && zFilenam
21c90 65 5b 30 5d 20 26 26 20 21 6d 65 6d 44 62 20 29  e[0] && !memDb )
21ca0 7b 0a 20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d  {.    int fout =
21cb0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
21cc0 20 20 20 20 20 20 20 2f 2a 20 56 46 53 20 66 6c         /* VFS fl
21cd0 61 67 73 20 72 65 74 75 72 6e 65 64 20 62 79 20  ags returned by 
21ce0 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 20 20 72  xOpen() */.    r
21cf0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
21d00 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  n(pVfs, pPager->
21d10 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65  zFilename, pPage
21d20 72 2d 3e 66 64 2c 20 76 66 73 46 6c 61 67 73 2c  r->fd, vfsFlags,
21d30 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 72 65 61   &fout);.    rea
21d40 64 4f 6e 6c 79 20 3d 20 28 66 6f 75 74 26 53 51  dOnly = (fout&SQ
21d50 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
21d60 4c 59 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  LY);..    /* If 
21d70 74 68 65 20 66 69 6c 65 20 77 61 73 20 73 75 63  the file was suc
21d80 63 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64  cessfully opened
21d90 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20   for read/write 
21da0 61 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20 63  access,.    ** c
21db0 68 6f 6f 73 65 20 61 20 64 65 66 61 75 6c 74 20  hoose a default 
21dc0 70 61 67 65 20 73 69 7a 65 20 69 6e 20 63 61 73  page size in cas
21dd0 65 20 77 65 20 68 61 76 65 20 74 6f 20 63 72 65  e we have to cre
21de0 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 64  ate the.    ** d
21df0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68  atabase file. Th
21e00 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 20 73  e default page s
21e10 69 7a 65 20 69 73 20 74 68 65 20 6d 61 78 69 6d  ize is the maxim
21e20 75 6d 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20  um of:.    **.  
21e30 20 20 2a 2a 20 20 20 20 2b 20 53 51 4c 49 54 45    **    + SQLITE
21e40 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
21e50 5a 45 2c 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20  ZE,.    **    + 
21e60 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  The value return
21e70 65 64 20 62 79 20 73 71 6c 69 74 65 33 4f 73 53  ed by sqlite3OsS
21e80 65 63 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20  ectorSize().    
21e90 2a 2a 20 20 20 20 2b 20 54 68 65 20 6c 61 72 67  **    + The larg
21ea0 65 73 74 20 70 61 67 65 20 73 69 7a 65 20 74 68  est page size th
21eb0 61 74 20 63 61 6e 20 62 65 20 77 72 69 74 74 65  at can be writte
21ec0 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20  n atomically..  
21ed0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d    */.    if( rc=
21ee0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 72  =SQLITE_OK && !r
21ef0 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20  eadOnly ){.     
21f00 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70   setSectorSize(p
21f10 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 61 73  Pager);.      as
21f20 73 65 72 74 28 53 51 4c 49 54 45 5f 44 45 46 41  sert(SQLITE_DEFA
21f30 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 53  ULT_PAGE_SIZE<=S
21f40 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c  QLITE_MAX_DEFAUL
21f50 54 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20  T_PAGE_SIZE);.  
21f60 20 20 20 20 69 66 28 20 73 7a 50 61 67 65 44 66      if( szPageDf
21f70 6c 74 3c 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  lt<pPager->secto
21f80 72 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  rSize ){.       
21f90 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 65 63   if( pPager->sec
21fa0 74 6f 72 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d  torSize>SQLITE_M
21fb0 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  AX_DEFAULT_PAGE_
21fc0 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 20 20  SIZE ){.        
21fd0 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53    szPageDflt = S
21fe0 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c  QLITE_MAX_DEFAUL
21ff0 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 20  T_PAGE_SIZE;.   
22000 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
22010 20 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74        szPageDflt
22020 20 3d 20 28 75 31 36 29 70 50 61 67 65 72 2d 3e   = (u16)pPager->
22030 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20  sectorSize;.    
22040 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69      }.      }.#i
22050 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
22060 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a  LE_ATOMIC_WRITE.
22070 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
22080 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65  int iDc = sqlite
22090 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
220a0 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
220b0 3e 66 64 29 3b 0a 20 20 20 20 20 20 20 20 69 6e  >fd);.        in
220c0 74 20 69 69 3b 0a 20 20 20 20 20 20 20 20 61 73  t ii;.        as
220d0 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41  sert(SQLITE_IOCA
220e0 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31  P_ATOMIC512==(51
220f0 32 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20 20 20  2>>8));.        
22100 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f  assert(SQLITE_IO
22110 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28  CAP_ATOMIC64K==(
22120 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20  65536>>8));.    
22130 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54      assert(SQLIT
22140 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41  E_MAX_DEFAULT_PA
22150 47 45 5f 53 49 5a 45 3c 3d 36 35 35 33 36 29 3b  GE_SIZE<=65536);
22160 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d  .        for(ii=
22170 73 7a 50 61 67 65 44 66 6c 74 3b 20 69 69 3c 3d  szPageDflt; ii<=
22180 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55  SQLITE_MAX_DEFAU
22190 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20 69 69  LT_PAGE_SIZE; ii
221a0 3d 69 69 2a 32 29 7b 0a 20 20 20 20 20 20 20 20  =ii*2){.        
221b0 20 20 69 66 28 20 69 44 63 26 28 53 51 4c 49 54    if( iDc&(SQLIT
221c0 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28  E_IOCAP_ATOMIC|(
221d0 69 69 3e 3e 38 29 29 20 29 7b 0a 20 20 20 20 20  ii>>8)) ){.     
221e0 20 20 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c         szPageDfl
221f0 74 20 3d 20 69 69 3b 0a 20 20 20 20 20 20 20 20  t = ii;.        
22200 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
22210 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
22220 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
22230 2f 2a 20 49 66 20 61 20 74 65 6d 70 6f 72 61 72  /* If a temporar
22240 79 20 66 69 6c 65 20 69 73 20 72 65 71 75 65 73  y file is reques
22250 74 65 64 2c 20 69 74 20 69 73 20 6e 6f 74 20 6f  ted, it is not o
22260 70 65 6e 65 64 20 69 6d 6d 65 64 69 61 74 65 6c  pened immediatel
22270 79 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 69  y..    ** In thi
22280 73 20 63 61 73 65 20 77 65 20 61 63 63 65 70 74  s case we accept
22290 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 61 67   the default pag
222a0 65 20 73 69 7a 65 20 61 6e 64 20 64 65 6c 61 79  e size and delay
222b0 20 61 63 74 75 61 6c 6c 79 0a 20 20 20 20 2a 2a   actually.    **
222c0 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 66 69 6c   opening the fil
222d0 65 20 75 6e 74 69 6c 20 74 68 65 20 66 69 72 73  e until the firs
222e0 74 20 63 61 6c 6c 20 74 6f 20 4f 73 57 72 69 74  t call to OsWrit
222f0 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  e()..    **.    
22300 2a 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 69  ** This branch i
22310 73 20 61 6c 73 6f 20 72 75 6e 20 66 6f 72 20 61  s also run for a
22320 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
22330 62 61 73 65 2e 20 41 6e 20 69 6e 2d 6d 65 6d 6f  base. An in-memo
22340 72 79 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  ry.    ** databa
22350 73 65 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  se is the same a
22360 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 74 68  s a temp-file th
22370 61 74 20 69 73 20 6e 65 76 65 72 20 77 72 69 74  at is never writ
22380 74 65 6e 20 6f 75 74 20 74 6f 0a 20 20 20 20 2a  ten out to.    *
22390 2a 20 64 69 73 6b 20 61 6e 64 20 75 73 65 73 20  * disk and uses 
223a0 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 6f 6c  an in-memory rol
223b0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 20  lback journal.. 
223c0 20 20 20 2a 2f 20 0a 20 20 20 20 74 65 6d 70 46     */ .    tempF
223d0 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20 70 50 61  ile = 1;.    pPa
223e0 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
223f0 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20  ER_EXCLUSIVE;.  
22400 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28 76 66    readOnly = (vf
22410 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50  sFlags&SQLITE_OP
22420 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20  EN_READONLY);.  
22430 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  }..  /* The foll
22440 6f 77 69 6e 67 20 63 61 6c 6c 20 74 6f 20 50 61  owing call to Pa
22450 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 29  gerSetPagesize()
22460 20 73 65 72 76 65 73 20 74 6f 20 73 65 74 20 74   serves to set t
22470 68 65 20 76 61 6c 75 65 20 6f 66 20 0a 20 20 2a  he value of .  *
22480 2a 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65  * Pager.pageSize
22490 20 61 6e 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65   and to allocate
224a0 20 74 68 65 20 50 61 67 65 72 2e 70 54 6d 70 53   the Pager.pTmpS
224b0 70 61 63 65 20 62 75 66 66 65 72 2e 0a 20 20 2a  pace buffer..  *
224c0 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
224d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
224e0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d  ert( pPager->mem
224f0 44 62 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20  Db==0 );.    rc 
22500 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  = sqlite3PagerSe
22510 74 50 61 67 65 73 69 7a 65 28 70 50 61 67 65 72  tPagesize(pPager
22520 2c 20 26 73 7a 50 61 67 65 44 66 6c 74 2c 20 2d  , &szPageDflt, -
22530 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  1);.    testcase
22540 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
22550 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
22560 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  an error occurre
22570 64 20 69 6e 20 65 69 74 68 65 72 20 6f 66 20 74  d in either of t
22580 68 65 20 62 6c 6f 63 6b 73 20 61 62 6f 76 65 2c  he blocks above,
22590 20 66 72 65 65 20 74 68 65 20 0a 20 20 2a 2a 20   free the .  ** 
225a0 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  Pager structure 
225b0 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 20 66 69  and close the fi
225c0 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  le..  */.  if( r
225d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
225e0 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61      assert( !pPa
225f0 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 29  ger->pTmpSpace )
22600 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  ;.    sqlite3OsC
22610 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29  lose(pPager->fd)
22620 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
22630 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ee(pPager);.    
22640 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
22650 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
22660 74 68 65 20 50 43 61 63 68 65 20 6f 62 6a 65 63  the PCache objec
22670 74 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  t. */.  assert( 
22680 6e 45 78 74 72 61 3c 31 30 30 30 20 29 3b 0a 20  nExtra<1000 );. 
22690 20 6e 45 78 74 72 61 20 3d 20 52 4f 55 4e 44 38   nExtra = ROUND8
226a0 28 6e 45 78 74 72 61 29 3b 0a 20 20 73 71 6c 69  (nExtra);.  sqli
226b0 74 65 33 50 63 61 63 68 65 4f 70 65 6e 28 73 7a  te3PcacheOpen(sz
226c0 50 61 67 65 44 66 6c 74 2c 20 6e 45 78 74 72 61  PageDflt, nExtra
226d0 2c 20 21 6d 65 6d 44 62 2c 0a 20 20 20 20 20 20  , !memDb,.      
226e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 21 6d                !m
226f0 65 6d 44 62 3f 70 61 67 65 72 53 74 72 65 73 73  emDb?pagerStress
22700 3a 30 2c 20 28 76 6f 69 64 20 2a 29 70 50 61 67  :0, (void *)pPag
22710 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 50 43 61  er, pPager->pPCa
22720 63 68 65 29 3b 0a 0a 20 20 50 41 47 45 52 54 52  che);..  PAGERTR
22730 41 43 45 28 28 22 4f 50 45 4e 20 25 64 20 25 73  ACE(("OPEN %d %s
22740 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49  \n", FILEHANDLEI
22750 44 28 70 50 61 67 65 72 2d 3e 66 64 29 2c 20 70  D(pPager->fd), p
22760 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
22770 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22  ));.  IOTRACE(("
22780 4f 50 45 4e 20 25 70 20 25 73 5c 6e 22 2c 20 70  OPEN %p %s\n", p
22790 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 7a  Pager, pPager->z
227a0 46 69 6c 65 6e 61 6d 65 29 29 0a 0a 20 20 70 50  Filename))..  pP
227b0 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
227c0 20 3d 20 28 75 38 29 75 73 65 4a 6f 75 72 6e 61   = (u8)useJourna
227d0 6c 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 52  l;.  pPager->noR
227e0 65 61 64 6c 6f 63 6b 20 3d 20 28 6e 6f 52 65 61  eadlock = (noRea
227f0 64 6c 6f 63 6b 20 26 26 20 72 65 61 64 4f 6e 6c  dlock && readOnl
22800 79 29 20 3f 31 3a 30 3b 0a 20 20 2f 2a 20 70 50  y) ?1:0;.  /* pP
22810 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d  ager->stmtOpen =
22820 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
22830 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20  er->stmtInUse = 
22840 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
22850 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 20 2a 2f 0a  r->nRef = 0; */.
22860 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
22870 56 61 6c 69 64 20 3d 20 28 75 38 29 6d 65 6d 44  Valid = (u8)memD
22880 62 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  b;.  /* pPager->
22890 73 74 6d 74 53 69 7a 65 20 3d 20 30 3b 20 2a 2f  stmtSize = 0; */
228a0 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74  .  /* pPager->st
228b0 6d 74 4a 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a  mtJSize = 0; */.
228c0 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 50 61    /* pPager->nPa
228d0 67 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  ge = 0; */.  pPa
228e0 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 53 51  ger->mxPgno = SQ
228f0 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 43 4f  LITE_MAX_PAGE_CO
22900 55 4e 54 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72  UNT;.  /* pPager
22910 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
22920 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20 20 61 73 73  UNLOCK; */.  ass
22930 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
22940 74 65 20 3d 3d 20 28 74 65 6d 70 46 69 6c 65 20  te == (tempFile 
22950 3f 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  ? PAGER_EXCLUSIV
22960 45 20 3a 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  E : PAGER_UNLOCK
22970 29 20 29 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72  ) );.  /* pPager
22980 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30 3b 20 2a  ->errMask = 0; *
22990 2f 0a 20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  /.  pPager->temp
229a0 46 69 6c 65 20 3d 20 28 75 38 29 74 65 6d 70 46  File = (u8)tempF
229b0 69 6c 65 3b 0a 20 20 61 73 73 65 72 74 28 20 74  ile;.  assert( t
229c0 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c  empFile==PAGER_L
229d0 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41  OCKINGMODE_NORMA
229e0 4c 20 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20  L .          || 
229f0 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f  tempFile==PAGER_
22a00 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c  LOCKINGMODE_EXCL
22a10 55 53 49 56 45 20 29 3b 0a 20 20 61 73 73 65 72  USIVE );.  asser
22a20 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  t( PAGER_LOCKING
22a30 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 3d 3d  MODE_EXCLUSIVE==
22a40 31 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65  1 );.  pPager->e
22a50 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 28  xclusiveMode = (
22a60 75 38 29 74 65 6d 70 46 69 6c 65 3b 20 0a 20 20  u8)tempFile; .  
22a70 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
22a80 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72  untDone = pPager
22a90 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50  ->tempFile;.  pP
22aa0 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3d 20 28 75  ager->memDb = (u
22ab0 38 29 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65  8)memDb;.  pPage
22ac0 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 28 75  r->readOnly = (u
22ad0 38 29 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 2f 2a  8)readOnly;.  /*
22ae0 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
22af0 63 20 3d 20 30 3b 20 2a 2f 0a 20 20 61 73 73 65  c = 0; */.  asse
22b00 72 74 28 20 75 73 65 4a 6f 75 72 6e 61 6c 20 7c  rt( useJournal |
22b10 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  | pPager->tempFi
22b20 6c 65 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  le );.  pPager->
22b30 6e 6f 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d  noSync = pPager-
22b40 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61  >tempFile;.  pPa
22b50 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20  ger->fullSync = 
22b60 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3f  pPager->noSync ?
22b70 30 3a 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  0:1;.  pPager->s
22b80 79 6e 63 5f 66 6c 61 67 73 20 3d 20 53 51 4c 49  ync_flags = SQLI
22b90 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a  TE_SYNC_NORMAL;.
22ba0 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69    /* pPager->pFi
22bb0 72 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  rst = 0; */.  /*
22bc0 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53   pPager->pFirstS
22bd0 79 6e 63 65 64 20 3d 20 30 3b 20 2a 2f 0a 20 20  ynced = 0; */.  
22be0 2f 2a 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74  /* pPager->pLast
22bf0 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
22c00 72 2d 3e 6e 45 78 74 72 61 20 3d 20 28 75 31 36  r->nExtra = (u16
22c10 29 6e 45 78 74 72 61 3b 0a 20 20 70 50 61 67 65  )nExtra;.  pPage
22c20 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69  r->journalSizeLi
22c30 6d 69 74 20 3d 20 53 51 4c 49 54 45 5f 44 45 46  mit = SQLITE_DEF
22c40 41 55 4c 54 5f 4a 4f 55 52 4e 41 4c 5f 53 49 5a  AULT_JOURNAL_SIZ
22c50 45 5f 4c 49 4d 49 54 3b 0a 20 20 61 73 73 65 72  E_LIMIT;.  asser
22c60 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
22c70 2d 3e 66 64 29 20 7c 7c 20 74 65 6d 70 46 69 6c  ->fd) || tempFil
22c80 65 20 29 3b 0a 20 20 73 65 74 53 65 63 74 6f 72  e );.  setSector
22c90 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20  Size(pPager);.  
22ca0 69 66 28 20 21 75 73 65 4a 6f 75 72 6e 61 6c 20  if( !useJournal 
22cb0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  ){.    pPager->j
22cc0 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47  ournalMode = PAG
22cd0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
22ce0 46 46 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  FF;.  }else if( 
22cf0 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 70 50 61  memDb ){.    pPa
22d00 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
22d10 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c   = PAGER_JOURNAL
22d20 4d 4f 44 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d  MODE_MEMORY;.  }
22d30 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 78 42  .  /* pPager->xB
22d40 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 30 3b 20  usyHandler = 0; 
22d50 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
22d60 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20  pBusyHandlerArg 
22d70 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
22d80 2d 3e 78 52 65 69 6e 69 74 65 72 20 3d 20 78 52  ->xReiniter = xR
22d90 65 69 6e 69 74 3b 0a 20 20 2f 2a 20 6d 65 6d 73  einit;.  /* mems
22da0 65 74 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68  et(pPager->aHash
22db0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67  , 0, sizeof(pPag
22dc0 65 72 2d 3e 61 48 61 73 68 29 29 3b 20 2a 2f 0a  er->aHash)); */.
22dd0 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20 70 50  .  *ppPager = pP
22de0 61 67 65 72 3b 0a 20 20 72 65 74 75 72 6e 20 53  ager;.  return S
22df0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f  QLITE_OK;.}..../
22e00 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
22e10 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74  on is called aft
22e20 65 72 20 74 72 61 6e 73 69 74 69 6f 6e 69 6e 67  er transitioning
22e30 20 66 72 6f 6d 20 50 41 47 45 52 5f 55 4e 4c 4f   from PAGER_UNLO
22e40 43 4b 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 53  CK to.** PAGER_S
22e50 48 41 52 45 44 20 73 74 61 74 65 2e 20 49 74 20  HARED state. It 
22e60 74 65 73 74 73 20 69 66 20 74 68 65 72 65 20 69  tests if there i
22e70 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  s a hot journal 
22e80 70 72 65 73 65 6e 74 20 69 6e 0a 2a 2a 20 74 68  present in.** th
22e90 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 6f  e file-system fo
22ea0 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65  r the given page
22eb0 72 2e 20 41 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  r. A hot journal
22ec0 20 69 73 20 6f 6e 65 20 74 68 61 74 20 0a 2a 2a   is one that .**
22ed0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61   needs to be pla
22ee0 79 65 64 20 62 61 63 6b 2e 20 41 63 63 6f 72 64  yed back. Accord
22ef0 69 6e 67 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ing to this func
22f00 74 69 6f 6e 2c 20 61 20 68 6f 74 2d 6a 6f 75 72  tion, a hot-jour
22f10 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 65 78 69 73  nal.** file exis
22f20 74 73 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ts if the follow
22f30 69 6e 67 20 63 72 69 74 65 72 69 61 20 61 72 65  ing criteria are
22f40 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20   met:.**.**   * 
22f50 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
22f60 20 65 78 69 73 74 73 20 69 6e 20 74 68 65 20 66   exists in the f
22f70 69 6c 65 20 73 79 73 74 65 6d 2c 20 61 6e 64 0a  ile system, and.
22f80 2a 2a 20 20 20 2a 20 4e 6f 20 70 72 6f 63 65 73  **   * No proces
22f90 73 20 68 6f 6c 64 73 20 61 20 52 45 53 45 52 56  s holds a RESERV
22fa0 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  ED or greater lo
22fb0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
22fc0 73 65 20 66 69 6c 65 2c 20 61 6e 64 0a 2a 2a 20  se file, and.** 
22fd0 20 20 2a 20 54 68 65 20 64 61 74 61 62 61 73 65    * The database
22fe0 20 66 69 6c 65 20 69 74 73 65 6c 66 20 69 73 20   file itself is 
22ff0 67 72 65 61 74 65 72 20 74 68 61 6e 20 30 20 62  greater than 0 b
23000 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 61 6e  ytes in size, an
23010 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 66 69 72  d.**   * The fir
23020 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 6a  st byte of the j
23030 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73  ournal file exis
23040 74 73 20 61 6e 64 20 69 73 20 6e 6f 74 20 30 78  ts and is not 0x
23050 30 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  00..**.** If the
23060 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   current size of
23070 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
23080 6c 65 20 69 73 20 30 20 62 75 74 20 61 20 6a 6f  le is 0 but a jo
23090 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78  urnal file.** ex
230a0 69 73 74 73 2c 20 74 68 61 74 20 69 73 20 70 72  ists, that is pr
230b0 6f 62 61 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f  obably an old jo
230c0 75 72 6e 61 6c 20 6c 65 66 74 20 6f 76 65 72 20  urnal left over 
230d0 66 72 6f 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20  from a prior.** 
230e0 64 61 74 61 62 61 73 65 20 77 69 74 68 20 74 68  database with th
230f0 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 49 6e 20  e same name. In 
23100 74 68 69 73 20 63 61 73 65 20 74 68 65 20 6a 6f  this case the jo
23110 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 0a 2a 2a  urnal file is.**
23120 20 6a 75 73 74 20 64 65 6c 65 74 65 64 20 75 73   just deleted us
23130 69 6e 67 20 4f 73 44 65 6c 65 74 65 2c 20 2a 70  ing OsDelete, *p
23140 45 78 69 73 74 73 20 69 73 20 73 65 74 20 74 6f  Exists is set to
23150 20 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b   0 and SQLITE_OK
23160 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e  .** is returned.
23170 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
23180 69 6e 65 20 64 6f 65 73 20 6e 6f 74 20 63 68 65  ine does not che
23190 63 6b 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ck if there is a
231a0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
231b0 66 69 6c 65 6e 61 6d 65 0a 2a 2a 20 61 74 20 74  filename.** at t
231c0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69  he end of the fi
231d0 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69 73 2c  le. If there is,
231e0 20 61 6e 64 20 74 68 61 74 20 6d 61 73 74 65 72   and that master
231f0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a   journal file.**
23200 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c   does not exist,
23210 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   then the journa
23220 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 72 65  l file is not re
23230 61 6c 6c 79 20 68 6f 74 2e 20 49 6e 20 74 68 69  ally hot. In thi
23240 73 0a 2a 2a 20 63 61 73 65 20 74 68 69 73 20 72  s.** case this r
23250 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75  outine will retu
23260 72 6e 20 61 20 66 61 6c 73 65 2d 70 6f 73 69 74  rn a false-posit
23270 69 76 65 2e 20 54 68 65 20 70 61 67 65 72 5f 70  ive. The pager_p
23280 6c 61 79 62 61 63 6b 28 29 0a 2a 2a 20 72 6f 75  layback().** rou
23290 74 69 6e 65 20 77 69 6c 6c 20 64 69 73 63 6f 76  tine will discov
232a0 65 72 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72  er that the jour
232b0 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  nal file is not 
232c0 72 65 61 6c 6c 79 20 68 6f 74 20 61 6e 64 20 0a  really hot and .
232d0 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c  ** will not roll
232e0 20 69 74 20 62 61 63 6b 2e 20 0a 2a 2a 0a 2a 2a   it back. .**.**
232f0 20 49 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   If a hot-journa
23300 6c 20 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 20  l file is found 
23310 74 6f 20 65 78 69 73 74 2c 20 2a 70 45 78 69 73  to exist, *pExis
23320 74 73 20 69 73 20 73 65 74 20 74 6f 20 31 20 61  ts is set to 1 a
23330 6e 64 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  nd .** SQLITE_OK
23340 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 6e 6f   returned. If no
23350 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   hot-journal fil
23360 65 20 69 73 20 70 72 65 73 65 6e 74 2c 20 2a 70  e is present, *p
23370 45 78 69 73 74 73 20 69 73 0a 2a 2a 20 73 65 74  Exists is.** set
23380 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45   to 0 and SQLITE
23390 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66  _OK returned. If
233a0 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
233b0 75 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67  urs while trying
233c0 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  .** to determine
233d0 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
233e0 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69  a hot-journal fi
233f0 6c 65 20 65 78 69 73 74 73 2c 20 74 68 65 20 49  le exists, the I
23400 4f 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20  O error.** code 
23410 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
23420 74 68 65 20 76 61 6c 75 65 20 6f 66 20 2a 70 45  the value of *pE
23430 78 69 73 74 73 20 69 73 20 75 6e 64 65 66 69 6e  xists is undefin
23440 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
23450 74 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28  t hasHotJournal(
23460 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
23470 6e 74 20 2a 70 45 78 69 73 74 73 29 7b 0a 20 20  nt *pExists){.  
23480 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f  sqlite3_vfs * co
23490 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61 67 65  nst pVfs = pPage
234a0 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 72  r->pVfs;.  int r
234b0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
234c0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
234d0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
234e0 20 65 78 69 73 74 73 3b 20 20 20 20 20 20 20 20   exists;        
234f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
23500 75 65 20 69 66 20 61 20 6a 6f 75 72 6e 61 6c 20  ue if a journal 
23510 66 69 6c 65 20 69 73 20 70 72 65 73 65 6e 74 20  file is present 
23520 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
23530 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73  ager!=0 );.  ass
23540 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65  ert( pPager->use
23550 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73  Journal );.  ass
23560 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
23570 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 61 73 73  er->fd) );.  ass
23580 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50 61  ert( !isOpen(pPa
23590 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 61  ger->jfd) );.  a
235a0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
235b0 74 61 74 65 20 3c 3d 20 50 41 47 45 52 5f 53 48  tate <= PAGER_SH
235c0 41 52 45 44 20 29 3b 0a 0a 20 20 2a 70 45 78 69  ARED );..  *pExi
235d0 73 74 73 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20  sts = 0;.  rc = 
235e0 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
235f0 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
23600 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41  ournal, SQLITE_A
23610 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 65  CCESS_EXISTS, &e
23620 78 69 73 74 73 29 3b 0a 20 20 69 66 28 20 72 63  xists);.  if( rc
23630 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65  ==SQLITE_OK && e
23640 78 69 73 74 73 20 29 7b 0a 20 20 20 20 69 6e 74  xists ){.    int
23650 20 6c 6f 63 6b 65 64 3b 20 20 20 20 20 20 20 20   locked;        
23660 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
23670 20 69 66 20 73 6f 6d 65 20 70 72 6f 63 65 73 73   if some process
23680 20 68 6f 6c 64 73 20 61 20 52 45 53 45 52 56 45   holds a RESERVE
23690 44 20 6c 6f 63 6b 20 2a 2f 0a 0a 20 20 20 20 2f  D lock */..    /
236a0 2a 20 52 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e  * Race condition
236b0 20 68 65 72 65 3a 20 20 41 6e 6f 74 68 65 72 20   here:  Another 
236c0 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20 68 61  process might ha
236d0 76 65 20 62 65 65 6e 20 68 6f 6c 64 69 6e 67 20  ve been holding 
236e0 74 68 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 52  the.    ** the R
236f0 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 61 6e 64  ESERVED lock and
23700 20 68 61 76 65 20 61 20 6a 6f 75 72 6e 61 6c 20   have a journal 
23710 6f 70 65 6e 20 61 74 20 74 68 65 20 73 71 6c 69  open at the sqli
23720 74 65 33 4f 73 41 63 63 65 73 73 28 29 20 0a 20  te3OsAccess() . 
23730 20 20 20 2a 2a 20 63 61 6c 6c 20 61 62 6f 76 65     ** call above
23740 2c 20 62 75 74 20 74 68 65 6e 20 64 65 6c 65 74  , but then delet
23750 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e  e the journal an
23760 64 20 64 72 6f 70 20 74 68 65 20 6c 6f 63 6b 20  d drop the lock 
23770 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 77 65  before.    ** we
23780 20 67 65 74 20 74 6f 20 74 68 65 20 66 6f 6c 6c   get to the foll
23790 6f 77 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 43  owing sqlite3OsC
237a0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
237b0 28 29 20 63 61 6c 6c 2e 20 20 49 66 20 74 68 61  () call.  If tha
237c0 74 0a 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20  t.    ** is the 
237d0 63 61 73 65 2c 20 74 68 69 73 20 72 6f 75 74 69  case, this routi
237e0 6e 65 20 6d 69 67 68 74 20 74 68 69 6e 6b 20 74  ne might think t
237f0 68 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a 6f  here is a hot jo
23800 75 72 6e 61 6c 20 77 68 65 6e 0a 20 20 20 20 2a  urnal when.    *
23810 2a 20 69 6e 20 66 61 63 74 20 74 68 65 72 65 20  * in fact there 
23820 69 73 20 6e 6f 6e 65 2e 20 20 54 68 69 73 20 72  is none.  This r
23830 65 73 75 6c 74 73 20 69 6e 20 61 20 66 61 6c 73  esults in a fals
23840 65 2d 70 6f 73 69 74 69 76 65 20 77 68 69 63 68  e-positive which
23850 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20   will.    ** be 
23860 64 65 61 6c 74 20 77 69 74 68 20 62 79 20 74 68  dealt with by th
23870 65 20 70 6c 61 79 62 61 63 6b 20 72 6f 75 74 69  e playback routi
23880 6e 65 2e 20 20 54 69 63 6b 65 74 20 23 33 38 38  ne.  Ticket #388
23890 33 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  3..    */.    rc
238a0 20 3d 20 73 71 6c 69 74 65 33 4f 73 43 68 65 63   = sqlite3OsChec
238b0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 70 50  kReservedLock(pP
238c0 61 67 65 72 2d 3e 66 64 2c 20 26 6c 6f 63 6b 65  ager->fd, &locke
238d0 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  d);.    if( rc==
238e0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 6c 6f  SQLITE_OK && !lo
238f0 63 6b 65 64 20 29 7b 0a 20 20 20 20 20 20 69 6e  cked ){.      in
23900 74 20 6e 50 61 67 65 3b 0a 0a 20 20 20 20 20 20  t nPage;..      
23910 2f 2a 20 43 68 65 63 6b 20 74 68 65 20 73 69 7a  /* Check the siz
23920 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
23930 65 20 66 69 6c 65 2e 20 49 66 20 69 74 20 63 6f  e file. If it co
23940 6e 73 69 73 74 73 20 6f 66 20 30 20 70 61 67 65  nsists of 0 page
23950 73 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  s,.      ** then
23960 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72   delete the jour
23970 6e 61 6c 20 66 69 6c 65 2e 20 53 65 65 20 74 68  nal file. See th
23980 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74  e header comment
23990 20 61 62 6f 76 65 20 66 6f 72 20 0a 20 20 20 20   above for .    
239a0 20 20 2a 2a 20 74 68 65 20 72 65 61 73 6f 6e 69    ** the reasoni
239b0 6e 67 20 68 65 72 65 2e 20 20 44 65 6c 65 74 65  ng here.  Delete
239c0 20 74 68 65 20 6f 62 73 6f 6c 65 74 65 20 6a 6f   the obsolete jo
239d0 75 72 6e 61 6c 20 66 69 6c 65 20 75 6e 64 65 72  urnal file under
239e0 0a 20 20 20 20 20 20 2a 2a 20 61 20 52 45 53 45  .      ** a RESE
239f0 52 56 45 44 20 6c 6f 63 6b 20 74 6f 20 61 76 6f  RVED lock to avo
23a00 69 64 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f  id race conditio
23a10 6e 73 20 61 6e 64 20 74 6f 20 61 76 6f 69 64 20  ns and to avoid 
23a20 76 69 6f 6c 61 74 69 6e 67 0a 20 20 20 20 20 20  violating.      
23a30 2a 2a 20 5b 48 33 33 30 32 30 5d 2e 0a 20 20 20  ** [H33020]..   
23a40 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
23a50 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
23a60 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26  ecount(pPager, &
23a70 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  nPage);.      if
23a80 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
23a90 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  ){.        if( n
23aa0 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Page==0 ){.     
23ab0 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69       sqlite3Begi
23ac0 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
23ad0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
23ae0 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61  qlite3OsLock(pPa
23af0 67 65 72 2d 3e 66 64 2c 20 52 45 53 45 52 56 45  ger->fd, RESERVE
23b00 44 5f 4c 4f 43 4b 29 3d 3d 53 51 4c 49 54 45 5f  D_LOCK)==SQLITE_
23b10 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
23b20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74    sqlite3OsDelet
23b30 65 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  e(pVfs, pPager->
23b40 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20  zJournal, 0);.  
23b50 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
23b60 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72  3OsUnlock(pPager
23b70 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43  ->fd, SHARED_LOC
23b80 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  K);.          }.
23b90 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
23ba0 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
23bb0 28 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ();.        }els
23bc0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
23bd0 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
23be0 20 65 78 69 73 74 73 20 61 6e 64 20 6e 6f 20 6f   exists and no o
23bf0 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ther connection 
23c00 68 61 73 20 61 20 72 65 73 65 72 76 65 64 0a 20  has a reserved. 
23c10 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 67           ** or g
23c20 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74  reater lock on t
23c30 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
23c40 2e 20 4e 6f 77 20 63 68 65 63 6b 20 74 68 61 74  . Now check that
23c50 20 74 68 65 72 65 20 69 73 0a 20 20 20 20 20 20   there is.      
23c60 20 20 20 20 2a 2a 20 61 74 20 6c 65 61 73 74 20      ** at least 
23c70 6f 6e 65 20 6e 6f 6e 2d 7a 65 72 6f 20 62 79 74  one non-zero byt
23c80 65 73 20 61 74 20 74 68 65 20 73 74 61 72 74 20  es at the start 
23c90 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
23ca0 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ile..          *
23cb0 2a 20 49 66 20 74 68 65 72 65 20 69 73 2c 20 74  * If there is, t
23cc0 68 65 6e 20 77 65 20 63 6f 6e 73 69 64 65 72 20  hen we consider 
23cd0 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 74 6f 20  this journal to 
23ce0 62 65 20 68 6f 74 2e 20 49 66 20 6e 6f 74 2c 20  be hot. If not, 
23cf0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74  .          ** it
23d00 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65 64 2e   can be ignored.
23d10 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
23d20 20 20 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20          int f = 
23d30 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
23d40 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  ONLY|SQLITE_OPEN
23d50 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20  _MAIN_JOURNAL;. 
23d60 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
23d70 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73  lite3OsOpen(pVfs
23d80 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
23d90 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c  al, pPager->jfd,
23da0 20 66 2c 20 26 66 29 3b 0a 20 20 20 20 20 20 20   f, &f);.       
23db0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
23dc0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
23dd0 20 20 20 20 75 38 20 66 69 72 73 74 20 3d 20 30      u8 first = 0
23de0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
23df0 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
23e00 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 28 76  (pPager->jfd, (v
23e10 6f 69 64 20 2a 29 26 66 69 72 73 74 2c 20 31 2c  oid *)&first, 1,
23e20 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
23e30 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
23e40 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
23e50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
23e60 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
23e70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
23e80 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
23e90 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
23ea0 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20  r->jfd);.       
23eb0 20 20 20 20 20 2a 70 45 78 69 73 74 73 20 3d 20       *pExists = 
23ec0 28 66 69 72 73 74 21 3d 30 29 3b 0a 20 20 20 20  (first!=0);.    
23ed0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
23ee0 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f  rc==SQLITE_CANTO
23ef0 50 45 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  PEN ){.         
23f00 20 20 20 2f 2a 20 49 66 20 77 65 20 63 61 6e 6e     /* If we cann
23f10 6f 74 20 6f 70 65 6e 20 74 68 65 20 72 6f 6c 6c  ot open the roll
23f20 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  back journal fil
23f30 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 65  e in order to se
23f40 65 20 69 66 0a 20 20 20 20 20 20 20 20 20 20 20  e if.           
23f50 20 2a 2a 20 69 74 73 20 68 61 73 20 61 20 7a 65   ** its has a ze
23f60 72 6f 20 68 65 61 64 65 72 2c 20 74 68 61 74 20  ro header, that 
23f70 6d 69 67 68 74 20 62 65 20 64 75 65 20 74 6f 20  might be due to 
23f80 61 6e 20 49 2f 4f 20 65 72 72 6f 72 2c 20 6f 72  an I/O error, or
23f90 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
23fa0 69 74 20 6d 69 67 68 74 20 62 65 20 64 75 65 20  it might be due 
23fb0 74 6f 20 74 68 65 20 72 61 63 65 20 63 6f 6e 64  to the race cond
23fc0 69 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20  ition described 
23fd0 61 62 6f 76 65 20 61 6e 64 20 69 6e 0a 20 20 20  above and in.   
23fe0 20 20 20 20 20 20 20 20 20 2a 2a 20 74 69 63 6b           ** tick
23ff0 65 74 20 23 33 38 38 33 2e 20 20 45 69 74 68 65  et #3883.  Eithe
24000 72 20 77 61 79 2c 20 61 73 73 75 6d 65 20 74 68  r way, assume th
24010 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  at the journal i
24020 73 20 68 6f 74 2e 0a 20 20 20 20 20 20 20 20 20  s hot..         
24030 20 20 20 2a 2a 20 54 68 69 73 20 6d 69 67 68 74     ** This might
24040 20 62 65 20 61 20 66 61 6c 73 65 20 70 6f 73 69   be a false posi
24050 74 69 76 65 2e 20 20 42 75 74 20 69 66 20 69 74  tive.  But if it
24060 20 69 73 2c 20 74 68 65 6e 20 74 68 65 0a 20 20   is, then the.  
24070 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 75 74            ** aut
24080 6f 6d 61 74 69 63 20 6a 6f 75 72 6e 61 6c 20 70  omatic journal p
24090 6c 61 79 62 61 63 6b 20 61 6e 64 20 72 65 63 6f  layback and reco
240a0 76 65 72 79 20 6d 65 63 68 61 6e 69 73 6d 20 77  very mechanism w
240b0 69 6c 6c 20 64 65 61 6c 0a 20 20 20 20 20 20 20  ill deal.       
240c0 20 20 20 20 20 2a 2a 20 77 69 74 68 20 69 74 20       ** with it 
240d0 75 6e 64 65 72 20 61 6e 20 45 58 43 4c 55 53 49  under an EXCLUSI
240e0 56 45 20 6c 6f 63 6b 20 77 68 65 72 65 20 77 65  VE lock where we
240f0 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 0a   do not need to.
24100 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77              ** w
24110 6f 72 72 79 20 73 6f 20 6d 75 63 68 20 77 69 74  orry so much wit
24120 68 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e  h race condition
24130 73 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  s..            *
24140 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70  /.            *p
24150 45 78 69 73 74 73 20 3d 20 31 3b 0a 20 20 20 20  Exists = 1;.    
24160 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
24170 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
24180 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
24190 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
241a0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
241b0 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 69 66 20  ./*.** Check if 
241c0 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 74  the *-wal file t
241d0 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20  hat corresponds 
241e0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
241f0 6f 70 65 6e 65 64 20 62 79 20 70 50 61 67 65 72  opened by pPager
24200 0a 2a 2a 20 65 78 69 73 74 73 2e 20 41 73 73 75  .** exists. Assu
24210 6d 69 6e 67 20 6e 6f 20 65 72 72 6f 72 20 6f 63  ming no error oc
24220 63 75 72 73 2c 20 73 65 74 20 2a 70 45 78 69 73  curs, set *pExis
24230 74 73 20 74 6f 20 31 20 69 66 20 74 68 65 20 66  ts to 1 if the f
24240 69 6c 65 20 65 78 69 73 74 73 2c 0a 2a 2a 20 6f  ile exists,.** o
24250 72 20 30 20 6f 74 68 65 72 77 69 73 65 20 61 6e  r 0 otherwise an
24260 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
24270 4f 4b 2e 20 49 66 20 61 6e 20 49 4f 20 6f 72 20  OK. If an IO or 
24280 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75 72 73  OOM error occurs
24290 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 61 6e 20 53  , return.** an S
242a0 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
242b0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  ..**.** The call
242c0 65 72 20 6d 75 73 74 20 68 6f 6c 64 20 61 20 53  er must hold a S
242d0 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68  HARED lock on th
242e0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
242f0 74 6f 20 63 61 6c 6c 20 74 68 69 73 0a 2a 2a 20  to call this.** 
24300 66 75 6e 63 74 69 6f 6e 2e 20 42 65 63 61 75 73  function. Becaus
24310 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  e an EXCLUSIVE l
24320 6f 63 6b 20 6f 6e 20 74 68 65 20 64 62 20 66 69  ock on the db fi
24330 6c 65 20 69 73 20 72 65 71 75 69 72 65 64 20 74  le is required t
24340 6f 20 64 65 6c 65 74 65 20 0a 2a 2a 20 61 20 57  o delete .** a W
24350 41 4c 2c 20 74 68 69 73 20 65 6e 73 75 72 65 73  AL, this ensures
24360 20 74 68 65 72 65 20 69 73 20 6e 6f 20 72 61 63   there is no rac
24370 65 20 63 6f 6e 64 69 74 69 6f 6e 20 62 65 74 77  e condition betw
24380 65 65 6e 20 74 68 65 20 78 41 63 63 65 73 73 28  een the xAccess(
24390 29 20 0a 2a 2a 20 62 65 6c 6f 77 20 61 6e 64 20  ) .** below and 
243a0 61 6e 20 78 44 65 6c 65 74 65 28 29 20 62 65 69  an xDelete() bei
243b0 6e 67 20 65 78 65 63 75 74 65 64 20 62 79 20 73  ng executed by s
243c0 6f 6d 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63  ome other connec
243d0 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
243e0 69 6e 74 20 70 61 67 65 72 48 61 73 57 41 4c 28  int pagerHasWAL(
243f0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
24400 6e 74 20 2a 70 45 78 69 73 74 73 29 7b 0a 20 20  nt *pExists){.  
24410 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
24420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24430 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
24440 2f 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  /..  if( !pPager
24450 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20  ->tempFile ){.  
24460 20 20 63 68 61 72 20 2a 7a 4c 6f 67 20 3d 20 73    char *zLog = s
24470 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
24480 25 73 2d 77 61 6c 22 2c 20 70 50 61 67 65 72 2d  %s-wal", pPager-
24490 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  >zFilename);.   
244a0 20 69 66 28 20 21 7a 4c 6f 67 20 29 7b 0a 20 20   if( !zLog ){.  
244b0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
244c0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65  NOMEM;.    }else
244d0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
244e0 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 50 61  ite3OsAccess(pPa
244f0 67 65 72 2d 3e 70 56 66 73 2c 20 7a 4c 6f 67 2c  ger->pVfs, zLog,
24500 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
24510 58 49 53 54 53 2c 20 70 45 78 69 73 74 73 29 3b  XISTS, pExists);
24520 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
24530 72 65 65 28 7a 4c 6f 67 29 3b 0a 20 20 20 20 7d  ree(zLog);.    }
24540 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
24550 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
24560 20 20 2a 70 45 78 69 73 74 73 20 3d 20 30 3b 0a    *pExists = 0;.
24570 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
24580 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .}..static int p
24590 61 67 65 72 4f 70 65 6e 53 6e 61 70 73 68 6f 74  agerOpenSnapshot
245a0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
245b0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
245c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
245d0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
245e0 65 20 2a 2f 0a 20 20 69 6e 74 20 63 68 61 6e 67  e */.  int chang
245f0 65 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ed = 0;         
24600 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
24610 66 20 63 61 63 68 65 20 6d 75 73 74 20 62 65 20  f cache must be 
24620 72 65 73 65 74 20 2a 2f 0a 0a 20 20 61 73 73 65  reset */..  asse
24630 72 74 28 20 70 61 67 65 72 55 73 65 4c 6f 67 28  rt( pagerUseLog(
24640 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 72 63  pPager) );..  rc
24650 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 4f 70 65   = sqlite3LogOpe
24660 6e 53 6e 61 70 73 68 6f 74 28 70 50 61 67 65 72  nSnapshot(pPager
24670 2d 3e 70 4c 6f 67 2c 20 26 63 68 61 6e 67 65 64  ->pLog, &changed
24680 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
24690 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e  ITE_OK ){.    in
246a0 74 20 64 75 6d 6d 79 3b 0a 20 20 20 20 69 66 28  t dummy;.    if(
246b0 20 63 68 61 6e 67 65 64 20 29 7b 0a 20 20 20 20   changed ){.    
246c0 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
246d0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 61 73 73  ager);.      ass
246e0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72  ert( pPager->err
246f0 43 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e  Code || pPager->
24700 64 62 53 69 7a 65 56 61 6c 69 64 3d 3d 30 20 29  dbSizeValid==0 )
24710 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
24720 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
24730 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26  ecount(pPager, &
24740 64 75 6d 6d 79 29 3b 0a 20 20 7d 0a 20 20 70 50  dummy);.  }.  pP
24750 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
24760 47 45 52 5f 53 48 41 52 45 44 3b 0a 0a 20 20 72  GER_SHARED;..  r
24770 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
24780 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
24790 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62   is called to ob
247a0 74 61 69 6e 20 61 20 73 68 61 72 65 64 20 6c 6f  tain a shared lo
247b0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
247c0 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 74 20 69  se file..** It i
247d0 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 63 61 6c  s illegal to cal
247e0 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63  l sqlite3PagerAc
247f0 71 75 69 72 65 28 29 20 75 6e 74 69 6c 20 61 66  quire() until af
24800 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ter this functio
24810 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 73 75  n.** has been su
24820 63 63 65 73 73 66 75 6c 6c 79 20 63 61 6c 6c 65  ccessfully calle
24830 64 2e 20 49 66 20 61 20 73 68 61 72 65 64 2d 6c  d. If a shared-l
24840 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68  ock is already h
24850 65 6c 64 20 77 68 65 6e 0a 2a 2a 20 74 68 69 73  eld when.** this
24860 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
24870 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d  led, it is a no-
24880 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  op..**.** The fo
24890 6c 6c 6f 77 69 6e 67 20 6f 70 65 72 61 74 69 6f  llowing operatio
248a0 6e 73 20 61 72 65 20 61 6c 73 6f 20 70 65 72 66  ns are also perf
248b0 6f 72 6d 65 64 20 62 79 20 74 68 69 73 20 66 75  ormed by this fu
248c0 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  nction..**.**   
248d0 31 29 20 49 66 20 74 68 65 20 70 61 67 65 72 20  1) If the pager 
248e0 69 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  is currently in 
248f0 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 73 74 61  PAGER_UNLOCK sta
24900 74 65 20 28 6e 6f 20 6c 6f 63 6b 20 68 65 6c 64  te (no lock held
24910 0a 2a 2a 20 20 20 20 20 20 6f 6e 20 74 68 65 20  .**      on the 
24920 64 61 74 61 62 61 73 65 20 66 69 6c 65 29 2c 20  database file), 
24930 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20  then an attempt 
24940 69 73 20 6d 61 64 65 20 74 6f 20 6f 62 74 61 69  is made to obtai
24950 6e 20 61 0a 2a 2a 20 20 20 20 20 20 53 48 41 52  n a.**      SHAR
24960 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ED lock on the d
24970 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6d  atabase file. Im
24980 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20  mediately after 
24990 6f 62 74 61 69 6e 69 6e 67 0a 2a 2a 20 20 20 20  obtaining.**    
249a0 20 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63    the SHARED loc
249b0 6b 2c 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  k, the file-syst
249c0 65 6d 20 69 73 20 63 68 65 63 6b 65 64 20 66 6f  em is checked fo
249d0 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c  r a hot-journal,
249e0 0a 2a 2a 20 20 20 20 20 20 77 68 69 63 68 20 69  .**      which i
249f0 73 20 70 6c 61 79 65 64 20 62 61 63 6b 20 69 66  s played back if
24a00 20 70 72 65 73 65 6e 74 2e 20 46 6f 6c 6c 6f 77   present. Follow
24a10 69 6e 67 20 61 6e 79 20 68 6f 74 2d 6a 6f 75 72  ing any hot-jour
24a20 6e 61 6c 20 0a 2a 2a 20 20 20 20 20 20 72 6f 6c  nal .**      rol
24a30 6c 62 61 63 6b 2c 20 74 68 65 20 63 6f 6e 74 65  lback, the conte
24a40 6e 74 73 20 6f 66 20 74 68 65 20 63 61 63 68 65  nts of the cache
24a50 20 61 72 65 20 76 61 6c 69 64 61 74 65 64 20 62   are validated b
24a60 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 20 20  y checking.**   
24a70 20 20 20 74 68 65 20 27 63 68 61 6e 67 65 2d 63     the 'change-c
24a80 6f 75 6e 74 65 72 27 20 66 69 65 6c 64 20 6f 66  ounter' field of
24a90 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
24aa0 6c 65 20 68 65 61 64 65 72 20 61 6e 64 0a 2a 2a  le header and.**
24ab0 20 20 20 20 20 20 64 69 73 63 61 72 64 65 64 20        discarded 
24ac0 69 66 20 74 68 65 79 20 61 72 65 20 66 6f 75 6e  if they are foun
24ad0 64 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 2e  d to be invalid.
24ae0 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 49 66 20 74  .**.**   2) If t
24af0 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e  he pager is runn
24b00 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65  ing in exclusive
24b10 2d 6d 6f 64 65 2c 20 61 6e 64 20 74 68 65 72 65  -mode, and there
24b20 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a   are currently.*
24b30 2a 20 20 20 20 20 20 6e 6f 20 6f 75 74 73 74 61  *      no outsta
24b40 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73  nding references
24b50 20 74 6f 20 61 6e 79 20 70 61 67 65 73 2c 20 61   to any pages, a
24b60 6e 64 20 69 73 20 69 6e 20 74 68 65 20 65 72 72  nd is in the err
24b70 6f 72 20 73 74 61 74 65 2c 0a 2a 2a 20 20 20 20  or state,.**    
24b80 20 20 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70    then an attemp
24b90 74 20 69 73 20 6d 61 64 65 20 74 6f 20 63 6c 65  t is made to cle
24ba0 61 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  ar the error sta
24bb0 74 65 20 62 79 20 64 69 73 63 61 72 64 69 6e 67  te by discarding
24bc0 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 63 6f 6e  .**      the con
24bd0 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
24be0 65 20 63 61 63 68 65 20 61 6e 64 20 72 6f 6c 6c  e cache and roll
24bf0 69 6e 67 20 62 61 63 6b 20 61 6e 79 20 6f 70 65  ing back any ope
24c00 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  n journal.**    
24c10 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66    file..**.** If
24c20 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 64   the operation d
24c30 65 73 63 72 69 62 65 64 20 62 79 20 28 32 29 20  escribed by (2) 
24c40 61 62 6f 76 65 20 69 73 20 6e 6f 74 20 61 74 74  above is not att
24c50 65 6d 70 74 65 64 2c 20 61 6e 64 20 69 66 20 74  empted, and if t
24c60 68 65 0a 2a 2a 20 70 61 67 65 72 20 69 73 20 69  he.** pager is i
24c70 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65  n an error state
24c80 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49   other than SQLI
24c90 54 45 5f 46 55 4c 4c 20 77 68 65 6e 20 74 68 69  TE_FULL when thi
24ca0 73 20 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20  s is called,.** 
24cb0 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20  the error state 
24cc0 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
24cd0 74 75 72 6e 65 64 2e 20 49 74 20 69 73 20 70 65  turned. It is pe
24ce0 72 6d 69 74 74 65 64 20 74 6f 20 72 65 61 64 20  rmitted to read 
24cf0 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
24d00 77 68 65 6e 20 69 6e 20 53 51 4c 49 54 45 5f 46  when in SQLITE_F
24d10 55 4c 4c 20 65 72 72 6f 72 20 73 74 61 74 65 2e  ULL error state.
24d20 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
24d30 2c 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20  , if everything 
24d40 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53  is successful, S
24d50 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
24d60 72 6e 65 64 2e 20 49 66 20 61 6e 0a 2a 2a 20 49  rned. If an.** I
24d70 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  O error occurs w
24d80 68 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 74 68 65  hile locking the
24d90 20 64 61 74 61 62 61 73 65 2c 20 63 68 65 63 6b   database, check
24da0 69 6e 67 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f  ing for a hot-jo
24db0 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 6f 72  urnal.** file or
24dc0 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20   rolling back a 
24dd0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68  journal file, th
24de0 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  e IO error code 
24df0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
24e00 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
24e10 53 68 61 72 65 64 4c 6f 63 6b 28 50 61 67 65 72  SharedLock(Pager
24e20 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
24e30 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
24e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e50 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
24e60 2f 0a 20 20 69 6e 74 20 69 73 45 72 72 6f 72 52  /.  int isErrorR
24e70 65 73 65 74 20 3d 20 30 3b 20 20 20 20 20 20 20  eset = 0;       
24e80 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
24e90 66 20 72 65 63 6f 76 65 72 69 6e 67 20 66 72 6f  f recovering fro
24ea0 6d 20 65 72 72 6f 72 20 73 74 61 74 65 20 2a 2f  m error state */
24eb0 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74  ..  /* This rout
24ec0 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c  ine is only call
24ed0 65 64 20 66 72 6f 6d 20 62 2d 74 72 65 65 20 61  ed from b-tree a
24ee0 6e 64 20 6f 6e 6c 79 20 77 68 65 6e 20 74 68 65  nd only when the
24ef0 72 65 20 61 72 65 20 6e 6f 0a 20 20 2a 2a 20 6f  re are no.  ** o
24f00 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73  utstanding pages
24f10 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71   */.  assert( sq
24f20 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f  lite3PcacheRefCo
24f30 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
24f40 63 68 65 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28  che)==0 );.  if(
24f50 20 4e 45 56 45 52 28 4d 45 4d 44 42 20 26 26 20   NEVER(MEMDB && 
24f60 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29  pPager->errCode)
24f70 20 29 7b 20 72 65 74 75 72 6e 20 70 50 61 67 65   ){ return pPage
24f80 72 2d 3e 65 72 72 43 6f 64 65 3b 20 7d 0a 0a 20  r->errCode; }.. 
24f90 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61 74 61   /* If this data
24fa0 62 61 73 65 20 69 73 20 69 6e 20 61 6e 20 65 72  base is in an er
24fb0 72 6f 72 2d 73 74 61 74 65 2c 20 6e 6f 77 20 69  ror-state, now i
24fc0 73 20 61 20 63 68 61 6e 63 65 20 74 6f 20 63 6c  s a chance to cl
24fd0 65 61 72 0a 20 20 2a 2a 20 74 68 65 20 65 72 72  ear.  ** the err
24fe0 6f 72 2e 20 44 69 73 63 61 72 64 20 74 68 65 20  or. Discard the 
24ff0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
25000 70 61 67 65 72 2d 63 61 63 68 65 20 61 6e 64 20  pager-cache and 
25010 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 61 6e  rollback.  ** an
25020 79 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 6e  y hot journal in
25030 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
25040 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
25050 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a  ger->errCode ){.
25060 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70      if( isOpen(p
25070 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70  Pager->jfd) || p
25080 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20  Pager->zJournal 
25090 29 7b 0a 20 20 20 20 20 20 69 73 45 72 72 6f 72  ){.      isError
250a0 52 65 73 65 74 20 3d 20 31 3b 0a 20 20 20 20 7d  Reset = 1;.    }
250b0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72  .    pPager->err
250c0 43 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  Code = SQLITE_OK
250d0 3b 0a 20 20 20 20 70 61 67 65 72 5f 72 65 73 65  ;.    pager_rese
250e0 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a  t(pPager);.  }..
250f0 20 20 69 66 28 20 70 61 67 65 72 55 73 65 4c 6f    if( pagerUseLo
25100 67 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  g(pPager) ){.   
25110 20 72 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 53   rc = pagerOpenS
25120 6e 61 70 73 68 6f 74 28 70 50 61 67 65 72 29 3b  napshot(pPager);
25130 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61  .  }else if( pPa
25140 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
25150 52 5f 55 4e 4c 4f 43 4b 20 7c 7c 20 69 73 45 72  R_UNLOCK || isEr
25160 72 6f 72 52 65 73 65 74 20 29 7b 0a 20 20 20 20  rorReset ){.    
25170 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f  sqlite3_vfs * co
25180 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61 67 65  nst pVfs = pPage
25190 72 2d 3e 70 56 66 73 3b 0a 20 20 20 20 69 6e 74  r->pVfs;.    int
251a0 20 69 73 48 6f 74 4a 6f 75 72 6e 61 6c 20 3d 20   isHotJournal = 
251b0 30 3b 0a 20 20 20 20 69 6e 74 20 69 73 57 61 6c  0;.    int isWal
251c0 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74   = 0;.    assert
251d0 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20  ( !MEMDB );.    
251e0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
251f0 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
25200 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d  ager->pPCache)==
25210 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  0 );.    if( pPa
25220 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20  ger->noReadlock 
25230 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
25240 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c   pPager->readOnl
25250 79 20 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  y );.      pPage
25260 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
25270 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 7d 65 6c  _SHARED;.    }el
25280 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  se{.      rc = p
25290 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
252a0 6b 28 70 50 61 67 65 72 2c 20 53 48 41 52 45 44  k(pPager, SHARED
252b0 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66  _LOCK);.      if
252c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
252d0 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
252e0 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
252f0 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29  ==PAGER_UNLOCK )
25300 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
25310 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
25320 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20  ger, rc);.      
25330 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  }.    }.    asse
25340 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
25350 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e>=SHARED_LOCK )
25360 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 6a  ;..    /* If a j
25370 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73  ournal file exis
25380 74 73 2c 20 61 6e 64 20 74 68 65 72 65 20 69 73  ts, and there is
25390 20 6e 6f 20 52 45 53 45 52 56 45 44 20 6c 6f 63   no RESERVED loc
253a0 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  k on the.    ** 
253b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74  database file, t
253c0 68 65 6e 20 69 74 20 65 69 74 68 65 72 20 6e 65  hen it either ne
253d0 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64  eds to be played
253e0 20 62 61 63 6b 20 6f 72 20 64 65 6c 65 74 65 64   back or deleted
253f0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
25400 20 21 69 73 45 72 72 6f 72 52 65 73 65 74 20 29   !isErrorReset )
25410 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
25420 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3c 3d  pPager->state <=
25430 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b   PAGER_SHARED );
25440 0a 20 20 20 20 20 20 72 63 20 3d 20 68 61 73 48  .      rc = hasH
25450 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  otJournal(pPager
25460 2c 20 26 69 73 48 6f 74 4a 6f 75 72 6e 61 6c 29  , &isHotJournal)
25470 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
25480 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
25490 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64       goto failed
254a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
254b0 20 20 20 20 69 66 28 20 69 73 45 72 72 6f 72 52      if( isErrorR
254c0 65 73 65 74 20 7c 7c 20 69 73 48 6f 74 4a 6f 75  eset || isHotJou
254d0 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 2f 2a  rnal ){.      /*
254e0 20 47 65 74 20 61 6e 20 45 58 43 4c 55 53 49 56   Get an EXCLUSIV
254f0 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  E lock on the da
25500 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41 74 20  tabase file. At 
25510 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 69 73  this point it is
25520 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6f 72 74  .      ** import
25530 61 6e 74 20 74 68 61 74 20 61 20 52 45 53 45 52  ant that a RESER
25540 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20  VED lock is not 
25550 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20  obtained on the 
25560 77 61 79 20 74 6f 20 74 68 65 0a 20 20 20 20 20  way to the.     
25570 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   ** EXCLUSIVE lo
25580 63 6b 2e 20 49 66 20 69 74 20 77 65 72 65 2c 20  ck. If it were, 
25590 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  another process 
255a0 6d 69 67 68 74 20 6f 70 65 6e 20 74 68 65 0a 20  might open the. 
255b0 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65       ** database
255c0 20 66 69 6c 65 2c 20 64 65 74 65 63 74 20 74 68   file, detect th
255d0 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c  e RESERVED lock,
255e0 20 61 6e 64 20 63 6f 6e 63 6c 75 64 65 20 74 68   and conclude th
255f0 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  at the.      ** 
25600 64 61 74 61 62 61 73 65 20 69 73 20 73 61 66 65  database is safe
25610 20 74 6f 20 72 65 61 64 20 77 68 69 6c 65 20 74   to read while t
25620 68 69 73 20 70 72 6f 63 65 73 73 20 69 73 20 73  his process is s
25630 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20 74 68 65  till rolling the
25640 20 0a 20 20 20 20 20 20 2a 2a 20 68 6f 74 2d 6a   .      ** hot-j
25650 6f 75 72 6e 61 6c 20 62 61 63 6b 2e 0a 20 20 20  ournal back..   
25660 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20     ** .      ** 
25670 42 65 63 61 75 73 65 20 74 68 65 20 69 6e 74 65  Because the inte
25680 72 6d 65 64 69 61 74 65 20 52 45 53 45 52 56 45  rmediate RESERVE
25690 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65  D lock is not re
256a0 71 75 65 73 74 65 64 2c 20 61 6e 79 0a 20 20 20  quested, any.   
256b0 20 20 20 2a 2a 20 6f 74 68 65 72 20 70 72 6f 63     ** other proc
256c0 65 73 73 20 61 74 74 65 6d 70 74 69 6e 67 20 74  ess attempting t
256d0 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74  o access the dat
256e0 61 62 61 73 65 20 66 69 6c 65 20 77 69 6c 6c 20  abase file will 
256f0 67 65 74 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a  get to .      **
25700 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 74   this point in t
25710 68 65 20 63 6f 64 65 20 61 6e 64 20 66 61 69 6c  he code and fail
25720 20 74 6f 20 6f 62 74 61 69 6e 20 69 74 73 20 6f   to obtain its o
25730 77 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  wn EXCLUSIVE loc
25740 6b 20 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74  k .      ** on t
25750 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
25760 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
25770 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
25780 74 65 3c 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  te<EXCLUSIVE_LOC
25790 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
257a0 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  = sqlite3OsLock(
257b0 70 50 61 67 65 72 2d 3e 66 64 2c 20 45 58 43 4c  pPager->fd, EXCL
257c0 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20  USIVE_LOCK);.   
257d0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
257e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
257f0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65      rc = pager_e
25800 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29  rror(pPager, rc)
25810 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
25820 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 20   failed;.       
25830 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67 65   }.        pPage
25840 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
25850 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20  _EXCLUSIVE;.    
25860 20 20 7d 0a 20 0a 20 20 20 20 20 20 2f 2a 20 4f    }. .      /* O
25870 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  pen the journal 
25880 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20 61  for read/write a
25890 63 63 65 73 73 2e 20 54 68 69 73 20 69 73 20 62  ccess. This is b
258a0 65 63 61 75 73 65 20 69 6e 20 0a 20 20 20 20 20  ecause in .     
258b0 20 2a 2a 20 65 78 63 6c 75 73 69 76 65 2d 61 63   ** exclusive-ac
258c0 63 65 73 73 20 6d 6f 64 65 20 74 68 65 20 66 69  cess mode the fi
258d0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 77 69  le descriptor wi
258e0 6c 6c 20 62 65 20 6b 65 70 74 20 6f 70 65 6e 20  ll be kept open 
258f0 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 70 6f 73  and.      ** pos
25900 73 69 62 6c 79 20 75 73 65 64 20 66 6f 72 20 61  sibly used for a
25910 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6c 61 74   transaction lat
25920 65 72 20 6f 6e 2e 20 4f 6e 20 73 6f 6d 65 20 73  er on. On some s
25930 79 73 74 65 6d 73 2c 20 74 68 65 0a 20 20 20 20  ystems, the.    
25940 20 20 2a 2a 20 4f 73 54 72 75 6e 63 61 74 65 28    ** OsTruncate(
25950 29 20 63 61 6c 6c 20 75 73 65 64 20 69 6e 20 65  ) call used in e
25960 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20  xclusive-access 
25970 6d 6f 64 65 20 61 6c 73 6f 20 72 65 71 75 69 72  mode also requir
25980 65 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 72 65  es.      ** a re
25990 61 64 2f 77 72 69 74 65 20 66 69 6c 65 20 68 61  ad/write file ha
259a0 6e 64 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ndle..      */. 
259b0 20 20 20 20 20 69 66 28 20 21 69 73 4f 70 65 6e       if( !isOpen
259c0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b  (pPager->jfd) ){
259d0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 73  .        int res
259e0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
259f0 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70  qlite3OsAccess(p
25a00 56 66 73 2c 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  Vfs,pPager->zJou
25a10 72 6e 61 6c 2c 53 51 4c 49 54 45 5f 41 43 43 45  rnal,SQLITE_ACCE
25a20 53 53 5f 45 58 49 53 54 53 2c 26 72 65 73 29 3b  SS_EXISTS,&res);
25a30 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
25a40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
25a50 20 20 20 20 20 20 20 20 69 66 28 20 72 65 73 20          if( res 
25a60 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
25a70 6e 74 20 66 6f 75 74 20 3d 20 30 3b 0a 20 20 20  nt fout = 0;.   
25a80 20 20 20 20 20 20 20 20 20 69 6e 74 20 66 20 3d           int f =
25a90 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
25aa0 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50  DWRITE|SQLITE_OP
25ab0 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b  EN_MAIN_JOURNAL;
25ac0 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
25ad0 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65  ert( !pPager->te
25ae0 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20  mpFile );.      
25af0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
25b00 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70  e3OsOpen(pVfs, p
25b10 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
25b20 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c   pPager->jfd, f,
25b30 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 20 20 20   &fout);.       
25b40 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21       assert( rc!
25b50 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73  =SQLITE_OK || is
25b60 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
25b70 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ) );.           
25b80 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
25b90 4f 4b 20 26 26 20 66 6f 75 74 26 53 51 4c 49 54  OK && fout&SQLIT
25ba0 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20  E_OPEN_READONLY 
25bb0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
25bc0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e   rc = SQLITE_CAN
25bd0 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20  TOPEN_BKPT;.    
25be0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
25bf0 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
25c00 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20  >jfd);.         
25c10 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
25c20 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
25c30 20 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75 72    /* If the jour
25c40 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  nal does not exi
25c50 73 74 2c 20 69 74 20 75 73 75 61 6c 6c 79 20 6d  st, it usually m
25c60 65 61 6e 73 20 74 68 61 74 20 73 6f 6d 65 20 0a  eans that some .
25c70 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f              ** o
25c80 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ther connection 
25c90 6d 61 6e 61 67 65 64 20 74 6f 20 67 65 74 20 69  managed to get i
25ca0 6e 20 61 6e 64 20 72 6f 6c 6c 20 69 74 20 62 61  n and roll it ba
25cb0 63 6b 20 62 65 66 6f 72 65 20 0a 20 20 20 20 20  ck before .     
25cc0 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63         ** this c
25cd0 6f 6e 6e 65 63 74 69 6f 6e 20 6f 62 74 61 69 6e  onnection obtain
25ce0 65 64 20 74 68 65 20 65 78 63 6c 75 73 69 76 65  ed the exclusive
25cf0 20 6c 6f 63 6b 20 61 62 6f 76 65 2e 20 4f 72 2c   lock above. Or,
25d00 20 69 74 20 0a 20 20 20 20 20 20 20 20 20 20 20   it .           
25d10 20 2a 2a 20 6d 61 79 20 6d 65 61 6e 20 74 68 61   ** may mean tha
25d20 74 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20  t the pager was 
25d30 69 6e 20 74 68 65 20 65 72 72 6f 72 2d 73 74 61  in the error-sta
25d40 74 65 20 77 68 65 6e 20 74 68 69 73 0a 20 20 20  te when this.   
25d50 20 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63           ** func
25d60 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 20  tion was called 
25d70 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  and the journal 
25d80 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78  file does not ex
25d90 69 73 74 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  ist.  */.       
25da0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
25db0 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
25dc0 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20  pPager, 0);.    
25dd0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
25de0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
25df0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
25e00 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  K ){.        got
25e10 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  o failed;.      
25e20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 52 65 73 65  }..      /* Rese
25e30 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 74  t the journal st
25e40 61 74 75 73 20 66 69 65 6c 64 73 20 74 6f 20 69  atus fields to i
25e50 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 77 65  ndicates that we
25e60 20 68 61 76 65 20 6e 6f 0a 20 20 20 20 20 20 2a   have no.      *
25e70 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  * rollback journ
25e80 61 6c 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e  al at this time.
25e90 20 2a 2f 0a 20 20 20 20 20 20 70 50 61 67 65 72   */.      pPager
25ea0 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64  ->journalStarted
25eb0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67   = 0;.      pPag
25ec0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
25ed0 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72   0;.      pPager
25ee0 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b  ->setMaster = 0;
25ef0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
25f00 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20  ournalHdr = 0;. 
25f10 0a 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73  .      /* Make s
25f20 75 72 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ure the journal 
25f30 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 73 79  file has been sy
25f40 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 20 2a 2f  nced to disk. */
25f50 0a 20 0a 20 20 20 20 20 20 2f 2a 20 50 6c 61 79  . .      /* Play
25f60 62 61 63 6b 20 61 6e 64 20 64 65 6c 65 74 65 20  back and delete 
25f70 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72  the journal.  Dr
25f80 6f 70 20 74 68 65 20 64 61 74 61 62 61 73 65 20  op the database 
25f90 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 6c  write.      ** l
25fa0 6f 63 6b 20 61 6e 64 20 72 65 61 63 71 75 69 72  ock and reacquir
25fb0 65 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e  e the read lock.
25fc0 20 50 75 72 67 65 20 74 68 65 20 63 61 63 68 65   Purge the cache
25fd0 20 62 65 66 6f 72 65 0a 20 20 20 20 20 20 2a 2a   before.      **
25fe0 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68   playing back th
25ff0 65 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 73 6f  e hot-journal so
26000 20 74 68 61 74 20 77 65 20 64 6f 6e 27 74 20 65   that we don't e
26010 6e 64 20 75 70 20 77 69 74 68 0a 20 20 20 20 20  nd up with.     
26020 20 2a 2a 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74   ** an inconsist
26030 65 6e 74 20 63 61 63 68 65 2e 20 20 53 79 6e 63  ent cache.  Sync
26040 20 74 68 65 20 68 6f 74 20 6a 6f 75 72 6e 61 6c   the hot journal
26050 20 62 65 66 6f 72 65 20 70 6c 61 79 69 6e 67 0a   before playing.
26060 20 20 20 20 20 20 2a 2a 20 69 74 20 62 61 63 6b        ** it back
26070 20 73 69 6e 63 65 20 74 68 65 20 70 72 6f 63 65   since the proce
26080 73 73 20 74 68 61 74 20 63 72 61 73 68 65 64 20  ss that crashed 
26090 61 6e 64 20 6c 65 66 74 20 74 68 65 20 68 6f 74  and left the hot
260a0 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a   journal.      *
260b0 2a 20 70 72 6f 62 61 62 6c 79 20 64 69 64 20 6e  * probably did n
260c0 6f 74 20 73 79 6e 63 20 69 74 20 61 6e 64 20 77  ot sync it and w
260d0 65 20 61 72 65 20 72 65 71 75 69 72 65 64 20 74  e are required t
260e0 6f 20 61 6c 77 61 79 73 20 73 79 6e 63 0a 20 20  o always sync.  
260f0 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e      ** the journ
26100 61 6c 20 62 65 66 6f 72 65 20 70 6c 61 79 69 6e  al before playin
26110 67 20 69 74 20 62 61 63 6b 2e 0a 20 20 20 20 20  g it back..     
26120 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 73   */.      if( is
26130 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
26140 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
26150 3d 20 70 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f  = pagerSyncHotJo
26160 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  urnal(pPager);. 
26170 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
26180 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
26190 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
261a0 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72  _playback(pPager
261b0 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , 1);.        }.
261c0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
261d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
261e0 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
261f0 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
26200 72 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67  rc);.          g
26210 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  oto failed;.    
26220 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
26230 20 20 20 20 61 73 73 65 72 74 28 20 28 70 50 61      assert( (pPa
26240 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
26250 52 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20 20  R_SHARED).      
26260 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d       || (pPager-
26270 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26  >exclusiveMode &
26280 26 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  & pPager->state>
26290 50 41 47 45 52 5f 53 48 41 52 45 44 29 0a 20 20  PAGER_SHARED).  
262a0 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20      );.    }..  
262b0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 42    if( pPager->pB
262c0 61 63 6b 75 70 20 7c 7c 20 73 71 6c 69 74 65 33  ackup || sqlite3
262d0 50 63 61 63 68 65 50 61 67 65 63 6f 75 6e 74 28  PcachePagecount(
262e0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
262f0 3e 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  >0 ){.      /* T
26300 68 65 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 68  he shared-lock h
26310 61 73 20 6a 75 73 74 20 62 65 65 6e 20 61 63 71  as just been acq
26320 75 69 72 65 64 20 6f 6e 20 74 68 65 20 64 61 74  uired on the dat
26330 61 62 61 73 65 20 66 69 6c 65 0a 20 20 20 20 20  abase file.     
26340 20 2a 2a 20 61 6e 64 20 74 68 65 72 65 20 61 72   ** and there ar
26350 65 20 61 6c 72 65 61 64 79 20 70 61 67 65 73 20  e already pages 
26360 69 6e 20 74 68 65 20 63 61 63 68 65 20 28 66 72  in the cache (fr
26370 6f 6d 20 61 20 70 72 65 76 69 6f 75 73 0a 20 20  om a previous.  
26380 20 20 20 20 2a 2a 20 72 65 61 64 20 6f 72 20 77      ** read or w
26390 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
263a0 29 2e 20 20 43 68 65 63 6b 20 74 6f 20 73 65 65  ).  Check to see
263b0 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
263c0 0a 20 20 20 20 20 20 2a 2a 20 68 61 73 20 62 65  .      ** has be
263d0 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20 49 66  en modified.  If
263e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
263f0 73 20 63 68 61 6e 67 65 64 2c 20 66 6c 75 73 68  s changed, flush
26400 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 61   the.      ** ca
26410 63 68 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  che..      **.  
26420 20 20 20 20 2a 2a 20 44 61 74 61 62 61 73 65 20      ** Database 
26430 63 68 61 6e 67 65 73 20 69 73 20 64 65 74 65 63  changes is detec
26440 74 65 64 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61  ted by looking a
26450 74 20 31 35 20 62 79 74 65 73 20 62 65 67 69 6e  t 15 bytes begin
26460 6e 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 61 74  ning.      ** at
26470 20 6f 66 66 73 65 74 20 32 34 20 69 6e 74 6f 20   offset 24 into 
26480 74 68 65 20 66 69 6c 65 2e 20 20 54 68 65 20 66  the file.  The f
26490 69 72 73 74 20 34 20 6f 66 20 74 68 65 73 65 20  irst 4 of these 
264a0 31 36 20 62 79 74 65 73 20 61 72 65 0a 20 20 20  16 bytes are.   
264b0 20 20 20 2a 2a 20 61 20 33 32 2d 62 69 74 20 63     ** a 32-bit c
264c0 6f 75 6e 74 65 72 20 74 68 61 74 20 69 73 20 69  ounter that is i
264d0 6e 63 72 65 6d 65 6e 74 65 64 20 77 69 74 68 20  ncremented with 
264e0 65 61 63 68 20 63 68 61 6e 67 65 2e 20 20 54 68  each change.  Th
264f0 65 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72  e.      ** other
26500 20 62 79 74 65 73 20 63 68 61 6e 67 65 20 72 61   bytes change ra
26510 6e 64 6f 6d 6c 79 20 77 69 74 68 20 65 61 63 68  ndomly with each
26520 20 66 69 6c 65 20 63 68 61 6e 67 65 20 77 68 65   file change whe
26530 6e 0a 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 64  n.      ** a cod
26540 65 63 20 69 73 20 69 6e 20 75 73 65 2e 0a 20 20  ec is in use..  
26550 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a 2a      ** .      **
26560 20 54 68 65 72 65 20 69 73 20 61 20 76 61 6e 69   There is a vani
26570 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20 63 68  shingly small ch
26580 61 6e 63 65 20 74 68 61 74 20 61 20 63 68 61 6e  ance that a chan
26590 67 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 0a  ge will not be .
265a0 20 20 20 20 20 20 2a 2a 20 64 65 74 65 63 74 65        ** detecte
265b0 64 2e 20 20 54 68 65 20 63 68 61 6e 63 65 20 6f  d.  The chance o
265c0 66 20 61 6e 20 75 6e 64 65 74 65 63 74 65 64 20  f an undetected 
265d0 63 68 61 6e 67 65 20 69 73 20 73 6f 20 73 6d 61  change is so sma
265e0 6c 6c 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a  ll that.      **
265f0 20 69 74 20 63 61 6e 20 62 65 20 6e 65 67 6c 65   it can be negle
26600 63 74 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  cted..      */. 
26610 20 20 20 20 20 69 6e 74 20 6e 50 61 67 65 3b 0a       int nPage;.
26620 20 20 20 20 20 20 63 68 61 72 20 64 62 46 69 6c        char dbFil
26630 65 56 65 72 73 5b 73 69 7a 65 6f 66 28 70 50 61  eVers[sizeof(pPa
26640 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29  ger->dbFileVers)
26650 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ];.      sqlite3
26660 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
26670 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a  Pager, &nPage);.
26680 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
26690 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20  r->errCode ){.  
266a0 20 20 20 20 20 20 72 63 20 3d 20 70 50 61 67 65        rc = pPage
266b0 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20 20  r->errCode;.    
266c0 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b      goto failed;
266d0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
266e0 69 66 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20  if( nPage>0 ){. 
266f0 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28         IOTRACE((
26700 22 43 4b 56 45 52 53 20 25 70 20 25 64 5c 6e 22  "CKVERS %p %d\n"
26710 2c 20 70 50 61 67 65 72 2c 20 73 69 7a 65 6f 66  , pPager, sizeof
26720 28 64 62 46 69 6c 65 56 65 72 73 29 29 29 3b 0a  (dbFileVers)));.
26730 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
26740 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
26750 72 2d 3e 66 64 2c 20 26 64 62 46 69 6c 65 56 65  r->fd, &dbFileVe
26760 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c  rs, sizeof(dbFil
26770 65 56 65 72 73 29 2c 20 32 34 29 3b 0a 20 20 20  eVers), 24);.   
26780 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
26790 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
267a0 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b      goto failed;
267b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
267c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
267d0 6d 65 6d 73 65 74 28 64 62 46 69 6c 65 56 65 72  memset(dbFileVer
267e0 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 62 46  s, 0, sizeof(dbF
267f0 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20  ileVers));.     
26800 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 6d 65   }..      if( me
26810 6d 63 6d 70 28 70 50 61 67 65 72 2d 3e 64 62 46  mcmp(pPager->dbF
26820 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c 65 56  ileVers, dbFileV
26830 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69  ers, sizeof(dbFi
26840 6c 65 56 65 72 73 29 29 21 3d 30 20 29 7b 0a 20  leVers))!=0 ){. 
26850 20 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73         pager_res
26860 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  et(pPager);.    
26870 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73    }.    }.    as
26880 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 78  sert( pPager->ex
26890 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70  clusiveMode || p
268a0 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
268b0 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 0a 20  GER_SHARED );.. 
268c0 20 20 20 72 63 20 3d 20 70 61 67 65 72 48 61 73     rc = pagerHas
268d0 57 41 4c 28 70 50 61 67 65 72 2c 20 26 69 73 57  WAL(pPager, &isW
268e0 61 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  al);.    if( rc!
268f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
26900 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b      goto failed;
26910 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
26920 73 57 61 6c 20 29 7b 0a 20 20 20 20 20 20 70 61  sWal ){.      pa
26930 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
26940 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
26950 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 4c 6f  lite3PagerOpenLo
26960 67 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20  g(pPager, 0);.  
26970 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
26980 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
26990 20 72 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 53   rc = pagerOpenS
269a0 6e 61 70 73 68 6f 74 28 70 50 61 67 65 72 29 3b  napshot(pPager);
269b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
269c0 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  se if( pPager->j
269d0 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
269e0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
269f0 4c 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  L ){.      pPage
26a00 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d  r->journalMode =
26a10 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
26a20 44 45 5f 44 45 4c 45 54 45 3b 0a 20 20 20 20 7d  DE_DELETE;.    }
26a30 0a 20 20 7d 0a 0a 20 66 61 69 6c 65 64 3a 0a 20  .  }.. failed:. 
26a40 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
26a50 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 70 61 67  OK ){.    /* pag
26a60 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 69 73 20 61  er_unlock() is a
26a70 20 6e 6f 2d 6f 70 20 66 6f 72 20 65 78 63 6c 75   no-op for exclu
26a80 73 69 76 65 20 6d 6f 64 65 20 61 6e 64 20 69 6e  sive mode and in
26a90 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
26aa0 73 2e 20 2a 2f 0a 20 20 20 20 70 61 67 65 72 5f  s. */.    pager_
26ab0 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  unlock(pPager);.
26ac0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
26ad0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
26ae0 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
26af0 20 68 61 73 20 72 65 61 63 68 65 64 20 7a 65 72   has reached zer
26b00 6f 2c 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 20  o, rollback any 
26b10 61 63 74 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61  active.** transa
26b20 63 74 69 6f 6e 20 61 6e 64 20 75 6e 6c 6f 63 6b  ction and unlock
26b30 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a   the pager..**.*
26b40 2a 20 45 78 63 65 70 74 2c 20 69 6e 20 6c 6f 63  * Except, in loc
26b50 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53  king_mode=EXCLUS
26b60 49 56 45 20 77 68 65 6e 20 74 68 65 72 65 20 69  IVE when there i
26b70 73 20 6e 6f 74 68 69 6e 67 20 74 6f 20 69 6e 0a  s nothing to in.
26b80 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ** the rollback 
26b90 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 20 75 6e 6c  journal, the unl
26ba0 6f 63 6b 20 69 73 20 6e 6f 74 20 70 65 72 66 6f  ock is not perfo
26bb0 72 6d 65 64 20 61 6e 64 20 74 68 65 72 65 20 69  rmed and there i
26bc0 73 0a 2a 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20  s.** nothing to 
26bd0 72 6f 6c 6c 62 61 63 6b 2c 20 73 6f 20 74 68 69  rollback, so thi
26be0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
26bf0 6f 2d 6f 70 2e 0a 2a 2f 20 0a 73 74 61 74 69 63  o-op..*/ .static
26c00 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f 63   void pagerUnloc
26c10 6b 49 66 55 6e 75 73 65 64 28 50 61 67 65 72 20  kIfUnused(Pager 
26c20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20  *pPager){.  if( 
26c30 28 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65  (sqlite3PcacheRe
26c40 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70  fCount(pPager->p
26c50 50 43 61 63 68 65 29 3d 3d 30 29 0a 20 20 20 26  PCache)==0).   &
26c60 26 20 28 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  & (!pPager->excl
26c70 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61  usiveMode || pPa
26c80 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e  ger->journalOff>
26c90 30 29 20 0a 20 20 29 7b 0a 20 20 20 20 70 61 67  0) .  ){.    pag
26ca0 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62  erUnlockAndRollb
26cb0 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ack(pPager);.  }
26cc0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72  .}../*.** Acquir
26cd0 65 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  e a reference to
26ce0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70 67 6e   page number pgn
26cf0 6f 20 69 6e 20 70 61 67 65 72 20 70 50 61 67 65  o in pager pPage
26d00 72 20 28 61 20 70 61 67 65 0a 2a 2a 20 72 65 66  r (a page.** ref
26d10 65 72 65 6e 63 65 20 68 61 73 20 74 79 70 65 20  erence has type 
26d20 44 62 50 61 67 65 2a 29 2e 20 49 66 20 74 68 65  DbPage*). If the
26d30 20 72 65 71 75 65 73 74 65 64 20 72 65 66 65 72   requested refer
26d40 65 6e 63 65 20 69 73 20 0a 2a 2a 20 73 75 63 63  ence is .** succ
26d50 65 73 73 66 75 6c 6c 79 20 6f 62 74 61 69 6e 65  essfully obtaine
26d60 64 2c 20 69 74 20 69 73 20 63 6f 70 69 65 64 20  d, it is copied 
26d70 74 6f 20 2a 70 70 50 61 67 65 20 61 6e 64 20 53  to *ppPage and S
26d80 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
26d90 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
26da0 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69  requested page i
26db0 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  s already in the
26dc0 20 63 61 63 68 65 2c 20 69 74 20 69 73 20 72 65   cache, it is re
26dd0 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68 65  turned. .** Othe
26de0 72 77 69 73 65 2c 20 61 20 6e 65 77 20 70 61 67  rwise, a new pag
26df0 65 20 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f  e object is allo
26e00 63 61 74 65 64 20 61 6e 64 20 70 6f 70 75 6c 61  cated and popula
26e10 74 65 64 20 77 69 74 68 20 64 61 74 61 0a 2a 2a  ted with data.**
26e20 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64   read from the d
26e30 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6e  atabase file. In
26e40 20 73 6f 6d 65 20 63 61 73 65 73 2c 20 74 68 65   some cases, the
26e50 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65 20 6d   pcache module m
26e60 61 79 0a 2a 2a 20 63 68 6f 6f 73 65 20 6e 6f 74  ay.** choose not
26e70 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e   to allocate a n
26e80 65 77 20 70 61 67 65 20 6f 62 6a 65 63 74 20 61  ew page object a
26e90 6e 64 20 6d 61 79 20 72 65 75 73 65 20 61 6e 20  nd may reuse an 
26ea0 65 78 69 73 74 69 6e 67 0a 2a 2a 20 6f 62 6a 65  existing.** obje
26eb0 63 74 20 77 69 74 68 20 6e 6f 20 6f 75 74 73 74  ct with no outst
26ec0 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
26ed0 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 74  s..**.** The ext
26ee0 72 61 20 64 61 74 61 20 61 70 70 65 6e 64 65 64  ra data appended
26ef0 20 74 6f 20 61 20 70 61 67 65 20 69 73 20 61 6c   to a page is al
26f00 77 61 79 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  ways initialized
26f10 20 74 6f 20 7a 65 72 6f 73 20 74 68 65 20 0a 2a   to zeros the .*
26f20 2a 20 66 69 72 73 74 20 74 69 6d 65 20 61 20 70  * first time a p
26f30 61 67 65 20 69 73 20 6c 6f 61 64 65 64 20 69 6e  age is loaded in
26f40 74 6f 20 6d 65 6d 6f 72 79 2e 20 49 66 20 74 68  to memory. If th
26f50 65 20 70 61 67 65 20 72 65 71 75 65 73 74 65 64  e page requested
26f60 20 69 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20   is .** already 
26f70 69 6e 20 74 68 65 20 63 61 63 68 65 20 77 68 65  in the cache whe
26f80 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
26f90 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20  is called, then 
26fa0 74 68 65 20 65 78 74 72 61 0a 2a 2a 20 64 61 74  the extra.** dat
26fb0 61 20 69 73 20 6c 65 66 74 20 61 73 20 69 74 20  a is left as it 
26fc0 77 61 73 20 77 68 65 6e 20 74 68 65 20 70 61 67  was when the pag
26fd0 65 20 6f 62 6a 65 63 74 20 77 61 73 20 6c 61 73  e object was las
26fe0 74 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  t used..**.** If
26ff0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d   the database im
27000 61 67 65 20 69 73 20 73 6d 61 6c 6c 65 72 20 74  age is smaller t
27010 68 61 6e 20 74 68 65 20 72 65 71 75 65 73 74 65  han the requeste
27020 64 20 70 61 67 65 20 6f 72 20 69 66 20 61 20 0a  d page or if a .
27030 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75  ** non-zero valu
27040 65 20 69 73 20 70 61 73 73 65 64 20 61 73 20 74  e is passed as t
27050 68 65 20 6e 6f 43 6f 6e 74 65 6e 74 20 70 61 72  he noContent par
27060 61 6d 65 74 65 72 20 61 6e 64 20 74 68 65 20 0a  ameter and the .
27070 2a 2a 20 72 65 71 75 65 73 74 65 64 20 70 61 67  ** requested pag
27080 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
27090 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 63   stored in the c
270a0 61 63 68 65 2c 20 74 68 65 6e 20 6e 6f 20 0a 2a  ache, then no .*
270b0 2a 20 61 63 74 75 61 6c 20 64 69 73 6b 20 72 65  * actual disk re
270c0 61 64 20 6f 63 63 75 72 73 2e 20 49 6e 20 74 68  ad occurs. In th
270d0 69 73 20 63 61 73 65 20 74 68 65 20 6d 65 6d 6f  is case the memo
270e0 72 79 20 69 6d 61 67 65 20 6f 66 20 74 68 65 20  ry image of the 
270f0 0a 2a 2a 20 70 61 67 65 20 69 73 20 69 6e 69 74  .** page is init
27100 69 61 6c 69 7a 65 64 20 74 6f 20 61 6c 6c 20 7a  ialized to all z
27110 65 72 6f 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  eros. .**.** If 
27120 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74 72 75  noContent is tru
27130 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  e, it means that
27140 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20   we do not care 
27150 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 74 65 6e  about the conten
27160 74 73 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67  ts.** of the pag
27170 65 2e 20 54 68 69 73 20 6f 63 63 75 72 73 20 69  e. This occurs i
27180 6e 20 74 77 6f 20 73 65 70 65 72 61 74 65 20 73  n two seperate s
27190 63 65 6e 61 72 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20  cenarios:.**.** 
271a0 20 20 61 29 20 57 68 65 6e 20 72 65 61 64 69 6e    a) When readin
271b0 67 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  g a free-list le
271c0 61 66 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65  af page from the
271d0 20 64 61 74 61 62 61 73 65 2c 20 61 6e 64 0a 2a   database, and.*
271e0 2a 0a 2a 2a 20 20 20 62 29 20 57 68 65 6e 20 61  *.**   b) When a
271f0 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 62 65   savepoint is be
27200 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  ing rolled back 
27210 61 6e 64 20 77 65 20 6e 65 65 64 20 74 6f 20 6c  and we need to l
27220 6f 61 64 0a 2a 2a 20 20 20 20 20 20 61 20 6e 65  oad.**      a ne
27230 77 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20  w page into the 
27240 63 61 63 68 65 20 74 6f 20 62 65 20 66 69 6c 6c  cache to be fill
27250 65 64 20 77 69 74 68 20 74 68 65 20 64 61 74 61  ed with the data
27260 20 72 65 61 64 0a 2a 2a 20 20 20 20 20 20 66 72   read.**      fr
27270 6f 6d 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74  om the savepoint
27280 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
27290 49 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20  If noContent is 
272a0 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 64  true, then the d
272b0 61 74 61 20 72 65 74 75 72 6e 65 64 20 69 73 20  ata returned is 
272c0 7a 65 72 6f 65 64 20 69 6e 73 74 65 61 64 20 6f  zeroed instead o
272d0 66 0a 2a 2a 20 62 65 69 6e 67 20 72 65 61 64 20  f.** being read 
272e0 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
272f0 65 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c  e. Additionally,
27300 20 74 68 65 20 62 69 74 73 20 63 6f 72 72 65 73   the bits corres
27310 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 67  ponding.** to pg
27320 6e 6f 20 69 6e 20 50 61 67 65 72 2e 70 49 6e 4a  no in Pager.pInJ
27330 6f 75 72 6e 61 6c 20 28 62 69 74 76 65 63 20 6f  ournal (bitvec o
27340 66 20 70 61 67 65 73 20 61 6c 72 65 61 64 79 20  f pages already 
27350 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a  written to the.*
27360 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20  * journal file) 
27370 61 6e 64 20 74 68 65 20 50 61 67 65 72 53 61 76  and the PagerSav
27380 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f  epoint.pInSavepo
27390 69 6e 74 20 62 69 74 76 65 63 73 20 6f 66 20 61  int bitvecs of a
273a0 6e 79 20 6f 70 65 6e 0a 2a 2a 20 73 61 76 65 70  ny open.** savep
273b0 6f 69 6e 74 73 20 61 72 65 20 73 65 74 2e 20 54  oints are set. T
273c0 68 69 73 20 6d 65 61 6e 73 20 69 66 20 74 68 65  his means if the
273d0 20 70 61 67 65 20 69 73 20 6d 61 64 65 20 77 72   page is made wr
273e0 69 74 61 62 6c 65 20 61 74 20 61 6e 79 0a 2a 2a  itable at any.**
273f0 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75   point in the fu
27400 74 75 72 65 2c 20 75 73 69 6e 67 20 61 20 63 61  ture, using a ca
27410 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  ll to sqlite3Pag
27420 65 72 57 72 69 74 65 28 29 2c 20 69 74 73 20 63  erWrite(), its c
27430 6f 6e 74 65 6e 74 73 0a 2a 2a 20 77 69 6c 6c 20  ontents.** will 
27440 6e 6f 74 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64  not be journaled
27450 2e 20 54 68 69 73 20 73 61 76 65 73 20 49 4f 2e  . This saves IO.
27460 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 63 71 75 69  .**.** The acqui
27470 73 69 74 69 6f 6e 20 6d 69 67 68 74 20 66 61 69  sition might fai
27480 6c 20 66 6f 72 20 73 65 76 65 72 61 6c 20 72 65  l for several re
27490 61 73 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63  asons.  In all c
274a0 61 73 65 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72  ases,.** an appr
274b0 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f  opriate error co
274c0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  de is returned a
274d0 6e 64 20 2a 70 70 50 61 67 65 20 69 73 20 73 65  nd *ppPage is se
274e0 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  t to NULL..**.**
274f0 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65   See also sqlite
27500 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29 2e 20  3PagerLookup(). 
27510 20 42 6f 74 68 20 74 68 69 73 20 72 6f 75 74 69   Both this routi
27520 6e 65 20 61 6e 64 20 4c 6f 6f 6b 75 70 28 29 20  ne and Lookup() 
27530 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69  attempt.** to fi
27540 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65  nd a page in the
27550 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
27560 20 66 69 72 73 74 2e 20 20 49 66 20 74 68 65 20   first.  If the 
27570 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  page is not alre
27580 61 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79  ady.** in memory
27590 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 67  , this routine g
275a0 6f 65 73 20 74 6f 20 64 69 73 6b 20 74 6f 20 72  oes to disk to r
275b0 65 61 64 20 69 74 20 69 6e 20 77 68 65 72 65 61  ead it in wherea
275c0 73 20 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75  s Lookup().** ju
275d0 73 74 20 72 65 74 75 72 6e 73 20 30 2e 20 20 54  st returns 0.  T
275e0 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63 71 75  his routine acqu
275f0 69 72 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b  ires a read-lock
27600 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   the first time 
27610 69 74 0a 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20  it.** has to go 
27620 74 6f 20 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75  to disk, and cou
27630 6c 64 20 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b  ld also playback
27640 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20   an old journal 
27650 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a  if necessary..**
27660 20 53 69 6e 63 65 20 4c 6f 6f 6b 75 70 28 29 20   Since Lookup() 
27670 6e 65 76 65 72 20 67 6f 65 73 20 74 6f 20 64 69  never goes to di
27680 73 6b 2c 20 69 74 20 6e 65 76 65 72 20 68 61 73  sk, it never has
27690 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 6c 6f   to deal with lo
276a0 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61  cks.** or journa
276b0 6c 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20  l files..*/.int 
276c0 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75  sqlite3PagerAcqu
276d0 69 72 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50  ire(.  Pager *pP
276e0 61 67 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68  ager,      /* Th
276f0 65 20 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20  e pager open on 
27700 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
27710 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
27720 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
27730 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 66 65 74  ge number to fet
27740 63 68 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a  ch */.  DbPage *
27750 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 57  *ppPage,    /* W
27760 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72 20 74  rite a pointer t
27770 6f 20 74 68 65 20 70 61 67 65 20 68 65 72 65 20  o the page here 
27780 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65  */.  int noConte
27790 6e 74 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e  nt       /* Do n
277a0 6f 74 20 62 6f 74 68 65 72 20 72 65 61 64 69 6e  ot bother readin
277b0 67 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64  g content from d
277c0 69 73 6b 20 69 66 20 74 72 75 65 20 2a 2f 0a 29  isk if true */.)
277d0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67  {.  int rc;.  Pg
277e0 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 61 73 73  Hdr *pPg;..  ass
277f0 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
27800 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
27810 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
27820 67 65 72 2d 3e 73 74 61 74 65 3e 50 41 47 45 52  ger->state>PAGER
27830 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 0a 20 20 69 66  _UNLOCK );..  if
27840 28 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20  ( pgno==0 ){.   
27850 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
27860 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
27870 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61  ..  /* If the pa
27880 67 65 72 20 69 73 20 69 6e 20 74 68 65 20 65 72  ger is in the er
27890 72 6f 72 20 73 74 61 74 65 2c 20 72 65 74 75 72  ror state, retur
278a0 6e 20 61 6e 20 65 72 72 6f 72 20 69 6d 6d 65 64  n an error immed
278b0 69 61 74 65 6c 79 2e 20 0a 20 20 2a 2a 20 4f 74  iately. .  ** Ot
278c0 68 65 72 77 69 73 65 2c 20 72 65 71 75 65 73 74  herwise, request
278d0 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74   the page from t
278e0 68 65 20 50 43 61 63 68 65 20 6c 61 79 65 72 2e  he PCache layer.
278f0 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
27900 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54  ->errCode!=SQLIT
27910 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e  E_OK && pPager->
27920 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errCode!=SQLITE_
27930 46 55 4c 4c 20 29 7b 0a 20 20 20 20 72 63 20 3d  FULL ){.    rc =
27940 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
27950 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
27960 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  c = sqlite3Pcach
27970 65 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70  eFetch(pPager->p
27980 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 31 2c  PCache, pgno, 1,
27990 20 70 70 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20   ppPage);.  }.. 
279a0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
279b0 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 45 69 74  OK ){.    /* Eit
279c0 68 65 72 20 74 68 65 20 63 61 6c 6c 20 74 6f 20  her the call to 
279d0 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74  sqlite3PcacheFet
279e0 63 68 28 29 20 72 65 74 75 72 6e 65 64 20 61 6e  ch() returned an
279f0 20 65 72 72 6f 72 20 6f 72 20 74 68 65 0a 20 20   error or the.  
27a00 20 20 2a 2a 20 70 61 67 65 72 20 77 61 73 20 61    ** pager was a
27a10 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 65 72  lready in the er
27a20 72 6f 72 2d 73 74 61 74 65 20 77 68 65 6e 20 74  ror-state when t
27a30 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 61 73  his function was
27a40 20 63 61 6c 6c 65 64 2e 0a 20 20 20 20 2a 2a 20   called..    ** 
27a50 53 65 74 20 70 50 67 20 74 6f 20 30 20 61 6e 64  Set pPg to 0 and
27a60 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 65 78 63   jump to the exc
27a70 65 70 74 69 6f 6e 20 68 61 6e 64 6c 65 72 2e 20  eption handler. 
27a80 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20 30 3b   */.    pPg = 0;
27a90 0a 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f  .    goto pager_
27aa0 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 7d  acquire_err;.  }
27ab0 0a 20 20 61 73 73 65 72 74 28 20 28 2a 70 70 50  .  assert( (*ppP
27ac0 61 67 65 29 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f  age)->pgno==pgno
27ad0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 2a   );.  assert( (*
27ae0 70 70 50 61 67 65 29 2d 3e 70 50 61 67 65 72 3d  ppPage)->pPager=
27af0 3d 70 50 61 67 65 72 20 7c 7c 20 28 2a 70 70 50  =pPager || (*ppP
27b00 61 67 65 29 2d 3e 70 50 61 67 65 72 3d 3d 30 20  age)->pPager==0 
27b10 29 3b 0a 0a 20 20 69 66 28 20 28 2a 70 70 50 61  );..  if( (*ppPa
27b20 67 65 29 2d 3e 70 50 61 67 65 72 20 26 26 20 21  ge)->pPager && !
27b30 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20  noContent ){.   
27b40 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65   /* In this case
27b50 20 74 68 65 20 70 63 61 63 68 65 20 61 6c 72 65   the pcache alre
27b60 61 64 79 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20  ady contains an 
27b70 69 6e 69 74 69 61 6c 69 7a 65 64 20 63 6f 70 79  initialized copy
27b80 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 70   of.    ** the p
27b90 61 67 65 2e 20 52 65 74 75 72 6e 20 77 69 74 68  age. Return with
27ba0 6f 75 74 20 66 75 72 74 68 65 72 20 61 64 6f 2e  out further ado.
27bb0 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
27bc0 20 70 67 6e 6f 3c 3d 50 41 47 45 52 5f 4d 41 58   pgno<=PAGER_MAX
27bd0 5f 50 47 4e 4f 20 26 26 20 70 67 6e 6f 21 3d 50  _PGNO && pgno!=P
27be0 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
27bf0 67 65 72 29 20 29 3b 0a 20 20 20 20 50 41 47 45  ger) );.    PAGE
27c00 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e  R_INCR(pPager->n
27c10 48 69 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Hit);.    return
27c20 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 7d   SQLITE_OK;..  }
27c30 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
27c40 20 70 61 67 65 72 20 63 61 63 68 65 20 68 61 73   pager cache has
27c50 20 63 72 65 61 74 65 64 20 61 20 6e 65 77 20 70   created a new p
27c60 61 67 65 2e 20 49 74 73 20 63 6f 6e 74 65 6e 74  age. Its content
27c70 20 6e 65 65 64 73 20 74 6f 20 0a 20 20 20 20 2a   needs to .    *
27c80 2a 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64  * be initialized
27c90 2e 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4d  .  */.    int nM
27ca0 61 78 3b 0a 0a 20 20 20 20 50 41 47 45 52 5f 49  ax;..    PAGER_I
27cb0 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 4d 69 73  NCR(pPager->nMis
27cc0 73 29 3b 0a 20 20 20 20 70 50 67 20 3d 20 2a 70  s);.    pPg = *p
27cd0 70 50 61 67 65 3b 0a 20 20 20 20 70 50 67 2d 3e  pPage;.    pPg->
27ce0 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b  pPager = pPager;
27cf0 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 78  ..    /* The max
27d00 69 6d 75 6d 20 70 61 67 65 20 6e 75 6d 62 65 72  imum page number
27d10 20 69 73 20 32 5e 33 31 2e 20 52 65 74 75 72 6e   is 2^31. Return
27d20 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
27d30 69 66 20 61 20 70 61 67 65 0a 20 20 20 20 2a 2a  if a page.    **
27d40 20 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72 20   number greater 
27d50 74 68 61 6e 20 74 68 69 73 2c 20 6f 72 20 74 68  than this, or th
27d60 65 20 75 6e 75 73 65 64 20 6c 6f 63 6b 69 6e 67  e unused locking
27d70 2d 70 61 67 65 2c 20 69 73 20 72 65 71 75 65 73  -page, is reques
27d80 74 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ted. */.    if( 
27d90 70 67 6e 6f 3e 50 41 47 45 52 5f 4d 41 58 5f 50  pgno>PAGER_MAX_P
27da0 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47  GNO || pgno==PAG
27db0 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
27dc0 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  r) ){.      rc =
27dd0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
27de0 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f  BKPT;.      goto
27df0 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65   pager_acquire_e
27e00 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72  rr;.    }..    r
27e10 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
27e20 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
27e30 2c 20 26 6e 4d 61 78 29 3b 0a 20 20 20 20 69 66  , &nMax);.    if
27e40 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
27e50 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
27e60 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b  ger_acquire_err;
27e70 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
27e80 4d 45 4d 44 42 20 7c 7c 20 6e 4d 61 78 3c 28 69  MEMDB || nMax<(i
27e90 6e 74 29 70 67 6e 6f 20 7c 7c 20 6e 6f 43 6f 6e  nt)pgno || noCon
27ea0 74 65 6e 74 20 7c 7c 20 21 69 73 4f 70 65 6e 28  tent || !isOpen(
27eb0 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20  pPager->fd) ){. 
27ec0 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50       if( pgno>pP
27ed0 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a  ager->mxPgno ){.
27ee0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
27ef0 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20  ITE_FULL;.      
27f00 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71    goto pager_acq
27f10 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20  uire_err;.      
27f20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 6f 43 6f  }.      if( noCo
27f30 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20  ntent ){.       
27f40 20 2f 2a 20 46 61 69 6c 75 72 65 20 74 6f 20 73   /* Failure to s
27f50 65 74 20 74 68 65 20 62 69 74 73 20 69 6e 20 74  et the bits in t
27f60 68 65 20 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74  he InJournal bit
27f70 2d 76 65 63 74 6f 72 73 20 69 73 20 62 65 6e 69  -vectors is beni
27f80 67 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 49  gn..        ** I
27f90 74 20 6d 65 72 65 6c 79 20 6d 65 61 6e 73 20 74  t merely means t
27fa0 68 61 74 20 77 65 20 6d 69 67 68 74 20 64 6f 20  hat we might do 
27fb0 73 6f 6d 65 20 65 78 74 72 61 20 77 6f 72 6b 20  some extra work 
27fc0 74 6f 20 6a 6f 75 72 6e 61 6c 20 61 20 0a 20 20  to journal a .  
27fd0 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 74 68        ** page th
27fe0 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  at does not need
27ff0 20 74 6f 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64   to be journaled
28000 2e 20 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c  .  Nevertheless,
28010 20 62 65 20 73 75 72 65 20 0a 20 20 20 20 20 20   be sure .      
28020 20 20 2a 2a 20 74 6f 20 74 65 73 74 20 74 68 65    ** to test the
28030 20 63 61 73 65 20 77 68 65 72 65 20 61 20 6d 61   case where a ma
28040 6c 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63 75 72  lloc error occur
28050 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74  s while trying t
28060 6f 20 73 65 74 20 0a 20 20 20 20 20 20 20 20 2a  o set .        *
28070 2a 20 61 20 62 69 74 20 69 6e 20 61 20 62 69 74  * a bit in a bit
28080 20 76 65 63 74 6f 72 2e 0a 20 20 20 20 20 20 20   vector..       
28090 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69   */.        sqli
280a0 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
280b0 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20  lloc();.        
280c0 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67 65 72  if( pgno<=pPager
280d0 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 7b 0a  ->dbOrigSize ){.
280e0 20 20 20 20 20 20 20 20 20 20 54 45 53 54 4f 4e            TESTON
280f0 4c 59 28 20 72 63 20 3d 20 29 20 73 71 6c 69 74  LY( rc = ) sqlit
28100 65 33 42 69 74 76 65 63 53 65 74 28 70 50 61 67  e3BitvecSet(pPag
28110 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20  er->pInJournal, 
28120 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  pgno);.         
28130 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53   testcase( rc==S
28140 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
28150 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
28160 20 54 45 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20   TESTONLY( rc = 
28170 29 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74  ) addToSavepoint
28180 42 69 74 76 65 63 73 28 70 50 61 67 65 72 2c 20  Bitvecs(pPager, 
28190 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 74  pgno);.        t
281a0 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c  estcase( rc==SQL
281b0 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20  ITE_NOMEM );.   
281c0 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42       sqlite3EndB
281d0 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
281e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d       }.      mem
281f0 73 65 74 28 70 50 67 2d 3e 70 44 61 74 61 2c 20  set(pPg->pData, 
28200 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  0, pPager->pageS
28210 69 7a 65 29 3b 0a 20 20 20 20 20 20 49 4f 54 52  ize);.      IOTR
28220 41 43 45 28 28 22 5a 45 52 4f 20 25 70 20 25 64  ACE(("ZERO %p %d
28230 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e  \n", pPager, pgn
28240 6f 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  o));.    }else{.
28250 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
28260 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65  g->pPager==pPage
28270 72 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  r );.      rc = 
28280 72 65 61 64 44 62 50 61 67 65 28 70 50 67 29 3b  readDbPage(pPg);
28290 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
282a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
282b0 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61      goto pager_a
282c0 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20  cquire_err;.    
282d0 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 64 65 66    }.    }.#ifdef
282e0 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
282f0 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67  GES.    pPg->pag
28300 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61  eHash = pager_pa
28310 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e  gehash(pPg);.#en
28320 64 69 66 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  dif.  }..  retur
28330 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61  n SQLITE_OK;..pa
28340 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3a  ger_acquire_err:
28350 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53  .  assert( rc!=S
28360 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66  QLITE_OK );.  if
28370 28 20 70 50 67 20 29 7b 0a 20 20 20 20 73 71 6c  ( pPg ){.    sql
28380 69 74 65 33 50 63 61 63 68 65 44 72 6f 70 28 70  ite3PcacheDrop(p
28390 50 67 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72  Pg);.  }.  pager
283a0 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 70  UnlockIfUnused(p
283b0 50 61 67 65 72 29 3b 0a 0a 20 20 2a 70 70 50 61  Pager);..  *ppPa
283c0 67 65 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  ge = 0;.  return
283d0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63   rc;.}../*.** Ac
283e0 71 75 69 72 65 20 61 20 70 61 67 65 20 69 66 20  quire a page if 
283f0 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  it is already in
28400 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63   the in-memory c
28410 61 63 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74  ache.  Do.** not
28420 20 72 65 61 64 20 74 68 65 20 70 61 67 65 20 66   read the page f
28430 72 6f 6d 20 64 69 73 6b 2e 20 20 52 65 74 75 72  rom disk.  Retur
28440 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
28450 68 65 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20 30  he page,.** or 0
28460 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
28470 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e 20 41 6c  not in cache. Al
28480 73 6f 2c 20 72 65 74 75 72 6e 20 30 20 69 66 20  so, return 0 if 
28490 74 68 65 20 0a 2a 2a 20 70 61 67 65 72 20 69 73  the .** pager is
284a0 20 69 6e 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b   in PAGER_UNLOCK
284b0 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73   state when this
284c0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
284d0 6c 65 64 2c 0a 2a 2a 20 6f 72 20 69 66 20 74 68  led,.** or if th
284e0 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 61 6e  e pager is in an
284f0 20 65 72 72 6f 72 20 73 74 61 74 65 20 6f 74 68   error state oth
28500 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 46  er than SQLITE_F
28510 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  ULL..**.** See a
28520 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72  lso sqlite3Pager
28530 47 65 74 28 29 2e 20 20 54 68 65 20 64 69 66 66  Get().  The diff
28540 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74  erence between t
28550 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61  his routine.** a
28560 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  nd sqlite3PagerG
28570 65 74 28 29 20 69 73 20 74 68 61 74 20 5f 67 65  et() is that _ge
28580 74 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20 74  t() will go to t
28590 68 65 20 64 69 73 6b 20 61 6e 64 20 72 65 61 64  he disk and read
285a0 0a 2a 2a 20 69 6e 20 74 68 65 20 70 61 67 65 20  .** in the page 
285b0 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  if the page is n
285c0 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20 63 61  ot already in ca
285d0 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  che.  This routi
285e0 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55  ne.** returns NU
285f0 4c 4c 20 69 66 20 74 68 65 20 70 61 67 65 20 69  LL if the page i
28600 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f  s not in cache o
28610 72 20 69 66 20 61 20 64 69 73 6b 20 49 2f 4f 20  r if a disk I/O 
28620 65 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65 76  error .** has ev
28630 65 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a  er happened..*/.
28640 44 62 50 61 67 65 20 2a 73 71 6c 69 74 65 33 50  DbPage *sqlite3P
28650 61 67 65 72 4c 6f 6f 6b 75 70 28 50 61 67 65 72  agerLookup(Pager
28660 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70   *pPager, Pgno p
28670 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  gno){.  PgHdr *p
28680 50 67 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  Pg = 0;.  assert
28690 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20  ( pPager!=0 );. 
286a0 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30   assert( pgno!=0
286b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
286c0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 21 3d 30  ager->pPCache!=0
286d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
286e0 61 67 65 72 2d 3e 73 74 61 74 65 20 3e 20 50 41  ager->state > PA
286f0 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20  GER_UNLOCK );.  
28700 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74  sqlite3PcacheFet
28710 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ch(pPager->pPCac
28720 68 65 2c 20 70 67 6e 6f 2c 20 30 2c 20 26 70 50  he, pgno, 0, &pP
28730 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 67  g);.  return pPg
28740 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
28750 73 65 20 61 20 70 61 67 65 20 72 65 66 65 72 65  se a page refere
28760 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  nce..**.** If th
28770 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65  e number of refe
28780 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61  rences to the pa
28790 67 65 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2c  ge drop to zero,
287a0 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 70 61 67   then the.** pag
287b0 65 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68  e is added to th
287c0 65 20 4c 52 55 20 6c 69 73 74 2e 20 20 57 68 65  e LRU list.  Whe
287d0 6e 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 73  n all references
287e0 20 74 6f 20 61 6c 6c 20 70 61 67 65 73 0a 2a 2a   to all pages.**
287f0 20 61 72 65 20 72 65 6c 65 61 73 65 64 2c 20 61   are released, a
28800 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73   rollback occurs
28810 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e   and the lock on
28820 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
28830 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a  .** removed..*/.
28840 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
28850 72 55 6e 72 65 66 28 44 62 50 61 67 65 20 2a 70  rUnref(DbPage *p
28860 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 20 29  Pg){.  if( pPg )
28870 7b 0a 20 20 20 20 50 61 67 65 72 20 2a 70 50 61  {.    Pager *pPa
28880 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
28890 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63  r;.    sqlite3Pc
288a0 61 63 68 65 52 65 6c 65 61 73 65 28 70 50 67 29  acheRelease(pPg)
288b0 3b 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63  ;.    pagerUnloc
288c0 6b 49 66 55 6e 75 73 65 64 28 70 50 61 67 65 72  kIfUnused(pPager
288d0 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
288e0 49 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  If the main jour
288f0 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 61 6c 72  nal file has alr
28900 65 61 64 79 20 62 65 65 6e 20 6f 70 65 6e 65 64  eady been opened
28910 2c 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68  , ensure that th
28920 65 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  e.** sub-journal
28930 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 20 74 6f   file is open to
28940 6f 2e 20 49 66 20 74 68 65 20 6d 61 69 6e 20 6a  o. If the main j
28950 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 6f 70  ournal is not op
28960 65 6e 2c 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63  en,.** this func
28970 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
28980 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
28990 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
289a0 65 76 65 72 79 74 68 69 6e 67 20 67 6f 65 73 20  everything goes 
289b0 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 70 6c 61  according to pla
289c0 6e 2e 20 0a 2a 2a 20 41 6e 20 53 51 4c 49 54 45  n. .** An SQLITE
289d0 5f 49 4f 45 52 52 5f 58 58 58 20 65 72 72 6f 72  _IOERR_XXX error
289e0 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
289f0 64 20 69 66 20 61 20 63 61 6c 6c 20 74 6f 20 0a  d if a call to .
28a00 2a 2a 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e  ** sqlite3OsOpen
28a10 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61  () fails..*/.sta
28a20 74 69 63 20 69 6e 74 20 6f 70 65 6e 53 75 62 4a  tic int openSubJ
28a30 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
28a40 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
28a50 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
28a60 66 28 20 28 70 61 67 65 72 55 73 65 4c 6f 67 28  f( (pagerUseLog(
28a70 70 50 61 67 65 72 29 20 7c 7c 20 69 73 4f 70 65  pPager) || isOpe
28a80 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 29 20  n(pPager->jfd)) 
28a90 26 26 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  && !isOpen(pPage
28aa0 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20 20  r->sjfd) ){.    
28ab0 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
28ac0 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
28ad0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
28ae0 59 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 75 62  Y || pPager->sub
28af0 6a 49 6e 4d 65 6d 6f 72 79 20 29 7b 0a 20 20 20  jInMemory ){.   
28b00 20 20 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75     sqlite3MemJou
28b10 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d  rnalOpen(pPager-
28b20 3e 73 6a 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73  >sjfd);.    }els
28b30 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  e{.      rc = pa
28b40 67 65 72 4f 70 65 6e 74 65 6d 70 28 70 50 61 67  gerOpentemp(pPag
28b50 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 6a 66 64  er, pPager->sjfd
28b60 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55  , SQLITE_OPEN_SU
28b70 42 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 7d  BJOURNAL);.    }
28b80 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
28b90 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
28ba0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
28bb0 65 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20  ed at the start 
28bc0 6f 66 20 65 76 65 72 79 20 77 72 69 74 65 20 74  of every write t
28bd0 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 54  ransaction..** T
28be0 68 65 72 65 20 6d 75 73 74 20 61 6c 72 65 61 64  here must alread
28bf0 79 20 62 65 20 61 20 52 45 53 45 52 56 45 44 20  y be a RESERVED 
28c00 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  or EXCLUSIVE loc
28c10 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
28c20 65 20 0a 2a 2a 20 66 69 6c 65 20 77 68 65 6e 20  e .** file when 
28c30 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
28c40 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 70  called..**.** Op
28c50 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
28c60 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70 50  ile for pager pP
28c70 61 67 65 72 20 61 6e 64 20 77 72 69 74 65 20 61  ager and write a
28c80 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 0a   journal header.
28c90 2a 2a 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  ** to the start 
28ca0 6f 66 20 69 74 2e 20 49 66 20 74 68 65 72 65 20  of it. If there 
28cb0 61 72 65 20 61 63 74 69 76 65 20 73 61 76 65 70  are active savep
28cc0 6f 69 6e 74 73 2c 20 6f 70 65 6e 20 74 68 65 20  oints, open the 
28cd0 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 61  sub-journal.** a
28ce0 73 20 77 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e  s well. This fun
28cf0 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73  ction is only us
28d00 65 64 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72  ed when the jour
28d10 6e 61 6c 20 66 69 6c 65 20 69 73 20 62 65 69 6e  nal file is bein
28d20 67 20 0a 2a 2a 20 6f 70 65 6e 65 64 20 74 6f 20  g .** opened to 
28d30 77 72 69 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b  write a rollback
28d40 20 6c 6f 67 20 66 6f 72 20 61 20 74 72 61 6e 73   log for a trans
28d50 61 63 74 69 6f 6e 2e 20 49 74 20 69 73 20 6e 6f  action. It is no
28d60 74 20 75 73 65 64 20 0a 2a 2a 20 77 68 65 6e 20  t used .** when 
28d70 6f 70 65 6e 69 6e 67 20 61 20 68 6f 74 20 6a 6f  opening a hot jo
28d80 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 72 6f  urnal file to ro
28d90 6c 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a  ll it back..**.*
28da0 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
28db0 20 66 69 6c 65 20 69 73 20 61 6c 72 65 61 64 79   file is already
28dc0 20 6f 70 65 6e 20 28 61 73 20 69 74 20 6d 61 79   open (as it may
28dd0 20 62 65 20 69 6e 20 65 78 63 6c 75 73 69 76 65   be in exclusive
28de0 20 6d 6f 64 65 29 2c 0a 2a 2a 20 74 68 65 6e 20   mode),.** then 
28df0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6a 75  this function ju
28e00 73 74 20 77 72 69 74 65 73 20 61 20 6a 6f 75 72  st writes a jour
28e10 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20 74 68  nal header to th
28e20 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 0a 2a  e start of the.*
28e30 2a 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 66  * already open f
28e40 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 57 68 65 74  ile. .**.** Whet
28e50 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a  her or not the j
28e60 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f  ournal file is o
28e70 70 65 6e 65 64 20 62 79 20 74 68 69 73 20 66 75  pened by this fu
28e80 6e 63 74 69 6f 6e 2c 20 74 68 65 0a 2a 2a 20 50  nction, the.** P
28e90 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ager.pInJournal 
28ea0 62 69 74 76 65 63 20 73 74 72 75 63 74 75 72 65  bitvec structure
28eb0 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a   is allocated..*
28ec0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
28ed0 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68  TE_OK if everyth
28ee0 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75  ing is successfu
28ef0 6c 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65  l. Otherwise, re
28f00 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  turn .** SQLITE_
28f10 4e 4f 4d 45 4d 20 69 66 20 74 68 65 20 61 74 74  NOMEM if the att
28f20 65 6d 70 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65  empt to allocate
28f30 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61   Pager.pInJourna
28f40 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20  l fails, or .** 
28f50 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  an IO error code
28f60 20 69 66 20 6f 70 65 6e 69 6e 67 20 6f 72 20 77   if opening or w
28f70 72 69 74 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e  riting the journ
28f80 61 6c 20 66 69 6c 65 20 66 61 69 6c 73 2e 0a 2a  al file fails..*
28f90 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
28fa0 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28  er_open_journal(
28fb0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
28fc0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
28fd0 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
28fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28ff0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
29000 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20   int nPage;     
29010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29020 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
29030 69 7a 65 20 6f 66 20 64 61 74 61 62 61 73 65 20  ize of database 
29040 66 69 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  file */.  sqlite
29050 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56  3_vfs * const pV
29060 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66  fs = pPager->pVf
29070 73 3b 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61  s;   /* Local ca
29080 63 68 65 20 6f 66 20 76 66 73 20 70 6f 69 6e 74  che of vfs point
29090 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  er */..  assert(
290a0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
290b0 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
290c0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
290d0 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29  er->useJournal )
290e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
290f0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21  er->journalMode!
29100 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
29110 44 45 5f 4f 46 46 20 29 3b 0a 20 20 61 73 73 65  DE_OFF );.  asse
29120 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  rt( pPager->pInJ
29130 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 0a  ournal==0 );.  .
29140 20 20 2f 2a 20 49 66 20 61 6c 72 65 61 64 79 20    /* If already 
29150 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  in the error sta
29160 74 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  te, this functio
29170 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 42  n is a no-op.  B
29180 75 74 20 6f 6e 0a 20 20 2a 2a 20 74 68 65 20 6f  ut on.  ** the o
29190 74 68 65 72 20 68 61 6e 64 2c 20 74 68 69 73 20  ther hand, this 
291a0 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72  routine is never
291b0 20 63 61 6c 6c 65 64 20 69 66 20 77 65 20 61 72   called if we ar
291c0 65 20 61 6c 72 65 61 64 79 20 69 6e 0a 20 20 2a  e already in.  *
291d0 2a 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65  * an error state
291e0 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52  . */.  if( NEVER
291f0 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65  (pPager->errCode
29200 29 20 29 20 72 65 74 75 72 6e 20 70 50 61 67 65  ) ) return pPage
29210 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20 74  r->errCode;..  t
29220 65 73 74 63 61 73 65 28 20 70 50 61 67 65 72 2d  estcase( pPager-
29230 3e 64 62 53 69 7a 65 56 61 6c 69 64 3d 3d 30 20  >dbSizeValid==0 
29240 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
29250 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
29260 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b  pPager, &nPage);
29270 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
29280 72 6e 20 72 63 3b 0a 20 20 70 50 61 67 65 72 2d  rn rc;.  pPager-
29290 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71  >pInJournal = sq
292a0 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74  lite3BitvecCreat
292b0 65 28 6e 50 61 67 65 29 3b 0a 20 20 69 66 28 20  e(nPage);.  if( 
292c0 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
292d0 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  al==0 ){.    ret
292e0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
292f0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e  ;.  }..  /* Open
29300 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
29310 65 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61  e if it is not a
29320 6c 72 65 61 64 79 20 6f 70 65 6e 2e 20 2a 2f 0a  lready open. */.
29330 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50    if( !isOpen(pP
29340 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20  ager->jfd) ){.  
29350 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
29360 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
29370 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
29380 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ORY ){.      sql
29390 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70  ite3MemJournalOp
293a0 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  en(pPager->jfd);
293b0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
293c0 20 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67    const int flag
293d0 73 20 3d 20 20 20 20 20 20 20 20 20 20 20 20 20  s =             
293e0 20 20 20 20 20 20 2f 2a 20 56 46 53 20 66 6c 61        /* VFS fla
293f0 67 73 20 74 6f 20 6f 70 65 6e 20 6a 6f 75 72 6e  gs to open journ
29400 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 20  al file */.     
29410 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52     SQLITE_OPEN_R
29420 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f  EADWRITE|SQLITE_
29430 4f 50 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20 20  OPEN_CREATE|.   
29440 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 74 65       (pPager->te
29450 6d 70 46 69 6c 65 20 3f 20 0a 20 20 20 20 20 20  mpFile ? .      
29460 20 20 20 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e      (SQLITE_OPEN
29470 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 7c 53  _DELETEONCLOSE|S
29480 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
29490 4a 4f 55 52 4e 41 4c 29 3a 0a 20 20 20 20 20 20  JOURNAL):.      
294a0 20 20 20 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e      (SQLITE_OPEN
294b0 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 0a 20  _MAIN_JOURNAL). 
294c0 20 20 20 20 20 20 20 29 3b 0a 23 69 66 64 65 66         );.#ifdef
294d0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
294e0 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20  TOMIC_WRITE.    
294f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f    rc = sqlite3Jo
29500 75 72 6e 61 6c 4f 70 65 6e 28 0a 20 20 20 20 20  urnalOpen(.     
29510 20 20 20 20 20 70 56 66 73 2c 20 70 50 61 67 65       pVfs, pPage
29520 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61  r->zJournal, pPa
29530 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c  ger->jfd, flags,
29540 20 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28   jrnlBufferSize(
29550 70 50 61 67 65 72 29 0a 20 20 20 20 20 20 29 3b  pPager).      );
29560 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 72 63 20  .#else.      rc 
29570 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
29580 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
29590 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e  ournal, pPager->
295a0 6a 66 64 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a  jfd, flags, 0);.
295b0 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20  #endif.    }.   
295c0 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
295d0 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e  ITE_OK || isOpen
295e0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
295f0 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 57 72 69 74  .  }...  /* Writ
29600 65 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72  e the first jour
29610 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20 74 68  nal header to th
29620 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61  e journal file a
29630 6e 64 20 6f 70 65 6e 20 0a 20 20 2a 2a 20 74 68  nd open .  ** th
29640 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 66  e sub-journal if
29650 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f   necessary..  */
29660 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
29670 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 54  E_OK ){.    /* T
29680 4f 44 4f 3a 20 43 68 65 63 6b 20 69 66 20 61 6c  ODO: Check if al
29690 6c 20 6f 66 20 74 68 65 73 65 20 61 72 65 20 72  l of these are r
296a0 65 61 6c 6c 79 20 72 65 71 75 69 72 65 64 2e 20  eally required. 
296b0 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  */.    pPager->d
296c0 62 4f 72 69 67 53 69 7a 65 20 3d 20 70 50 61 67  bOrigSize = pPag
296d0 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20  er->dbSize;.    
296e0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
296f0 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20  tarted = 0;.    
29700 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
29710 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
29720 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20  ->nRec = 0;.    
29730 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
29740 66 66 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  ff = 0;.    pPag
29750 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20  er->setMaster = 
29760 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  0;.    pPager->j
29770 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20  ournalHdr = 0;. 
29780 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75     rc = writeJou
29790 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b  rnalHdr(pPager);
297a0 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
297b0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67  QLITE_OK && pPag
297c0 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 29  er->nSavepoint )
297d0 7b 0a 20 20 20 20 72 63 20 3d 20 6f 70 65 6e 53  {.    rc = openS
297e0 75 62 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  ubJournal(pPager
297f0 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63  );.  }..  if( rc
29800 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
29810 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63     sqlite3Bitvec
29820 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e  Destroy(pPager->
29830 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  pInJournal);.   
29840 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
29850 6e 61 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  nal = 0;.  }.  r
29860 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
29870 2a 2a 20 42 65 67 69 6e 20 61 20 77 72 69 74 65  ** Begin a write
29880 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20  -transaction on 
29890 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70 61  the specified pa
298a0 67 65 72 20 6f 62 6a 65 63 74 2e 20 49 66 20 61  ger object. If a
298b0 20 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61 6e 73   .** write-trans
298c0 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61  action has alrea
298d0 64 79 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20  dy been opened, 
298e0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
298f0 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
29900 49 66 20 74 68 65 20 65 78 46 6c 61 67 20 61 72  If the exFlag ar
29910 67 75 6d 65 6e 74 20 69 73 20 66 61 6c 73 65 2c  gument is false,
29920 20 74 68 65 6e 20 61 63 71 75 69 72 65 20 61 74   then acquire at
29930 20 6c 65 61 73 74 20 61 20 52 45 53 45 52 56 45   least a RESERVE
29940 44 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  D.** lock on the
29950 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
29960 49 66 20 65 78 46 6c 61 67 20 69 73 20 74 72 75  If exFlag is tru
29970 65 2c 20 74 68 65 6e 20 61 63 71 75 69 72 65 20  e, then acquire 
29980 61 74 20 6c 65 61 73 74 0a 2a 2a 20 61 6e 20 45  at least.** an E
29990 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49  XCLUSIVE lock. I
299a0 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73  f such a lock is
299b0 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 6e   already held, n
299c0 6f 20 6c 6f 63 6b 69 6e 67 20 0a 2a 2a 20 66 75  o locking .** fu
299d0 6e 63 74 69 6f 6e 73 20 6e 65 65 64 20 62 65 20  nctions need be 
299e0 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  called..**.** If
299f0 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20 74   this is not a t
29a00 65 6d 70 6f 72 61 72 79 20 6f 72 20 69 6e 2d 6d  emporary or in-m
29a10 65 6d 6f 72 79 20 66 69 6c 65 20 61 6e 64 2c 20  emory file and, 
29a20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
29a30 20 69 73 20 0a 2a 2a 20 6f 70 65 6e 65 64 20 69   is .** opened i
29a40 66 20 69 74 20 68 61 73 20 6e 6f 74 20 62 65 65  f it has not bee
29a50 6e 20 61 6c 72 65 61 64 79 2e 20 46 6f 72 20 61  n already. For a
29a60 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c   temporary file,
29a70 20 74 68 65 20 6f 70 65 6e 69 6e 67 20 0a 2a 2a   the opening .**
29a80 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
29a90 66 69 6c 65 20 69 73 20 64 65 66 65 72 72 65 64  file is deferred
29aa0 20 75 6e 74 69 6c 20 74 68 65 72 65 20 69 73 20   until there is 
29ab0 61 6e 20 61 63 74 75 61 6c 20 6e 65 65 64 20 74  an actual need t
29ac0 6f 20 0a 2a 2a 20 77 72 69 74 65 20 74 6f 20 74  o .** write to t
29ad0 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 54 4f 44 4f  he journal. TODO
29ae0 3a 20 57 68 79 20 68 61 6e 64 6c 65 20 74 65 6d  : Why handle tem
29af0 70 6f 72 61 72 79 20 66 69 6c 65 73 20 64 69 66  porary files dif
29b00 66 65 72 65 6e 74 6c 79 3f 0a 2a 2a 0a 2a 2a 20  ferently?.**.** 
29b10 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  If the journal f
29b20 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 28 6f  ile is opened (o
29b30 72 20 69 66 20 69 74 20 69 73 20 61 6c 72 65 61  r if it is alrea
29b40 64 79 20 6f 70 65 6e 29 2c 20 74 68 65 6e 20 61  dy open), then a
29b50 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64  .** journal-head
29b60 65 72 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  er is written to
29b70 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 69 74   the start of it
29b80 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73  ..**.** If the s
29b90 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 61 72 67 75  ubjInMemory argu
29ba0 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  ment is non-zero
29bb0 2c 20 74 68 65 6e 20 61 6e 79 20 73 75 62 2d 6a  , then any sub-j
29bc0 6f 75 72 6e 61 6c 20 6f 70 65 6e 65 64 0a 2a 2a  ournal opened.**
29bd0 20 77 69 74 68 69 6e 20 74 68 69 73 20 74 72 61   within this tra
29be0 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65  nsaction will be
29bf0 20 6f 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e   opened as an in
29c00 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2e 20 54 68  -memory file. Th
29c10 69 73 0a 2a 2a 20 68 61 73 20 6e 6f 20 65 66 66  is.** has no eff
29c20 65 63 74 20 69 66 20 74 68 65 20 73 75 62 2d 6a  ect if the sub-j
29c30 6f 75 72 6e 61 6c 20 69 73 20 61 6c 72 65 61 64  ournal is alread
29c40 79 20 6f 70 65 6e 65 64 20 28 61 73 20 69 74 20  y opened (as it 
29c50 6d 61 79 20 62 65 20 77 68 65 6e 0a 2a 2a 20 72  may be when.** r
29c60 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73  unning in exclus
29c70 69 76 65 20 6d 6f 64 65 29 20 6f 72 20 69 66 20  ive mode) or if 
29c80 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
29c90 64 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65  does not require
29ca0 20 61 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61   a.** sub-journa
29cb0 6c 2e 20 49 66 20 74 68 65 20 73 75 62 6a 49 6e  l. If the subjIn
29cc0 4d 65 6d 6f 72 79 20 61 72 67 75 6d 65 6e 74 20  Memory argument 
29cd0 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6e  is zero, then an
29ce0 79 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 73 75  y required.** su
29cf0 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 69 6d 70  b-journal is imp
29d00 6c 65 6d 65 6e 74 65 64 20 69 6e 2d 6d 65 6d 6f  lemented in-memo
29d10 72 79 20 69 66 20 70 50 61 67 65 72 20 69 73 20  ry if pPager is 
29d20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
29d30 61 62 61 73 65 2c 20 0a 2a 2a 20 6f 72 20 75 73  abase, .** or us
29d40 69 6e 67 20 61 20 74 65 6d 70 6f 72 61 72 79 20  ing a temporary 
29d50 66 69 6c 65 20 6f 74 68 65 72 77 69 73 65 2e 0a  file otherwise..
29d60 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
29d70 67 65 72 42 65 67 69 6e 28 50 61 67 65 72 20 2a  gerBegin(Pager *
29d80 70 50 61 67 65 72 2c 20 69 6e 74 20 65 78 46 6c  pPager, int exFl
29d90 61 67 2c 20 69 6e 74 20 73 75 62 6a 49 6e 4d 65  ag, int subjInMe
29da0 6d 6f 72 79 29 7b 0a 20 20 69 6e 74 20 72 63 20  mory){.  int rc 
29db0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61  = SQLITE_OK;.  a
29dc0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
29dd0 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate!=PAGER_UNLO
29de0 43 4b 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  CK );.  pPager->
29df0 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 3d 20 28  subjInMemory = (
29e00 75 38 29 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b  u8)subjInMemory;
29e10 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
29e20 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41 52  tate==PAGER_SHAR
29e30 45 44 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ED ){.    assert
29e40 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  ( pPager->pInJou
29e50 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 61  rnal==0 );.    a
29e60 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 26 26  ssert( !MEMDB &&
29e70 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
29e80 6c 65 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 70  le );..    if( p
29e90 61 67 65 72 55 73 65 4c 6f 67 28 70 50 61 67 65  agerUseLog(pPage
29ea0 72 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 47  r) ){.      /* G
29eb0 72 61 62 20 74 68 65 20 77 72 69 74 65 20 6c 6f  rab the write lo
29ec0 63 6b 20 6f 6e 20 74 68 65 20 6c 6f 67 20 66 69  ck on the log fi
29ed0 6c 65 2e 20 49 66 20 73 75 63 63 65 73 73 66 75  le. If successfu
29ee0 6c 2c 20 75 70 67 72 61 64 65 20 74 6f 0a 20 20  l, upgrade to.  
29ef0 20 20 20 20 2a 2a 20 50 41 47 45 52 5f 45 58 43      ** PAGER_EXC
29f00 4c 55 53 49 56 45 20 73 74 61 74 65 2e 20 4f 74  LUSIVE state. Ot
29f10 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20  herwise, return 
29f20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f  an error code to
29f30 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20   the caller..   
29f40 20 20 20 2a 2a 20 54 68 65 20 62 75 73 79 2d 68     ** The busy-h
29f50 61 6e 64 6c 65 72 20 69 73 20 6e 6f 74 20 69 6e  andler is not in
29f60 76 6f 6b 65 64 20 69 66 20 61 6e 6f 74 68 65 72  voked if another
29f70 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6c 72 65   connection alre
29f80 61 64 79 0a 20 20 20 20 20 20 2a 2a 20 68 6f 6c  ady.      ** hol
29f90 64 73 20 74 68 65 20 77 72 69 74 65 2d 6c 6f 63  ds the write-loc
29fa0 6b 2e 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20  k. If possible, 
29fb0 74 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 20  the upper layer 
29fc0 77 69 6c 6c 20 63 61 6c 6c 20 69 74 2e 0a 20 20  will call it..  
29fd0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
29fe0 3d 20 73 71 6c 69 74 65 33 4c 6f 67 57 72 69 74  = sqlite3LogWrit
29ff0 65 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 70 4c  eLock(pPager->pL
2a000 6f 67 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66  og, 1);.      if
2a010 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2a020 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ){.        pPage
2a030 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 3d 20  r->dbOrigSize = 
2a040 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
2a050 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
2a060 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45  state = PAGER_RE
2a070 53 45 52 56 45 44 3b 0a 20 20 20 20 20 20 20 20  SERVED;.        
2a080 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
2a090 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ff = 0;.      }.
2a0a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2a0b0 20 2f 2a 20 4f 62 74 61 69 6e 20 61 20 52 45 53   /* Obtain a RES
2a0c0 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68  ERVED lock on th
2a0d0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2a0e0 20 49 66 20 74 68 65 20 65 78 46 6c 61 67 20 70   If the exFlag p
2a0f0 61 72 61 6d 65 74 65 72 0a 20 20 20 20 20 20 2a  arameter.      *
2a100 2a 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  * is true, then 
2a110 69 6d 6d 65 64 69 61 74 65 6c 79 20 75 70 67 72  immediately upgr
2a120 61 64 65 20 74 68 69 73 20 74 6f 20 61 6e 20 45  ade this to an E
2a130 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54  XCLUSIVE lock. T
2a140 68 65 0a 20 20 20 20 20 20 2a 2a 20 62 75 73 79  he.      ** busy
2a150 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63  -handler callbac
2a160 6b 20 63 61 6e 20 62 65 20 75 73 65 64 20 77 68  k can be used wh
2a170 65 6e 20 75 70 67 72 61 64 69 6e 67 20 74 6f 20  en upgrading to 
2a180 74 68 65 20 45 58 43 4c 55 53 49 56 45 0a 20 20  the EXCLUSIVE.  
2a190 20 20 20 20 2a 2a 20 6c 6f 63 6b 2c 20 62 75 74      ** lock, but
2a1a0 20 6e 6f 74 20 77 68 65 6e 20 6f 62 74 61 69 6e   not when obtain
2a1b0 69 6e 67 20 74 68 65 20 52 45 53 45 52 56 45 44  ing the RESERVED
2a1c0 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a   lock..      */.
2a1d0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2a1e0 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d  e3OsLock(pPager-
2a1f0 3e 66 64 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f  >fd, RESERVED_LO
2a200 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  CK);.      if( r
2a210 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2a220 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
2a230 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45  state = PAGER_RE
2a240 53 45 52 56 45 44 3b 0a 20 20 20 20 20 20 20 20  SERVED;.        
2a250 69 66 28 20 65 78 46 6c 61 67 20 29 7b 0a 20 20  if( exFlag ){.  
2a260 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
2a270 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
2a280 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56  pPager, EXCLUSIV
2a290 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20  E_LOCK);.       
2a2a0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
2a2b0 0a 0a 20 20 20 20 2f 2a 20 4e 6f 20 6e 65 65 64  ..    /* No need
2a2c0 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75   to open the jou
2a2d0 72 6e 61 6c 20 66 69 6c 65 20 61 74 20 74 68 69  rnal file at thi
2a2e0 73 20 74 69 6d 65 2e 20 20 49 74 20 77 69 6c 6c  s time.  It will
2a2f0 20 62 65 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 65   be.    ** opene
2a300 64 20 62 65 66 6f 72 65 20 69 74 20 69 73 20 77  d before it is w
2a310 72 69 74 74 65 6e 20 74 6f 2e 20 20 49 66 20 77  ritten to.  If w
2a320 65 20 64 65 66 65 72 20 6f 70 65 6e 69 6e 67 20  e defer opening 
2a330 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 0a 20 20 20  the journal,.   
2a340 20 2a 2a 20 77 65 20 6d 69 67 68 74 20 73 61 76   ** we might sav
2a350 65 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 63 72  e the work of cr
2a360 65 61 74 69 6e 67 20 61 20 66 69 6c 65 20 69 66  eating a file if
2a370 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
2a380 0a 20 20 20 20 2a 2a 20 65 6e 64 73 20 75 70 20  .    ** ends up 
2a390 62 65 69 6e 67 20 61 20 6e 6f 2d 6f 70 2e 0a 20  being a no-op.. 
2a3a0 20 20 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66     */.  }else if
2a3b0 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
2a3c0 3e 6a 66 64 29 20 26 26 20 70 50 61 67 65 72 2d  >jfd) && pPager-
2a3d0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29  >journalOff==0 )
2a3e0 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61  {.    /* This ha
2a3f0 70 70 65 6e 73 20 77 68 65 6e 20 74 68 65 20 70  ppens when the p
2a400 61 67 65 72 20 77 61 73 20 69 6e 20 65 78 63 6c  ager was in excl
2a410 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64  usive-access mod
2a420 65 20 74 68 65 20 6c 61 73 74 0a 20 20 20 20 2a  e the last.    *
2a430 2a 20 74 69 6d 65 20 61 20 28 72 65 61 64 20 6f  * time a (read o
2a440 72 20 77 72 69 74 65 29 20 74 72 61 6e 73 61 63  r write) transac
2a450 74 69 6f 6e 20 77 61 73 20 73 75 63 63 65 73 73  tion was success
2a460 66 75 6c 6c 79 20 63 6f 6e 63 6c 75 64 65 64 0a  fully concluded.
2a470 20 20 20 20 2a 2a 20 62 79 20 74 68 69 73 20 63      ** by this c
2a480 6f 6e 6e 65 63 74 69 6f 6e 2e 20 49 6e 73 74 65  onnection. Inste
2a490 61 64 20 6f 66 20 64 65 6c 65 74 69 6e 67 20 74  ad of deleting t
2a4a0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2a4b0 69 74 20 77 61 73 20 0a 20 20 20 20 2a 2a 20 6b  it was .    ** k
2a4c0 65 70 74 20 6f 70 65 6e 20 61 6e 64 20 65 69 74  ept open and eit
2a4d0 68 65 72 20 77 61 73 20 74 72 75 6e 63 61 74 65  her was truncate
2a4e0 64 20 74 6f 20 30 20 62 79 74 65 73 20 6f 72 20  d to 0 bytes or 
2a4f0 69 74 73 20 68 65 61 64 65 72 20 77 61 73 0a 20  its header was. 
2a500 20 20 20 2a 2a 20 6f 76 65 72 77 72 69 74 74 65     ** overwritte
2a510 6e 20 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20 20  n with zeros..  
2a520 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
2a530 20 70 61 67 65 72 55 73 65 4c 6f 67 28 70 50 61   pagerUseLog(pPa
2a540 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61  ger)==0 );.    a
2a550 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
2a560 52 65 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  Rec==0 );.    as
2a570 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
2a580 4f 72 69 67 53 69 7a 65 3d 3d 30 20 29 3b 0a 20  OrigSize==0 );. 
2a590 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2a5a0 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->pInJournal==0
2a5b0 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   );.    rc = pag
2a5c0 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28  er_open_journal(
2a5d0 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20  pPager);.  }..  
2a5e0 50 41 47 45 52 54 52 41 43 45 28 28 22 54 52 41  PAGERTRACE(("TRA
2a5f0 4e 53 41 43 54 49 4f 4e 20 25 64 5c 6e 22 2c 20  NSACTION %d\n", 
2a600 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
2a610 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
2a620 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73  ITE_OK ){.    as
2a630 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 64  sert( !pPager->d
2a640 62 4d 6f 64 69 66 69 65 64 20 29 3b 0a 20 20 20  bModified );.   
2a650 20 2f 2a 20 49 67 6e 6f 72 65 20 61 6e 79 20 49   /* Ignore any I
2a660 4f 20 65 72 72 6f 72 20 74 68 61 74 20 6f 63 63  O error that occ
2a670 75 72 73 20 77 69 74 68 69 6e 20 70 61 67 65 72  urs within pager
2a680 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
2a690 28 29 2e 20 54 68 65 0a 20 20 20 20 2a 2a 20 70  (). The.    ** p
2a6a0 75 72 70 6f 73 65 20 6f 66 20 74 68 69 73 20 63  urpose of this c
2a6b0 61 6c 6c 20 69 73 20 74 6f 20 72 65 73 65 74 20  all is to reset 
2a6c0 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61  the internal sta
2a6d0 74 65 20 6f 66 20 74 68 65 20 70 61 67 65 72 0a  te of the pager.
2a6e0 20 20 20 20 2a 2a 20 73 75 62 2d 73 79 73 74 65      ** sub-syste
2a6f0 6d 2e 20 49 74 20 64 6f 65 73 6e 27 74 20 6d 61  m. It doesn't ma
2a700 74 74 65 72 20 69 66 20 74 68 65 20 6a 6f 75 72  tter if the jour
2a710 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20  nal-file is not 
2a720 70 72 6f 70 65 72 6c 79 0a 20 20 20 20 2a 2a 20  properly.    ** 
2a730 66 69 6e 61 6c 69 7a 65 64 20 61 74 20 74 68 69  finalized at thi
2a740 73 20 70 6f 69 6e 74 20 28 73 69 6e 63 65 20 69  s point (since i
2a750 74 20 69 73 20 6e 6f 74 20 61 20 76 61 6c 69 64  t is not a valid
2a760 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e   journal file an
2a770 79 77 61 79 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  yway)..    */.  
2a780 20 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e    pager_end_tran
2a790 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20  saction(pPager, 
2a7a0 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  0);.  }.  return
2a7b0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61   rc;.}../*.** Ma
2a7c0 72 6b 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61  rk a single data
2a7d0 20 70 61 67 65 20 61 73 20 77 72 69 74 65 61 62   page as writeab
2a7e0 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20  le. The page is 
2a7f0 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
2a800 20 0a 2a 2a 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   .** main journa
2a810 6c 20 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  l or sub-journal
2a820 20 61 73 20 72 65 71 75 69 72 65 64 2e 20 49 66   as required. If
2a830 20 74 68 65 20 70 61 67 65 20 69 73 20 77 72 69   the page is wri
2a840 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 6f 6e 65  tten into.** one
2a850 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73   of the journals
2a860 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  , the correspond
2a870 69 6e 67 20 62 69 74 20 69 73 20 73 65 74 20 69  ing bit is set i
2a880 6e 20 74 68 65 20 0a 2a 2a 20 50 61 67 65 72 2e  n the .** Pager.
2a890 70 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 76 65  pInJournal bitve
2a8a0 63 20 61 6e 64 20 74 68 65 20 50 61 67 65 72 53  c and the PagerS
2a8b0 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65  avepoint.pInSave
2a8c0 70 6f 69 6e 74 20 62 69 74 76 65 63 73 0a 2a 2a  point bitvecs.**
2a8d0 20 6f 66 20 61 6e 79 20 6f 70 65 6e 20 73 61 76   of any open sav
2a8e0 65 70 6f 69 6e 74 73 20 61 73 20 61 70 70 72 6f  epoints as appro
2a8f0 70 72 69 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69  priate..*/.stati
2a900 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74  c int pager_writ
2a910 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
2a920 20 76 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 70   void *pData = p
2a930 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20 50 61 67  Pg->pData;.  Pag
2a940 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
2a950 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20  ->pPager;.  int 
2a960 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2a970 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69  .  /* This routi
2a980 6e 65 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64  ne is not called
2a990 20 75 6e 6c 65 73 73 20 61 20 74 72 61 6e 73 61   unless a transa
2a9a0 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64  ction has alread
2a9b0 79 20 62 65 65 6e 0a 20 20 2a 2a 20 73 74 61 72  y been.  ** star
2a9c0 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ted..  */.  asse
2a9d0 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
2a9e0 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e>=PAGER_RESERVE
2a9f0 44 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e  D );..  /* If an
2aa00 20 65 72 72 6f 72 20 68 61 73 20 62 65 65 6e 20   error has been 
2aa10 70 72 65 76 69 6f 75 73 6c 79 20 64 65 74 65 63  previously detec
2aa20 74 65 64 2c 20 72 65 70 6f 72 74 20 74 68 65 20  ted, report the 
2aa30 73 61 6d 65 20 65 72 72 6f 72 0a 20 20 2a 2a 20  same error.  ** 
2aa40 61 67 61 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66  again..  */.  if
2aa50 28 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e  ( NEVER(pPager->
2aa60 65 72 72 43 6f 64 65 29 20 29 20 20 72 65 74 75  errCode) )  retu
2aa70 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  rn pPager->errCo
2aa80 64 65 3b 0a 0a 20 20 2f 2a 20 48 69 67 68 65 72  de;..  /* Higher
2aa90 2d 6c 65 76 65 6c 20 72 6f 75 74 69 6e 65 73 20  -level routines 
2aaa0 6e 65 76 65 72 20 63 61 6c 6c 20 74 68 69 73 20  never call this 
2aab0 66 75 6e 63 74 69 6f 6e 20 69 66 20 64 61 74 61  function if data
2aac0 62 61 73 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a  base is not.  **
2aad0 20 77 72 69 74 61 62 6c 65 2e 20 20 42 75 74 20   writable.  But 
2aae0 63 68 65 63 6b 20 61 6e 79 77 61 79 2c 20 6a 75  check anyway, ju
2aaf0 73 74 20 66 6f 72 20 72 6f 62 75 73 74 6e 65 73  st for robustnes
2ab00 73 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45  s. */.  if( NEVE
2ab10 52 28 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e  R(pPager->readOn
2ab20 6c 79 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ly) ) return SQL
2ab30 49 54 45 5f 50 45 52 4d 3b 0a 0a 20 20 61 73 73  ITE_PERM;..  ass
2ab40 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 73 65  ert( !pPager->se
2ab50 74 4d 61 73 74 65 72 20 29 3b 0a 0a 20 20 43 48  tMaster );..  CH
2ab60 45 43 4b 5f 50 41 47 45 28 70 50 67 29 3b 0a 0a  ECK_PAGE(pPg);..
2ab70 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70 61    /* Mark the pa
2ab80 67 65 20 61 73 20 64 69 72 74 79 2e 20 20 49 66  ge as dirty.  If
2ab90 20 74 68 65 20 70 61 67 65 20 68 61 73 20 61 6c   the page has al
2aba0 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74  ready been writt
2abb0 65 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 6a  en.  ** to the j
2abc0 6f 75 72 6e 61 6c 20 74 68 65 6e 20 77 65 20 63  ournal then we c
2abd0 61 6e 20 72 65 74 75 72 6e 20 72 69 67 68 74 20  an return right 
2abe0 61 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  away..  */.  sql
2abf0 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69  ite3PcacheMakeDi
2ac00 72 74 79 28 70 50 67 29 3b 0a 20 20 69 66 28 20  rty(pPg);.  if( 
2ac10 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50  pageInJournal(pP
2ac20 67 29 20 26 26 20 21 73 75 62 6a 52 65 71 75 69  g) && !subjRequi
2ac30 72 65 73 50 61 67 65 28 70 50 67 29 20 29 7b 0a  resPage(pPg) ){.
2ac40 20 20 20 20 61 73 73 65 72 74 28 20 21 70 61 67      assert( !pag
2ac50 65 72 55 73 65 4c 6f 67 28 70 50 61 67 65 72 29  erUseLog(pPager)
2ac60 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
2ac70 64 62 4d 6f 64 69 66 69 65 64 20 3d 20 31 3b 0a  dbModified = 1;.
2ac80 20 20 7d 65 6c 73 65 7b 0a 0a 20 20 20 20 2f 2a    }else{..    /*
2ac90 20 49 66 20 77 65 20 67 65 74 20 74 68 69 73 20   If we get this 
2aca0 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  far, it means th
2acb0 61 74 20 74 68 65 20 70 61 67 65 20 6e 65 65 64  at the page need
2acc0 73 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 77  s to be.    ** w
2acd0 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 74 72  ritten to the tr
2ace0 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
2acf0 6c 20 6f 72 20 74 68 65 20 63 6b 65 63 6b 70 6f  l or the ckeckpo
2ad00 69 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  int journal.    
2ad10 2a 2a 20 6f 72 20 62 6f 74 68 2e 0a 20 20 20 20  ** or both..    
2ad20 2a 2a 0a 20 20 20 20 2a 2a 20 48 69 67 68 65 72  **.    ** Higher
2ad30 20 6c 65 76 65 6c 20 72 6f 75 74 69 6e 65 73 20   level routines 
2ad40 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65  should have alre
2ad50 61 64 79 20 73 74 61 72 74 65 64 20 61 20 74 72  ady started a tr
2ad60 61 6e 73 61 63 74 69 6f 6e 2c 0a 20 20 20 20 2a  ansaction,.    *
2ad70 2a 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68  * which means th
2ad80 65 79 20 68 61 76 65 20 61 63 71 75 69 72 65 64  ey have acquired
2ad90 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 6c   the necessary l
2ada0 6f 63 6b 73 20 62 75 74 20 74 68 65 20 72 6f 6c  ocks but the rol
2adb0 6c 62 61 63 6b 0a 20 20 20 20 2a 2a 20 6a 6f 75  lback.    ** jou
2adc0 72 6e 61 6c 20 6d 69 67 68 74 20 6e 6f 74 20 79  rnal might not y
2add0 65 74 20 62 65 20 6f 70 65 6e 2e 0a 20 20 20 20  et be open..    
2ade0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
2adf0 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 70 50  te3PagerBegin(pP
2ae00 61 67 65 72 2c 20 30 2c 20 70 50 61 67 65 72 2d  ager, 0, pPager-
2ae10 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 29 3b 0a  >subjInMemory);.
2ae20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2ae30 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
2ae40 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
2ae50 20 20 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28      if( !isOpen(
2ae60 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 0a 20 20  pPager->jfd) .  
2ae70 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f     && pPager->jo
2ae80 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52  urnalMode!=PAGER
2ae90 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
2aea0 20 0a 20 20 20 20 20 26 26 20 21 70 61 67 65 72   .     && !pager
2aeb0 55 73 65 4c 6f 67 28 70 50 61 67 65 72 29 0a 20  UseLog(pPager). 
2aec0 20 20 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65     ){.      asse
2aed0 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a  rt( pPager->useJ
2aee0 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 20 20  ournal );.      
2aef0 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f  rc = pager_open_
2af00 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b  journal(pPager);
2af10 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
2af20 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
2af30 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
2af40 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69  pPager->dbModifi
2af50 65 64 20 3d 20 31 3b 0a 20 20 0a 20 20 20 20 2f  ed = 1;.  .    /
2af60 2a 20 54 68 65 20 74 72 61 6e 73 61 63 74 69 6f  * The transactio
2af70 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20 65 78  n journal now ex
2af80 69 73 74 73 20 61 6e 64 20 77 65 20 68 61 76 65  ists and we have
2af90 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 61   a RESERVED or a
2afa0 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49  n.    ** EXCLUSI
2afb0 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6d  VE lock on the m
2afc0 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
2afd0 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 63 75  e.  Write the cu
2afe0 72 72 65 6e 74 20 70 61 67 65 20 74 6f 0a 20 20  rrent page to.  
2aff0 20 20 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63    ** the transac
2b000 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 69 66 20  tion journal if 
2b010 69 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65 20  it is not there 
2b020 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a  already..    */.
2b030 20 20 20 20 69 66 28 20 21 70 61 67 65 49 6e 4a      if( !pageInJ
2b040 6f 75 72 6e 61 6c 28 70 50 67 29 20 26 26 20 69  ournal(pPg) && i
2b050 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
2b060 64 29 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  d) ){.      asse
2b070 72 74 28 20 21 70 61 67 65 72 55 73 65 4c 6f 67  rt( !pagerUseLog
2b080 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
2b090 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3c    if( pPg->pgno<
2b0a0 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53  =pPager->dbOrigS
2b0b0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 75  ize ){.        u
2b0c0 33 32 20 63 6b 73 75 6d 3b 0a 20 20 20 20 20 20  32 cksum;.      
2b0d0 20 20 63 68 61 72 20 2a 70 44 61 74 61 32 3b 0a    char *pData2;.
2b0e0 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 73  .        /* We s
2b0f0 68 6f 75 6c 64 20 6e 65 76 65 72 20 77 72 69 74  hould never writ
2b100 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e to the journal
2b110 20 66 69 6c 65 20 74 68 65 20 70 61 67 65 20 74   file the page t
2b120 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  hat.        ** c
2b130 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74 61  ontains the data
2b140 62 61 73 65 20 6c 6f 63 6b 73 2e 20 20 54 68 65  base locks.  The
2b150 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
2b160 74 20 76 65 72 69 66 69 65 73 0a 20 20 20 20 20  t verifies.     
2b170 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f     ** that we do
2b180 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20   not. */.       
2b190 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 67   assert( pPg->pg
2b1a0 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  no!=PAGER_MJ_PGN
2b1b0 4f 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20  O(pPager) );..  
2b1c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
2b1d0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
2b1e0 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   <= pPager->jour
2b1f0 6e 61 6c 4f 66 66 20 29 3b 0a 20 20 20 20 20 20  nalOff );.      
2b200 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c    CODEC2(pPager,
2b210 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e   pData, pPg->pgn
2b220 6f 2c 20 37 2c 20 72 65 74 75 72 6e 20 53 51 4c  o, 7, return SQL
2b230 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74 61  ITE_NOMEM, pData
2b240 32 29 3b 0a 20 20 20 20 20 20 20 20 63 6b 73 75  2);.        cksu
2b250 6d 20 3d 20 70 61 67 65 72 5f 63 6b 73 75 6d 28  m = pager_cksum(
2b260 70 50 61 67 65 72 2c 20 28 75 38 2a 29 70 44 61  pPager, (u8*)pDa
2b270 74 61 32 29 3b 0a 20 20 20 20 20 20 20 20 72 63  ta2);.        rc
2b280 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
2b290 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
2b2a0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20  er->journalOff, 
2b2b0 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
2b2c0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2b2d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2b2e0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
2b2f0 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
2b300 66 64 2c 20 70 44 61 74 61 32 2c 20 70 50 61 67  fd, pData2, pPag
2b310 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20  er->pageSize,.  
2b320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b330 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67              pPag
2b340 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
2b350 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70   4);.          p
2b360 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
2b370 66 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  f += pPager->pag
2b380 65 53 69 7a 65 2b 34 3b 0a 20 20 20 20 20 20 20  eSize+4;.       
2b390 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72   }.        if( r
2b3a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2b3b0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77            rc = w
2b3c0 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
2b3d0 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
2b3e0 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 63 6b 73 75  journalOff, cksu
2b3f0 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50  m);.          pP
2b400 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
2b410 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 7d   += 4;.        }
2b420 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45  .        IOTRACE
2b430 28 28 22 4a 4f 55 54 20 25 70 20 25 64 20 25 6c  (("JOUT %p %d %l
2b440 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  ld %d\n", pPager
2b450 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20  , pPg->pgno, .  
2b460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2b470 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
2b480 66 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  f, pPager->pageS
2b490 69 7a 65 29 29 3b 0a 20 20 20 20 20 20 20 20 50  ize));.        P
2b4a0 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65  AGER_INCR(sqlite
2b4b0 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63  3_pager_writej_c
2b4c0 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 50  ount);.        P
2b4d0 41 47 45 52 54 52 41 43 45 28 28 22 4a 4f 55 52  AGERTRACE(("JOUR
2b4e0 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 20 6e  NAL %d page %d n
2b4f0 65 65 64 53 79 6e 63 3d 25 64 20 68 61 73 68 28  eedSync=%d hash(
2b500 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20  %08x)\n",.      
2b510 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70         PAGERID(p
2b520 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
2b530 6f 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  o, .            
2b540 20 28 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47   ((pPg->flags&PG
2b550 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31  HDR_NEED_SYNC)?1
2b560 3a 30 29 2c 20 70 61 67 65 72 5f 70 61 67 65 68  :0), pager_pageh
2b570 61 73 68 28 70 50 67 29 29 29 3b 0a 0a 20 20 20  ash(pPg)));..   
2b580 20 20 20 20 20 2f 2a 20 45 76 65 6e 20 69 66 20       /* Even if 
2b590 61 6e 20 49 4f 20 6f 72 20 64 69 73 6b 66 75 6c  an IO or diskful
2b5a0 6c 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  l error occurred
2b5b0 20 77 68 69 6c 65 20 6a 6f 75 72 6e 61 6c 6c 69   while journalli
2b5c0 6e 67 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  ng the.        *
2b5d0 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20 62 6c  * page in the bl
2b5e0 6f 63 6b 20 61 62 6f 76 65 2c 20 73 65 74 20 74  ock above, set t
2b5f0 68 65 20 6e 65 65 64 2d 73 79 6e 63 20 66 6c 61  he need-sync fla
2b600 67 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e 0a  g for the page..
2b610 20 20 20 20 20 20 20 20 2a 2a 20 4f 74 68 65 72          ** Other
2b620 77 69 73 65 2c 20 77 68 65 6e 20 74 68 65 20 74  wise, when the t
2b630 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
2b640 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20 6c  lled back, the l
2b650 6f 67 69 63 20 69 6e 0a 20 20 20 20 20 20 20 20  ogic in.        
2b660 2a 2a 20 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  ** playback_one_
2b670 70 61 67 65 28 29 20 77 69 6c 6c 20 74 68 69 6e  page() will thin
2b680 6b 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  k that the page 
2b690 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 73 74  needs to be rest
2b6a0 6f 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  ored.        ** 
2b6b0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
2b6c0 66 69 6c 65 2e 20 41 6e 64 20 69 66 20 61 6e 20  file. And if an 
2b6d0 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  IO error occurs 
2b6e0 77 68 69 6c 65 20 64 6f 69 6e 67 20 73 6f 2c 0a  while doing so,.
2b6f0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20          ** then 
2b700 63 6f 72 72 75 70 74 69 6f 6e 20 6d 61 79 20 66  corruption may f
2b710 6f 6c 6c 6f 77 2e 0a 20 20 20 20 20 20 20 20 2a  ollow..        *
2b720 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70  /.        if( !p
2b730 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b  Pager->noSync ){
2b740 0a 20 20 20 20 20 20 20 20 20 20 70 50 67 2d 3e  .          pPg->
2b750 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e  flags |= PGHDR_N
2b760 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20  EED_SYNC;.      
2b770 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64      pPager->need
2b780 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20  Sync = 1;.      
2b790 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
2b7a0 41 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63  An error has occ
2b7b0 75 72 72 65 64 20 77 72 69 74 69 6e 67 20 74 6f  urred writing to
2b7c0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2b7d0 65 2e 20 54 68 65 20 0a 20 20 20 20 20 20 20 20  e. The .        
2b7e0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  ** transaction w
2b7f0 69 6c 6c 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  ill be rolled ba
2b800 63 6b 20 62 79 20 74 68 65 20 6c 61 79 65 72 20  ck by the layer 
2b810 61 62 6f 76 65 2e 0a 20 20 20 20 20 20 20 20 2a  above..        *
2b820 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  /.        if( rc
2b830 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2b840 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
2b850 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  rc;.        }.. 
2b860 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e         pPager->n
2b870 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61  Rec++;.        a
2b880 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
2b890 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a  InJournal!=0 );.
2b8a0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
2b8b0 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70 50  ite3BitvecSet(pP
2b8c0 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
2b8d0 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
2b8e0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2b8f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
2b900 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
2b910 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
2b920 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  K || rc==SQLITE_
2b930 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20  NOMEM );.       
2b940 20 72 63 20 7c 3d 20 61 64 64 54 6f 53 61 76 65   rc |= addToSave
2b950 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50 61  pointBitvecs(pPa
2b960 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  ger, pPg->pgno);
2b970 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
2b980 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2b990 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2b9a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
2b9b0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65   );.          re
2b9c0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
2b9d0 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
2b9e0 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50 61          if( !pPa
2b9f0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72  ger->journalStar
2ba00 74 65 64 20 26 26 20 21 70 50 61 67 65 72 2d 3e  ted && !pPager->
2ba10 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20  noSync ){.      
2ba20 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c      pPg->flags |
2ba30 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  = PGHDR_NEED_SYN
2ba40 43 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  C;.          pPa
2ba50 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
2ba60 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
2ba70 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28       PAGERTRACE(
2ba80 28 22 41 50 50 45 4e 44 20 25 64 20 70 61 67 65  ("APPEND %d page
2ba90 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c   %d needSync=%d\
2baa0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
2bab0 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67      PAGERID(pPag
2bac0 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 0a  er), pPg->pgno,.
2bad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
2bae0 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44  (pPg->flags&PGHD
2baf0 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30  R_NEED_SYNC)?1:0
2bb00 29 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  )));.      }.   
2bb10 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20   }.  .    /* If 
2bb20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
2bb30 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 61 6e  urnal is open an
2bb40 64 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  d the page is no
2bb50 74 20 69 6e 20 69 74 2c 0a 20 20 20 20 2a 2a 20  t in it,.    ** 
2bb60 74 68 65 6e 20 77 72 69 74 65 20 74 68 65 20 63  then write the c
2bb70 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f 20 74  urrent page to t
2bb80 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
2bb90 72 6e 61 6c 2e 20 20 4e 6f 74 65 20 74 68 61 74  rnal.  Note that
2bba0 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61 74  .    ** the stat
2bbb0 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 6f  ement journal fo
2bbc0 72 6d 61 74 20 64 69 66 66 65 72 73 20 66 72 6f  rmat differs fro
2bbd0 6d 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 6a  m the standard j
2bbe0 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 0a 20 20  ournal format.  
2bbf0 20 20 2a 2a 20 69 6e 20 74 68 61 74 20 69 74 20    ** in that it 
2bc00 6f 6d 69 74 73 20 74 68 65 20 63 68 65 63 6b 73  omits the checks
2bc10 75 6d 73 20 61 6e 64 20 74 68 65 20 68 65 61 64  ums and the head
2bc20 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  er..    */.    i
2bc30 66 28 20 73 75 62 6a 52 65 71 75 69 72 65 73 50  f( subjRequiresP
2bc40 61 67 65 28 70 50 67 29 20 29 7b 0a 20 20 20 20  age(pPg) ){.    
2bc50 20 20 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61    rc = subjourna
2bc60 6c 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20  lPage(pPg);.    
2bc70 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61  }.  }..  /* Upda
2bc80 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  te the database 
2bc90 73 69 7a 65 20 61 6e 64 20 72 65 74 75 72 6e 2e  size and return.
2bca0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
2bcb0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
2bcc0 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20  AGER_SHARED );. 
2bcd0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53   if( pPager->dbS
2bce0 69 7a 65 3c 70 50 67 2d 3e 70 67 6e 6f 20 29 7b  ize<pPg->pgno ){
2bcf0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53  .    pPager->dbS
2bd00 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b  ize = pPg->pgno;
2bd10 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2bd20 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20  ;.}../*.** Mark 
2bd30 61 20 64 61 74 61 20 70 61 67 65 20 61 73 20 77  a data page as w
2bd40 72 69 74 65 61 62 6c 65 2e 20 54 68 69 73 20 72  riteable. This r
2bd50 6f 75 74 69 6e 65 20 6d 75 73 74 20 62 65 20 63  outine must be c
2bd60 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 0a 2a 2a  alled before .**
2bd70 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 20   making changes 
2bd80 74 6f 20 61 20 70 61 67 65 2e 20 54 68 65 20 63  to a page. The c
2bd90 61 6c 6c 65 72 20 6d 75 73 74 20 63 68 65 63 6b  aller must check
2bda0 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
2bdb0 65 20 0a 2a 2a 20 6f 66 20 74 68 69 73 20 66 75  e .** of this fu
2bdc0 6e 63 74 69 6f 6e 20 61 6e 64 20 62 65 20 63 61  nction and be ca
2bdd0 72 65 66 75 6c 20 6e 6f 74 20 74 6f 20 63 68 61  reful not to cha
2bde0 6e 67 65 20 61 6e 79 20 70 61 67 65 20 64 61 74  nge any page dat
2bdf0 61 20 75 6e 6c 65 73 73 20 0a 2a 2a 20 74 68 69  a unless .** thi
2be00 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
2be10 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a  s SQLITE_OK..**.
2be20 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e 63  ** The differenc
2be30 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 66  e between this f
2be40 75 6e 63 74 69 6f 6e 20 61 6e 64 20 70 61 67 65  unction and page
2be50 72 5f 77 72 69 74 65 28 29 20 69 73 20 74 68 61  r_write() is tha
2be60 74 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  t this.** functi
2be70 6f 6e 20 61 6c 73 6f 20 64 65 61 6c 73 20 77 69  on also deals wi
2be80 74 68 20 74 68 65 20 73 70 65 63 69 61 6c 20 63  th the special c
2be90 61 73 65 20 77 68 65 72 65 20 32 20 6f 72 20 6d  ase where 2 or m
2bea0 6f 72 65 20 70 61 67 65 73 0a 2a 2a 20 66 69 74  ore pages.** fit
2beb0 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 64 69 73   on a single dis
2bec0 6b 20 73 65 63 74 6f 72 2e 20 49 6e 20 74 68 69  k sector. In thi
2bed0 73 20 63 61 73 65 20 61 6c 6c 20 63 6f 2d 72 65  s case all co-re
2bee0 73 69 64 65 6e 74 20 70 61 67 65 73 0a 2a 2a 20  sident pages.** 
2bef0 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 77  must have been w
2bf00 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f  ritten to the jo
2bf10 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72  urnal file befor
2bf20 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a  e returning..**.
2bf30 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
2bf40 63 63 75 72 73 2c 20 53 51 4c 49 54 45 5f 4e 4f  ccurs, SQLITE_NO
2bf50 4d 45 4d 20 6f 72 20 61 6e 20 49 4f 20 65 72 72  MEM or an IO err
2bf60 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
2bf70 6e 65 64 0a 2a 2a 20 61 73 20 61 70 70 72 6f 70  ned.** as approp
2bf80 72 69 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65  riate. Otherwise
2bf90 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  , SQLITE_OK..*/.
2bfa0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
2bfb0 57 72 69 74 65 28 44 62 50 61 67 65 20 2a 70 44  Write(DbPage *pD
2bfc0 62 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63  bPage){.  int rc
2bfd0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
2bfe0 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 70 44   PgHdr *pPg = pD
2bff0 62 50 61 67 65 3b 0a 20 20 50 61 67 65 72 20 2a  bPage;.  Pager *
2c000 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
2c010 61 67 65 72 3b 0a 20 20 50 67 6e 6f 20 6e 50 61  ager;.  Pgno nPa
2c020 67 65 50 65 72 53 65 63 74 6f 72 20 3d 20 28 70  gePerSector = (p
2c030 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
2c040 65 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  e/pPager->pageSi
2c050 7a 65 29 3b 0a 0a 20 20 69 66 28 20 6e 50 61 67  ze);..  if( nPag
2c060 65 50 65 72 53 65 63 74 6f 72 3e 31 20 29 7b 0a  ePerSector>1 ){.
2c070 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 43 6f      Pgno nPageCo
2c080 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  unt;          /*
2c090 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   Total number of
2c0a0 20 70 61 67 65 73 20 69 6e 20 64 61 74 61 62 61   pages in databa
2c0b0 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 50  se file */.    P
2c0c0 67 6e 6f 20 70 67 31 3b 20 20 20 20 20 20 20 20  gno pg1;        
2c0d0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
2c0e0 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 73 65  t page of the se
2c0f0 63 74 6f 72 20 70 50 67 20 69 73 20 6c 6f 63 61  ctor pPg is loca
2c100 74 65 64 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69  ted on. */.    i
2c110 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20  nt nPage;       
2c120 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2c130 65 72 20 6f 66 20 70 61 67 65 73 20 73 74 61 72  er of pages star
2c140 74 69 6e 67 20 61 74 20 70 67 31 20 74 6f 20 6a  ting at pg1 to j
2c150 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 69 6e  ournal */.    in
2c160 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  t ii;           
2c170 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
2c180 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69  counter */.    i
2c190 6e 74 20 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  nt needSync = 0;
2c1a0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2c1b0 20 69 66 20 61 6e 79 20 70 61 67 65 20 68 61 73   if any page has
2c1c0 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
2c1d0 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20   */..    /* Set 
2c1e0 74 68 65 20 64 6f 4e 6f 74 53 79 6e 63 20 66 6c  the doNotSync fl
2c1f0 61 67 20 74 6f 20 31 2e 20 54 68 69 73 20 69 73  ag to 1. This is
2c200 20 62 65 63 61 75 73 65 20 77 65 20 63 61 6e 6e   because we cann
2c210 6f 74 20 61 6c 6c 6f 77 20 61 20 6a 6f 75 72 6e  ot allow a journ
2c220 61 6c 0a 20 20 20 20 2a 2a 20 68 65 61 64 65 72  al.    ** header
2c230 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 62   to be written b
2c240 65 74 77 65 65 6e 20 74 68 65 20 70 61 67 65 73  etween the pages
2c250 20 6a 6f 75 72 6e 61 6c 65 64 20 62 79 20 74 68   journaled by th
2c260 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20  is function..   
2c270 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
2c280 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 61 73  !MEMDB );.    as
2c290 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f  sert( pPager->do
2c2a0 4e 6f 74 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20  NotSync==0 );.  
2c2b0 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53    pPager->doNotS
2c2c0 79 6e 63 20 3d 20 31 3b 0a 0a 20 20 20 20 2f 2a  ync = 1;..    /*
2c2d0 20 54 68 69 73 20 74 72 69 63 6b 20 61 73 73 75   This trick assu
2c2e0 6d 65 73 20 74 68 61 74 20 62 6f 74 68 20 74 68  mes that both th
2c2f0 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20  e page-size and 
2c300 73 65 63 74 6f 72 2d 73 69 7a 65 20 61 72 65 0a  sector-size are.
2c310 20 20 20 20 2a 2a 20 61 6e 20 69 6e 74 65 67 65      ** an intege
2c320 72 20 70 6f 77 65 72 20 6f 66 20 32 2e 20 49 74  r power of 2. It
2c330 20 73 65 74 73 20 76 61 72 69 61 62 6c 65 20 70   sets variable p
2c340 67 31 20 74 6f 20 74 68 65 20 69 64 65 6e 74 69  g1 to the identi
2c350 66 69 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20 74  fier.    ** of t
2c360 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
2c370 20 74 68 65 20 73 65 63 74 6f 72 20 70 50 67 20   the sector pPg 
2c380 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 0a 20  is located on.. 
2c390 20 20 20 2a 2f 0a 20 20 20 20 70 67 31 20 3d 20     */.    pg1 = 
2c3a0 28 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 20 26  ((pPg->pgno-1) &
2c3b0 20 7e 28 6e 50 61 67 65 50 65 72 53 65 63 74 6f   ~(nPagePerSecto
2c3c0 72 2d 31 29 29 20 2b 20 31 3b 0a 0a 20 20 20 20  r-1)) + 1;..    
2c3d0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2c3e0 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
2c3f0 72 2c 20 28 69 6e 74 20 2a 29 26 6e 50 61 67 65  r, (int *)&nPage
2c400 43 6f 75 6e 74 29 3b 0a 20 20 20 20 69 66 28 20  Count);.    if( 
2c410 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
2c420 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e      if( pPg->pgn
2c430 6f 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a  o>nPageCount ){.
2c440 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 28 70        nPage = (p
2c450 50 67 2d 3e 70 67 6e 6f 20 2d 20 70 67 31 29 2b  Pg->pgno - pg1)+
2c460 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  1;.    }else if(
2c470 20 28 70 67 31 2b 6e 50 61 67 65 50 65 72 53 65   (pg1+nPagePerSe
2c480 63 74 6f 72 2d 31 29 3e 6e 50 61 67 65 43 6f 75  ctor-1)>nPageCou
2c490 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e 50 61 67  nt ){.      nPag
2c4a0 65 20 3d 20 6e 50 61 67 65 43 6f 75 6e 74 2b 31  e = nPageCount+1
2c4b0 2d 70 67 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  -pg1;.    }else{
2c4c0 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 6e  .      nPage = n
2c4d0 50 61 67 65 50 65 72 53 65 63 74 6f 72 3b 0a 20  PagePerSector;. 
2c4e0 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
2c4f0 6e 50 61 67 65 3e 30 29 3b 0a 20 20 20 20 61 73  nPage>0);.    as
2c500 73 65 72 74 28 70 67 31 3c 3d 70 50 67 2d 3e 70  sert(pg1<=pPg->p
2c510 67 6e 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74  gno);.    assert
2c520 28 28 70 67 31 2b 6e 50 61 67 65 29 3e 70 50 67  ((pg1+nPage)>pPg
2c530 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 20 20 66 6f  ->pgno);..    fo
2c540 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67 65  r(ii=0; ii<nPage
2c550 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
2c560 4b 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  K; ii++){.      
2c570 50 67 6e 6f 20 70 67 20 3d 20 70 67 31 2b 69 69  Pgno pg = pg1+ii
2c580 3b 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a 70  ;.      PgHdr *p
2c590 50 61 67 65 3b 0a 20 20 20 20 20 20 69 66 28 20  Page;.      if( 
2c5a0 70 67 3d 3d 70 50 67 2d 3e 70 67 6e 6f 20 7c 7c  pg==pPg->pgno ||
2c5b0 20 21 73 71 6c 69 74 65 33 42 69 74 76 65 63 54   !sqlite3BitvecT
2c5c0 65 73 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  est(pPager->pInJ
2c5d0 6f 75 72 6e 61 6c 2c 20 70 67 29 20 29 7b 0a 20  ournal, pg) ){. 
2c5e0 20 20 20 20 20 20 20 69 66 28 20 70 67 21 3d 50         if( pg!=P
2c5f0 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
2c600 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ger) ){.        
2c610 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
2c620 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 70  gerGet(pPager, p
2c630 67 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 20 20  g, &pPage);.    
2c640 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2c650 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2c660 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
2c670 72 5f 77 72 69 74 65 28 70 50 61 67 65 29 3b 0a  r_write(pPage);.
2c680 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2c690 70 50 61 67 65 2d 3e 66 6c 61 67 73 26 50 47 48  pPage->flags&PGH
2c6a0 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 29 7b 0a  DR_NEED_SYNC ){.
2c6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 65                ne
2c6c0 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20  edSync = 1;.    
2c6d0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
2c6e0 28 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e  (pPager->needSyn
2c6f0 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  c);.            
2c700 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  }.            sq
2c710 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
2c720 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
2c730 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
2c740 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70      }else if( (p
2c750 50 61 67 65 20 3d 20 70 61 67 65 72 5f 6c 6f 6f  Page = pager_loo
2c760 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 29 29  kup(pPager, pg))
2c770 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  !=0 ){.        i
2c780 66 28 20 70 50 61 67 65 2d 3e 66 6c 61 67 73 26  f( pPage->flags&
2c790 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
2c7a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 65  ){.          nee
2c7b0 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20  dSync = 1;.     
2c7c0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
2c7d0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
2c7e0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Page);.      }. 
2c7f0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
2c800 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53  the PGHDR_NEED_S
2c810 59 4e 43 20 66 6c 61 67 20 69 73 20 73 65 74 20  YNC flag is set 
2c820 66 6f 72 20 61 6e 79 20 6f 66 20 74 68 65 20 6e  for any of the n
2c830 50 61 67 65 20 70 61 67 65 73 20 0a 20 20 20 20  Page pages .    
2c840 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74 20 70  ** starting at p
2c850 67 31 2c 20 74 68 65 6e 20 69 74 20 6e 65 65 64  g1, then it need
2c860 73 20 74 6f 20 62 65 20 73 65 74 20 66 6f 72 20  s to be set for 
2c870 61 6c 6c 20 6f 66 20 74 68 65 6d 2e 20 42 65 63  all of them. Bec
2c880 61 75 73 65 0a 20 20 20 20 2a 2a 20 77 72 69 74  ause.    ** writ
2c890 69 6e 67 20 74 6f 20 61 6e 79 20 6f 66 20 74 68  ing to any of th
2c8a0 65 73 65 20 6e 50 61 67 65 20 70 61 67 65 73 20  ese nPage pages 
2c8b0 6d 61 79 20 64 61 6d 61 67 65 20 74 68 65 20 6f  may damage the o
2c8c0 74 68 65 72 73 2c 20 74 68 65 0a 20 20 20 20 2a  thers, the.    *
2c8d0 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  * journal file m
2c8e0 75 73 74 20 63 6f 6e 74 61 69 6e 20 73 79 6e 63  ust contain sync
2c8f0 28 29 65 64 20 63 6f 70 69 65 73 20 6f 66 20 61  ()ed copies of a
2c900 6c 6c 20 6f 66 20 74 68 65 6d 0a 20 20 20 20 2a  ll of them.    *
2c910 2a 20 62 65 66 6f 72 65 20 61 6e 79 20 6f 66 20  * before any of 
2c920 74 68 65 6d 20 63 61 6e 20 62 65 20 77 72 69 74  them can be writ
2c930 74 65 6e 20 6f 75 74 20 74 6f 20 74 68 65 20 64  ten out to the d
2c940 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
2c950 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d    */.    if( rc=
2c960 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 65  =SQLITE_OK && ne
2c970 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20  edSync ){.      
2c980 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 26  assert( !MEMDB &
2c990 26 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  & pPager->noSync
2c9a0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 66 6f 72  ==0 );.      for
2c9b0 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67 65 3b  (ii=0; ii<nPage;
2c9c0 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20   ii++){.        
2c9d0 50 67 48 64 72 20 2a 70 50 61 67 65 20 3d 20 70  PgHdr *pPage = p
2c9e0 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67  ager_lookup(pPag
2c9f0 65 72 2c 20 70 67 31 2b 69 69 29 3b 0a 20 20 20  er, pg1+ii);.   
2ca00 20 20 20 20 20 69 66 28 20 70 50 61 67 65 20 29       if( pPage )
2ca10 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  {.          pPag
2ca20 65 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44  e->flags |= PGHD
2ca30 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20  R_NEED_SYNC;.   
2ca40 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
2ca50 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b  gerUnref(pPage);
2ca60 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2ca70 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
2ca80 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
2ca90 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73  );.    }..    as
2caa0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f  sert( pPager->do
2cab0 4e 6f 74 53 79 6e 63 3d 3d 31 20 29 3b 0a 20 20  NotSync==1 );.  
2cac0 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53    pPager->doNotS
2cad0 79 6e 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ync = 0;.  }else
2cae0 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
2caf0 5f 77 72 69 74 65 28 70 44 62 50 61 67 65 29 3b  _write(pDbPage);
2cb00 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2cb10 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
2cb20 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 70 61  n TRUE if the pa
2cb30 67 65 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20  ge given in the 
2cb40 61 72 67 75 6d 65 6e 74 20 77 61 73 20 70 72 65  argument was pre
2cb50 76 69 6f 75 73 6c 79 20 70 61 73 73 65 64 0a 2a  viously passed.*
2cb60 2a 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65  * to sqlite3Page
2cb70 72 57 72 69 74 65 28 29 2e 20 20 49 6e 20 6f 74  rWrite().  In ot
2cb80 68 65 72 20 77 6f 72 64 73 2c 20 72 65 74 75 72  her words, retur
2cb90 6e 20 54 52 55 45 20 69 66 20 69 74 20 69 73 20  n TRUE if it is 
2cba0 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20  ok.** to change 
2cbb0 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  the content of t
2cbc0 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66 6e  he page..*/.#ifn
2cbd0 64 65 66 20 4e 44 45 42 55 47 0a 69 6e 74 20 73  def NDEBUG.int s
2cbe0 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
2cbf0 74 65 61 62 6c 65 28 44 62 50 61 67 65 20 2a 70  teable(DbPage *p
2cc00 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  Pg){.  return pP
2cc10 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44  g->flags&PGHDR_D
2cc20 49 52 54 59 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  IRTY;.}.#endif..
2cc30 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20  /*.** A call to 
2cc40 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65 6c  this routine tel
2cc50 6c 73 20 74 68 65 20 70 61 67 65 72 20 74 68 61  ls the pager tha
2cc60 74 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65  t it is not nece
2cc70 73 73 61 72 79 20 74 6f 0a 2a 2a 20 77 72 69 74  ssary to.** writ
2cc80 65 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f  e the informatio
2cc90 6e 20 6f 6e 20 70 61 67 65 20 70 50 67 20 62 61  n on page pPg ba
2cca0 63 6b 20 74 6f 20 74 68 65 20 64 69 73 6b 2c 20  ck to the disk, 
2ccb0 65 76 65 6e 20 74 68 6f 75 67 68 0a 2a 2a 20 74  even though.** t
2ccc0 68 61 74 20 70 61 67 65 20 6d 69 67 68 74 20 62  hat page might b
2ccd0 65 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74  e marked as dirt
2cce0 79 2e 20 20 54 68 69 73 20 68 61 70 70 65 6e 73  y.  This happens
2ccf0 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77  , for example, w
2cd00 68 65 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 20  hen.** the page 
2cd10 68 61 73 20 62 65 65 6e 20 61 64 64 65 64 20 61  has been added a
2cd20 73 20 61 20 6c 65 61 66 20 6f 66 20 74 68 65 20  s a leaf of the 
2cd30 66 72 65 65 6c 69 73 74 20 61 6e 64 20 73 6f 20  freelist and so 
2cd40 69 74 73 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6e  its.** content n
2cd50 6f 20 6c 6f 6e 67 65 72 20 6d 61 74 74 65 72 73  o longer matters
2cd60 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76 65 72  ..**.** The over
2cd70 6c 79 69 6e 67 20 73 6f 66 74 77 61 72 65 20 6c  lying software l
2cd80 61 79 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20  ayer calls this 
2cd90 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 61 6c 6c  routine when all
2cda0 20 6f 66 20 74 68 65 20 64 61 74 61 0a 2a 2a 20   of the data.** 
2cdb0 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  on the given pag
2cdc0 65 20 69 73 20 75 6e 75 73 65 64 2e 20 54 68 65  e is unused. The
2cdd0 20 70 61 67 65 72 20 6d 61 72 6b 73 20 74 68 65   pager marks the
2cde0 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 20 73   page as clean s
2cdf0 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 64 6f 65  o.** that it doe
2ce00 73 20 6e 6f 74 20 67 65 74 20 77 72 69 74 74 65  s not get writte
2ce10 6e 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a  n to disk..**.**
2ce20 20 54 65 73 74 73 20 73 68 6f 77 20 74 68 61 74   Tests show that
2ce30 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69   this optimizati
2ce40 6f 6e 20 63 61 6e 20 71 75 61 64 72 75 70 6c 65  on can quadruple
2ce50 20 74 68 65 20 73 70 65 65 64 20 6f 66 20 6c 61   the speed of la
2ce60 72 67 65 20 0a 2a 2a 20 44 45 4c 45 54 45 20 6f  rge .** DELETE o
2ce70 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2f 0a 76 6f  perations..*/.vo
2ce80 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 44  id sqlite3PagerD
2ce90 6f 6e 74 57 72 69 74 65 28 50 67 48 64 72 20 2a  ontWrite(PgHdr *
2cea0 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
2ceb0 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
2cec0 67 65 72 3b 0a 20 20 69 66 28 20 28 70 50 67 2d  ger;.  if( (pPg-
2ced0 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52  >flags&PGHDR_DIR
2cee0 54 59 29 20 26 26 20 70 50 61 67 65 72 2d 3e 6e  TY) && pPager->n
2cef0 53 61 76 65 70 6f 69 6e 74 3d 3d 30 20 29 7b 0a  Savepoint==0 ){.
2cf00 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28      PAGERTRACE((
2cf10 22 44 4f 4e 54 5f 57 52 49 54 45 20 70 61 67 65  "DONT_WRITE page
2cf20 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50   %d of %d\n", pP
2cf30 67 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44  g->pgno, PAGERID
2cf40 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20 20  (pPager)));.    
2cf50 49 4f 54 52 41 43 45 28 28 22 43 4c 45 41 4e 20  IOTRACE(("CLEAN 
2cf60 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
2cf70 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 0a 20 20  , pPg->pgno)).  
2cf80 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20    pPg->flags |= 
2cf90 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45  PGHDR_DONT_WRITE
2cfa0 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
2cfb0 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20  CHECK_PAGES.    
2cfc0 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20  pPg->pageHash = 
2cfd0 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
2cfe0 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  Pg);.#endif.  }.
2cff0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
2d000 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
2d010 74 6f 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65  to increment the
2d020 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 64 61   value of the da
2d030 74 61 62 61 73 65 20 66 69 6c 65 20 0a 2a 2a 20  tabase file .** 
2d040 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2c 20  change-counter, 
2d050 73 74 6f 72 65 64 20 61 73 20 61 20 34 2d 62 79  stored as a 4-by
2d060 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
2d070 74 65 67 65 72 20 73 74 61 72 74 69 6e 67 20 61  teger starting a
2d080 74 20 0a 2a 2a 20 62 79 74 65 20 6f 66 66 73 65  t .** byte offse
2d090 74 20 32 34 20 6f 66 20 74 68 65 20 70 61 67 65  t 24 of the page
2d0a0 72 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  r file..**.** If
2d0b0 20 74 68 65 20 69 73 44 69 72 65 63 74 4d 6f 64   the isDirectMod
2d0c0 65 20 66 6c 61 67 20 69 73 20 7a 65 72 6f 2c 20  e flag is zero, 
2d0d0 74 68 65 6e 20 74 68 69 73 20 69 73 20 64 6f 6e  then this is don
2d0e0 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 0a 2a 2a  e by calling .**
2d0f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2d100 74 65 28 29 20 6f 6e 20 70 61 67 65 20 31 2c 20  te() on page 1, 
2d110 74 68 65 6e 20 6d 6f 64 69 66 79 69 6e 67 20 74  then modifying t
2d120 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
2d130 68 65 0a 2a 2a 20 70 61 67 65 20 64 61 74 61 2e  he.** page data.
2d140 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
2d150 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 75  e file will be u
2d160 70 64 61 74 65 64 20 77 68 65 6e 20 74 68 65 20  pdated when the 
2d170 63 75 72 72 65 6e 74 0a 2a 2a 20 74 72 61 6e 73  current.** trans
2d180 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74  action is commit
2d190 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  ted..**.** The i
2d1a0 73 44 69 72 65 63 74 4d 6f 64 65 20 66 6c 61 67  sDirectMode flag
2d1b0 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 6e 6f 6e   may only be non
2d1c0 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 6c 69 62  -zero if the lib
2d1d0 72 61 72 79 20 77 61 73 20 63 6f 6d 70 69 6c 65  rary was compile
2d1e0 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 53 51  d.** with the SQ
2d1f0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d  LITE_ENABLE_ATOM
2d200 49 43 5f 57 52 49 54 45 20 6d 61 63 72 6f 20 64  IC_WRITE macro d
2d210 65 66 69 6e 65 64 2e 20 49 6e 20 74 68 69 73 20  efined. In this 
2d220 63 61 73 65 2c 0a 2a 2a 20 69 66 20 69 73 44 69  case,.** if isDi
2d230 72 65 63 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  rect is non-zero
2d240 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74 61 62  , then the datab
2d250 61 73 65 20 66 69 6c 65 20 69 73 20 75 70 64 61  ase file is upda
2d260 74 65 64 20 64 69 72 65 63 74 6c 79 0a 2a 2a 20  ted directly.** 
2d270 62 79 20 77 72 69 74 69 6e 67 20 61 6e 20 75 70  by writing an up
2d280 64 61 74 65 64 20 76 65 72 73 69 6f 6e 20 6f 66  dated version of
2d290 20 70 61 67 65 20 31 20 75 73 69 6e 67 20 61 20   page 1 using a 
2d2a0 63 61 6c 6c 20 74 6f 20 74 68 65 20 0a 2a 2a 20  call to the .** 
2d2b0 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 29  sqlite3OsWrite()
2d2c0 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   function..*/.st
2d2d0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 69  atic int pager_i
2d2e0 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ncr_changecounte
2d2f0 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
2d300 20 69 6e 74 20 69 73 44 69 72 65 63 74 4d 6f 64   int isDirectMod
2d310 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  e){.  int rc = S
2d320 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
2d330 44 65 63 6c 61 72 65 20 61 6e 64 20 69 6e 69 74  Declare and init
2d340 69 61 6c 69 7a 65 20 63 6f 6e 73 74 61 6e 74 20  ialize constant 
2d350 69 6e 74 65 67 65 72 20 27 69 73 44 69 72 65 63  integer 'isDirec
2d360 74 27 2e 20 49 66 20 74 68 65 0a 20 20 2a 2a 20  t'. If the.  ** 
2d370 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74  atomic-write opt
2d380 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 65 6e 61  imization is ena
2d390 62 6c 65 64 20 69 6e 20 74 68 69 73 20 62 75 69  bled in this bui
2d3a0 6c 64 2c 20 74 68 65 6e 20 69 73 44 69 72 65 63  ld, then isDirec
2d3b0 74 0a 20 20 2a 2a 20 69 73 20 69 6e 69 74 69 61  t.  ** is initia
2d3c0 6c 69 7a 65 64 20 74 6f 20 74 68 65 20 76 61 6c  lized to the val
2d3d0 75 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ue passed as the
2d3e0 20 69 73 44 69 72 65 63 74 4d 6f 64 65 20 70 61   isDirectMode pa
2d3f0 72 61 6d 65 74 65 72 0a 20 20 2a 2a 20 74 6f 20  rameter.  ** to 
2d400 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 4f  this function. O
2d410 74 68 65 72 77 69 73 65 2c 20 69 74 20 69 73 20  therwise, it is 
2d420 61 6c 77 61 79 73 20 73 65 74 20 74 6f 20 7a 65  always set to ze
2d430 72 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ro..  **.  ** Th
2d440 65 20 69 64 65 61 20 69 73 20 74 68 61 74 20 69  e idea is that i
2d450 66 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69  f the atomic-wri
2d460 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  te optimization 
2d470 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 65 6e 61 62  is not.  ** enab
2d480 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 20 74  led at compile t
2d490 69 6d 65 2c 20 74 68 65 20 63 6f 6d 70 69 6c 65  ime, the compile
2d4a0 72 20 63 61 6e 20 6f 6d 69 74 20 74 68 65 20 74  r can omit the t
2d4b0 65 73 74 73 20 6f 66 0a 20 20 2a 2a 20 27 69 73  ests of.  ** 'is
2d4c0 44 69 72 65 63 74 27 20 62 65 6c 6f 77 2c 20 61  Direct' below, a
2d4d0 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20 62 6c  s well as the bl
2d4e0 6f 63 6b 20 65 6e 63 6c 6f 73 65 64 20 69 6e 20  ock enclosed in 
2d4f0 74 68 65 0a 20 20 2a 2a 20 22 69 66 28 20 69 73  the.  ** "if( is
2d500 44 69 72 65 63 74 20 29 22 20 63 6f 6e 64 69 74  Direct )" condit
2d510 69 6f 6e 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65  ion..  */.#ifnde
2d520 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
2d530 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 23 20 64  ATOMIC_WRITE.# d
2d540 65 66 69 6e 65 20 44 49 52 45 43 54 5f 4d 4f 44  efine DIRECT_MOD
2d550 45 20 30 0a 20 20 61 73 73 65 72 74 28 20 69 73  E 0.  assert( is
2d560 44 69 72 65 63 74 4d 6f 64 65 3d 3d 30 20 29 3b  DirectMode==0 );
2d570 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
2d580 54 45 52 28 69 73 44 69 72 65 63 74 4d 6f 64 65  TER(isDirectMode
2d590 29 3b 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  );.#else.# defin
2d5a0 65 20 44 49 52 45 43 54 5f 4d 4f 44 45 20 69 73  e DIRECT_MODE is
2d5b0 44 69 72 65 63 74 4d 6f 64 65 0a 23 65 6e 64 69  DirectMode.#endi
2d5c0 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  f..  assert( pPa
2d5d0 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
2d5e0 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20  R_RESERVED );.  
2d5f0 69 66 28 20 21 70 50 61 67 65 72 2d 3e 63 68 61  if( !pPager->cha
2d600 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 26 26 20  ngeCountDone && 
2d610 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 30  pPager->dbSize>0
2d620 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70   ){.    PgHdr *p
2d630 50 67 48 64 72 3b 20 20 20 20 20 20 20 20 20 20  PgHdr;          
2d640 20 20 20 20 20 20 2f 2a 20 52 65 66 65 72 65 6e        /* Referen
2d650 63 65 20 74 6f 20 70 61 67 65 20 31 20 2a 2f 0a  ce to page 1 */.
2d660 20 20 20 20 75 33 32 20 63 68 61 6e 67 65 5f 63      u32 change_c
2d670 6f 75 6e 74 65 72 3b 20 20 20 20 20 20 20 20 20  ounter;         
2d680 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 76 61 6c    /* Initial val
2d690 75 65 20 6f 66 20 63 68 61 6e 67 65 2d 63 6f 75  ue of change-cou
2d6a0 6e 74 65 72 20 66 69 65 6c 64 20 2a 2f 0a 0a 20  nter field */.. 
2d6b0 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67     assert( !pPag
2d6c0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26 20  er->tempFile && 
2d6d0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
2d6e0 64 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 70  d) );..    /* Op
2d6f0 65 6e 20 70 61 67 65 20 31 20 6f 66 20 74 68 65  en page 1 of the
2d700 20 66 69 6c 65 20 66 6f 72 20 77 72 69 74 69 6e   file for writin
2d710 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73  g. */.    rc = s
2d720 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
2d730 50 61 67 65 72 2c 20 31 2c 20 26 70 50 67 48 64  Pager, 1, &pPgHd
2d740 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  r);.    assert( 
2d750 70 50 67 48 64 72 3d 3d 30 20 7c 7c 20 72 63 3d  pPgHdr==0 || rc=
2d760 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20  =SQLITE_OK );.. 
2d770 20 20 20 2f 2a 20 49 66 20 70 61 67 65 20 6f 6e     /* If page on
2d780 65 20 77 61 73 20 66 65 74 63 68 65 64 20 73 75  e was fetched su
2d790 63 63 65 73 73 66 75 6c 6c 79 2c 20 61 6e 64 20  ccessfully, and 
2d7a0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
2d7b0 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 6f 70 65 72   not.    ** oper
2d7c0 61 74 69 6e 67 20 69 6e 20 64 69 72 65 63 74 2d  ating in direct-
2d7d0 6d 6f 64 65 2c 20 6d 61 6b 65 20 70 61 67 65 20  mode, make page 
2d7e0 31 20 77 72 69 74 61 62 6c 65 2e 20 20 57 68 65  1 writable.  Whe
2d7f0 6e 20 6e 6f 74 20 69 6e 20 0a 20 20 20 20 2a 2a  n not in .    **
2d800 20 64 69 72 65 63 74 20 6d 6f 64 65 2c 20 70 61   direct mode, pa
2d810 67 65 20 31 20 69 73 20 61 6c 77 61 79 73 20 68  ge 1 is always h
2d820 65 6c 64 20 69 6e 20 63 61 63 68 65 20 61 6e 64  eld in cache and
2d830 20 68 65 6e 63 65 20 74 68 65 20 50 61 67 65 72   hence the Pager
2d840 47 65 74 28 29 0a 20 20 20 20 2a 2a 20 61 62 6f  Get().    ** abo
2d850 76 65 20 69 73 20 61 6c 77 61 79 73 20 73 75 63  ve is always suc
2d860 63 65 73 73 66 75 6c 20 2d 20 68 65 6e 63 65 20  cessful - hence 
2d870 74 68 65 20 41 4c 57 41 59 53 20 6f 6e 20 72 63  the ALWAYS on rc
2d880 3d 3d 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 20  ==SQLITE_OK..   
2d890 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 44 49 52   */.    if( !DIR
2d8a0 45 43 54 5f 4d 4f 44 45 20 26 26 20 41 4c 57 41  ECT_MODE && ALWA
2d8b0 59 53 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  YS(rc==SQLITE_OK
2d8c0 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
2d8d0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2d8e0 65 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20 7d  e(pPgHdr);.    }
2d8f0 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ..    if( rc==SQ
2d900 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2d910 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68   /* Increment th
2d920 65 20 76 61 6c 75 65 20 6a 75 73 74 20 72 65 61  e value just rea
2d930 64 20 61 6e 64 20 77 72 69 74 65 20 69 74 20 62  d and write it b
2d940 61 63 6b 20 74 6f 20 62 79 74 65 20 32 34 2e 20  ack to byte 24. 
2d950 2a 2f 0a 20 20 20 20 20 20 63 68 61 6e 67 65 5f  */.      change_
2d960 63 6f 75 6e 74 65 72 20 3d 20 73 71 6c 69 74 65  counter = sqlite
2d970 33 47 65 74 34 62 79 74 65 28 28 75 38 2a 29 70  3Get4byte((u8*)p
2d980 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
2d990 73 29 3b 0a 20 20 20 20 20 20 63 68 61 6e 67 65  s);.      change
2d9a0 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 20 20  _counter++;.    
2d9b0 20 20 70 75 74 33 32 62 69 74 73 28 28 28 63 68    put32bits(((ch
2d9c0 61 72 2a 29 70 50 67 48 64 72 2d 3e 70 44 61 74  ar*)pPgHdr->pDat
2d9d0 61 29 2b 32 34 2c 20 63 68 61 6e 67 65 5f 63 6f  a)+24, change_co
2d9e0 75 6e 74 65 72 29 3b 0a 0a 20 20 20 20 20 20 2f  unter);..      /
2d9f0 2a 20 41 6c 73 6f 20 73 74 6f 72 65 20 74 68 65  * Also store the
2da00 20 53 51 4c 69 74 65 20 76 65 72 73 69 6f 6e 20   SQLite version 
2da10 6e 75 6d 62 65 72 20 69 6e 20 62 79 74 65 73 20  number in bytes 
2da20 39 36 2e 2e 39 39 20 2a 2f 0a 20 20 20 20 20 20  96..99 */.      
2da30 70 75 74 33 32 62 69 74 73 28 28 28 63 68 61 72  put32bits(((char
2da40 2a 29 70 50 67 48 64 72 2d 3e 70 44 61 74 61 29  *)pPgHdr->pData)
2da50 2b 39 36 2c 20 53 51 4c 49 54 45 5f 56 45 52 53  +96, SQLITE_VERS
2da60 49 4f 4e 5f 4e 55 4d 42 45 52 29 3b 0a 0a 20 20  ION_NUMBER);..  
2da70 20 20 20 20 2f 2a 20 49 66 20 72 75 6e 6e 69 6e      /* If runnin
2da80 67 20 69 6e 20 64 69 72 65 63 74 20 6d 6f 64 65  g in direct mode
2da90 2c 20 77 72 69 74 65 20 74 68 65 20 63 6f 6e 74  , write the cont
2daa0 65 6e 74 73 20 6f 66 20 70 61 67 65 20 31 20 74  ents of page 1 t
2dab0 6f 20 74 68 65 20 66 69 6c 65 2e 20 2a 2f 0a 20  o the file. */. 
2dac0 20 20 20 20 20 69 66 28 20 44 49 52 45 43 54 5f       if( DIRECT_
2dad0 4d 4f 44 45 20 29 7b 0a 20 20 20 20 20 20 20 20  MODE ){.        
2dae0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 42 75 66  const void *zBuf
2daf0 20 3d 20 70 50 67 48 64 72 2d 3e 70 44 61 74 61   = pPgHdr->pData
2db00 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
2db10 28 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  ( pPager->dbFile
2db20 53 69 7a 65 3e 30 20 29 3b 0a 20 20 20 20 20 20  Size>0 );.      
2db30 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
2db40 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64  Write(pPager->fd
2db50 2c 20 7a 42 75 66 2c 20 70 50 61 67 65 72 2d 3e  , zBuf, pPager->
2db60 70 61 67 65 53 69 7a 65 2c 20 30 29 3b 0a 20 20  pageSize, 0);.  
2db70 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2db80 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2db90 20 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61       pPager->cha
2dba0 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 31  ngeCountDone = 1
2dbb0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2dbc0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2dbd0 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
2dbe0 6f 75 6e 74 44 6f 6e 65 20 3d 20 31 3b 0a 20 20  ountDone = 1;.  
2dbf0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
2dc00 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20   /* Release the 
2dc10 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e 20  page reference. 
2dc20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  */.    sqlite3Pa
2dc30 67 65 72 55 6e 72 65 66 28 70 50 67 48 64 72 29  gerUnref(pPgHdr)
2dc40 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
2dc50 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63  c;.}../*.** Sync
2dc60 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 20   the pager file 
2dc70 74 6f 20 64 69 73 6b 2e 20 54 68 69 73 20 69 73  to disk. This is
2dc80 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 69 6e 2d   a no-op for in-
2dc90 6d 65 6d 6f 72 79 20 66 69 6c 65 73 0a 2a 2a 20  memory files.** 
2dca0 6f 72 20 70 61 67 65 73 20 77 69 74 68 20 74 68  or pages with th
2dcb0 65 20 50 61 67 65 72 2e 6e 6f 53 79 6e 63 20 66  e Pager.noSync f
2dcc0 6c 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49  lag set..**.** I
2dcd0 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72  f successful, or
2dce0 20 63 61 6c 6c 65 64 20 6f 6e 20 61 20 70 61 67   called on a pag
2dcf0 65 72 20 66 6f 72 20 77 68 69 63 68 20 69 74 20  er for which it 
2dd00 69 73 20 61 20 6e 6f 2d 6f 70 2c 20 74 68 69 73  is a no-op, this
2dd10 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  .** function ret
2dd20 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  urns SQLITE_OK. 
2dd30 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20 49 4f  Otherwise, an IO
2dd40 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
2dd50 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20  eturned..*/.int 
2dd60 73 71 6c 69 74 65 33 50 61 67 65 72 53 79 6e 63  sqlite3PagerSync
2dd70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
2dd80 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
2dd90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dda0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
2ddb0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 61 73 73 65  n code */.  asse
2ddc0 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20  rt( !MEMDB );.  
2ddd0 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  if( pPager->noSy
2dde0 6e 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  nc ){.    rc = S
2ddf0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
2de00 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  e{.    rc = sqli
2de10 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72  te3OsSync(pPager
2de20 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79  ->fd, pPager->sy
2de30 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 7d 0a 20  nc_flags);.  }. 
2de40 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2de50 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 64 61  *.** Sync the da
2de60 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20  tabase file for 
2de70 74 68 65 20 70 61 67 65 72 20 70 50 61 67 65 72  the pager pPager
2de80 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73  . zMaster points
2de90 20 74 6f 20 74 68 65 20 6e 61 6d 65 0a 2a 2a 20   to the name.** 
2dea0 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  of a master jour
2deb0 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68  nal file that sh
2dec0 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20  ould be written 
2ded0 69 6e 74 6f 20 74 68 65 20 69 6e 64 69 76 69 64  into the individ
2dee0 75 61 6c 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  ual.** journal f
2def0 69 6c 65 2e 20 7a 4d 61 73 74 65 72 20 6d 61 79  ile. zMaster may
2df00 20 62 65 20 4e 55 4c 4c 2c 20 77 68 69 63 68 20   be NULL, which 
2df10 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61  is interpreted a
2df20 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 6a  s no master.** j
2df30 6f 75 72 6e 61 6c 20 28 61 20 73 69 6e 67 6c 65  ournal (a single
2df40 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61   database transa
2df50 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  ction)..**.** Th
2df60 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 73 75 72  is routine ensur
2df70 65 73 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20  es that:.**.**  
2df80 20 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20   * The database 
2df90 66 69 6c 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e  file change-coun
2dfa0 74 65 72 20 69 73 20 75 70 64 61 74 65 64 2c 0a  ter is updated,.
2dfb0 2a 2a 20 20 20 2a 20 74 68 65 20 6a 6f 75 72 6e  **   * the journ
2dfc0 61 6c 20 69 73 20 73 79 6e 63 65 64 20 28 75 6e  al is synced (un
2dfd0 6c 65 73 73 20 74 68 65 20 61 74 6f 6d 69 63 2d  less the atomic-
2dfe0 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69  write optimizati
2dff0 6f 6e 20 69 73 20 75 73 65 64 29 2c 0a 2a 2a 20  on is used),.** 
2e000 20 20 2a 20 61 6c 6c 20 64 69 72 74 79 20 70 61    * all dirty pa
2e010 67 65 73 20 61 72 65 20 77 72 69 74 74 65 6e 20  ges are written 
2e020 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
2e030 66 69 6c 65 2c 20 0a 2a 2a 20 20 20 2a 20 74 68  file, .**   * th
2e040 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2e050 69 73 20 74 72 75 6e 63 61 74 65 64 20 28 69 66  is truncated (if
2e060 20 72 65 71 75 69 72 65 64 29 2c 20 61 6e 64 0a   required), and.
2e070 2a 2a 20 20 20 2a 20 74 68 65 20 64 61 74 61 62  **   * the datab
2e080 61 73 65 20 66 69 6c 65 20 73 79 6e 63 65 64 2e  ase file synced.
2e090 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79   .**.** The only
2e0a0 20 74 68 69 6e 67 20 74 68 61 74 20 72 65 6d 61   thing that rema
2e0b0 69 6e 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68  ins to commit th
2e0c0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
2e0d0 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 0a 2a 2a   to finalize .**
2e0e0 20 28 64 65 6c 65 74 65 2c 20 74 72 75 6e 63 61   (delete, trunca
2e0f0 74 65 20 6f 72 20 7a 65 72 6f 20 74 68 65 20 66  te or zero the f
2e100 69 72 73 74 20 70 61 72 74 20 6f 66 29 20 74 68  irst part of) th
2e110 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28  e journal file (
2e120 6f 72 20 0a 2a 2a 20 64 65 6c 65 74 65 20 74 68  or .** delete th
2e130 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
2e140 20 66 69 6c 65 20 69 66 20 73 70 65 63 69 66 69   file if specifi
2e150 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  ed)..**.** Note 
2e160 74 68 61 74 20 69 66 20 7a 4d 61 73 74 65 72 3d  that if zMaster=
2e170 3d 4e 55 4c 4c 2c 20 74 68 69 73 20 64 6f 65 73  =NULL, this does
2e180 20 6e 6f 74 20 6f 76 65 72 77 72 69 74 65 20 61   not overwrite a
2e190 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65 0a   previous value.
2e1a0 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 61 6e 20  ** passed to an 
2e1b0 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
2e1c0 69 74 50 68 61 73 65 4f 6e 65 28 29 20 63 61 6c  itPhaseOne() cal
2e1d0 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  l..**.** If the 
2e1e0 66 69 6e 61 6c 20 70 61 72 61 6d 65 74 65 72 20  final parameter 
2e1f0 2d 20 6e 6f 53 79 6e 63 20 2d 20 69 73 20 74 72  - noSync - is tr
2e200 75 65 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74  ue, then the dat
2e210 61 62 61 73 65 20 66 69 6c 65 20 69 74 73 65 6c  abase file itsel
2e220 66 0a 2a 2a 20 69 73 20 6e 6f 74 20 73 79 6e 63  f.** is not sync
2e230 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 6d  ed. The caller m
2e240 75 73 74 20 63 61 6c 6c 20 73 71 6c 69 74 65 33  ust call sqlite3
2e250 50 61 67 65 72 53 79 6e 63 28 29 20 64 69 72 65  PagerSync() dire
2e260 63 74 6c 79 20 74 6f 0a 2a 2a 20 73 79 6e 63 20  ctly to.** sync 
2e270 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2e280 65 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67  e before calling
2e290 20 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28   CommitPhaseTwo(
2e2a0 29 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 0a  ) to delete the.
2e2b0 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
2e2c0 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f  in this case..*/
2e2d0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
2e2e0 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  rCommitPhaseOne(
2e2f0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
2e300 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2e310 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65     /* Pager obje
2e320 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ct */.  const ch
2e330 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20 20 20 20  ar *zMaster,    
2e340 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f          /* If no
2e350 74 20 4e 55 4c 4c 2c 20 74 68 65 20 6d 61 73 74  t NULL, the mast
2e360 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
2e370 2a 2f 0a 20 20 69 6e 74 20 6e 6f 53 79 6e 63 20  */.  int noSync 
2e380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e390 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
2e3a0 6f 6d 69 74 20 74 68 65 20 78 53 79 6e 63 20 6f  omit the xSync o
2e3b0 6e 20 74 68 65 20 64 62 20 66 69 6c 65 20 2a 2f  n the db file */
2e3c0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
2e3d0 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
2e3e0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
2e3f0 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68  code */..  /* Th
2e400 65 20 64 62 4f 72 69 67 53 69 7a 65 20 69 73 20  e dbOrigSize is 
2e410 6e 65 76 65 72 20 73 65 74 20 69 66 20 6a 6f 75  never set if jou
2e420 72 6e 61 6c 5f 6d 6f 64 65 3d 4f 46 46 20 2a 2f  rnal_mode=OFF */
2e430 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
2e440 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d  r->journalMode!=
2e450 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
2e460 45 5f 4f 46 46 20 7c 7c 20 70 50 61 67 65 72 2d  E_OFF || pPager-
2e470 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d 30 20 29  >dbOrigSize==0 )
2e480 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 20 70 72 69  ;..  /* If a pri
2e490 6f 72 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  or error occurre
2e4a0 64 2c 20 72 65 70 6f 72 74 20 74 68 61 74 20 65  d, report that e
2e4b0 72 72 6f 72 20 61 67 61 69 6e 2e 20 2a 2f 0a 20  rror again. */. 
2e4c0 20 69 66 28 20 4e 45 56 45 52 28 70 50 61 67 65   if( NEVER(pPage
2e4d0 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 72 65  r->errCode) ) re
2e4e0 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72  turn pPager->err
2e4f0 43 6f 64 65 3b 0a 0a 20 20 50 41 47 45 52 54 52  Code;..  PAGERTR
2e500 41 43 45 28 28 22 44 41 54 41 42 41 53 45 20 53  ACE(("DATABASE S
2e510 59 4e 43 3a 20 46 69 6c 65 3d 25 73 20 7a 4d 61  YNC: File=%s zMa
2e520 73 74 65 72 3d 25 73 20 6e 53 69 7a 65 3d 25 64  ster=%s nSize=%d
2e530 5c 6e 22 2c 20 0a 20 20 20 20 20 20 70 50 61 67  \n", .      pPag
2e540 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a  er->zFilename, z
2e550 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e  Master, pPager->
2e560 64 62 53 69 7a 65 29 29 3b 0a 0a 20 20 69 66 28  dbSize));..  if(
2e570 20 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65 72   MEMDB && pPager
2e580 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 29 7b 0a  ->dbModified ){.
2e590 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
2e5a0 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  s an in-memory d
2e5b0 62 2c 20 6f 72 20 6e 6f 20 70 61 67 65 73 20 68  b, or no pages h
2e5c0 61 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ave been written
2e5d0 20 74 6f 2c 20 6f 72 20 74 68 69 73 0a 20 20 20   to, or this.   
2e5e0 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73   ** function has
2e5f0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61   already been ca
2e600 6c 6c 65 64 2c 20 69 74 20 69 73 20 6d 6f 73 74  lled, it is most
2e610 6c 79 20 61 20 6e 6f 2d 6f 70 2e 20 20 48 6f 77  ly a no-op.  How
2e620 65 76 65 72 2c 20 61 6e 79 0a 20 20 20 20 2a 2a  ever, any.    **
2e630 20 62 61 63 6b 75 70 20 69 6e 20 70 72 6f 67 72   backup in progr
2e640 65 73 73 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ess needs to be 
2e650 72 65 73 74 61 72 74 65 64 2e 0a 20 20 20 20 2a  restarted..    *
2e660 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42 61 63  /.    sqlite3Bac
2e670 6b 75 70 52 65 73 74 61 72 74 28 70 50 61 67 65  kupRestart(pPage
2e680 72 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 20 20 7d  r->pBackup);.  }
2e690 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d  else if( pPager-
2e6a0 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 53 59  >state!=PAGER_SY
2e6b0 4e 43 45 44 20 26 26 20 70 50 61 67 65 72 2d 3e  NCED && pPager->
2e6c0 64 62 4d 6f 64 69 66 69 65 64 20 29 7b 0a 20 20  dbModified ){.  
2e6d0 20 20 69 66 28 20 70 61 67 65 72 55 73 65 4c 6f    if( pagerUseLo
2e6e0 67 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  g(pPager) ){.   
2e6f0 20 20 20 50 67 48 64 72 20 2a 70 4c 69 73 74 20     PgHdr *pList 
2e700 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44  = sqlite3PcacheD
2e710 69 72 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d  irtyList(pPager-
2e720 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 20 20 20  >pPCache);.     
2e730 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20   if( pList ){.  
2e740 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2e750 65 33 4c 6f 67 46 72 61 6d 65 73 28 70 50 61 67  e3LogFrames(pPag
2e760 65 72 2d 3e 70 4c 6f 67 2c 20 70 50 61 67 65 72  er->pLog, pPager
2e770 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 4c 69 73  ->pageSize, pLis
2e780 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  t,.            p
2e790 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2c 20 31  Pager->dbSize, 1
2e7a0 2c 20 28 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  , (pPager->fullS
2e7b0 79 6e 63 20 3f 20 70 50 61 67 65 72 2d 3e 73 79  ync ? pPager->sy
2e7c0 6e 63 5f 66 6c 61 67 73 20 3a 20 30 29 0a 20 20  nc_flags : 0).  
2e7d0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d        );.      }
2e7e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 63  .      sqlite3Pc
2e7f0 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61  acheCleanAll(pPa
2e800 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
2e810 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2e820 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
2e830 20 62 6c 6f 63 6b 20 75 70 64 61 74 65 73 20 74   block updates t
2e840 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
2e850 72 2e 20 45 78 61 63 74 6c 79 20 68 6f 77 20 69  r. Exactly how i
2e860 74 0a 20 20 20 20 20 20 2a 2a 20 64 6f 65 73 20  t.      ** does 
2e870 74 68 69 73 20 64 65 70 65 6e 64 73 20 6f 6e 20  this depends on 
2e880 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
2e890 68 65 20 61 74 6f 6d 69 63 2d 75 70 64 61 74 65  he atomic-update
2e8a0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 20 20   optimization.  
2e8b0 20 20 20 20 2a 2a 20 77 61 73 20 65 6e 61 62 6c      ** was enabl
2e8c0 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69  ed at compile ti
2e8d0 6d 65 2c 20 61 6e 64 20 69 66 20 74 68 69 73 20  me, and if this 
2e8e0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 65 65 74  transaction meet
2e8f0 73 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  s the .      ** 
2e900 72 75 6e 74 69 6d 65 20 63 72 69 74 65 72 69 61  runtime criteria
2e910 20 74 6f 20 75 73 65 20 74 68 65 20 6f 70 65 72   to use the oper
2e920 61 74 69 6f 6e 3a 20 0a 20 20 20 20 20 20 2a 2a  ation: .      **
2e930 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 2a 20 54  .      **    * T
2e940 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73  he file-system s
2e950 75 70 70 6f 72 74 73 20 74 68 65 20 61 74 6f 6d  upports the atom
2e960 69 63 2d 77 72 69 74 65 20 70 72 6f 70 65 72 74  ic-write propert
2e970 79 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 20  y for.      **  
2e980 20 20 20 20 62 6c 6f 63 6b 73 20 6f 66 20 73 69      blocks of si
2e990 7a 65 20 70 61 67 65 2d 73 69 7a 65 2c 20 61 6e  ze page-size, an
2e9a0 64 20 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 2a  d .      **    *
2e9b0 20 54 68 69 73 20 63 6f 6d 6d 69 74 20 69 73 20   This commit is 
2e9c0 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 20 6d 75  not part of a mu
2e9d0 6c 74 69 2d 66 69 6c 65 20 74 72 61 6e 73 61 63  lti-file transac
2e9e0 74 69 6f 6e 2c 20 61 6e 64 0a 20 20 20 20 20 20  tion, and.      
2e9f0 2a 2a 20 20 20 20 2a 20 45 78 61 63 74 6c 79 20  **    * Exactly 
2ea00 6f 6e 65 20 70 61 67 65 20 68 61 73 20 62 65 65  one page has bee
2ea10 6e 20 6d 6f 64 69 66 69 65 64 20 61 6e 64 20 73  n modified and s
2ea20 74 6f 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72  tore in the jour
2ea30 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20  nal file..      
2ea40 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74  **.      ** If t
2ea50 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  he optimization 
2ea60 77 61 73 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20  was not enabled 
2ea70 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c  at compile time,
2ea80 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20 20 20   then the.      
2ea90 2a 2a 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68  ** pager_incr_ch
2eaa0 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 20 66 75  angecounter() fu
2eab0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
2eac0 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 63   to update the c
2ead0 68 61 6e 67 65 0a 20 20 20 20 20 20 2a 2a 20 63  hange.      ** c
2eae0 6f 75 6e 74 65 72 20 69 6e 20 27 69 6e 64 69 72  ounter in 'indir
2eaf0 65 63 74 2d 6d 6f 64 65 27 2e 20 49 66 20 74 68  ect-mode'. If th
2eb00 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69  e optimization i
2eb10 73 20 63 6f 6d 70 69 6c 65 64 20 69 6e 20 62 75  s compiled in bu
2eb20 74 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f  t.      ** is no
2eb30 74 20 61 70 70 6c 69 63 61 62 6c 65 20 74 6f 20  t applicable to 
2eb40 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
2eb50 2c 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 4a 6f  , call sqlite3Jo
2eb60 75 72 6e 61 6c 43 72 65 61 74 65 28 29 0a 20 20  urnalCreate().  
2eb70 20 20 20 20 2a 2a 20 74 6f 20 6d 61 6b 65 20 73      ** to make s
2eb80 75 72 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ure the journal 
2eb90 66 69 6c 65 20 68 61 73 20 61 63 74 75 61 6c 6c  file has actuall
2eba0 79 20 62 65 65 6e 20 63 72 65 61 74 65 64 2c 20  y been created, 
2ebb0 74 68 65 6e 20 63 61 6c 6c 0a 20 20 20 20 20 20  then call.      
2ebc0 2a 2a 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68  ** pager_incr_ch
2ebd0 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 20 74 6f  angecounter() to
2ebe0 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e   update the chan
2ebf0 67 65 2d 63 6f 75 6e 74 65 72 20 69 6e 20 69 6e  ge-counter in in
2ec00 64 69 72 65 63 74 0a 20 20 20 20 20 20 2a 2a 20  direct.      ** 
2ec10 6d 6f 64 65 2e 20 0a 20 20 20 20 20 20 2a 2a 0a  mode. .      **.
2ec20 20 20 20 20 20 20 2a 2a 20 4f 74 68 65 72 77 69        ** Otherwi
2ec30 73 65 2c 20 69 66 20 74 68 65 20 6f 70 74 69 6d  se, if the optim
2ec40 69 7a 61 74 69 6f 6e 20 69 73 20 62 6f 74 68 20  ization is both 
2ec50 65 6e 61 62 6c 65 64 20 61 6e 64 20 61 70 70 6c  enabled and appl
2ec60 69 63 61 62 6c 65 2c 0a 20 20 20 20 20 20 2a 2a  icable,.      **
2ec70 20 74 68 65 6e 20 63 61 6c 6c 20 70 61 67 65 72   then call pager
2ec80 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e  _incr_changecoun
2ec90 74 65 72 28 29 20 74 6f 20 75 70 64 61 74 65 20  ter() to update 
2eca0 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
2ecb0 65 72 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 27  er.      ** in '
2ecc0 64 69 72 65 63 74 27 20 6d 6f 64 65 2e 20 49 6e  direct' mode. In
2ecd0 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 6a   this case the j
2ece0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c 6c  ournal file will
2ecf0 20 6e 65 76 65 72 20 62 65 0a 20 20 20 20 20 20   never be.      
2ed00 2a 2a 20 63 72 65 61 74 65 64 20 66 6f 72 20 74  ** created for t
2ed10 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  his transaction.
2ed20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 23 69 66 64  .      */.  #ifd
2ed30 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
2ed40 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20  _ATOMIC_WRITE.  
2ed50 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a      PgHdr *pPg;.
2ed60 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 73        assert( is
2ed70 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
2ed80 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ) || pPager->jou
2ed90 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
2eda0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
2edb0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 4d  );.      if( !zM
2edc0 61 73 74 65 72 20 26 26 20 69 73 4f 70 65 6e 28  aster && isOpen(
2edd0 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 0a 20 20  pPager->jfd) .  
2ede0 20 20 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e       && pPager->
2edf0 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 6a 72 6e 6c  journalOff==jrnl
2ee00 42 75 66 66 65 72 53 69 7a 65 28 70 50 61 67 65  BufferSize(pPage
2ee10 72 29 20 0a 20 20 20 20 20 20 20 26 26 20 70 50  r) .       && pP
2ee20 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 70 50  ager->dbSize>=pP
2ee30 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
2ee40 0a 20 20 20 20 20 20 20 26 26 20 28 30 3d 3d 28  .       && (0==(
2ee50 70 50 67 20 3d 20 73 71 6c 69 74 65 33 50 63 61  pPg = sqlite3Pca
2ee60 63 68 65 44 69 72 74 79 4c 69 73 74 28 70 50 61  cheDirtyList(pPa
2ee70 67 65 72 2d 3e 70 50 43 61 63 68 65 29 29 20 7c  ger->pPCache)) |
2ee80 7c 20 30 3d 3d 70 50 67 2d 3e 70 44 69 72 74 79  | 0==pPg->pDirty
2ee90 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  ).      ){.     
2eea0 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65     /* Update the
2eeb0 20 64 62 20 66 69 6c 65 20 63 68 61 6e 67 65 20   db file change 
2eec0 63 6f 75 6e 74 65 72 20 76 69 61 20 74 68 65 20  counter via the 
2eed0 64 69 72 65 63 74 2d 77 72 69 74 65 20 6d 65 74  direct-write met
2eee0 68 6f 64 2e 20 54 68 65 20 0a 20 20 20 20 20 20  hod. The .      
2eef0 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 63    ** following c
2ef00 61 6c 6c 20 77 69 6c 6c 20 6d 6f 64 69 66 79 20  all will modify 
2ef10 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65  the in-memory re
2ef20 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
2ef30 70 61 67 65 20 31 20 0a 20 20 20 20 20 20 20 20  page 1 .        
2ef40 2a 2a 20 74 6f 20 69 6e 63 6c 75 64 65 20 74 68  ** to include th
2ef50 65 20 75 70 64 61 74 65 64 20 63 68 61 6e 67 65  e updated change
2ef60 20 63 6f 75 6e 74 65 72 20 61 6e 64 20 74 68 65   counter and the
2ef70 6e 20 77 72 69 74 65 20 70 61 67 65 20 31 20 0a  n write page 1 .
2ef80 20 20 20 20 20 20 20 20 2a 2a 20 64 69 72 65 63          ** direc
2ef90 74 6c 79 20 74 6f 20 74 68 65 20 64 61 74 61 62  tly to the datab
2efa0 61 73 65 20 66 69 6c 65 2e 20 42 65 63 61 75 73  ase file. Becaus
2efb0 65 20 6f 66 20 74 68 65 20 61 74 6f 6d 69 63 2d  e of the atomic-
2efc0 77 72 69 74 65 20 0a 20 20 20 20 20 20 20 20 2a  write .        *
2efd0 2a 20 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68  * property of th
2efe0 65 20 68 6f 73 74 20 66 69 6c 65 2d 73 79 73 74  e host file-syst
2eff0 65 6d 2c 20 74 68 69 73 20 69 73 20 73 61 66 65  em, this is safe
2f000 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
2f010 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
2f020 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74  incr_changecount
2f030 65 72 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20  er(pPager, 1);. 
2f040 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2f050 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2f060 4a 6f 75 72 6e 61 6c 43 72 65 61 74 65 28 70 50  JournalCreate(pP
2f070 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20  ager->jfd);.    
2f080 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2f090 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2f0a0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 69 6e     rc = pager_in
2f0b0 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72  cr_changecounter
2f0c0 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20  (pPager, 0);.   
2f0d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2f0e0 20 23 65 6c 73 65 0a 20 20 20 20 20 20 72 63 20   #else.      rc 
2f0f0 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61  = pager_incr_cha
2f100 6e 67 65 63 6f 75 6e 74 65 72 28 70 50 61 67 65  ngecounter(pPage
2f110 72 2c 20 30 29 3b 0a 20 20 23 65 6e 64 69 66 0a  r, 0);.  #endif.
2f120 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2f130 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63  LITE_OK ) goto c
2f140 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f  ommit_phase_one_
2f150 65 78 69 74 3b 0a 20 20 0a 20 20 20 20 20 20 2f  exit;.  .      /
2f160 2a 20 49 66 20 74 68 69 73 20 74 72 61 6e 73 61  * If this transa
2f170 63 74 69 6f 6e 20 68 61 73 20 6d 61 64 65 20 74  ction has made t
2f180 68 65 20 64 61 74 61 62 61 73 65 20 73 6d 61 6c  he database smal
2f190 6c 65 72 2c 20 74 68 65 6e 20 61 6c 6c 20 70 61  ler, then all pa
2f1a0 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 62 65 69  ges.      ** bei
2f1b0 6e 67 20 64 69 73 63 61 72 64 65 64 20 62 79 20  ng discarded by 
2f1c0 74 68 65 20 74 72 75 6e 63 61 74 69 6f 6e 20 6d  the truncation m
2f1d0 75 73 74 20 62 65 20 77 72 69 74 74 65 6e 20 74  ust be written t
2f1e0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20  o the journal.  
2f1f0 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20 54 68 69      ** file. Thi
2f200 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65  s can only happe
2f210 6e 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  n in auto-vacuum
2f220 20 6d 6f 64 65 2e 0a 20 20 20 20 20 20 2a 2a 0a   mode..      **.
2f230 20 20 20 20 20 20 2a 2a 20 42 65 66 6f 72 65 20        ** Before 
2f240 72 65 61 64 69 6e 67 20 74 68 65 20 70 61 67 65  reading the page
2f250 73 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62  s with page numb
2f260 65 72 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20  ers larger than 
2f270 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 63 75  the .      ** cu
2f280 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 50  rrent value of P
2f290 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 73 65 74  ager.dbSize, set
2f2a0 20 64 62 53 69 7a 65 20 62 61 63 6b 20 74 6f 20   dbSize back to 
2f2b0 74 68 65 20 76 61 6c 75 65 0a 20 20 20 20 20 20  the value.      
2f2c0 2a 2a 20 74 68 61 74 20 69 74 20 74 6f 6f 6b 20  ** that it took 
2f2d0 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
2f2e0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
2f2f0 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 0a   Otherwise, the.
2f300 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 73 20 74        ** calls t
2f310 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  o sqlite3PagerGe
2f320 74 28 29 20 72 65 74 75 72 6e 20 7a 65 72 6f 65  t() return zeroe
2f330 64 20 70 61 67 65 73 20 69 6e 73 74 65 61 64 20  d pages instead 
2f340 6f 66 20 0a 20 20 20 20 20 20 2a 2a 20 72 65 61  of .      ** rea
2f350 64 69 6e 67 20 64 61 74 61 20 66 72 6f 6d 20 74  ding data from t
2f360 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2f370 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
2f380 20 2a 2a 20 57 68 65 6e 20 6a 6f 75 72 6e 61 6c   ** When journal
2f390 5f 6d 6f 64 65 3d 3d 4f 46 46 20 74 68 65 20 64  _mode==OFF the d
2f3a0 62 4f 72 69 67 53 69 7a 65 20 69 73 20 61 6c 77  bOrigSize is alw
2f3b0 61 79 73 20 7a 65 72 6f 2c 20 73 6f 20 74 68 69  ays zero, so thi
2f3c0 73 0a 20 20 20 20 20 20 2a 2a 20 62 6c 6f 63 6b  s.      ** block
2f3d0 20 6e 65 76 65 72 20 72 75 6e 73 20 69 66 20 6a   never runs if j
2f3e0 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 4f 46 46 2e  ournal_mode=OFF.
2f3f0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 23 69 66 6e  .      */.  #ifn
2f400 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2f410 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
2f420 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53   if( pPager->dbS
2f430 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62 4f 72  ize<pPager->dbOr
2f440 69 67 53 69 7a 65 20 0a 20 20 20 20 20 20 20 26  igSize .       &
2f450 26 20 41 4c 57 41 59 53 28 70 50 61 67 65 72 2d  & ALWAYS(pPager-
2f460 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41  >journalMode!=PA
2f470 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
2f480 4f 46 46 29 0a 20 20 20 20 20 20 29 7b 0a 20 20  OFF).      ){.  
2f490 20 20 20 20 20 20 50 67 6e 6f 20 69 3b 20 20 20        Pgno i;   
2f4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f4c0 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69  /* Iterator vari
2f4d0 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  able */.        
2f4e0 63 6f 6e 73 74 20 50 67 6e 6f 20 69 53 6b 69 70  const Pgno iSkip
2f4f0 20 3d 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f   = PAGER_MJ_PGNO
2f500 28 70 50 61 67 65 72 29 3b 20 2f 2a 20 50 65 6e  (pPager); /* Pen
2f510 64 69 6e 67 20 6c 6f 63 6b 20 70 61 67 65 20 2a  ding lock page *
2f520 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  /.        const 
2f530 50 67 6e 6f 20 64 62 53 69 7a 65 20 3d 20 70 50  Pgno dbSize = pP
2f540 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 20 20 20  ager->dbSize;   
2f550 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
2f560 69 6d 61 67 65 20 73 69 7a 65 20 2a 2f 20 0a 20  image size */ . 
2f570 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64         pPager->d
2f580 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  bSize = pPager->
2f590 64 62 4f 72 69 67 53 69 7a 65 3b 0a 20 20 20 20  dbOrigSize;.    
2f5a0 20 20 20 20 66 6f 72 28 20 69 3d 64 62 53 69 7a      for( i=dbSiz
2f5b0 65 2b 31 3b 20 69 3c 3d 70 50 61 67 65 72 2d 3e  e+1; i<=pPager->
2f5c0 64 62 4f 72 69 67 53 69 7a 65 3b 20 69 2b 2b 20  dbOrigSize; i++ 
2f5d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
2f5e0 20 21 73 71 6c 69 74 65 33 42 69 74 76 65 63 54   !sqlite3BitvecT
2f5f0 65 73 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  est(pPager->pInJ
2f600 6f 75 72 6e 61 6c 2c 20 69 29 20 26 26 20 69 21  ournal, i) && i!
2f610 3d 69 53 6b 69 70 20 29 7b 0a 20 20 20 20 20 20  =iSkip ){.      
2f620 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 61        PgHdr *pPa
2f630 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
2f640 2f 2a 20 50 61 67 65 20 74 6f 20 6a 6f 75 72 6e  /* Page to journ
2f650 61 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  al */.          
2f660 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
2f670 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 69  gerGet(pPager, i
2f680 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 20 20 20  , &pPage);.     
2f690 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
2f6a0 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
2f6b0 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65  commit_phase_one
2f6c0 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20 20  _exit;.         
2f6d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
2f6e0 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 29  agerWrite(pPage)
2f6f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
2f700 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
2f710 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
2f720 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2f730 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d  TE_OK ) goto com
2f740 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78  mit_phase_one_ex
2f750 69 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  it;.          }.
2f760 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2f770 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
2f780 20 3d 20 64 62 53 69 7a 65 3b 0a 20 20 20 20 20   = dbSize;.     
2f790 20 7d 20 0a 20 20 23 65 6e 64 69 66 0a 20 20 0a   } .  #endif.  .
2f7a0 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
2f7b0 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
2f7c0 6c 20 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65 20  l name into the 
2f7d0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66  journal file. If
2f7e0 20 61 20 6d 61 73 74 65 72 20 0a 20 20 20 20 20   a master .     
2f7f0 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   ** journal file
2f800 20 6e 61 6d 65 20 68 61 73 20 61 6c 72 65 61 64   name has alread
2f810 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  y been written t
2f820 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
2f830 6c 65 2c 20 0a 20 20 20 20 20 20 2a 2a 20 6f 72  le, .      ** or
2f840 20 69 66 20 7a 4d 61 73 74 65 72 20 69 73 20 4e   if zMaster is N
2f850 55 4c 4c 20 28 6e 6f 20 6d 61 73 74 65 72 20 6a  ULL (no master j
2f860 6f 75 72 6e 61 6c 29 2c 20 74 68 65 6e 20 74 68  ournal), then th
2f870 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d  is call is a no-
2f880 6f 70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  op..      */.   
2f890 20 20 20 72 63 20 3d 20 77 72 69 74 65 4d 61 73     rc = writeMas
2f8a0 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  terJournal(pPage
2f8b0 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  r, zMaster);.   
2f8c0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2f8d0 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d  E_OK ) goto comm
2f8e0 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69  it_phase_one_exi
2f8f0 74 3b 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 53  t;.  .      /* S
2f900 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
2f910 66 69 6c 65 2e 20 49 66 20 74 68 65 20 61 74 6f  file. If the ato
2f920 6d 69 63 2d 75 70 64 61 74 65 20 6f 70 74 69 6d  mic-update optim
2f930 69 7a 61 74 69 6f 6e 20 69 73 20 62 65 69 6e 67  ization is being
2f940 0a 20 20 20 20 20 20 2a 2a 20 75 73 65 64 2c 20  .      ** used, 
2f950 74 68 69 73 20 63 61 6c 6c 20 77 69 6c 6c 20 6e  this call will n
2f960 6f 74 20 63 72 65 61 74 65 20 74 68 65 20 6a 6f  ot create the jo
2f970 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 70 65  urnal file or pe
2f980 72 66 6f 72 6d 20 61 6e 79 0a 20 20 20 20 20 20  rform any.      
2f990 2a 2a 20 72 65 61 6c 20 49 4f 2e 0a 20 20 20 20  ** real IO..    
2f9a0 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20    */.      rc = 
2f9b0 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67  syncJournal(pPag
2f9c0 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  er);.      if( r
2f9d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
2f9e0 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65  oto commit_phase
2f9f0 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 0a 20 20  _one_exit;.  .  
2fa00 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 6c 6c      /* Write all
2fa10 20 64 69 72 74 79 20 70 61 67 65 73 20 74 6f 20   dirty pages to 
2fa20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2fa30 65 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d  e. */.      rc =
2fa40 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67   pager_write_pag
2fa50 65 6c 69 73 74 28 73 71 6c 69 74 65 33 50 63 61  elist(sqlite3Pca
2fa60 63 68 65 44 69 72 74 79 4c 69 73 74 28 70 50 61  cheDirtyList(pPa
2fa70 67 65 72 2d 3e 70 50 43 61 63 68 65 29 29 3b 0a  ger->pPCache));.
2fa80 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2fa90 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2faa0 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
2fab0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43  QLITE_IOERR_BLOC
2fac0 4b 45 44 20 29 3b 0a 20 20 20 20 20 20 20 20 67  KED );.        g
2fad0 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65  oto commit_phase
2fae0 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 20 20 20  _one_exit;.     
2faf0 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
2fb00 50 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70  PcacheCleanAll(p
2fb10 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
2fb20 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  .  .      /* If 
2fb30 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  the file on disk
2fb40 20 69 73 20 6e 6f 74 20 74 68 65 20 73 61 6d 65   is not the same
2fb50 20 73 69 7a 65 20 61 73 20 74 68 65 20 64 61 74   size as the dat
2fb60 61 62 61 73 65 20 69 6d 61 67 65 2c 0a 20 20 20  abase image,.   
2fb70 20 20 20 2a 2a 20 74 68 65 6e 20 75 73 65 20 70     ** then use p
2fb80 61 67 65 72 5f 74 72 75 6e 63 61 74 65 20 74 6f  ager_truncate to
2fb90 20 67 72 6f 77 20 6f 72 20 73 68 72 69 6e 6b 20   grow or shrink 
2fba0 74 68 65 20 66 69 6c 65 20 68 65 72 65 2e 0a 20  the file here.. 
2fbb0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
2fbc0 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
2fbd0 21 3d 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  !=pPager->dbFile
2fbe0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
2fbf0 50 67 6e 6f 20 6e 4e 65 77 20 3d 20 70 50 61 67  Pgno nNew = pPag
2fc00 65 72 2d 3e 64 62 53 69 7a 65 20 2d 20 28 70 50  er->dbSize - (pP
2fc10 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 50 41  ager->dbSize==PA
2fc20 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
2fc30 65 72 29 29 3b 0a 20 20 20 20 20 20 20 20 61 73  er));.        as
2fc40 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
2fc50 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55  ate>=PAGER_EXCLU
2fc60 53 49 56 45 20 29 3b 0a 20 20 20 20 20 20 20 20  SIVE );.        
2fc70 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63  rc = pager_trunc
2fc80 61 74 65 28 70 50 61 67 65 72 2c 20 6e 4e 65 77  ate(pPager, nNew
2fc90 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
2fca0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
2fcb0 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65  oto commit_phase
2fcc0 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 20 20 20  _one_exit;.     
2fcd0 20 7d 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 46   }.  .      /* F
2fce0 69 6e 61 6c 6c 79 2c 20 73 79 6e 63 20 74 68 65  inally, sync the
2fcf0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
2fd00 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21 70 50  */.      if( !pP
2fd10 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 26 26 20  ager->noSync && 
2fd20 21 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20  !noSync ){.     
2fd30 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
2fd40 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 66 64  sSync(pPager->fd
2fd50 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66  , pPager->sync_f
2fd60 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20  lags);.      }. 
2fd70 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 44       IOTRACE(("D
2fd80 42 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61  BSYNC %p\n", pPa
2fd90 67 65 72 29 29 0a 20 20 20 20 7d 0a 0a 20 20 20  ger)).    }..   
2fda0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
2fdb0 20 50 41 47 45 52 5f 53 59 4e 43 45 44 3b 0a 20   PAGER_SYNCED;. 
2fdc0 20 7d 0a 0a 63 6f 6d 6d 69 74 5f 70 68 61 73 65   }..commit_phase
2fdd0 5f 6f 6e 65 5f 65 78 69 74 3a 0a 20 20 72 65 74  _one_exit:.  ret
2fde0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
2fdf0 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63  * When this func
2fe00 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
2fe10 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2fe20 65 20 68 61 73 20 62 65 65 6e 20 63 6f 6d 70 6c  e has been compl
2fe30 65 74 65 6c 79 0a 2a 2a 20 75 70 64 61 74 65 64  etely.** updated
2fe40 20 74 6f 20 72 65 66 6c 65 63 74 20 74 68 65 20   to reflect the 
2fe50 63 68 61 6e 67 65 73 20 6d 61 64 65 20 62 79 20  changes made by 
2fe60 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e  the current tran
2fe70 73 61 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 73  saction and.** s
2fe80 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 20 54  ynced to disk. T
2fe90 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2fea0 73 74 69 6c 6c 20 65 78 69 73 74 73 20 69 6e 20  still exists in 
2feb0 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  the file-system 
2fec0 0a 2a 2a 20 74 68 6f 75 67 68 2c 20 61 6e 64 20  .** though, and 
2fed0 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f 63 63  if a failure occ
2fee0 75 72 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e  urs at this poin
2fef0 74 20 69 74 20 77 69 6c 6c 20 65 76 65 6e 74 75  t it will eventu
2ff00 61 6c 6c 79 0a 2a 2a 20 62 65 20 75 73 65 64 20  ally.** be used 
2ff10 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  as a hot-journal
2ff20 20 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74   and the current
2ff30 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c   transaction rol
2ff40 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  led back..**.** 
2ff50 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 69  This function fi
2ff60 6e 61 6c 69 7a 65 73 20 74 68 65 20 6a 6f 75 72  nalizes the jour
2ff70 6e 61 6c 20 66 69 6c 65 2c 20 65 69 74 68 65 72  nal file, either
2ff80 20 62 79 20 64 65 6c 65 74 69 6e 67 2c 20 0a 2a   by deleting, .*
2ff90 2a 20 74 72 75 6e 63 61 74 69 6e 67 20 6f 72 20  * truncating or 
2ffa0 70 61 72 74 69 61 6c 6c 79 20 7a 65 72 6f 69 6e  partially zeroin
2ffb0 67 20 69 74 2c 20 73 6f 20 74 68 61 74 20 69 74  g it, so that it
2ffc0 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 20   cannot be used 
2ffd0 0a 2a 2a 20 66 6f 72 20 68 6f 74 2d 6a 6f 75 72  .** for hot-jour
2ffe0 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20 4f 6e  nal rollback. On
2fff0 63 65 20 74 68 69 73 20 69 73 20 64 6f 6e 65 20  ce this is done 
30000 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
30010 69 73 0a 2a 2a 20 69 72 72 65 76 6f 63 61 62 6c  is.** irrevocabl
30020 79 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a  y committed..**.
30030 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
30040 63 63 75 72 73 2c 20 61 6e 20 49 4f 20 65 72 72  ccurs, an IO err
30050 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
30060 6e 65 64 20 61 6e 64 20 74 68 65 20 70 61 67 65  ned and the page
30070 72 0a 2a 2a 20 6d 6f 76 65 73 20 69 6e 74 6f 20  r.** moves into 
30080 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2e  the error state.
30090 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49   Otherwise, SQLI
300a0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
300b0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
300c0 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73  3PagerCommitPhas
300d0 65 54 77 6f 28 50 61 67 65 72 20 2a 70 50 61 67  eTwo(Pager *pPag
300e0 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
300f0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
30100 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
30110 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20  eturn code */.. 
30120 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65   /* This routine
30130 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63   should not be c
30140 61 6c 6c 65 64 20 69 66 20 61 20 70 72 69 6f 72  alled if a prior
30150 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72   error has occur
30160 72 65 64 2e 0a 20 20 2a 2a 20 42 75 74 20 69 66  red..  ** But if
30170 20 28 64 75 65 20 74 6f 20 61 20 63 6f 64 69 6e   (due to a codin
30180 67 20 65 72 72 6f 72 20 65 6c 73 65 77 68 65 72  g error elsewher
30190 65 20 69 6e 20 74 68 65 20 73 79 73 74 65 6d 29  e in the system)
301a0 20 69 74 20 64 6f 65 73 20 67 65 74 0a 20 20 2a   it does get.  *
301b0 2a 20 63 61 6c 6c 65 64 2c 20 6a 75 73 74 20 72  * called, just r
301c0 65 74 75 72 6e 20 74 68 65 20 73 61 6d 65 20 65  eturn the same e
301d0 72 72 6f 72 20 63 6f 64 65 20 77 69 74 68 6f 75  rror code withou
301e0 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67  t doing anything
301f0 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52  . */.  if( NEVER
30200 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65  (pPager->errCode
30210 29 20 29 20 72 65 74 75 72 6e 20 70 50 61 67 65  ) ) return pPage
30220 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20 2f  r->errCode;..  /
30230 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
30240 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 61  should not be ca
30250 6c 6c 65 64 20 69 66 20 74 68 65 20 70 61 67 65  lled if the page
30260 72 20 69 73 20 6e 6f 74 20 69 6e 20 61 74 20 6c  r is not in at l
30270 65 61 73 74 0a 20 20 2a 2a 20 50 41 47 45 52 5f  east.  ** PAGER_
30280 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2e 20  RESERVED state. 
30290 41 6e 64 20 69 6e 64 65 65 64 20 53 51 4c 69 74  And indeed SQLit
302a0 65 20 6e 65 76 65 72 20 64 6f 65 73 20 74 68 69  e never does thi
302b0 73 2e 20 42 75 74 20 69 74 20 69 73 0a 20 20 2a  s. But it is.  *
302c0 2a 20 6e 69 63 65 20 74 6f 20 68 61 76 65 20 74  * nice to have t
302d0 68 69 73 20 64 65 66 65 6e 73 69 76 65 20 74 65  his defensive te
302e0 73 74 20 68 65 72 65 20 61 6e 79 77 61 79 2e 0a  st here anyway..
302f0 20 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52    */.  if( NEVER
30300 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 50  (pPager->state<P
30310 41 47 45 52 5f 52 45 53 45 52 56 45 44 29 20 29  AGER_RESERVED) )
30320 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
30330 52 52 4f 52 3b 0a 0a 20 20 2f 2a 20 41 6e 20 6f  RROR;..  /* An o
30340 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 49 66 20  ptimization. If 
30350 74 68 65 20 64 61 74 61 62 61 73 65 20 77 61 73  the database was
30360 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 6d 6f   not actually mo
30370 64 69 66 69 65 64 20 64 75 72 69 6e 67 0a 20 20  dified during.  
30380 2a 2a 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  ** this transact
30390 69 6f 6e 2c 20 74 68 65 20 70 61 67 65 72 20 69  ion, the pager i
303a0 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63  s running in exc
303b0 6c 75 73 69 76 65 2d 6d 6f 64 65 20 61 6e 64 20  lusive-mode and 
303c0 69 73 0a 20 20 2a 2a 20 75 73 69 6e 67 20 70 65  is.  ** using pe
303d0 72 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c  rsistent journal
303e0 73 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e  s, then this fun
303f0 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
30400 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
30410 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75  start of the jou
30420 72 6e 61 6c 20 66 69 6c 65 20 63 75 72 72 65 6e  rnal file curren
30430 74 6c 79 20 63 6f 6e 74 61 69 6e 73 20 61 20 73  tly contains a s
30440 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 20 0a 20  ingle journal . 
30450 20 2a 2a 20 68 65 61 64 65 72 20 77 69 74 68 20   ** header with 
30460 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 73  the nRec field s
30470 65 74 20 74 6f 20 30 2e 20 49 66 20 73 75 63 68  et to 0. If such
30480 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 75 73   a journal is us
30490 65 64 20 61 73 0a 20 20 2a 2a 20 61 20 68 6f 74  ed as.  ** a hot
304a0 2d 6a 6f 75 72 6e 61 6c 20 64 75 72 69 6e 67 20  -journal during 
304b0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
304c0 62 61 63 6b 2c 20 30 20 63 68 61 6e 67 65 73 20  back, 0 changes 
304d0 77 69 6c 6c 20 62 65 20 6d 61 64 65 0a 20 20 2a  will be made.  *
304e0 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  * to the databas
304f0 65 20 66 69 6c 65 2e 20 53 6f 20 74 68 65 72 65  e file. So there
30500 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 7a   is no need to z
30510 65 72 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ero the journal 
30520 0a 20 20 2a 2a 20 68 65 61 64 65 72 2e 20 53 69  .  ** header. Si
30530 6e 63 65 20 74 68 65 20 70 61 67 65 72 20 69 73  nce the pager is
30540 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
30550 64 65 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20  de, there is no 
30560 6e 65 65 64 0a 20 20 2a 2a 20 74 6f 20 64 72 6f  need.  ** to dro
30570 70 20 61 6e 79 20 6c 6f 63 6b 73 20 65 69 74 68  p any locks eith
30580 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  er..  */.  if( p
30590 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65  Pager->dbModifie
305a0 64 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e  d==0 && pPager->
305b0 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20  exclusiveMode . 
305c0 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75    && pPager->jou
305d0 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
305e0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53  JOURNALMODE_PERS
305f0 49 53 54 0a 20 20 29 7b 0a 20 20 20 20 61 73 73  IST.  ){.    ass
30600 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
30610 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c  rnalOff==JOURNAL
30620 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
30630 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
30640 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
30650 50 41 47 45 52 54 52 41 43 45 28 28 22 43 4f 4d  PAGERTRACE(("COM
30660 4d 49 54 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  MIT %d\n", PAGER
30670 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20  ID(pPager)));.  
30680 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
30690 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 59 4e  state==PAGER_SYN
306a0 43 45 44 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20  CED || MEMDB || 
306b0 21 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66  !pPager->dbModif
306c0 69 65 64 20 29 3b 0a 20 20 72 63 20 3d 20 70 61  ied );.  rc = pa
306d0 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  ger_end_transact
306e0 69 6f 6e 28 70 50 61 67 65 72 2c 20 70 50 61 67  ion(pPager, pPag
306f0 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 3b 0a  er->setMaster);.
30700 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65    return pager_e
30710 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29  rror(pPager, rc)
30720 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62  ;.}../*.** Rollb
30730 61 63 6b 20 61 6c 6c 20 63 68 61 6e 67 65 73 2e  ack all changes.
30740 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66 61   The database fa
30750 6c 6c 73 20 62 61 63 6b 20 74 6f 20 50 41 47 45  lls back to PAGE
30760 52 5f 53 48 41 52 45 44 20 6d 6f 64 65 2e 0a 2a  R_SHARED mode..*
30770 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
30780 6f 6e 20 70 65 72 66 6f 72 6d 73 20 74 77 6f 20  on performs two 
30790 74 61 73 6b 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31  tasks:.**.**   1
307a0 29 20 49 74 20 72 6f 6c 6c 73 20 62 61 63 6b 20  ) It rolls back 
307b0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
307c0 2c 20 72 65 73 74 6f 72 69 6e 67 20 61 6c 6c 20  , restoring all 
307d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
307e0 64 20 0a 2a 2a 20 20 20 20 20 20 69 6e 2d 6d 65  d .**      in-me
307f0 6d 6f 72 79 20 63 61 63 68 65 20 70 61 67 65 73  mory cache pages
30800 20 74 6f 20 74 68 65 20 73 74 61 74 65 20 74 68   to the state th
30810 65 79 20 77 65 72 65 20 69 6e 20 77 68 65 6e 20  ey were in when 
30820 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  the transaction.
30830 2a 2a 20 20 20 20 20 20 77 61 73 20 6f 70 65 6e  **      was open
30840 65 64 2c 20 61 6e 64 0a 2a 2a 20 20 20 32 29 20  ed, and.**   2) 
30850 49 74 20 66 69 6e 61 6c 69 7a 65 73 20 74 68 65  It finalizes the
30860 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 73   journal file, s
30870 6f 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74  o that it is not
30880 20 75 73 65 64 20 66 6f 72 20 68 6f 74 0a 2a 2a   used for hot.**
30890 20 20 20 20 20 20 72 6f 6c 6c 62 61 63 6b 20 61        rollback a
308a0 74 20 61 6e 79 20 70 6f 69 6e 74 20 69 6e 20 74  t any point in t
308b0 68 65 20 66 75 74 75 72 65 2e 0a 2a 2a 0a 2a 2a  he future..**.**
308c0 20 73 75 62 6a 65 63 74 20 74 6f 20 74 68 65 20   subject to the 
308d0 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 61 6c 69 66  following qualif
308e0 69 63 61 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20  ications:.**.** 
308f0 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
30900 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 79 65 74   file is not yet
30910 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20   open when this 
30920 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
30930 65 64 2c 0a 2a 2a 20 20 20 74 68 65 6e 20 6f 6e  ed,.**   then on
30940 6c 79 20 28 32 29 20 69 73 20 70 65 72 66 6f 72  ly (2) is perfor
30950 6d 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73  med. In this cas
30960 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6a 6f  e there is no jo
30970 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20  urnal file.**   
30980 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 2e 0a 2a 2a  to roll back..**
30990 0a 2a 2a 20 2a 20 49 66 20 69 6e 20 61 6e 20 65  .** * If in an e
309a0 72 72 6f 72 20 73 74 61 74 65 20 6f 74 68 65 72  rror state other
309b0 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 46 55 4c   than SQLITE_FUL
309c0 4c 2c 20 74 68 65 6e 20 74 61 73 6b 20 28 31 29  L, then task (1)
309d0 20 69 73 20 0a 2a 2a 20 20 20 70 65 72 66 6f 72   is .**   perfor
309e0 6d 65 64 2e 20 49 66 20 73 75 63 63 65 73 73 66  med. If successf
309f0 75 6c 2c 20 74 61 73 6b 20 28 32 29 2e 20 52 65  ul, task (2). Re
30a00 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20  gardless of the 
30a10 6f 75 74 63 6f 6d 65 0a 2a 2a 20 20 20 6f 66 20  outcome.**   of 
30a20 65 69 74 68 65 72 2c 20 74 68 65 20 65 72 72 6f  either, the erro
30a30 72 20 73 74 61 74 65 20 65 72 72 6f 72 20 63 6f  r state error co
30a40 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 74  de is returned t
30a50 6f 20 74 68 65 20 63 61 6c 6c 65 72 0a 2a 2a 20  o the caller.** 
30a60 20 20 28 69 2e 65 2e 20 65 69 74 68 65 72 20 53    (i.e. either S
30a70 51 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72 20 53  QLITE_IOERR or S
30a80 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 29 2e 0a  QLITE_CORRUPT)..
30a90 2a 2a 0a 2a 2a 20 2a 20 49 66 20 74 68 65 20 70  **.** * If the p
30aa0 61 67 65 72 20 69 73 20 69 6e 20 50 41 47 45 52  ager is in PAGER
30ab0 5f 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2c  _RESERVED state,
30ac0 20 74 68 65 6e 20 61 74 74 65 6d 70 74 20 28 31   then attempt (1
30ad0 29 2e 20 57 68 65 74 68 65 72 0a 2a 2a 20 20 20  ). Whether.**   
30ae0 6f 72 20 6e 6f 74 20 28 31 29 20 69 73 20 73 75  or not (1) is su
30af0 63 63 75 73 73 66 75 6c 2c 20 61 6c 73 6f 20 61  ccussful, also a
30b00 74 74 65 6d 70 74 20 28 32 29 2e 20 49 66 20 73  ttempt (2). If s
30b10 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72  uccessful, retur
30b20 6e 0a 2a 2a 20 20 20 53 51 4c 49 54 45 5f 4f 4b  n.**   SQLITE_OK
30b30 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 65 6e 74  . Otherwise, ent
30b40 65 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  er the error sta
30b50 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  te and return th
30b60 65 20 66 69 72 73 74 20 0a 2a 2a 20 20 20 65 72  e first .**   er
30b70 72 6f 72 20 63 6f 64 65 20 65 6e 63 6f 75 6e 74  ror code encount
30b80 65 72 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 49  ered. .**.**   I
30b90 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 72  n this case ther
30ba0 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20 74  e is no chance t
30bb0 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65  hat the database
30bc0 20 77 61 73 20 77 72 69 74 74 65 6e 20 74 6f 2e   was written to.
30bd0 20 0a 2a 2a 20 20 20 53 6f 20 69 73 20 73 61 66   .**   So is saf
30be0 65 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68  e to finalize th
30bf0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  e journal file e
30c00 76 65 6e 20 69 66 20 74 68 65 20 70 6c 61 79 62  ven if the playb
30c10 61 63 6b 20 0a 2a 2a 20 20 20 28 6f 70 65 72 61  ack .**   (opera
30c20 74 69 6f 6e 20 31 29 20 66 61 69 6c 65 64 2e 20  tion 1) failed. 
30c30 48 6f 77 65 76 65 72 20 74 68 65 20 70 61 67 65  However the page
30c40 72 20 6d 75 73 74 20 65 6e 74 65 72 20 74 68 65  r must enter the
30c50 20 65 72 72 6f 72 20 73 74 61 74 65 0a 2a 2a 20   error state.** 
30c60 20 20 61 73 20 74 68 65 20 63 6f 6e 74 65 6e 74    as the content
30c70 73 20 6f 66 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  s of the in-memo
30c80 72 79 20 63 61 63 68 65 20 61 72 65 20 6e 6f 77  ry cache are now
30c90 20 73 75 73 70 65 63 74 2e 0a 2a 2a 0a 2a 2a 20   suspect..**.** 
30ca0 2a 20 46 69 6e 61 6c 6c 79 2c 20 69 66 20 69 6e  * Finally, if in
30cb0 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45   PAGER_EXCLUSIVE
30cc0 20 73 74 61 74 65 2c 20 74 68 65 6e 20 61 74 74   state, then att
30cd0 65 6d 70 74 20 28 31 29 2e 20 4f 6e 6c 79 0a 2a  empt (1). Only.*
30ce0 2a 20 20 20 61 74 74 65 6d 70 74 20 28 32 29 20  *   attempt (2) 
30cf0 69 66 20 28 31 29 20 69 73 20 73 75 63 63 65 73  if (1) is succes
30d00 73 66 75 6c 2e 20 52 65 74 75 72 6e 20 53 51 4c  sful. Return SQL
30d10 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73  ITE_OK if succes
30d20 73 66 75 6c 2c 0a 2a 2a 20 20 20 6f 74 68 65 72  sful,.**   other
30d30 77 69 73 65 20 65 6e 74 65 72 20 74 68 65 20 65  wise enter the e
30d40 72 72 6f 72 20 73 74 61 74 65 20 61 6e 64 20 72  rror state and r
30d50 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20  eturn the error 
30d60 63 6f 64 65 20 66 72 6f 6d 20 74 68 65 20 0a 2a  code from the .*
30d70 2a 20 20 20 66 61 69 6c 69 6e 67 20 6f 70 65 72  *   failing oper
30d80 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 49  ation..**.**   I
30d90 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
30da0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6d 61  database file ma
30db0 79 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74  y have been writ
30dc0 74 65 6e 20 74 6f 2e 20 53 6f 20 69 66 20 74 68  ten to. So if th
30dd0 65 0a 2a 2a 20 20 20 70 6c 61 79 62 61 63 6b 20  e.**   playback 
30de0 6f 70 65 72 61 74 69 6f 6e 20 64 69 64 20 6e 6f  operation did no
30df0 74 20 73 75 63 63 65 65 64 20 69 74 20 77 6f 75  t succeed it wou
30e00 6c 64 20 6e 6f 74 20 62 65 20 73 61 66 65 20 74  ld not be safe t
30e10 6f 20 66 69 6e 61 6c 69 7a 65 0a 2a 2a 20 20 20  o finalize.**   
30e20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
30e30 2e 20 49 74 20 6e 65 65 64 73 20 74 6f 20 62 65  . It needs to be
30e40 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c   left in the fil
30e50 65 2d 73 79 73 74 65 6d 20 73 6f 20 74 68 61 74  e-system so that
30e60 0a 2a 2a 20 20 20 73 6f 6d 65 20 6f 74 68 65 72  .**   some other
30e70 20 70 72 6f 63 65 73 73 20 63 61 6e 20 75 73 65   process can use
30e80 20 69 74 20 74 6f 20 72 65 73 74 6f 72 65 20 74   it to restore t
30e90 68 65 20 64 61 74 61 62 61 73 65 20 73 74 61 74  he database stat
30ea0 65 20 28 62 79 0a 2a 2a 20 20 20 68 6f 74 2d 6a  e (by.**   hot-j
30eb0 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29  ournal rollback)
30ec0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
30ed0 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 50 61  PagerRollback(Pa
30ee0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
30ef0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
30f00 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
30f10 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
30f20 6f 64 65 20 2a 2f 0a 20 20 50 41 47 45 52 54 52  ode */.  PAGERTR
30f30 41 43 45 28 28 22 52 4f 4c 4c 42 41 43 4b 20 25  ACE(("ROLLBACK %
30f40 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
30f50 61 67 65 72 29 29 29 3b 0a 20 20 69 66 28 20 70  ager)));.  if( p
30f60 61 67 65 72 55 73 65 4c 6f 67 28 70 50 61 67 65  agerUseLog(pPage
30f70 72 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  r) ){.    int rc
30f80 32 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  2;.    rc = sqli
30f90 74 65 33 50 61 67 65 72 53 61 76 65 70 6f 69 6e  te3PagerSavepoin
30fa0 74 28 70 50 61 67 65 72 2c 20 53 41 56 45 50 4f  t(pPager, SAVEPO
30fb0 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 2d 31  INT_ROLLBACK, -1
30fc0 29 3b 0a 20 20 20 20 72 63 32 20 3d 20 70 61 67  );.    rc2 = pag
30fd0 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  er_end_transacti
30fe0 6f 6e 28 70 50 61 67 65 72 2c 20 70 50 61 67 65  on(pPager, pPage
30ff0 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 3b 0a 20  r->setMaster);. 
31000 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
31010 45 5f 4f 4b 20 29 20 72 63 20 3d 20 72 63 32 3b  E_OK ) rc = rc2;
31020 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 50  .  }else if( !pP
31030 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64  ager->dbModified
31040 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70 50 61 67   || !isOpen(pPag
31050 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20  er->jfd) ){.    
31060 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74  rc = pager_end_t
31070 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
31080 72 2c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  r, pPager->setMa
31090 73 74 65 72 29 3b 0a 20 20 7d 65 6c 73 65 20 69  ster);.  }else i
310a0 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
310b0 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72  de && pPager->er
310c0 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46 55  rCode!=SQLITE_FU
310d0 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  LL ){.    if( pP
310e0 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
310f0 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 7b 0a  ER_EXCLUSIVE ){.
31100 20 20 20 20 20 20 70 61 67 65 72 5f 70 6c 61 79        pager_play
31110 62 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b  back(pPager, 0);
31120 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
31130 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
31140 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
31150 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
31160 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
31170 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 32  ){.      int rc2
31180 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  ;.      rc = pag
31190 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67  er_playback(pPag
311a0 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 63  er, 0);.      rc
311b0 32 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72  2 = pager_end_tr
311c0 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
311d0 2c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73  , pPager->setMas
311e0 74 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ter);.      if( 
311f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
31200 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 63  .        rc = rc
31210 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  2;.      }.    }
31220 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
31230 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
31240 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20  pPager, 0);.    
31250 7d 0a 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44  }..    if( !MEMD
31260 42 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  B ){.      pPage
31270 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3d  r->dbSizeValid =
31280 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   0;.    }..    /
31290 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
312a0 63 75 72 73 20 64 75 72 69 6e 67 20 61 20 52 4f  curs during a RO
312b0 4c 4c 42 41 43 4b 2c 20 77 65 20 63 61 6e 20 6e  LLBACK, we can n
312c0 6f 20 6c 6f 6e 67 65 72 20 74 72 75 73 74 20 74  o longer trust t
312d0 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a 2a 20  he pager.    ** 
312e0 63 61 63 68 65 2e 20 53 6f 20 63 61 6c 6c 20 70  cache. So call p
312f0 61 67 65 72 5f 65 72 72 6f 72 28 29 20 6f 6e 20  ager_error() on 
31300 74 68 65 20 77 61 79 20 6f 75 74 20 74 6f 20 6d  the way out to m
31310 61 6b 65 20 61 6e 79 20 65 72 72 6f 72 20 0a 20  ake any error . 
31320 20 20 20 2a 2a 20 70 65 72 73 69 73 74 65 6e 74     ** persistent
31330 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
31340 3d 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50  = pager_error(pP
31350 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 7d 0a 20  ager, rc);.  }. 
31360 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
31370 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
31380 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
31390 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20   file is opened 
313a0 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 52 65 74 75  read-only.  Retu
313b0 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20 74  rn FALSE.** if t
313c0 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 28  he database is (
313d0 69 6e 20 74 68 65 6f 72 79 29 20 77 72 69 74 61  in theory) writa
313e0 62 6c 65 2e 0a 2a 2f 0a 75 38 20 73 71 6c 69 74  ble..*/.u8 sqlit
313f0 65 33 50 61 67 65 72 49 73 72 65 61 64 6f 6e 6c  e3PagerIsreadonl
31400 79 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  y(Pager *pPager)
31410 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
31420 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a  r->readOnly;.}..
31430 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
31440 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72   number of refer
31450 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67  ences to the pag
31460 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
31470 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28  e3PagerRefcount(
31480 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
31490 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
314a0 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70  PcacheRefCount(p
314b0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
314c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
314d0 20 74 68 65 20 61 70 70 72 6f 78 69 6d 61 74 65   the approximate
314e0 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
314f0 20 6f 66 20 6d 65 6d 6f 72 79 20 63 75 72 72 65   of memory curre
31500 6e 74 6c 79 0a 2a 2a 20 75 73 65 64 20 62 79 20  ntly.** used by 
31510 74 68 65 20 70 61 67 65 72 20 61 6e 64 20 69 74  the pager and it
31520 73 20 61 73 73 6f 63 69 61 74 65 64 20 63 61 63  s associated cac
31530 68 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  he..*/.int sqlit
31540 65 33 50 61 67 65 72 4d 65 6d 55 73 65 64 28 50  e3PagerMemUsed(P
31550 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
31560 20 69 6e 74 20 70 65 72 50 61 67 65 53 69 7a 65   int perPageSize
31570 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   = pPager->pageS
31580 69 7a 65 20 2b 20 70 50 61 67 65 72 2d 3e 6e 45  ize + pPager->nE
31590 78 74 72 61 20 2b 20 32 30 3b 0a 20 20 72 65 74  xtra + 20;.  ret
315a0 75 72 6e 20 70 65 72 50 61 67 65 53 69 7a 65 2a  urn perPageSize*
315b0 73 71 6c 69 74 65 33 50 63 61 63 68 65 50 61 67  sqlite3PcachePag
315c0 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70  ecount(pPager->p
315d0 50 43 61 63 68 65 29 0a 20 20 20 20 20 20 20 20  PCache).        
315e0 20 20 20 2b 20 73 71 6c 69 74 65 33 4d 61 6c 6c     + sqlite3Mall
315f0 6f 63 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a  ocSize(pPager);.
31600 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
31610 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
31620 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
31630 73 70 65 63 69 66 69 65 64 20 70 61 67 65 2e 0a  specified page..
31640 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
31650 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28  gerPageRefcount(
31660 44 62 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  DbPage *pPage){.
31670 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
31680 50 63 61 63 68 65 50 61 67 65 52 65 66 63 6f 75  PcachePageRefcou
31690 6e 74 28 70 50 61 67 65 29 3b 0a 7d 0a 0a 23 69  nt(pPage);.}..#i
316a0 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
316b0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
316c0 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20  ine is used for 
316d0 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c  testing and anal
316e0 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e  ysis only..*/.in
316f0 74 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 53  t *sqlite3PagerS
31700 74 61 74 73 28 50 61 67 65 72 20 2a 70 50 61 67  tats(Pager *pPag
31710 65 72 29 7b 0a 20 20 73 74 61 74 69 63 20 69 6e  er){.  static in
31720 74 20 61 5b 31 31 5d 3b 0a 20 20 61 5b 30 5d 20  t a[11];.  a[0] 
31730 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  = sqlite3PcacheR
31740 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
31750 70 50 43 61 63 68 65 29 3b 0a 20 20 61 5b 31 5d  pPCache);.  a[1]
31760 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
31770 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
31780 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 61 5b  ->pPCache);.  a[
31790 32 5d 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  2] = sqlite3Pcac
317a0 68 65 47 65 74 43 61 63 68 65 73 69 7a 65 28 70  heGetCachesize(p
317b0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
317c0 0a 20 20 61 5b 33 5d 20 3d 20 70 50 61 67 65 72  .  a[3] = pPager
317d0 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3f 20  ->dbSizeValid ? 
317e0 28 69 6e 74 29 20 70 50 61 67 65 72 2d 3e 64 62  (int) pPager->db
317f0 53 69 7a 65 20 3a 20 2d 31 3b 0a 20 20 61 5b 34  Size : -1;.  a[4
31800 5d 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 61 74  ] = pPager->stat
31810 65 3b 0a 20 20 61 5b 35 5d 20 3d 20 70 50 61 67  e;.  a[5] = pPag
31820 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 61  er->errCode;.  a
31830 5b 36 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 48  [6] = pPager->nH
31840 69 74 3b 0a 20 20 61 5b 37 5d 20 3d 20 70 50 61  it;.  a[7] = pPa
31850 67 65 72 2d 3e 6e 4d 69 73 73 3b 0a 20 20 61 5b  ger->nMiss;.  a[
31860 38 5d 20 3d 20 30 3b 20 20 2f 2a 20 55 73 65 64  8] = 0;  /* Used
31870 20 74 6f 20 62 65 20 70 50 61 67 65 72 2d 3e 6e   to be pPager->n
31880 4f 76 66 6c 20 2a 2f 0a 20 20 61 5b 39 5d 20 3d  Ovfl */.  a[9] =
31890 20 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 3b 0a   pPager->nRead;.
318a0 20 20 61 5b 31 30 5d 20 3d 20 70 50 61 67 65 72    a[10] = pPager
318b0 2d 3e 6e 57 72 69 74 65 3b 0a 20 20 72 65 74 75  ->nWrite;.  retu
318c0 72 6e 20 61 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn a;.}.#endif..
318d0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
318e0 65 20 69 66 20 74 68 69 73 20 69 73 20 61 6e 20  e if this is an 
318f0 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 2e  in-memory pager.
31900 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
31910 61 67 65 72 49 73 4d 65 6d 64 62 28 50 61 67 65  agerIsMemdb(Page
31920 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
31930 74 75 72 6e 20 4d 45 4d 44 42 3b 0a 7d 0a 0a 2f  turn MEMDB;.}../
31940 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68 61 74 20  *.** Check that 
31950 74 68 65 72 65 20 61 72 65 20 61 74 20 6c 65 61  there are at lea
31960 73 74 20 6e 53 61 76 65 70 6f 69 6e 74 20 73 61  st nSavepoint sa
31970 76 65 70 6f 69 6e 74 73 20 6f 70 65 6e 2e 20 49  vepoints open. I
31980 66 20 74 68 65 72 65 20 61 72 65 0a 2a 2a 20 63  f there are.** c
31990 75 72 72 65 6e 74 6c 79 20 6c 65 73 73 20 74 68  urrently less th
319a0 61 6e 20 6e 53 61 76 65 70 6f 69 6e 74 73 20 6f  an nSavepoints o
319b0 70 65 6e 2c 20 74 68 65 6e 20 6f 70 65 6e 20 6f  pen, then open o
319c0 6e 65 20 6f 72 20 6d 6f 72 65 20 73 61 76 65 70  ne or more savep
319d0 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20 6d 61 6b 65  oints.** to make
319e0 20 75 70 20 74 68 65 20 64 69 66 66 65 72 65 6e   up the differen
319f0 63 65 2e 20 49 66 20 74 68 65 20 6e 75 6d 62 65  ce. If the numbe
31a00 72 20 6f 66 20 73 61 76 65 70 6f 69 6e 74 73 20  r of savepoints 
31a10 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 65 71  is already.** eq
31a20 75 61 6c 20 74 6f 20 6e 53 61 76 65 70 6f 69 6e  ual to nSavepoin
31a30 74 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e  t, then this fun
31a40 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
31a50 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d  ..**.** If a mem
31a60 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66  ory allocation f
31a70 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d  ails, SQLITE_NOM
31a80 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  EM is returned. 
31a90 49 66 20 61 6e 20 65 72 72 6f 72 20 0a 2a 2a 20  If an error .** 
31aa0 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6f 70 65  occurs while ope
31ab0 6e 69 6e 67 20 74 68 65 20 73 75 62 2d 6a 6f 75  ning the sub-jou
31ac0 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20  rnal file, then 
31ad0 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  an IO error code
31ae0 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e   is.** returned.
31af0 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49   Otherwise, SQLI
31b00 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71  TE_OK..*/.int sq
31b10 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 53 61  lite3PagerOpenSa
31b20 76 65 70 6f 69 6e 74 28 50 61 67 65 72 20 2a 70  vepoint(Pager *p
31b30 50 61 67 65 72 2c 20 69 6e 74 20 6e 53 61 76 65  Pager, int nSave
31b40 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63  point){.  int rc
31b50 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
31b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31b70 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
31b80 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 75 72  de */.  int nCur
31b90 72 65 6e 74 20 3d 20 70 50 61 67 65 72 2d 3e 6e  rent = pPager->n
31ba0 53 61 76 65 70 6f 69 6e 74 3b 20 20 20 20 20 20  Savepoint;      
31bb0 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6e 75 6d    /* Current num
31bc0 62 65 72 20 6f 66 20 73 61 76 65 70 6f 69 6e 74  ber of savepoint
31bd0 73 20 2a 2f 0a 0a 20 20 69 66 28 20 6e 53 61 76  s */..  if( nSav
31be0 65 70 6f 69 6e 74 3e 6e 43 75 72 72 65 6e 74 20  epoint>nCurrent 
31bf0 26 26 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  && pPager->useJo
31c00 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74  urnal ){.    int
31c10 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20   ii;            
31c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31c30 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
31c40 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20   variable */.   
31c50 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
31c60 2a 61 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20  *aNew;          
31c70 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20           /* New 
31c80 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74  Pager.aSavepoint
31c90 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 69 6e   array */.    in
31ca0 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20  t nPage;        
31cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31cc0 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
31cd0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
31ce0 2f 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  /..    rc = sqli
31cf0 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
31d00 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65  t(pPager, &nPage
31d10 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
31d20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20  return rc;..    
31d30 2f 2a 20 47 72 6f 77 20 74 68 65 20 50 61 67 65  /* Grow the Page
31d40 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 61 72 72  r.aSavepoint arr
31d50 61 79 20 75 73 69 6e 67 20 72 65 61 6c 6c 6f 63  ay using realloc
31d60 28 29 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54  (). Return SQLIT
31d70 45 5f 4e 4f 4d 45 4d 0a 20 20 20 20 2a 2a 20 69  E_NOMEM.    ** i
31d80 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e  f the allocation
31d90 20 66 61 69 6c 73 2e 20 4f 74 68 65 72 77 69 73   fails. Otherwis
31da0 65 2c 20 7a 65 72 6f 20 74 68 65 20 6e 65 77 20  e, zero the new 
31db0 70 6f 72 74 69 6f 6e 20 69 6e 20 63 61 73 65 20  portion in case 
31dc0 61 20 0a 20 20 20 20 2a 2a 20 6d 61 6c 6c 6f 63  a .    ** malloc
31dd0 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20   failure occurs 
31de0 77 68 69 6c 65 20 70 6f 70 75 6c 61 74 69 6e 67  while populating
31df0 20 69 74 20 69 6e 20 74 68 65 20 66 6f 72 28 2e   it in the for(.
31e00 2e 2e 29 20 6c 6f 6f 70 20 62 65 6c 6f 77 2e 0a  ..) loop below..
31e10 20 20 20 20 2a 2f 0a 20 20 20 20 61 4e 65 77 20      */.    aNew 
31e20 3d 20 28 50 61 67 65 72 53 61 76 65 70 6f 69 6e  = (PagerSavepoin
31e30 74 20 2a 29 73 71 6c 69 74 65 33 52 65 61 6c 6c  t *)sqlite3Reall
31e40 6f 63 28 0a 20 20 20 20 20 20 20 20 70 50 61 67  oc(.        pPag
31e50 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 2c 20  er->aSavepoint, 
31e60 73 69 7a 65 6f 66 28 50 61 67 65 72 53 61 76 65  sizeof(PagerSave
31e70 70 6f 69 6e 74 29 2a 6e 53 61 76 65 70 6f 69 6e  point)*nSavepoin
31e80 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  t.    );.    if(
31e90 20 21 61 4e 65 77 20 29 7b 0a 20 20 20 20 20 20   !aNew ){.      
31ea0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
31eb0 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d  MEM;.    }.    m
31ec0 65 6d 73 65 74 28 26 61 4e 65 77 5b 6e 43 75 72  emset(&aNew[nCur
31ed0 72 65 6e 74 5d 2c 20 30 2c 20 28 6e 53 61 76 65  rent], 0, (nSave
31ee0 70 6f 69 6e 74 2d 6e 43 75 72 72 65 6e 74 29 20  point-nCurrent) 
31ef0 2a 20 73 69 7a 65 6f 66 28 50 61 67 65 72 53 61  * sizeof(PagerSa
31f00 76 65 70 6f 69 6e 74 29 29 3b 0a 20 20 20 20 70  vepoint));.    p
31f10 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
31f20 74 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 70 50  t = aNew;.    pP
31f30 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
31f40 20 3d 20 6e 53 61 76 65 70 6f 69 6e 74 3b 0a 0a   = nSavepoint;..
31f50 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20      /* Populate 
31f60 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69  the PagerSavepoi
31f70 6e 74 20 73 74 72 75 63 74 75 72 65 73 20 6a 75  nt structures ju
31f80 73 74 20 61 6c 6c 6f 63 61 74 65 64 2e 20 2a 2f  st allocated. */
31f90 0a 20 20 20 20 66 6f 72 28 69 69 3d 6e 43 75 72  .    for(ii=nCur
31fa0 72 65 6e 74 3b 20 69 69 3c 6e 53 61 76 65 70 6f  rent; ii<nSavepo
31fb0 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  int; ii++){.    
31fc0 20 20 61 4e 65 77 5b 69 69 5d 2e 6e 4f 72 69 67    aNew[ii].nOrig
31fd0 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20   = nPage;.      
31fe0 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
31ff0 72 2d 3e 6a 66 64 29 20 26 26 20 70 50 61 67 65  r->jfd) && pPage
32000 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 20  r->journalOff>0 
32010 29 7b 0a 20 20 20 20 20 20 20 20 61 4e 65 77 5b  ){.        aNew[
32020 69 69 5d 2e 69 4f 66 66 73 65 74 20 3d 20 70 50  ii].iOffset = pP
32030 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
32040 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
32050 20 20 20 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e         aNew[ii].
32060 69 4f 66 66 73 65 74 20 3d 20 4a 4f 55 52 4e 41  iOffset = JOURNA
32070 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
32080 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
32090 61 4e 65 77 5b 69 69 5d 2e 69 53 75 62 52 65 63  aNew[ii].iSubRec
320a0 20 3d 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52   = pPager->nSubR
320b0 65 63 3b 0a 20 20 20 20 20 20 61 4e 65 77 5b 69  ec;.      aNew[i
320c0 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20  i].pInSavepoint 
320d0 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43  = sqlite3BitvecC
320e0 72 65 61 74 65 28 6e 50 61 67 65 29 3b 0a 20 20  reate(nPage);.  
320f0 20 20 20 20 69 66 28 20 21 61 4e 65 77 5b 69 69      if( !aNew[ii
32100 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 29  ].pInSavepoint )
32110 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
32120 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
32130 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
32140 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 73 75    /* Open the su
32150 62 2d 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74  b-journal, if it
32160 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
32170 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20 20 20 20 72  opened. */.    r
32180 63 20 3d 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e  c = openSubJourn
32190 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  al(pPager);.    
321a0 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f  assertTruncateCo
321b0 6e 73 74 72 61 69 6e 74 28 70 50 61 67 65 72 29  nstraint(pPager)
321c0 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
321d0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
321e0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
321f0 6c 6c 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  lled to rollback
32200 20 6f 72 20 72 65 6c 65 61 73 65 20 28 63 6f 6d   or release (com
32210 6d 69 74 29 20 61 20 73 61 76 65 70 6f 69 6e 74  mit) a savepoint
32220 2e 0a 2a 2a 20 54 68 65 20 73 61 76 65 70 6f 69  ..** The savepoi
32230 6e 74 20 74 6f 20 72 65 6c 65 61 73 65 20 6f 72  nt to release or
32240 20 72 6f 6c 6c 62 61 63 6b 20 6e 65 65 64 20 6e   rollback need n
32250 6f 74 20 62 65 20 74 68 65 20 6d 6f 73 74 20 72  ot be the most r
32260 65 63 65 6e 74 6c 79 20 0a 2a 2a 20 63 72 65 61  ecently .** crea
32270 74 65 64 20 73 61 76 65 70 6f 69 6e 74 2e 0a 2a  ted savepoint..*
32280 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 6f  *.** Parameter o
32290 70 20 69 73 20 61 6c 77 61 79 73 20 65 69 74 68  p is always eith
322a0 65 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  er SAVEPOINT_ROL
322b0 4c 42 41 43 4b 20 6f 72 20 53 41 56 45 50 4f 49  LBACK or SAVEPOI
322c0 4e 54 5f 52 45 4c 45 41 53 45 2e 0a 2a 2a 20 49  NT_RELEASE..** I
322d0 66 20 69 74 20 69 73 20 53 41 56 45 50 4f 49 4e  f it is SAVEPOIN
322e0 54 5f 52 45 4c 45 41 53 45 2c 20 74 68 65 6e 20  T_RELEASE, then 
322f0 72 65 6c 65 61 73 65 20 61 6e 64 20 64 65 73 74  release and dest
32300 72 6f 79 20 74 68 65 20 73 61 76 65 70 6f 69 6e  roy the savepoin
32310 74 20 77 69 74 68 0a 2a 2a 20 69 6e 64 65 78 20  t with.** index 
32320 69 53 61 76 65 70 6f 69 6e 74 2e 20 49 66 20 69  iSavepoint. If i
32330 74 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52  t is SAVEPOINT_R
32340 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 72 6f  OLLBACK, then ro
32350 6c 6c 62 61 63 6b 20 61 6c 6c 20 63 68 61 6e 67  llback all chang
32360 65 73 0a 2a 2a 20 74 68 61 74 20 68 61 76 65 20  es.** that have 
32370 6f 63 63 75 72 72 65 64 20 73 69 6e 63 65 20 74  occurred since t
32380 68 65 20 73 70 65 63 69 66 69 65 64 20 73 61 76  he specified sav
32390 65 70 6f 69 6e 74 20 77 61 73 20 63 72 65 61 74  epoint was creat
323a0 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61  ed..**.** The sa
323b0 76 65 70 6f 69 6e 74 20 74 6f 20 72 6f 6c 6c 62  vepoint to rollb
323c0 61 63 6b 20 6f 72 20 72 65 6c 65 61 73 65 20 69  ack or release i
323d0 73 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  s identified by 
323e0 70 61 72 61 6d 65 74 65 72 20 0a 2a 2a 20 69 53  parameter .** iS
323f0 61 76 65 70 6f 69 6e 74 2e 20 41 20 76 61 6c 75  avepoint. A valu
32400 65 20 6f 66 20 30 20 6d 65 61 6e 73 20 74 6f 20  e of 0 means to 
32410 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 6f  operate on the o
32420 75 74 65 72 6d 6f 73 74 20 73 61 76 65 70 6f 69  utermost savepoi
32430 6e 74 0a 2a 2a 20 28 74 68 65 20 66 69 72 73 74  nt.** (the first
32440 20 63 72 65 61 74 65 64 29 2e 20 41 20 76 61 6c   created). A val
32450 75 65 20 6f 66 20 28 50 61 67 65 72 2e 6e 53 61  ue of (Pager.nSa
32460 76 65 70 6f 69 6e 74 2d 31 29 20 6d 65 61 6e 73  vepoint-1) means
32470 20 6f 70 65 72 61 74 65 0a 2a 2a 20 6f 6e 20 74   operate.** on t
32480 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
32490 20 63 72 65 61 74 65 64 20 73 61 76 65 70 6f 69   created savepoi
324a0 6e 74 2e 20 49 66 20 69 53 61 76 65 70 6f 69 6e  nt. If iSavepoin
324b0 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  t is greater tha
324c0 6e 0a 2a 2a 20 28 50 61 67 65 72 2e 6e 53 61 76  n.** (Pager.nSav
324d0 65 70 6f 69 6e 74 2d 31 29 2c 20 74 68 65 6e 20  epoint-1), then 
324e0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
324f0 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
32500 49 66 20 61 20 6e 65 67 61 74 69 76 65 20 76 61  If a negative va
32510 6c 75 65 20 69 73 20 70 61 73 73 65 64 20 74 6f  lue is passed to
32520 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20   this function, 
32530 74 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74  then the current
32540 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
32550 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  is rolled back. 
32560 54 68 69 73 20 69 73 20 64 69 66 66 65 72 65 6e  This is differen
32570 74 20 74 6f 20 63 61 6c 6c 69 6e 67 20 0a 2a 2a  t to calling .**
32580 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c   sqlite3PagerRol
32590 6c 62 61 63 6b 28 29 20 62 65 63 61 75 73 65 20  lback() because 
325a0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f  this function do
325b0 65 73 20 6e 6f 74 20 74 65 72 6d 69 6e 61 74 65  es not terminate
325c0 0a 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74  .** the transact
325d0 69 6f 6e 20 6f 72 20 75 6e 6c 6f 63 6b 20 74 68  ion or unlock th
325e0 65 20 64 61 74 61 62 61 73 65 2c 20 69 74 20 6a  e database, it j
325f0 75 73 74 20 72 65 73 74 6f 72 65 73 20 74 68 65  ust restores the
32600 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66   .** contents of
32610 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f   the database to
32620 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74   its original st
32630 61 74 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 6e 20 61  ate. .**.** In a
32640 6e 79 20 63 61 73 65 2c 20 61 6c 6c 20 73 61 76  ny case, all sav
32650 65 70 6f 69 6e 74 73 20 77 69 74 68 20 61 6e 20  epoints with an 
32660 69 6e 64 65 78 20 67 72 65 61 74 65 72 20 74 68  index greater th
32670 61 6e 20 69 53 61 76 65 70 6f 69 6e 74 20 0a 2a  an iSavepoint .*
32680 2a 20 61 72 65 20 64 65 73 74 72 6f 79 65 64 2e  * are destroyed.
32690 20 49 66 20 74 68 69 73 20 69 73 20 61 20 72 65   If this is a re
326a0 6c 65 61 73 65 20 6f 70 65 72 61 74 69 6f 6e 20  lease operation 
326b0 28 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52  (op==SAVEPOINT_R
326c0 45 4c 45 41 53 45 29 2c 0a 2a 2a 20 74 68 65 6e  ELEASE),.** then
326d0 20 73 61 76 65 70 6f 69 6e 74 20 69 53 61 76 65   savepoint iSave
326e0 70 6f 69 6e 74 20 69 73 20 61 6c 73 6f 20 64 65  point is also de
326f0 73 74 72 6f 79 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  stroyed..**.** T
32700 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79  his function may
32710 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
32720 4f 4d 45 4d 20 69 66 20 61 20 6d 65 6d 6f 72 79  OMEM if a memory
32730 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c   allocation fail
32740 73 2c 0a 2a 2a 20 6f 72 20 61 6e 20 49 4f 20 65  s,.** or an IO e
32750 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 20  rror code if an 
32760 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  IO error occurs 
32770 77 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 20 62 61  while rolling ba
32780 63 6b 20 61 20 0a 2a 2a 20 73 61 76 65 70 6f 69  ck a .** savepoi
32790 6e 74 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72 73  nt. If no errors
327a0 20 6f 63 63 75 72 2c 20 53 51 4c 49 54 45 5f 4f   occur, SQLITE_O
327b0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  K is returned..*
327c0 2f 20 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  / .int sqlite3Pa
327d0 67 65 72 53 61 76 65 70 6f 69 6e 74 28 50 61 67  gerSavepoint(Pag
327e0 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
327f0 6f 70 2c 20 69 6e 74 20 69 53 61 76 65 70 6f 69  op, int iSavepoi
32800 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  nt){.  int rc = 
32810 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73  SQLITE_OK;..  as
32820 73 65 72 74 28 20 6f 70 3d 3d 53 41 56 45 50 4f  sert( op==SAVEPO
32830 49 4e 54 5f 52 45 4c 45 41 53 45 20 7c 7c 20 6f  INT_RELEASE || o
32840 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
32850 4c 42 41 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  LBACK );.  asser
32860 74 28 20 69 53 61 76 65 70 6f 69 6e 74 3e 3d 30  t( iSavepoint>=0
32870 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e   || op==SAVEPOIN
32880 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 0a 20  T_ROLLBACK );.. 
32890 20 69 66 28 20 69 53 61 76 65 70 6f 69 6e 74 3c   if( iSavepoint<
328a0 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
328b0 6e 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 69  nt ){.    int ii
328c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
328d0 49 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c  Iterator variabl
328e0 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4e 65  e */.    int nNe
328f0 77 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  w;          /* N
32900 75 6d 62 65 72 20 6f 66 20 72 65 6d 61 69 6e 69  umber of remaini
32910 6e 67 20 73 61 76 65 70 6f 69 6e 74 73 20 61 66  ng savepoints af
32920 74 65 72 20 74 68 69 73 20 6f 70 2e 20 2a 2f 0a  ter this op. */.
32930 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  .    /* Figure o
32940 75 74 20 68 6f 77 20 6d 61 6e 79 20 73 61 76 65  ut how many save
32950 70 6f 69 6e 74 73 20 77 69 6c 6c 20 73 74 69 6c  points will stil
32960 6c 20 62 65 20 61 63 74 69 76 65 20 61 66 74 65  l be active afte
32970 72 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 6f 70  r this.    ** op
32980 65 72 61 74 69 6f 6e 2e 20 53 74 6f 72 65 20 74  eration. Store t
32990 68 69 73 20 76 61 6c 75 65 20 69 6e 20 6e 4e 65  his value in nNe
329a0 77 2e 20 54 68 65 6e 20 66 72 65 65 20 72 65 73  w. Then free res
329b0 6f 75 72 63 65 73 20 61 73 73 6f 63 69 61 74 65  ources associate
329c0 64 20 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 61  d .    ** with a
329d0 6e 79 20 73 61 76 65 70 6f 69 6e 74 73 20 74 68  ny savepoints th
329e0 61 74 20 61 72 65 20 64 65 73 74 72 6f 79 65 64  at are destroyed
329f0 20 62 79 20 74 68 69 73 20 6f 70 65 72 61 74 69   by this operati
32a00 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e  on..    */.    n
32a10 4e 65 77 20 3d 20 69 53 61 76 65 70 6f 69 6e 74  New = iSavepoint
32a20 20 2b 20 28 28 20 6f 70 3d 3d 53 41 56 45 50 4f   + (( op==SAVEPO
32a30 49 4e 54 5f 52 45 4c 45 41 53 45 20 29 20 3f 20  INT_RELEASE ) ? 
32a40 30 20 3a 20 31 29 3b 0a 20 20 20 20 66 6f 72 28  0 : 1);.    for(
32a50 69 69 3d 6e 4e 65 77 3b 20 69 69 3c 70 50 61 67  ii=nNew; ii<pPag
32a60 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20  er->nSavepoint; 
32a70 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c  ii++){.      sql
32a80 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f  ite3BitvecDestro
32a90 79 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70  y(pPager->aSavep
32aa0 6f 69 6e 74 5b 69 69 5d 2e 70 49 6e 53 61 76 65  oint[ii].pInSave
32ab0 70 6f 69 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20  point);.    }.  
32ac0 20 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70    pPager->nSavep
32ad0 6f 69 6e 74 20 3d 20 6e 4e 65 77 3b 0a 0a 20 20  oint = nNew;..  
32ae0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
32af0 61 20 72 65 6c 65 61 73 65 20 6f 66 20 74 68 65  a release of the
32b00 20 6f 75 74 65 72 6d 6f 73 74 20 73 61 76 65 70   outermost savep
32b10 6f 69 6e 74 2c 20 74 72 75 6e 63 61 74 65 20 0a  oint, truncate .
32b20 20 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a      ** the sub-j
32b30 6f 75 72 6e 61 6c 20 74 6f 20 7a 65 72 6f 20 62  ournal to zero b
32b40 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 2a 2f  ytes in size. */
32b50 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 53 41 56  .    if( op==SAV
32b60 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 29  EPOINT_RELEASE )
32b70 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 4e 65 77  {.      if( nNew
32b80 3d 3d 30 20 26 26 20 69 73 4f 70 65 6e 28 70 50  ==0 && isOpen(pP
32b90 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20  ager->sjfd) ){. 
32ba0 20 20 20 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 74         /* Only t
32bb0 72 75 6e 63 61 74 65 20 69 66 20 69 74 20 69 73  runcate if it is
32bc0 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 75   an in-memory su
32bd0 62 2d 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20  b-journal. */.  
32be0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
32bf0 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70 50  3IsMemJournal(pP
32c00 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20  ager->sjfd) ){. 
32c10 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
32c20 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
32c30 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 30 29  pPager->sjfd, 0)
32c40 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
32c50 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
32c60 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  K );.        }. 
32c70 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e         pPager->n
32c80 53 75 62 52 65 63 20 3d 20 30 3b 0a 20 20 20 20  SubRec = 0;.    
32c90 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a    }.    }.    /*
32ca0 20 45 6c 73 65 20 74 68 69 73 20 69 73 20 61 20   Else this is a 
32cb0 72 6f 6c 6c 62 61 63 6b 20 6f 70 65 72 61 74 69  rollback operati
32cc0 6f 6e 2c 20 70 6c 61 79 62 61 63 6b 20 74 68 65  on, playback the
32cd0 20 73 70 65 63 69 66 69 65 64 20 73 61 76 65 70   specified savep
32ce0 6f 69 6e 74 2e 0a 20 20 20 20 2a 2a 20 49 66 20  oint..    ** If 
32cf0 74 68 69 73 20 69 73 20 61 20 74 65 6d 70 2d 66  this is a temp-f
32d00 69 6c 65 2c 20 69 74 20 69 73 20 70 6f 73 73 69  ile, it is possi
32d10 62 6c 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75  ble that the jou
32d20 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 0a 20 20  rnal file has.  
32d30 20 20 2a 2a 20 6e 6f 74 20 79 65 74 20 62 65 65    ** not yet bee
32d40 6e 20 6f 70 65 6e 65 64 2e 20 49 6e 20 74 68 69  n opened. In thi
32d50 73 20 63 61 73 65 20 74 68 65 72 65 20 68 61 76  s case there hav
32d60 65 20 62 65 65 6e 20 6e 6f 20 63 68 61 6e 67 65  e been no change
32d70 73 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20  s to.    ** the 
32d80 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 73  database file, s
32d90 6f 20 74 68 65 20 70 6c 61 79 62 61 63 6b 20 6f  o the playback o
32da0 70 65 72 61 74 69 6f 6e 20 63 61 6e 20 62 65 20  peration can be 
32db0 73 6b 69 70 70 65 64 2e 0a 20 20 20 20 2a 2f 0a  skipped..    */.
32dc0 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 61 67      else if( pag
32dd0 65 72 55 73 65 4c 6f 67 28 70 50 61 67 65 72 29  erUseLog(pPager)
32de0 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65   || isOpen(pPage
32df0 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20  r->jfd) ){.     
32e00 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
32e10 2a 70 53 61 76 65 70 6f 69 6e 74 20 3d 20 28 6e  *pSavepoint = (n
32e20 4e 65 77 3d 3d 30 29 3f 30 3a 26 70 50 61 67 65  New==0)?0:&pPage
32e30 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 6e 4e  r->aSavepoint[nN
32e40 65 77 2d 31 5d 3b 0a 20 20 20 20 20 20 72 63 20  ew-1];.      rc 
32e50 3d 20 70 61 67 65 72 50 6c 61 79 62 61 63 6b 53  = pagerPlaybackS
32e60 61 76 65 70 6f 69 6e 74 28 70 50 61 67 65 72 2c  avepoint(pPager,
32e70 20 70 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20   pSavepoint);.  
32e80 20 20 20 20 61 73 73 65 72 74 28 72 63 21 3d 53      assert(rc!=S
32e90 51 4c 49 54 45 5f 44 4f 4e 45 29 3b 0a 20 20 20  QLITE_DONE);.   
32ea0 20 7d 0a 20 20 0a 20 20 7d 0a 20 20 72 65 74 75   }.  .  }.  retu
32eb0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
32ec0 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 20  Return the full 
32ed0 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20  pathname of the 
32ee0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
32ef0 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
32f00 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 6e 61  lite3PagerFilena
32f10 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  me(Pager *pPager
32f20 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
32f30 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d  er->zFilename;.}
32f40 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
32f50 68 65 20 56 46 53 20 73 74 72 75 63 74 75 72 65  he VFS structure
32f60 20 66 6f 72 20 74 68 65 20 70 61 67 65 72 2e 0a   for the pager..
32f70 2a 2f 0a 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  */.const sqlite3
32f80 5f 76 66 73 20 2a 73 71 6c 69 74 65 33 50 61 67  _vfs *sqlite3Pag
32f90 65 72 56 66 73 28 50 61 67 65 72 20 2a 70 50 61  erVfs(Pager *pPa
32fa0 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
32fb0 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 7d 0a 0a  Pager->pVfs;.}..
32fc0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
32fd0 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 66 6f 72   file handle for
32fe0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
32ff0 6c 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a  le associated.**
33000 20 77 69 74 68 20 74 68 65 20 70 61 67 65 72 2e   with the pager.
33010 20 20 54 68 69 73 20 6d 69 67 68 74 20 72 65 74    This might ret
33020 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65 20  urn NULL if the 
33030 66 69 6c 65 20 68 61 73 0a 2a 2a 20 6e 6f 74 20  file has.** not 
33040 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e  yet been opened.
33050 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 66 69 6c 65  .*/.sqlite3_file
33060 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 46 69   *sqlite3PagerFi
33070 6c 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  le(Pager *pPager
33080 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
33090 65 72 2d 3e 66 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  er->fd;.}../*.**
330a0 20 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c   Return the full
330b0 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65   pathname of the
330c0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a   journal file..*
330d0 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
330e0 6c 69 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61  lite3PagerJourna
330f0 6c 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61  lname(Pager *pPa
33100 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
33110 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 3b  Pager->zJournal;
33120 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
33130 20 74 72 75 65 20 69 66 20 66 73 79 6e 63 28 29   true if fsync()
33140 20 63 61 6c 6c 73 20 61 72 65 20 64 69 73 61 62   calls are disab
33150 6c 65 64 20 66 6f 72 20 74 68 69 73 20 70 61 67  led for this pag
33160 65 72 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53  er.  Return FALS
33170 45 0a 2a 2a 20 69 66 20 66 73 79 6e 63 28 29 73  E.** if fsync()s
33180 20 61 72 65 20 65 78 65 63 75 74 65 64 20 6e 6f   are executed no
33190 72 6d 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73  rmally..*/.int s
331a0 71 6c 69 74 65 33 50 61 67 65 72 4e 6f 73 79 6e  qlite3PagerNosyn
331b0 63 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  c(Pager *pPager)
331c0 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
331d0 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 7d 0a 0a 23 69  r->noSync;.}..#i
331e0 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
331f0 43 4f 44 45 43 0a 2f 2a 0a 2a 2a 20 53 65 74 20  CODEC./*.** Set 
33200 6f 72 20 72 65 74 72 69 65 76 65 20 74 68 65 20  or retrieve the 
33210 63 6f 64 65 63 20 66 6f 72 20 74 68 69 73 20 70  codec for this p
33220 61 67 65 72 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ager.*/.static v
33230 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
33240 53 65 74 43 6f 64 65 63 28 0a 20 20 50 61 67 65  SetCodec(.  Page
33250 72 20 2a 70 50 61 67 65 72 2c 0a 20 20 76 6f 69  r *pPager,.  voi
33260 64 20 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f 69  d *(*xCodec)(voi
33270 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e  d*,void*,Pgno,in
33280 74 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f  t),.  void (*xCo
33290 64 65 63 53 69 7a 65 43 68 6e 67 29 28 76 6f 69  decSizeChng)(voi
332a0 64 2a 2c 69 6e 74 2c 69 6e 74 29 2c 0a 20 20 76  d*,int,int),.  v
332b0 6f 69 64 20 28 2a 78 43 6f 64 65 63 46 72 65 65  oid (*xCodecFree
332c0 29 28 76 6f 69 64 2a 29 2c 0a 20 20 76 6f 69 64  )(void*),.  void
332d0 20 2a 70 43 6f 64 65 63 0a 29 7b 0a 20 20 69 66   *pCodec.){.  if
332e0 28 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63  ( pPager->xCodec
332f0 46 72 65 65 20 29 20 70 50 61 67 65 72 2d 3e 78  Free ) pPager->x
33300 43 6f 64 65 63 46 72 65 65 28 70 50 61 67 65 72  CodecFree(pPager
33310 2d 3e 70 43 6f 64 65 63 29 3b 0a 20 20 70 50 61  ->pCodec);.  pPa
33320 67 65 72 2d 3e 78 43 6f 64 65 63 20 3d 20 70 50  ger->xCodec = pP
33330 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3f 20 30 20  ager->memDb ? 0 
33340 3a 20 78 43 6f 64 65 63 3b 0a 20 20 70 50 61 67  : xCodec;.  pPag
33350 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65 43 68  er->xCodecSizeCh
33360 6e 67 20 3d 20 78 43 6f 64 65 63 53 69 7a 65 43  ng = xCodecSizeC
33370 68 6e 67 3b 0a 20 20 70 50 61 67 65 72 2d 3e 78  hng;.  pPager->x
33380 43 6f 64 65 63 46 72 65 65 20 3d 20 78 43 6f 64  CodecFree = xCod
33390 65 63 46 72 65 65 3b 0a 20 20 70 50 61 67 65 72  ecFree;.  pPager
333a0 2d 3e 70 43 6f 64 65 63 20 3d 20 70 43 6f 64 65  ->pCodec = pCode
333b0 63 3b 0a 20 20 70 61 67 65 72 52 65 70 6f 72 74  c;.  pagerReport
333c0 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 7d 0a  Size(pPager);.}.
333d0 73 74 61 74 69 63 20 76 6f 69 64 20 2a 73 71 6c  static void *sql
333e0 69 74 65 33 50 61 67 65 72 47 65 74 43 6f 64 65  ite3PagerGetCode
333f0 63 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  c(Pager *pPager)
33400 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
33410 72 2d 3e 70 43 6f 64 65 63 3b 0a 7d 0a 23 65 6e  r->pCodec;.}.#en
33420 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
33430 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
33440 55 55 4d 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  UUM./*.** Move t
33450 68 65 20 70 61 67 65 20 70 50 67 20 74 6f 20 6c  he page pPg to l
33460 6f 63 61 74 69 6f 6e 20 70 67 6e 6f 20 69 6e 20  ocation pgno in 
33470 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  the file..**.** 
33480 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 6e 6f  There must be no
33490 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
334a0 68 65 20 70 61 67 65 20 70 72 65 76 69 6f 75 73  he page previous
334b0 6c 79 20 6c 6f 63 61 74 65 64 20 61 74 0a 2a 2a  ly located at.**
334c0 20 70 67 6e 6f 20 28 77 68 69 63 68 20 77 65 20   pgno (which we 
334d0 63 61 6c 6c 20 70 50 67 4f 6c 64 29 20 74 68 6f  call pPgOld) tho
334e0 75 67 68 20 74 68 61 74 20 70 61 67 65 20 69 73  ugh that page is
334f0 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65 0a 2a   allowed to be.*
33500 2a 20 69 6e 20 63 61 63 68 65 2e 20 20 49 66 20  * in cache.  If 
33510 74 68 65 20 70 61 67 65 20 70 72 65 76 69 6f 75  the page previou
33520 73 6c 79 20 6c 6f 63 61 74 65 64 20 61 74 20 70  sly located at p
33530 67 6e 6f 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  gno is not alrea
33540 64 79 0a 2a 2a 20 69 6e 20 74 68 65 20 72 6f 6c  dy.** in the rol
33550 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 69  lback journal, i
33560 74 20 69 73 20 6e 6f 74 20 70 75 74 20 74 68 65  t is not put the
33570 72 65 20 62 79 20 62 79 20 74 68 69 73 20 72 6f  re by by this ro
33580 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 66  utine..**.** Ref
33590 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70  erences to the p
335a0 61 67 65 20 70 50 67 20 72 65 6d 61 69 6e 20 76  age pPg remain v
335b0 61 6c 69 64 2e 20 55 70 64 61 74 69 6e 67 20 61  alid. Updating a
335c0 6e 79 0a 2a 2a 20 6d 65 74 61 2d 64 61 74 61 20  ny.** meta-data 
335d0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
335e0 70 50 67 20 28 69 2e 65 2e 20 64 61 74 61 20 73  pPg (i.e. data s
335f0 74 6f 72 65 64 20 69 6e 20 74 68 65 20 6e 45 78  tored in the nEx
33600 74 72 61 20 62 79 74 65 73 0a 2a 2a 20 61 6c 6c  tra bytes.** all
33610 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69 74  ocated along wit
33620 68 20 74 68 65 20 70 61 67 65 29 20 69 73 20 74  h the page) is t
33630 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  he responsibilit
33640 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 2e  y of the caller.
33650 0a 2a 2a 0a 2a 2a 20 41 20 74 72 61 6e 73 61 63  .**.** A transac
33660 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 61 63 74  tion must be act
33670 69 76 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f  ive when this ro
33680 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
33690 20 49 74 20 75 73 65 64 20 74 6f 20 62 65 0a 2a   It used to be.*
336a0 2a 20 72 65 71 75 69 72 65 64 20 74 68 61 74 20  * required that 
336b0 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  a statement tran
336c0 73 61 63 74 69 6f 6e 20 77 61 73 20 6e 6f 74 20  saction was not 
336d0 61 63 74 69 76 65 2c 20 62 75 74 20 74 68 69 73  active, but this
336e0 20 72 65 73 74 72 69 63 74 69 6f 6e 0a 2a 2a 20   restriction.** 
336f0 68 61 73 20 62 65 65 6e 20 72 65 6d 6f 76 65 64  has been removed
33700 20 28 43 52 45 41 54 45 20 49 4e 44 45 58 20 6e   (CREATE INDEX n
33710 65 65 64 73 20 74 6f 20 6d 6f 76 65 20 61 20 70  eeds to move a p
33720 61 67 65 20 77 68 65 6e 20 61 20 73 74 61 74 65  age when a state
33730 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74  ment.** transact
33740 69 6f 6e 20 69 73 20 61 63 74 69 76 65 29 2e 0a  ion is active)..
33750 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 6f 75  **.** If the fou
33760 72 74 68 20 61 72 67 75 6d 65 6e 74 2c 20 69 73  rth argument, is
33770 43 6f 6d 6d 69 74 2c 20 69 73 20 6e 6f 6e 2d 7a  Commit, is non-z
33780 65 72 6f 2c 20 74 68 65 6e 20 74 68 69 73 20 70  ero, then this p
33790 61 67 65 20 69 73 20 62 65 69 6e 67 0a 2a 2a 20  age is being.** 
337a0 6d 6f 76 65 64 20 61 73 20 70 61 72 74 20 6f 66  moved as part of
337b0 20 61 20 64 61 74 61 62 61 73 65 20 72 65 6f 72   a database reor
337c0 67 61 6e 69 7a 61 74 69 6f 6e 20 6a 75 73 74 20  ganization just 
337d0 62 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73  before the trans
337e0 61 63 74 69 6f 6e 20 0a 2a 2a 20 69 73 20 62 65  action .** is be
337f0 69 6e 67 20 63 6f 6d 6d 69 74 74 65 64 2e 20 49  ing committed. I
33800 6e 20 74 68 69 73 20 63 61 73 65 2c 20 69 74 20  n this case, it 
33810 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 68  is guaranteed th
33820 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  at the database 
33830 70 61 67 65 20 0a 2a 2a 20 70 50 67 20 72 65 66  page .** pPg ref
33840 65 72 73 20 74 6f 20 77 69 6c 6c 20 6e 6f 74 20  ers to will not 
33850 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20 61 67  be written to ag
33860 61 69 6e 20 77 69 74 68 69 6e 20 74 68 69 73 20  ain within this 
33870 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
33880 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
33890 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49   may return SQLI
338a0 54 45 5f 4e 4f 4d 45 4d 20 6f 72 20 61 6e 20 49  TE_NOMEM or an I
338b0 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  O error code if 
338c0 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 6f 63 63 75  an error.** occu
338d0 72 73 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  rs. Otherwise, i
338e0 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  t returns SQLITE
338f0 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  _OK..*/.int sqli
33900 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65  te3PagerMovepage
33910 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
33920 44 62 50 61 67 65 20 2a 70 50 67 2c 20 50 67 6e  DbPage *pPg, Pgn
33930 6f 20 70 67 6e 6f 2c 20 69 6e 74 20 69 73 43 6f  o pgno, int isCo
33940 6d 6d 69 74 29 7b 0a 20 20 50 67 48 64 72 20 2a  mmit){.  PgHdr *
33950 70 50 67 4f 6c 64 3b 20 20 20 20 20 20 20 20 20  pPgOld;         
33960 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
33970 65 20 62 65 69 6e 67 20 6f 76 65 72 77 72 69 74  e being overwrit
33980 74 65 6e 2e 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e  ten. */.  Pgno n
33990 65 65 64 53 79 6e 63 50 67 6e 6f 20 3d 20 30 3b  eedSyncPgno = 0;
339a0 20 20 20 20 20 20 20 2f 2a 20 4f 6c 64 20 76 61         /* Old va
339b0 6c 75 65 20 6f 66 20 70 50 67 2d 3e 70 67 6e 6f  lue of pPg->pgno
339c0 2c 20 69 66 20 73 79 6e 63 20 69 73 20 72 65 71  , if sync is req
339d0 75 69 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 72  uired */.  int r
339e0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
339f0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
33a00 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 50 67 6e 6f  n code */.  Pgno
33a10 20 6f 72 69 67 50 67 6e 6f 3b 20 20 20 20 20 20   origPgno;      
33a20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
33a30 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 6e 75  original page nu
33a40 6d 62 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72  mber */..  asser
33a50 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29  t( pPg->nRef>0 )
33a60 3b 0a 0a 20 20 2f 2a 20 49 6e 20 6f 72 64 65 72  ;..  /* In order
33a70 20 74 6f 20 62 65 20 61 62 6c 65 20 74 6f 20 72   to be able to r
33a80 6f 6c 6c 62 61 63 6b 2c 20 61 6e 20 69 6e 2d 6d  ollback, an in-m
33a90 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 6d  emory database m
33aa0 75 73 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a  ust journal.  **
33ab0 20 74 68 65 20 70 61 67 65 20 77 65 20 61 72 65   the page we are
33ac0 20 6d 6f 76 69 6e 67 20 66 72 6f 6d 2e 0a 20 20   moving from..  
33ad0 2a 2f 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29  */.  if( MEMDB )
33ae0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
33af0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 67  e3PagerWrite(pPg
33b00 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
33b10 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
33b20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65    /* If the page
33b30 20 62 65 69 6e 67 20 6d 6f 76 65 64 20 69 73 20   being moved is 
33b40 64 69 72 74 79 20 61 6e 64 20 68 61 73 20 6e 6f  dirty and has no
33b50 74 20 62 65 65 6e 20 73 61 76 65 64 20 62 79 20  t been saved by 
33b60 74 68 65 20 6c 61 74 65 73 74 0a 20 20 2a 2a 20  the latest.  ** 
33b70 73 61 76 65 70 6f 69 6e 74 2c 20 74 68 65 6e 20  savepoint, then 
33b80 73 61 76 65 20 74 68 65 20 63 75 72 72 65 6e 74  save the current
33b90 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
33ba0 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 0a   page into the .
33bb0 20 20 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c    ** sub-journal
33bc0 20 6e 6f 77 2e 20 54 68 69 73 20 69 73 20 72 65   now. This is re
33bd0 71 75 69 72 65 64 20 74 6f 20 68 61 6e 64 6c 65  quired to handle
33be0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
33bf0 63 65 6e 61 72 69 6f 3a 0a 20 20 2a 2a 0a 20 20  cenario:.  **.  
33c00 2a 2a 20 20 20 42 45 47 49 4e 3b 0a 20 20 2a 2a  **   BEGIN;.  **
33c10 20 20 20 20 20 3c 6a 6f 75 72 6e 61 6c 20 70 61       <journal pa
33c20 67 65 20 58 2c 20 74 68 65 6e 20 6d 6f 64 69 66  ge X, then modif
33c30 79 20 69 74 20 69 6e 20 6d 65 6d 6f 72 79 3e 0a  y it in memory>.
33c40 20 20 2a 2a 20 20 20 20 20 53 41 56 45 50 4f 49    **     SAVEPOI
33c50 4e 54 20 6f 6e 65 3b 0a 20 20 2a 2a 20 20 20 20  NT one;.  **    
33c60 20 20 20 3c 4d 6f 76 65 20 70 61 67 65 20 58 20     <Move page X 
33c70 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 59 3e 0a 20  to location Y>. 
33c80 20 2a 2a 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b   **     ROLLBACK
33c90 20 54 4f 20 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20   TO one;.  **.  
33ca0 2a 2a 20 49 66 20 70 61 67 65 20 58 20 77 65 72  ** If page X wer
33cb0 65 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f  e not written to
33cc0 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
33cd0 20 68 65 72 65 2c 20 69 74 20 77 6f 75 6c 64 20   here, it would 
33ce0 6e 6f 74 0a 20 20 2a 2a 20 62 65 20 70 6f 73 73  not.  ** be poss
33cf0 69 62 6c 65 20 74 6f 20 72 65 73 74 6f 72 65 20  ible to restore 
33d00 69 74 73 20 63 6f 6e 74 65 6e 74 73 20 77 68 65  its contents whe
33d10 6e 20 74 68 65 20 22 52 4f 4c 4c 42 41 43 4b 20  n the "ROLLBACK 
33d20 54 4f 20 6f 6e 65 22 0a 20 20 2a 2a 20 73 74 61  TO one".  ** sta
33d30 74 65 6d 65 6e 74 20 77 65 72 65 20 69 73 20 70  tement were is p
33d40 72 6f 63 65 73 73 65 64 2e 0a 20 20 2a 2a 0a 20  rocessed..  **. 
33d50 20 2a 2a 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61   ** subjournalPa
33d60 67 65 28 29 20 6d 61 79 20 6e 65 65 64 20 74 6f  ge() may need to
33d70 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   allocate space 
33d80 74 6f 20 73 74 6f 72 65 20 70 50 67 2d 3e 70 67  to store pPg->pg
33d90 6e 6f 20 69 6e 74 6f 0a 20 20 2a 2a 20 6f 6e 65  no into.  ** one
33da0 20 6f 72 20 6d 6f 72 65 20 73 61 76 65 70 6f 69   or more savepoi
33db0 6e 74 20 62 69 74 76 65 63 73 2e 20 54 68 69 73  nt bitvecs. This
33dc0 20 69 73 20 74 68 65 20 72 65 61 73 6f 6e 20 74   is the reason t
33dd0 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a  his function.  *
33de0 2a 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c  * may return SQL
33df0 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 20 20 2a 2f 0a  ITE_NOMEM..  */.
33e00 20 20 69 66 28 20 70 50 67 2d 3e 66 6c 61 67 73    if( pPg->flags
33e10 26 50 47 48 44 52 5f 44 49 52 54 59 0a 20 20 20  &PGHDR_DIRTY.   
33e20 26 26 20 73 75 62 6a 52 65 71 75 69 72 65 73 50  && subjRequiresP
33e30 61 67 65 28 70 50 67 29 0a 20 20 20 26 26 20 53  age(pPg).   && S
33e40 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
33e50 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70  subjournalPage(p
33e60 50 67 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  Pg)).  ){.    re
33e70 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
33e80 50 41 47 45 52 54 52 41 43 45 28 28 22 4d 4f 56  PAGERTRACE(("MOV
33e90 45 20 25 64 20 70 61 67 65 20 25 64 20 28 6e 65  E %d page %d (ne
33ea0 65 64 53 79 6e 63 3d 25 64 29 20 6d 6f 76 65 73  edSync=%d) moves
33eb0 20 74 6f 20 25 64 5c 6e 22 2c 20 0a 20 20 20 20   to %d\n", .    
33ec0 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
33ed0 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 28 70  ), pPg->pgno, (p
33ee0 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
33ef0 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30 2c 20  NEED_SYNC)?1:0, 
33f00 70 67 6e 6f 29 29 3b 0a 20 20 49 4f 54 52 41 43  pgno));.  IOTRAC
33f10 45 28 28 22 4d 4f 56 45 20 25 70 20 25 64 20 25  E(("MOVE %p %d %
33f20 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
33f30 67 2d 3e 70 67 6e 6f 2c 20 70 67 6e 6f 29 29 0a  g->pgno, pgno)).
33f40 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75  .  /* If the jou
33f50 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f 20 62 65  rnal needs to be
33f60 20 73 79 6e 63 28 29 65 64 20 62 65 66 6f 72 65   sync()ed before
33f70 20 70 61 67 65 20 70 50 67 2d 3e 70 67 6e 6f 20   page pPg->pgno 
33f80 63 61 6e 0a 20 20 2a 2a 20 62 65 20 77 72 69 74  can.  ** be writ
33f90 74 65 6e 20 74 6f 2c 20 73 74 6f 72 65 20 70 50  ten to, store pP
33fa0 67 2d 3e 70 67 6e 6f 20 69 6e 20 6c 6f 63 61 6c  g->pgno in local
33fb0 20 76 61 72 69 61 62 6c 65 20 6e 65 65 64 53 79   variable needSy
33fc0 6e 63 50 67 6e 6f 2e 0a 20 20 2a 2a 0a 20 20 2a  ncPgno..  **.  *
33fd0 2a 20 49 66 20 74 68 65 20 69 73 43 6f 6d 6d 69  * If the isCommi
33fe0 74 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74  t flag is set, t
33ff0 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20  here is no need 
34000 74 6f 20 72 65 6d 65 6d 62 65 72 20 74 68 61 74  to remember that
34010 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61  .  ** the journa
34020 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79  l needs to be sy
34030 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20 64 61  nc()ed before da
34040 74 61 62 61 73 65 20 70 61 67 65 20 70 50 67 2d  tabase page pPg-
34050 3e 70 67 6e 6f 20 0a 20 20 2a 2a 20 63 61 6e 20  >pgno .  ** can 
34060 62 65 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 54  be written to. T
34070 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c  he caller has al
34080 72 65 61 64 79 20 70 72 6f 6d 69 73 65 64 20 6e  ready promised n
34090 6f 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20 69  ot to write to i
340a0 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70  t..  */.  if( (p
340b0 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
340c0 4e 45 45 44 5f 53 59 4e 43 29 20 26 26 20 21 69  NEED_SYNC) && !i
340d0 73 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 6e  sCommit ){.    n
340e0 65 65 64 53 79 6e 63 50 67 6e 6f 20 3d 20 70 50  eedSyncPgno = pP
340f0 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 61 73 73  g->pgno;.    ass
34100 65 72 74 28 20 70 61 67 65 49 6e 4a 6f 75 72 6e  ert( pageInJourn
34110 61 6c 28 70 50 67 29 20 7c 7c 20 70 50 67 2d 3e  al(pPg) || pPg->
34120 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 4f  pgno>pPager->dbO
34130 72 69 67 53 69 7a 65 20 29 3b 0a 20 20 20 20 61  rigSize );.    a
34140 73 73 65 72 74 28 20 70 50 67 2d 3e 66 6c 61 67  ssert( pPg->flag
34150 73 26 50 47 48 44 52 5f 44 49 52 54 59 20 29 3b  s&PGHDR_DIRTY );
34160 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
34170 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b  ger->needSync );
34180 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
34190 65 20 63 61 63 68 65 20 63 6f 6e 74 61 69 6e 73  e cache contains
341a0 20 61 20 70 61 67 65 20 77 69 74 68 20 70 61 67   a page with pag
341b0 65 2d 6e 75 6d 62 65 72 20 70 67 6e 6f 2c 20 72  e-number pgno, r
341c0 65 6d 6f 76 65 20 69 74 0a 20 20 2a 2a 20 66 72  emove it.  ** fr
341d0 6f 6d 20 69 74 73 20 68 61 73 68 20 63 68 61 69  om its hash chai
341e0 6e 2e 20 41 6c 73 6f 2c 20 69 66 20 74 68 65 20  n. Also, if the 
341f0 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 77  PgHdr.needSync w
34200 61 73 20 73 65 74 20 66 6f 72 20 0a 20 20 2a 2a  as set for .  **
34210 20 70 61 67 65 20 70 67 6e 6f 20 62 65 66 6f 72   page pgno befor
34220 65 20 74 68 65 20 27 6d 6f 76 65 27 20 6f 70 65  e the 'move' ope
34230 72 61 74 69 6f 6e 2c 20 69 74 20 6e 65 65 64 73  ration, it needs
34240 20 74 6f 20 62 65 20 72 65 74 61 69 6e 65 64 20   to be retained 
34250 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 70 61  .  ** for the pa
34260 67 65 20 6d 6f 76 65 64 20 74 68 65 72 65 2e 0a  ge moved there..
34270 20 20 2a 2f 0a 20 20 70 50 67 2d 3e 66 6c 61 67    */.  pPg->flag
34280 73 20 26 3d 20 7e 50 47 48 44 52 5f 4e 45 45 44  s &= ~PGHDR_NEED
34290 5f 53 59 4e 43 3b 0a 20 20 70 50 67 4f 6c 64 20  _SYNC;.  pPgOld 
342a0 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70  = pager_lookup(p
342b0 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
342c0 61 73 73 65 72 74 28 20 21 70 50 67 4f 6c 64 20  assert( !pPgOld 
342d0 7c 7c 20 70 50 67 4f 6c 64 2d 3e 6e 52 65 66 3d  || pPgOld->nRef=
342e0 3d 31 20 29 3b 0a 20 20 69 66 28 20 70 50 67 4f  =1 );.  if( pPgO
342f0 6c 64 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 66  ld ){.    pPg->f
34300 6c 61 67 73 20 7c 3d 20 28 70 50 67 4f 6c 64 2d  lags |= (pPgOld-
34310 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45  >flags&PGHDR_NEE
34320 44 5f 53 59 4e 43 29 3b 0a 20 20 20 20 69 66 28  D_SYNC);.    if(
34330 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20   MEMDB ){.      
34340 2f 2a 20 44 6f 20 6e 6f 74 20 64 69 73 63 61 72  /* Do not discar
34350 64 20 70 61 67 65 73 20 66 72 6f 6d 20 61 6e 20  d pages from an 
34360 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
34370 73 65 20 73 69 6e 63 65 20 77 65 20 6d 69 67 68  se since we migh
34380 74 0a 20 20 20 20 20 20 2a 2a 20 6e 65 65 64 20  t.      ** need 
34390 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 6c 61 74 65  to rollback late
343a0 72 2e 20 20 4a 75 73 74 20 6d 6f 76 65 20 74 68  r.  Just move th
343b0 65 20 70 61 67 65 20 6f 75 74 20 6f 66 20 74 68  e page out of th
343c0 65 20 77 61 79 2e 20 2a 2f 0a 20 20 20 20 20 20  e way. */.      
343d0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
343e0 64 62 53 69 7a 65 56 61 6c 69 64 20 29 3b 0a 20  dbSizeValid );. 
343f0 20 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63       sqlite3Pcac
34400 68 65 4d 6f 76 65 28 70 50 67 4f 6c 64 2c 20 70  heMove(pPgOld, p
34410 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2b 31 29  Pager->dbSize+1)
34420 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
34430 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
34440 44 72 6f 70 28 70 50 67 4f 6c 64 29 3b 0a 20 20  Drop(pPgOld);.  
34450 20 20 7d 0a 20 20 7d 0a 0a 20 20 6f 72 69 67 50    }.  }..  origP
34460 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b  gno = pPg->pgno;
34470 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
34480 4d 6f 76 65 28 70 50 67 2c 20 70 67 6e 6f 29 3b  Move(pPg, pgno);
34490 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
344a0 4d 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a  MakeDirty(pPg);.
344b0 20 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69    pPager->dbModi
344c0 66 69 65 64 20 3d 20 31 3b 0a 0a 20 20 69 66 28  fied = 1;..  if(
344d0 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 29 7b   needSyncPgno ){
344e0 0a 20 20 20 20 2f 2a 20 49 66 20 6e 65 65 64 53  .    /* If needS
344f0 79 6e 63 50 67 6e 6f 20 69 73 20 6e 6f 6e 2d 7a  yncPgno is non-z
34500 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f  ero, then the jo
34510 75 72 6e 61 6c 20 66 69 6c 65 20 6e 65 65 64 73  urnal file needs
34520 20 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a 20 73   to be .    ** s
34530 79 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20 61  ync()ed before a
34540 6e 79 20 64 61 74 61 20 69 73 20 77 72 69 74 74  ny data is writt
34550 65 6e 20 74 6f 20 64 61 74 61 62 61 73 65 20 66  en to database f
34560 69 6c 65 20 70 61 67 65 20 6e 65 65 64 53 79 6e  ile page needSyn
34570 63 50 67 6e 6f 2e 0a 20 20 20 20 2a 2a 20 43 75  cPgno..    ** Cu
34580 72 72 65 6e 74 6c 79 2c 20 6e 6f 20 73 75 63 68  rrently, no such
34590 20 70 61 67 65 20 65 78 69 73 74 73 20 69 6e 20   page exists in 
345a0 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 61  the page-cache a
345b0 6e 64 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 22  nd the .    ** "
345c0 69 73 20 6a 6f 75 72 6e 61 6c 65 64 22 20 62 69  is journaled" bi
345d0 74 76 65 63 20 66 6c 61 67 20 68 61 73 20 62 65  tvec flag has be
345e0 65 6e 20 73 65 74 2e 20 54 68 69 73 20 6e 65 65  en set. This nee
345f0 64 73 20 74 6f 20 62 65 20 72 65 6d 65 64 69 65  ds to be remedie
34600 64 20 62 79 0a 20 20 20 20 2a 2a 20 6c 6f 61 64  d by.    ** load
34610 69 6e 67 20 74 68 65 20 70 61 67 65 20 69 6e 74  ing the page int
34620 6f 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68  o the pager-cach
34630 65 20 61 6e 64 20 73 65 74 74 69 6e 67 20 74 68  e and setting th
34640 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63  e PgHdr.needSync
34650 20 0a 20 20 20 20 2a 2a 20 66 6c 61 67 2e 0a 20   .    ** flag.. 
34660 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20     **.    ** If 
34670 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 6c  the attempt to l
34680 6f 61 64 20 74 68 65 20 70 61 67 65 20 69 6e 74  oad the page int
34690 6f 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  o the page-cache
346a0 20 66 61 69 6c 73 2c 20 28 64 75 65 0a 20 20 20   fails, (due.   
346b0 20 2a 2a 20 74 6f 20 61 20 6d 61 6c 6c 6f 63 28   ** to a malloc(
346c0 29 20 6f 72 20 49 4f 20 66 61 69 6c 75 72 65 29  ) or IO failure)
346d0 2c 20 63 6c 65 61 72 20 74 68 65 20 62 69 74 20  , clear the bit 
346e0 69 6e 20 74 68 65 20 70 49 6e 4a 6f 75 72 6e 61  in the pInJourna
346f0 6c 5b 5d 0a 20 20 20 20 2a 2a 20 61 72 72 61 79  l[].    ** array
34700 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  . Otherwise, if 
34710 74 68 65 20 70 61 67 65 20 69 73 20 6c 6f 61 64  the page is load
34720 65 64 20 61 6e 64 20 77 72 69 74 74 65 6e 20 61  ed and written a
34730 67 61 69 6e 20 69 6e 0a 20 20 20 20 2a 2a 20 74  gain in.    ** t
34740 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  his transaction,
34750 20 69 74 20 6d 61 79 20 62 65 20 77 72 69 74 74   it may be writt
34760 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  en to the databa
34770 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65 0a 20  se file before. 
34780 20 20 20 2a 2a 20 69 74 20 69 73 20 73 79 6e 63     ** it is sync
34790 65 64 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  ed into the jour
347a0 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 77  nal file. This w
347b0 61 79 2c 20 69 74 20 6d 61 79 20 65 6e 64 20 75  ay, it may end u
347c0 70 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  p in.    ** the 
347d0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 77 69  journal file twi
347e0 63 65 2c 20 62 75 74 20 74 68 61 74 20 69 73 20  ce, but that is 
347f0 6e 6f 74 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 20  not a problem.. 
34800 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
34810 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
34820 28 29 20 63 61 6c 6c 20 6d 61 79 20 63 61 75 73  () call may caus
34830 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f  e the journal to
34840 20 73 79 6e 63 2e 20 53 6f 20 6d 61 6b 65 0a 20   sync. So make. 
34850 20 20 20 2a 2a 20 73 75 72 65 20 74 68 65 20 50     ** sure the P
34860 61 67 65 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c  ager.needSync fl
34870 61 67 20 69 73 20 73 65 74 20 74 6f 6f 2e 0a 20  ag is set too.. 
34880 20 20 20 2a 2f 0a 20 20 20 20 50 67 48 64 72 20     */.    PgHdr 
34890 2a 70 50 67 48 64 72 3b 0a 20 20 20 20 61 73 73  *pPgHdr;.    ass
348a0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65  ert( pPager->nee
348b0 64 53 79 6e 63 20 29 3b 0a 20 20 20 20 72 63 20  dSync );.    rc 
348c0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
348d0 74 28 70 50 61 67 65 72 2c 20 6e 65 65 64 53 79  t(pPager, needSy
348e0 6e 63 50 67 6e 6f 2c 20 26 70 50 67 48 64 72 29  ncPgno, &pPgHdr)
348f0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
34900 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
34910 20 69 66 28 20 6e 65 65 64 53 79 6e 63 50 67 6e   if( needSyncPgn
34920 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  o<=pPager->dbOri
34930 67 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  gSize ){.       
34940 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
34950 3e 70 54 6d 70 53 70 61 63 65 21 3d 30 20 29 3b  >pTmpSpace!=0 );
34960 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
34970 42 69 74 76 65 63 43 6c 65 61 72 28 70 50 61 67  BitvecClear(pPag
34980 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20  er->pInJournal, 
34990 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2c 20 70 50  needSyncPgno, pP
349a0 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 29  ager->pTmpSpace)
349b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
349c0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
349d0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65  .    pPager->nee
349e0 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 61  dSync = 1;.    a
349f0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
34a00 6f 53 79 6e 63 3d 3d 30 20 26 26 20 21 4d 45 4d  oSync==0 && !MEM
34a10 44 42 20 29 3b 0a 20 20 20 20 70 50 67 48 64 72  DB );.    pPgHdr
34a20 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52  ->flags |= PGHDR
34a30 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20  _NEED_SYNC;.    
34a40 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
34a50 65 44 69 72 74 79 28 70 50 67 48 64 72 29 3b 0a  eDirty(pPgHdr);.
34a60 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
34a70 55 6e 72 65 66 28 70 50 67 48 64 72 29 3b 0a 20  Unref(pPgHdr);. 
34a80 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 6f   }..  /*.  ** Fo
34a90 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  r an in-memory d
34aa0 61 74 61 62 61 73 65 2c 20 6d 61 6b 65 20 73 75  atabase, make su
34ab0 72 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  re the original 
34ac0 70 61 67 65 20 63 6f 6e 74 69 6e 75 65 73 0a 20  page continues. 
34ad0 20 2a 2a 20 74 6f 20 65 78 69 73 74 2c 20 69 6e   ** to exist, in
34ae0 20 63 61 73 65 20 74 68 65 20 74 72 61 6e 73 61   case the transa
34af0 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20 72  ction needs to r
34b00 6f 6c 6c 20 62 61 63 6b 2e 20 20 55 73 65 20 70  oll back.  Use p
34b10 50 67 4f 6c 64 0a 20 20 2a 2a 20 61 73 20 74 68  PgOld.  ** as th
34b20 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20  e original page 
34b30 73 69 6e 63 65 20 69 74 20 68 61 73 20 61 6c 72  since it has alr
34b40 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61  eady been alloca
34b50 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ted..  */.  if( 
34b60 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 73 71 6c  MEMDB ){.    sql
34b70 69 74 65 33 50 63 61 63 68 65 4d 6f 76 65 28 70  ite3PcacheMove(p
34b80 50 67 4f 6c 64 2c 20 6f 72 69 67 50 67 6e 6f 29  PgOld, origPgno)
34b90 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
34ba0 65 72 55 6e 72 65 66 28 70 50 67 4f 6c 64 29 3b  erUnref(pPgOld);
34bb0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53  .  }..  return S
34bc0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
34bd0 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  if../*.** Return
34be0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
34bf0 65 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 73  e data for the s
34c00 70 65 63 69 66 69 65 64 20 70 61 67 65 2e 0a 2a  pecified page..*
34c10 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50  /.void *sqlite3P
34c20 61 67 65 72 47 65 74 44 61 74 61 28 44 62 50 61  agerGetData(DbPa
34c30 67 65 20 2a 70 50 67 29 7b 0a 20 20 61 73 73 65  ge *pPg){.  asse
34c40 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20  rt( pPg->nRef>0 
34c50 7c 7c 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e  || pPg->pPager->
34c60 6d 65 6d 44 62 20 29 3b 0a 20 20 72 65 74 75 72  memDb );.  retur
34c70 6e 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 7d 0a  n pPg->pData;.}.
34c80 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
34c90 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50  pointer to the P
34ca0 61 67 65 72 2e 6e 45 78 74 72 61 20 62 79 74 65  ager.nExtra byte
34cb0 73 20 6f 66 20 22 65 78 74 72 61 22 20 73 70 61  s of "extra" spa
34cc0 63 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  ce .** allocated
34cd0 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20   along with the 
34ce0 73 70 65 63 69 66 69 65 64 20 70 61 67 65 2e 0a  specified page..
34cf0 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
34d00 50 61 67 65 72 47 65 74 45 78 74 72 61 28 44 62  PagerGetExtra(Db
34d10 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65  Page *pPg){.  re
34d20 74 75 72 6e 20 70 50 67 2d 3e 70 45 78 74 72 61  turn pPg->pExtra
34d30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73  ;.}../*.** Get/s
34d40 65 74 20 74 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d  et the locking-m
34d50 6f 64 65 20 66 6f 72 20 74 68 69 73 20 70 61 67  ode for this pag
34d60 65 72 2e 20 50 61 72 61 6d 65 74 65 72 20 65 4d  er. Parameter eM
34d70 6f 64 65 20 6d 75 73 74 20 62 65 20 6f 6e 65 0a  ode must be one.
34d80 2a 2a 20 6f 66 20 50 41 47 45 52 5f 4c 4f 43 4b  ** of PAGER_LOCK
34d90 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59 2c 20 50  INGMODE_QUERY, P
34da0 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
34db0 5f 4e 4f 52 4d 41 4c 20 6f 72 20 0a 2a 2a 20 50  _NORMAL or .** P
34dc0 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
34dd0 5f 45 58 43 4c 55 53 49 56 45 2e 20 49 66 20 74  _EXCLUSIVE. If t
34de0 68 65 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  he parameter is 
34df0 6e 6f 74 20 5f 51 55 45 52 59 2c 20 74 68 65 6e  not _QUERY, then
34e00 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 69 6e 67 2d  .** the locking-
34e10 6d 6f 64 65 20 69 73 20 73 65 74 20 74 6f 20 74  mode is set to t
34e20 68 65 20 76 61 6c 75 65 20 73 70 65 63 69 66 69  he value specifi
34e30 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  ed..**.** The re
34e40 74 75 72 6e 65 64 20 76 61 6c 75 65 20 69 73 20  turned value is 
34e50 65 69 74 68 65 72 20 50 41 47 45 52 5f 4c 4f 43  either PAGER_LOC
34e60 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20  KINGMODE_NORMAL 
34e70 6f 72 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f 43 4b  or.** PAGER_LOCK
34e80 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56  INGMODE_EXCLUSIV
34e90 45 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68  E, indicating th
34ea0 65 20 63 75 72 72 65 6e 74 20 28 70 6f 73 73 69  e current (possi
34eb0 62 6c 79 20 75 70 64 61 74 65 64 29 0a 2a 2a 20  bly updated).** 
34ec0 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 2e 0a 2a 2f  locking-mode..*/
34ed0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
34ee0 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 50 61 67  rLockingMode(Pag
34ef0 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
34f00 65 4d 6f 64 65 29 7b 0a 20 20 61 73 73 65 72 74  eMode){.  assert
34f10 28 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c  ( eMode==PAGER_L
34f20 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59  OCKINGMODE_QUERY
34f30 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
34f40 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43  eMode==PAGER_LOC
34f50 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 0a  KINGMODE_NORMAL.
34f60 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65              || e
34f70 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b  Mode==PAGER_LOCK
34f80 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56  INGMODE_EXCLUSIV
34f90 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50  E );.  assert( P
34fa0 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
34fb0 5f 51 55 45 52 59 3c 30 20 29 3b 0a 20 20 61 73  _QUERY<0 );.  as
34fc0 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b  sert( PAGER_LOCK
34fd0 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 3e 3d  INGMODE_NORMAL>=
34fe0 30 20 26 26 20 50 41 47 45 52 5f 4c 4f 43 4b 49  0 && PAGER_LOCKI
34ff0 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45  NGMODE_EXCLUSIVE
35000 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 65 4d 6f  >=0 );.  if( eMo
35010 64 65 3e 3d 30 20 26 26 20 21 70 50 61 67 65 72  de>=0 && !pPager
35020 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20  ->tempFile ){.  
35030 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73    pPager->exclus
35040 69 76 65 4d 6f 64 65 20 3d 20 28 75 38 29 65 4d  iveMode = (u8)eM
35050 6f 64 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ode;.  }.  retur
35060 6e 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 65  n (int)pPager->e
35070 78 63 6c 75 73 69 76 65 4d 6f 64 65 3b 0a 7d 0a  xclusiveMode;.}.
35080 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65 74 20 74  ./*.** Get/set t
35090 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20  he journal-mode 
350a0 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20  for this pager. 
350b0 50 61 72 61 6d 65 74 65 72 20 65 4d 6f 64 65 20  Parameter eMode 
350c0 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 3a 0a  must be one of:.
350d0 2a 2a 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a  **.**    PAGER_J
350e0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59  OURNALMODE_QUERY
350f0 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f 55  .**    PAGER_JOU
35100 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 0a  RNALMODE_DELETE.
35110 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f 55 52  **    PAGER_JOUR
35120 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45  NALMODE_TRUNCATE
35130 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f 55  .**    PAGER_JOU
35140 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
35150 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f 55  .**    PAGER_JOU
35160 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 0a 2a 2a 20  RNALMODE_OFF.** 
35170 20 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c     PAGER_JOURNAL
35180 4d 4f 44 45 5f 4d 45 4d 4f 52 59 0a 2a 2a 20 20  MODE_MEMORY.**  
35190 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d    PAGER_JOURNALM
351a0 4f 44 45 5f 57 41 4c 0a 2a 2a 0a 2a 2a 20 49 66  ODE_WAL.**.** If
351b0 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 20 69   the parameter i
351c0 73 20 6e 6f 74 20 5f 51 55 45 52 59 2c 20 74 68  s not _QUERY, th
351d0 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 5f 6d  en the journal_m
351e0 6f 64 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  ode is set to th
351f0 65 0a 2a 2a 20 76 61 6c 75 65 20 73 70 65 63 69  e.** value speci
35200 66 69 65 64 20 69 66 20 74 68 65 20 63 68 61 6e  fied if the chan
35210 67 65 20 69 73 20 61 6c 6c 6f 77 65 64 2e 20 54  ge is allowed. T
35220 68 65 20 63 68 61 6e 67 65 20 6d 61 79 20 62 65  he change may be
35230 20 64 69 73 61 6c 6c 6f 77 65 64 0a 2a 2a 20 66   disallowed.** f
35240 6f 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  or the following
35250 20 72 65 61 73 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20   reasons:.**.** 
35260 20 20 2a 20 20 41 6e 20 69 6e 2d 6d 65 6d 6f 72    *  An in-memor
35270 79 20 64 61 74 61 62 61 73 65 20 63 61 6e 20 6f  y database can o
35280 6e 6c 79 20 68 61 76 65 20 69 74 73 20 6a 6f 75  nly have its jou
35290 72 6e 61 6c 5f 6d 6f 64 65 20 73 65 74 20 74 6f  rnal_mode set to
352a0 20 5f 4f 46 46 0a 2a 2a 20 20 20 20 20 20 6f 72   _OFF.**      or
352b0 20 5f 4d 45 4d 4f 52 59 2e 0a 2a 2a 0a 2a 2a 20   _MEMORY..**.** 
352c0 20 20 2a 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c    *  The journal
352d0 20 6d 6f 64 65 20 6d 61 79 20 6e 6f 74 20 62 65   mode may not be
352e0 20 63 68 61 6e 67 65 64 20 77 68 69 6c 65 20 61   changed while a
352f0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
35300 61 63 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  active..**.** Th
35310 65 20 72 65 74 75 72 6e 65 64 20 69 6e 64 69 63  e returned indic
35320 61 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ate the current 
35330 28 70 6f 73 73 69 62 6c 79 20 75 70 64 61 74 65  (possibly update
35340 64 29 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 2e  d) journal-mode.
35350 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
35360 61 67 65 72 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28  agerJournalMode(
35370 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
35380 6e 74 20 65 4d 6f 64 65 29 7b 0a 20 20 61 73 73  nt eMode){.  ass
35390 65 72 74 28 20 65 4d 6f 64 65 3d 3d 50 41 47 45  ert( eMode==PAGE
353a0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55  R_JOURNALMODE_QU
353b0 45 52 59 0a 20 20 20 20 20 20 20 20 20 20 20 20  ERY.            
353c0 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  || eMode==PAGER_
353d0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45  JOURNALMODE_DELE
353e0 54 45 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  TE.            |
353f0 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  | eMode==PAGER_J
35400 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43  OURNALMODE_TRUNC
35410 41 54 45 0a 20 20 20 20 20 20 20 20 20 20 20 20  ATE.            
35420 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  || eMode==PAGER_
35430 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53  JOURNALMODE_PERS
35440 49 53 54 0a 20 20 20 20 20 20 20 20 20 20 20 20  IST.            
35450 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  || eMode==PAGER_
35460 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
35470 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
35480 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  eMode==PAGER_JOU
35490 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20  RNALMODE_WAL .  
354a0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f            || eMo
354b0 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
354c0 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 3b 0a  LMODE_MEMORY );.
354d0 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f    assert( PAGER_
354e0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52  JOURNALMODE_QUER
354f0 59 3c 30 20 29 3b 0a 0a 20 20 69 66 28 20 65 4d  Y<0 );..  if( eM
35500 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
35510 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 26  ALMODE_WAL .   &
35520 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
35530 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
35540 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 0a  RNALMODE_DELETE.
35550 20 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d    ){.    pPager-
35560 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50  >journalMode = P
35570 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
35580 5f 57 41 4c 3b 0a 20 20 7d 65 6c 73 65 20 69 66  _WAL;.  }else if
35590 28 20 65 4d 6f 64 65 3e 3d 30 0a 20 20 20 26 26  ( eMode>=0.   &&
355a0 20 28 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   (pPager->tempFi
355b0 6c 65 3d 3d 30 20 7c 7c 20 65 4d 6f 64 65 21 3d  le==0 || eMode!=
355c0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
355d0 45 5f 57 41 4c 29 0a 20 20 20 26 26 20 28 21 4d  E_WAL).   && (!M
355e0 45 4d 44 42 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50  EMDB || eMode==P
355f0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
35600 5f 4d 45 4d 4f 52 59 7c 7c 65 4d 6f 64 65 3d 3d  _MEMORY||eMode==
35610 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
35620 45 5f 4f 46 46 29 0a 20 20 20 26 26 20 21 70 50  E_OFF).   && !pP
35630 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64  ager->dbModified
35640 0a 20 20 20 26 26 20 28 21 69 73 4f 70 65 6e 28  .   && (!isOpen(
35650 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20  pPager->jfd) || 
35660 30 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  0==pPager->journ
35670 61 6c 4f 66 66 29 0a 20 20 29 7b 0a 20 20 20 20  alOff).  ){.    
35680 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
35690 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20  r->jfd) ){.     
356a0 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
356b0 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
356c0 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
356d0 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  (PAGER_JOURNALMO
356e0 44 45 5f 54 52 55 4e 43 41 54 45 20 26 20 31 29  DE_TRUNCATE & 1)
356f0 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==1 );.    asser
35700 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41  t( (PAGER_JOURNA
35710 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20 26 20  LMODE_PERSIST & 
35720 31 29 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73  1)==1 );.    ass
35730 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52  ert( (PAGER_JOUR
35740 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 26  NALMODE_DELETE &
35750 20 31 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73   1)==0 );.    as
35760 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55  sert( (PAGER_JOU
35770 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
35780 26 20 31 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61  & 1)==0 );.    a
35790 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f  ssert( (PAGER_JO
357a0 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 26 20  URNALMODE_OFF & 
357b0 31 29 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  1)==0 );.    if(
357c0 20 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   (pPager->journa
357d0 6c 4d 6f 64 65 20 26 20 31 29 3d 3d 31 20 26 26  lMode & 1)==1 &&
357e0 20 28 65 4d 6f 64 65 20 26 20 31 29 3d 3d 30 0a   (eMode & 1)==0.
357f0 20 20 20 20 20 20 20 20 20 26 26 20 21 70 50 61           && !pPa
35800 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
35810 64 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  de ){.      sqli
35820 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67  te3OsDelete(pPag
35830 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72  er->pVfs, pPager
35840 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a  ->zJournal, 0);.
35850 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 61 67 65      }..    pPage
35860 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d  r->journalMode =
35870 20 28 75 38 29 65 4d 6f 64 65 3b 0a 20 20 7d 0a   (u8)eMode;.  }.
35880 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 70 50    return (int)pP
35890 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
358a0 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f  e;.}../*.** Get/
358b0 73 65 74 20 74 68 65 20 73 69 7a 65 2d 6c 69 6d  set the size-lim
358c0 69 74 20 75 73 65 64 20 66 6f 72 20 70 65 72 73  it used for pers
358d0 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66  istent journal f
358e0 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 74 74  iles..**.** Sett
358f0 69 6e 67 20 74 68 65 20 73 69 7a 65 20 6c 69 6d  ing the size lim
35900 69 74 20 74 6f 20 2d 31 20 6d 65 61 6e 73 20 6e  it to -1 means n
35910 6f 20 6c 69 6d 69 74 20 69 73 20 65 6e 66 6f 72  o limit is enfor
35920 63 65 64 2e 0a 2a 2a 20 41 6e 20 61 74 74 65 6d  ced..** An attem
35930 70 74 20 74 6f 20 73 65 74 20 61 20 6c 69 6d 69  pt to set a limi
35940 74 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 2d  t smaller than -
35950 31 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  1 is a no-op..*/
35960 0a 69 36 34 20 73 71 6c 69 74 65 33 50 61 67 65  .i64 sqlite3Page
35970 72 4a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69  rJournalSizeLimi
35980 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  t(Pager *pPager,
35990 20 69 36 34 20 69 4c 69 6d 69 74 29 7b 0a 20 20   i64 iLimit){.  
359a0 69 66 28 20 69 4c 69 6d 69 74 3e 3d 2d 31 20 29  if( iLimit>=-1 )
359b0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  {.    pPager->jo
359c0 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 3d  urnalSizeLimit =
359d0 20 69 4c 69 6d 69 74 3b 0a 20 20 7d 0a 20 20 72   iLimit;.  }.  r
359e0 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6a 6f  eturn pPager->jo
359f0 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 0a  urnalSizeLimit;.
35a00 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
35a10 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
35a20 20 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70   pPager->pBackup
35a30 20 76 61 72 69 61 62 6c 65 2e 20 54 68 65 20 62   variable. The b
35a40 61 63 6b 75 70 20 6d 6f 64 75 6c 65 0a 2a 2a 20  ackup module.** 
35a50 69 6e 20 62 61 63 6b 75 70 2e 63 20 6d 61 69 6e  in backup.c main
35a60 74 61 69 6e 73 20 74 68 65 20 63 6f 6e 74 65 6e  tains the conten
35a70 74 20 6f 66 20 74 68 69 73 20 76 61 72 69 61 62  t of this variab
35a80 6c 65 2e 20 54 68 69 73 20 6d 6f 64 75 6c 65 0a  le. This module.
35a90 2a 2a 20 75 73 65 73 20 69 74 20 6f 70 61 71 75  ** uses it opaqu
35aa0 65 6c 79 20 61 73 20 61 6e 20 61 72 67 75 6d 65  ely as an argume
35ab0 6e 74 20 74 6f 20 73 71 6c 69 74 65 33 42 61 63  nt to sqlite3Bac
35ac0 6b 75 70 52 65 73 74 61 72 74 28 29 20 61 6e 64  kupRestart() and
35ad0 0a 2a 2a 20 73 71 6c 69 74 65 33 42 61 63 6b 75  .** sqlite3Backu
35ae0 70 55 70 64 61 74 65 28 29 20 6f 6e 6c 79 2e 0a  pUpdate() only..
35af0 2a 2f 0a 73 71 6c 69 74 65 33 5f 62 61 63 6b 75  */.sqlite3_backu
35b00 70 20 2a 2a 73 71 6c 69 74 65 33 50 61 67 65 72  p **sqlite3Pager
35b10 42 61 63 6b 75 70 50 74 72 28 50 61 67 65 72 20  BackupPtr(Pager 
35b20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
35b30 72 6e 20 26 70 50 61 67 65 72 2d 3e 70 42 61 63  rn &pPager->pBac
35b40 6b 75 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  kup;.}../*.** Th
35b50 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
35b60 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 20 75  alled when the u
35b70 73 65 72 20 69 6e 76 6f 6b 65 73 20 22 50 52 41  ser invokes "PRA
35b80 47 4d 41 20 63 68 65 63 6b 70 6f 69 6e 74 22 2e  GMA checkpoint".
35b90 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
35ba0 61 67 65 72 43 68 65 63 6b 70 6f 69 6e 74 28 50  agerCheckpoint(P
35bb0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
35bc0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
35bd0 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65  _OK;.  if( pPage
35be0 72 2d 3e 70 4c 6f 67 20 29 7b 0a 20 20 20 20 75  r->pLog ){.    u
35bf0 38 20 2a 7a 42 75 66 20 3d 20 28 75 38 20 2a 29  8 *zBuf = (u8 *)
35c00 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
35c10 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  e;.    rc = sqli
35c20 74 65 33 4c 6f 67 43 68 65 63 6b 70 6f 69 6e 74  te3LogCheckpoint
35c30 28 70 50 61 67 65 72 2d 3e 70 4c 6f 67 2c 20 70  (pPager->pLog, p
35c40 50 61 67 65 72 2d 3e 66 64 2c 20 0a 20 20 20 20  Pager->fd, .    
35c50 20 20 20 20 28 70 50 61 67 65 72 2d 3e 6e 6f 53      (pPager->noS
35c60 79 6e 63 20 3f 20 30 20 3a 20 70 50 61 67 65 72  ync ? 0 : pPager
35c70 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 2c 0a 20  ->sync_flags),. 
35c80 20 20 20 20 20 20 20 7a 42 75 66 2c 20 70 50 61         zBuf, pPa
35c90 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65  ger->xBusyHandle
35ca0 72 2c 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79  r, pPager->pBusy
35cb0 48 61 6e 64 6c 65 72 41 72 67 0a 20 20 20 20 29  HandlerArg.    )
35cc0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
35cd0 63 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65  c;.}..int sqlite
35ce0 33 50 61 67 65 72 4c 6f 67 43 61 6c 6c 62 61 63  3PagerLogCallbac
35cf0 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  k(Pager *pPager)
35d00 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
35d10 65 33 4c 6f 67 43 61 6c 6c 62 61 63 6b 28 70 50  e3LogCallback(pP
35d20 61 67 65 72 2d 3e 70 4c 6f 67 29 3b 0a 7d 0a 0a  ager->pLog);.}..
35d30 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 63 6f 6e  /*.** Open a con
35d40 6e 65 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 77  nection to the w
35d50 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 20 66  rite-ahead log f
35d60 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70 50  ile for pager pP
35d70 61 67 65 72 2e 20 49 66 0a 2a 2a 20 74 68 65 20  ager. If.** the 
35d80 6c 6f 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  log connection i
35d90 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20  s already open, 
35da0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
35db0 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
35dc0 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20  The caller must 
35dd0 62 65 20 68 6f 6c 64 69 6e 67 20 61 20 53 48 41  be holding a SHA
35de0 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  RED lock on the 
35df0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
35e00 20 63 61 6c 6c 0a 2a 2a 20 74 68 69 73 20 66 75   call.** this fu
35e10 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  nction..*/.int s
35e20 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 4c  qlite3PagerOpenL
35e30 6f 67 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  og(Pager *pPager
35e40 2c 20 69 6e 74 20 2a 70 69 73 4f 70 65 6e 29 7b  , int *pisOpen){
35e50 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
35e60 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
35e70 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
35e80 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  e */..  assert( 
35e90 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
35ea0 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20  AGER_SHARED );. 
35eb0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 70 4c   if( !pPager->pL
35ec0 6f 67 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 4f 70  og ){..    /* Op
35ed0 65 6e 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  en the connectio
35ee0 6e 20 74 6f 20 74 68 65 20 6c 6f 67 20 66 69 6c  n to the log fil
35ef0 65 2e 20 49 66 20 74 68 69 73 20 6f 70 65 72 61  e. If this opera
35f00 74 69 6f 6e 20 66 61 69 6c 73 2c 20 0a 20 20 20  tion fails, .   
35f10 20 2a 2a 20 28 65 2e 67 2e 20 64 75 65 20 74 6f   ** (e.g. due to
35f20 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72   malloc() failur
35f30 65 29 2c 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64  e), unlock the d
35f40 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
35f50 20 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20   .    ** return 
35f60 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20  an error code.. 
35f70 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73     */.    rc = s
35f80 71 6c 69 74 65 33 4c 6f 67 4f 70 65 6e 28 70 50  qlite3LogOpen(pP
35f90 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67  ager->pVfs, pPag
35fa0 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 26  er->zFilename, &
35fb0 70 50 61 67 65 72 2d 3e 70 4c 6f 67 29 3b 0a 20  pPager->pLog);. 
35fc0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
35fd0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50  E_OK ){.      pP
35fe0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
35ff0 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41  e = PAGER_JOURNA
36000 4c 4d 4f 44 45 5f 57 41 4c 3b 0a 20 20 20 20 7d  LMODE_WAL;.    }
36010 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70  .  }else{.    *p
36020 69 73 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 7d 0a  isOpen = 1;.  }.
36030 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
36040 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
36050 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
36060 74 6f 20 63 6c 6f 73 65 20 74 68 65 20 63 6f 6e  to close the con
36070 6e 65 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 6c  nection to the l
36080 6f 67 20 66 69 6c 65 20 70 72 69 6f 72 0a 2a 2a  og file prior.**
36090 20 74 6f 20 73 77 69 74 63 68 69 6e 67 20 66 72   to switching fr
360a0 6f 6d 20 57 41 4c 20 74 6f 20 72 6f 6c 6c 62 61  om WAL to rollba
360b0 63 6b 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 42  ck mode..**.** B
360c0 65 66 6f 72 65 20 63 6c 6f 73 69 6e 67 20 74 68  efore closing th
360d0 65 20 6c 6f 67 20 66 69 6c 65 2c 20 74 68 69 73  e log file, this
360e0 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70   function attemp
360f0 74 73 20 74 6f 20 74 61 6b 65 20 61 6e 20 0a 2a  ts to take an .*
36100 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  * EXCLUSIVE lock
36110 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
36120 20 66 69 6c 65 2e 20 49 66 20 74 68 69 73 20 63   file. If this c
36130 61 6e 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65  annot be obtaine
36140 64 2c 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 28  d, an.** error (
36150 53 51 4c 49 54 45 5f 42 55 53 59 29 20 69 73 20  SQLITE_BUSY) is 
36160 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65  returned and the
36170 20 6c 6f 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   log connection 
36180 69 73 20 6e 6f 74 20 63 6c 6f 73 65 64 2e 0a 2a  is not closed..*
36190 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
361a0 20 74 68 65 20 45 58 43 4c 55 53 49 56 45 20 6c   the EXCLUSIVE l
361b0 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65 6c 65 61  ock is not relea
361c0 73 65 64 20 62 65 66 6f 72 65 20 72 65 74 75 72  sed before retur
361d0 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ning..*/.int sql
361e0 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 4c 6f  ite3PagerCloseLo
361f0 67 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  g(Pager *pPager)
36200 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
36210 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
36220 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
36230 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
36240 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 29 3b  URNALMODE_WAL );
36250 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6c 6f  ..  /* If the lo
36260 67 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 6c  g file is not al
36270 72 65 61 64 79 20 6f 70 65 6e 2c 20 62 75 74 20  ready open, but 
36280 64 6f 65 73 20 65 78 69 73 74 20 69 6e 20 74 68  does exist in th
36290 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 0a 20  e file-system,. 
362a0 20 2a 2a 20 69 74 20 6d 61 79 20 6e 65 65 64 20   ** it may need 
362b0 74 6f 20 62 65 20 63 68 65 63 6b 70 6f 69 6e 74  to be checkpoint
362c0 65 64 20 62 65 66 6f 72 65 20 74 68 65 20 63 6f  ed before the co
362d0 6e 6e 65 63 74 69 6f 6e 20 63 61 6e 20 73 77 69  nnection can swi
362e0 74 63 68 20 74 6f 0a 20 20 2a 2a 20 72 6f 6c 6c  tch to.  ** roll
362f0 62 61 63 6b 20 6d 6f 64 65 2e 20 4f 70 65 6e 20  back mode. Open 
36300 69 74 20 6e 6f 77 20 73 6f 20 74 68 69 73 20 63  it now so this c
36310 61 6e 20 68 61 70 70 65 6e 2e 0a 20 20 2a 2f 0a  an happen..  */.
36320 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 70    if( !pPager->p
36330 4c 6f 67 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c  Log ){.    int l
36340 6f 67 65 78 69 73 74 73 20 3d 20 30 3b 0a 20 20  ogexists = 0;.  
36350 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
36360 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  Lock(pPager->fd,
36370 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 53 48 41   SQLITE_LOCK_SHA
36380 52 45 44 29 3b 0a 20 20 20 20 69 66 28 20 72 63  RED);.    if( rc
36390 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
363a0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 48       rc = pagerH
363b0 61 73 57 41 4c 28 70 50 61 67 65 72 2c 20 26 6c  asWAL(pPager, &l
363c0 6f 67 65 78 69 73 74 73 29 3b 0a 20 20 20 20 7d  ogexists);.    }
363d0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
363e0 49 54 45 5f 4f 4b 20 26 26 20 6c 6f 67 65 78 69  ITE_OK && logexi
363f0 73 74 73 20 29 7b 0a 20 20 20 20 20 20 72 63 20  sts ){.      rc 
36400 3d 20 73 71 6c 69 74 65 33 4c 6f 67 4f 70 65 6e  = sqlite3LogOpen
36410 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70  (pPager->pVfs, p
36420 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
36430 2c 20 26 70 50 61 67 65 72 2d 3e 70 4c 6f 67 29  , &pPager->pLog)
36440 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 20 20  ;.    }.  }.    
36450 0a 20 20 2f 2a 20 43 68 65 63 6b 70 6f 69 6e 74  .  /* Checkpoint
36460 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 20 6c   and close the l
36470 6f 67 2e 20 42 65 63 61 75 73 65 20 61 6e 20 45  og. Because an E
36480 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73  XCLUSIVE lock is
36490 20 68 65 6c 64 20 6f 6e 0a 20 20 2a 2a 20 74 68   held on.  ** th
364a0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
364b0 20 74 68 65 20 6c 6f 67 20 61 6e 64 20 6c 6f 67   the log and log
364c0 2d 73 75 6d 6d 61 72 79 20 66 69 6c 65 73 20 77  -summary files w
364d0 69 6c 6c 20 62 65 20 64 65 6c 65 74 65 64 2e 0a  ill be deleted..
364e0 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53    */.  if( rc==S
364f0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67  QLITE_OK && pPag
36500 65 72 2d 3e 70 4c 6f 67 20 29 7b 0a 20 20 20 20  er->pLog ){.    
36510 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f  rc = sqlite3OsLo
36520 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53  ck(pPager->fd, S
36530 51 4c 49 54 45 5f 4c 4f 43 4b 5f 45 58 43 4c 55  QLITE_LOCK_EXCLU
36540 53 49 56 45 29 3b 0a 20 20 20 20 69 66 28 20 72  SIVE);.    if( r
36550 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
36560 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
36570 65 33 4c 6f 67 43 6c 6f 73 65 28 70 50 61 67 65  e3LogClose(pPage
36580 72 2d 3e 70 4c 6f 67 2c 20 70 50 61 67 65 72 2d  r->pLog, pPager-
36590 3e 66 64 2c 0a 20 20 20 20 20 20 20 20 28 70 50  >fd,.        (pP
365a0 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3f 20 30  ager->noSync ? 0
365b0 20 3a 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f   : pPager->sync_
365c0 66 6c 61 67 73 29 2c 20 0a 20 20 20 20 20 20 20  flags), .       
365d0 20 28 75 38 2a 29 70 50 61 67 65 72 2d 3e 70 54   (u8*)pPager->pT
365e0 6d 70 53 70 61 63 65 0a 20 20 20 20 20 20 29 3b  mpSpace.      );
365f0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70  .      pPager->p
36600 4c 6f 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  Log = 0;.    }. 
36610 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
36620 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  }..#endif /* SQL
36630 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 20  ITE_OMIT_DISKIO 
36640 2a 2f 0a                                         */.