/ Hex Artifact Content
Login

Artifact b48eb75d41fd1bce0e9911209785aef4381258ef:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
0340: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
0350: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0360: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  Int.h".#include 
0370: 22 77 61 6c 2e 68 22 0a 0a 2f 2a 0a 2a 2a 2a 2a  "wal.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 50 61 67 65 72  ./*.** The Pager
1480: 2e 65 53 74 61 74 65 20 76 61 72 69 61 62 6c 65  .eState variable
1490: 20 73 74 6f 72 65 73 20 74 68 65 20 63 75 72 72   stores the curr
14a0: 65 6e 74 20 27 73 74 61 74 65 27 20 6f 66 20 61  ent 'state' of a
14b0: 20 70 61 67 65 72 2e 20 41 0a 2a 2a 20 70 61 67   pager. A.** pag
14c0: 65 72 20 6d 61 79 20 62 65 20 69 6e 20 61 6e 79  er may be in any
14d0: 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c   one of the foll
14e0: 6f 77 69 6e 67 20 73 69 78 20 73 74 61 74 65 73  owing six states
14f0: 3a 0a 2a 2a 0a 2a 2a 20 20 4e 4f 4e 45 3a 0a 2a  :.**.**  NONE:.*
1500: 2a 0a 2a 2a 20 20 20 20 54 68 65 20 70 61 67 65  *.**    The page
1510: 72 20 73 74 61 72 74 73 20 75 70 20 69 6e 20 74  r starts up in t
1520: 68 69 73 20 73 74 61 74 65 2e 20 4e 6f 74 68 69  his state. Nothi
1530: 6e 67 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  ng is guaranteed
1540: 20 69 6e 20 74 68 69 73 0a 2a 2a 20 20 20 20 73   in this.**    s
1550: 74 61 74 65 20 2d 20 74 68 65 20 66 69 6c 65 20  tate - the file 
1560: 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62  may or may not b
1570: 65 20 6c 6f 63 6b 65 64 20 61 6e 64 20 74 68 65  e locked and the
1580: 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 69   database size i
1590: 73 0a 2a 2a 20 20 20 20 75 6e 6b 6e 6f 77 6e 2e  s.**    unknown.
15a0: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 6d 61   The database ma
15b0: 79 20 6e 6f 74 20 62 65 20 72 65 61 64 20 6f 72  y not be read or
15c0: 20 77 72 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20   written..**.** 
15d0: 20 20 20 2a 20 4e 6f 20 72 65 61 64 20 6f 72 20     * No read or 
15e0: 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
15f0: 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20  n is active..** 
1600: 20 20 20 2a 20 41 6e 79 20 6c 6f 63 6b 2c 20 6f     * Any lock, o
1610: 72 20 6e 6f 20 6c 6f 63 6b 20 61 74 20 61 6c 6c  r no lock at all
1620: 2c 20 6d 61 79 20 62 65 20 68 65 6c 64 20 6f 6e  , may be held on
1630: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1640: 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  le..**    * The 
1650: 64 62 53 69 7a 65 2c 20 64 62 4f 72 69 67 53 69  dbSize, dbOrigSi
1660: 7a 65 20 61 6e 64 20 64 62 46 69 6c 65 53 69 7a  ze and dbFileSiz
1670: 65 20 76 61 72 69 61 62 6c 65 73 20 6d 61 79 20  e variables may 
1680: 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e 0a  not be trusted..
1690: 2a 2a 0a 2a 2a 20 20 52 45 41 44 45 52 3a 0a 2a  **.**  READER:.*
16a0: 2a 0a 2a 2a 20 20 20 20 49 6e 20 74 68 69 73 20  *.**    In this 
16b0: 73 74 61 74 65 20 61 6c 6c 20 74 68 65 20 72 65  state all the re
16c0: 71 75 69 72 65 6d 65 6e 74 73 20 66 6f 72 20 72  quirements for r
16d0: 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 62  eading the datab
16e0: 61 73 65 20 69 6e 20 0a 2a 2a 20 20 20 20 72 6f  ase in .**    ro
16f0: 6c 6c 62 61 63 6b 20 28 6e 6f 6e 2d 57 41 4c 29  llback (non-WAL)
1700: 20 6d 6f 64 65 20 61 72 65 20 6d 65 74 2e 20 55   mode are met. U
1710: 6e 6c 65 73 73 20 74 68 65 20 70 61 67 65 72 20  nless the pager 
1720: 69 73 20 28 6f 72 20 72 65 63 65 6e 74 6c 79 0a  is (or recently.
1730: 2a 2a 20 20 20 20 77 61 73 29 20 69 6e 20 65 78  **    was) in ex
1740: 63 6c 75 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20  clusive-locking 
1750: 6d 6f 64 65 2c 20 61 20 75 73 65 72 2d 6c 65 76  mode, a user-lev
1760: 65 6c 20 72 65 61 64 20 74 72 61 6e 73 61 63 74  el read transact
1770: 69 6f 6e 20 69 73 20 0a 2a 2a 20 20 20 20 6f 70  ion is .**    op
1780: 65 6e 2e 20 54 68 65 20 64 61 74 61 62 61 73 65  en. The database
1790: 20 73 69 7a 65 20 69 73 20 6b 6e 6f 77 6e 20 69   size is known i
17a0: 6e 20 74 68 69 73 20 73 74 61 74 65 2e 0a 2a 2a  n this state..**
17b0: 20 0a 2a 2a 20 20 20 20 2a 20 41 20 72 65 61 64   .**    * A read
17c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79   transaction may
17d0: 20 62 65 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20   be active..**  
17e0: 20 20 2a 20 41 20 53 48 41 52 45 44 20 6f 72 20    * A SHARED or 
17f0: 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73 20  greater lock is 
1800: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
1810: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20  base file..**   
1820: 20 2a 20 54 68 65 20 64 62 53 69 7a 65 20 76 61   * The dbSize va
1830: 72 69 61 62 6c 65 20 6d 61 79 20 62 65 20 74 72  riable may be tr
1840: 75 73 74 65 64 20 28 65 76 65 6e 20 69 66 20 61  usted (even if a
1850: 20 75 73 65 72 2d 6c 65 76 65 6c 20 72 65 61 64   user-level read
1860: 20 0a 2a 2a 20 20 20 20 20 20 74 72 61 6e 73 61   .**      transa
1870: 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20 61 63 74  ction is not act
1880: 69 76 65 29 2e 20 54 68 65 20 64 62 4f 72 69 67  ive). The dbOrig
1890: 53 69 7a 65 20 61 6e 64 20 64 62 46 69 6c 65 53  Size and dbFileS
18a0: 69 7a 65 20 76 61 72 69 61 62 6c 65 73 0a 2a 2a  ize variables.**
18b0: 20 20 20 20 20 20 6d 61 79 20 6e 6f 74 20 62 65        may not be
18c0: 20 74 72 75 73 74 65 64 20 61 74 20 74 68 69 73   trusted at this
18d0: 20 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 57   point..**.**  W
18e0: 52 49 54 45 52 5f 49 4e 49 54 49 41 4c 3a 0a 2a  RITER_INITIAL:.*
18f0: 2a 0a 2a 2a 20 20 20 20 2a 20 41 20 77 72 69 74  *.**    * A writ
1900: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
1910: 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a   active..**    *
1920: 20 41 20 52 45 53 45 52 56 45 44 20 6f 72 20 67   A RESERVED or g
1930: 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73 20 68  reater lock is h
1940: 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62  eld on the datab
1950: 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20  ase file..**    
1960: 2a 20 54 68 65 20 64 62 53 69 7a 65 2c 20 64 62  * The dbSize, db
1970: 4f 72 69 67 53 69 7a 65 20 61 6e 64 20 64 62 46  OrigSize and dbF
1980: 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c 65  ileSize variable
1990: 73 20 61 72 65 20 61 6c 6c 20 76 61 6c 69 64 2e  s are all valid.
19a0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 63 6f 6e  .**    * The con
19b0: 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
19c0: 65 72 20 63 61 63 68 65 20 68 61 76 65 20 6e 6f  er cache have no
19d0: 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e  t been modified.
19e0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f 75  .**    * The jou
19f0: 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f 72  rnal file may or
1a00: 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 70 65 6e   may not be open
1a10: 2e 0a 2a 2a 20 20 20 20 2a 20 4e 6f 74 68 69 6e  ..**    * Nothin
1a20: 67 20 28 6e 6f 74 20 65 76 65 6e 20 74 68 65 20  g (not even the 
1a30: 66 69 72 73 74 20 68 65 61 64 65 72 29 20 68 61  first header) ha
1a40: 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  s been written t
1a50: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  o the journal..*
1a60: 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f 43 41 43  *.**  WRITER_CAC
1a70: 48 45 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  HEMOD:.**.**    
1a80: 2a 20 41 20 77 72 69 74 65 20 74 72 61 6e 73 61  * A write transa
1a90: 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e  ction is active.
1aa0: 0a 2a 2a 20 20 20 20 2a 20 41 20 52 45 53 45 52  .**    * A RESER
1ab0: 56 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c  VED or greater l
1ac0: 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74  ock is held on t
1ad0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1ae0: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f  ..**    * The jo
1af0: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70  urnal file is op
1b00: 65 6e 20 61 6e 64 20 74 68 65 20 66 69 72 73 74  en and the first
1b10: 20 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e   header has been
1b20: 20 77 72 69 74 74 65 6e 20 0a 2a 2a 20 20 20 20   written .**    
1b30: 20 20 74 6f 20 69 74 2c 20 62 75 74 20 74 68 65    to it, but the
1b40: 20 68 65 61 64 65 72 20 68 61 73 20 6e 6f 74 20   header has not 
1b50: 62 65 65 6e 20 73 79 6e 63 65 64 20 74 6f 20 64  been synced to d
1b60: 69 73 6b 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65  isk..**    * The
1b70: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
1b80: 20 70 61 67 65 20 63 61 63 68 65 20 68 61 76 65   page cache have
1b90: 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 0a   been modified..
1ba0: 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f 44 42  **.**  WRITER_DB
1bb0: 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  MOD:.**.**    * 
1bc0: 41 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  A write transact
1bd0: 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a  ion is active..*
1be0: 2a 20 20 20 20 2a 20 41 6e 20 45 58 43 4c 55 53  *    * An EXCLUS
1bf0: 49 56 45 20 6f 72 20 67 72 65 61 74 65 72 20 6c  IVE or greater l
1c00: 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74  ock is held on t
1c10: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1c20: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f  ..**    * The jo
1c30: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70  urnal file is op
1c40: 65 6e 20 61 6e 64 20 74 68 65 20 66 69 72 73 74  en and the first
1c50: 20 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e   header has been
1c60: 20 77 72 69 74 74 65 6e 20 0a 2a 2a 20 20 20 20   written .**    
1c70: 20 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20    and synced to 
1c80: 64 69 73 6b 2e 0a 2a 2a 20 20 20 20 2a 20 54 68  disk..**    * Th
1c90: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
1ca0: 65 20 70 61 67 65 20 63 61 63 68 65 20 68 61 76  e page cache hav
1cb0: 65 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20  e been modified 
1cc0: 28 61 6e 64 20 70 6f 73 73 69 62 6c 79 0a 2a 2a  (and possibly.**
1cd0: 20 20 20 20 20 20 77 72 69 74 74 65 6e 20 74 6f        written to
1ce0: 20 64 69 73 6b 29 2e 0a 2a 2a 0a 2a 2a 20 20 57   disk)..**.**  W
1cf0: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 3a 0a  RITER_FINISHED:.
1d00: 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41 20 77 72 69  **.**    * A wri
1d10: 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te transaction i
1d20: 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20  s active..**    
1d30: 2a 20 41 6e 20 45 58 43 4c 55 53 49 56 45 20 6f  * An EXCLUSIVE o
1d40: 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 69  r greater lock i
1d50: 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61  s held on the da
1d60: 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20  tabase file..** 
1d70: 20 20 20 2a 20 41 6c 6c 20 77 72 69 74 69 6e 67     * All writing
1d80: 20 61 6e 64 20 73 79 6e 63 69 6e 67 20 6f 66 20   and syncing of 
1d90: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 64 61 74 61  journal and data
1da0: 62 61 73 65 20 64 61 74 61 20 68 61 73 20 66 69  base data has fi
1db0: 6e 69 73 68 65 64 2e 0a 2a 2a 20 20 20 20 20 20  nished..**      
1dc0: 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75  If no error occu
1dd0: 72 65 64 2c 20 61 6c 6c 20 74 68 61 74 20 72 65  red, all that re
1de0: 6d 61 69 6e 73 20 69 73 20 74 6f 20 66 69 6e 61  mains is to fina
1df0: 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lize the journal
1e00: 20 74 6f 0a 2a 2a 20 20 20 20 20 20 63 6f 6d 6d   to.**      comm
1e10: 69 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  it the transacti
1e20: 6f 6e 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  on. If an error 
1e30: 64 69 64 20 6f 63 63 75 72 2c 20 74 68 65 20 63  did occur, the c
1e40: 61 6c 6c 65 72 20 77 69 6c 6c 20 6e 65 65 64 0a  aller will need.
1e50: 2a 2a 20 20 20 20 20 20 74 6f 20 72 6f 6c 6c 62  **      to rollb
1e60: 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74  ack the transact
1e70: 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 20 45 52 52  ion. .**.**  ERR
1e80: 4f 52 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 54 68 65  OR:.**.**    The
1e90: 20 45 52 52 4f 52 20 73 74 61 74 65 20 69 73 20   ERROR state is 
1ea0: 65 6e 74 65 72 65 64 20 77 68 65 6e 20 61 6e 20  entered when an 
1eb0: 49 4f 2c 20 4f 4f 4d 20 6f 72 20 64 69 73 6b 2d  IO, OOM or disk-
1ec0: 66 75 6c 6c 20 65 72 72 6f 72 20 0a 2a 2a 20 20  full error .**  
1ed0: 20 20 6f 63 63 75 72 73 20 61 74 20 61 20 70 6f    occurs at a po
1ee0: 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65 20  int in the code 
1ef0: 74 68 61 74 20 6d 61 6b 65 73 20 69 74 20 64 69  that makes it di
1f00: 66 66 69 63 75 6c 74 20 74 6f 20 62 65 20 73 75  fficult to be su
1f10: 72 65 0a 2a 2a 20 20 20 20 74 68 61 74 20 74 68  re.**    that th
1f20: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  e in-memory page
1f30: 72 20 73 74 61 74 65 20 28 63 61 63 68 65 20 63  r state (cache c
1f40: 6f 6e 74 65 6e 74 73 2c 20 64 62 20 73 69 7a 65  ontents, db size
1f50: 20 65 74 63 2e 29 20 61 72 65 0a 2a 2a 20 20 20   etc.) are.**   
1f60: 20 63 6f 6e 73 69 73 74 65 6e 74 20 77 69 74 68   consistent with
1f70: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
1f80: 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
1f90: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 6f 72 20 65  ..**.**    For e
1fa0: 78 61 6d 70 6c 65 2c 20 69 66 20 61 6e 20 49 4f  xample, if an IO
1fb0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
1fc0: 69 6c 65 20 70 65 72 66 6f 72 6d 69 6e 67 20 61  ile performing a
1fd0: 20 72 6f 6c 6c 62 61 63 6b 2c 20 0a 2a 2a 20 20   rollback, .**  
1fe0: 20 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f    the contents o
1ff0: 66 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  f the page-cache
2000: 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20   may be left in 
2010: 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  an inconsistent 
2020: 73 74 61 74 65 2e 0a 2a 2a 20 20 20 20 41 74 20  state..**    At 
2030: 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 77 6f  this point it wo
2040: 75 6c 64 20 62 65 20 64 61 6e 67 65 72 6f 75 73  uld be dangerous
2050: 20 74 6f 20 63 68 61 6e 67 65 20 62 61 63 6b 20   to change back 
2060: 74 6f 20 52 45 41 44 45 52 20 73 74 61 74 65 0a  to READER state.
2070: 2a 2a 20 20 20 20 28 61 73 20 75 73 75 61 6c 6c  **    (as usuall
2080: 79 20 68 61 70 70 65 6e 73 20 61 66 74 65 72 20  y happens after 
2090: 61 20 72 6f 6c 6c 62 61 63 6b 29 2e 20 41 6e 79  a rollback). Any
20a0: 20 73 75 62 73 65 71 75 65 6e 74 20 72 65 61 64   subsequent read
20b0: 65 72 73 20 6d 69 67 68 74 0a 2a 2a 20 20 20 20  ers might.**    
20c0: 72 65 70 6f 72 74 20 64 61 74 61 62 61 73 65 20  report database 
20d0: 63 6f 72 72 75 70 74 69 6f 6e 20 28 64 75 65 20  corruption (due 
20e0: 74 6f 20 74 68 65 20 69 6e 63 6f 6e 73 69 73 74  to the inconsist
20f0: 65 6e 74 20 63 61 63 68 65 29 2c 20 61 6e 64 20  ent cache), and 
2100: 69 66 0a 2a 2a 20 20 20 20 74 68 65 79 20 75 70  if.**    they up
2110: 67 72 61 64 65 20 74 6f 20 77 72 69 74 65 72 73  grade to writers
2120: 2c 20 74 68 65 79 20 6d 61 79 20 69 6e 61 64 76  , they may inadv
2130: 65 72 74 65 6e 74 6c 79 20 63 6f 72 72 75 70 74  ertently corrupt
2140: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
2150: 20 20 20 20 66 69 6c 65 2e 20 54 6f 20 61 76 6f      file. To avo
2160: 69 64 20 74 68 69 73 20 68 61 7a 61 72 64 2c 20  id this hazard, 
2170: 74 68 65 20 70 61 67 65 72 20 73 77 69 74 63 68  the pager switch
2180: 65 73 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  es into the ERRO
2190: 52 20 73 74 61 74 65 0a 2a 2a 20 20 20 20 69 6e  R state.**    in
21a0: 73 74 65 61 64 20 6f 66 20 52 45 41 44 45 52 20  stead of READER 
21b0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 75 63 68 20 61  following such a
21c0: 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20  n error..**.**  
21d0: 20 20 4f 6e 63 65 20 69 74 20 68 61 73 20 65 6e    Once it has en
21e0: 74 65 72 65 64 20 74 68 65 20 45 52 52 4f 52 20  tered the ERROR 
21f0: 73 74 61 74 65 2c 20 61 6e 79 20 61 74 74 65 6d  state, any attem
2200: 70 74 20 74 6f 20 75 73 65 20 74 68 65 20 70 61  pt to use the pa
2210: 67 65 72 0a 2a 2a 20 20 20 20 74 6f 20 72 65 61  ger.**    to rea
2220: 64 20 6f 72 20 77 72 69 74 65 20 64 61 74 61 20  d or write data 
2230: 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72  returns an error
2240: 2e 20 45 76 65 6e 74 75 61 6c 6c 79 2c 20 6f 6e  . Eventually, on
2250: 63 65 20 61 6c 6c 20 0a 2a 2a 20 20 20 20 6f 75  ce all .**    ou
2260: 74 73 74 61 6e 64 69 6e 67 20 74 72 61 6e 73 61  tstanding transa
2270: 63 74 69 6f 6e 73 20 68 61 76 65 20 62 65 65 6e  ctions have been
2280: 20 61 62 61 6e 64 6f 6e 65 64 2c 20 74 68 65 20   abandoned, the 
2290: 70 61 67 65 72 20 69 73 20 61 62 6c 65 20 74 6f  pager is able to
22a0: 0a 2a 2a 20 20 20 20 74 72 61 6e 73 69 74 69 6f  .**    transitio
22b0: 6e 20 62 61 63 6b 20 74 6f 20 4e 4f 4e 45 20 73  n back to NONE s
22c0: 74 61 74 65 2c 20 64 69 73 63 61 72 64 69 6e 67  tate, discarding
22d0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
22e0: 20 74 68 65 20 0a 2a 2a 20 20 20 20 70 61 67 65   the .**    page
22f0: 2d 63 61 63 68 65 20 61 6e 64 20 61 6e 79 20 6f  -cache and any o
2300: 74 68 65 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 73  ther in-memory s
2310: 74 61 74 65 20 61 74 20 74 68 65 20 73 61 6d 65  tate at the same
2320: 20 74 69 6d 65 2e 20 45 76 65 72 79 74 68 69 6e   time. Everythin
2330: 67 0a 2a 2a 20 20 20 20 69 73 20 72 65 6c 6f 61  g.**    is reloa
2340: 64 65 64 20 66 72 6f 6d 20 64 69 73 6b 20 28 61  ded from disk (a
2350: 6e 64 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79  nd, if necessary
2360: 2c 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  , hot-journal ro
2370: 6c 6c 62 61 63 6b 20 70 65 66 6f 72 6d 65 64 29  llback peformed)
2380: 0a 2a 2a 20 20 20 20 77 68 65 6e 20 61 20 72 65  .**    when a re
2390: 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ad-transaction i
23a0: 73 20 6e 65 78 74 20 6f 70 65 6e 65 64 20 6f 6e  s next opened on
23b0: 20 74 68 65 20 70 61 67 65 72 20 28 74 72 61 6e   the pager (tran
23c0: 73 69 74 69 6f 6e 69 6e 67 0a 2a 2a 20 20 20 20  sitioning.**    
23d0: 74 68 65 20 70 61 67 65 72 20 69 6e 74 6f 20 52  the pager into R
23e0: 45 41 44 45 52 20 73 74 61 74 65 29 2e 20 41 74  EADER state). At
23f0: 20 74 68 61 74 20 70 6f 69 6e 74 20 74 68 65 20   that point the 
2400: 73 79 73 74 65 6d 20 68 61 73 20 72 65 63 6f 76  system has recov
2410: 65 72 65 64 20 0a 2a 2a 20 20 20 20 66 72 6f 6d  ered .**    from
2420: 20 74 68 65 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a   the error..**.*
2430: 2a 20 20 20 20 53 70 65 63 69 66 69 63 61 6c 6c  *    Specificall
2440: 79 2c 20 74 68 65 20 70 61 67 65 72 20 6a 75 6d  y, the pager jum
2450: 70 73 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  ps into the ERRO
2460: 52 20 73 74 61 74 65 20 69 66 3a 0a 2a 2a 0a 2a  R state if:.**.*
2470: 2a 20 20 20 20 20 20 31 2e 20 41 6e 20 65 72 72  *      1. An err
2480: 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
2490: 61 74 74 65 6d 70 74 69 6e 67 20 61 20 72 6f 6c  attempting a rol
24a0: 6c 62 61 63 6b 2e 20 54 68 69 73 20 68 61 70 70  lback. This happ
24b0: 65 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 20 20 20  ens in.**       
24c0: 20 20 66 75 6e 63 74 69 6f 6e 20 73 71 6c 69 74    function sqlit
24d0: 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
24e0: 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 32 2e  )..**.**      2.
24f0: 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   An error occurs
2500: 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74 69 6e   while attemptin
2510: 67 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 61 20  g to finalize a 
2520: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
2530: 20 20 20 20 20 20 20 20 66 6f 6c 6c 6f 77 69 6e          followin
2540: 67 20 61 20 63 6f 6d 6d 69 74 20 69 6e 20 66 75  g a commit in fu
2550: 6e 63 74 69 6f 6e 20 73 71 6c 69 74 65 33 50 61  nction sqlite3Pa
2560: 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  gerCommitPhaseTw
2570: 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  o()..**.**      
2580: 33 2e 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75  3. An error occu
2590: 72 73 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74  rs while attempt
25a0: 69 6e 67 20 74 6f 20 77 72 69 74 65 20 74 6f 20  ing to write to 
25b0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 0a 2a  the journal or.*
25c0: 2a 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61  *         databa
25d0: 73 65 20 66 69 6c 65 20 69 6e 20 66 75 6e 63 74  se file in funct
25e0: 69 6f 6e 20 70 61 67 65 72 53 74 72 65 73 73 28  ion pagerStress(
25f0: 29 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 72  ) in order to fr
2600: 65 65 20 75 70 0a 2a 2a 20 20 20 20 20 20 20 20  ee up.**        
2610: 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 20   memory..**.**  
2620: 20 20 49 6e 20 6f 74 68 65 72 20 63 61 73 65 73    In other cases
2630: 2c 20 74 68 65 20 65 72 72 6f 72 20 69 73 20 72  , the error is r
2640: 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 62  eturned to the b
2650: 2d 74 72 65 65 20 6c 61 79 65 72 2e 20 54 68 65  -tree layer. The
2660: 20 62 2d 74 72 65 65 0a 2a 2a 20 20 20 20 6c 61   b-tree.**    la
2670: 79 65 72 20 74 68 65 6e 20 61 74 74 65 6d 70 74  yer then attempt
2680: 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65  s a rollback ope
2690: 72 61 74 69 6f 6e 2e 20 49 66 20 74 68 65 20 65  ration. If the e
26a0: 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 0a  rror condition .
26b0: 2a 2a 20 20 20 20 70 65 72 73 69 73 74 73 2c 20  **    persists, 
26c0: 74 68 65 20 70 61 67 65 72 20 65 6e 74 65 72 73  the pager enters
26d0: 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
26e0: 20 76 69 61 20 63 6f 6e 64 69 74 69 6f 6e 20 28   via condition (
26f0: 31 29 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20  1) above..**.** 
2700: 20 20 20 43 6f 6e 64 69 74 69 6f 6e 20 28 33 29     Condition (3)
2710: 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 62 65   is necessary be
2720: 63 61 75 73 65 20 69 74 20 63 61 6e 20 62 65 20  cause it can be 
2730: 74 72 69 67 67 65 72 65 64 20 62 79 20 61 20 72  triggered by a r
2740: 65 61 64 2d 6f 6e 6c 79 0a 2a 2a 20 20 20 20 73  ead-only.**    s
2750: 74 61 74 65 6d 65 6e 74 20 65 78 65 63 75 74 65  tatement execute
2760: 64 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73  d within a trans
2770: 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20  action. In this 
2780: 63 61 73 65 2c 20 69 66 20 74 68 65 20 65 72 72  case, if the err
2790: 6f 72 0a 2a 2a 20 20 20 20 63 6f 64 65 20 77 65  or.**    code we
27a0: 72 65 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e  re simply return
27b0: 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 2c 20  ed to the user, 
27c0: 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72  the b-tree layer
27d0: 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20   would not.**   
27e0: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61   automatically a
27f0: 74 74 65 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63  ttempt a rollbac
2800: 6b 2c 20 61 73 20 69 74 20 61 73 73 75 6d 65 73  k, as it assumes
2810: 20 74 68 61 74 20 61 6e 20 65 72 72 6f 72 20 69   that an error i
2820: 6e 20 61 0a 2a 2a 20 20 20 20 72 65 61 64 2d 6f  n a.**    read-o
2830: 6e 6c 79 20 73 74 61 74 65 6d 65 6e 74 20 63 61  nly statement ca
2840: 6e 6e 6f 74 20 6c 65 61 76 65 20 74 68 65 20 70  nnot leave the p
2850: 61 67 65 72 20 69 6e 20 61 6e 20 69 6e 74 65 72  ager in an inter
2860: 6e 61 6c 6c 79 20 69 6e 63 6f 6e 73 69 73 74 65  nally inconsiste
2870: 6e 74 20 0a 2a 2a 20 20 20 20 73 74 61 74 65 2e  nt .**    state.
2880: 0a 2a 2a 20 20 20 20 0a 2a 2a 0a 2a 2a 20 53 74  .**    .**.** St
2890: 61 74 65 20 64 69 61 67 72 61 6d 3a 0a 2a 2a 0a  ate diagram:.**.
28a0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
28b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4e 4f                NO
28c0: 4e 45 20 3c 2d 2d 2d 2d 2d 2d 2b 2d 2d 2d 2d 2d  NE <------+-----
28d0: 2d 2b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  -+.**           
28e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28f0: 20 20 20 7c 20 20 20 20 20 20 20 20 20 7c 20 20     |         |  
2900: 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20      |.**        
2910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2920: 20 20 20 20 20 20 56 20 20 20 20 20 20 20 20 20        V         
2930: 7c 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20  |      |.**     
2940: 20 20 20 20 20 20 20 20 20 20 2b 2d 2d 2d 2d 2d            +-----
2950: 2d 2d 2d 2d 3e 20 52 45 41 44 45 52 2d 2d 2d 2d  ----> READER----
2960: 2d 2d 2d 2b 20 20 20 20 20 20 7c 0a 2a 2a 20 20  ---+      |.**  
2970: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20               |  
2980: 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20              |   
2990: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a               |.*
29a0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
29b0: 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56  |              V
29c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29d0: 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  |.**            
29e0: 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d 2d 57 52 49 54     |<-------WRIT
29f0: 45 52 5f 49 4e 49 54 49 41 4c 2d 2d 2d 2d 2d 3e  ER_INITIAL----->
2a00: 20 45 52 52 4f 52 0a 2a 2a 20 20 20 20 20 20 20   ERROR.**       
2a10: 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20          |       
2a20: 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20         |        
2a30: 20 20 20 20 20 20 20 20 5e 20 20 0a 2a 2a 20 20          ^  .**  
2a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20               |  
2a50: 20 20 20 20 20 20 20 20 20 20 20 20 56 20 20 20              V   
2a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a               |.*
2a70: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
2a80: 7c 3c 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52 5f 43  |<------WRITER_C
2a90: 41 43 48 45 4d 4f 44 2d 2d 2d 2d 2d 2d 2d 2d 3e  ACHEMOD-------->
2aa0: 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  |.**            
2ab0: 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20     |            
2ac0: 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20    |             
2ad0: 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20     |.**         
2ae0: 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20        |         
2af0: 20 20 20 20 20 56 20 20 20 20 20 20 20 20 20 20       V          
2b00: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
2b10: 20 20 20 20 20 20 20 20 20 7c 3c 2d 2d 2d 2d 2d           |<-----
2b20: 2d 2d 57 52 49 54 45 52 5f 44 42 4d 4f 44 2d 2d  --WRITER_DBMOD--
2b30: 2d 2d 2d 2d 2d 2d 2d 2d 3e 7c 0a 2a 2a 20 20 20  -------->|.**   
2b40: 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20              |   
2b50: 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20             |    
2b60: 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a              |.**
2b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
2b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56 20                V 
2b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
2ba0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
2bb0: 20 20 2b 3c 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52    +<------WRITER
2bc0: 5f 46 49 4e 49 53 48 45 44 2d 2d 2d 2d 2d 2d 2d  _FINISHED-------
2bd0: 2d 3e 2b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 53 74 61  ->+.**.**.** Sta
2be0: 74 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61  te transitions a
2bf0: 6e 64 20 74 68 65 20 5b 66 75 6e 63 74 69 6f 6e  nd the [function
2c00: 5d 20 74 68 61 74 20 70 65 72 66 6f 72 6d 73 20  ] that performs 
2c10: 65 61 63 68 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 4e  each:.** .**   N
2c20: 4f 4e 45 20 20 20 20 20 20 20 20 20 20 20 20 20  ONE             
2c30: 20 2d 3e 20 52 45 41 44 45 52 20 20 20 20 20 20   -> READER      
2c40: 20 20 20 20 20 20 20 20 5b 50 61 67 65 72 53 68          [PagerSh
2c50: 61 72 65 64 4c 6f 63 6b 5d 0a 2a 2a 20 20 20 52  aredLock].**   R
2c60: 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20 20  EADER           
2c70: 20 2d 3e 20 57 52 49 54 45 52 5f 49 4e 49 54 49   -> WRITER_INITI
2c80: 41 4c 20 20 20 20 20 20 5b 50 61 67 65 72 42 65  AL      [PagerBe
2c90: 67 69 6e 5d 0a 2a 2a 20 20 20 57 52 49 54 45 52  gin].**   WRITER
2ca0: 5f 49 4e 49 54 49 41 4c 20 20 20 20 2d 3e 20 57  _INITIAL    -> W
2cb0: 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 20  RITER_CACHEMOD  
2cc0: 20 20 20 5b 70 61 67 65 72 5f 6f 70 65 6e 5f 6a     [pager_open_j
2cd0: 6f 75 72 6e 61 6c 5d 0a 2a 2a 20 20 20 57 52 49  ournal].**   WRI
2ce0: 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 20 20 2d  TER_CACHEMOD   -
2cf0: 3e 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 20  > WRITER_DBMOD  
2d00: 20 20 20 20 20 20 5b 73 79 6e 63 4a 6f 75 72 6e        [syncJourn
2d10: 61 6c 5d 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f  al].**   WRITER_
2d20: 44 42 4d 4f 44 20 20 20 20 20 20 2d 3e 20 57 52  DBMOD      -> WR
2d30: 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20 20 20  ITER_FINISHED   
2d40: 20 20 5b 50 61 67 65 72 43 6f 6d 6d 69 74 50 68    [PagerCommitPh
2d50: 61 73 65 4f 6e 65 5d 0a 2a 2a 20 0a 2a 2a 20 20  aseOne].** .**  
2d60: 20 57 52 49 54 45 52 5f 49 4e 49 54 49 41 4c 20   WRITER_INITIAL 
2d70: 20 20 20 2d 3e 20 52 45 41 44 45 52 20 20 20 20     -> READER    
2d80: 20 20 20 20 20 20 20 20 20 20 5b 70 61 67 65 72            [pager
2d90: 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
2da0: 5d 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 43 41  ].**   WRITER_CA
2db0: 43 48 45 4d 4f 44 20 20 20 2d 3e 20 52 45 41 44  CHEMOD   -> READ
2dc0: 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ER              
2dd0: 5b 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73  [pager_end_trans
2de0: 61 63 74 69 6f 6e 5d 0a 2a 2a 20 20 20 57 52 49  action].**   WRI
2df0: 54 45 52 5f 44 42 4d 4f 44 20 20 20 20 20 20 2d  TER_DBMOD      -
2e00: 3e 20 52 45 41 44 45 52 20 20 20 20 20 20 20 20  > READER        
2e10: 20 20 20 20 20 20 5b 70 61 67 65 72 5f 65 6e 64        [pager_end
2e20: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 5d 0a 2a 2a  _transaction].**
2e30: 20 20 20 57 52 49 54 45 52 5f 46 49 4e 49 53 48     WRITER_FINISH
2e40: 45 44 20 20 20 2d 3e 20 52 45 41 44 45 52 20 20  ED   -> READER  
2e50: 20 20 20 20 20 20 20 20 20 20 20 20 5b 70 61 67              [pag
2e60: 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  er_end_transacti
2e70: 6f 6e 5d 0a 2a 2a 20 0a 2a 2a 20 20 20 52 45 41  on].** .**   REA
2e80: 44 45 52 20 20 20 20 20 20 20 20 20 20 20 20 2d  DER            -
2e90: 3e 20 4e 4f 4e 45 20 20 20 20 20 20 20 20 20 20  > NONE          
2ea0: 20 20 20 20 20 20 5b 70 61 67 65 72 5f 75 6e 6c        [pager_unl
2eb0: 6f 63 6b 5d 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 73  ock].**.** Notes
2ec0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 20 70 61  :.**.**   * A pa
2ed0: 67 65 72 20 69 73 20 6e 65 76 65 72 20 69 6e 20  ger is never in 
2ee0: 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 6f 72 20  WRITER_DBMOD or 
2ef0: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20  WRITER_FINISHED 
2f00: 73 74 61 74 65 20 69 66 20 74 68 65 0a 2a 2a 20  state if the.** 
2f10: 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69      connection i
2f20: 73 20 6f 70 65 6e 20 69 6e 20 57 41 4c 20 6d 6f  s open in WAL mo
2f30: 64 65 2e 20 41 20 57 41 4c 20 63 6f 6e 6e 65 63  de. A WAL connec
2f40: 74 69 6f 6e 20 69 73 20 61 6c 77 61 79 73 20 69  tion is always i
2f50: 6e 20 6f 6e 65 0a 2a 2a 20 20 20 20 20 6f 66 20  n one.**     of 
2f60: 74 68 65 20 66 69 72 73 74 20 66 6f 75 72 20 73  the first four s
2f70: 74 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  tates..**.**   *
2f80: 20 4e 6f 72 6d 61 6c 6c 79 2c 20 61 20 63 6f 6e   Normally, a con
2f90: 6e 65 63 74 69 6f 6e 20 6f 70 65 6e 20 69 6e 20  nection open in 
2fa0: 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 69  exclusive mode i
2fb0: 73 20 6e 65 76 65 72 20 69 6e 20 50 41 47 45 52  s never in PAGER
2fc0: 5f 4e 4f 4e 45 0a 2a 2a 20 20 20 20 20 73 74 61  _NONE.**     sta
2fd0: 74 65 2e 20 54 68 65 72 65 20 61 72 65 20 74 77  te. There are tw
2fe0: 6f 20 65 78 63 65 70 74 69 6f 6e 73 3a 20 69 6d  o exceptions: im
2ff0: 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20  mediately after 
3000: 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65 20 68  exclusive-mode h
3010: 61 73 0a 2a 2a 20 20 20 20 20 62 65 65 6e 20 74  as.**     been t
3020: 75 72 6e 65 64 20 6f 6e 20 28 61 6e 64 20 62 65  urned on (and be
3030: 66 6f 72 65 20 61 6e 79 20 72 65 61 64 20 6f 72  fore any read or
3040: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
3050: 6f 6e 73 20 61 72 65 20 0a 2a 2a 20 20 20 20 20  ons are .**     
3060: 65 78 65 63 75 74 65 64 29 2c 20 61 6e 64 20 77  executed), and w
3070: 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 69 73  hen the pager is
3080: 20 6c 65 61 76 69 6e 67 20 74 68 65 20 22 65 72   leaving the "er
3090: 72 6f 72 20 73 74 61 74 65 22 2e 0a 2a 2a 0a 2a  ror state"..**.*
30a0: 2a 20 20 20 2a 20 53 65 65 20 61 6c 73 6f 3a 20  *   * See also: 
30b0: 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
30c0: 74 65 28 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  te()..*/.#define
30d0: 20 50 41 47 45 52 5f 4e 4f 4e 45 20 20 20 20 20   PAGER_NONE     
30e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0a 23               0.#
30f0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 52 45 41  define PAGER_REA
3100: 44 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20  DER             
3110: 20 20 20 31 0a 23 64 65 66 69 6e 65 20 50 41 47     1.#define PAG
3120: 45 52 5f 57 52 49 54 45 52 5f 49 4e 49 54 49 41  ER_WRITER_INITIA
3130: 4c 20 20 20 20 20 20 20 20 32 0a 23 64 65 66 69  L        2.#defi
3140: 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  ne PAGER_WRITER_
3150: 43 41 43 48 45 4d 4f 44 20 20 20 20 20 20 20 33  CACHEMOD       3
3160: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 57  .#define PAGER_W
3170: 52 49 54 45 52 5f 44 42 4d 4f 44 20 20 20 20 20  RITER_DBMOD     
3180: 20 20 20 20 20 34 0a 23 64 65 66 69 6e 65 20 50       4.#define P
3190: 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49  AGER_WRITER_FINI
31a0: 53 48 45 44 20 20 20 20 20 20 20 35 0a 23 64 65  SHED       5.#de
31b0: 66 69 6e 65 20 50 41 47 45 52 5f 45 52 52 4f 52  fine PAGER_ERROR
31c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31d0: 20 36 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70   6.../*.** The p
31e0: 61 67 65 20 63 61 63 68 65 20 61 73 20 61 20 77  age cache as a w
31f0: 68 6f 6c 65 20 69 73 20 61 6c 77 61 79 73 20 69  hole is always i
3200: 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c  n one of the fol
3210: 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 61 74 65 73  lowing.** states
3220: 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f  :.**.**   PAGER_
3230: 55 4e 4c 4f 43 4b 20 20 20 20 20 20 20 20 54 68  UNLOCK        Th
3240: 65 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20  e page cache is 
3250: 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 72 65  not currently re
3260: 61 64 69 6e 67 20 6f 72 20 0a 2a 2a 20 20 20 20  ading or .**    
3270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3280: 20 20 20 77 72 69 74 69 6e 67 20 74 68 65 20 64     writing the d
3290: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54  atabase file.  T
32a0: 68 65 72 65 20 69 73 20 6e 6f 0a 2a 2a 20 20 20  here is no.**   
32b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32c0: 20 20 20 20 64 61 74 61 20 68 65 6c 64 20 69 6e      data held in
32d0: 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73 20 69   memory.  This i
32e0: 73 20 74 68 65 20 69 6e 69 74 69 61 6c 0a 2a 2a  s the initial.**
32f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3300: 20 20 20 20 20 20 20 73 74 61 74 65 2e 0a 2a 2a         state..**
3310: 0a 2a 2a 20 20 20 50 41 47 45 52 5f 53 48 41 52  .**   PAGER_SHAR
3320: 45 44 20 20 20 20 20 20 20 20 54 68 65 20 70 61  ED        The pa
3330: 67 65 20 63 61 63 68 65 20 69 73 20 72 65 61 64  ge cache is read
3340: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
3350: 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ..**            
3360: 20 20 20 20 20 20 20 20 20 20 20 57 72 69 74 69             Writi
3370: 6e 67 20 69 73 20 6e 6f 74 20 70 65 72 6d 69 74  ng is not permit
3380: 74 65 64 2e 20 20 54 68 65 72 65 20 63 61 6e 20  ted.  There can 
3390: 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  be.**           
33a0: 20 20 20 20 20 20 20 20 20 20 20 20 6d 75 6c 74              mult
33b0: 69 70 6c 65 20 72 65 61 64 65 72 73 20 61 63 63  iple readers acc
33c0: 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20  essing the same 
33d0: 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20  database.**     
33e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33f0: 20 20 66 69 6c 65 20 61 74 20 74 68 65 20 73 61    file at the sa
3400: 6d 65 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20  me time..**.**  
3410: 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20   PAGER_RESERVED 
3420: 20 20 20 20 20 54 68 69 73 20 70 72 6f 63 65 73       This proces
3430: 73 20 68 61 73 20 72 65 73 65 72 76 65 64 20 74  s has reserved t
3440: 68 65 20 64 61 74 61 62 61 73 65 20 66 6f 72 20  he database for 
3450: 77 72 69 74 69 6e 67 0a 2a 2a 20 20 20 20 20 20  writing.**      
3460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3470: 20 62 75 74 20 68 61 73 20 6e 6f 74 20 79 65 74   but has not yet
3480: 20 6d 61 64 65 20 61 6e 79 20 63 68 61 6e 67 65   made any change
3490: 73 2e 20 20 4f 6e 6c 79 20 6f 6e 65 20 70 72 6f  s.  Only one pro
34a0: 63 65 73 73 0a 2a 2a 20 20 20 20 20 20 20 20 20  cess.**         
34b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 74                at
34c0: 20 61 20 74 69 6d 65 20 63 61 6e 20 72 65 73 65   a time can rese
34d0: 72 76 65 20 74 68 65 20 64 61 74 61 62 61 73 65  rve the database
34e0: 2e 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 0a  .  The original.
34f0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
3500: 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
3510: 65 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 62  e file has not b
3520: 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 73 6f 20  een modified so 
3530: 6f 74 68 65 72 0a 2a 2a 20 20 20 20 20 20 20 20  other.**        
3540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
3550: 72 6f 63 65 73 73 65 73 20 6d 61 79 20 73 74 69  rocesses may sti
3560: 6c 6c 20 62 65 20 72 65 61 64 69 6e 67 20 74 68  ll be reading th
3570: 65 20 6f 6e 2d 64 69 73 6b 0a 2a 2a 20 20 20 20  e on-disk.**    
3580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3590: 20 20 20 64 61 74 61 62 61 73 65 20 66 69 6c 65     database file
35a0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f  ..**.**   PAGER_
35b0: 45 58 43 4c 55 53 49 56 45 20 20 20 20 20 54 68  EXCLUSIVE     Th
35c0: 65 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20  e page cache is 
35d0: 77 72 69 74 69 6e 67 20 74 68 65 20 64 61 74 61  writing the data
35e0: 62 61 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20  base..**        
35f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 41                 A
3600: 63 63 65 73 73 20 69 73 20 65 78 63 6c 75 73 69  ccess is exclusi
3610: 76 65 2e 20 20 4e 6f 20 6f 74 68 65 72 20 70 72  ve.  No other pr
3620: 6f 63 65 73 73 65 73 20 6f 72 0a 2a 2a 20 20 20  ocesses or.**   
3630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3640: 20 20 20 20 74 68 72 65 61 64 73 20 63 61 6e 20      threads can 
3650: 62 65 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72  be reading or wr
3660: 69 74 69 6e 67 20 77 68 69 6c 65 20 6f 6e 65 0a  iting while one.
3670: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
3680: 20 20 20 20 20 20 20 20 20 70 72 6f 63 65 73 73           process
3690: 20 69 73 20 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a   is writing..**.
36a0: 2a 2a 20 20 20 50 41 47 45 52 5f 53 59 4e 43 45  **   PAGER_SYNCE
36b0: 44 20 20 20 20 20 20 20 20 54 68 65 20 70 61 67  D        The pag
36c0: 65 72 20 6d 6f 76 65 73 20 74 6f 20 74 68 69 73  er moves to this
36d0: 20 73 74 61 74 65 20 66 72 6f 6d 20 50 41 47 45   state from PAGE
36e0: 52 5f 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  R_EXCLUSIVE.**  
36f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3700: 20 20 20 20 20 61 66 74 65 72 20 61 6c 6c 20 64       after all d
3710: 69 72 74 79 20 70 61 67 65 73 20 68 61 76 65 20  irty pages have 
3720: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
3730: 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  the.**          
3740: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
3750: 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74  abase file and t
3760: 68 65 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e  he file has been
3770: 20 73 79 6e 63 65 64 20 74 6f 0a 2a 2a 20 20 20   synced to.**   
3780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3790: 20 20 20 20 64 69 73 6b 2e 20 41 6c 6c 20 74 68      disk. All th
37a0: 61 74 20 72 65 6d 61 69 6e 73 20 74 6f 20 64 6f  at remains to do
37b0: 20 69 73 20 74 6f 20 72 65 6d 6f 76 65 20 6f 72   is to remove or
37c0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
37d0: 20 20 20 20 20 20 20 20 20 20 74 72 75 6e 63 61            trunca
37e0: 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  te the journal f
37f0: 69 6c 65 20 61 6e 64 20 74 68 65 20 74 72 61 6e  ile and the tran
3800: 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 20 20  saction .**     
3810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3820: 20 20 77 69 6c 6c 20 62 65 20 63 6f 6d 6d 69 74    will be commit
3830: 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ted..**.** The p
3840: 61 67 65 20 63 61 63 68 65 20 63 6f 6d 65 73 20  age cache comes 
3850: 75 70 20 69 6e 20 50 41 47 45 52 5f 55 4e 4c 4f  up in PAGER_UNLO
3860: 43 4b 2e 20 20 54 68 65 20 66 69 72 73 74 20 74  CK.  The first t
3870: 69 6d 65 20 61 0a 2a 2a 20 73 71 6c 69 74 65 33  ime a.** sqlite3
3880: 50 61 67 65 72 47 65 74 28 29 20 6f 63 63 75 72  PagerGet() occur
3890: 73 2c 20 74 68 65 20 73 74 61 74 65 20 74 72 61  s, the state tra
38a0: 6e 73 69 74 69 6f 6e 73 20 74 6f 20 50 41 47 45  nsitions to PAGE
38b0: 52 5f 53 48 41 52 45 44 2e 0a 2a 2a 20 41 66 74  R_SHARED..** Aft
38c0: 65 72 20 61 6c 6c 20 70 61 67 65 73 20 68 61 76  er all pages hav
38d0: 65 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64 20  e been released 
38e0: 75 73 69 6e 67 20 73 71 6c 69 74 65 5f 70 61 67  using sqlite_pag
38f0: 65 5f 75 6e 72 65 66 28 29 2c 0a 2a 2a 20 74 68  e_unref(),.** th
3900: 65 20 73 74 61 74 65 20 74 72 61 6e 73 69 74 69  e state transiti
3910: 6f 6e 73 20 62 61 63 6b 20 74 6f 20 50 41 47 45  ons back to PAGE
3920: 52 5f 55 4e 4c 4f 43 4b 2e 20 20 54 68 65 20 66  R_UNLOCK.  The f
3930: 69 72 73 74 20 74 69 6d 65 0a 2a 2a 20 74 68 61  irst time.** tha
3940: 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  t sqlite3PagerWr
3950: 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2c  ite() is called,
3960: 20 74 68 65 20 73 74 61 74 65 20 74 72 61 6e 73   the state trans
3970: 69 74 69 6f 6e 73 20 74 6f 0a 2a 2a 20 50 41 47  itions to.** PAG
3980: 45 52 5f 52 45 53 45 52 56 45 44 2e 20 20 28 4e  ER_RESERVED.  (N
3990: 6f 74 65 20 74 68 61 74 20 73 71 6c 69 74 65 33  ote that sqlite3
39a0: 50 61 67 65 72 57 72 69 74 65 28 29 20 63 61 6e  PagerWrite() can
39b0: 20 6f 6e 6c 79 20 62 65 0a 2a 2a 20 63 61 6c 6c   only be.** call
39c0: 65 64 20 6f 6e 20 61 6e 20 6f 75 74 73 74 61 6e  ed on an outstan
39d0: 64 69 6e 67 20 70 61 67 65 20 77 68 69 63 68 20  ding page which 
39e0: 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 70  means that the p
39f0: 61 67 65 72 20 6d 75 73 74 0a 2a 2a 20 62 65 20  ager must.** be 
3a00: 69 6e 20 50 41 47 45 52 5f 53 48 41 52 45 44 20  in PAGER_SHARED 
3a10: 62 65 66 6f 72 65 20 69 74 20 74 72 61 6e 73 69  before it transi
3a20: 74 69 6f 6e 73 20 74 6f 20 50 41 47 45 52 5f 52  tions to PAGER_R
3a30: 45 53 45 52 56 45 44 2e 29 0a 2a 2a 20 50 41 47  ESERVED.).** PAG
3a40: 45 52 5f 52 45 53 45 52 56 45 44 20 6d 65 61 6e  ER_RESERVED mean
3a50: 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  s that there is 
3a60: 61 6e 20 6f 70 65 6e 20 72 6f 6c 6c 62 61 63 6b  an open rollback
3a70: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 54 68 65   journal..** The
3a80: 20 74 72 61 6e 73 69 74 69 6f 6e 20 74 6f 20 50   transition to P
3a90: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 6f  AGER_EXCLUSIVE o
3aa0: 63 63 75 72 73 20 62 65 66 6f 72 65 20 61 6e 79  ccurs before any
3ab0: 20 63 68 61 6e 67 65 73 0a 2a 2a 20 61 72 65 20   changes.** are 
3ac0: 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61 74 61  made to the data
3ad0: 62 61 73 65 20 66 69 6c 65 2c 20 74 68 6f 75 67  base file, thoug
3ae0: 68 20 77 72 69 74 65 73 20 74 6f 20 74 68 65 20  h writes to the 
3af0: 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72  rollback.** jour
3b00: 6e 61 6c 20 6f 63 63 75 72 73 20 77 69 74 68 20  nal occurs with 
3b10: 6a 75 73 74 20 50 41 47 45 52 5f 52 45 53 45 52  just PAGER_RESER
3b20: 56 45 44 2e 20 20 41 66 74 65 72 20 61 6e 20 73  VED.  After an s
3b30: 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
3b40: 61 63 6b 28 29 0a 2a 2a 20 6f 72 20 73 71 6c 69  ack().** or sqli
3b50: 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
3b60: 61 73 65 54 77 6f 28 29 2c 20 74 68 65 20 73 74  aseTwo(), the st
3b70: 61 74 65 20 63 61 6e 20 67 6f 20 62 61 63 6b 20  ate can go back 
3b80: 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44 2c  to PAGER_SHARED,
3b90: 0a 2a 2a 20 6f 72 20 69 74 20 63 61 6e 20 73 74  .** or it can st
3ba0: 61 79 20 61 74 20 50 41 47 45 52 5f 45 58 43 4c  ay at PAGER_EXCL
3bb0: 55 53 49 56 45 20 69 66 20 77 65 20 61 72 65 20  USIVE if we are 
3bc0: 69 6e 20 65 78 63 6c 75 73 69 76 65 20 61 63 63  in exclusive acc
3bd0: 65 73 73 20 6d 6f 64 65 2e 0a 2a 2f 0a 23 64 65  ess mode..*/.#de
3be0: 66 69 6e 65 20 50 41 47 45 52 5f 55 4e 4c 4f 43  fine PAGER_UNLOC
3bf0: 4b 20 20 20 20 20 20 30 0a 23 64 65 66 69 6e 65  K      0.#define
3c00: 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 20 20   PAGER_SHARED   
3c10: 20 20 20 31 20 20 20 2f 2a 20 73 61 6d 65 20 61     1   /* same a
3c20: 73 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 2a 2f  s SHARED_LOCK */
3c30: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 52  .#define PAGER_R
3c40: 45 53 45 52 56 45 44 20 20 20 20 32 20 20 20 2f  ESERVED    2   /
3c50: 2a 20 73 61 6d 65 20 61 73 20 52 45 53 45 52 56  * same as RESERV
3c60: 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66 69  ED_LOCK */.#defi
3c70: 6e 65 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49  ne PAGER_EXCLUSI
3c80: 56 45 20 20 20 34 20 20 20 2f 2a 20 73 61 6d 65  VE   4   /* same
3c90: 20 61 73 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f   as EXCLUSIVE_LO
3ca0: 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  CK */.#define PA
3cb0: 47 45 52 5f 53 59 4e 43 45 44 20 20 20 20 20 20  GER_SYNCED      
3cc0: 35 0a 0a 2f 2a 0a 2a 2a 20 41 20 6d 61 63 72 6f  5../*.** A macro
3cd0: 20 75 73 65 64 20 66 6f 72 20 69 6e 76 6f 6b 69   used for invoki
3ce0: 6e 67 20 74 68 65 20 63 6f 64 65 63 20 69 66 20  ng the codec if 
3cf0: 74 68 65 72 65 20 69 73 20 6f 6e 65 0a 2a 2f 0a  there is one.*/.
3d00: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41  #ifdef SQLITE_HA
3d10: 53 5f 43 4f 44 45 43 0a 23 20 64 65 66 69 6e 65  S_CODEC.# define
3d20: 20 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 2c   CODEC1(P,D,N,X,
3d30: 45 29 20 5c 0a 20 20 20 20 69 66 28 20 50 2d 3e  E) \.    if( P->
3d40: 78 43 6f 64 65 63 20 26 26 20 50 2d 3e 78 43 6f  xCodec && P->xCo
3d50: 64 65 63 28 50 2d 3e 70 43 6f 64 65 63 2c 44 2c  dec(P->pCodec,D,
3d60: 4e 2c 58 29 3d 3d 30 20 29 7b 20 45 3b 20 7d 0a  N,X)==0 ){ E; }.
3d70: 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32 28  # define CODEC2(
3d80: 50 2c 44 2c 4e 2c 58 2c 45 2c 4f 29 20 5c 0a 20  P,D,N,X,E,O) \. 
3d90: 20 20 20 69 66 28 20 50 2d 3e 78 43 6f 64 65 63     if( P->xCodec
3da0: 3d 3d 30 20 29 7b 20 4f 3d 28 63 68 61 72 2a 29  ==0 ){ O=(char*)
3db0: 44 3b 20 7d 65 6c 73 65 20 5c 0a 20 20 20 20 69  D; }else \.    i
3dc0: 66 28 20 28 4f 3d 28 63 68 61 72 2a 29 28 50 2d  f( (O=(char*)(P-
3dd0: 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43 6f 64 65  >xCodec(P->pCode
3de0: 63 2c 44 2c 4e 2c 58 29 29 29 3d 3d 30 20 29 7b  c,D,N,X)))==0 ){
3df0: 20 45 3b 20 7d 0a 23 65 6c 73 65 0a 23 20 64 65   E; }.#else.# de
3e00: 66 69 6e 65 20 43 4f 44 45 43 31 28 50 2c 44 2c  fine CODEC1(P,D,
3e10: 4e 2c 58 2c 45 29 20 20 20 2f 2a 20 4e 4f 2d 4f  N,X,E)   /* NO-O
3e20: 50 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 43 4f  P */.# define CO
3e30: 44 45 43 32 28 50 2c 44 2c 4e 2c 58 2c 45 2c 4f  DEC2(P,D,N,X,E,O
3e40: 29 20 4f 3d 28 63 68 61 72 2a 29 44 0a 23 65 6e  ) O=(char*)D.#en
3e50: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d  dif../*.** The m
3e60: 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 73  aximum allowed s
3e70: 65 63 74 6f 72 20 73 69 7a 65 2e 20 36 34 4b 69  ector size. 64Ki
3e80: 42 2e 20 49 66 20 74 68 65 20 78 53 65 63 74 6f  B. If the xSecto
3e90: 72 73 69 7a 65 28 29 20 6d 65 74 68 6f 64 20 0a  rsize() method .
3ea0: 2a 2a 20 72 65 74 75 72 6e 73 20 61 20 76 61 6c  ** returns a val
3eb0: 75 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  ue larger than t
3ec0: 68 69 73 2c 20 74 68 65 6e 20 4d 41 58 5f 53 45  his, then MAX_SE
3ed0: 43 54 4f 52 5f 53 49 5a 45 20 69 73 20 75 73 65  CTOR_SIZE is use
3ee0: 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 20 54 68  d instead..** Th
3ef0: 69 73 20 63 6f 75 6c 64 20 63 6f 6e 63 65 69 76  is could conceiv
3f00: 61 62 6c 79 20 63 61 75 73 65 20 63 6f 72 72 75  ably cause corru
3f10: 70 74 69 6f 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20  ption following 
3f20: 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  a power failure 
3f30: 6f 6e 0a 2a 2a 20 73 75 63 68 20 61 20 73 79 73  on.** such a sys
3f40: 74 65 6d 2e 20 54 68 69 73 20 69 73 20 63 75 72  tem. This is cur
3f50: 72 65 6e 74 6c 79 20 61 6e 20 75 6e 64 6f 63 75  rently an undocu
3f60: 6d 65 6e 74 65 64 20 6c 69 6d 69 74 2e 0a 2a 2f  mented limit..*/
3f70: 0a 23 64 65 66 69 6e 65 20 4d 41 58 5f 53 45 43  .#define MAX_SEC
3f80: 54 4f 52 5f 53 49 5a 45 20 30 78 31 30 30 30 30  TOR_SIZE 0x10000
3f90: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61  ../*.** An insta
3fa0: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
3fb0: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 69  wing structure i
3fc0: 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  s allocated for 
3fd0: 65 61 63 68 20 61 63 74 69 76 65 0a 2a 2a 20 73  each active.** s
3fe0: 61 76 65 70 6f 69 6e 74 20 61 6e 64 20 73 74 61  avepoint and sta
3ff0: 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
4000: 6f 6e 20 69 6e 20 74 68 65 20 73 79 73 74 65 6d  on in the system
4010: 2e 20 41 6c 6c 20 73 75 63 68 20 73 74 72 75 63  . All such struc
4020: 74 75 72 65 73 0a 2a 2a 20 61 72 65 20 73 74 6f  tures.** are sto
4030: 72 65 64 20 69 6e 20 74 68 65 20 50 61 67 65 72  red in the Pager
4040: 2e 61 53 61 76 65 70 6f 69 6e 74 5b 5d 20 61 72  .aSavepoint[] ar
4050: 72 61 79 2c 20 77 68 69 63 68 20 69 73 20 61 6c  ray, which is al
4060: 6c 6f 63 61 74 65 64 20 61 6e 64 0a 2a 2a 20 72  located and.** r
4070: 65 73 69 7a 65 64 20 75 73 69 6e 67 20 73 71 6c  esized using sql
4080: 69 74 65 33 52 65 61 6c 6c 6f 63 28 29 2e 0a 2a  ite3Realloc()..*
4090: 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 73 61 76 65  *.** When a save
40a0: 70 6f 69 6e 74 20 69 73 20 63 72 65 61 74 65 64  point is created
40b0: 2c 20 74 68 65 20 50 61 67 65 72 53 61 76 65 70  , the PagerSavep
40c0: 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20  oint.iHdrOffset 
40d0: 66 69 65 6c 64 20 69 73 0a 2a 2a 20 73 65 74 20  field is.** set 
40e0: 74 6f 20 30 2e 20 49 66 20 61 20 6a 6f 75 72 6e  to 0. If a journ
40f0: 61 6c 2d 68 65 61 64 65 72 20 69 73 20 77 72 69  al-header is wri
4100: 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6d 61  tten into the ma
4110: 69 6e 20 6a 6f 75 72 6e 61 6c 20 77 68 69 6c 65  in journal while
4120: 0a 2a 2a 20 74 68 65 20 73 61 76 65 70 6f 69 6e  .** the savepoin
4130: 74 20 69 73 20 61 63 74 69 76 65 2c 20 74 68 65  t is active, the
4140: 6e 20 69 48 64 72 4f 66 66 73 65 74 20 69 73 20  n iHdrOffset is 
4150: 73 65 74 20 74 6f 20 74 68 65 20 62 79 74 65 20  set to the byte 
4160: 6f 66 66 73 65 74 20 0a 2a 2a 20 69 6d 6d 65 64  offset .** immed
4170: 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67  iately following
4180: 20 74 68 65 20 6c 61 73 74 20 6a 6f 75 72 6e 61   the last journa
4190: 6c 20 72 65 63 6f 72 64 20 77 72 69 74 74 65 6e  l record written
41a0: 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 0a 2a   into the main.*
41b0: 2a 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65  * journal before
41c0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61   the journal-hea
41d0: 64 65 72 2e 20 54 68 69 73 20 69 73 20 72 65 71  der. This is req
41e0: 75 69 72 65 64 20 64 75 72 69 6e 67 20 73 61 76  uired during sav
41f0: 65 70 6f 69 6e 74 0a 2a 2a 20 72 6f 6c 6c 62 61  epoint.** rollba
4200: 63 6b 20 28 73 65 65 20 70 61 67 65 72 50 6c 61  ck (see pagerPla
4210: 79 62 61 63 6b 53 61 76 65 70 6f 69 6e 74 28 29  ybackSavepoint()
4220: 29 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  )..*/.typedef st
4230: 72 75 63 74 20 50 61 67 65 72 53 61 76 65 70 6f  ruct PagerSavepo
4240: 69 6e 74 20 50 61 67 65 72 53 61 76 65 70 6f 69  int PagerSavepoi
4250: 6e 74 3b 0a 73 74 72 75 63 74 20 50 61 67 65 72  nt;.struct Pager
4260: 53 61 76 65 70 6f 69 6e 74 20 7b 0a 20 20 69 36  Savepoint {.  i6
4270: 34 20 69 4f 66 66 73 65 74 3b 20 20 20 20 20 20  4 iOffset;      
4280: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
4290: 61 72 74 69 6e 67 20 6f 66 66 73 65 74 20 69 6e  arting offset in
42a0: 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f   main journal */
42b0: 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66 73 65  .  i64 iHdrOffse
42c0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
42d0: 2f 2a 20 53 65 65 20 61 62 6f 76 65 20 2a 2f 0a  /* See above */.
42e0: 20 20 42 69 74 76 65 63 20 2a 70 49 6e 53 61 76    Bitvec *pInSav
42f0: 65 70 6f 69 6e 74 3b 20 20 20 20 20 20 20 20 2f  epoint;        /
4300: 2a 20 53 65 74 20 6f 66 20 70 61 67 65 73 20 69  * Set of pages i
4310: 6e 20 74 68 69 73 20 73 61 76 65 70 6f 69 6e 74  n this savepoint
4320: 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 4f 72 69 67   */.  Pgno nOrig
4330: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4340: 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 6e     /* Original n
4350: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
4360: 6e 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f  n file */.  Pgno
4370: 20 69 53 75 62 52 65 63 3b 20 20 20 20 20 20 20   iSubRec;       
4380: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
4390: 78 20 6f 66 20 66 69 72 73 74 20 72 65 63 6f 72  x of first recor
43a0: 64 20 69 6e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  d in sub-journal
43b0: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
43c0: 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 75 33  TE_OMIT_WAL.  u3
43d0: 32 20 61 57 61 6c 44 61 74 61 5b 57 41 4c 5f 53  2 aWalData[WAL_S
43e0: 41 56 45 50 4f 49 4e 54 5f 4e 44 41 54 41 5d 3b  AVEPOINT_NDATA];
43f0: 20 20 20 20 20 20 20 20 2f 2a 20 57 41 4c 20 73          /* WAL s
4400: 61 76 65 70 6f 69 6e 74 20 63 6f 6e 74 65 78 74  avepoint context
4410: 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f   */.#endif.};../
4420: 2a 0a 2a 2a 20 41 20 6f 70 65 6e 20 70 61 67 65  *.** A open page
4430: 20 63 61 63 68 65 20 69 73 20 61 6e 20 69 6e 73   cache is an ins
4440: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
4450: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
4460: 2e 0a 2a 2a 0a 2a 2a 20 65 72 72 43 6f 64 65 0a  ..**.** errCode.
4470: 2a 2a 0a 2a 2a 20 20 20 50 61 67 65 72 2e 65 72  **.**   Pager.er
4480: 72 43 6f 64 65 20 6d 61 79 20 62 65 20 73 65 74  rCode may be set
4490: 20 74 6f 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   to SQLITE_IOERR
44a0: 2c 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  , SQLITE_CORRUPT
44b0: 2c 20 6f 72 0a 2a 2a 20 20 20 6f 72 20 53 51 4c  , or.**   or SQL
44c0: 49 54 45 5f 46 55 4c 4c 2e 20 4f 6e 63 65 20 6f  ITE_FULL. Once o
44d0: 6e 65 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  ne of the first 
44e0: 74 68 72 65 65 20 65 72 72 6f 72 73 20 6f 63 63  three errors occ
44f0: 75 72 73 2c 20 69 74 20 70 65 72 73 69 73 74 73  urs, it persists
4500: 0a 2a 2a 20 20 20 61 6e 64 20 69 73 20 72 65 74  .**   and is ret
4510: 75 72 6e 65 64 20 61 73 20 74 68 65 20 72 65 73  urned as the res
4520: 75 6c 74 20 6f 66 20 65 76 65 72 79 20 6d 61 6a  ult of every maj
4530: 6f 72 20 70 61 67 65 72 20 41 50 49 20 63 61 6c  or pager API cal
4540: 6c 2e 20 20 54 68 65 0a 2a 2a 20 20 20 53 51 4c  l.  The.**   SQL
4550: 49 54 45 5f 46 55 4c 4c 20 72 65 74 75 72 6e 20  ITE_FULL return 
4560: 63 6f 64 65 20 69 73 20 73 6c 69 67 68 74 6c 79  code is slightly
4570: 20 64 69 66 66 65 72 65 6e 74 2e 20 49 74 20 70   different. It p
4580: 65 72 73 69 73 74 73 20 6f 6e 6c 79 20 75 6e 74  ersists only unt
4590: 69 6c 20 74 68 65 0a 2a 2a 20 20 20 6e 65 78 74  il the.**   next
45a0: 20 73 75 63 63 65 73 73 66 75 6c 20 72 6f 6c 6c   successful roll
45b0: 62 61 63 6b 20 69 73 20 70 65 72 66 6f 72 6d 65  back is performe
45c0: 64 20 6f 6e 20 74 68 65 20 70 61 67 65 72 20 63  d on the pager c
45d0: 61 63 68 65 2e 20 41 6c 73 6f 2c 0a 2a 2a 20 20  ache. Also,.**  
45e0: 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 64 6f 65   SQLITE_FULL doe
45f0: 73 20 6e 6f 74 20 61 66 66 65 63 74 20 74 68 65  s not affect the
4600: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
4610: 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 50 61  () and sqlite3Pa
4620: 67 65 72 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 20  gerLookup().**  
4630: 20 41 50 49 73 2c 20 74 68 65 79 20 6d 61 79 20   APIs, they may 
4640: 73 74 69 6c 6c 20 62 65 20 75 73 65 64 20 73 75  still be used su
4650: 63 63 65 73 73 66 75 6c 6c 79 2e 0a 2a 2a 0a 2a  ccessfully..**.*
4660: 2a 20 64 62 53 69 7a 65 2c 20 64 62 4f 72 69 67  * dbSize, dbOrig
4670: 53 69 7a 65 2c 20 64 62 46 69 6c 65 53 69 7a 65  Size, dbFileSize
4680: 0a 2a 2a 0a 2a 2a 20 20 20 4d 61 6e 61 67 69 6e  .**.**   Managin
4690: 67 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  g the size of th
46a0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
46b0: 69 6e 20 70 61 67 65 73 20 69 73 20 61 20 6c 69  in pages is a li
46c0: 74 74 6c 65 20 63 6f 6d 70 6c 69 63 61 74 65 64  ttle complicated
46d0: 2e 0a 2a 2a 20 20 20 54 68 65 20 76 61 72 69 61  ..**   The varia
46e0: 62 6c 65 20 50 61 67 65 72 2e 64 62 53 69 7a 65  ble Pager.dbSize
46f0: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 75   contains the nu
4700: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 68  mber of pages th
4710: 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  at the database.
4720: 2a 2a 20 20 20 69 6d 61 67 65 20 63 75 72 72 65  **   image curre
4730: 6e 74 6c 79 20 63 6f 6e 74 61 69 6e 73 2e 20 41  ntly contains. A
4740: 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  s the database i
4750: 6d 61 67 65 20 67 72 6f 77 73 20 6f 72 20 73 68  mage grows or sh
4760: 72 69 6e 6b 73 20 74 68 69 73 0a 2a 2a 20 20 20  rinks this.**   
4770: 76 61 72 69 61 62 6c 65 20 69 73 20 75 70 64 61  variable is upda
4780: 74 65 64 2e 20 54 68 65 20 76 61 72 69 61 62 6c  ted. The variabl
4790: 65 20 50 61 67 65 72 2e 64 62 46 69 6c 65 53 69  e Pager.dbFileSi
47a0: 7a 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ze contains the 
47b0: 6e 75 6d 62 65 72 0a 2a 2a 20 20 20 6f 66 20 70  number.**   of p
47c0: 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ages in the data
47d0: 62 61 73 65 20 66 69 6c 65 2e 20 54 68 69 73 20  base file. This 
47e0: 6d 61 79 20 62 65 20 64 69 66 66 65 72 65 6e 74  may be different
47f0: 20 66 72 6f 6d 20 50 61 67 65 72 2e 64 62 53 69   from Pager.dbSi
4800: 7a 65 0a 2a 2a 20 20 20 69 66 20 73 6f 6d 65 20  ze.**   if some 
4810: 70 61 67 65 73 20 68 61 76 65 20 62 65 65 6e 20  pages have been 
4820: 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20  appended to the 
4830: 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 62  database image b
4840: 75 74 20 6e 6f 74 20 79 65 74 20 77 72 69 74 74  ut not yet writt
4850: 65 6e 0a 2a 2a 20 20 20 6f 75 74 20 66 72 6f 6d  en.**   out from
4860: 20 74 68 65 20 63 61 63 68 65 20 74 6f 20 74 68   the cache to th
4870: 65 20 61 63 74 75 61 6c 20 66 69 6c 65 20 6f 6e  e actual file on
4880: 20 64 69 73 6b 2e 20 4f 72 20 69 66 20 74 68 65   disk. Or if the
4890: 20 69 6d 61 67 65 20 68 61 73 20 62 65 65 6e 0a   image has been.
48a0: 2a 2a 20 20 20 74 72 75 6e 63 61 74 65 64 20 62  **   truncated b
48b0: 79 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  y an incremental
48c0: 2d 76 61 63 75 75 6d 20 6f 70 65 72 61 74 69 6f  -vacuum operatio
48d0: 6e 2e 20 54 68 65 20 50 61 67 65 72 2e 64 62 4f  n. The Pager.dbO
48e0: 72 69 67 53 69 7a 65 20 76 61 72 69 61 62 6c 65  rigSize variable
48f0: 0a 2a 2a 20 20 20 63 6f 6e 74 61 69 6e 73 20 74  .**   contains t
4900: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
4910: 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  es in the databa
4920: 73 65 20 69 6d 61 67 65 20 77 68 65 6e 20 74 68  se image when th
4930: 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 20 20 74  e current.**   t
4940: 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 6f  ransaction was o
4950: 70 65 6e 65 64 2e 20 54 68 65 20 63 6f 6e 74 65  pened. The conte
4960: 6e 74 73 20 6f 66 20 61 6c 6c 20 74 68 72 65 65  nts of all three
4970: 20 6f 66 20 74 68 65 73 65 20 76 61 72 69 61 62   of these variab
4980: 6c 65 73 20 69 73 0a 2a 2a 20 20 20 6f 6e 6c 79  les is.**   only
4990: 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62   guaranteed to b
49a0: 65 20 63 6f 72 72 65 63 74 20 69 66 20 74 68 65  e correct if the
49b0: 20 62 6f 6f 6c 65 61 6e 20 50 61 67 65 72 2e 64   boolean Pager.d
49c0: 62 53 69 7a 65 56 61 6c 69 64 20 69 73 20 74 72  bSizeValid is tr
49d0: 75 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 4f 44 4f  ue..**.**   TODO
49e0: 3a 20 55 6e 64 65 72 20 77 68 61 74 20 63 6f 6e  : Under what con
49f0: 64 69 74 69 6f 6e 73 20 69 73 20 64 62 53 69 7a  ditions is dbSiz
4a00: 65 56 61 6c 69 64 20 73 65 74 3f 20 43 6c 65 61  eValid set? Clea
4a10: 72 65 64 3f 0a 2a 2a 0a 2a 2a 20 63 68 61 6e 67  red?.**.** chang
4a20: 65 43 6f 75 6e 74 44 6f 6e 65 0a 2a 2a 0a 2a 2a  eCountDone.**.**
4a30: 20 20 20 54 68 69 73 20 62 6f 6f 6c 65 61 6e 20     This boolean 
4a40: 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64  variable is used
4a50: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
4a60: 61 74 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  at the change-co
4a70: 75 6e 74 65 72 20 0a 2a 2a 20 20 20 28 74 68 65  unter .**   (the
4a80: 20 34 2d 62 79 74 65 20 68 65 61 64 65 72 20 66   4-byte header f
4a90: 69 65 6c 64 20 61 74 20 62 79 74 65 20 6f 66 66  ield at byte off
4aa0: 73 65 74 20 32 34 20 6f 66 20 74 68 65 20 64 61  set 24 of the da
4ab0: 74 61 62 61 73 65 20 66 69 6c 65 29 20 69 73 20  tabase file) is 
4ac0: 0a 2a 2a 20 20 20 6e 6f 74 20 75 70 64 61 74 65  .**   not update
4ad0: 64 20 6d 6f 72 65 20 6f 66 74 65 6e 20 74 68 61  d more often tha
4ae0: 6e 20 6e 65 63 65 73 73 61 72 79 2e 20 0a 2a 2a  n necessary. .**
4af0: 0a 2a 2a 20 20 20 49 74 20 69 73 20 73 65 74 20  .**   It is set 
4b00: 74 6f 20 74 72 75 65 20 77 68 65 6e 20 74 68 65  to true when the
4b10: 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
4b20: 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65 64  field is updated
4b30: 2c 20 77 68 69 63 68 20 0a 2a 2a 20 20 20 63 61  , which .**   ca
4b40: 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66  n only happen if
4b50: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
4b60: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
4b70: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
4b80: 0a 2a 2a 20 20 20 49 74 20 69 73 20 63 6c 65 61  .**   It is clea
4b90: 72 65 64 20 28 73 65 74 20 74 6f 20 66 61 6c 73  red (set to fals
4ba0: 65 29 20 77 68 65 6e 65 76 65 72 20 61 6e 20 65  e) whenever an e
4bb0: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73  xclusive lock is
4bc0: 20 0a 2a 2a 20 20 20 72 65 6c 69 6e 71 75 69 73   .**   relinquis
4bd0: 68 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62  hed on the datab
4be0: 61 73 65 20 66 69 6c 65 2e 20 45 61 63 68 20 74  ase file. Each t
4bf0: 69 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ime a transactio
4c00: 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2c 0a  n is committed,.
4c10: 2a 2a 20 20 20 54 68 65 20 63 68 61 6e 67 65 43  **   The changeC
4c20: 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 69 73  ountDone flag is
4c30: 20 69 6e 73 70 65 63 74 65 64 2e 20 49 66 20 69   inspected. If i
4c40: 74 20 69 73 20 74 72 75 65 2c 20 74 68 65 20 77  t is true, the w
4c50: 6f 72 6b 20 6f 66 0a 2a 2a 20 20 20 75 70 64 61  ork of.**   upda
4c60: 74 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65 2d  ting the change-
4c70: 63 6f 75 6e 74 65 72 20 69 73 20 6f 6d 69 74 74  counter is omitt
4c80: 65 64 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  ed for the curre
4c90: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  nt transaction..
4ca0: 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20 6d 65 63  **.**   This mec
4cb0: 68 61 6e 69 73 6d 20 6d 65 61 6e 73 20 74 68 61  hanism means tha
4cc0: 74 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69  t when running i
4cd0: 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
4ce0: 2c 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a  , a connection .
4cf0: 2a 2a 20 20 20 6e 65 65 64 20 6f 6e 6c 79 20 75  **   need only u
4d00: 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65  pdate the change
4d10: 2d 63 6f 75 6e 74 65 72 20 6f 6e 63 65 2c 20 66  -counter once, f
4d20: 6f 72 20 74 68 65 20 66 69 72 73 74 20 74 72 61  or the first tra
4d30: 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 63 6f  nsaction.**   co
4d40: 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 64  mmitted..**.** d
4d50: 62 4d 6f 64 69 66 69 65 64 0a 2a 2a 0a 2a 2a 20  bModified.**.** 
4d60: 20 20 54 68 65 20 64 62 4d 6f 64 69 66 69 65 64    The dbModified
4d70: 20 66 6c 61 67 20 69 73 20 73 65 74 20 77 68 65   flag is set whe
4d80: 6e 65 76 65 72 20 61 20 64 61 74 61 62 61 73 65  never a database
4d90: 20 70 61 67 65 20 69 73 20 64 69 72 74 69 65 64   page is dirtied
4da0: 2e 0a 2a 2a 20 20 20 49 74 20 69 73 20 63 6c 65  ..**   It is cle
4db0: 61 72 65 64 20 61 74 20 74 68 65 20 65 6e 64 20  ared at the end 
4dc0: 6f 66 20 65 61 63 68 20 74 72 61 6e 73 61 63 74  of each transact
4dd0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 74 20  ion..**.**   It 
4de0: 69 73 20 75 73 65 64 20 77 68 65 6e 20 63 6f 6d  is used when com
4df0: 6d 69 74 74 69 6e 67 20 6f 72 20 6f 74 68 65 72  mitting or other
4e00: 77 69 73 65 20 65 6e 64 69 6e 67 20 61 20 74 72  wise ending a tr
4e10: 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 0a 2a 2a  ansaction. If.**
4e20: 20 20 20 74 68 65 20 64 62 4d 6f 64 69 66 69 65     the dbModifie
4e30: 64 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72 20  d flag is clear 
4e40: 74 68 65 6e 20 6c 65 73 73 20 77 6f 72 6b 20 68  then less work h
4e50: 61 73 20 74 6f 20 62 65 20 64 6f 6e 65 2e 0a 2a  as to be done..*
4e60: 2a 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 53 74 61 72  *.** journalStar
4e70: 74 65 64 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73  ted.**.**   This
4e80: 20 66 6c 61 67 20 69 73 20 73 65 74 20 64 75 72   flag is set dur
4e90: 69 6e 67 20 61 20 77 72 69 74 65 2d 74 72 61 6e  ing a write-tran
4ea0: 73 61 63 74 69 6f 6e 20 61 66 74 65 72 20 74 68  saction after th
4eb0: 65 20 66 69 72 73 74 20 0a 2a 2a 20 20 20 6a 6f  e first .**   jo
4ec0: 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 69 73 20  urnal-header is 
4ed0: 77 72 69 74 74 65 6e 20 61 6e 64 20 73 79 6e 63  written and sync
4ee0: 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a  ed to disk..**.*
4ef0: 2a 20 20 20 41 66 74 65 72 20 74 68 69 73 20 68  *   After this h
4f00: 61 73 20 68 61 70 70 65 6e 65 64 2c 20 6e 65 77  as happened, new
4f10: 20 70 61 67 65 73 20 61 70 70 65 6e 64 65 64 20   pages appended 
4f20: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
4f30: 0a 2a 2a 20 20 20 64 6f 20 6e 6f 74 20 6e 65 65  .**   do not nee
4f40: 64 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44  d the PGHDR_NEED
4f50: 5f 53 59 4e 43 20 66 6c 61 67 20 73 65 74 2c 20  _SYNC flag set, 
4f60: 61 73 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 6e  as they do not n
4f70: 65 65 64 0a 2a 2a 20 20 20 74 6f 20 77 61 69 74  eed.**   to wait
4f80: 20 66 6f 72 20 61 20 6a 6f 75 72 6e 61 6c 20 73   for a journal s
4f90: 79 6e 63 20 62 65 66 6f 72 65 20 74 68 65 79 20  ync before they 
4fa0: 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 6f  can be written o
4fb0: 75 74 20 74 6f 0a 2a 2a 20 20 20 74 68 65 20 64  ut to.**   the d
4fc0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 73 65  atabase file (se
4fd0: 65 20 66 75 6e 63 74 69 6f 6e 20 70 61 67 65 72  e function pager
4fe0: 5f 77 72 69 74 65 28 29 29 2e 0a 2a 2a 20 20 20  _write())..**   
4ff0: 0a 2a 2a 20 73 65 74 4d 61 73 74 65 72 0a 2a 2a  .** setMaster.**
5000: 0a 2a 2a 20 20 20 57 68 65 6e 20 50 61 67 65 72  .**   When Pager
5010: 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29  CommitPhaseOne()
5020: 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 6f   is called to co
5030: 6d 6d 69 74 20 61 20 74 72 61 6e 73 61 63 74 69  mmit a transacti
5040: 6f 6e 2c 20 69 74 20 6d 61 79 0a 2a 2a 20 20 20  on, it may.**   
5050: 28 6f 72 20 6d 61 79 20 6e 6f 74 29 20 73 70 65  (or may not) spe
5060: 63 69 66 79 20 61 20 6d 61 73 74 65 72 2d 6a 6f  cify a master-jo
5070: 75 72 6e 61 6c 20 6e 61 6d 65 20 74 6f 20 62 65  urnal name to be
5080: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
5090: 65 20 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 20  e .**   journal 
50a0: 66 69 6c 65 20 62 65 66 6f 72 65 20 69 74 20 69  file before it i
50b0: 73 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  s synced to disk
50c0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 57 68 65 74 68 65  ..**.**   Whethe
50d0: 72 20 6f 72 20 6e 6f 74 20 61 20 6a 6f 75 72 6e  r or not a journ
50e0: 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73  al file contains
50f0: 20 61 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61   a master-journa
5100: 6c 20 70 6f 69 6e 74 65 72 20 61 66 66 65 63 74  l pointer affect
5110: 73 20 0a 2a 2a 20 20 20 74 68 65 20 77 61 79 20  s .**   the way 
5120: 69 6e 20 77 68 69 63 68 20 74 68 65 20 6a 6f 75  in which the jou
5130: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 66 69 6e  rnal file is fin
5140: 61 6c 69 7a 65 64 20 61 66 74 65 72 20 74 68 65  alized after the
5150: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
5160: 0a 2a 2a 20 20 20 63 6f 6d 6d 69 74 74 65 64 20  .**   committed 
5170: 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 77  or rolled back w
5180: 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20 22  hen running in "
5190: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 50 45 52  journal_mode=PER
51a0: 53 49 53 54 22 20 6d 6f 64 65 2e 0a 2a 2a 20 20  SIST" mode..**  
51b0: 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69   If a journal fi
51c0: 6c 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74  le does not cont
51d0: 61 69 6e 20 61 20 6d 61 73 74 65 72 2d 6a 6f 75  ain a master-jou
51e0: 72 6e 61 6c 20 70 6f 69 6e 74 65 72 2c 20 69 74  rnal pointer, it
51f0: 20 69 73 0a 2a 2a 20 20 20 66 69 6e 61 6c 69 7a   is.**   finaliz
5200: 65 64 20 62 79 20 6f 76 65 72 77 72 69 74 69 6e  ed by overwritin
5210: 67 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72  g the first jour
5220: 6e 61 6c 20 68 65 61 64 65 72 20 77 69 74 68 20  nal header with 
5230: 7a 65 72 6f 65 73 2e 20 49 66 2c 0a 2a 2a 20 20  zeroes. If,.**  
5240: 20 6f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61   on the other ha
5250: 6e 64 2c 20 69 74 20 64 6f 65 73 20 63 6f 6e 74  nd, it does cont
5260: 61 69 6e 20 61 20 6d 61 73 74 65 72 2d 6a 6f 75  ain a master-jou
5270: 72 6e 61 6c 20 70 6f 69 6e 74 65 72 2c 20 74 68  rnal pointer, th
5280: 65 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 20 66  e.**   journal f
5290: 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65 64  ile is finalized
52a0: 20 62 79 20 74 72 75 6e 63 61 74 69 6e 67 20 69   by truncating i
52b0: 74 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 2c  t to zero bytes,
52c0: 20 6a 75 73 74 20 61 73 20 69 66 0a 2a 2a 20 20   just as if.**  
52d0: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
52e0: 77 65 72 65 20 72 75 6e 6e 69 6e 67 20 69 6e 20  were running in 
52f0: 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 74 72  "journal_mode=tr
5300: 75 6e 63 61 74 65 22 20 6d 6f 64 65 2e 0a 2a 2a  uncate" mode..**
5310: 0a 2a 2a 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69  .**   Journal fi
5320: 6c 65 73 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  les that contain
5330: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
5340: 70 6f 69 6e 74 65 72 73 20 63 61 6e 6e 6f 74 20  pointers cannot 
5350: 62 65 20 66 69 6e 61 6c 69 7a 65 64 0a 2a 2a 20  be finalized.** 
5360: 20 20 73 69 6d 70 6c 79 20 62 79 20 6f 76 65 72    simply by over
5370: 77 72 69 74 69 6e 67 20 74 68 65 20 66 69 72 73  writing the firs
5380: 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72  t journal-header
5390: 20 77 69 74 68 20 7a 65 72 6f 65 73 2c 20 61 73   with zeroes, as
53a0: 20 74 68 65 0a 2a 2a 20 20 20 6d 61 73 74 65 72   the.**   master
53b0: 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72   journal pointer
53c0: 20 63 6f 75 6c 64 20 69 6e 74 65 72 66 65 72 65   could interfere
53d0: 20 77 69 74 68 20 68 6f 74 2d 6a 6f 75 72 6e 61   with hot-journa
53e0: 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 6e  l rollback of an
53f0: 79 0a 2a 2a 20 20 20 73 75 62 73 65 71 75 65 6e  y.**   subsequen
5400: 74 6c 79 20 69 6e 74 65 72 72 75 70 74 65 64 20  tly interrupted 
5410: 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61 74  transaction that
5420: 20 72 65 75 73 65 73 20 74 68 65 20 6a 6f 75 72   reuses the jour
5430: 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  nal file..**.** 
5440: 20 20 54 68 65 20 66 6c 61 67 20 69 73 20 63 6c    The flag is cl
5450: 65 61 72 65 64 20 61 73 20 73 6f 6f 6e 20 61 73  eared as soon as
5460: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
5470: 65 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 20 28  e is finalized (
5480: 65 69 74 68 65 72 0a 2a 2a 20 20 20 62 79 20 50  either.**   by P
5490: 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54  agerCommitPhaseT
54a0: 77 6f 20 6f 72 20 50 61 67 65 72 52 6f 6c 6c 62  wo or PagerRollb
54b0: 61 63 6b 29 2e 20 49 66 20 61 6e 20 49 4f 20 65  ack). If an IO e
54c0: 72 72 6f 72 20 70 72 65 76 65 6e 74 73 20 74 68  rror prevents th
54d0: 65 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 20 66  e.**   journal f
54e0: 69 6c 65 20 66 72 6f 6d 20 62 65 69 6e 67 20 73  ile from being s
54f0: 75 63 63 65 73 73 66 75 6c 6c 79 20 66 69 6e 61  uccessfully fina
5500: 6c 69 7a 65 64 2c 20 74 68 65 20 73 65 74 4d 61  lized, the setMa
5510: 73 74 65 72 20 66 6c 61 67 0a 2a 2a 20 20 20 69  ster flag.**   i
5520: 73 20 63 6c 65 61 72 65 64 20 61 6e 79 77 61 79  s cleared anyway
5530: 2e 0a 2a 2a 0a 2a 2a 20 64 6f 4e 6f 74 53 70 69  ..**.** doNotSpi
5540: 6c 6c 2c 20 64 6f 4e 6f 74 53 79 6e 63 53 70 69  ll, doNotSyncSpi
5550: 6c 6c 0a 2a 2a 0a 2a 2a 20 20 20 57 68 65 6e 20  ll.**.**   When 
5560: 65 6e 61 62 6c 65 64 2c 20 63 61 63 68 65 20 73  enabled, cache s
5570: 70 69 6c 6c 73 20 61 72 65 20 70 72 6f 68 69 62  pills are prohib
5580: 69 74 65 64 2e 20 20 54 68 65 20 64 6f 4e 6f 74  ited.  The doNot
5590: 53 70 69 6c 6c 20 76 61 72 69 61 62 6c 65 0a 2a  Spill variable.*
55a0: 2a 20 20 20 69 6e 68 69 62 69 74 73 20 61 6c 6c  *   inhibits all
55b0: 20 63 61 63 68 65 20 73 70 69 6c 6c 20 61 6e 64   cache spill and
55c0: 20 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 20   doNotSyncSpill 
55d0: 69 6e 68 69 62 69 74 73 20 74 68 6f 73 65 20 73  inhibits those s
55e0: 70 69 6c 6c 73 20 74 68 61 74 0a 2a 2a 20 20 20  pills that.**   
55f0: 77 6f 75 6c 64 20 72 65 71 75 69 72 65 20 61 20  would require a 
5600: 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 2e 20 20 54  journal sync.  T
5610: 68 65 20 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c  he doNotSyncSpil
5620: 6c 20 69 73 20 73 65 74 20 61 6e 64 20 63 6c 65  l is set and cle
5630: 61 72 65 64 20 0a 2a 2a 20 20 20 62 79 20 73 71  ared .**   by sq
5640: 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
5650: 29 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 70 72  ) in order to pr
5660: 65 76 65 6e 74 20 61 20 6a 6f 75 72 6e 61 6c 20  event a journal 
5670: 73 79 6e 63 20 66 72 6f 6d 20 68 61 70 70 65 6e  sync from happen
5680: 69 6e 67 20 0a 2a 2a 20 20 20 69 6e 20 62 65 74  ing .**   in bet
5690: 77 65 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ween the journal
56a0: 6c 69 6e 67 20 6f 66 20 74 77 6f 20 70 61 67 65  ling of two page
56b0: 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 73 65  s on the same se
56c0: 63 74 6f 72 2e 20 20 54 68 65 0a 2a 2a 20 20 20  ctor.  The.**   
56d0: 64 6f 4e 6f 74 53 70 69 6c 6c 20 76 61 6c 75 65  doNotSpill value
56e0: 20 73 65 74 20 74 6f 20 70 72 65 76 65 6e 74 20   set to prevent 
56f0: 70 61 67 65 72 53 74 72 65 73 73 28 29 20 66 72  pagerStress() fr
5700: 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20 75 73 65  om trying to use
5710: 0a 2a 2a 20 20 20 74 68 65 20 6a 6f 75 72 6e 61  .**   the journa
5720: 6c 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62  l during a rollb
5730: 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 73 75 62 6a 49  ack..**.** subjI
5740: 6e 4d 65 6d 6f 72 79 0a 2a 2a 0a 2a 2a 20 20 20  nMemory.**.**   
5750: 54 68 69 73 20 69 73 20 61 20 62 6f 6f 6c 65 61  This is a boolea
5760: 6e 20 76 61 72 69 61 62 6c 65 2e 20 49 66 20 74  n variable. If t
5770: 72 75 65 2c 20 74 68 65 6e 20 61 6e 79 20 72 65  rue, then any re
5780: 71 75 69 72 65 64 20 73 75 62 2d 6a 6f 75 72 6e  quired sub-journ
5790: 61 6c 0a 2a 2a 20 20 20 69 73 20 6f 70 65 6e 65  al.**   is opene
57a0: 64 20 61 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  d as an in-memor
57b0: 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  y journal file. 
57c0: 49 66 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 69  If false, then i
57d0: 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 20 20 73 75  n-memory.**   su
57e0: 62 2d 6a 6f 75 72 6e 61 6c 73 20 61 72 65 20 6f  b-journals are o
57f0: 6e 6c 79 20 75 73 65 64 20 66 6f 72 20 69 6e 2d  nly used for in-
5800: 6d 65 6d 6f 72 79 20 70 61 67 65 72 20 66 69 6c  memory pager fil
5810: 65 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 50 61  es..*/.struct Pa
5820: 67 65 72 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f  ger {.  sqlite3_
5830: 76 66 73 20 2a 70 56 66 73 3b 20 20 20 20 20 20  vfs *pVfs;      
5840: 20 20 20 20 2f 2a 20 4f 53 20 66 75 6e 63 74 69      /* OS functi
5850: 6f 6e 73 20 74 6f 20 75 73 65 20 66 6f 72 20 49  ons to use for I
5860: 4f 20 2a 2f 0a 20 20 75 38 20 65 78 63 6c 75 73  O */.  u8 exclus
5870: 69 76 65 4d 6f 64 65 3b 20 20 20 20 20 20 20 20  iveMode;        
5880: 20 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e 2e 20 54     /* Boolean. T
5890: 72 75 65 20 69 66 20 6c 6f 63 6b 69 6e 67 5f 6d  rue if locking_m
58a0: 6f 64 65 3d 3d 45 58 43 4c 55 53 49 56 45 20 2a  ode==EXCLUSIVE *
58b0: 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c 4d 6f  /.  u8 journalMo
58c0: 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  de;             
58d0: 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 50 41  /* One of the PA
58e0: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
58f0: 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 75 38  * values */.  u8
5900: 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 20 20 20 20   useJournal;    
5910: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
5920: 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72   a rollback jour
5930: 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66 69 6c 65  nal on this file
5940: 20 2a 2f 0a 20 20 75 38 20 6e 6f 52 65 61 64 6c   */.  u8 noReadl
5950: 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ock;            
5960: 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68    /* Do not both
5970: 65 72 20 74 6f 20 6f 62 74 61 69 6e 20 72 65 61  er to obtain rea
5980: 64 6c 6f 63 6b 73 20 2a 2f 0a 20 20 75 38 20 6e  dlocks */.  u8 n
5990: 6f 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20  oSync;          
59a0: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
59b0: 74 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  t sync the journ
59c0: 61 6c 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20  al if true */.  
59d0: 75 38 20 66 75 6c 6c 53 79 6e 63 3b 20 20 20 20  u8 fullSync;    
59e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
59f0: 6f 20 65 78 74 72 61 20 73 79 6e 63 73 20 6f 66  o extra syncs of
5a00: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72   the journal for
5a10: 20 72 6f 62 75 73 74 6e 65 73 73 20 2a 2f 0a 20   robustness */. 
5a20: 20 75 38 20 73 79 6e 63 5f 66 6c 61 67 73 3b 20   u8 sync_flags; 
5a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5a40: 4f 6e 65 20 6f 66 20 53 59 4e 43 5f 4e 4f 52 4d  One of SYNC_NORM
5a50: 41 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20  AL or SYNC_FULL 
5a60: 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46 69 6c 65  */.  u8 tempFile
5a70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5a80: 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73   /* zFilename is
5a90: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
5aa0: 65 20 2a 2f 0a 20 20 75 38 20 72 65 61 64 4f 6e  e */.  u8 readOn
5ab0: 6c 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ly;             
5ac0: 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61     /* True for a
5ad0: 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62   read-only datab
5ae0: 61 73 65 20 2a 2f 0a 20 20 75 38 20 6d 65 6d 44  ase */.  u8 memD
5af0: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
5b00: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
5b10: 69 6e 68 69 62 69 74 20 61 6c 6c 20 66 69 6c 65  inhibit all file
5b20: 20 49 2f 4f 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68   I/O */..  /* Th
5b30: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63  e following bloc
5b40: 6b 20 63 6f 6e 74 61 69 6e 73 20 74 68 6f 73 65  k contains those
5b50: 20 63 6c 61 73 73 20 6d 65 6d 62 65 72 73 20 74   class members t
5b60: 68 61 74 20 61 72 65 20 64 79 6e 61 6d 69 63 61  hat are dynamica
5b70: 6c 6c 79 0a 20 20 2a 2a 20 6d 6f 64 69 66 69 65  lly.  ** modifie
5b80: 64 20 64 75 72 69 6e 67 20 6e 6f 72 6d 61 6c 20  d during normal 
5b90: 6f 70 65 72 61 74 69 6f 6e 73 2e 20 54 68 65 20  operations. The 
5ba0: 6f 74 68 65 72 20 76 61 72 69 61 62 6c 65 73 20  other variables 
5bb0: 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72  in this structur
5bc0: 65 0a 20 20 2a 2a 20 61 72 65 20 65 69 74 68 65  e.  ** are eithe
5bd0: 72 20 63 6f 6e 73 74 61 6e 74 20 74 68 72 6f 75  r constant throu
5be0: 67 68 6f 75 74 20 74 68 65 20 6c 69 66 65 74 69  ghout the lifeti
5bf0: 6d 65 20 6f 66 20 74 68 65 20 70 61 67 65 72 2c  me of the pager,
5c00: 20 6f 72 20 65 6c 73 65 0a 20 20 2a 2a 20 75 73   or else.  ** us
5c10: 65 64 20 74 6f 20 73 74 6f 72 65 20 63 6f 6e 66  ed to store conf
5c20: 69 67 75 72 61 74 69 6f 6e 20 70 61 72 61 6d 65  iguration parame
5c30: 74 65 72 73 20 74 68 61 74 20 61 66 66 65 63 74  ters that affect
5c40: 20 74 68 65 20 77 61 79 20 74 68 65 20 70 61 67   the way the pag
5c50: 65 72 20 0a 20 20 2a 2a 20 6f 70 65 72 61 74 65  er .  ** operate
5c60: 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  s..  **.  ** The
5c70: 20 27 73 74 61 74 65 27 20 76 61 72 69 61 62 6c   'state' variabl
5c80: 65 20 69 73 20 64 65 73 63 72 69 62 65 64 20 69  e is described i
5c90: 6e 20 6d 6f 72 65 20 64 65 74 61 69 6c 20 61 6c  n more detail al
5ca0: 6f 6e 67 20 77 69 74 68 20 74 68 65 0a 20 20 2a  ong with the.  *
5cb0: 2a 20 64 65 73 63 72 69 70 74 69 6f 6e 73 20 6f  * descriptions o
5cc0: 66 20 74 68 65 20 76 61 6c 75 65 73 20 69 74 20  f the values it 
5cd0: 6d 61 79 20 74 61 6b 65 20 2d 20 50 41 47 45 52  may take - PAGER
5ce0: 5f 55 4e 4c 4f 43 4b 20 65 74 63 2e 20 4d 61 6e  _UNLOCK etc. Man
5cf0: 79 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 6f 74  y of the.  ** ot
5d00: 68 65 72 20 76 61 72 69 61 62 6c 65 73 20 69 6e  her variables in
5d10: 20 74 68 69 73 20 62 6c 6f 63 6b 20 61 72 65 20   this block are 
5d20: 64 65 73 63 72 69 62 65 64 20 69 6e 20 74 68 65  described in the
5d30: 20 63 6f 6d 6d 65 6e 74 20 64 69 72 65 63 74 6c   comment directl
5d40: 79 20 0a 20 20 2a 2a 20 61 62 6f 76 65 20 74 68  y .  ** above th
5d50: 69 73 20 63 6c 61 73 73 20 64 65 66 69 6e 69 74  is class definit
5d60: 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 75 38 20 65  ion..  */.  u8 e
5d70: 53 74 61 74 65 3b 20 20 20 20 20 20 20 20 20 20  State;          
5d80: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72          /* Pager
5d90: 20 73 74 61 74 65 20 28 4e 4f 4e 45 2c 20 52 45   state (NONE, RE
5da0: 41 44 45 52 2c 20 57 52 49 54 45 52 5f 49 4e 49  ADER, WRITER_INI
5db0: 54 49 41 4c 2e 2e 29 20 2a 2f 0a 20 20 75 38 20  TIAL..) */.  u8 
5dc0: 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20  eLock;          
5dd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
5de0: 65 6e 74 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e  ent lock held on
5df0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
5e00: 2f 0a 20 20 75 38 20 63 68 61 6e 67 65 43 6f 75  /.  u8 changeCou
5e10: 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20 20 20 20  ntDone;         
5e20: 2f 2a 20 53 65 74 20 61 66 74 65 72 20 69 6e 63  /* Set after inc
5e30: 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63 68  rementing the ch
5e40: 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 2a 2f 0a  ange-counter */.
5e50: 20 20 75 38 20 73 65 74 4d 61 73 74 65 72 3b 20    u8 setMaster; 
5e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5e70: 20 54 72 75 65 20 69 66 20 61 20 6d 2d 6a 20 6e   True if a m-j n
5e80: 61 6d 65 20 68 61 73 20 62 65 65 6e 20 77 72 69  ame has been wri
5e90: 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20 2a 2f 0a  tten to jrnl */.
5ea0: 20 20 75 38 20 64 6f 4e 6f 74 53 70 69 6c 6c 3b    u8 doNotSpill;
5eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5ec0: 20 44 6f 20 6e 6f 74 20 73 70 69 6c 6c 20 74 68   Do not spill th
5ed0: 65 20 63 61 63 68 65 20 77 68 65 6e 20 6e 6f 6e  e cache when non
5ee0: 2d 7a 65 72 6f 20 2a 2f 0a 20 20 75 38 20 64 6f  -zero */.  u8 do
5ef0: 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 3b 20 20 20  NotSyncSpill;   
5f00: 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
5f10: 20 64 6f 20 61 20 73 70 69 6c 6c 20 74 68 61 74   do a spill that
5f20: 20 72 65 71 75 69 72 65 73 20 6a 72 6e 6c 20 73   requires jrnl s
5f30: 79 6e 63 20 2a 2f 0a 20 20 75 38 20 73 75 62 6a  ync */.  u8 subj
5f40: 49 6e 4d 65 6d 6f 72 79 3b 20 20 20 20 20 20 20  InMemory;       
5f50: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
5f60: 75 73 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 75  use in-memory su
5f70: 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f 0a 20 20  b-journals */.  
5f80: 50 67 6e 6f 20 64 62 53 69 7a 65 3b 20 20 20 20  Pgno dbSize;    
5f90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
5fa0: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
5fb0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a  n the database *
5fc0: 2f 0a 20 20 50 67 6e 6f 20 64 62 4f 72 69 67 53  /.  Pgno dbOrigS
5fd0: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
5fe0: 2f 2a 20 64 62 53 69 7a 65 20 62 65 66 6f 72 65  /* dbSize before
5ff0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
6000: 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 50 67  nsaction */.  Pg
6010: 6e 6f 20 64 62 46 69 6c 65 53 69 7a 65 3b 20 20  no dbFileSize;  
6020: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
6030: 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
6040: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
6050: 65 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72 43 6f  e */.  int errCo
6060: 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  de;             
6070: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 73 65 76     /* One of sev
6080: 65 72 61 6c 20 6b 69 6e 64 73 20 6f 66 20 65 72  eral kinds of er
6090: 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  rors */.  int nR
60a0: 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
60b0: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 73 20 6a        /* Pages j
60c0: 6f 75 72 6e 61 6c 6c 65 64 20 73 69 6e 63 65 20  ournalled since 
60d0: 6c 61 73 74 20 6a 2d 68 65 61 64 65 72 20 77 72  last j-header wr
60e0: 69 74 74 65 6e 20 2a 2f 0a 20 20 75 33 32 20 63  itten */.  u32 c
60f0: 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20 20 20 20  ksumInit;       
6100: 20 20 20 20 20 20 20 2f 2a 20 51 75 61 73 69 2d         /* Quasi-
6110: 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 61 64 64  random value add
6120: 65 64 20 74 6f 20 65 76 65 72 79 20 63 68 65 63  ed to every chec
6130: 6b 73 75 6d 20 2a 2f 0a 20 20 75 33 32 20 6e 53  ksum */.  u32 nS
6140: 75 62 52 65 63 3b 20 20 20 20 20 20 20 20 20 20  ubRec;          
6150: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
6160: 6f 66 20 72 65 63 6f 72 64 73 20 77 72 69 74 74  of records writt
6170: 65 6e 20 74 6f 20 73 75 62 2d 6a 6f 75 72 6e 61  en to sub-journa
6180: 6c 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70  l */.  Bitvec *p
6190: 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20  InJournal;      
61a0: 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20 66 6f     /* One bit fo
61b0: 72 20 65 61 63 68 20 70 61 67 65 20 69 6e 20 74  r each page in t
61c0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
61d0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
61e0: 6c 65 20 2a 66 64 3b 20 20 20 20 20 20 20 20 20  le *fd;         
61f0: 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69    /* File descri
6200: 70 74 6f 72 20 66 6f 72 20 64 61 74 61 62 61 73  ptor for databas
6210: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  e */.  sqlite3_f
6220: 69 6c 65 20 2a 6a 66 64 3b 20 20 20 20 20 20 20  ile *jfd;       
6230: 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72     /* File descr
6240: 69 70 74 6f 72 20 66 6f 72 20 6d 61 69 6e 20 6a  iptor for main j
6250: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 73 71 6c 69  ournal */.  sqli
6260: 74 65 33 5f 66 69 6c 65 20 2a 73 6a 66 64 3b 20  te3_file *sjfd; 
6270: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
6280: 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 73  descriptor for s
6290: 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  ub-journal */.  
62a0: 69 36 34 20 6a 6f 75 72 6e 61 6c 4f 66 66 3b 20  i64 journalOff; 
62b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
62c0: 75 72 72 65 6e 74 20 77 72 69 74 65 20 6f 66 66  urrent write off
62d0: 73 65 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  set in the journ
62e0: 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34  al file */.  i64
62f0: 20 6a 6f 75 72 6e 61 6c 48 64 72 3b 20 20 20 20   journalHdr;    
6300: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
6310: 20 6f 66 66 73 65 74 20 74 6f 20 70 72 65 76 69   offset to previ
6320: 6f 75 73 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ous journal head
6330: 65 72 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72  er */.  i64 jour
6340: 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20 20  nalSizeLimit;   
6350: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6c 69 6d 69      /* Size limi
6360: 74 20 66 6f 72 20 70 65 72 73 69 73 74 65 6e 74  t for persistent
6370: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a   journal files *
6380: 2f 0a 20 20 50 61 67 65 72 53 61 76 65 70 6f 69  /.  PagerSavepoi
6390: 6e 74 20 2a 61 53 61 76 65 70 6f 69 6e 74 3b 20  nt *aSavepoint; 
63a0: 2f 2a 20 41 72 72 61 79 20 6f 66 20 61 63 74 69  /* Array of acti
63b0: 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 2a 2f  ve savepoints */
63c0: 0a 20 20 69 6e 74 20 6e 53 61 76 65 70 6f 69 6e  .  int nSavepoin
63d0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t;             /
63e0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  * Number of elem
63f0: 65 6e 74 73 20 69 6e 20 61 53 61 76 65 70 6f 69  ents in aSavepoi
6400: 6e 74 5b 5d 20 2a 2f 0a 20 20 63 68 61 72 20 64  nt[] */.  char d
6410: 62 46 69 6c 65 56 65 72 73 5b 31 36 5d 3b 20 20  bFileVers[16];  
6420: 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 73        /* Changes
6430: 20 77 68 65 6e 65 76 65 72 20 64 61 74 61 62 61   whenever databa
6440: 73 65 20 66 69 6c 65 20 63 68 61 6e 67 65 73 20  se file changes 
6450: 2a 2f 0a 20 20 75 33 32 20 73 65 63 74 6f 72 53  */.  u32 sectorS
6460: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
6470: 20 2f 2a 20 41 73 73 75 6d 65 64 20 73 65 63 74   /* Assumed sect
6480: 6f 72 20 73 69 7a 65 20 64 75 72 69 6e 67 20 72  or size during r
6490: 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 0a 20 20 75 31  ollback */..  u1
64a0: 36 20 6e 45 78 74 72 61 3b 20 20 20 20 20 20 20  6 nExtra;       
64b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
64c0: 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73   this many bytes
64d0: 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f   to each in-memo
64e0: 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 31 36  ry page */.  i16
64f0: 20 6e 52 65 73 65 72 76 65 3b 20 20 20 20 20 20   nReserve;      
6500: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
6510: 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62 79 74  er of unused byt
6520: 65 73 20 61 74 20 65 6e 64 20 6f 66 20 65 61 63  es at end of eac
6530: 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 33 32 20  h page */.  u32 
6540: 76 66 73 46 6c 61 67 73 3b 20 20 20 20 20 20 20  vfsFlags;       
6550: 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
6560: 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 76 66 73   for sqlite3_vfs
6570: 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 69 6e  .xOpen() */.  in
6580: 74 20 70 61 67 65 53 69 7a 65 3b 20 20 20 20 20  t pageSize;     
6590: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
65a0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
65b0: 61 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  a page */.  Pgno
65c0: 20 6d 78 50 67 6e 6f 3b 20 20 20 20 20 20 20 20   mxPgno;        
65d0: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d          /* Maxim
65e0: 75 6d 20 61 6c 6c 6f 77 65 64 20 73 69 7a 65 20  um allowed size 
65f0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
6600: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65  */.  char *zFile
6610: 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  name;           
6620: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
6630: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
6640: 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61  .  char *zJourna
6650: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
6660: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f  * Name of the jo
6670: 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
6680: 69 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64 6c  int (*xBusyHandl
6690: 65 72 29 28 76 6f 69 64 2a 29 3b 20 2f 2a 20 46  er)(void*); /* F
66a0: 75 6e 63 74 69 6f 6e 20 74 6f 20 63 61 6c 6c 20  unction to call 
66b0: 77 68 65 6e 20 62 75 73 79 20 2a 2f 0a 20 20 76  when busy */.  v
66c0: 6f 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c 65  oid *pBusyHandle
66d0: 72 41 72 67 3b 20 20 20 20 20 20 2f 2a 20 43 6f  rArg;      /* Co
66e0: 6e 74 65 78 74 20 61 72 67 75 6d 65 6e 74 20 66  ntext argument f
66f0: 6f 72 20 78 42 75 73 79 48 61 6e 64 6c 65 72 20  or xBusyHandler 
6700: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
6710: 5f 54 45 53 54 0a 20 20 69 6e 74 20 6e 48 69 74  _TEST.  int nHit
6720: 2c 20 6e 4d 69 73 73 3b 20 20 20 20 20 20 20 20  , nMiss;        
6730: 20 20 20 20 2f 2a 20 43 61 63 68 65 20 68 69 74      /* Cache hit
6740: 73 20 61 6e 64 20 6d 69 73 73 69 6e 67 20 2a 2f  s and missing */
6750: 0a 20 20 69 6e 74 20 6e 52 65 61 64 2c 20 6e 57  .  int nRead, nW
6760: 72 69 74 65 3b 20 20 20 20 20 20 20 20 20 20 2f  rite;          /
6770: 2a 20 44 61 74 61 62 61 73 65 20 70 61 67 65 73  * Database pages
6780: 20 72 65 61 64 2f 77 72 69 74 74 65 6e 20 2a 2f   read/written */
6790: 0a 23 65 6e 64 69 66 0a 20 20 76 6f 69 64 20 28  .#endif.  void (
67a0: 2a 78 52 65 69 6e 69 74 65 72 29 28 44 62 50 61  *xReiniter)(DbPa
67b0: 67 65 2a 29 3b 20 2f 2a 20 43 61 6c 6c 20 74 68  ge*); /* Call th
67c0: 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20  is routine when 
67d0: 72 65 6c 6f 61 64 69 6e 67 20 70 61 67 65 73 20  reloading pages 
67e0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
67f0: 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 76 6f 69  _HAS_CODEC.  voi
6800: 64 20 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f 69  d *(*xCodec)(voi
6810: 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e  d*,void*,Pgno,in
6820: 74 29 3b 20 2f 2a 20 52 6f 75 74 69 6e 65 20 66  t); /* Routine f
6830: 6f 72 20 65 6e 2f 64 65 63 6f 64 69 6e 67 20 64  or en/decoding d
6840: 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a  ata */.  void (*
6850: 78 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 29 28  xCodecSizeChng)(
6860: 76 6f 69 64 2a 2c 69 6e 74 2c 69 6e 74 29 3b 20  void*,int,int); 
6870: 2f 2a 20 4e 6f 74 69 66 79 20 6f 66 20 70 61 67  /* Notify of pag
6880: 65 20 73 69 7a 65 20 63 68 61 6e 67 65 73 20 2a  e size changes *
6890: 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64 65  /.  void (*xCode
68a0: 63 46 72 65 65 29 28 76 6f 69 64 2a 29 3b 20 20  cFree)(void*);  
68b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
68c0: 73 74 72 75 63 74 6f 72 20 66 6f 72 20 74 68 65  structor for the
68d0: 20 63 6f 64 65 63 20 2a 2f 0a 20 20 76 6f 69 64   codec */.  void
68e0: 20 2a 70 43 6f 64 65 63 3b 20 20 20 20 20 20 20   *pCodec;       
68f0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
6900: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 43 6f   argument to xCo
6910: 64 65 63 2e 2e 2e 20 6d 65 74 68 6f 64 73 20 2a  dec... methods *
6920: 2f 0a 23 65 6e 64 69 66 0a 20 20 63 68 61 72 20  /.#endif.  char 
6930: 2a 70 54 6d 70 53 70 61 63 65 3b 20 20 20 20 20  *pTmpSpace;     
6940: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 2e         /* Pager.
6950: 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f  pageSize bytes o
6960: 66 20 73 70 61 63 65 20 66 6f 72 20 74 6d 70 20  f space for tmp 
6970: 75 73 65 20 2a 2f 0a 20 20 50 43 61 63 68 65 20  use */.  PCache 
6980: 2a 70 50 43 61 63 68 65 3b 20 20 20 20 20 20 20  *pPCache;       
6990: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
69a0: 74 6f 20 70 61 67 65 20 63 61 63 68 65 20 6f 62  to page cache ob
69b0: 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ject */.  sqlite
69c0: 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63 6b 75  3_backup *pBacku
69d0: 70 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72  p;    /* Pointer
69e0: 20 74 6f 20 6c 69 73 74 20 6f 66 20 6f 6e 67 6f   to list of ongo
69f0: 69 6e 67 20 62 61 63 6b 75 70 20 70 72 6f 63 65  ing backup proce
6a00: 73 73 65 73 20 2a 2f 0a 23 69 66 6e 64 65 66 20  sses */.#ifndef 
6a10: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
6a20: 20 20 57 61 6c 20 2a 70 57 61 6c 3b 20 20 20 20    Wal *pWal;    
6a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6a40: 20 57 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67   Write-ahead log
6a50: 20 75 73 65 64 20 62 79 20 22 6a 6f 75 72 6e 61   used by "journa
6a60: 6c 5f 6d 6f 64 65 3d 77 61 6c 22 20 2a 2f 0a 20  l_mode=wal" */. 
6a70: 20 63 68 61 72 20 2a 7a 57 61 6c 3b 20 20 20 20   char *zWal;    
6a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6a90: 46 69 6c 65 20 6e 61 6d 65 20 66 6f 72 20 77 72  File name for wr
6aa0: 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 20 2a 2f  ite-ahead log */
6ab0: 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a  .#endif.};../*.*
6ac0: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
6ad0: 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 73  global variables
6ae0: 20 68 6f 6c 64 20 63 6f 75 6e 74 65 72 73 20 75   hold counters u
6af0: 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69  sed for.** testi
6b00: 6e 67 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79  ng purposes only
6b10: 2e 20 20 54 68 65 73 65 20 76 61 72 69 61 62 6c  .  These variabl
6b20: 65 73 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 20  es do not exist 
6b30: 69 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73 74  in.** a non-test
6b40: 69 6e 67 20 62 75 69 6c 64 2e 20 20 54 68 65 73  ing build.  Thes
6b50: 65 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20  e variables are 
6b60: 6e 6f 74 20 74 68 72 65 61 64 2d 73 61 66 65 2e  not thread-safe.
6b70: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
6b80: 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74  E_TEST.int sqlit
6b90: 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f  e3_pager_readdb_
6ba0: 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a  count = 0;    /*
6bb0: 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20   Number of full 
6bc0: 70 61 67 65 73 20 72 65 61 64 20 66 72 6f 6d 20  pages read from 
6bd0: 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  DB */.int sqlite
6be0: 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f  3_pager_writedb_
6bf0: 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 2f 2a 20  count = 0;   /* 
6c00: 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70  Number of full p
6c10: 61 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20  ages written to 
6c20: 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  DB */.int sqlite
6c30: 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63  3_pager_writej_c
6c40: 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20  ount = 0;    /* 
6c50: 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
6c60: 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e  written to journ
6c70: 61 6c 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 50  al */.# define P
6c80: 41 47 45 52 5f 49 4e 43 52 28 76 29 20 20 76 2b  AGER_INCR(v)  v+
6c90: 2b 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  +.#else.# define
6ca0: 20 50 41 47 45 52 5f 49 4e 43 52 28 76 29 0a 23   PAGER_INCR(v).#
6cb0: 65 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 4a  endif..../*.** J
6cc0: 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 62 65 67  ournal files beg
6cd0: 69 6e 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c  in with the foll
6ce0: 6f 77 69 6e 67 20 6d 61 67 69 63 20 73 74 72 69  owing magic stri
6cf0: 6e 67 2e 20 20 54 68 65 20 64 61 74 61 0a 2a 2a  ng.  The data.**
6d00: 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72   was obtained fr
6d10: 6f 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e 20  om /dev/random. 
6d20: 20 49 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79   It is used only
6d30: 20 61 73 20 61 20 73 61 6e 69 74 79 20 63 68 65   as a sanity che
6d40: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20  ck..**.** Since 
6d50: 76 65 72 73 69 6f 6e 20 32 2e 38 2e 30 2c 20 74  version 2.8.0, t
6d60: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  he journal forma
6d70: 74 20 63 6f 6e 74 61 69 6e 73 20 61 64 64 69 74  t contains addit
6d80: 69 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a 2a 20  ional sanity.** 
6d90: 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61  checking informa
6da0: 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 70 6f  tion.  If the po
6db0: 77 65 72 20 66 61 69 6c 73 20 77 68 69 6c 65 20  wer fails while 
6dc0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62  the journal is b
6dd0: 65 69 6e 67 0a 2a 2a 20 77 72 69 74 74 65 6e 2c  eing.** written,
6de0: 20 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67 61 72   semi-random gar
6df0: 62 61 67 65 20 64 61 74 61 20 6d 69 67 68 74 20  bage data might 
6e00: 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6a 6f  appear in the jo
6e10: 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 61 66  urnal.** file af
6e20: 74 65 72 20 70 6f 77 65 72 20 69 73 20 72 65 73  ter power is res
6e30: 74 6f 72 65 64 2e 20 20 49 66 20 61 6e 20 61 74  tored.  If an at
6e40: 74 65 6d 70 74 20 69 73 20 74 68 65 6e 20 6d 61  tempt is then ma
6e50: 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74 68  de.** to roll th
6e60: 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2c 20  e journal back, 
6e70: 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 75  the database cou
6e80: 6c 64 20 62 65 20 63 6f 72 72 75 70 74 65 64 2e  ld be corrupted.
6e90: 20 20 54 68 65 20 61 64 64 69 74 69 6f 6e 61 6c    The additional
6ea0: 0a 2a 2a 20 73 61 6e 69 74 79 20 63 68 65 63 6b  .** sanity check
6eb0: 69 6e 67 20 64 61 74 61 20 69 73 20 61 6e 20 61  ing data is an a
6ec0: 74 74 65 6d 70 74 20 74 6f 20 64 69 73 63 6f 76  ttempt to discov
6ed0: 65 72 20 74 68 65 20 67 61 72 62 61 67 65 20 69  er the garbage i
6ee0: 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  n the.** journal
6ef0: 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a   and ignore it..
6f00: 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69 74 79  **.** The sanity
6f10: 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d   checking inform
6f20: 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e 65  ation for the ne
6f30: 77 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  w journal format
6f40: 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 66 20   consists.** of 
6f50: 61 20 33 32 2d 62 69 74 20 63 68 65 63 6b 73 75  a 32-bit checksu
6f60: 6d 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 6f  m on each page o
6f70: 66 20 64 61 74 61 2e 20 20 54 68 65 20 63 68 65  f data.  The che
6f80: 63 6b 73 75 6d 20 63 6f 76 65 72 73 20 62 6f 74  cksum covers bot
6f90: 68 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 75  h.** the page nu
6fa0: 6d 62 65 72 20 61 6e 64 20 74 68 65 20 70 50 61  mber and the pPa
6fb0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79  ger->pageSize by
6fc0: 74 65 73 20 6f 66 20 64 61 74 61 20 66 6f 72 20  tes of data for 
6fd0: 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68 69  the page..** Thi
6fe0: 73 20 63 6b 73 75 6d 20 69 73 20 69 6e 69 74 69  s cksum is initi
6ff0: 61 6c 69 7a 65 64 20 74 6f 20 61 20 33 32 2d 62  alized to a 32-b
7000: 69 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20  it random value 
7010: 74 68 61 74 20 61 70 70 65 61 72 73 20 69 6e 20  that appears in 
7020: 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
7030: 69 6c 65 20 72 69 67 68 74 20 61 66 74 65 72 20  ile right after 
7040: 74 68 65 20 68 65 61 64 65 72 2e 20 20 54 68 65  the header.  The
7050: 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 69   random initiali
7060: 7a 65 72 20 69 73 20 69 6d 70 6f 72 74 61 6e 74  zer is important
7070: 2c 0a 2a 2a 20 62 65 63 61 75 73 65 20 67 61 72  ,.** because gar
7080: 62 61 67 65 20 64 61 74 61 20 74 68 61 74 20 61  bage data that a
7090: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 65 6e  ppears at the en
70a0: 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 69  d of a journal i
70b0: 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61 74 61  s likely.** data
70c0: 20 74 68 61 74 20 77 61 73 20 6f 6e 63 65 20 69   that was once i
70d0: 6e 20 6f 74 68 65 72 20 66 69 6c 65 73 20 74 68  n other files th
70e0: 61 74 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e  at have now been
70f0: 20 64 65 6c 65 74 65 64 2e 20 20 49 66 20 74 68   deleted.  If th
7100: 65 0a 2a 2a 20 67 61 72 62 61 67 65 20 64 61 74  e.** garbage dat
7110: 61 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e 20 6f  a came from an o
7120: 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20  bsolete journal 
7130: 66 69 6c 65 2c 20 74 68 65 20 63 68 65 63 6b 73  file, the checks
7140: 75 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20  ums might.** be 
7150: 63 6f 72 72 65 63 74 2e 20 20 42 75 74 20 62 79  correct.  But by
7160: 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68   initializing th
7170: 65 20 63 68 65 63 6b 73 75 6d 20 74 6f 20 72 61  e checksum to ra
7180: 6e 64 6f 6d 20 76 61 6c 75 65 20 77 68 69 63 68  ndom value which
7190: 0a 2a 2a 20 69 73 20 64 69 66 66 65 72 65 6e 74  .** is different
71a0: 20 66 6f 72 20 65 76 65 72 79 20 6a 6f 75 72 6e   for every journ
71b0: 61 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20  al, we minimize 
71c0: 74 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74  that risk..*/.st
71d0: 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67  atic const unsig
71e0: 6e 65 64 20 63 68 61 72 20 61 4a 6f 75 72 6e 61  ned char aJourna
71f0: 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20 30  lMagic[] = {.  0
7200: 78 64 39 2c 20 30 78 64 35 2c 20 30 78 30 35 2c  xd9, 0xd5, 0x05,
7210: 20 30 78 66 39 2c 20 30 78 32 30 2c 20 30 78 61   0xf9, 0x20, 0xa
7220: 31 2c 20 30 78 36 33 2c 20 30 78 64 37 2c 0a 7d  1, 0x63, 0xd7,.}
7230: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a  ;../*.** The siz
7240: 65 20 6f 66 20 74 68 65 20 6f 66 20 65 61 63 68  e of the of each
7250: 20 70 61 67 65 20 72 65 63 6f 72 64 20 69 6e 20   page record in 
7260: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 67  the journal is g
7270: 69 76 65 6e 20 62 79 0a 2a 2a 20 74 68 65 20 66  iven by.** the f
7280: 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 2e 0a  ollowing macro..
7290: 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e  */.#define JOURN
72a0: 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29  AL_PG_SZ(pPager)
72b0: 20 20 28 28 70 50 61 67 65 72 2d 3e 70 61 67 65    ((pPager->page
72c0: 53 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a  Size) + 8)../*.*
72d0: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  * The journal he
72e0: 61 64 65 72 20 73 69 7a 65 20 66 6f 72 20 74 68  ader size for th
72f0: 69 73 20 70 61 67 65 72 2e 20 54 68 69 73 20 69  is pager. This i
7300: 73 20 75 73 75 61 6c 6c 79 20 74 68 65 20 73 61  s usually the sa
7310: 6d 65 20 0a 2a 2a 20 73 69 7a 65 20 61 73 20 61  me .** size as a
7320: 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63   single disk sec
7330: 74 6f 72 2e 20 53 65 65 20 61 6c 73 6f 20 73 65  tor. See also se
7340: 74 53 65 63 74 6f 72 53 69 7a 65 28 29 2e 0a 2a  tSectorSize()..*
7350: 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41  /.#define JOURNA
7360: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
7370: 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72   (pPager->sector
7380: 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  Size)../*.** The
7390: 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69 73 20   macro MEMDB is 
73a0: 74 72 75 65 20 69 66 20 77 65 20 61 72 65 20 64  true if we are d
73b0: 65 61 6c 69 6e 67 20 77 69 74 68 20 61 6e 20 69  ealing with an i
73c0: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
73d0: 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69 73  e..** We do this
73e0: 20 61 73 20 61 20 6d 61 63 72 6f 20 73 6f 20 74   as a macro so t
73f0: 68 61 74 20 69 66 20 74 68 65 20 53 51 4c 49 54  hat if the SQLIT
7400: 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20  E_OMIT_MEMORYDB 
7410: 6d 61 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a 2a  macro is set,.**
7420: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 4d 45   the value of ME
7430: 4d 44 42 20 77 69 6c 6c 20 62 65 20 61 20 63 6f  MDB will be a co
7440: 6e 73 74 61 6e 74 20 61 6e 64 20 74 68 65 20 63  nstant and the c
7450: 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70 74  ompiler will opt
7460: 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f 64  imize.** out cod
7470: 65 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 65 76  e that would nev
7480: 65 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a 23  er execute..*/.#
7490: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
74a0: 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65 66  T_MEMORYDB.# def
74b0: 69 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c 73  ine MEMDB 0.#els
74c0: 65 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42  e.# define MEMDB
74d0: 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a 23   pPager->memDb.#
74e0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
74f0: 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 20 70   maximum legal p
7500: 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 28 32  age number is (2
7510: 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65  ^31 - 1)..*/.#de
7520: 66 69 6e 65 20 50 41 47 45 52 5f 4d 41 58 5f 50  fine PAGER_MAX_P
7530: 47 4e 4f 20 32 31 34 37 34 38 33 36 34 37 0a 0a  GNO 2147483647..
7540: 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65  /*.** The argume
7550: 6e 74 20 74 6f 20 74 68 69 73 20 6d 61 63 72 6f  nt to this macro
7560: 20 69 73 20 61 20 66 69 6c 65 20 64 65 73 63 72   is a file descr
7570: 69 70 74 6f 72 20 28 74 79 70 65 20 73 71 6c 69  iptor (type sqli
7580: 74 65 33 5f 66 69 6c 65 2a 29 2e 0a 2a 2a 20 52  te3_file*)..** R
7590: 65 74 75 72 6e 20 30 20 69 66 20 69 74 20 69 73  eturn 0 if it is
75a0: 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 6e 6f   not open, or no
75b0: 6e 2d 7a 65 72 6f 20 28 62 75 74 20 6e 6f 74 20  n-zero (but not 
75c0: 31 29 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a  1) if it is..**.
75d0: 2a 2a 20 54 68 69 73 20 69 73 20 73 6f 20 74 68  ** This is so th
75e0: 61 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 63  at expressions c
75f0: 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61 73  an be written as
7600: 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 69 73  :.**.**   if( is
7610: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
7620: 29 20 29 7b 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 69  ) ){ ....**.** i
7630: 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 0a 2a 2a 20  nstead of.**.** 
7640: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 66    if( pPager->jf
7650: 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 20 2e  d->pMethods ){ .
7660: 2e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69 73  ...*/.#define is
7670: 4f 70 65 6e 28 70 46 64 29 20 28 28 70 46 64 29  Open(pFd) ((pFd)
7680: 2d 3e 70 4d 65 74 68 6f 64 73 29 0a 0a 2f 2a 0a  ->pMethods)../*.
7690: 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
76a0: 66 20 74 68 69 73 20 70 61 67 65 72 20 75 73 65  f this pager use
76b0: 73 20 61 20 77 72 69 74 65 2d 61 68 65 61 64 20  s a write-ahead 
76c0: 6c 6f 67 20 69 6e 73 74 65 61 64 20 6f 66 20 74  log instead of t
76d0: 68 65 20 75 73 75 61 6c 0a 2a 2a 20 72 6f 6c 6c  he usual.** roll
76e0: 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 4f 74  back journal. Ot
76f0: 68 65 72 77 69 73 65 20 66 61 6c 73 65 2e 0a 2a  herwise false..*
7700: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
7710: 5f 4f 4d 49 54 5f 57 41 4c 0a 73 74 61 74 69 63  _OMIT_WAL.static
7720: 20 69 6e 74 20 70 61 67 65 72 55 73 65 57 61 6c   int pagerUseWal
7730: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
7740: 0a 20 20 72 65 74 75 72 6e 20 28 70 50 61 67 65  .  return (pPage
7750: 72 2d 3e 70 57 61 6c 21 3d 30 29 3b 0a 7d 0a 23  r->pWal!=0);.}.#
7760: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61  else.# define pa
7770: 67 65 72 55 73 65 57 61 6c 28 78 29 20 30 0a 23  gerUseWal(x) 0.#
7780: 20 64 65 66 69 6e 65 20 70 61 67 65 72 52 6f 6c   define pagerRol
7790: 6c 62 61 63 6b 57 61 6c 28 78 29 20 30 0a 23 20  lbackWal(x) 0.# 
77a0: 64 65 66 69 6e 65 20 70 61 67 65 72 57 61 6c 46  define pagerWalF
77b0: 72 61 6d 65 73 28 76 2c 77 2c 78 2c 79 2c 7a 29  rames(v,w,x,y,z)
77c0: 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65   0.# define page
77d0: 72 4f 70 65 6e 57 61 6c 49 66 50 72 65 73 65 6e  rOpenWalIfPresen
77e0: 74 28 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23  t(z) SQLITE_OK.#
77f0: 20 64 65 66 69 6e 65 20 70 61 67 65 72 42 65 67   define pagerBeg
7800: 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f  inReadTransactio
7810: 6e 28 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23  n(z) SQLITE_OK.#
7820: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 4e  endif..#ifndef N
7830: 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20 55 73 61  DEBUG ./*.** Usa
7840: 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73 65  ge:.**.**   asse
7850: 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
7860: 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
7870: 3b 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.*/.static int 
7880: 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
7890: 74 65 28 50 61 67 65 72 20 2a 70 29 7b 0a 20 20  te(Pager *p){.  
78a0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
78b0: 70 3b 0a 0a 20 20 2f 2a 20 53 74 61 74 65 20 6d  p;..  /* State m
78c0: 75 73 74 20 62 65 20 76 61 6c 69 64 2e 20 2a 2f  ust be valid. */
78d0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 53  .  assert( p->eS
78e0: 74 61 74 65 3d 3d 50 41 47 45 52 5f 4e 4f 4e 45  tate==PAGER_NONE
78f0: 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53  .       || p->eS
7900: 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44  tate==PAGER_READ
7910: 45 52 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e  ER.       || p->
7920: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
7930: 49 54 45 52 5f 49 4e 49 54 49 41 4c 0a 20 20 20  ITER_INITIAL.   
7940: 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65      || p->eState
7950: 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43  ==PAGER_WRITER_C
7960: 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c  ACHEMOD.       |
7970: 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  | p->eState==PAG
7980: 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 0a  ER_WRITER_DBMOD.
7990: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74         || p->eSt
79a0: 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
79b0: 52 5f 46 49 4e 49 53 48 45 44 0a 20 20 20 20 20  R_FINISHED.     
79c0: 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d    || p->eState==
79d0: 50 41 47 45 52 5f 45 52 52 4f 52 0a 20 20 29 3b  PAGER_ERROR.  );
79e0: 0a 0a 20 20 2f 2a 20 52 65 67 61 72 64 6c 65 73  ..  /* Regardles
79f0: 73 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  s of the current
7a00: 20 73 74 61 74 65 2c 20 61 20 74 65 6d 70 2d 66   state, a temp-f
7a10: 69 6c 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61  ile connection a
7a20: 6c 77 61 79 73 20 62 65 68 61 76 65 73 0a 20 20  lways behaves.  
7a30: 2a 2a 20 61 73 20 69 66 20 69 74 20 68 61 73 20  ** as if it has 
7a40: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
7a50: 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
7a60: 65 20 66 69 6c 65 2e 20 49 74 20 6e 65 76 65 72  e file. It never
7a70: 20 75 70 64 61 74 65 73 0a 20 20 2a 2a 20 74 68   updates.  ** th
7a80: 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
7a90: 20 66 69 65 6c 64 2c 20 73 6f 20 74 68 65 20 63   field, so the c
7aa0: 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66  hangeCountDone f
7ab0: 6c 61 67 20 69 73 20 61 6c 77 61 79 73 20 73 65  lag is always se
7ac0: 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  t..  */.  assert
7ad0: 28 20 70 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30  ( p->tempFile==0
7ae0: 20 7c 7c 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58   || p->eLock==EX
7af0: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a  CLUSIVE_LOCK );.
7b00: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 74 65 6d    assert( p->tem
7b10: 70 46 69 6c 65 3d 3d 30 20 7c 7c 20 70 50 61 67  pFile==0 || pPag
7b20: 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
7b30: 6f 6e 65 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  one );..  /* If 
7b40: 74 68 65 20 75 73 65 4a 6f 75 72 6e 61 6c 20 66  the useJournal f
7b50: 6c 61 67 20 69 73 20 63 6c 65 61 72 2c 20 74 68  lag is clear, th
7b60: 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 6d  e journal-mode m
7b70: 75 73 74 20 62 65 20 22 4f 46 46 22 2e 20 0a 20  ust be "OFF". . 
7b80: 20 2a 2a 20 41 6e 64 20 69 66 20 74 68 65 20 6a   ** And if the j
7b90: 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 69 73 20 22  ournal-mode is "
7ba0: 4f 46 46 22 2c 20 74 68 65 20 6a 6f 75 72 6e 61  OFF", the journa
7bb0: 6c 20 66 69 6c 65 20 6d 75 73 74 20 6e 6f 74 20  l file must not 
7bc0: 62 65 20 6f 70 65 6e 2e 0a 20 20 2a 2f 0a 20 20  be open..  */.  
7bd0: 61 73 73 65 72 74 28 20 70 2d 3e 6a 6f 75 72 6e  assert( p->journ
7be0: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
7bf0: 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 7c 7c  URNALMODE_OFF ||
7c00: 20 70 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29   p->useJournal )
7c10: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6a  ;.  assert( p->j
7c20: 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45  ournalMode!=PAGE
7c30: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
7c40: 46 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70 2d 3e  F || !isOpen(p->
7c50: 6a 66 64 29 20 29 3b 0a 0a 20 20 2f 2a 20 43 68  jfd) );..  /* Ch
7c60: 65 63 6b 20 74 68 61 74 20 4d 45 4d 44 42 20 69  eck that MEMDB i
7c70: 6d 70 6c 69 65 73 20 6e 6f 53 79 6e 63 2e 20 2a  mplies noSync. *
7c80: 2f 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d  /.  assert( !MEM
7c90: 44 42 20 7c 7c 20 70 2d 3e 6e 6f 53 79 6e 63 20  DB || p->noSync 
7ca0: 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70 2d  );..  switch( p-
7cb0: 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 63  >eState ){.    c
7cc0: 61 73 65 20 50 41 47 45 52 5f 4e 4f 4e 45 3a 0a  ase PAGER_NONE:.
7cd0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 4d        assert( !M
7ce0: 45 4d 44 42 20 29 3b 0a 20 20 20 20 20 20 61 73  EMDB );.      as
7cf0: 73 65 72 74 28 20 21 70 2d 3e 74 65 6d 70 46 69  sert( !p->tempFi
7d00: 6c 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  le );.      asse
7d10: 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  rt( pPager->errC
7d20: 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode==SQLITE_OK )
7d30: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
7d40: 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66  sqlite3PcacheRef
7d50: 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  Count(pPager->pP
7d60: 43 61 63 68 65 29 3d 3d 30 20 29 3b 0a 20 20 20  Cache)==0 );.   
7d70: 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63     break;..    c
7d80: 61 73 65 20 50 41 47 45 52 5f 52 45 41 44 45 52  ase PAGER_READER
7d90: 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  :.      assert( 
7da0: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d  pPager->errCode=
7db0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
7dc0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65      assert( p->e
7dd0: 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock>=SHARED_LOC
7de0: 4b 20 7c 7c 20 70 2d 3e 6e 6f 52 65 61 64 6c 6f  K || p->noReadlo
7df0: 63 6b 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ck );.      brea
7e00: 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47  k;..    case PAG
7e10: 45 52 5f 57 52 49 54 45 52 5f 49 4e 49 54 49 41  ER_WRITER_INITIA
7e20: 4c 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  L:.      assert(
7e30: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
7e40: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
7e50: 20 20 20 20 20 69 66 28 20 21 70 61 67 65 72 55       if( !pagerU
7e60: 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
7e70: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
7e80: 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45 52   p->eLock>=RESER
7e90: 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  VED_LOCK );.    
7ea0: 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
7eb0: 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
7ec0: 3d 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  ==pPager->dbOrig
7ed0: 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61 73  Size );.      as
7ee0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
7ef0: 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72  OrigSize==pPager
7f00: 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 3b 0a  ->dbFileSize );.
7f10: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
7f20: 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 3d  ager->setMaster=
7f30: 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  =0 );.      brea
7f40: 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47  k;..    case PAG
7f50: 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d  ER_WRITER_CACHEM
7f60: 4f 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74  OD:.      assert
7f70: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
7f80: 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  e==SQLITE_OK );.
7f90: 20 20 20 20 20 20 69 66 28 20 21 70 61 67 65 72        if( !pager
7fa0: 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
7fb0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 74 20  {.        /* It 
7fc0: 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74  is possible that
7fd0: 20 69 66 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65   if journal_mode
7fe0: 3d 77 61 6c 20 68 65 72 65 20 74 68 61 74 20 6e  =wal here that n
7ff0: 65 69 74 68 65 72 20 74 68 65 0a 20 20 20 20 20  either the.     
8000: 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69     ** journal fi
8010: 6c 65 20 6e 6f 72 20 74 68 65 20 57 41 4c 20 66  le nor the WAL f
8020: 69 6c 65 20 61 72 65 20 6f 70 65 6e 2e 20 54 68  ile are open. Th
8030: 69 73 20 68 61 70 70 65 6e 73 20 64 75 72 69 6e  is happens durin
8040: 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 72  g.        ** a r
8050: 6f 6c 6c 62 61 63 6b 20 74 72 61 6e 73 61 63 74  ollback transact
8060: 69 6f 6e 20 74 68 61 74 20 73 77 69 74 63 68 65  ion that switche
8070: 73 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 5f 6d  s from journal_m
8080: 6f 64 65 3d 6f 66 66 0a 20 20 20 20 20 20 20 20  ode=off.        
8090: 2a 2a 20 74 6f 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  ** to journal_mo
80a0: 64 65 3d 77 61 6c 2e 0a 20 20 20 20 20 20 20 20  de=wal..        
80b0: 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
80c0: 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53  t( p->eLock>=RES
80d0: 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  ERVED_LOCK );.  
80e0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 73        assert( is
80f0: 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20 0a 20 20  Open(p->jfd) .  
8100: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d             || p-
8110: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
8120: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
8130: 4f 46 46 20 0a 20 20 20 20 20 20 20 20 20 20 20  OFF .           
8140: 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d    || p->journalM
8150: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
8160: 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20  ALMODE_WAL .    
8170: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20      );.      }. 
8180: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
8190: 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d  ger->dbOrigSize=
81a0: 3d 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53  =pPager->dbFileS
81b0: 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ize );.      bre
81c0: 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41  ak;..    case PA
81d0: 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44  GER_WRITER_DBMOD
81e0: 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  :.      assert( 
81f0: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d  pPager->errCode=
8200: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
8210: 20 20 20 20 61 73 73 65 72 74 28 20 21 70 61 67      assert( !pag
8220: 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
8230: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
8240: 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 45 58 43 4c  ( p->eLock>=EXCL
8250: 55 53 49 56 45 5f 4c 4f 43 4b 20 7c 7c 20 70 61  USIVE_LOCK || pa
8260: 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
8270: 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ) );.      asser
8280: 74 28 20 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64  t( isOpen(p->jfd
8290: 29 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  ) .           ||
82a0: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d   p->journalMode=
82b0: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
82c0: 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20 20 20  DE_OFF .        
82d0: 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c     || p->journal
82e0: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
82f0: 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20  NALMODE_WAL .   
8300: 20 20 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61     );.      brea
8310: 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47  k;..    case PAG
8320: 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48  ER_WRITER_FINISH
8330: 45 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74  ED:.      assert
8340: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
8350: 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  e==SQLITE_OK );.
8360: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
8370: 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
8380: 72 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  r) );.      asse
8390: 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 45 58  rt( p->eLock>=EX
83a0: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 7c 7c 20  CLUSIVE_LOCK || 
83b0: 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
83c0: 65 72 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73  er) );.      ass
83d0: 65 72 74 28 20 69 73 4f 70 65 6e 28 70 2d 3e 6a  ert( isOpen(p->j
83e0: 66 64 29 20 0a 20 20 20 20 20 20 20 20 20 20 20  fd) .           
83f0: 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  || p->journalMod
8400: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
8410: 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20  MODE_OFF .      
8420: 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e       || p->journ
8430: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
8440: 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20  URNALMODE_WAL . 
8450: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 62 72       );.      br
8460: 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50  eak;..    case P
8470: 41 47 45 52 5f 45 52 52 4f 52 3a 0a 20 20 20 20  AGER_ERROR:.    
8480: 20 20 2f 2a 20 54 68 65 72 65 20 6d 75 73 74 20    /* There must 
8490: 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  be at least one 
84a0: 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65  outstanding refe
84b0: 72 65 6e 63 65 20 74 6f 20 74 68 65 20 70 61 67  rence to the pag
84c0: 65 72 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 69  er if.      ** i
84d0: 6e 20 45 52 52 4f 52 20 73 74 61 74 65 2e 20 4f  n ERROR state. O
84e0: 74 68 65 72 77 69 73 65 20 74 68 65 20 70 61 67  therwise the pag
84f0: 65 72 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61  er should have a
8500: 6c 72 65 61 64 79 20 64 72 6f 70 70 65 64 0a 20  lready dropped. 
8510: 20 20 20 20 20 2a 2a 20 62 61 63 6b 20 74 6f 20       ** back to 
8520: 4e 4f 4e 45 20 73 74 61 74 65 2e 0a 20 20 20 20  NONE state..    
8530: 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72    */.      asser
8540: 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  t( pPager->errCo
8550: 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  de!=SQLITE_OK );
8560: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
8570: 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43  qlite3PcacheRefC
8580: 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43  ount(pPager->pPC
8590: 61 63 68 65 29 3e 30 20 29 3b 0a 20 20 20 20 20  ache)>0 );.     
85a0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 72   break;.  }..  r
85b0: 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 1;.}../*.*
85c0: 2a 20 28 67 64 62 29 20 70 72 69 6e 74 66 20 22  * (gdb) printf "
85d0: 25 73 22 2c 20 70 72 69 6e 74 5f 70 61 67 65 72  %s", print_pager
85e0: 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 0a 2a  _state(pPager).*
85f0: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 70  /.static char *p
8600: 72 69 6e 74 5f 70 61 67 65 72 5f 73 74 61 74 65  rint_pager_state
8610: 28 50 61 67 65 72 20 2a 70 29 7b 0a 20 20 73 74  (Pager *p){.  st
8620: 61 74 69 63 20 63 68 61 72 20 7a 52 65 74 5b 31  atic char zRet[1
8630: 30 32 34 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33  024];..  sqlite3
8640: 5f 73 6e 70 72 69 6e 74 66 28 31 30 32 34 2c 20  _snprintf(1024, 
8650: 7a 52 65 74 2c 0a 20 20 20 20 20 20 22 53 74 61  zRet,.      "Sta
8660: 74 65 3a 20 20 20 20 20 20 20 20 20 25 73 5c 6e  te:         %s\n
8670: 22 0a 20 20 20 20 20 20 22 4c 6f 63 6b 3a 20 20  ".      "Lock:  
8680: 20 20 20 20 20 20 20 20 25 73 5c 6e 22 0a 20 20          %s\n".  
8690: 20 20 20 20 22 4c 6f 63 6b 69 6e 67 20 6d 6f 64      "Locking mod
86a0: 65 3a 20 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65  e:  locking_mode
86b0: 3d 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 4a 6f  =%s\n".      "Jo
86c0: 75 72 6e 61 6c 20 6d 6f 64 65 3a 20 20 6a 6f 75  urnal mode:  jou
86d0: 72 6e 61 6c 5f 6d 6f 64 65 3d 25 73 5c 6e 22 0a  rnal_mode=%s\n".
86e0: 20 20 20 20 20 20 22 42 61 63 6b 69 6e 67 20 73        "Backing s
86f0: 74 6f 72 65 3a 20 74 65 6d 70 46 69 6c 65 3d 25  tore: tempFile=%
8700: 64 20 6d 65 6d 44 62 3d 25 64 20 75 73 65 4a 6f  d memDb=%d useJo
8710: 75 72 6e 61 6c 3d 25 64 5c 6e 22 0a 20 20 20 20  urnal=%d\n".    
8720: 20 20 2c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50    , p->eState==P
8730: 41 47 45 52 5f 4e 4f 4e 45 20 20 20 20 20 20 20  AGER_NONE       
8740: 20 20 20 20 20 3f 20 22 4e 4f 4e 45 22 20 3a 0a       ? "NONE" :.
8750: 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74          p->eStat
8760: 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e==PAGER_READER 
8770: 20 20 20 20 20 20 20 20 20 3f 20 22 52 45 41 44           ? "READ
8780: 45 52 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  ER" :.        p-
8790: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
87a0: 52 49 54 45 52 5f 49 4e 49 54 49 41 4c 20 20 3f  RITER_INITIAL  ?
87b0: 20 22 57 52 49 54 45 52 5f 49 4e 49 54 49 41 4c   "WRITER_INITIAL
87c0: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65  " :.        p->e
87d0: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
87e0: 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 3f 20 22  TER_CACHEMOD ? "
87f0: 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 22  WRITER_CACHEMOD"
8800: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53   :.        p->eS
8810: 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
8820: 45 52 5f 44 42 4d 4f 44 20 20 20 20 3f 20 22 57  ER_DBMOD    ? "W
8830: 52 49 54 45 52 5f 44 42 4d 4f 44 22 20 3a 0a 20  RITER_DBMOD" :. 
8840: 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65         p->eState
8850: 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46  ==PAGER_WRITER_F
8860: 49 4e 49 53 48 45 44 20 3f 20 22 57 52 49 54 45  INISHED ? "WRITE
8870: 52 5f 46 49 4e 49 53 48 45 44 22 20 3a 0a 20 20  R_FINISHED" :.  
8880: 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d        p->eState=
8890: 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 20 20 20  =PAGER_ERROR    
88a0: 20 20 20 20 20 20 20 3f 20 22 45 52 52 4f 52 22         ? "ERROR"
88b0: 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20 20 20   : "?error?".   
88c0: 20 20 20 2c 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 4e     , p->eLock==N
88d0: 4f 5f 4c 4f 43 4b 20 20 20 20 20 20 20 20 20 3f  O_LOCK         ?
88e0: 20 22 4e 4f 4e 45 22 20 3a 0a 20 20 20 20 20 20   "NONE" :.      
88f0: 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 53 45    p->eLock==RESE
8900: 52 56 45 44 5f 4c 4f 43 4b 20 20 20 3f 20 22 52  RVED_LOCK   ? "R
8910: 45 53 45 52 56 45 44 22 20 3a 0a 20 20 20 20 20  ESERVED" :.     
8920: 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43     p->eLock==EXC
8930: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 3f 20 22  LUSIVE_LOCK  ? "
8940: 45 58 43 4c 55 53 49 56 45 22 20 3a 0a 20 20 20  EXCLUSIVE" :.   
8950: 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 53       p->eLock==S
8960: 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 20 20 3f  HARED_LOCK     ?
8970: 20 22 53 48 41 52 45 44 22 20 3a 20 22 3f 65 72   "SHARED" : "?er
8980: 72 6f 72 3f 22 0a 20 20 20 20 20 20 2c 20 70 2d  ror?".      , p-
8990: 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3f  >exclusiveMode ?
89a0: 20 22 65 78 63 6c 75 73 69 76 65 22 20 3a 20 22   "exclusive" : "
89b0: 6e 6f 72 6d 61 6c 22 0a 20 20 20 20 20 20 2c 20  normal".      , 
89c0: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
89d0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
89e0: 45 5f 4d 45 4d 4f 52 59 20 20 20 3f 20 22 6d 65  E_MEMORY   ? "me
89f0: 6d 6f 72 79 22 20 3a 0a 20 20 20 20 20 20 20 20  mory" :.        
8a00: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
8a10: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
8a20: 45 5f 4f 46 46 20 20 20 20 20 20 3f 20 22 6f 66  E_OFF      ? "of
8a30: 66 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  f" :.        p->
8a40: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
8a50: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44  ER_JOURNALMODE_D
8a60: 45 4c 45 54 45 20 20 20 3f 20 22 64 65 6c 65 74  ELETE   ? "delet
8a70: 65 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  e" :.        p->
8a80: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
8a90: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50  ER_JOURNALMODE_P
8aa0: 45 52 53 49 53 54 20 20 3f 20 22 70 65 72 73 69  ERSIST  ? "persi
8ab0: 73 74 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  st" :.        p-
8ac0: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
8ad0: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
8ae0: 54 52 55 4e 43 41 54 45 20 3f 20 22 74 72 75 6e  TRUNCATE ? "trun
8af0: 63 61 74 65 22 20 3a 0a 20 20 20 20 20 20 20 20  cate" :.        
8b00: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
8b10: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
8b20: 45 5f 57 41 4c 20 20 20 20 20 20 3f 20 22 77 61  E_WAL      ? "wa
8b30: 6c 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20  l" : "?error?". 
8b40: 20 20 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e 74       , (int)p->t
8b50: 65 6d 70 46 69 6c 65 2c 20 28 69 6e 74 29 70 2d  empFile, (int)p-
8b60: 3e 6d 65 6d 44 62 2c 20 28 69 6e 74 29 70 2d 3e  >memDb, (int)p->
8b70: 75 73 65 4a 6f 75 72 6e 61 6c 0a 20 20 29 3b 0a  useJournal.  );.
8b80: 0a 20 20 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a  .  return zRet;.
8b90: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
8ba0: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 69  Return true if i
8bb0: 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74  t is necessary t
8bc0: 6f 20 77 72 69 74 65 20 70 61 67 65 20 2a 70 50  o write page *pP
8bd0: 67 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a  g into the sub-j
8be0: 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 41 20 70 61 67  ournal..** A pag
8bf0: 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 77 72  e needs to be wr
8c00: 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 73  itten into the s
8c10: 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 74 68  ub-journal if th
8c20: 65 72 65 20 65 78 69 73 74 73 20 6f 6e 65 0a 2a  ere exists one.*
8c30: 2a 20 6f 72 20 6d 6f 72 65 20 6f 70 65 6e 20 73  * or more open s
8c40: 61 76 65 70 6f 69 6e 74 73 20 66 6f 72 20 77 68  avepoints for wh
8c50: 69 63 68 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54  ich:.**.**   * T
8c60: 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69  he page-number i
8c70: 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65  s less than or e
8c80: 71 75 61 6c 20 74 6f 20 50 61 67 65 72 53 61 76  qual to PagerSav
8c90: 65 70 6f 69 6e 74 2e 6e 4f 72 69 67 2c 20 61 6e  epoint.nOrig, an
8ca0: 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 62 69 74  d.**   * The bit
8cb0: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
8cc0: 6f 20 74 68 65 20 70 61 67 65 2d 6e 75 6d 62 65  o the page-numbe
8cd0: 72 20 69 73 20 6e 6f 74 20 73 65 74 20 69 6e 0a  r is not set in.
8ce0: 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61 76 65  **     PagerSave
8cf0: 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69  point.pInSavepoi
8d00: 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
8d10: 74 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61  t subjRequiresPa
8d20: 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ge(PgHdr *pPg){.
8d30: 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50    Pgno pgno = pP
8d40: 67 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72  g->pgno;.  Pager
8d50: 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
8d60: 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 69 3b  pPager;.  int i;
8d70: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50  .  for(i=0; i<pP
8d80: 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
8d90: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 50 61 67 65  ; i++){.    Page
8da0: 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 20 3d 20  rSavepoint *p = 
8db0: 26 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f  &pPager->aSavepo
8dc0: 69 6e 74 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  int[i];.    if( 
8dd0: 70 2d 3e 6e 4f 72 69 67 3e 3d 70 67 6e 6f 20 26  p->nOrig>=pgno &
8de0: 26 20 30 3d 3d 73 71 6c 69 74 65 33 42 69 74 76  & 0==sqlite3Bitv
8df0: 65 63 54 65 73 74 28 70 2d 3e 70 49 6e 53 61 76  ecTest(p->pInSav
8e00: 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 20 29 7b  epoint, pgno) ){
8e10: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
8e20: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
8e30: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
8e40: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
8e50: 68 65 20 70 61 67 65 20 69 73 20 61 6c 72 65 61  he page is alrea
8e60: 64 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  dy in the journa
8e70: 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  l file..*/.stati
8e80: 63 20 69 6e 74 20 70 61 67 65 49 6e 4a 6f 75 72  c int pageInJour
8e90: 6e 61 6c 28 50 67 48 64 72 20 2a 70 50 67 29 7b  nal(PgHdr *pPg){
8ea0: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
8eb0: 33 42 69 74 76 65 63 54 65 73 74 28 70 50 67 2d  3BitvecTest(pPg-
8ec0: 3e 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  >pPager->pInJour
8ed0: 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  nal, pPg->pgno);
8ee0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61  .}../*.** Read a
8ef0: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20   32-bit integer 
8f00: 66 72 6f 6d 20 74 68 65 20 67 69 76 65 6e 20 66  from the given f
8f10: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20  ile descriptor. 
8f20: 20 53 74 6f 72 65 20 74 68 65 20 69 6e 74 65 67   Store the integ
8f30: 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 72 65  er.** that is re
8f40: 61 64 20 69 6e 20 2a 70 52 65 73 2e 20 20 52 65  ad in *pRes.  Re
8f50: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
8f60: 66 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72  f everything wor
8f70: 6b 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65 72  ked, or an.** er
8f80: 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65  ror code is some
8f90: 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
8fa0: 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75  ..**.** All valu
8fb0: 65 73 20 61 72 65 20 73 74 6f 72 65 64 20 6f 6e  es are stored on
8fc0: 20 64 69 73 6b 20 61 73 20 62 69 67 2d 65 6e 64   disk as big-end
8fd0: 69 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ian..*/.static i
8fe0: 6e 74 20 72 65 61 64 33 32 62 69 74 73 28 73 71  nt read32bits(sq
8ff0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
9000: 69 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20  i64 offset, u32 
9010: 2a 70 52 65 73 29 7b 0a 20 20 75 6e 73 69 67 6e  *pRes){.  unsign
9020: 65 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20  ed char ac[4];. 
9030: 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
9040: 33 4f 73 52 65 61 64 28 66 64 2c 20 61 63 2c 20  3OsRead(fd, ac, 
9050: 73 69 7a 65 6f 66 28 61 63 29 2c 20 6f 66 66 73  sizeof(ac), offs
9060: 65 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  et);.  if( rc==S
9070: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
9080: 2a 70 52 65 73 20 3d 20 73 71 6c 69 74 65 33 47  *pRes = sqlite3G
9090: 65 74 34 62 79 74 65 28 61 63 29 3b 0a 20 20 7d  et4byte(ac);.  }
90a0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
90b0: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33  ./*.** Write a 3
90c0: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e  2-bit integer in
90d0: 74 6f 20 61 20 73 74 72 69 6e 67 20 62 75 66 66  to a string buff
90e0: 65 72 20 69 6e 20 62 69 67 2d 65 6e 64 69 61 6e  er in big-endian
90f0: 20 62 79 74 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a   byte order..*/.
9100: 23 64 65 66 69 6e 65 20 70 75 74 33 32 62 69 74  #define put32bit
9110: 73 28 41 2c 42 29 20 20 73 71 6c 69 74 65 33 50  s(A,B)  sqlite3P
9120: 75 74 34 62 79 74 65 28 28 75 38 2a 29 41 2c 42  ut4byte((u8*)A,B
9130: 29 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  ).../*.** Write 
9140: 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  a 32-bit integer
9150: 20 69 6e 74 6f 20 74 68 65 20 67 69 76 65 6e 20   into the given 
9160: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e  file descriptor.
9170: 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
9180: 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73  OK.** on success
9190: 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
91a0: 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67  e is something g
91b0: 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74  oes wrong..*/.st
91c0: 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 33 32  atic int write32
91d0: 62 69 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c  bits(sqlite3_fil
91e0: 65 20 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65  e *fd, i64 offse
91f0: 74 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20 20 63  t, u32 val){.  c
9200: 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 70 75 74  har ac[4];.  put
9210: 33 32 62 69 74 73 28 61 63 2c 20 76 61 6c 29 3b  32bits(ac, val);
9220: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
9230: 33 4f 73 57 72 69 74 65 28 66 64 2c 20 61 63 2c  3OsWrite(fd, ac,
9240: 20 34 2c 20 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a   4, offset);.}..
9250: 2f 2a 0a 2a 2a 20 49 66 20 66 69 6c 65 20 70 46  /*.** If file pF
9260: 64 20 69 73 20 6f 70 65 6e 2c 20 63 61 6c 6c 20  d is open, call 
9270: 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
9280: 29 20 6f 6e 20 69 74 2e 0a 2a 2f 0a 73 74 61 74  ) on it..*/.stat
9290: 69 63 20 69 6e 74 20 6f 73 55 6e 6c 6f 63 6b 28  ic int osUnlock(
92a0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
92b0: 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69 66 28  nt eLock){.  if(
92c0: 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
92d0: 3e 66 64 29 20 29 7b 0a 20 20 20 20 72 65 74 75  >fd) ){.    retu
92e0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
92f0: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  }.  assert( pPag
9300: 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 65 4c 6f 63 6b  er->eLock>=eLock
9310: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c   );.  assert( eL
9320: 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20  ock!=NO_LOCK || 
9330: 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
9340: 65 72 29 3d 3d 30 20 29 3b 0a 20 20 70 50 61 67  er)==0 );.  pPag
9350: 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 65 4c 6f 63  er->eLock = eLoc
9360: 6b 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  k;.  return sqli
9370: 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61 67  te3OsUnlock(pPag
9380: 65 72 2d 3e 66 64 2c 20 65 4c 6f 63 6b 29 3b 0a  er->fd, eLock);.
9390: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
93a0: 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d 69 6e 65  nction determine
93b0: 73 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  s whether or not
93c0: 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74   the atomic-writ
93d0: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a  e optimization.*
93e0: 2a 20 63 61 6e 20 62 65 20 75 73 65 64 20 77 69  * can be used wi
93f0: 74 68 20 74 68 69 73 20 70 61 67 65 72 2e 20 54  th this pager. T
9400: 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  he optimization 
9410: 63 61 6e 20 62 65 20 75 73 65 64 20 69 66 3a 0a  can be used if:.
9420: 2a 2a 0a 2a 2a 20 20 28 61 29 20 74 68 65 20 76  **.**  (a) the v
9430: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
9440: 20 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74   OsDeviceCharact
9450: 65 72 69 73 74 69 63 73 28 29 20 69 6e 64 69 63  eristics() indic
9460: 61 74 65 73 20 74 68 61 74 0a 2a 2a 20 20 20 20  ates that.**    
9470: 20 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67    a database pag
9480: 65 20 6d 61 79 20 62 65 20 77 72 69 74 74 65 6e  e may be written
9490: 20 61 74 6f 6d 69 63 61 6c 6c 79 2c 20 61 6e 64   atomically, and
94a0: 0a 2a 2a 20 20 28 62 29 20 74 68 65 20 76 61 6c  .**  (b) the val
94b0: 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f  ue returned by O
94c0: 73 53 65 63 74 6f 72 53 69 7a 65 28 29 20 69 73  sSectorSize() is
94d0: 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
94e0: 75 61 6c 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74  ual.**      to t
94f0: 68 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a  he page size..**
9500: 0a 2a 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a 61  .** The optimiza
9510: 74 69 6f 6e 20 69 73 20 61 6c 73 6f 20 61 6c 77  tion is also alw
9520: 61 79 73 20 65 6e 61 62 6c 65 64 20 66 6f 72 20  ays enabled for 
9530: 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e  temporary files.
9540: 20 49 74 20 69 73 0a 2a 2a 20 61 6e 20 65 72 72   It is.** an err
9550: 6f 72 20 74 6f 20 63 61 6c 6c 20 74 68 69 73 20  or to call this 
9560: 66 75 6e 63 74 69 6f 6e 20 69 66 20 70 50 61 67  function if pPag
9570: 65 72 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20  er is opened on 
9580: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20  an in-memory.** 
9590: 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
95a0: 49 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74  If the optimizat
95b0: 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 75 73  ion cannot be us
95c0: 65 64 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65  ed, 0 is returne
95d0: 64 2e 20 49 66 20 69 74 20 63 61 6e 20 62 65 20  d. If it can be 
95e0: 75 73 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 74 68  used,.** then th
95f0: 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
9600: 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20   is the size of 
9610: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
9620: 20 77 68 65 6e 20 69 74 0a 2a 2a 20 63 6f 6e 74   when it.** cont
9630: 61 69 6e 73 20 72 6f 6c 6c 62 61 63 6b 20 64 61  ains rollback da
9640: 74 61 20 66 6f 72 20 65 78 61 63 74 6c 79 20 6f  ta for exactly o
9650: 6e 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66 64  ne page..*/.#ifd
9660: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
9670: 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 73 74  _ATOMIC_WRITE.st
9680: 61 74 69 63 20 69 6e 74 20 6a 72 6e 6c 42 75 66  atic int jrnlBuf
9690: 66 65 72 53 69 7a 65 28 50 61 67 65 72 20 2a 70  ferSize(Pager *p
96a0: 50 61 67 65 72 29 7b 0a 20 20 61 73 73 65 72 74  Pager){.  assert
96b0: 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66  ( !MEMDB );.  if
96c0: 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  ( !pPager->tempF
96d0: 69 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 64  ile ){.    int d
96e0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
96f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9700: 44 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72  Device character
9710: 69 73 74 69 63 73 20 2a 2f 0a 20 20 20 20 69 6e  istics */.    in
9720: 74 20 6e 53 65 63 74 6f 72 3b 20 20 20 20 20 20  t nSector;      
9730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9740: 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 2a  /* Sector size *
9750: 2f 0a 20 20 20 20 69 6e 74 20 73 7a 50 61 67 65  /.    int szPage
9760: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9770: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
9780: 73 69 7a 65 20 2a 2f 0a 0a 20 20 20 20 61 73 73  size */..    ass
9790: 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
97a0: 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 20 20 64  er->fd) );.    d
97b0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76  c = sqlite3OsDev
97c0: 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
97d0: 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  cs(pPager->fd);.
97e0: 20 20 20 20 6e 53 65 63 74 6f 72 20 3d 20 70 50      nSector = pP
97f0: 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
9800: 3b 0a 20 20 20 20 73 7a 50 61 67 65 20 3d 20 70  ;.    szPage = p
9810: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
9820: 0a 0a 20 20 20 20 61 73 73 65 72 74 28 53 51 4c  ..    assert(SQL
9830: 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
9840: 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a  512==(512>>8));.
9850: 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54      assert(SQLIT
9860: 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34  E_IOCAP_ATOMIC64
9870: 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a  K==(65536>>8));.
9880: 20 20 20 20 69 66 28 20 30 3d 3d 28 64 63 26 28      if( 0==(dc&(
9890: 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
98a0: 4d 49 43 7c 28 73 7a 50 61 67 65 3e 3e 38 29 29  MIC|(szPage>>8))
98b0: 20 7c 7c 20 6e 53 65 63 74 6f 72 3e 73 7a 50 61   || nSector>szPa
98c0: 67 65 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ge) ){.      ret
98d0: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 0;.    }.  }
98e0: 0a 0a 20 20 72 65 74 75 72 6e 20 4a 4f 55 52 4e  ..  return JOURN
98f0: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
9900: 29 20 2b 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  ) + JOURNAL_PG_S
9910: 5a 28 70 50 61 67 65 72 29 3b 0a 7d 0a 23 65 6e  Z(pPager);.}.#en
9920: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51  dif../*.** If SQ
9930: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
9940: 20 69 73 20 64 65 66 69 6e 65 64 20 74 68 65 6e   is defined then
9950: 20 77 65 20 64 6f 20 73 6f 6d 65 20 73 61 6e 69   we do some sani
9960: 74 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 6f  ty checking.** o
9970: 6e 20 74 68 65 20 63 61 63 68 65 20 75 73 69 6e  n the cache usin
9980: 67 20 61 20 68 61 73 68 20 66 75 6e 63 74 69 6f  g a hash functio
9990: 6e 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  n.  This is used
99a0: 20 66 6f 72 20 74 65 73 74 69 6e 67 0a 2a 2a 20   for testing.** 
99b0: 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e  and debugging on
99c0: 6c 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ly..*/.#ifdef SQ
99d0: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
99e0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
99f0: 33 32 2d 62 69 74 20 68 61 73 68 20 6f 66 20 74  32-bit hash of t
9a00: 68 65 20 70 61 67 65 20 64 61 74 61 20 66 6f 72  he page data for
9a10: 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69   pPage..*/.stati
9a20: 63 20 75 33 32 20 70 61 67 65 72 5f 64 61 74 61  c u32 pager_data
9a30: 68 61 73 68 28 69 6e 74 20 6e 42 79 74 65 2c 20  hash(int nByte, 
9a40: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
9a50: 44 61 74 61 29 7b 0a 20 20 75 33 32 20 68 61 73  Data){.  u32 has
9a60: 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a  h = 0;.  int i;.
9a70: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 79    for(i=0; i<nBy
9a80: 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 68 61  te; i++){.    ha
9a90: 73 68 20 3d 20 28 68 61 73 68 2a 31 30 33 39 29  sh = (hash*1039)
9aa0: 20 2b 20 70 44 61 74 61 5b 69 5d 3b 0a 20 20 7d   + pData[i];.  }
9ab0: 0a 20 20 72 65 74 75 72 6e 20 68 61 73 68 3b 0a  .  return hash;.
9ac0: 7d 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67  }.static u32 pag
9ad0: 65 72 5f 70 61 67 65 68 61 73 68 28 50 67 48 64  er_pagehash(PgHd
9ae0: 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 72 65 74  r *pPage){.  ret
9af0: 75 72 6e 20 70 61 67 65 72 5f 64 61 74 61 68 61  urn pager_dataha
9b00: 73 68 28 70 50 61 67 65 2d 3e 70 50 61 67 65 72  sh(pPage->pPager
9b10: 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 75 6e 73  ->pageSize, (uns
9b20: 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 50 61  igned char *)pPa
9b30: 67 65 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a 73 74  ge->pData);.}.st
9b40: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f  atic void pager_
9b50: 73 65 74 5f 70 61 67 65 68 61 73 68 28 50 67 48  set_pagehash(PgH
9b60: 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 70 50  dr *pPage){.  pP
9b70: 61 67 65 2d 3e 70 61 67 65 48 61 73 68 20 3d 20  age->pageHash = 
9b80: 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
9b90: 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Page);.}../*.** 
9ba0: 54 68 65 20 43 48 45 43 4b 5f 50 41 47 45 20 6d  The CHECK_PAGE m
9bb0: 61 63 72 6f 20 74 61 6b 65 73 20 61 20 50 67 48  acro takes a PgH
9bc0: 64 72 2a 20 61 73 20 61 6e 20 61 72 67 75 6d 65  dr* as an argume
9bd0: 6e 74 2e 20 49 66 20 53 51 4c 49 54 45 5f 43 48  nt. If SQLITE_CH
9be0: 45 43 4b 5f 50 41 47 45 53 0a 2a 2a 20 69 73 20  ECK_PAGES.** is 
9bf0: 64 65 66 69 6e 65 64 2c 20 61 6e 64 20 4e 44 45  defined, and NDE
9c00: 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69 6e  BUG is not defin
9c10: 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20  ed, an assert() 
9c20: 73 74 61 74 65 6d 65 6e 74 20 63 68 65 63 6b 73  statement checks
9c30: 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61 67  .** that the pag
9c40: 65 20 69 73 20 65 69 74 68 65 72 20 64 69 72 74  e is either dirt
9c50: 79 20 6f 72 20 73 74 69 6c 6c 20 6d 61 74 63 68  y or still match
9c60: 65 73 20 74 68 65 20 63 61 6c 63 75 6c 61 74 65  es the calculate
9c70: 64 20 70 61 67 65 2d 68 61 73 68 2e 0a 2a 2f 0a  d page-hash..*/.
9c80: 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41  #define CHECK_PA
9c90: 47 45 28 78 29 20 63 68 65 63 6b 50 61 67 65 28  GE(x) checkPage(
9ca0: 78 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  x).static void c
9cb0: 68 65 63 6b 50 61 67 65 28 50 67 48 64 72 20 2a  heckPage(PgHdr *
9cc0: 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
9cd0: 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
9ce0: 67 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20 21  ger;.  assert( !
9cf0: 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 7c 7c  pPg->pageHash ||
9d00: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
9d10: 0a 20 20 20 20 20 20 7c 7c 20 28 70 50 67 2d 3e  .      || (pPg->
9d20: 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54  flags&PGHDR_DIRT
9d30: 59 29 20 7c 7c 20 70 50 67 2d 3e 70 61 67 65 48  Y) || pPg->pageH
9d40: 61 73 68 3d 3d 70 61 67 65 72 5f 70 61 67 65 68  ash==pager_pageh
9d50: 61 73 68 28 70 50 67 29 20 29 3b 0a 7d 0a 0a 23  ash(pPg) );.}..#
9d60: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 70 61 67  else.#define pag
9d70: 65 72 5f 64 61 74 61 68 61 73 68 28 58 2c 59 29  er_datahash(X,Y)
9d80: 20 20 30 0a 23 64 65 66 69 6e 65 20 70 61 67 65    0.#define page
9d90: 72 5f 70 61 67 65 68 61 73 68 28 58 29 20 20 30  r_pagehash(X)  0
9da0: 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50  .#define CHECK_P
9db0: 41 47 45 28 78 29 0a 23 65 6e 64 69 66 20 20 2f  AGE(x).#endif  /
9dc0: 2a 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  * SQLITE_CHECK_P
9dd0: 41 47 45 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57  AGES */../*.** W
9de0: 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c  hen this is call
9df0: 65 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ed the journal f
9e00: 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70 50  ile for pager pP
9e10: 61 67 65 72 20 6d 75 73 74 20 62 65 20 6f 70 65  ager must be ope
9e20: 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  n..** This funct
9e30: 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ion attempts to 
9e40: 72 65 61 64 20 61 20 6d 61 73 74 65 72 20 6a 6f  read a master jo
9e50: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
9e60: 66 72 6f 6d 20 74 68 65 20 0a 2a 2a 20 65 6e 64  from the .** end
9e70: 20 6f 66 20 74 68 65 20 66 69 6c 65 20 61 6e 64   of the file and
9e80: 2c 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c  , if successful,
9e90: 20 63 6f 70 69 65 73 20 69 74 20 69 6e 74 6f 20   copies it into 
9ea0: 6d 65 6d 6f 72 79 20 73 75 70 70 6c 69 65 64 20  memory supplied 
9eb0: 0a 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 65  .** by the calle
9ec0: 72 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20  r. See comments 
9ed0: 61 62 6f 76 65 20 77 72 69 74 65 4d 61 73 74 65  above writeMaste
9ee0: 72 4a 6f 75 72 6e 61 6c 28 29 20 66 6f 72 20 74  rJournal() for t
9ef0: 68 65 20 66 6f 72 6d 61 74 0a 2a 2a 20 75 73 65  he format.** use
9f00: 64 20 74 6f 20 73 74 6f 72 65 20 61 20 6d 61 73  d to store a mas
9f10: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
9f20: 20 6e 61 6d 65 20 61 74 20 74 68 65 20 65 6e 64   name at the end
9f30: 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69   of a journal fi
9f40: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 7a 4d 61 73 74 65  le..**.** zMaste
9f50: 72 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20  r must point to 
9f60: 61 20 62 75 66 66 65 72 20 6f 66 20 61 74 20 6c  a buffer of at l
9f70: 65 61 73 74 20 6e 4d 61 73 74 65 72 20 62 79 74  east nMaster byt
9f80: 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a  es allocated by.
9f90: 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 54  ** the caller. T
9fa0: 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20 73 71  his should be sq
9fb0: 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50 61 74 68  lite3_vfs.mxPath
9fc0: 6e 61 6d 65 2b 31 20 28 74 6f 20 65 6e 73 75 72  name+1 (to ensur
9fd0: 65 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 65 6e  e there is.** en
9fe0: 6f 75 67 68 20 73 70 61 63 65 20 74 6f 20 77 72  ough space to wr
9ff0: 69 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ite the master j
a000: 6f 75 72 6e 61 6c 20 6e 61 6d 65 29 2e 20 49 66  ournal name). If
a010: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
a020: 6e 61 6c 0a 2a 2a 20 6e 61 6d 65 20 69 6e 20 74  nal.** name in t
a030: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 6f  he journal is lo
a040: 6e 67 65 72 20 74 68 61 6e 20 6e 4d 61 73 74 65  nger than nMaste
a050: 72 20 62 79 74 65 73 20 28 69 6e 63 6c 75 64 69  r bytes (includi
a060: 6e 67 20 61 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d  ng a.** nul-term
a070: 69 6e 61 74 6f 72 29 2c 20 74 68 65 6e 20 74 68  inator), then th
a080: 69 73 20 69 73 20 68 61 6e 64 6c 65 64 20 61 73  is is handled as
a090: 20 69 66 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f   if no master jo
a0a0: 75 72 6e 61 6c 20 6e 61 6d 65 0a 2a 2a 20 77 65  urnal name.** we
a0b0: 72 65 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68  re present in th
a0c0: 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  e journal..**.**
a0d0: 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   If a master jou
a0e0: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69  rnal file name i
a0f0: 73 20 70 72 65 73 65 6e 74 20 61 74 20 74 68 65  s present at the
a100: 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75 72   end of the jour
a110: 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2c 20 74 68 65  nal.** file, the
a120: 6e 20 69 74 20 69 73 20 63 6f 70 69 65 64 20 69  n it is copied i
a130: 6e 74 6f 20 74 68 65 20 62 75 66 66 65 72 20 70  nto the buffer p
a140: 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d 61  ointed to by zMa
a150: 73 74 65 72 2e 20 41 0a 2a 2a 20 6e 75 6c 2d 74  ster. A.** nul-t
a160: 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 20 69  erminator byte i
a170: 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68  s appended to th
a180: 65 20 62 75 66 66 65 72 20 66 6f 6c 6c 6f 77 69  e buffer followi
a190: 6e 67 20 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a  ng the master.**
a1a0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
a1b0: 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74 20  me..**.** If it 
a1c0: 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 74 68  is determined th
a1d0: 61 74 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75  at no master jou
a1e0: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69  rnal file name i
a1f0: 73 20 70 72 65 73 65 6e 74 20 0a 2a 2a 20 7a 4d  s present .** zM
a200: 61 73 74 65 72 5b 30 5d 20 69 73 20 73 65 74 20  aster[0] is set 
a210: 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45 5f  to 0 and SQLITE_
a220: 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  OK returned..**.
a230: 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
a240: 63 63 75 72 73 20 77 68 69 6c 65 20 72 65 61 64  ccurs while read
a250: 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ing from the jou
a260: 72 6e 61 6c 20 66 69 6c 65 2c 20 61 6e 20 53 51  rnal file, an SQ
a270: 4c 69 74 65 0a 2a 2a 20 65 72 72 6f 72 20 63 6f  Lite.** error co
a280: 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  de is returned..
a290: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
a2a0: 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  adMasterJournal(
a2b0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a  sqlite3_file *pJ
a2c0: 72 6e 6c 2c 20 63 68 61 72 20 2a 7a 4d 61 73 74  rnl, char *zMast
a2d0: 65 72 2c 20 75 33 32 20 6e 4d 61 73 74 65 72 29  er, u32 nMaster)
a2e0: 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
a2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a300: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
a310: 0a 20 20 75 33 32 20 6c 65 6e 3b 20 20 20 20 20  .  u32 len;     
a320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a330: 20 4c 65 6e 67 74 68 20 69 6e 20 62 79 74 65 73   Length in bytes
a340: 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   of master journ
a350: 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 36 34  al name */.  i64
a360: 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20   szJ;           
a370: 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c          /* Total
a380: 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f   size in bytes o
a390: 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 70  f journal file p
a3a0: 4a 72 6e 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b  Jrnl */.  u32 ck
a3b0: 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  sum;            
a3c0: 20 20 20 20 20 2f 2a 20 4d 4a 20 63 68 65 63 6b       /* MJ check
a3d0: 73 75 6d 20 76 61 6c 75 65 20 72 65 61 64 20 66  sum value read f
a3e0: 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  rom journal */. 
a3f0: 20 75 33 32 20 75 3b 20 20 20 20 20 20 20 20 20   u32 u;         
a400: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
a410: 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75  nsigned loop cou
a420: 6e 74 65 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  nter */.  unsign
a430: 65 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38  ed char aMagic[8
a440: 5d 3b 20 20 20 2f 2a 20 41 20 62 75 66 66 65 72  ];   /* A buffer
a450: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67   to hold the mag
a460: 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 7a  ic header */.  z
a470: 4d 61 73 74 65 72 5b 30 5d 20 3d 20 27 5c 30 27  Master[0] = '\0'
a480: 3b 0a 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  ;..  if( SQLITE_
a490: 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65  OK!=(rc = sqlite
a4a0: 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4a 72 6e  3OsFileSize(pJrn
a4b0: 6c 2c 20 26 73 7a 4a 29 29 0a 20 20 20 7c 7c 20  l, &szJ)).   || 
a4c0: 73 7a 4a 3c 31 36 0a 20 20 20 7c 7c 20 53 51 4c  szJ<16.   || SQL
a4d0: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65  ITE_OK!=(rc = re
a4e0: 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20  ad32bits(pJrnl, 
a4f0: 73 7a 4a 2d 31 36 2c 20 26 6c 65 6e 29 29 0a 20  szJ-16, &len)). 
a500: 20 20 7c 7c 20 6c 65 6e 3e 3d 6e 4d 61 73 74 65    || len>=nMaste
a510: 72 20 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f  r .   || SQLITE_
a520: 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32  OK!=(rc = read32
a530: 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d  bits(pJrnl, szJ-
a540: 31 32 2c 20 26 63 6b 73 75 6d 29 29 0a 20 20 20  12, &cksum)).   
a550: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
a560: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
a570: 64 28 70 4a 72 6e 6c 2c 20 61 4d 61 67 69 63 2c  d(pJrnl, aMagic,
a580: 20 38 2c 20 73 7a 4a 2d 38 29 29 0a 20 20 20 7c   8, szJ-8)).   |
a590: 7c 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c  | memcmp(aMagic,
a5a0: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
a5b0: 38 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f  8).   || SQLITE_
a5c0: 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65  OK!=(rc = sqlite
a5d0: 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 7a  3OsRead(pJrnl, z
a5e0: 4d 61 73 74 65 72 2c 20 6c 65 6e 2c 20 73 7a 4a  Master, len, szJ
a5f0: 2d 31 36 2d 6c 65 6e 29 29 0a 20 20 29 7b 0a 20  -16-len)).  ){. 
a600: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
a610: 7d 0a 0a 20 20 2f 2a 20 53 65 65 20 69 66 20 74  }..  /* See if t
a620: 68 65 20 63 68 65 63 6b 73 75 6d 20 6d 61 74 63  he checksum matc
a630: 68 65 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a  hes the master j
a640: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20  ournal name */. 
a650: 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6c 65 6e 3b   for(u=0; u<len;
a660: 20 75 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d   u++){.    cksum
a670: 20 2d 3d 20 7a 4d 61 73 74 65 72 5b 75 5d 3b 0a   -= zMaster[u];.
a680: 20 20 7d 0a 20 20 69 66 28 20 63 6b 73 75 6d 20    }.  if( cksum 
a690: 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
a6a0: 20 63 68 65 63 6b 73 75 6d 20 64 6f 65 73 6e 27   checksum doesn'
a6b0: 74 20 61 64 64 20 75 70 2c 20 74 68 65 6e 20 6f  t add up, then o
a6c0: 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68  ne or more of th
a6d0: 65 20 64 69 73 6b 20 73 65 63 74 6f 72 73 0a 20  e disk sectors. 
a6e0: 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67     ** containing
a6f0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
a700: 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20  nal filename is 
a710: 63 6f 72 72 75 70 74 65 64 2e 20 54 68 69 73 20  corrupted. This 
a720: 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 64 65 66  means.    ** def
a730: 69 6e 69 74 65 6c 79 20 72 6f 6c 6c 20 62 61 63  initely roll bac
a740: 6b 2c 20 73 6f 20 6a 75 73 74 20 72 65 74 75 72  k, so just retur
a750: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20  n SQLITE_OK and 
a760: 72 65 70 6f 72 74 20 61 20 28 6e 75 6c 29 0a 20  report a (nul). 
a770: 20 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75     ** master-jou
a780: 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 20  rnal filename.. 
a790: 20 20 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20     */.    len = 
a7a0: 30 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72  0;.  }.  zMaster
a7b0: 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  [len] = '\0';.  
a7c0: 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54   .  return SQLIT
a7d0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
a7e0: 65 74 75 72 6e 20 74 68 65 20 6f 66 66 73 65 74  eturn the offset
a7f0: 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20 62   of the sector b
a800: 6f 75 6e 64 61 72 79 20 61 74 20 6f 72 20 69 6d  oundary at or im
a810: 6d 65 64 69 61 74 65 6c 79 20 0a 2a 2a 20 66 6f  mediately .** fo
a820: 6c 6c 6f 77 69 6e 67 20 74 68 65 20 76 61 6c 75  llowing the valu
a830: 65 20 69 6e 20 70 50 61 67 65 72 2d 3e 6a 6f 75  e in pPager->jou
a840: 72 6e 61 6c 4f 66 66 2c 20 61 73 73 75 6d 69 6e  rnalOff, assumin
a850: 67 20 61 20 73 65 63 74 6f 72 20 0a 2a 2a 20 73  g a sector .** s
a860: 69 7a 65 20 6f 66 20 70 50 61 67 65 72 2d 3e 73  ize of pPager->s
a870: 65 63 74 6f 72 53 69 7a 65 20 62 79 74 65 73 2e  ectorSize bytes.
a880: 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72 20 61  .**.** i.e for a
a890: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 6f 66 20   sector size of 
a8a0: 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 61 67  512:.**.**   Pag
a8b0: 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 20 20  er.journalOff   
a8c0: 20 20 20 20 20 20 20 52 65 74 75 72 6e 20 76 61         Return va
a8d0: 6c 75 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d  lue.**   -------
a8e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a8f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a900: 0a 2a 2a 20 20 20 30 20 20 20 20 20 20 20 20 20  .**   0         
a910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a920: 30 0a 2a 2a 20 20 20 35 31 32 20 20 20 20 20 20  0.**   512      
a930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a940: 20 35 31 32 0a 2a 2a 20 20 20 31 30 30 20 20 20   512.**   100   
a950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a960: 20 20 20 20 35 31 32 0a 2a 2a 20 20 20 32 30 30      512.**   200
a970: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
a980: 20 20 20 20 20 20 20 32 30 34 38 0a 2a 2a 20 0a         2048.** .
a990: 2a 2f 0a 73 74 61 74 69 63 20 69 36 34 20 6a 6f  */.static i64 jo
a9a0: 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 50  urnalHdrOffset(P
a9b0: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
a9c0: 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b   i64 offset = 0;
a9d0: 0a 20 20 69 36 34 20 63 20 3d 20 70 50 61 67 65  .  i64 c = pPage
a9e0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20  r->journalOff;. 
a9f0: 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20 6f 66   if( c ){.    of
aa00: 66 73 65 74 20 3d 20 28 28 63 2d 31 29 2f 4a 4f  fset = ((c-1)/JO
aa10: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
aa20: 67 65 72 29 20 2b 20 31 29 20 2a 20 4a 4f 55 52  ger) + 1) * JOUR
aa30: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
aa40: 72 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  r);.  }.  assert
aa50: 28 20 6f 66 66 73 65 74 25 4a 4f 55 52 4e 41 4c  ( offset%JOURNAL
aa60: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d  _HDR_SZ(pPager)=
aa70: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
aa80: 6f 66 66 73 65 74 3e 3d 63 20 29 3b 0a 20 20 61  offset>=c );.  a
aa90: 73 73 65 72 74 28 20 28 6f 66 66 73 65 74 2d 63  ssert( (offset-c
aaa0: 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  )<JOURNAL_HDR_SZ
aab0: 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65  (pPager) );.  re
aac0: 74 75 72 6e 20 6f 66 66 73 65 74 3b 0a 7d 0a 0a  turn offset;.}..
aad0: 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  /*.** The journa
aae0: 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f  l file must be o
aaf0: 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 66 75  pen when this fu
ab00: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
ab10: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
ab20: 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
ab30: 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   if the journal 
ab40: 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 62 65 65  file has not bee
ab50: 6e 20 77 72 69 74 74 65 6e 20 74 6f 0a 2a 2a 20  n written to.** 
ab60: 77 69 74 68 69 6e 20 74 68 65 20 63 75 72 72 65  within the curre
ab70: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28  nt transaction (
ab80: 69 2e 65 2e 20 69 66 20 50 61 67 65 72 2e 6a 6f  i.e. if Pager.jo
ab90: 75 72 6e 61 6c 4f 66 66 3d 3d 30 29 2e 0a 2a 2a  urnalOff==0)..**
aba0: 0a 2a 2a 20 49 66 20 64 6f 54 72 75 6e 63 61 74  .** If doTruncat
abb0: 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 72  e is non-zero or
abc0: 20 74 68 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e   the Pager.journ
abd0: 61 6c 53 69 7a 65 4c 69 6d 69 74 20 76 61 72 69  alSizeLimit vari
abe0: 61 62 6c 65 20 69 73 0a 2a 2a 20 73 65 74 20 74  able is.** set t
abf0: 6f 20 30 2c 20 74 68 65 6e 20 74 72 75 6e 63 61  o 0, then trunca
ac00: 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  te the journal f
ac10: 69 6c 65 20 74 6f 20 7a 65 72 6f 20 62 79 74 65  ile to zero byte
ac20: 73 20 69 6e 20 73 69 7a 65 2e 20 4f 74 68 65 72  s in size. Other
ac30: 77 69 73 65 2c 0a 2a 2a 20 7a 65 72 6f 20 74 68  wise,.** zero th
ac40: 65 20 32 38 2d 62 79 74 65 20 68 65 61 64 65 72  e 28-byte header
ac50: 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
ac60: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
ac70: 65 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61 73  e. In either cas
ac80: 65 2c 20 0a 2a 2a 20 69 66 20 74 68 65 20 70 61  e, .** if the pa
ac90: 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 6e 6f  ger is not in no
aca0: 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 73 79 6e 63  -sync mode, sync
acb0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
acc0: 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a 2a  e immediately .*
acd0: 2a 20 61 66 74 65 72 20 77 72 69 74 69 6e 67 20  * after writing 
ace0: 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20 69 74  or truncating it
acf0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 61 67 65 72  ..**.** If Pager
ad00: 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69  .journalSizeLimi
ad10: 74 20 69 73 20 73 65 74 20 74 6f 20 61 20 70 6f  t is set to a po
ad20: 73 69 74 69 76 65 2c 20 6e 6f 6e 2d 7a 65 72 6f  sitive, non-zero
ad30: 20 76 61 6c 75 65 2c 20 61 6e 64 0a 2a 2a 20 66   value, and.** f
ad40: 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 74 72 75  ollowing the tru
ad50: 6e 63 61 74 69 6f 6e 20 6f 72 20 7a 65 72 6f 69  ncation or zeroi
ad60: 6e 67 20 64 65 73 63 72 69 62 65 64 20 61 62 6f  ng described abo
ad70: 76 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  ve the size of t
ad80: 68 65 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  he .** journal f
ad90: 69 6c 65 20 69 6e 20 62 79 74 65 73 20 69 73 20  ile in bytes is 
ada0: 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 69 73  larger than this
adb0: 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 72 75   value, then tru
adc0: 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 6a 6f 75  ncate the.** jou
add0: 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 50 61 67  rnal file to Pag
ade0: 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69  er.journalSizeLi
adf0: 6d 69 74 20 62 79 74 65 73 2e 20 54 68 65 20 6a  mit bytes. The j
ae00: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73  ournal file does
ae10: 0a 2a 2a 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  .** not need to 
ae20: 62 65 20 73 79 6e 63 65 64 20 66 6f 6c 6c 6f 77  be synced follow
ae30: 69 6e 67 20 74 68 69 73 20 6f 70 65 72 61 74 69  ing this operati
ae40: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  on..**.** If an 
ae50: 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  IO error occurs,
ae60: 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73 73   abandon process
ae70: 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e 20 74  ing and return t
ae80: 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  he IO error code
ae90: 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
aea0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
aeb0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
aec0: 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 50  zeroJournalHdr(P
aed0: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
aee0: 74 20 64 6f 54 72 75 6e 63 61 74 65 29 7b 0a 20  t doTruncate){. 
aef0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
af00: 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
af10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af20: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
af30: 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69  e */.  assert( i
af40: 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
af50: 64 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  d) );.  if( pPag
af60: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29  er->journalOff )
af70: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 36 34 20  {.    const i64 
af80: 69 4c 69 6d 69 74 20 3d 20 70 50 61 67 65 72 2d  iLimit = pPager-
af90: 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69  >journalSizeLimi
afa0: 74 3b 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63  t;    /* Local c
afb0: 61 63 68 65 20 6f 66 20 6a 73 6c 20 2a 2f 0a 0a  ache of jsl */..
afc0: 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 5a      IOTRACE(("JZ
afd0: 45 52 4f 48 44 52 20 25 70 5c 6e 22 2c 20 70 50  EROHDR %p\n", pP
afe0: 61 67 65 72 29 29 0a 20 20 20 20 69 66 28 20 64  ager)).    if( d
aff0: 6f 54 72 75 6e 63 61 74 65 20 7c 7c 20 69 4c 69  oTruncate || iLi
b000: 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  mit==0 ){.      
b010: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72  rc = sqlite3OsTr
b020: 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a  uncate(pPager->j
b030: 66 64 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73  fd, 0);.    }els
b040: 65 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63 20  e{.      static 
b050: 63 6f 6e 73 74 20 63 68 61 72 20 7a 65 72 6f 48  const char zeroH
b060: 64 72 5b 32 38 5d 20 3d 20 7b 30 7d 3b 0a 20 20  dr[28] = {0};.  
b070: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
b080: 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
b090: 6a 66 64 2c 20 7a 65 72 6f 48 64 72 2c 20 73 69  jfd, zeroHdr, si
b0a0: 7a 65 6f 66 28 7a 65 72 6f 48 64 72 29 2c 20 30  zeof(zeroHdr), 0
b0b0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
b0c0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
b0d0: 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  & !pPager->noSyn
b0e0: 63 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  c ){.      rc = 
b0f0: 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50  sqlite3OsSync(pP
b100: 61 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c 49 54  ager->jfd, SQLIT
b110: 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 7c  E_SYNC_DATAONLY|
b120: 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61  pPager->sync_fla
b130: 67 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  gs);.    }..    
b140: 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
b150: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
b160: 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 20 62 75   is committed bu
b170: 74 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b  t the write lock
b180: 20 0a 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c   .    ** is stil
b190: 6c 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 66 69  l held on the fi
b1a0: 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  le. If there is 
b1b0: 61 20 73 69 7a 65 20 6c 69 6d 69 74 20 63 6f 6e  a size limit con
b1c0: 66 69 67 75 72 65 64 20 66 6f 72 20 0a 20 20 20  figured for .   
b1d0: 20 2a 2a 20 74 68 65 20 70 65 72 73 69 73 74 65   ** the persiste
b1e0: 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74  nt journal and t
b1f0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
b200: 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 73 75 6d  currently consum
b210: 65 73 20 6d 6f 72 65 0a 20 20 20 20 2a 2a 20 73  es more.    ** s
b220: 70 61 63 65 20 74 68 61 6e 20 74 68 61 74 20 6c  pace than that l
b230: 69 6d 69 74 20 61 6c 6c 6f 77 73 20 66 6f 72 2c  imit allows for,
b240: 20 74 72 75 6e 63 61 74 65 20 69 74 20 6e 6f 77   truncate it now
b250: 2e 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65  . There is no ne
b260: 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 73 79 6e  ed.    ** to syn
b270: 63 20 74 68 65 20 66 69 6c 65 20 66 6f 6c 6c 6f  c the file follo
b280: 77 69 6e 67 20 74 68 69 73 20 6f 70 65 72 61 74  wing this operat
b290: 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
b2a0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
b2b0: 4b 20 26 26 20 69 4c 69 6d 69 74 3e 30 20 29 7b  K && iLimit>0 ){
b2c0: 0a 20 20 20 20 20 20 69 36 34 20 73 7a 3b 0a 20  .      i64 sz;. 
b2d0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
b2e0: 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
b2f0: 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 29 3b 0a 20  er->jfd, &sz);. 
b300: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
b310: 49 54 45 5f 4f 4b 20 26 26 20 73 7a 3e 69 4c 69  ITE_OK && sz>iLi
b320: 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72  mit ){.        r
b330: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75  c = sqlite3OsTru
b340: 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  ncate(pPager->jf
b350: 64 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20  d, iLimit);.    
b360: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
b370: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
b380: 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  .** The journal 
b390: 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65  file must be ope
b3a0: 6e 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  n when this rout
b3b0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 41  ine is called. A
b3c0: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65 61 64   journal.** head
b3d0: 65 72 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  er (JOURNAL_HDR_
b3e0: 53 5a 20 62 79 74 65 73 29 20 69 73 20 77 72 69  SZ bytes) is wri
b3f0: 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f  tten into the jo
b400: 75 72 6e 61 6c 20 66 69 6c 65 20 61 74 20 74 68  urnal file at th
b410: 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 6c 6f 63  e.** current loc
b420: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ation..**.** The
b430: 20 66 6f 72 6d 61 74 20 66 6f 72 20 74 68 65 20   format for the 
b440: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69  journal header i
b450: 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  s as follows:.**
b460: 20 2d 20 38 20 62 79 74 65 73 3a 20 4d 61 67 69   - 8 bytes: Magi
b470: 63 20 69 64 65 6e 74 69 66 79 69 6e 67 20 6a 6f  c identifying jo
b480: 75 72 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a 2a  urnal format..**
b490: 20 2d 20 34 20 62 79 74 65 73 3a 20 4e 75 6d 62   - 4 bytes: Numb
b4a0: 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20 69 6e  er of records in
b4b0: 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d 31 20   journal, or -1 
b4c0: 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20 69 73 20  no-sync mode is 
b4d0: 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73  on..** - 4 bytes
b4e0: 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20  : Random number 
b4f0: 75 73 65 64 20 66 6f 72 20 70 61 67 65 20 68 61  used for page ha
b500: 73 68 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73  sh..** - 4 bytes
b510: 3a 20 49 6e 69 74 69 61 6c 20 64 61 74 61 62 61  : Initial databa
b520: 73 65 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a  se page count..*
b530: 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 53 65 63  * - 4 bytes: Sec
b540: 74 6f 72 20 73 69 7a 65 20 75 73 65 64 20 62 79  tor size used by
b550: 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61   the process tha
b560: 74 20 77 72 6f 74 65 20 74 68 69 73 20 6a 6f 75  t wrote this jou
b570: 72 6e 61 6c 2e 0a 2a 2a 20 2d 20 34 20 62 79 74  rnal..** - 4 byt
b580: 65 73 3a 20 44 61 74 61 62 61 73 65 20 70 61 67  es: Database pag
b590: 65 20 73 69 7a 65 2e 0a 2a 2a 20 0a 2a 2a 20 46  e size..** .** F
b5a0: 6f 6c 6c 6f 77 65 64 20 62 79 20 28 4a 4f 55 52  ollowed by (JOUR
b5b0: 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38 29  NAL_HDR_SZ - 28)
b5c0: 20 62 79 74 65 73 20 6f 66 20 75 6e 75 73 65 64   bytes of unused
b5d0: 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69   space..*/.stati
b5e0: 63 20 69 6e 74 20 77 72 69 74 65 4a 6f 75 72 6e  c int writeJourn
b5f0: 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50 61  alHdr(Pager *pPa
b600: 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ger){.  int rc =
b610: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
b620: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
b630: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
b640: 63 68 61 72 20 2a 7a 48 65 61 64 65 72 20 3d 20  char *zHeader = 
b650: 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
b660: 65 3b 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79  e;  /* Temporary
b670: 20 73 70 61 63 65 20 75 73 65 64 20 74 6f 20 62   space used to b
b680: 75 69 6c 64 20 68 65 61 64 65 72 20 2a 2f 0a 20  uild header */. 
b690: 20 75 33 32 20 6e 48 65 61 64 65 72 20 3d 20 70   u32 nHeader = p
b6a0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
b6b0: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
b6c0: 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74  buffer pointed t
b6d0: 6f 20 62 79 20 7a 48 65 61 64 65 72 20 2a 2f 0a  o by zHeader */.
b6e0: 20 20 75 33 32 20 6e 57 72 69 74 65 3b 20 20 20    u32 nWrite;   
b6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b700: 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f        /* Bytes o
b710: 66 20 68 65 61 64 65 72 20 73 65 63 74 6f 72 20  f header sector 
b720: 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 69 6e 74  written */.  int
b730: 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20   ii;            
b740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b750: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
b760: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69   */..  assert( i
b770: 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
b780: 64 29 20 29 3b 20 20 20 20 20 20 2f 2a 20 4a 6f  d) );      /* Jo
b790: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20  urnal file must 
b7a0: 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20 69  be open. */..  i
b7b0: 66 28 20 6e 48 65 61 64 65 72 3e 4a 4f 55 52 4e  f( nHeader>JOURN
b7c0: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
b7d0: 29 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72  ) ){.    nHeader
b7e0: 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53   = JOURNAL_HDR_S
b7f0: 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a  Z(pPager);.  }..
b800: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
b810: 65 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69  e active savepoi
b820: 6e 74 73 20 61 6e 64 20 61 6e 79 20 6f 66 20 74  nts and any of t
b830: 68 65 6d 20 77 65 72 65 20 63 72 65 61 74 65 64  hem were created
b840: 20 0a 20 20 2a 2a 20 73 69 6e 63 65 20 74 68 65   .  ** since the
b850: 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 6a 6f 75   most recent jou
b860: 72 6e 61 6c 20 68 65 61 64 65 72 20 77 61 73 20  rnal header was 
b870: 77 72 69 74 74 65 6e 2c 20 75 70 64 61 74 65 20  written, update 
b880: 74 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 53  the .  ** PagerS
b890: 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66  avepoint.iHdrOff
b8a0: 73 65 74 20 66 69 65 6c 64 73 20 6e 6f 77 2e 0a  set fields now..
b8b0: 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b    */.  for(ii=0;
b8c0: 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76   ii<pPager->nSav
b8d0: 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20  epoint; ii++){. 
b8e0: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61     if( pPager->a
b8f0: 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69 48  Savepoint[ii].iH
b900: 64 72 4f 66 66 73 65 74 3d 3d 30 20 29 7b 0a 20  drOffset==0 ){. 
b910: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53 61       pPager->aSa
b920: 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69 48 64 72  vepoint[ii].iHdr
b930: 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 72 2d  Offset = pPager-
b940: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20  >journalOff;.   
b950: 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72   }.  }..  pPager
b960: 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70  ->journalHdr = p
b970: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
b980: 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66  f = journalHdrOf
b990: 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a 0a 20  fset(pPager);.. 
b9a0: 20 2f 2a 20 0a 20 20 2a 2a 20 57 72 69 74 65 20   /* .  ** Write 
b9b0: 74 68 65 20 6e 52 65 63 20 46 69 65 6c 64 20 2d  the nRec Field -
b9c0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
b9d0: 61 67 65 20 72 65 63 6f 72 64 73 20 74 68 61 74  age records that
b9e0: 20 66 6f 6c 6c 6f 77 20 74 68 69 73 0a 20 20 2a   follow this.  *
b9f0: 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  * journal header
ba00: 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20 7a 65 72 6f  . Normally, zero
ba10: 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74   is written to t
ba20: 68 69 73 20 76 61 6c 75 65 20 61 74 20 74 68 69  his value at thi
ba30: 73 20 74 69 6d 65 2e 0a 20 20 2a 2a 20 41 66 74  s time..  ** Aft
ba40: 65 72 20 74 68 65 20 72 65 63 6f 72 64 73 20 61  er the records a
ba50: 72 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  re added to the 
ba60: 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 74 68 65  journal (and the
ba70: 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 65 64 2c   journal synced,
ba80: 20 0a 20 20 2a 2a 20 69 66 20 69 6e 20 66 75 6c   .  ** if in ful
ba90: 6c 2d 73 79 6e 63 20 6d 6f 64 65 29 2c 20 74 68  l-sync mode), th
baa0: 65 20 7a 65 72 6f 20 69 73 20 6f 76 65 72 77 72  e zero is overwr
bab0: 69 74 74 65 6e 20 77 69 74 68 20 74 68 65 20 74  itten with the t
bac0: 72 75 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20  rue number.  ** 
bad0: 6f 66 20 72 65 63 6f 72 64 73 20 28 73 65 65 20  of records (see 
bae0: 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 29 29 2e 0a  syncJournal())..
baf0: 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 66 61 73 74    **.  ** A fast
bb00: 65 72 20 61 6c 74 65 72 6e 61 74 69 76 65 20 69  er alternative i
bb10: 73 20 74 6f 20 77 72 69 74 65 20 30 78 46 46 46  s to write 0xFFF
bb20: 46 46 46 46 46 20 74 6f 20 74 68 65 20 6e 52 65  FFFFF to the nRe
bb30: 63 20 66 69 65 6c 64 2e 20 57 68 65 6e 0a 20 20  c field. When.  
bb40: 2a 2a 20 72 65 61 64 69 6e 67 20 74 68 65 20 6a  ** reading the j
bb50: 6f 75 72 6e 61 6c 20 74 68 69 73 20 76 61 6c 75  ournal this valu
bb60: 65 20 74 65 6c 6c 73 20 53 51 4c 69 74 65 20 74  e tells SQLite t
bb70: 6f 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68  o assume that th
bb80: 65 0a 20 20 2a 2a 20 72 65 73 74 20 6f 66 20 74  e.  ** rest of t
bb90: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
bba0: 63 6f 6e 74 61 69 6e 73 20 76 61 6c 69 64 20 70  contains valid p
bbb0: 61 67 65 20 72 65 63 6f 72 64 73 2e 20 54 68 69  age records. Thi
bbc0: 73 20 61 73 73 75 6d 70 74 69 6f 6e 0a 20 20 2a  s assumption.  *
bbd0: 2a 20 69 73 20 64 61 6e 67 65 72 6f 75 73 2c 20  * is dangerous, 
bbe0: 61 73 20 69 66 20 61 20 66 61 69 6c 75 72 65 20  as if a failure 
bbf0: 6f 63 63 75 72 72 65 64 20 77 68 69 6c 73 74 20  occurred whilst 
bc00: 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 6a  writing to the j
bc10: 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65  ournal.  ** file
bc20: 20 69 74 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20   it may contain 
bc30: 73 6f 6d 65 20 67 61 72 62 61 67 65 20 64 61 74  some garbage dat
bc40: 61 2e 20 54 68 65 72 65 20 61 72 65 20 74 77 6f  a. There are two
bc50: 20 73 63 65 6e 61 72 69 6f 73 0a 20 20 2a 2a 20   scenarios.  ** 
bc60: 77 68 65 72 65 20 74 68 69 73 20 72 69 73 6b 20  where this risk 
bc70: 63 61 6e 20 62 65 20 69 67 6e 6f 72 65 64 3a 0a  can be ignored:.
bc80: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68    **.  **   * Wh
bc90: 65 6e 20 74 68 65 20 70 61 67 65 72 20 69 73 20  en the pager is 
bca0: 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e  in no-sync mode.
bcb0: 20 43 6f 72 72 75 70 74 69 6f 6e 20 63 61 6e 20   Corruption can 
bcc0: 66 6f 6c 6c 6f 77 20 61 0a 20 20 2a 2a 20 20 20  follow a.  **   
bcd0: 20 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20    power failure 
bce0: 69 6e 20 74 68 69 73 20 63 61 73 65 20 61 6e 79  in this case any
bcf0: 77 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  way..  **.  **  
bd00: 20 2a 20 57 68 65 6e 20 74 68 65 20 53 51 4c 49   * When the SQLI
bd10: 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50  TE_IOCAP_SAFE_AP
bd20: 50 45 4e 44 20 66 6c 61 67 20 69 73 20 73 65 74  PEND flag is set
bd30: 2e 20 54 68 69 73 20 67 75 61 72 61 6e 74 65 65  . This guarantee
bd40: 73 0a 20 20 2a 2a 20 20 20 20 20 74 68 61 74 20  s.  **     that 
bd50: 67 61 72 62 61 67 65 20 64 61 74 61 20 69 73 20  garbage data is 
bd60: 6e 65 76 65 72 20 61 70 70 65 6e 64 65 64 20 74  never appended t
bd70: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
bd80: 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  le..  */.  asser
bd90: 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
bda0: 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d  ->fd) || pPager-
bdb0: 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20 20 69 66 28  >noSync );.  if(
bdc0: 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
bdd0: 7c 7c 20 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72  || (pPager->jour
bde0: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
bdf0: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
be00: 59 29 0a 20 20 20 7c 7c 20 28 73 71 6c 69 74 65  Y).   || (sqlite
be10: 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
be20: 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
be30: 3e 66 64 29 26 53 51 4c 49 54 45 5f 49 4f 43 41  >fd)&SQLITE_IOCA
be40: 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20 0a  P_SAFE_APPEND) .
be50: 20 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28    ){.    memcpy(
be60: 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61  zHeader, aJourna
be70: 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61  lMagic, sizeof(a
be80: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a  JournalMagic));.
be90: 20 20 20 20 70 75 74 33 32 62 69 74 73 28 26 7a      put32bits(&z
bea0: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
beb0: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 30  ournalMagic)], 0
bec0: 78 66 66 66 66 66 66 66 66 29 3b 0a 20 20 7d 65  xffffffff);.  }e
bed0: 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28  lse{.    memset(
bee0: 7a 48 65 61 64 65 72 2c 20 30 2c 20 73 69 7a 65  zHeader, 0, size
bef0: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
bf00: 29 2b 34 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  )+4);.  }..  /* 
bf10: 54 68 65 20 72 61 6e 64 6f 6d 20 63 68 65 63 6b  The random check
bf20: 2d 68 61 73 68 20 69 6e 69 74 69 61 6c 69 73 65  -hash initialise
bf30: 72 20 2a 2f 20 0a 20 20 73 71 6c 69 74 65 33 5f  r */ .  sqlite3_
bf40: 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f  randomness(sizeo
bf50: 66 28 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  f(pPager->cksumI
bf60: 6e 69 74 29 2c 20 26 70 50 61 67 65 72 2d 3e 63  nit), &pPager->c
bf70: 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 70 75 74  ksumInit);.  put
bf80: 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
bf90: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
bfa0: 61 67 69 63 29 2b 34 5d 2c 20 70 50 61 67 65 72  agic)+4], pPager
bfb0: 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20  ->cksumInit);.  
bfc0: 2f 2a 20 54 68 65 20 69 6e 69 74 69 61 6c 20 64  /* The initial d
bfd0: 61 74 61 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a  atabase size */.
bfe0: 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65    put32bits(&zHe
bff0: 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
c000: 72 6e 61 6c 4d 61 67 69 63 29 2b 38 5d 2c 20 70  rnalMagic)+8], p
c010: 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
c020: 65 29 3b 0a 20 20 2f 2a 20 54 68 65 20 61 73 73  e);.  /* The ass
c030: 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65  umed sector size
c040: 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73   for this proces
c050: 73 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73  s */.  put32bits
c060: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
c070: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
c080: 31 32 5d 2c 20 70 50 61 67 65 72 2d 3e 73 65 63  12], pPager->sec
c090: 74 6f 72 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20  torSize);..  /* 
c0a0: 54 68 65 20 70 61 67 65 20 73 69 7a 65 20 2a 2f  The page size */
c0b0: 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48  .  put32bits(&zH
c0c0: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
c0d0: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 36 5d 2c  urnalMagic)+16],
c0e0: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
c0f0: 65 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61  e);..  /* Initia
c100: 6c 69 7a 69 6e 67 20 74 68 65 20 74 61 69 6c 20  lizing the tail 
c110: 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 69 73  of the buffer is
c120: 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 2e 20   not necessary. 
c130: 20 45 76 65 72 79 74 68 69 6e 67 0a 20 20 2a 2a   Everything.  **
c140: 20 77 6f 72 6b 73 20 66 69 6e 64 20 69 66 20 74   works find if t
c150: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 65 6d  he following mem
c160: 73 65 74 28 29 20 69 73 20 6f 6d 69 74 74 65 64  set() is omitted
c170: 2e 20 20 42 75 74 20 69 6e 69 74 69 61 6c 69 7a  .  But initializ
c180: 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 65 6d  ing.  ** the mem
c190: 6f 72 79 20 70 72 65 76 65 6e 74 73 20 76 61 6c  ory prevents val
c1a0: 67 72 69 6e 64 20 66 72 6f 6d 20 63 6f 6d 70 6c  grind from compl
c1b0: 61 69 6e 69 6e 67 2c 20 73 6f 20 77 65 20 61 72  aining, so we ar
c1c0: 65 20 77 69 6c 6c 69 6e 67 20 74 6f 0a 20 20 2a  e willing to.  *
c1d0: 2a 20 74 61 6b 65 20 74 68 65 20 70 65 72 66 6f  * take the perfo
c1e0: 72 6d 61 6e 63 65 20 68 69 74 2e 0a 20 20 2a 2f  rmance hit..  */
c1f0: 0a 20 20 6d 65 6d 73 65 74 28 26 7a 48 65 61 64  .  memset(&zHead
c200: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
c210: 61 6c 4d 61 67 69 63 29 2b 32 30 5d 2c 20 30 2c  alMagic)+20], 0,
c220: 0a 20 20 20 20 20 20 20 20 20 6e 48 65 61 64 65  .         nHeade
c230: 72 2d 28 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  r-(sizeof(aJourn
c240: 61 6c 4d 61 67 69 63 29 2b 32 30 29 29 3b 0a 0a  alMagic)+20));..
c250: 20 20 2f 2a 20 49 6e 20 74 68 65 6f 72 79 2c 20    /* In theory, 
c260: 69 74 20 69 73 20 6f 6e 6c 79 20 6e 65 63 65 73  it is only neces
c270: 73 61 72 79 20 74 6f 20 77 72 69 74 65 20 74 68  sary to write th
c280: 65 20 32 38 20 62 79 74 65 73 20 74 68 61 74 20  e 28 bytes that 
c290: 74 68 65 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  the .  ** journa
c2a0: 6c 20 68 65 61 64 65 72 20 63 6f 6e 73 75 6d 65  l header consume
c2b0: 73 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s to the journal
c2c0: 20 66 69 6c 65 20 68 65 72 65 2e 20 54 68 65 6e   file here. Then
c2d0: 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 0a   increment the .
c2e0: 20 20 2a 2a 20 50 61 67 65 72 2e 6a 6f 75 72 6e    ** Pager.journ
c2f0: 61 6c 4f 66 66 20 76 61 72 69 61 62 6c 65 20 62  alOff variable b
c300: 79 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  y JOURNAL_HDR_SZ
c310: 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e 65 78   so that the nex
c320: 74 20 0a 20 20 2a 2a 20 72 65 63 6f 72 64 20 69  t .  ** record i
c330: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  s written to the
c340: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 63 74 6f   following secto
c350: 72 20 28 6c 65 61 76 69 6e 67 20 61 20 67 61 70  r (leaving a gap
c360: 20 69 6e 20 74 68 65 20 66 69 6c 65 0a 20 20 2a   in the file.  *
c370: 2a 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 69  * that will be i
c380: 6d 70 6c 69 63 69 74 6c 79 20 66 69 6c 6c 65 64  mplicitly filled
c390: 20 69 6e 20 62 79 20 74 68 65 20 4f 53 29 2e 0a   in by the OS)..
c3a0: 20 20 2a 2a 0a 20 20 2a 2a 20 48 6f 77 65 76 65    **.  ** Howeve
c3b0: 72 20 69 74 20 68 61 73 20 62 65 65 6e 20 64 69  r it has been di
c3c0: 73 63 6f 76 65 72 65 64 20 74 68 61 74 20 6f 6e  scovered that on
c3d0: 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 20 74 68   some systems th
c3e0: 69 73 20 70 61 74 74 65 72 6e 20 63 61 6e 20 0a  is pattern can .
c3f0: 20 20 2a 2a 20 62 65 20 73 69 67 6e 69 66 69 63    ** be signific
c400: 61 6e 74 6c 79 20 73 6c 6f 77 65 72 20 74 68 61  antly slower tha
c410: 6e 20 63 6f 6e 74 69 67 75 6f 75 73 6c 79 20 77  n contiguously w
c420: 72 69 74 69 6e 67 20 64 61 74 61 20 74 6f 20 74  riting data to t
c430: 68 65 20 66 69 6c 65 2c 0a 20 20 2a 2a 20 65 76  he file,.  ** ev
c440: 65 6e 20 69 66 20 74 68 61 74 20 6d 65 61 6e 73  en if that means
c450: 20 65 78 70 6c 69 63 69 74 6c 79 20 77 72 69 74   explicitly writ
c460: 69 6e 67 20 64 61 74 61 20 74 6f 20 74 68 65 20  ing data to the 
c470: 62 6c 6f 63 6b 20 6f 66 20 0a 20 20 2a 2a 20 28  block of .  ** (
c480: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d  JOURNAL_HDR_SZ -
c490: 20 32 38 29 20 62 79 74 65 73 20 74 68 61 74 20   28) bytes that 
c4a0: 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 73 65 64  will not be used
c4b0: 2e 20 53 6f 20 74 68 61 74 20 69 73 20 77 68 61  . So that is wha
c4c0: 74 0a 20 20 2a 2a 20 69 73 20 64 6f 6e 65 2e 20  t.  ** is done. 
c4d0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6c  .  **.  ** The l
c4e0: 6f 6f 70 20 69 73 20 72 65 71 75 69 72 65 64 20  oop is required 
c4f0: 68 65 72 65 20 69 6e 20 63 61 73 65 20 74 68 65  here in case the
c500: 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 69 73 20   sector-size is 
c510: 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20  larger than the 
c520: 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 70  .  ** database p
c530: 61 67 65 20 73 69 7a 65 2e 20 53 69 6e 63 65 20  age size. Since 
c540: 74 68 65 20 7a 48 65 61 64 65 72 20 62 75 66 66  the zHeader buff
c550: 65 72 20 69 73 20 6f 6e 6c 79 20 50 61 67 65 72  er is only Pager
c560: 2e 70 61 67 65 53 69 7a 65 0a 20 20 2a 2a 20 62  .pageSize.  ** b
c570: 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 6d 6f  ytes in size, mo
c580: 72 65 20 74 68 61 6e 20 6f 6e 65 20 63 61 6c 6c  re than one call
c590: 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 57 72 69   to sqlite3OsWri
c5a0: 74 65 28 29 20 6d 61 79 20 62 65 20 72 65 71 75  te() may be requ
c5b0: 69 72 65 64 0a 20 20 2a 2a 20 74 6f 20 70 6f 70  ired.  ** to pop
c5c0: 75 6c 61 74 65 20 74 68 65 20 65 6e 74 69 72 65  ulate the entire
c5d0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
c5e0: 73 65 63 74 6f 72 2e 0a 20 20 2a 2f 20 0a 20 20  sector..  */ .  
c5f0: 66 6f 72 28 6e 57 72 69 74 65 3d 30 3b 20 72 63  for(nWrite=0; rc
c600: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 26 26 6e 57 72  ==SQLITE_OK&&nWr
c610: 69 74 65 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ite<JOURNAL_HDR_
c620: 53 5a 28 70 50 61 67 65 72 29 3b 20 6e 57 72 69  SZ(pPager); nWri
c630: 74 65 2b 3d 6e 48 65 61 64 65 72 29 7b 0a 20 20  te+=nHeader){.  
c640: 20 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52    IOTRACE(("JHDR
c650: 20 25 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20   %p %lld %d\n", 
c660: 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
c670: 6a 6f 75 72 6e 61 6c 48 64 72 2c 20 6e 48 65 61  journalHdr, nHea
c680: 64 65 72 29 29 0a 20 20 20 20 72 63 20 3d 20 73  der)).    rc = s
c690: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
c6a0: 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64  ager->jfd, zHead
c6b0: 65 72 2c 20 6e 48 65 61 64 65 72 2c 20 70 50 61  er, nHeader, pPa
c6c0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  ger->journalOff)
c6d0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
c6e0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
c6f0: 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   <= pPager->jour
c700: 6e 61 6c 4f 66 66 20 29 3b 0a 20 20 20 20 70 50  nalOff );.    pP
c710: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
c720: 20 2b 3d 20 6e 48 65 61 64 65 72 3b 0a 20 20 7d   += nHeader;.  }
c730: 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
c740: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72  ../*.** The jour
c750: 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65  nal file must be
c760: 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20   open when this 
c770: 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75  is called. A jou
c780: 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65  rnal header file
c790: 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52  .** (JOURNAL_HDR
c7a0: 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20 72 65  _SZ bytes) is re
c7b0: 61 64 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72  ad from the curr
c7c0: 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20  ent location in 
c7d0: 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66  the journal.** f
c7e0: 69 6c 65 2e 20 54 68 65 20 63 75 72 72 65 6e 74  ile. The current
c7f0: 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65   location in the
c800: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
c810: 20 67 69 76 65 6e 20 62 79 0a 2a 2a 20 70 50 61   given by.** pPa
c820: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2e  ger->journalOff.
c830: 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62   See comments ab
c840: 6f 76 65 20 66 75 6e 63 74 69 6f 6e 20 77 72 69  ove function wri
c850: 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 66  teJournalHdr() f
c860: 6f 72 0a 2a 2a 20 61 20 64 65 73 63 72 69 70 74  or.** a descript
c870: 69 6f 6e 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ion of the journ
c880: 61 6c 20 68 65 61 64 65 72 20 66 6f 72 6d 61 74  al header format
c890: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 68  ..**.** If the h
c8a0: 65 61 64 65 72 20 69 73 20 72 65 61 64 20 73 75  eader is read su
c8b0: 63 63 65 73 73 66 75 6c 6c 79 2c 20 2a 70 4e 52  ccessfully, *pNR
c8c0: 65 63 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ec is set to the
c8d0: 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61   number of.** pa
c8e0: 67 65 20 72 65 63 6f 72 64 73 20 66 6f 6c 6c 6f  ge records follo
c8f0: 77 69 6e 67 20 74 68 69 73 20 68 65 61 64 65 72  wing this header
c900: 20 61 6e 64 20 2a 70 44 62 53 69 7a 65 20 69 73   and *pDbSize is
c910: 20 73 65 74 20 74 6f 20 74 68 65 20 73 69 7a 65   set to the size
c920: 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   of the.** datab
c930: 61 73 65 20 62 65 66 6f 72 65 20 74 68 65 20 74  ase before the t
c940: 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 67 61 6e  ransaction began
c950: 2c 20 69 6e 20 70 61 67 65 73 2e 20 41 6c 73 6f  , in pages. Also
c960: 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  , pPager->cksumI
c970: 6e 69 74 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f  nit.** is set to
c980: 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20   the value read 
c990: 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
c9a0: 20 68 65 61 64 65 72 2e 20 53 51 4c 49 54 45 5f   header. SQLITE_
c9b0: 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a  OK is returned.*
c9c0: 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  * in this case..
c9d0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75  **.** If the jou
c9e0: 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65  rnal header file
c9f0: 20 61 70 70 65 61 72 73 20 74 6f 20 62 65 20 63   appears to be c
ca00: 6f 72 72 75 70 74 65 64 2c 20 53 51 4c 49 54 45  orrupted, SQLITE
ca10: 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20 72 65 74 75  _DONE is.** retu
ca20: 72 6e 65 64 20 61 6e 64 20 2a 70 4e 52 65 63 20  rned and *pNRec 
ca30: 61 6e 64 20 2a 50 44 62 53 69 7a 65 20 61 72 65  and *PDbSize are
ca40: 20 75 6e 64 65 66 69 6e 65 64 2e 20 20 49 66 20   undefined.  If 
ca50: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62  JOURNAL_HDR_SZ b
ca60: 79 74 65 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62  ytes.** cannot b
ca70: 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
ca80: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 20  journal file an 
ca90: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
caa0: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
cab0: 63 20 69 6e 74 20 72 65 61 64 4a 6f 75 72 6e 61  c int readJourna
cac0: 6c 48 64 72 28 0a 20 20 50 61 67 65 72 20 2a 70  lHdr(.  Pager *p
cad0: 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20  Pager,          
cae0: 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62       /* Pager ob
caf0: 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73  ject */.  int is
cb00: 48 6f 74 2c 0a 20 20 69 36 34 20 6a 6f 75 72 6e  Hot,.  i64 journ
cb10: 61 6c 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20  alSize,         
cb20: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
cb30: 68 65 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20  he open journal 
cb40: 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f  file in bytes */
cb50: 0a 20 20 75 33 32 20 2a 70 4e 52 65 63 2c 20 20  .  u32 *pNRec,  
cb60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb70: 2f 2a 20 4f 55 54 3a 20 56 61 6c 75 65 20 72 65  /* OUT: Value re
cb80: 61 64 20 66 72 6f 6d 20 74 68 65 20 6e 52 65 63  ad from the nRec
cb90: 20 66 69 65 6c 64 20 2a 2f 0a 20 20 75 33 32 20   field */.  u32 
cba0: 2a 70 44 62 53 69 7a 65 20 20 20 20 20 20 20 20  *pDbSize        
cbb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
cbc0: 20 56 61 6c 75 65 20 6f 66 20 6f 72 69 67 69 6e   Value of origin
cbd0: 61 6c 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  al database size
cbe0: 20 66 69 65 6c 64 20 2a 2f 0a 29 7b 0a 20 20 69   field */.){.  i
cbf0: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
cc00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
cc10: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
cc20: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d  unsigned char aM
cc30: 61 67 69 63 5b 38 5d 3b 20 20 20 20 20 2f 2a 20  agic[8];     /* 
cc40: 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64  A buffer to hold
cc50: 20 74 68 65 20 6d 61 67 69 63 20 68 65 61 64 65   the magic heade
cc60: 72 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72 4f  r */.  i64 iHdrO
cc70: 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
cc80: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66      /* Offset of
cc90: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
cca0: 62 65 69 6e 67 20 72 65 61 64 20 2a 2f 0a 0a 20  being read */.. 
ccb0: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
ccc0: 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20  pPager->jfd) ); 
ccd0: 20 20 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20       /* Journal 
cce0: 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65  file must be ope
ccf0: 6e 2e 20 2a 2f 0a 0a 20 20 2f 2a 20 41 64 76 61  n. */..  /* Adva
cd00: 6e 63 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61  nce Pager.journa
cd10: 6c 4f 66 66 20 74 6f 20 74 68 65 20 73 74 61 72  lOff to the star
cd20: 74 20 6f 66 20 74 68 65 20 6e 65 78 74 20 73 65  t of the next se
cd30: 63 74 6f 72 2e 20 49 66 20 74 68 65 0a 20 20 2a  ctor. If the.  *
cd40: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  * journal file i
cd50: 73 20 74 6f 6f 20 73 6d 61 6c 6c 20 66 6f 72 20  s too small for 
cd60: 74 68 65 72 65 20 74 6f 20 62 65 20 61 20 68 65  there to be a he
cd70: 61 64 65 72 20 73 74 6f 72 65 64 20 61 74 20 74  ader stored at t
cd80: 68 69 73 0a 20 20 2a 2a 20 70 6f 69 6e 74 2c 20  his.  ** point, 
cd90: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
cda0: 4e 45 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65  NE..  */.  pPage
cdb0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
cdc0: 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74  journalHdrOffset
cdd0: 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
cde0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
cdf0: 66 66 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  ff+JOURNAL_HDR_S
ce00: 5a 28 70 50 61 67 65 72 29 20 3e 20 6a 6f 75 72  Z(pPager) > jour
ce10: 6e 61 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 72  nalSize ){.    r
ce20: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
ce30: 45 3b 0a 20 20 7d 0a 20 20 69 48 64 72 4f 66 66  E;.  }.  iHdrOff
ce40: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
ce50: 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 52 65 61  alOff;..  /* Rea
ce60: 64 20 69 6e 20 74 68 65 20 66 69 72 73 74 20 38  d in the first 8
ce70: 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6a 6f   bytes of the jo
ce80: 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 49 66  urnal header. If
ce90: 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 6d 61 74   they do not mat
cea0: 63 68 0a 20 20 2a 2a 20 74 68 65 20 20 6d 61 67  ch.  ** the  mag
ceb0: 69 63 20 73 74 72 69 6e 67 20 66 6f 75 6e 64 20  ic string found 
cec0: 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
ced0: 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20 68 65 61  each journal hea
cee0: 64 65 72 2c 20 72 65 74 75 72 6e 0a 20 20 2a 2a  der, return.  **
cef0: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 20 49 66   SQLITE_DONE. If
cf00: 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
cf10: 75 72 73 2c 20 72 65 74 75 72 6e 20 61 6e 20 65  urs, return an e
cf20: 72 72 6f 72 20 63 6f 64 65 2e 20 4f 74 68 65 72  rror code. Other
cf30: 77 69 73 65 2c 0a 20 20 2a 2a 20 70 72 6f 63 65  wise,.  ** proce
cf40: 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  ed..  */.  if( i
cf50: 73 48 6f 74 20 7c 7c 20 69 48 64 72 4f 66 66 21  sHot || iHdrOff!
cf60: 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
cf70: 48 64 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  Hdr ){.    rc = 
cf80: 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
cf90: 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69  ager->jfd, aMagi
cfa0: 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63  c, sizeof(aMagic
cfb0: 29 2c 20 69 48 64 72 4f 66 66 29 3b 0a 20 20 20  ), iHdrOff);.   
cfc0: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
cfd0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
cfe0: 7d 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70  }.    if( memcmp
cff0: 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61  (aMagic, aJourna
d000: 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61  lMagic, sizeof(a
d010: 4d 61 67 69 63 29 29 21 3d 30 20 29 7b 0a 20 20  Magic))!=0 ){.  
d020: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
d030: 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20  E_DONE;.    }.  
d040: 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65  }..  /* Read the
d050: 20 66 69 72 73 74 20 74 68 72 65 65 20 33 32 2d   first three 32-
d060: 62 69 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68  bit fields of th
d070: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
d080: 3a 20 54 68 65 20 6e 52 65 63 0a 20 20 2a 2a 20  : The nRec.  ** 
d090: 66 69 65 6c 64 2c 20 74 68 65 20 63 68 65 63 6b  field, the check
d0a0: 73 75 6d 2d 69 6e 69 74 69 61 6c 69 7a 65 72 20  sum-initializer 
d0b0: 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  and the database
d0c0: 20 73 69 7a 65 20 61 74 20 74 68 65 20 73 74 61   size at the sta
d0d0: 72 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 74  rt.  ** of the t
d0e0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 52 65 74 75  ransaction. Retu
d0f0: 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  rn an error code
d100: 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65   if anything goe
d110: 73 20 77 72 6f 6e 67 2e 0a 20 20 2a 2f 0a 20 20  s wrong..  */.  
d120: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28  if( SQLITE_OK!=(
d130: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
d140: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
d150: 72 4f 66 66 2b 38 2c 20 70 4e 52 65 63 29 29 0a  rOff+8, pNRec)).
d160: 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21     || SQLITE_OK!
d170: 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74  =(rc = read32bit
d180: 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69  s(pPager->jfd, i
d190: 48 64 72 4f 66 66 2b 31 32 2c 20 26 70 50 61 67  HdrOff+12, &pPag
d1a0: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 29 0a  er->cksumInit)).
d1b0: 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21     || SQLITE_OK!
d1c0: 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74  =(rc = read32bit
d1d0: 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69  s(pPager->jfd, i
d1e0: 48 64 72 4f 66 66 2b 31 36 2c 20 70 44 62 53 69  HdrOff+16, pDbSi
d1f0: 7a 65 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  ze)).  ){.    re
d200: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
d210: 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
d220: 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20  nalOff==0 ){.   
d230: 20 75 33 32 20 69 50 61 67 65 53 69 7a 65 3b 20   u32 iPageSize; 
d240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d250: 20 50 61 67 65 2d 73 69 7a 65 20 66 69 65 6c 64   Page-size field
d260: 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64   of journal head
d270: 65 72 20 2a 2f 0a 20 20 20 20 75 33 32 20 69 53  er */.    u32 iS
d280: 65 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20  ectorSize;      
d290: 20 20 20 20 20 20 20 2f 2a 20 53 65 63 74 6f 72         /* Sector
d2a0: 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 6a  -size field of j
d2b0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f  ournal header */
d2c0: 0a 20 20 20 20 75 31 36 20 69 50 61 67 65 53 69  .    u16 iPageSi
d2d0: 7a 65 31 36 3b 20 20 20 20 20 20 20 20 20 20 20  ze16;           
d2e0: 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 69 50 61    /* Copy of iPa
d2f0: 67 65 53 69 7a 65 20 69 6e 20 31 36 2d 62 69 74  geSize in 16-bit
d300: 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 0a 20 20   variable */..  
d310: 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 70 61    /* Read the pa
d320: 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65 63 74  ge-size and sect
d330: 6f 72 2d 73 69 7a 65 20 6a 6f 75 72 6e 61 6c 20  or-size journal 
d340: 68 65 61 64 65 72 20 66 69 65 6c 64 73 2e 20 2a  header fields. *
d350: 2f 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45  /.    if( SQLITE
d360: 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33  _OK!=(rc = read3
d370: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
d380: 64 2c 20 69 48 64 72 4f 66 66 2b 32 30 2c 20 26  d, iHdrOff+20, &
d390: 69 53 65 63 74 6f 72 53 69 7a 65 29 29 0a 20 20  iSectorSize)).  
d3a0: 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21     || SQLITE_OK!
d3b0: 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74  =(rc = read32bit
d3c0: 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69  s(pPager->jfd, i
d3d0: 48 64 72 4f 66 66 2b 32 34 2c 20 26 69 50 61 67  HdrOff+24, &iPag
d3e0: 65 53 69 7a 65 29 29 0a 20 20 20 20 29 7b 0a 20  eSize)).    ){. 
d3f0: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
d400: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68      }..    /* Ch
d410: 65 63 6b 20 74 68 61 74 20 74 68 65 20 76 61 6c  eck that the val
d420: 75 65 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68  ues read from th
d430: 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20  e page-size and 
d440: 73 65 63 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c  sector-size fiel
d450: 64 73 0a 20 20 20 20 2a 2a 20 61 72 65 20 77 69  ds.    ** are wi
d460: 74 68 69 6e 20 72 61 6e 67 65 2e 20 54 6f 20 62  thin range. To b
d470: 65 20 27 69 6e 20 72 61 6e 67 65 27 2c 20 62 6f  e 'in range', bo
d480: 74 68 20 76 61 6c 75 65 73 20 6e 65 65 64 20 74  th values need t
d490: 6f 20 62 65 20 61 20 70 6f 77 65 72 0a 20 20 20  o be a power.   
d4a0: 20 2a 2a 20 6f 66 20 74 77 6f 20 67 72 65 61 74   ** of two great
d4b0: 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  er than or equal
d4c0: 20 74 6f 20 35 31 32 20 6f 72 20 33 32 2c 20 61   to 512 or 32, a
d4d0: 6e 64 20 6e 6f 74 20 67 72 65 61 74 65 72 20 74  nd not greater t
d4e0: 68 61 6e 20 74 68 65 69 72 20 0a 20 20 20 20 2a  han their .    *
d4f0: 2a 20 72 65 73 70 65 63 74 69 76 65 20 63 6f 6d  * respective com
d500: 70 69 6c 65 20 74 69 6d 65 20 6d 61 78 69 6d 75  pile time maximu
d510: 6d 20 6c 69 6d 69 74 73 2e 0a 20 20 20 20 2a 2f  m limits..    */
d520: 0a 20 20 20 20 69 66 28 20 69 50 61 67 65 53 69  .    if( iPageSi
d530: 7a 65 3c 35 31 32 20 20 20 20 20 20 20 20 20 20  ze<512          
d540: 20 20 20 20 20 20 20 20 7c 7c 20 69 53 65 63 74          || iSect
d550: 6f 72 53 69 7a 65 3c 33 32 0a 20 20 20 20 20 7c  orSize<32.     |
d560: 7c 20 69 50 61 67 65 53 69 7a 65 3e 53 51 4c 49  | iPageSize>SQLI
d570: 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
d580: 20 7c 7c 20 69 53 65 63 74 6f 72 53 69 7a 65 3e   || iSectorSize>
d590: 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 0a  MAX_SECTOR_SIZE.
d5a0: 20 20 20 20 20 7c 7c 20 28 28 69 50 61 67 65 53       || ((iPageS
d5b0: 69 7a 65 2d 31 29 26 69 50 61 67 65 53 69 7a 65  ize-1)&iPageSize
d5c0: 29 21 3d 30 20 20 20 7c 7c 20 28 28 69 53 65 63  )!=0   || ((iSec
d5d0: 74 6f 72 53 69 7a 65 2d 31 29 26 69 53 65 63 74  torSize-1)&iSect
d5e0: 6f 72 53 69 7a 65 29 21 3d 30 20 0a 20 20 20 20  orSize)!=0 .    
d5f0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
d600: 68 65 20 65 69 74 68 65 72 20 74 68 65 20 70 61  he either the pa
d610: 67 65 2d 73 69 7a 65 20 6f 72 20 73 65 63 74 6f  ge-size or secto
d620: 72 2d 73 69 7a 65 20 69 6e 20 74 68 65 20 6a 6f  r-size in the jo
d630: 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 69 73 20  urnal-header is 
d640: 0a 20 20 20 20 20 20 2a 2a 20 69 6e 76 61 6c 69  .      ** invali
d650: 64 2c 20 74 68 65 6e 20 74 68 65 20 70 72 6f 63  d, then the proc
d660: 65 73 73 20 74 68 61 74 20 77 72 6f 74 65 20 74  ess that wrote t
d670: 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65  he journal-heade
d680: 72 20 6d 75 73 74 20 68 61 76 65 20 0a 20 20 20  r must have .   
d690: 20 20 20 2a 2a 20 63 72 61 73 68 65 64 20 62 65     ** crashed be
d6a0: 66 6f 72 65 20 74 68 65 20 68 65 61 64 65 72 20  fore the header 
d6b0: 77 61 73 20 73 79 6e 63 65 64 2e 20 49 6e 20 74  was synced. In t
d6c0: 68 69 73 20 63 61 73 65 20 73 74 6f 70 20 72 65  his case stop re
d6d0: 61 64 69 6e 67 20 0a 20 20 20 20 20 20 2a 2a 20  ading .      ** 
d6e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
d6f0: 20 68 65 72 65 2e 0a 20 20 20 20 20 20 2a 2f 0a   here..      */.
d700: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
d710: 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a  ITE_DONE;.    }.
d720: 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74  .    /* Update t
d730: 68 65 20 70 61 67 65 2d 73 69 7a 65 20 74 6f 20  he page-size to 
d740: 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75 65 20  match the value 
d750: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f  read from the jo
d760: 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2a 20 55  urnal. .    ** U
d770: 73 65 20 61 20 74 65 73 74 63 61 73 65 28 29 20  se a testcase() 
d780: 6d 61 63 72 6f 20 74 6f 20 6d 61 6b 65 20 73 75  macro to make su
d790: 72 65 20 74 68 61 74 20 6d 61 6c 6c 6f 63 20 66  re that malloc f
d7a0: 61 69 6c 75 72 65 20 77 69 74 68 69 6e 20 0a 20  ailure within . 
d7b0: 20 20 20 2a 2a 20 50 61 67 65 72 53 65 74 50 61     ** PagerSetPa
d7c0: 67 65 73 69 7a 65 28 29 20 69 73 20 74 65 73 74  gesize() is test
d7d0: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
d7e0: 50 61 67 65 53 69 7a 65 31 36 20 3d 20 28 75 31  PageSize16 = (u1
d7f0: 36 29 69 50 61 67 65 53 69 7a 65 3b 0a 20 20 20  6)iPageSize;.   
d800: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
d810: 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 50  erSetPagesize(pP
d820: 61 67 65 72 2c 20 26 69 50 61 67 65 53 69 7a 65  ager, &iPageSize
d830: 31 36 2c 20 2d 31 29 3b 0a 20 20 20 20 74 65 73  16, -1);.    tes
d840: 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54  tcase( rc!=SQLIT
d850: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 61 73 73 65  E_OK );.    asse
d860: 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
d870: 4b 20 7c 7c 20 69 50 61 67 65 53 69 7a 65 31 36  K || iPageSize16
d880: 3d 3d 28 75 31 36 29 69 50 61 67 65 53 69 7a 65  ==(u16)iPageSize
d890: 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61   );..    /* Upda
d8a0: 74 65 20 74 68 65 20 61 73 73 75 6d 65 64 20 73  te the assumed s
d8b0: 65 63 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61  ector-size to ma
d8c0: 74 63 68 20 74 68 65 20 76 61 6c 75 65 20 75 73  tch the value us
d8d0: 65 64 20 62 79 20 0a 20 20 20 20 2a 2a 20 74 68  ed by .    ** th
d8e0: 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 63  e process that c
d8f0: 72 65 61 74 65 64 20 74 68 69 73 20 6a 6f 75 72  reated this jour
d900: 6e 61 6c 2e 20 49 66 20 74 68 69 73 20 6a 6f 75  nal. If this jou
d910: 72 6e 61 6c 20 77 61 73 0a 20 20 20 20 2a 2a 20  rnal was.    ** 
d920: 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f  created by a pro
d930: 63 65 73 73 20 6f 74 68 65 72 20 74 68 61 6e 20  cess other than 
d940: 74 68 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20 74  this one, then t
d950: 68 69 73 20 72 6f 75 74 69 6e 65 0a 20 20 20 20  his routine.    
d960: 2a 2a 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c  ** is being call
d970: 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 70  ed from within p
d980: 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e  ager_playback().
d990: 20 54 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65   The local value
d9a0: 0a 20 20 20 20 2a 2a 20 6f 66 20 50 61 67 65 72  .    ** of Pager
d9b0: 2e 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20 72  .sectorSize is r
d9c0: 65 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 65  estored at the e
d9d0: 6e 64 20 6f 66 20 74 68 61 74 20 72 6f 75 74 69  nd of that routi
d9e0: 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  ne..    */.    p
d9f0: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
da00: 65 20 3d 20 69 53 65 63 74 6f 72 53 69 7a 65 3b  e = iSectorSize;
da10: 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e  .  }..  pPager->
da20: 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f  journalOff += JO
da30: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
da40: 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ger);.  return r
da50: 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  c;.}.../*.** Wri
da60: 74 65 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  te the supplied 
da70: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
da80: 61 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ame into the jou
da90: 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61  rnal file for pa
daa0: 67 65 72 0a 2a 2a 20 70 50 61 67 65 72 20 61 74  ger.** pPager at
dab0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63   the current loc
dac0: 61 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65  ation. The maste
dad0: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d  r journal name m
dae0: 75 73 74 20 62 65 20 74 68 65 20 6c 61 73 74 0a  ust be the last.
daf0: 2a 2a 20 74 68 69 6e 67 20 77 72 69 74 74 65 6e  ** thing written
db00: 20 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69   to a journal fi
db10: 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67 65 72  le. If the pager
db20: 20 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63   is in full-sync
db30: 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f   mode, the.** jo
db40: 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72  urnal file descr
db50: 69 70 74 6f 72 20 69 73 20 61 64 76 61 6e 63 65  iptor is advance
db60: 64 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65  d to the next se
db70: 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 62 65  ctor boundary be
db80: 66 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67  fore.** anything
db90: 20 69 73 20 77 72 69 74 74 65 6e 2e 20 54 68 65   is written. The
dba0: 20 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a   format is:.**.*
dbb0: 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20 50  *   + 4 bytes: P
dbc0: 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a  AGER_MJ_PGNO..**
dbd0: 20 20 20 2b 20 4e 20 62 79 74 65 73 3a 20 4d 61     + N bytes: Ma
dbe0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
dbf0: 65 6e 61 6d 65 20 69 6e 20 75 74 66 2d 38 2e 0a  ename in utf-8..
dc00: 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20  **   + 4 bytes: 
dc10: 4e 20 28 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73  N (length of mas
dc20: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
dc30: 20 69 6e 20 62 79 74 65 73 2c 20 6e 6f 20 6e 75   in bytes, no nu
dc40: 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2e 0a 2a  l-terminator)..*
dc50: 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20 4d  *   + 4 bytes: M
dc60: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
dc70: 6d 65 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20  me checksum..** 
dc80: 20 20 2b 20 38 20 62 79 74 65 73 3a 20 61 4a 6f    + 8 bytes: aJo
dc90: 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a  urnalMagic[]..**
dca0: 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a  .** The master j
dcb0: 6f 75 72 6e 61 6c 20 70 61 67 65 20 63 68 65 63  ournal page chec
dcc0: 6b 73 75 6d 20 69 73 20 74 68 65 20 73 75 6d 20  ksum is the sum 
dcd0: 6f 66 20 74 68 65 20 62 79 74 65 73 20 69 6e 20  of the bytes in 
dce0: 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f  the master.** jo
dcf0: 75 72 6e 61 6c 20 6e 61 6d 65 2c 20 77 68 65 72  urnal name, wher
dd00: 65 20 65 61 63 68 20 62 79 74 65 20 69 73 20 69  e each byte is i
dd10: 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 61 20  nterpreted as a 
dd20: 73 69 67 6e 65 64 20 38 2d 62 69 74 20 69 6e 74  signed 8-bit int
dd30: 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a  eger..**.** If z
dd40: 4d 61 73 74 65 72 20 69 73 20 61 20 4e 55 4c 4c  Master is a NULL
dd50: 20 70 6f 69 6e 74 65 72 20 28 6f 63 63 75 72 73   pointer (occurs
dd60: 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 64 61   for a single da
dd70: 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69  tabase transacti
dd80: 6f 6e 29 2c 20 0a 2a 2a 20 74 68 69 73 20 63 61  on), .** this ca
dd90: 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ll is a no-op..*
dda0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69  /.static int wri
ddb0: 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  teMasterJournal(
ddc0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63  Pager *pPager, c
ddd0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74  onst char *zMast
dde0: 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  er){.  int rc;  
ddf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de00: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
de10: 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
de20: 6e 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20 20  nMaster;        
de30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
de40: 4c 65 6e 67 74 68 20 6f 66 20 73 74 72 69 6e 67  Length of string
de50: 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 20 20 69 36   zMaster */.  i6
de60: 34 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20  4 iHdrOff;      
de70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
de80: 2a 20 4f 66 66 73 65 74 20 6f 66 20 68 65 61 64  * Offset of head
de90: 65 72 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69  er in journal fi
dea0: 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 72 6e 6c  le */.  i64 jrnl
deb0: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
dec0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
ded0: 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   of journal file
dee0: 20 6f 6e 20 64 69 73 6b 20 2a 2f 0a 20 20 75 33   on disk */.  u3
def0: 32 20 63 6b 73 75 6d 20 3d 20 30 3b 20 20 20 20  2 cksum = 0;    
df00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
df10: 2a 20 43 68 65 63 6b 73 75 6d 20 6f 66 20 73 74  * Checksum of st
df20: 72 69 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a  ring zMaster */.
df30: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
df40: 72 2d 3e 73 65 74 4d 61 73 74 65 72 3d 3d 30 20  r->setMaster==0 
df50: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 7a 4d  );.  assert( !zM
df60: 61 73 74 65 72 20 7c 7c 20 70 50 61 67 65 72 2d  aster || pPager-
df70: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41  >journalMode!=PA
df80: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
df90: 57 41 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  WAL );.  assert(
dfa0: 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
dfb0: 61 67 65 72 29 20 29 3b 0a 0a 20 20 69 66 28 20  ager) );..  if( 
dfc0: 21 7a 4d 61 73 74 65 72 20 0a 20 20 20 7c 7c 20  !zMaster .   || 
dfd0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
dfe0: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
dff0: 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20  ALMODE_MEMORY . 
e000: 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75    || pPager->jou
e010: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
e020: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
e030: 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
e040: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
e050: 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73    pPager->setMas
e060: 74 65 72 20 3d 20 31 3b 0a 20 20 61 73 73 65 72  ter = 1;.  asser
e070: 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
e080: 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 61 73 73 65  ->jfd) );.  asse
e090: 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
e0a0: 6e 61 6c 48 64 72 20 3c 3d 20 70 50 61 67 65 72  nalHdr <= pPager
e0b0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a  ->journalOff );.
e0c0: 0a 20 20 2f 2a 20 43 61 6c 63 75 6c 61 74 65 20  .  /* Calculate 
e0d0: 74 68 65 20 6c 65 6e 67 74 68 20 69 6e 20 62 79  the length in by
e0e0: 74 65 73 20 61 6e 64 20 74 68 65 20 63 68 65 63  tes and the chec
e0f0: 6b 73 75 6d 20 6f 66 20 7a 4d 61 73 74 65 72 20  ksum of zMaster 
e100: 2a 2f 0a 20 20 66 6f 72 28 6e 4d 61 73 74 65 72  */.  for(nMaster
e110: 3d 30 3b 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73  =0; zMaster[nMas
e120: 74 65 72 5d 3b 20 6e 4d 61 73 74 65 72 2b 2b 29  ter]; nMaster++)
e130: 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 7a  {.    cksum += z
e140: 4d 61 73 74 65 72 5b 6e 4d 61 73 74 65 72 5d 3b  Master[nMaster];
e150: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 69 6e  .  }..  /* If in
e160: 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c   full-sync mode,
e170: 20 61 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20   advance to the 
e180: 6e 65 78 74 20 64 69 73 6b 20 73 65 63 74 6f 72  next disk sector
e190: 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67 0a   before writing.
e1a0: 20 20 2a 2a 20 74 68 65 20 6d 61 73 74 65 72 20    ** the master 
e1b0: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 54 68  journal name. Th
e1c0: 69 73 20 69 73 20 69 6e 20 63 61 73 65 20 74 68  is is in case th
e1d0: 65 20 70 72 65 76 69 6f 75 73 20 70 61 67 65 20  e previous page 
e1e0: 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 2a 2a 20  written to.  ** 
e1f0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20  the journal has 
e200: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 79 6e  already been syn
e210: 63 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ced..  */.  if( 
e220: 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
e230: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
e240: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75  journalOff = jou
e250: 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50  rnalHdrOffset(pP
e260: 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 48 64  ager);.  }.  iHd
e270: 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a  rOff = pPager->j
e280: 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a  ournalOff;..  /*
e290: 20 57 72 69 74 65 20 74 68 65 20 6d 61 73 74 65   Write the maste
e2a0: 72 20 6a 6f 75 72 6e 61 6c 20 64 61 74 61 20 74  r journal data t
e2b0: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
e2c0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
e2d0: 66 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20  f.  ** an error 
e2e0: 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 74  occurs, return t
e2f0: 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f  he error code to
e300: 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 2a   the caller..  *
e310: 2f 0a 20 20 69 66 28 20 28 30 20 21 3d 20 28 72  /.  if( (0 != (r
e320: 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
e330: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
e340: 72 4f 66 66 2c 20 50 41 47 45 52 5f 4d 4a 5f 50  rOff, PAGER_MJ_P
e350: 47 4e 4f 28 70 50 61 67 65 72 29 29 29 29 0a 20  GNO(pPager)))). 
e360: 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d    || (0 != (rc =
e370: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
e380: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61  pPager->jfd, zMa
e390: 73 74 65 72 2c 20 6e 4d 61 73 74 65 72 2c 20 69  ster, nMaster, i
e3a0: 48 64 72 4f 66 66 2b 34 29 29 29 0a 20 20 20 7c  HdrOff+4))).   |
e3b0: 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72  | (0 != (rc = wr
e3c0: 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72  ite32bits(pPager
e3d0: 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 34  ->jfd, iHdrOff+4
e3e0: 2b 6e 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74 65  +nMaster, nMaste
e3f0: 72 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d  r))).   || (0 !=
e400: 20 28 72 63 20 3d 20 77 72 69 74 65 33 32 62 69   (rc = write32bi
e410: 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
e420: 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65  iHdrOff+4+nMaste
e430: 72 2b 34 2c 20 63 6b 73 75 6d 29 29 29 0a 20 20  r+4, cksum))).  
e440: 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20   || (0 != (rc = 
e450: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
e460: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75  Pager->jfd, aJou
e470: 72 6e 61 6c 4d 61 67 69 63 2c 20 38 2c 20 69 48  rnalMagic, 8, iH
e480: 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2b  drOff+4+nMaster+
e490: 38 29 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  8))).  ){.    re
e4a0: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70  turn rc;.  }.  p
e4b0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
e4c0: 66 20 2b 3d 20 28 6e 4d 61 73 74 65 72 2b 32 30  f += (nMaster+20
e4d0: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
e4e0: 70 61 67 65 72 20 69 73 20 69 6e 20 70 65 72 69  pager is in peri
e4f0: 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 20 6d 6f  stent-journal mo
e500: 64 65 2c 20 74 68 65 6e 20 74 68 65 20 70 68 79  de, then the phy
e510: 73 69 63 61 6c 20 0a 20 20 2a 2a 20 6a 6f 75 72  sical .  ** jour
e520: 6e 61 6c 2d 66 69 6c 65 20 6d 61 79 20 65 78 74  nal-file may ext
e530: 65 6e 64 20 70 61 73 74 20 74 68 65 20 65 6e 64  end past the end
e540: 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 2d 6a   of the master-j
e550: 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 20 20 2a 2a  ournal name.  **
e560: 20 61 6e 64 20 38 20 62 79 74 65 73 20 6f 66 20   and 8 bytes of 
e570: 6d 61 67 69 63 20 64 61 74 61 20 6a 75 73 74 20  magic data just 
e580: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 66  written to the f
e590: 69 6c 65 2e 20 54 68 69 73 20 69 73 20 0a 20 20  ile. This is .  
e5a0: 2a 2a 20 64 61 6e 67 65 72 6f 75 73 20 62 65 63  ** dangerous bec
e5b0: 61 75 73 65 20 74 68 65 20 63 6f 64 65 20 74 6f  ause the code to
e5c0: 20 72 6f 6c 6c 62 61 63 6b 20 61 20 68 6f 74 2d   rollback a hot-
e5d0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20 2a  journal file.  *
e5e0: 2a 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61 62  * will not be ab
e5f0: 6c 65 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6d  le to find the m
e600: 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61  aster-journal na
e610: 6d 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  me to determine 
e620: 0a 20 20 2a 2a 20 77 68 65 74 68 65 72 20 6f 72  .  ** whether or
e630: 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c   not the journal
e640: 20 69 73 20 68 6f 74 2e 20 0a 20 20 2a 2a 0a 20   is hot. .  **. 
e650: 20 2a 2a 20 45 61 73 69 65 73 74 20 74 68 69 6e   ** Easiest thin
e660: 67 20 74 6f 20 64 6f 20 69 6e 20 74 68 69 73 20  g to do in this 
e670: 73 63 65 6e 61 72 69 6f 20 69 73 20 74 6f 20 74  scenario is to t
e680: 72 75 6e 63 61 74 65 20 74 68 65 20 6a 6f 75 72  runcate the jour
e690: 6e 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 74  nal .  ** file t
e6a0: 6f 20 74 68 65 20 72 65 71 75 69 72 65 64 20 73  o the required s
e6b0: 69 7a 65 2e 0a 20 20 2a 2f 20 0a 20 20 69 66 28  ize..  */ .  if(
e6c0: 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20   SQLITE_OK==(rc 
e6d0: 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
e6e0: 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ize(pPager->jfd,
e6f0: 20 26 6a 72 6e 6c 53 69 7a 65 29 29 0a 20 20 20   &jrnlSize)).   
e700: 26 26 20 6a 72 6e 6c 53 69 7a 65 3e 70 50 61 67  && jrnlSize>pPag
e710: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20  er->journalOff. 
e720: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
e730: 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70  ite3OsTruncate(p
e740: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
e750: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b  er->journalOff);
e760: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
e770: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20  ;.}../*.** Find 
e780: 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 68 61  a page in the ha
e790: 73 68 20 74 61 62 6c 65 20 67 69 76 65 6e 20 69  sh table given i
e7a0: 74 73 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 20  ts page number. 
e7b0: 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e  Return.** a poin
e7c0: 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20  ter to the page 
e7d0: 6f 72 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 72  or NULL if the r
e7e0: 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73  equested page is
e7f0: 20 6e 6f 74 20 0a 2a 2a 20 61 6c 72 65 61 64 79   not .** already
e800: 20 69 6e 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73   in memory..*/.s
e810: 74 61 74 69 63 20 50 67 48 64 72 20 2a 70 61 67  tatic PgHdr *pag
e820: 65 72 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20  er_lookup(Pager 
e830: 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67  *pPager, Pgno pg
e840: 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b  no){.  PgHdr *p;
e850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e860: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
e870: 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 2f  rn value */..  /
e880: 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  * It is not poss
e890: 69 62 6c 65 20 66 6f 72 20 61 20 63 61 6c 6c 20  ible for a call 
e8a0: 74 6f 20 50 63 61 63 68 65 46 65 74 63 68 28 29  to PcacheFetch()
e8b0: 20 77 69 74 68 20 63 72 65 61 74 65 46 6c 61 67   with createFlag
e8c0: 3d 3d 30 20 74 6f 0a 20 20 2a 2a 20 66 61 69 6c  ==0 to.  ** fail
e8d0: 2c 20 73 69 6e 63 65 20 6e 6f 20 61 74 74 65 6d  , since no attem
e8e0: 70 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 64  pt to allocate d
e8f0: 79 6e 61 6d 69 63 20 6d 65 6d 6f 72 79 20 77 69  ynamic memory wi
e900: 6c 6c 20 62 65 20 6d 61 64 65 2e 0a 20 20 2a 2f  ll be made..  */
e910: 0a 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33  .  (void)sqlite3
e920: 50 63 61 63 68 65 46 65 74 63 68 28 70 50 61 67  PcacheFetch(pPag
e930: 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e  er->pPCache, pgn
e940: 6f 2c 20 30 2c 20 26 70 29 3b 0a 20 20 72 65 74  o, 0, &p);.  ret
e950: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
e960: 44 69 73 63 61 72 64 20 74 68 65 20 65 6e 74 69  Discard the enti
e970: 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  re contents of t
e980: 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  he in-memory pag
e990: 65 2d 63 61 63 68 65 2e 0a 2a 2f 0a 73 74 61 74  e-cache..*/.stat
e9a0: 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65  ic void pager_re
e9b0: 73 65 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  set(Pager *pPage
e9c0: 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 42 61 63  r){.  sqlite3Bac
e9d0: 6b 75 70 52 65 73 74 61 72 74 28 70 50 61 67 65  kupRestart(pPage
e9e0: 72 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 20 20 73  r->pBackup);.  s
e9f0: 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61  qlite3PcacheClea
ea00: 72 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  r(pPager->pPCach
ea10: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65  e);.}../*.** Fre
ea20: 65 20 61 6c 6c 20 73 74 72 75 63 74 75 72 65 73  e all structures
ea30: 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e 61 53   in the Pager.aS
ea40: 61 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79  avepoint[] array
ea50: 20 61 6e 64 20 73 65 74 20 62 6f 74 68 0a 2a 2a   and set both.**
ea60: 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e   Pager.aSavepoin
ea70: 74 20 61 6e 64 20 50 61 67 65 72 2e 6e 53 61 76  t and Pager.nSav
ea80: 65 70 6f 69 6e 74 20 74 6f 20 7a 65 72 6f 2e 20  epoint to zero. 
ea90: 43 6c 6f 73 65 20 74 68 65 20 73 75 62 2d 6a 6f  Close the sub-jo
eaa0: 75 72 6e 61 6c 0a 2a 2a 20 69 66 20 69 74 20 69  urnal.** if it i
eab0: 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70  s open and the p
eac0: 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 65  ager is not in e
ead0: 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 0a 2a  xclusive mode..*
eae0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  /.static void re
eaf0: 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e  leaseAllSavepoin
eb00: 74 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ts(Pager *pPager
eb10: 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20  ){.  int ii;    
eb20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74             /* It
eb30: 65 72 61 74 6f 72 20 66 6f 72 20 6c 6f 6f 70 69  erator for loopi
eb40: 6e 67 20 74 68 72 6f 75 67 68 20 50 61 67 65 72  ng through Pager
eb50: 2e 61 53 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20  .aSavepoint */. 
eb60: 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50   for(ii=0; ii<pP
eb70: 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
eb80: 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  ; ii++){.    sql
eb90: 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f  ite3BitvecDestro
eba0: 79 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70  y(pPager->aSavep
ebb0: 6f 69 6e 74 5b 69 69 5d 2e 70 49 6e 53 61 76 65  oint[ii].pInSave
ebc0: 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a 20 20 69 66  point);.  }.  if
ebd0: 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  ( !pPager->exclu
ebe0: 73 69 76 65 4d 6f 64 65 20 7c 7c 20 73 71 6c 69  siveMode || sqli
ebf0: 74 65 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28  te3IsMemJournal(
ec00: 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b  pPager->sjfd) ){
ec10: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  .    sqlite3OsCl
ec20: 6f 73 65 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  ose(pPager->sjfd
ec30: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
ec40: 5f 66 72 65 65 28 70 50 61 67 65 72 2d 3e 61 53  _free(pPager->aS
ec50: 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 70 50 61  avepoint);.  pPa
ec60: 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20  ger->aSavepoint 
ec70: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  = 0;.  pPager->n
ec80: 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20  Savepoint = 0;. 
ec90: 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63   pPager->nSubRec
eca0: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53   = 0;.}../*.** S
ecb0: 65 74 20 74 68 65 20 62 69 74 20 6e 75 6d 62 65  et the bit numbe
ecc0: 72 20 70 67 6e 6f 20 69 6e 20 74 68 65 20 50 61  r pgno in the Pa
ecd0: 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e  gerSavepoint.pIn
ece0: 53 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 62 69  Savepoint .** bi
ecf0: 74 76 65 63 73 20 6f 66 20 61 6c 6c 20 6f 70 65  tvecs of all ope
ed00: 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 52 65  n savepoints. Re
ed10: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
ed20: 66 20 73 75 63 63 65 73 73 66 75 6c 0a 2a 2a 20  f successful.** 
ed30: 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  or SQLITE_NOMEM 
ed40: 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  if a malloc fail
ed50: 75 72 65 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73  ure occurs..*/.s
ed60: 74 61 74 69 63 20 69 6e 74 20 61 64 64 54 6f 53  tatic int addToS
ed70: 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28  avepointBitvecs(
ed80: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
ed90: 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74  gno pgno){.  int
eda0: 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20   ii;            
edb0: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
edc0: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
edd0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
ede0: 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
edf0: 63 6f 64 65 20 2a 2f 0a 0a 20 20 66 6f 72 28 69  code */..  for(i
ee00: 69 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e  i=0; ii<pPager->
ee10: 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b  nSavepoint; ii++
ee20: 29 7b 0a 20 20 20 20 50 61 67 65 72 53 61 76 65  ){.    PagerSave
ee30: 70 6f 69 6e 74 20 2a 70 20 3d 20 26 70 50 61 67  point *p = &pPag
ee40: 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69  er->aSavepoint[i
ee50: 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 67 6e 6f  i];.    if( pgno
ee60: 3c 3d 70 2d 3e 6e 4f 72 69 67 20 29 7b 0a 20 20  <=p->nOrig ){.  
ee70: 20 20 20 20 72 63 20 7c 3d 20 73 71 6c 69 74 65      rc |= sqlite
ee80: 33 42 69 74 76 65 63 53 65 74 28 70 2d 3e 70 49  3BitvecSet(p->pI
ee90: 6e 53 61 76 65 70 6f 69 6e 74 2c 20 70 67 6e 6f  nSavepoint, pgno
eea0: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
eeb0: 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  e( rc==SQLITE_NO
eec0: 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 61 73 73  MEM );.      ass
eed0: 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
eee0: 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  OK || rc==SQLITE
eef0: 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 7d 0a  _NOMEM );.    }.
ef00: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
ef10: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b  .}../*.** Unlock
ef20: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
ef30: 6c 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  le. This functio
ef40: 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  n is a no-op if 
ef50: 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 69 73 20  the pager.** is 
ef60: 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
ef70: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
ef80: 70 61 67 65 72 20 69 73 20 63 75 72 72 65 6e 74  pager is current
ef90: 6c 79 20 69 6e 20 65 72 72 6f 72 20 73 74 61 74  ly in error stat
efa0: 65 2c 20 64 69 73 63 61 72 64 20 74 68 65 20 63  e, discard the c
efb0: 6f 6e 74 65 6e 74 73 20 6f 66 20 0a 2a 2a 20 74  ontents of .** t
efc0: 68 65 20 63 61 63 68 65 20 61 6e 64 20 72 65 73  he cache and res
efd0: 65 74 20 74 68 65 20 50 61 67 65 72 20 73 74 72  et the Pager str
efe0: 75 63 74 75 72 65 20 69 6e 74 65 72 6e 61 6c 20  ucture internal 
eff0: 73 74 61 74 65 2e 20 49 66 20 74 68 65 72 65 20  state. If there 
f000: 69 73 0a 2a 2a 20 61 6e 20 6f 70 65 6e 20 6a 6f  is.** an open jo
f010: 75 72 6e 61 6c 2d 66 69 6c 65 2c 20 74 68 65 6e  urnal-file, then
f020: 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20 61   the next time a
f030: 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 69 73 20   shared-lock is 
f040: 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 6f 6e 20 74  obtained.** on t
f050: 68 65 20 70 61 67 65 72 20 66 69 6c 65 20 28 62  he pager file (b
f060: 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74  y this or any ot
f070: 68 65 72 20 70 72 6f 63 65 73 73 29 2c 20 69 74  her process), it
f080: 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 74 72 65 61   will be.** trea
f090: 74 65 64 20 61 73 20 61 20 68 6f 74 2d 6a 6f 75  ted as a hot-jou
f0a0: 72 6e 61 6c 20 61 6e 64 20 72 6f 6c 6c 65 64 20  rnal and rolled 
f0b0: 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  back..*/.static 
f0c0: 76 6f 69 64 20 70 61 67 65 72 5f 75 6e 6c 6f 63  void pager_unloc
f0d0: 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  k(Pager *pPager)
f0e0: 7b 0a 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76  {..  sqlite3Bitv
f0f0: 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72  ecDestroy(pPager
f100: 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20  ->pInJournal);. 
f110: 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
f120: 6e 61 6c 20 3d 20 30 3b 0a 20 20 72 65 6c 65 61  nal = 0;.  relea
f130: 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28  seAllSavepoints(
f140: 70 50 61 67 65 72 29 3b 0a 0a 20 20 69 66 28 20  pPager);..  if( 
f150: 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
f160: 65 72 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  er) ){.    asser
f170: 74 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  t( !isOpen(pPage
f180: 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20 73  r->jfd) );.    s
f190: 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65 61 64  qlite3WalEndRead
f1a0: 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  Transaction(pPag
f1b0: 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20 70  er->pWal);.    p
f1c0: 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20  Pager->eState = 
f1d0: 50 41 47 45 52 5f 4e 4f 4e 45 3b 0a 20 20 7d 65  PAGER_NONE;.  }e
f1e0: 6c 73 65 20 69 66 28 20 21 70 50 61 67 65 72 2d  lse if( !pPager-
f1f0: 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29  >exclusiveMode )
f200: 7b 0a 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20  {.    int iDc = 
f210: 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
f220: 64 29 3f 73 71 6c 69 74 65 33 4f 73 44 65 76 69  d)?sqlite3OsDevi
f230: 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
f240: 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3a 30 3b  s(pPager->fd):0;
f250: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
f260: 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
f270: 20 73 75 70 70 6f 72 74 20 64 65 6c 65 74 69 6f   support deletio
f280: 6e 20 6f 66 20 6f 70 65 6e 20 66 69 6c 65 73 2c  n of open files,
f290: 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 63 6c 6f   then.    ** clo
f2a0: 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  se the journal f
f2b0: 69 6c 65 20 77 68 65 6e 20 64 72 6f 70 70 69 6e  ile when droppin
f2c0: 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6c  g the database l
f2d0: 6f 63 6b 2e 20 20 4f 74 68 65 72 77 69 73 65 0a  ock.  Otherwise.
f2e0: 20 20 20 20 2a 2a 20 61 6e 6f 74 68 65 72 20 63      ** another c
f2f0: 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 6a  onnection with j
f300: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 64 65 6c 65  ournal_mode=dele
f310: 74 65 20 6d 69 67 68 74 20 64 65 6c 65 74 65 20  te might delete 
f320: 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20  the file.    ** 
f330: 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 75  out from under u
f340: 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  s..    */.    as
f350: 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55  sert( (PAGER_JOU
f360: 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
f370: 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20    & 5)!=1 );.   
f380: 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f   assert( (PAGER_
f390: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
f3a0: 20 20 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a       & 5)!=1 );.
f3b0: 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47      assert( (PAG
f3c0: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
f3d0: 41 4c 20 20 20 20 20 20 26 20 35 29 21 3d 31 20  AL      & 5)!=1 
f3e0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
f3f0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
f400: 45 5f 44 45 4c 45 54 45 20 20 20 26 20 35 29 21  E_DELETE   & 5)!
f410: 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =1 );.    assert
f420: 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  ( (PAGER_JOURNAL
f430: 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 26 20  MODE_TRUNCATE & 
f440: 35 29 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73  5)==1 );.    ass
f450: 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52  ert( (PAGER_JOUR
f460: 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20  NALMODE_PERSIST 
f470: 20 26 20 35 29 3d 3d 31 20 29 3b 0a 20 20 20 20   & 5)==1 );.    
f480: 69 66 28 20 30 3d 3d 28 69 44 63 20 26 20 53 51  if( 0==(iDc & SQ
f490: 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45 4c  LITE_IOCAP_UNDEL
f4a0: 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e  ETABLE_WHEN_OPEN
f4b0: 29 0a 20 20 20 20 20 7c 7c 20 31 21 3d 28 70 50  ).     || 1!=(pP
f4c0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
f4d0: 65 20 26 20 35 29 0a 20 20 20 20 29 7b 0a 20 20  e & 5).    ){.  
f4e0: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
f4f0: 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
f500: 0a 20 20 20 20 7d 0a 20 20 20 20 6f 73 55 6e 6c  .    }.    osUnl
f510: 6f 63 6b 28 70 50 61 67 65 72 2c 20 4e 4f 5f 4c  ock(pPager, NO_L
f520: 4f 43 4b 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  OCK);..    /* Th
f530: 65 20 70 61 67 65 72 20 73 74 61 74 65 20 6d 61  e pager state ma
f540: 79 20 62 65 20 63 68 61 6e 67 65 64 20 66 72 6f  y be changed fro
f550: 6d 20 50 41 47 45 52 5f 45 52 52 4f 52 20 74 6f  m PAGER_ERROR to
f560: 20 50 41 47 45 52 5f 4e 4f 4e 45 20 68 65 72 65   PAGER_NONE here
f570: 0a 20 20 20 20 2a 2a 20 77 69 74 68 6f 75 74 20  .    ** without 
f580: 63 6c 65 61 72 69 6e 67 20 74 68 65 20 65 72 72  clearing the err
f590: 6f 72 20 63 6f 64 65 2e 20 54 68 69 73 20 69 73  or code. This is
f5a0: 20 69 6e 74 65 6e 74 69 6f 6e 61 6c 20 2d 20 74   intentional - t
f5b0: 68 65 20 65 72 72 6f 72 0a 20 20 20 20 2a 2a 20  he error.    ** 
f5c0: 63 6f 64 65 20 69 73 20 63 6c 65 61 72 65 64 20  code is cleared 
f5d0: 61 6e 64 20 74 68 65 20 63 61 63 68 65 20 72 65  and the cache re
f5e0: 73 65 74 20 69 6e 20 74 68 65 20 62 6c 6f 63 6b  set in the block
f5f0: 20 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20   below..    */. 
f600: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
f610: 72 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 70 50  r->errCode || pP
f620: 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
f630: 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 20  GER_ERROR );.   
f640: 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
f650: 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20  ountDone = 0;.  
f660: 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
f670: 20 3d 20 50 41 47 45 52 5f 4e 4f 4e 45 3b 0a 20   = PAGER_NONE;. 
f680: 20 20 20 49 4f 54 52 41 43 45 28 28 22 55 4e 4c     IOTRACE(("UNL
f690: 4f 43 4b 20 25 70 5c 6e 22 2c 20 70 50 61 67 65  OCK %p\n", pPage
f6a0: 72 29 29 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  r)).  }..  /* If
f6b0: 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 69   Pager.errCode i
f6c0: 73 20 73 65 74 2c 20 74 68 65 20 63 6f 6e 74 65  s set, the conte
f6d0: 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72  nts of the pager
f6e0: 20 63 61 63 68 65 20 63 61 6e 6e 6f 74 20 62 65   cache cannot be
f6f0: 0a 20 20 2a 2a 20 74 72 75 73 74 65 64 2e 20 4e  .  ** trusted. N
f700: 6f 77 20 74 68 61 74 20 74 68 65 72 65 20 61 72  ow that there ar
f710: 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  e no outstanding
f720: 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
f730: 68 65 20 70 61 67 65 72 2c 0a 20 20 2a 2a 20 69  he pager,.  ** i
f740: 74 20 63 61 6e 20 73 61 66 65 6c 79 20 6d 6f 76  t can safely mov
f750: 65 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f  e back to PAGER_
f760: 4e 4f 4e 45 20 73 74 61 74 65 2e 20 54 68 69 73  NONE state. This
f770: 20 68 61 70 70 65 6e 73 20 69 6e 20 62 6f 74 68   happens in both
f780: 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 61 6e 64  .  ** normal and
f790: 20 65 78 63 6c 75 73 69 76 65 2d 6c 6f 63 6b 69   exclusive-locki
f7a0: 6e 67 20 6d 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20  ng mode..  */.  
f7b0: 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
f7c0: 6f 64 65 20 29 7b 0a 20 20 20 20 70 61 67 65 72  ode ){.    pager
f7d0: 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
f7e0: 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e      pPager->chan
f7f0: 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b  geCountDone = 0;
f800: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74  .    pPager->eSt
f810: 61 74 65 20 3d 20 50 41 47 45 52 5f 4e 4f 4e 45  ate = PAGER_NONE
f820: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72  ;.    pPager->er
f830: 72 43 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 4f  rCode = SQLITE_O
f840: 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  K;.  }.}../*.** 
f850: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68  This function sh
f860: 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 77  ould be called w
f870: 68 65 6e 20 61 6e 20 49 4f 45 52 52 2c 20 43 4f  hen an IOERR, CO
f880: 52 52 55 50 54 20 6f 72 20 46 55 4c 4c 20 65 72  RRUPT or FULL er
f890: 72 6f 72 0a 2a 2a 20 6d 61 79 20 68 61 76 65 20  ror.** may have 
f8a0: 6f 63 63 75 72 72 65 64 2e 20 54 68 65 20 66 69  occurred. The fi
f8b0: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  rst argument is 
f8c0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
f8d0: 20 70 61 67 65 72 20 0a 2a 2a 20 73 74 72 75 63   pager .** struc
f8e0: 74 75 72 65 2c 20 74 68 65 20 73 65 63 6f 6e 64  ture, the second
f8f0: 20 74 68 65 20 65 72 72 6f 72 2d 63 6f 64 65 20   the error-code 
f900: 61 62 6f 75 74 20 74 6f 20 62 65 20 72 65 74 75  about to be retu
f910: 72 6e 65 64 20 62 79 20 61 20 70 61 67 65 72 20  rned by a pager 
f920: 0a 2a 2a 20 41 50 49 20 66 75 6e 63 74 69 6f 6e  .** API function
f930: 2e 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  . The value retu
f940: 72 6e 65 64 20 69 73 20 61 20 63 6f 70 79 20 6f  rned is a copy o
f950: 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
f960: 75 6d 65 6e 74 20 0a 2a 2a 20 74 6f 20 74 68 69  ument .** to thi
f970: 73 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 0a  s function. .**.
f980: 2a 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64  ** If the second
f990: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 53 51 4c   argument is SQL
f9a0: 49 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54  ITE_IOERR, SQLIT
f9b0: 45 5f 43 4f 52 52 55 50 54 2c 20 6f 72 20 53 51  E_CORRUPT, or SQ
f9c0: 4c 49 54 45 5f 46 55 4c 4c 0a 2a 2a 20 74 68 65  LITE_FULL.** the
f9d0: 20 65 72 72 6f 72 20 62 65 63 6f 6d 65 73 20 70   error becomes p
f9e0: 65 72 73 69 73 74 65 6e 74 2e 20 55 6e 74 69 6c  ersistent. Until
f9f0: 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20   the persistent 
fa00: 65 72 72 6f 72 20 69 73 20 63 6c 65 61 72 65 64  error is cleared
fa10: 2c 0a 2a 2a 20 73 75 62 73 65 71 75 65 6e 74 20  ,.** subsequent 
fa20: 41 50 49 20 63 61 6c 6c 73 20 6f 6e 20 74 68 69  API calls on thi
fa30: 73 20 50 61 67 65 72 20 77 69 6c 6c 20 69 6d 6d  s Pager will imm
fa40: 65 64 69 61 74 65 6c 79 20 72 65 74 75 72 6e 20  ediately return 
fa50: 74 68 65 20 73 61 6d 65 20 0a 2a 2a 20 65 72 72  the same .** err
fa60: 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41  or code..**.** A
fa70: 20 70 65 72 73 69 73 74 65 6e 74 20 65 72 72 6f   persistent erro
fa80: 72 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74  r indicates that
fa90: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
faa0: 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65   the pager-cache
fab0: 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 74   .** cannot be t
fac0: 72 75 73 74 65 64 2e 20 54 68 69 73 20 73 74 61  rusted. This sta
fad0: 74 65 20 63 61 6e 20 62 65 20 63 6c 65 61 72 65  te can be cleare
fae0: 64 20 62 79 20 63 6f 6d 70 6c 65 74 65 6c 79 20  d by completely 
faf0: 64 69 73 63 61 72 64 69 6e 67 20 0a 2a 2a 20 74  discarding .** t
fb00: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
fb10: 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 2e 20  he pager-cache. 
fb20: 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  If a transaction
fb30: 20 77 61 73 20 61 63 74 69 76 65 20 77 68 65 6e   was active when
fb40: 0a 2a 2a 20 74 68 65 20 70 65 72 73 69 73 74 65  .** the persiste
fb50: 6e 74 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  nt error occurre
fb60: 64 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c  d, then the roll
fb70: 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d 61 79  back journal may
fb80: 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 72   need.** to be r
fb90: 65 70 6c 61 79 65 64 20 74 6f 20 72 65 73 74 6f  eplayed to resto
fba0: 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  re the contents 
fbb0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
fbc0: 66 69 6c 65 20 28 61 73 20 69 66 0a 2a 2a 20 69  file (as if.** i
fbd0: 74 20 77 65 72 65 20 61 20 68 6f 74 2d 6a 6f 75  t were a hot-jou
fbe0: 72 6e 61 6c 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  rnal)..*/.static
fbf0: 20 69 6e 74 20 70 61 67 65 72 5f 65 72 72 6f 72   int pager_error
fc00: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
fc10: 69 6e 74 20 72 63 29 7b 0a 20 20 69 6e 74 20 72  int rc){.  int r
fc20: 63 32 20 3d 20 72 63 20 26 20 30 78 66 66 3b 0a  c2 = rc & 0xff;.
fc30: 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
fc40: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 4d 45 4d 44  LITE_OK || !MEMD
fc50: 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 0a 20  B );.  assert(. 
fc60: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72        pPager->er
fc70: 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46 55  rCode==SQLITE_FU
fc80: 4c 4c 20 7c 7c 0a 20 20 20 20 20 20 20 70 50 61  LL ||.       pPa
fc90: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
fca0: 4c 49 54 45 5f 4f 4b 20 7c 7c 0a 20 20 20 20 20  LITE_OK ||.     
fcb0: 20 20 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f    (pPager->errCo
fcc0: 64 65 20 26 20 30 78 66 66 29 3d 3d 53 51 4c 49  de & 0xff)==SQLI
fcd0: 54 45 5f 49 4f 45 52 52 0a 20 20 29 3b 0a 20 20  TE_IOERR.  );.  
fce0: 69 66 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f  if( rc2==SQLITE_
fcf0: 46 55 4c 4c 20 7c 7c 20 72 63 32 3d 3d 53 51 4c  FULL || rc2==SQL
fd00: 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20  ITE_IOERR ){.   
fd10: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
fd20: 20 3d 20 72 63 3b 0a 20 20 20 20 70 50 61 67 65   = rc;.    pPage
fd30: 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45  r->eState = PAGE
fd40: 52 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  R_ERROR;.  }.  r
fd50: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
fd60: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
fd70: 65 6e 64 73 20 61 20 74 72 61 6e 73 61 63 74 69  ends a transacti
fd80: 6f 6e 2e 20 41 20 74 72 61 6e 73 61 63 74 69 6f  on. A transactio
fd90: 6e 20 69 73 20 75 73 75 61 6c 6c 79 20 65 6e 64  n is usually end
fda0: 65 64 20 62 79 20 0a 2a 2a 20 65 69 74 68 65 72  ed by .** either
fdb0: 20 61 20 43 4f 4d 4d 49 54 20 6f 72 20 61 20 52   a COMMIT or a R
fdc0: 4f 4c 4c 42 41 43 4b 20 6f 70 65 72 61 74 69 6f  OLLBACK operatio
fdd0: 6e 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  n. This routine 
fde0: 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 0a 2a  may be called .*
fdf0: 2a 20 61 66 74 65 72 20 72 6f 6c 6c 62 61 63 6b  * after rollback
fe00: 20 6f 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   of a hot-journa
fe10: 6c 2c 20 6f 72 20 69 66 20 61 6e 20 65 72 72 6f  l, or if an erro
fe20: 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6f  r occurs while o
fe30: 70 65 6e 69 6e 67 0a 2a 2a 20 74 68 65 20 6a 6f  pening.** the jo
fe40: 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 77 72  urnal file or wr
fe50: 69 74 69 6e 67 20 74 68 65 20 76 65 72 79 20 66  iting the very f
fe60: 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61  irst journal-hea
fe70: 64 65 72 20 6f 66 20 61 0a 2a 2a 20 64 61 74 61  der of a.** data
fe80: 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  base transaction
fe90: 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20  ..** .** If the 
fea0: 70 61 67 65 72 20 69 73 20 69 6e 20 50 41 47 45  pager is in PAGE
feb0: 52 5f 53 48 41 52 45 44 20 6f 72 20 50 41 47 45  R_SHARED or PAGE
fec0: 52 5f 55 4e 4c 4f 43 4b 20 73 74 61 74 65 20 77  R_UNLOCK state w
fed0: 68 65 6e 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74  hen this.** rout
fee0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 69  ine is called, i
fef0: 74 20 69 73 20 61 20 6e 6f 2d 6f 70 20 28 72 65  t is a no-op (re
ff00: 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 29  turns SQLITE_OK)
ff10: 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
ff20: 65 2c 20 61 6e 79 20 61 63 74 69 76 65 20 73 61  e, any active sa
ff30: 76 65 70 6f 69 6e 74 73 20 61 72 65 20 72 65 6c  vepoints are rel
ff40: 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  eased..**.** If 
ff50: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
ff60: 20 69 73 20 6f 70 65 6e 2c 20 74 68 65 6e 20 69   is open, then i
ff70: 74 20 69 73 20 22 66 69 6e 61 6c 69 7a 65 64 22  t is "finalized"
ff80: 2e 20 4f 6e 63 65 20 61 20 6a 6f 75 72 6e 61 6c  . Once a journal
ff90: 20 0a 2a 2a 20 66 69 6c 65 20 68 61 73 20 62 65   .** file has be
ffa0: 65 6e 20 66 69 6e 61 6c 69 7a 65 64 20 69 74 20  en finalized it 
ffb0: 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
ffc0: 74 6f 20 75 73 65 20 69 74 20 74 6f 20 72 6f 6c  to use it to rol
ffd0: 6c 20 62 61 63 6b 20 61 20 0a 2a 2a 20 74 72 61  l back a .** tra
ffe0: 6e 73 61 63 74 69 6f 6e 2e 20 4e 6f 72 20 77 69  nsaction. Nor wi
fff0: 6c 6c 20 69 74 20 62 65 20 63 6f 6e 73 69 64 65  ll it be conside
10000 72 65 64 20 74 6f 20 62 65 20 61 20 68 6f 74 2d  red to be a hot-
10010 6a 6f 75 72 6e 61 6c 20 62 79 20 74 68 69 73 0a  journal by this.
10020 2a 2a 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20  ** or any other 
10030 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
10040 69 6f 6e 2e 20 45 78 61 63 74 6c 79 20 68 6f 77  ion. Exactly how
10050 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 66 69   a journal is fi
10060 6e 61 6c 69 7a 65 64 0a 2a 2a 20 64 65 70 65 6e  nalized.** depen
10070 64 73 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72  ds on whether or
10080 20 6e 6f 74 20 74 68 65 20 70 61 67 65 72 20 69   not the pager i
10090 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63  s running in exc
100a0 6c 75 73 69 76 65 20 6d 6f 64 65 20 61 6e 64 0a  lusive mode and.
100b0 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 6a  ** the current j
100c0 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 28 50 61 67  ournal-mode (Pag
100d0 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 76  er.journalMode v
100e0 61 6c 75 65 29 2c 20 61 73 20 66 6f 6c 6c 6f 77  alue), as follow
100f0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e  s:.**.**   journ
10100 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59 0a 2a  alMode==MEMORY.*
10110 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69  *     Journal fi
10120 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
10130 20 73 69 6d 70 6c 79 20 63 6c 6f 73 65 64 2e 20   simply closed. 
10140 54 68 69 73 20 64 65 73 74 72 6f 79 73 20 61 6e  This destroys an
10150 20 0a 2a 2a 20 20 20 20 20 69 6e 2d 6d 65 6d 6f   .**     in-memo
10160 72 79 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  ry journal..**.*
10170 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  *   journalMode=
10180 3d 54 52 55 4e 43 41 54 45 0a 2a 2a 20 20 20 20  =TRUNCATE.**    
10190 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   Journal file is
101a0 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65   truncated to ze
101b0 72 6f 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ro bytes in size
101c0 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61  ..**.**   journa
101d0 6c 4d 6f 64 65 3d 3d 50 45 52 53 49 53 54 0a 2a  lMode==PERSIST.*
101e0 2a 20 20 20 20 20 54 68 65 20 66 69 72 73 74 20  *     The first 
101f0 32 38 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  28 bytes of the 
10200 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 72 65  journal file are
10210 20 7a 65 72 6f 65 64 2e 20 54 68 69 73 20 69 6e   zeroed. This in
10220 76 61 6c 69 64 61 74 65 73 0a 2a 2a 20 20 20 20  validates.**    
10230 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e   the first journ
10240 61 6c 20 68 65 61 64 65 72 20 69 6e 20 74 68 65  al header in the
10250 20 66 69 6c 65 2c 20 61 6e 64 20 68 65 6e 63 65   file, and hence
10260 20 74 68 65 20 65 6e 74 69 72 65 20 6a 6f 75 72   the entire jour
10270 6e 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65 2e  nal.**     file.
10280 20 41 6e 20 69 6e 76 61 6c 69 64 20 6a 6f 75 72   An invalid jour
10290 6e 61 6c 20 66 69 6c 65 20 63 61 6e 6e 6f 74 20  nal file cannot 
102a0 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  be rolled back..
102b0 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d  **.**   journalM
102c0 6f 64 65 3d 3d 44 45 4c 45 54 45 0a 2a 2a 20 20  ode==DELETE.**  
102d0 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66     The journal f
102e0 69 6c 65 20 69 73 20 63 6c 6f 73 65 64 20 61 6e  ile is closed an
102f0 64 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20  d deleted using 
10300 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
10310 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 49 66 20  )..**.**     If 
10320 74 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e  the pager is run
10330 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76  ning in exclusiv
10340 65 20 6d 6f 64 65 2c 20 74 68 69 73 20 6d 65 74  e mode, this met
10350 68 6f 64 20 6f 66 20 66 69 6e 61 6c 69 7a 69 6e  hod of finalizin
10360 67 0a 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f 75  g.**     the jou
10370 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 65 76  rnal file is nev
10380 65 72 20 75 73 65 64 2e 20 49 6e 73 74 65 61 64  er used. Instead
10390 2c 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  , if the journal
103a0 4d 6f 64 65 20 69 73 0a 2a 2a 20 20 20 20 20 44  Mode is.**     D
103b0 45 4c 45 54 45 20 61 6e 64 20 74 68 65 20 70 61  ELETE and the pa
103c0 67 65 72 20 69 73 20 69 6e 20 65 78 63 6c 75 73  ger is in exclus
103d0 69 76 65 20 6d 6f 64 65 2c 20 74 68 65 20 6d 65  ive mode, the me
103e0 74 68 6f 64 20 64 65 73 63 72 69 62 65 64 20 75  thod described u
103f0 6e 64 65 72 0a 2a 2a 20 20 20 20 20 6a 6f 75 72  nder.**     jour
10400 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52 53 49 53 54  nalMode==PERSIST
10410 20 69 73 20 75 73 65 64 20 69 6e 73 74 65 61 64   is used instead
10420 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68  ..**.** After th
10430 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 66 69 6e  e journal is fin
10440 61 6c 69 7a 65 64 2c 20 69 66 20 72 75 6e 6e 69  alized, if runni
10450 6e 67 20 69 6e 20 6e 6f 6e 2d 65 78 63 6c 75 73  ng in non-exclus
10460 69 76 65 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a  ive mode, the.**
10470 20 70 61 67 65 72 20 6d 6f 76 65 73 20 74 6f 20   pager moves to 
10480 50 41 47 45 52 5f 53 48 41 52 45 44 20 73 74 61  PAGER_SHARED sta
10490 74 65 20 28 61 6e 64 20 64 6f 77 6e 67 72 61 64  te (and downgrad
104a0 65 73 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74  es the lock on t
104b0 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66  he.** database f
104c0 69 6c 65 20 61 63 63 6f 72 64 69 6e 67 6c 79 29  ile accordingly)
104d0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
104e0 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20  ager is running 
104f0 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
10500 65 20 61 6e 64 20 69 73 20 69 6e 20 50 41 47 45  e and is in PAGE
10510 52 5f 53 59 4e 43 45 44 20 73 74 61 74 65 2c 0a  R_SYNCED state,.
10520 2a 2a 20 69 74 20 6d 6f 76 65 73 20 74 6f 20 50  ** it moves to P
10530 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 2e 20  AGER_EXCLUSIVE. 
10540 4e 6f 20 6c 6f 63 6b 73 20 61 72 65 20 64 6f 77  No locks are dow
10550 6e 67 72 61 64 65 64 20 77 68 65 6e 20 72 75 6e  ngraded when run
10560 6e 69 6e 67 20 69 6e 0a 2a 2a 20 65 78 63 6c 75  ning in.** exclu
10570 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a  sive mode..**.**
10580 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
10590 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72 72  turned if no err
105a0 6f 72 20 6f 63 63 75 72 73 2e 20 49 66 20 61 6e  or occurs. If an
105b0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
105c0 72 69 6e 67 0a 2a 2a 20 61 6e 79 20 6f 66 20 74  ring.** any of t
105d0 68 65 20 49 4f 20 6f 70 65 72 61 74 69 6f 6e 73  he IO operations
105e0 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65   to finalize the
105f0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72   journal file or
10600 20 75 6e 6c 6f 63 6b 20 74 68 65 0a 2a 2a 20 64   unlock the.** d
10610 61 74 61 62 61 73 65 20 74 68 65 6e 20 74 68 65  atabase then the
10620 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
10630 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68  s returned to th
10640 65 20 75 73 65 72 2e 20 49 66 20 74 68 65 20 0a  e user. If the .
10650 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20  ** operation to 
10660 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75  finalize the jou
10670 72 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c 73 2c  rnal file fails,
10680 20 74 68 65 6e 20 74 68 65 20 63 6f 64 65 20 73   then the code s
10690 74 69 6c 6c 0a 2a 2a 20 74 72 69 65 73 20 74 6f  till.** tries to
106a0 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61   unlock the data
106b0 62 61 73 65 20 66 69 6c 65 20 69 66 20 6e 6f 74  base file if not
106c0 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
106d0 64 65 2e 20 49 66 20 74 68 65 0a 2a 2a 20 75 6e  de. If the.** un
106e0 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20 66  lock operation f
106f0 61 69 6c 73 20 61 73 20 77 65 6c 6c 2c 20 74 68  ails as well, th
10700 65 6e 20 74 68 65 20 66 69 72 73 74 20 65 72 72  en the first err
10710 6f 72 20 63 6f 64 65 20 72 65 6c 61 74 65 64 0a  or code related.
10720 2a 2a 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ** to the first 
10730 65 72 72 6f 72 20 65 6e 63 6f 75 6e 74 65 72 65  error encountere
10740 64 20 28 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  d (the journal f
10750 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 6e 65 29  inalization one)
10760 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e   is.** returned.
10770 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
10780 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
10790 74 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61 67  tion(Pager *pPag
107a0 65 72 2c 20 69 6e 74 20 68 61 73 4d 61 73 74 65  er, int hasMaste
107b0 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
107c0 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f  QLITE_OK;      /
107d0 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 66 72 6f  * Error code fro
107e0 6d 20 6a 6f 75 72 6e 61 6c 20 66 69 6e 61 6c 69  m journal finali
107f0 7a 61 74 69 6f 6e 20 6f 70 65 72 61 74 69 6f 6e  zation operation
10800 20 2a 2f 0a 20 20 69 6e 74 20 72 63 32 20 3d 20   */.  int rc2 = 
10810 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 2f  SQLITE_OK;     /
10820 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 66 72 6f  * Error code fro
10830 6d 20 64 62 20 66 69 6c 65 20 75 6e 6c 6f 63 6b  m db file unlock
10840 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a 20   operation */.. 
10850 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 69   /* Do nothing i
10860 66 20 74 68 65 20 70 61 67 65 72 20 64 6f 65 73  f the pager does
10870 20 6e 6f 74 20 68 61 76 65 20 61 6e 20 6f 70 65   not have an ope
10880 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  n write transact
10890 69 6f 6e 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  ion. */.  assert
108a0 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
108b0 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
108c0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
108d0 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
108e0 45 52 52 4f 52 20 29 3b 0a 20 20 69 66 28 20 70  ERROR );.  if( p
108f0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3c 50 41  Pager->eState<PA
10900 47 45 52 5f 57 52 49 54 45 52 5f 49 4e 49 54 49  GER_WRITER_INITI
10910 41 4c 20 26 26 20 70 50 61 67 65 72 2d 3e 65 4c  AL && pPager->eL
10920 6f 63 6b 3c 52 45 53 45 52 56 45 44 5f 4c 4f 43  ock<RESERVED_LOC
10930 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
10940 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
10950 20 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65    releaseAllSave
10960 70 6f 69 6e 74 73 28 70 50 61 67 65 72 29 3b 0a  points(pPager);.
10970 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
10980 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c  (pPager->jfd) ||
10990 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
109a0 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  nal==0 );.  if( 
109b0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
109c0 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  fd) ){.    asser
109d0 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  t( !pagerUseWal(
109e0 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 20 20  pPager) );..    
109f0 2f 2a 20 46 69 6e 61 6c 69 7a 65 20 74 68 65 20  /* Finalize the 
10a00 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f  journal file. */
10a10 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
10a20 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70 50 61  IsMemJournal(pPa
10a30 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20  ger->jfd) ){.   
10a40 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
10a50 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
10a60 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
10a70 45 5f 4d 45 4d 4f 52 59 20 29 3b 0a 20 20 20 20  E_MEMORY );.    
10a80 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
10a90 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  (pPager->jfd);. 
10aa0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61     }else if( pPa
10ab0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
10ac0 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
10ad0 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 29 7b 0a  ODE_TRUNCATE ){.
10ae0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
10af0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20  ->journalOff==0 
10b00 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
10b10 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
10b20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
10b30 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72  rc = sqlite3OsTr
10b40 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a  uncate(pPager->j
10b50 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  fd, 0);.      }.
10b60 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
10b70 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20  urnalOff = 0;.  
10b80 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67    }else if( pPag
10b90 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
10ba0 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
10bb0 44 45 5f 50 45 52 53 49 53 54 0a 20 20 20 20 20  DE_PERSIST.     
10bc0 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 78 63   || (pPager->exc
10bd0 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20 70 50  lusiveMode && pP
10be0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
10bf0 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e!=PAGER_JOURNAL
10c00 4d 4f 44 45 5f 57 41 4c 29 0a 20 20 20 20 29 7b  MODE_WAL).    ){
10c10 0a 20 20 20 20 20 20 72 63 20 3d 20 7a 65 72 6f  .      rc = zero
10c20 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
10c30 72 2c 20 68 61 73 4d 61 73 74 65 72 29 3b 0a 20  r, hasMaster);. 
10c40 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
10c50 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20  rnalOff = 0;.   
10c60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
10c70 20 54 68 69 73 20 62 72 61 6e 63 68 20 6d 61 79   This branch may
10c80 20 62 65 20 65 78 65 63 75 74 65 64 20 77 69 74   be executed wit
10c90 68 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d  h Pager.journalM
10ca0 6f 64 65 3d 3d 4d 45 4d 4f 52 59 20 69 66 0a 20  ode==MEMORY if. 
10cb0 20 20 20 20 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f       ** a hot-jo
10cc0 75 72 6e 61 6c 20 77 61 73 20 6a 75 73 74 20 72  urnal was just r
10cd0 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 49 6e 20 74  olled back. In t
10ce0 68 69 73 20 63 61 73 65 20 74 68 65 20 6a 6f 75  his case the jou
10cf0 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20 66 69  rnal.      ** fi
10d00 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 63 6c 6f  le should be clo
10d10 73 65 64 20 61 6e 64 20 64 65 6c 65 74 65 64 2e  sed and deleted.
10d20 20 49 66 20 74 68 69 73 20 63 6f 6e 6e 65 63 74   If this connect
10d30 69 6f 6e 20 77 72 69 74 65 73 20 74 6f 0a 20 20  ion writes to.  
10d40 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62      ** the datab
10d50 61 73 65 20 66 69 6c 65 2c 20 69 74 20 77 69 6c  ase file, it wil
10d60 6c 20 64 6f 20 73 6f 20 75 73 69 6e 67 20 61 6e  l do so using an
10d70 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e   in-memory journ
10d80 61 6c 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20  al. .      */.  
10d90 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
10da0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
10db0 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
10dc0 44 45 5f 44 45 4c 45 54 45 20 0a 20 20 20 20 20  DE_DELETE .     
10dd0 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d        || pPager-
10de0 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
10df0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
10e00 4d 45 4d 4f 52 59 20 0a 20 20 20 20 20 20 20 20  MEMORY .        
10e10 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f     || pPager->jo
10e20 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
10e30 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
10e40 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20   .      );.     
10e50 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
10e60 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
10e70 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
10e80 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20  >tempFile ){.   
10e90 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
10ea0 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72  3OsDelete(pPager
10eb0 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  ->pVfs, pPager->
10ec0 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20  zJournal, 0);.  
10ed0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 23 69 66      }.    }..#if
10ee0 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  def SQLITE_CHECK
10ef0 5f 50 41 47 45 53 0a 20 20 20 20 73 71 6c 69 74  _PAGES.    sqlit
10f00 65 33 50 63 61 63 68 65 49 74 65 72 61 74 65 44  e3PcacheIterateD
10f10 69 72 74 79 28 70 50 61 67 65 72 2d 3e 70 50 43  irty(pPager->pPC
10f20 61 63 68 65 2c 20 70 61 67 65 72 5f 73 65 74 5f  ache, pager_set_
10f30 70 61 67 65 68 61 73 68 29 3b 0a 23 65 6e 64 69  pagehash);.#endi
10f40 66 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  f.  }.  sqlite3B
10f50 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61  itvecDestroy(pPa
10f60 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29  ger->pInJournal)
10f70 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  ;.  pPager->pInJ
10f80 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 70 50  ournal = 0;.  pP
10f90 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a  ager->nRec = 0;.
10fa0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43    sqlite3PcacheC
10fb0 6c 65 61 6e 41 6c 6c 28 70 50 61 67 65 72 2d 3e  leanAll(pPager->
10fc0 70 50 43 61 63 68 65 29 3b 0a 20 20 73 71 6c 69  pPCache);.  sqli
10fd0 74 65 33 50 63 61 63 68 65 54 72 75 6e 63 61 74  te3PcacheTruncat
10fe0 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  e(pPager->pPCach
10ff0 65 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  e, pPager->dbSiz
11000 65 29 3b 0a 0a 20 20 69 66 28 20 70 61 67 65 72  e);..  if( pager
11010 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
11020 7b 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68  {.    /* Drop th
11030 65 20 57 41 4c 20 77 72 69 74 65 2d 6c 6f 63 6b  e WAL write-lock
11040 2c 20 69 66 20 61 6e 79 2e 20 41 6c 73 6f 2c 20  , if any. Also, 
11050 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  if the connectio
11060 6e 20 77 61 73 20 69 6e 20 0a 20 20 20 20 2a 2a  n was in .    **
11070 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78   locking_mode=ex
11080 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 62 75 74  clusive mode but
11090 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 2c 20 64   is no longer, d
110a0 72 6f 70 20 74 68 65 20 45 58 43 4c 55 53 49 56  rop the EXCLUSIV
110b0 45 20 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 68  E .    ** lock h
110c0 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62  eld on the datab
110d0 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f  ase file..    */
110e0 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74  .    rc2 = sqlit
110f0 65 33 57 61 6c 45 6e 64 57 72 69 74 65 54 72 61  e3WalEndWriteTra
11100 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d  nsaction(pPager-
11110 3e 70 57 61 6c 29 3b 0a 20 20 20 20 61 73 73 65  >pWal);.    asse
11120 72 74 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f  rt( rc2==SQLITE_
11130 4f 4b 20 29 3b 0a 20 20 20 20 69 66 28 20 21 70  OK );.    if( !p
11140 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
11150 4d 6f 64 65 20 26 26 20 73 71 6c 69 74 65 33 57  Mode && sqlite3W
11160 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64 65 28  alExclusiveMode(
11170 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 30 29  pPager->pWal, 0)
11180 20 29 7b 0a 20 20 20 20 20 20 72 63 32 20 3d 20   ){.      rc2 = 
11190 6f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2c  osUnlock(pPager,
111a0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20   SHARED_LOCK);. 
111b0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
111c0 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   !pPager->exclus
111d0 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 72  iveMode ){.    r
111e0 63 32 20 3d 20 6f 73 55 6e 6c 6f 63 6b 28 70 50  c2 = osUnlock(pP
111f0 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43  ager, SHARED_LOC
11200 4b 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  K);.    pPager->
11210 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
11220 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  = 0;.  }.  pPage
11230 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45  r->eState = PAGE
11240 52 5f 52 45 41 44 45 52 3b 0a 20 20 70 50 61 67  R_READER;.  pPag
11250 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20  er->setMaster = 
11260 30 3b 0a 0a 20 20 72 65 74 75 72 6e 20 28 72 63  0;..  return (rc
11270 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f 72 63 32 3a  ==SQLITE_OK?rc2:
11280 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78  rc);.}../*.** Ex
11290 65 63 75 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b  ecute a rollback
112a0 20 69 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   if a transactio
112b0 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e 64 20  n is active and 
112c0 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 2a 2a 20 64  unlock the .** d
112d0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 2a  atabase file. .*
112e0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
112f0 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 65 6e  r has already en
11300 74 65 72 65 64 20 74 68 65 20 65 72 72 6f 72 20  tered the error 
11310 73 74 61 74 65 2c 20 64 6f 20 6e 6f 74 20 61 74  state, do not at
11320 74 65 6d 70 74 20 0a 2a 2a 20 74 68 65 20 72 6f  tempt .** the ro
11330 6c 6c 62 61 63 6b 20 61 74 20 74 68 69 73 20 74  llback at this t
11340 69 6d 65 2e 20 49 6e 73 74 65 61 64 2c 20 70 61  ime. Instead, pa
11350 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 69 73 20  ger_unlock() is 
11360 63 61 6c 6c 65 64 2e 20 54 68 65 0a 2a 2a 20 63  called. The.** c
11370 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c  all to pager_unl
11380 6f 63 6b 28 29 20 77 69 6c 6c 20 64 69 73 63 61  ock() will disca
11390 72 64 20 61 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79  rd all in-memory
113a0 20 70 61 67 65 73 2c 20 75 6e 6c 6f 63 6b 0a 2a   pages, unlock.*
113b0 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
113c0 69 6c 65 20 61 6e 64 20 63 6c 65 61 72 20 74 68  ile and clear th
113d0 65 20 65 72 72 6f 72 20 73 74 61 74 65 2e 20 49  e error state. I
113e0 66 20 74 68 69 73 20 6d 65 61 6e 73 20 74 68 61  f this means tha
113f0 74 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 61 20  t.** there is a 
11400 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 6c 65 66 74  hot-journal left
11410 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73   in the file-sys
11420 74 65 6d 2c 20 74 68 65 20 6e 65 78 74 20 63 6f  tem, the next co
11430 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 74 6f 20 6f  nnection.** to o
11440 62 74 61 69 6e 20 61 20 73 68 61 72 65 64 20 6c  btain a shared l
11450 6f 63 6b 20 6f 6e 20 74 68 65 20 70 61 67 65 72  ock on the pager
11460 20 28 77 68 69 63 68 20 6d 61 79 20 62 65 20 74   (which may be t
11470 68 69 73 20 6f 6e 65 29 20 77 69 6c 6c 0a 2a 2a  his one) will.**
11480 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 0a 2a   roll it back..*
11490 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
114a0 72 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61 64  r has not alread
114b0 79 20 65 6e 74 65 72 65 64 20 74 68 65 20 65 72  y entered the er
114c0 72 6f 72 20 73 74 61 74 65 2c 20 62 75 74 20 61  ror state, but a
114d0 6e 20 49 4f 20 6f 72 0a 2a 2a 20 6d 61 6c 6c 6f  n IO or.** mallo
114e0 63 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  c error occurs d
114f0 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b  uring a rollback
11500 2c 20 74 68 65 6e 20 74 68 69 73 20 77 69 6c 6c  , then this will
11510 20 69 74 73 65 6c 66 20 63 61 75 73 65 20 0a 2a   itself cause .*
11520 2a 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 65  * the pager to e
11530 6e 74 65 72 20 74 68 65 20 65 72 72 6f 72 20 73  nter the error s
11540 74 61 74 65 2e 20 57 68 69 63 68 20 77 69 6c 6c  tate. Which will
11550 20 62 65 20 63 6c 65 61 72 65 64 20 62 79 20 74   be cleared by t
11560 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 70 61  he.** call to pa
11570 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 2c 20 61 73  ger_unlock(), as
11580 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65   described above
11590 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
115a0 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52   pagerUnlockAndR
115b0 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70  ollback(Pager *p
115c0 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50  Pager){.  if( pP
115d0 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
115e0 47 45 52 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20  GER_ERROR ){.   
115f0 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
11600 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
11610 65 72 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  er) );.    if( p
11620 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
11630 41 47 45 52 5f 57 52 49 54 45 52 5f 49 4e 49 54  AGER_WRITER_INIT
11640 49 41 4c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  IAL ){.      sql
11650 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d  ite3BeginBenignM
11660 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 73  alloc();.      s
11670 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
11680 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ack(pPager);.   
11690 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e     sqlite3EndBen
116a0 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
116b0 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65   }else if( pPage
116c0 72 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56  r->eLock>=RESERV
116d0 45 44 5f 4c 4f 43 4b 20 26 26 20 21 70 50 61 67  ED_LOCK && !pPag
116e0 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
116f0 65 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72  e ){.      pager
11700 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
11710 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20  (pPager, 0);.   
11720 20 7d 0a 20 20 7d 0a 20 20 70 61 67 65 72 5f 75   }.  }.  pager_u
11730 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 7d  nlock(pPager);.}
11740 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65  ../*.** Paramete
11750 72 20 61 44 61 74 61 20 6d 75 73 74 20 70 6f 69  r aData must poi
11760 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 6f  nt to a buffer o
11770 66 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  f pPager->pageSi
11780 7a 65 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64  ze bytes.** of d
11790 61 74 61 2e 20 43 6f 6d 70 75 74 65 20 61 6e 64  ata. Compute and
117a0 20 72 65 74 75 72 6e 20 61 20 63 68 65 63 6b 73   return a checks
117b0 75 6d 20 62 61 73 65 64 20 6f 6e 74 20 74 68 65  um based ont the
117c0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
117d0 20 0a 2a 2a 20 70 61 67 65 20 6f 66 20 64 61 74   .** page of dat
117e0 61 20 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e  a and the curren
117f0 74 20 76 61 6c 75 65 20 6f 66 20 70 50 61 67 65  t value of pPage
11800 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 2e 0a 2a 2a  r->cksumInit..**
11810 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20  .** This is not 
11820 61 20 72 65 61 6c 20 63 68 65 63 6b 73 75 6d 2e  a real checksum.
11830 20 49 74 20 69 73 20 72 65 61 6c 6c 79 20 6a 75   It is really ju
11840 73 74 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68  st the sum of th
11850 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69 6e 69  e .** random ini
11860 74 69 61 6c 20 76 61 6c 75 65 20 28 70 50 61 67  tial value (pPag
11870 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 20 61  er->cksumInit) a
11880 6e 64 20 65 76 65 72 79 20 32 30 30 74 68 20 62  nd every 200th b
11890 79 74 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61  yte.** of the pa
118a0 67 65 20 64 61 74 61 2c 20 73 74 61 72 74 69 6e  ge data, startin
118b0 67 20 77 69 74 68 20 62 79 74 65 20 6f 66 66 73  g with byte offs
118c0 65 74 20 28 70 50 61 67 65 72 2d 3e 70 61 67 65  et (pPager->page
118d0 53 69 7a 65 25 32 30 30 29 2e 0a 2a 2a 20 45 61  Size%200)..** Ea
118e0 63 68 20 62 79 74 65 20 69 73 20 69 6e 74 65 72  ch byte is inter
118f0 70 72 65 74 65 64 20 61 73 20 61 6e 20 38 2d 62  preted as an 8-b
11900 69 74 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 65  it unsigned inte
11910 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67  ger..**.** Chang
11920 69 6e 67 20 74 68 65 20 66 6f 72 6d 75 6c 61 20  ing the formula 
11930 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20  used to compute 
11940 74 68 69 73 20 63 68 65 63 6b 73 75 6d 20 72 65  this checksum re
11950 73 75 6c 74 73 20 69 6e 20 61 6e 0a 2a 2a 20 69  sults in an.** i
11960 6e 63 6f 6d 70 61 74 69 62 6c 65 20 6a 6f 75 72  ncompatible jour
11970 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e  nal file format.
11980 0a 2a 2a 0a 2a 2a 20 49 66 20 6a 6f 75 72 6e 61  .**.** If journa
11990 6c 20 63 6f 72 72 75 70 74 69 6f 6e 20 6f 63 63  l corruption occ
119a0 75 72 73 20 64 75 65 20 74 6f 20 61 20 70 6f 77  urs due to a pow
119b0 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20  er failure, the 
119c0 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 0a 2a 2a 20  most likely .** 
119d0 73 63 65 6e 61 72 69 6f 20 69 73 20 74 68 61 74  scenario is that
119e0 20 6f 6e 65 20 65 6e 64 20 6f 72 20 74 68 65 20   one end or the 
119f0 6f 74 68 65 72 20 6f 66 20 74 68 65 20 72 65 63  other of the rec
11a00 6f 72 64 20 77 69 6c 6c 20 62 65 20 63 68 61 6e  ord will be chan
11a10 67 65 64 2e 20 0a 2a 2a 20 49 74 20 69 73 20 6d  ged. .** It is m
11a20 75 63 68 20 6c 65 73 73 20 6c 69 6b 65 6c 79 20  uch less likely 
11a30 74 68 61 74 20 74 68 65 20 74 77 6f 20 65 6e 64  that the two end
11a40 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s of the journal
11a50 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 0a   record will be.
11a60 2a 2a 20 63 6f 72 72 65 63 74 20 61 6e 64 20 74  ** correct and t
11a70 68 65 20 6d 69 64 64 6c 65 20 62 65 20 63 6f 72  he middle be cor
11a80 72 75 70 74 2e 20 20 54 68 75 73 2c 20 74 68 69  rupt.  Thus, thi
11a90 73 20 22 63 68 65 63 6b 73 75 6d 22 20 73 63 68  s "checksum" sch
11aa0 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75 67 68 20 66  eme,.** though f
11ab0 61 73 74 20 61 6e 64 20 73 69 6d 70 6c 65 2c 20  ast and simple, 
11ac0 63 61 74 63 68 65 73 20 74 68 65 20 6d 6f 73 74  catches the most
11ad0 6c 79 20 6c 69 6b 65 6c 79 20 6b 69 6e 64 20 6f  ly likely kind o
11ae0 66 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f  f corruption..*/
11af0 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67 65  .static u32 page
11b00 72 5f 63 6b 73 75 6d 28 50 61 67 65 72 20 2a 70  r_cksum(Pager *p
11b10 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 75 38 20  Pager, const u8 
11b20 2a 61 44 61 74 61 29 7b 0a 20 20 75 33 32 20 63  *aData){.  u32 c
11b30 6b 73 75 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63  ksum = pPager->c
11b40 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20 20 20 20  ksumInit;       
11b50 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 76 61    /* Checksum va
11b60 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  lue to return */
11b70 0a 20 20 69 6e 74 20 69 20 3d 20 70 50 61 67 65  .  int i = pPage
11b80 72 2d 3e 70 61 67 65 53 69 7a 65 2d 32 30 30 3b  r->pageSize-200;
11b90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
11ba0 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 77  p counter */.  w
11bb0 68 69 6c 65 28 20 69 3e 30 20 29 7b 0a 20 20 20  hile( i>0 ){.   
11bc0 20 63 6b 73 75 6d 20 2b 3d 20 61 44 61 74 61 5b   cksum += aData[
11bd0 69 5d 3b 0a 20 20 20 20 69 20 2d 3d 20 32 30 30  i];.    i -= 200
11be0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63  ;.  }.  return c
11bf0 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ksum;.}../*.** R
11c00 65 70 6f 72 74 20 74 68 65 20 63 75 72 72 65 6e  eport the curren
11c10 74 20 70 61 67 65 20 73 69 7a 65 20 61 6e 64 20  t page size and 
11c20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76  number of reserv
11c30 65 64 20 62 79 74 65 73 20 62 61 63 6b 0a 2a 2a  ed bytes back.**
11c40 20 74 6f 20 74 68 65 20 63 6f 64 65 63 2e 0a 2a   to the codec..*
11c50 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
11c60 48 41 53 5f 43 4f 44 45 43 0a 73 74 61 74 69 63  HAS_CODEC.static
11c70 20 76 6f 69 64 20 70 61 67 65 72 52 65 70 6f 72   void pagerRepor
11c80 74 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61  tSize(Pager *pPa
11c90 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67  ger){.  if( pPag
11ca0 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65 43 68  er->xCodecSizeCh
11cb0 6e 67 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  ng ){.    pPager
11cc0 2d 3e 78 43 6f 64 65 63 53 69 7a 65 43 68 6e 67  ->xCodecSizeChng
11cd0 28 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 2c  (pPager->pCodec,
11ce0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
11cf0 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
11d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69                (i
11d10 6e 74 29 70 50 61 67 65 72 2d 3e 6e 52 65 73 65  nt)pPager->nRese
11d20 72 76 65 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73  rve);.  }.}.#els
11d30 65 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72  e.# define pager
11d40 52 65 70 6f 72 74 53 69 7a 65 28 58 29 20 20 20  ReportSize(X)   
11d50 20 20 2f 2a 20 4e 6f 2d 6f 70 20 69 66 20 77 65    /* No-op if we
11d60 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74 20   do not support 
11d70 61 20 63 6f 64 65 63 20 2a 2f 0a 23 65 6e 64 69  a codec */.#endi
11d80 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20  f../*.** Read a 
11d90 73 69 6e 67 6c 65 20 70 61 67 65 20 66 72 6f 6d  single page from
11da0 20 65 69 74 68 65 72 20 74 68 65 20 6a 6f 75 72   either the jour
11db0 6e 61 6c 20 66 69 6c 65 20 28 69 66 20 69 73 4d  nal file (if isM
11dc0 61 69 6e 4a 72 6e 6c 3d 3d 31 29 20 6f 72 0a 2a  ainJrnl==1) or.*
11dd0 2a 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a  * from the sub-j
11de0 6f 75 72 6e 61 6c 20 28 69 66 20 69 73 4d 61 69  ournal (if isMai
11df0 6e 4a 72 6e 6c 3d 3d 30 29 20 61 6e 64 20 70 6c  nJrnl==0) and pl
11e00 61 79 62 61 63 6b 20 74 68 61 74 20 70 61 67 65  ayback that page
11e10 2e 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 62 65  ..** The page be
11e20 67 69 6e 73 20 61 74 20 6f 66 66 73 65 74 20 2a  gins at offset *
11e30 70 4f 66 66 73 65 74 20 69 6e 74 6f 20 74 68 65  pOffset into the
11e40 20 66 69 6c 65 2e 20 54 68 65 20 2a 70 4f 66 66   file. The *pOff
11e50 73 65 74 0a 2a 2a 20 76 61 6c 75 65 20 69 73 20  set.** value is 
11e60 69 6e 63 72 65 61 73 65 64 20 74 6f 20 74 68 65  increased to the
11e70 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6e 65   start of the ne
11e80 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6a  xt page in the j
11e90 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68  ournal..**.** Th
11ea0 65 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 66 6c 61  e isMainJrnl fla
11eb0 67 20 69 73 20 74 72 75 65 20 69 66 20 74 68 69  g is true if thi
11ec0 73 20 69 73 20 74 68 65 20 6d 61 69 6e 20 72 6f  s is the main ro
11ed0 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61  llback journal a
11ee0 6e 64 0a 2a 2a 20 66 61 6c 73 65 20 66 6f 72 20  nd.** false for 
11ef0 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
11f00 75 72 6e 61 6c 2e 20 20 54 68 65 20 6d 61 69 6e  urnal.  The main
11f10 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
11f20 6c 20 75 73 65 73 0a 2a 2a 20 63 68 65 63 6b 73  l uses.** checks
11f30 75 6d 73 20 2d 20 74 68 65 20 73 74 61 74 65 6d  ums - the statem
11f40 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73  ent journal does
11f50 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74   not..**.** If t
11f60 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
11f70 66 20 74 68 65 20 70 61 67 65 20 72 65 63 6f 72  f the page recor
11f80 64 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  d read from the 
11f90 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69  (sub-)journal fi
11fa0 6c 65 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72  le.** is greater
11fb0 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e   than the curren
11fc0 74 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72  t value of Pager
11fd0 2e 64 62 53 69 7a 65 2c 20 74 68 65 6e 20 70 6c  .dbSize, then pl
11fe0 61 79 62 61 63 6b 20 69 73 0a 2a 2a 20 73 6b 69  ayback is.** ski
11ff0 70 70 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f  pped and SQLITE_
12000 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  OK is returned..
12010 2a 2a 0a 2a 2a 20 49 66 20 70 44 6f 6e 65 20 69  **.** If pDone i
12020 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e  s not NULL, then
12030 20 69 74 20 69 73 20 61 20 72 65 63 6f 72 64 20   it is a record 
12040 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 68 61  of pages that ha
12050 76 65 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65  ve already.** be
12060 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20  en played back. 
12070 20 49 66 20 74 68 65 20 70 61 67 65 20 61 74 20   If the page at 
12080 2a 70 4f 66 66 73 65 74 20 68 61 73 20 61 6c 72  *pOffset has alr
12090 65 61 64 79 20 62 65 65 6e 20 70 6c 61 79 65 64  eady been played
120a0 20 62 61 63 6b 0a 2a 2a 20 28 69 66 20 74 68 65   back.** (if the
120b0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 70   corresponding p
120c0 44 6f 6e 65 20 62 69 74 20 69 73 20 73 65 74 29  Done bit is set)
120d0 20 74 68 65 6e 20 73 6b 69 70 20 74 68 65 20 70   then skip the p
120e0 6c 61 79 62 61 63 6b 2e 0a 2a 2a 20 4d 61 6b 65  layback..** Make
120f0 20 73 75 72 65 20 74 68 65 20 70 44 6f 6e 65 20   sure the pDone 
12100 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  bit correspondin
12110 67 20 74 6f 20 74 68 65 20 2a 70 4f 66 66 73 65  g to the *pOffse
12120 74 20 70 61 67 65 20 69 73 20 73 65 74 0a 2a 2a  t page is set.**
12130 20 70 72 69 6f 72 20 74 6f 20 72 65 74 75 72 6e   prior to return
12140 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ing..**.** If th
12150 65 20 70 61 67 65 20 72 65 63 6f 72 64 20 69 73  e page record is
12160 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 72 65   successfully re
12170 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62  ad from the (sub
12180 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  -)journal file.*
12190 2a 20 61 6e 64 20 70 6c 61 79 65 64 20 62 61 63  * and played bac
121a0 6b 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f  k, then SQLITE_O
121b0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  K is returned. I
121c0 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
121d0 63 75 72 73 0a 2a 2a 20 77 68 69 6c 65 20 72 65  curs.** while re
121e0 61 64 69 6e 67 20 74 68 65 20 72 65 63 6f 72 64  ading the record
121f0 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29   from the (sub-)
12200 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20  journal file or 
12210 77 68 69 6c 65 20 77 72 69 74 69 6e 67 0a 2a 2a  while writing.**
12220 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
12230 20 66 69 6c 65 2c 20 74 68 65 6e 20 74 68 65 20   file, then the 
12240 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
12250 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 64 61   returned. If da
12260 74 61 0a 2a 2a 20 69 73 20 73 75 63 63 65 73 73  ta.** is success
12270 66 75 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20  fully read from 
12280 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61  the (sub-)journa
12290 6c 20 66 69 6c 65 20 62 75 74 20 61 70 70 65 61  l file but appea
122a0 72 73 20 74 6f 20 62 65 0a 2a 2a 20 63 6f 72 72  rs to be.** corr
122b0 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f  upted, SQLITE_DO
122c0 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  NE is returned. 
122d0 44 61 74 61 20 69 73 20 63 6f 6e 73 69 64 65 72  Data is consider
122e0 65 64 20 63 6f 72 72 75 70 74 65 64 20 69 6e 0a  ed corrupted in.
122f0 2a 2a 20 74 77 6f 20 63 69 72 63 75 6d 73 74 61  ** two circumsta
12300 6e 63 65 73 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 2a  nces:.** .**   *
12310 20 49 66 20 74 68 65 20 72 65 63 6f 72 64 20 70   If the record p
12320 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 69 6c  age-number is il
12330 6c 65 67 61 6c 20 28 30 20 6f 72 20 50 41 47 45  legal (0 or PAGE
12340 52 5f 4d 4a 5f 50 47 4e 4f 29 2c 20 6f 72 0a 2a  R_MJ_PGNO), or.*
12350 2a 20 20 20 2a 20 49 66 20 74 68 65 20 72 65 63  *   * If the rec
12360 6f 72 64 20 69 73 20 62 65 69 6e 67 20 72 6f 6c  ord is being rol
12370 6c 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68  led back from th
12380 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66  e main journal f
12390 69 6c 65 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74  ile.**     and t
123a0 68 65 20 63 68 65 63 6b 73 75 6d 20 66 69 65 6c  he checksum fiel
123b0 64 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  d does not match
123c0 20 74 68 65 20 72 65 63 6f 72 64 20 63 6f 6e 74   the record cont
123d0 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 65 69 74 68  ent..**.** Neith
123e0 65 72 20 6f 66 20 74 68 65 73 65 20 74 77 6f 20  er of these two 
123f0 73 63 65 6e 61 72 69 6f 73 20 61 72 65 20 70 6f  scenarios are po
12400 73 73 69 62 6c 65 20 64 75 72 69 6e 67 20 61 20  ssible during a 
12410 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61  savepoint rollba
12420 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69  ck..**.** If thi
12430 73 20 69 73 20 61 20 73 61 76 65 70 6f 69 6e 74  s is a savepoint
12440 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20   rollback, then 
12450 6d 65 6d 6f 72 79 20 6d 61 79 20 68 61 76 65 20  memory may have 
12460 74 6f 20 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c  to be dynamicall
12470 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 62  y.** allocated b
12480 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
12490 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
124a0 63 61 73 65 20 61 6e 64 20 61 6e 20 61 6c 6c 6f  case and an allo
124b0 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 0a 2a 2a  cation fails,.**
124c0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73   SQLITE_NOMEM is
124d0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
124e0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70  atic int pager_p
124f0 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
12500 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
12510 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
12520 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 62    /* The pager b
12530 65 69 6e 67 20 70 6c 61 79 65 64 20 62 61 63 6b  eing played back
12540 20 2a 2f 0a 20 20 69 36 34 20 2a 70 4f 66 66 73   */.  i64 *pOffs
12550 65 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  et,             
12560 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66      /* Offset of
12570 20 72 65 63 6f 72 64 20 74 6f 20 70 6c 61 79 62   record to playb
12580 61 63 6b 20 2a 2f 0a 20 20 42 69 74 76 65 63 20  ack */.  Bitvec 
12590 2a 70 44 6f 6e 65 2c 20 20 20 20 20 20 20 20 20  *pDone,         
125a0 20 20 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63         /* Bitvec
125b0 20 6f 66 20 70 61 67 65 73 20 61 6c 72 65 61 64   of pages alread
125c0 79 20 70 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f  y played back */
125d0 0a 20 20 69 6e 74 20 69 73 4d 61 69 6e 4a 72 6e  .  int isMainJrn
125e0 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
125f0 20 2f 2a 20 31 20 2d 3e 20 6d 61 69 6e 20 6a 6f   /* 1 -> main jo
12600 75 72 6e 61 6c 2e 20 30 20 2d 3e 20 73 75 62 2d  urnal. 0 -> sub-
12610 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 69 6e  journal. */.  in
12620 74 20 69 73 53 61 76 65 70 6e 74 20 20 20 20 20  t isSavepnt     
12630 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
12640 72 75 65 20 66 6f 72 20 61 20 73 61 76 65 70 6f  rue for a savepo
12650 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a  int rollback */.
12660 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50  ){.  int rc;.  P
12670 67 48 64 72 20 2a 70 50 67 3b 20 20 20 20 20 20  gHdr *pPg;      
12680 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12690 41 6e 20 65 78 69 73 74 69 6e 67 20 70 61 67 65  An existing page
126a0 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 2a 2f   in the cache */
126b0 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20  .  Pgno pgno;   
126c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
126d0 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d   /* The page num
126e0 62 65 72 20 6f 66 20 61 20 70 61 67 65 20 69 6e  ber of a page in
126f0 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33   journal */.  u3
12700 32 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20  2 cksum;        
12710 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
12720 68 65 63 6b 73 75 6d 20 75 73 65 64 20 66 6f 72  hecksum used for
12730 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   sanity checking
12740 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 44 61 74   */.  char *aDat
12750 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a;              
12760 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79      /* Temporary
12770 20 73 74 6f 72 61 67 65 20 66 6f 72 20 74 68 65   storage for the
12780 20 70 61 67 65 20 2a 2f 0a 20 20 73 71 6c 69 74   page */.  sqlit
12790 65 33 5f 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20  e3_file *jfd;   
127a0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
127b0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
127c0 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  for the journal 
127d0 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73  file */.  int is
127e0 53 79 6e 63 65 64 3b 20 20 20 20 20 20 20 20 20  Synced;         
127f0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
12800 69 66 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20  if journal page 
12810 69 73 20 73 79 6e 63 65 64 20 2a 2f 0a 0a 20 20  is synced */..  
12820 61 73 73 65 72 74 28 20 28 69 73 4d 61 69 6e 4a  assert( (isMainJ
12830 72 6e 6c 26 7e 31 29 3d 3d 30 20 29 3b 20 20 20  rnl&~1)==0 );   
12840 20 20 20 2f 2a 20 69 73 4d 61 69 6e 4a 72 6e 6c     /* isMainJrnl
12850 20 69 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20   is 0 or 1 */.  
12860 61 73 73 65 72 74 28 20 28 69 73 53 61 76 65 70  assert( (isSavep
12870 6e 74 26 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20  nt&~1)==0 );    
12880 20 20 20 2f 2a 20 69 73 53 61 76 65 70 6e 74 20     /* isSavepnt 
12890 69 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61  is 0 or 1 */.  a
128a0 73 73 65 72 74 28 20 69 73 4d 61 69 6e 4a 72 6e  ssert( isMainJrn
128b0 6c 20 7c 7c 20 70 44 6f 6e 65 20 29 3b 20 20 20  l || pDone );   
128c0 20 20 2f 2a 20 70 44 6f 6e 65 20 61 6c 77 61 79    /* pDone alway
128d0 73 20 75 73 65 64 20 6f 6e 20 73 75 62 2d 6a 6f  s used on sub-jo
128e0 75 72 6e 61 6c 73 20 2a 2f 0a 20 20 61 73 73 65  urnals */.  asse
128f0 72 74 28 20 69 73 53 61 76 65 70 6e 74 20 7c 7c  rt( isSavepnt ||
12900 20 70 44 6f 6e 65 3d 3d 30 20 29 3b 20 20 20 2f   pDone==0 );   /
12910 2a 20 70 44 6f 6e 65 20 6e 65 76 65 72 20 75 73  * pDone never us
12920 65 64 20 6f 6e 20 6e 6f 6e 2d 73 61 76 65 70 6f  ed on non-savepo
12930 69 6e 74 20 2a 2f 0a 0a 20 20 61 44 61 74 61 20  int */..  aData 
12940 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  = pPager->pTmpSp
12950 61 63 65 3b 0a 20 20 61 73 73 65 72 74 28 20 61  ace;.  assert( a
12960 44 61 74 61 20 29 3b 20 20 20 20 20 20 20 20 20  Data );         
12970 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20  /* Temp storage 
12980 6d 75 73 74 20 68 61 76 65 20 61 6c 72 65 61 64  must have alread
12990 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  y been allocated
129a0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 61   */.  assert( pa
129b0 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
129c0 29 3d 3d 30 20 7c 7c 20 28 21 69 73 4d 61 69 6e  )==0 || (!isMain
129d0 4a 72 6e 6c 20 26 26 20 69 73 53 61 76 65 70 6e  Jrnl && isSavepn
129e0 74 29 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 64  t) );..  /* Read
129f0 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
12a00 20 61 6e 64 20 70 61 67 65 20 64 61 74 61 20 66   and page data f
12a10 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
12a20 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 20  or sub-journal. 
12a30 20 2a 2a 20 66 69 6c 65 2e 20 52 65 74 75 72 6e   ** file. Return
12a40 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 74   an error code t
12a50 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 69 66 20  o the caller if 
12a60 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
12a70 72 73 2e 0a 20 20 2a 2f 0a 20 20 6a 66 64 20 3d  rs..  */.  jfd =
12a80 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 3f 20 70 50   isMainJrnl ? pP
12a90 61 67 65 72 2d 3e 6a 66 64 20 3a 20 70 50 61 67  ager->jfd : pPag
12aa0 65 72 2d 3e 73 6a 66 64 3b 0a 20 20 72 63 20 3d  er->sjfd;.  rc =
12ab0 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c   read32bits(jfd,
12ac0 20 2a 70 4f 66 66 73 65 74 2c 20 26 70 67 6e 6f   *pOffset, &pgno
12ad0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
12ae0 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
12af0 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  rc;.  rc = sqlit
12b00 65 33 4f 73 52 65 61 64 28 6a 66 64 2c 20 28 75  e3OsRead(jfd, (u
12b10 38 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65 72  8*)aData, pPager
12b20 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 2a 70 4f  ->pageSize, (*pO
12b30 66 66 73 65 74 29 2b 34 29 3b 0a 20 20 69 66 28  ffset)+4);.  if(
12b40 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
12b50 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70   return rc;.  *p
12b60 4f 66 66 73 65 74 20 2b 3d 20 70 50 61 67 65 72  Offset += pPager
12b70 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 34 20 2b  ->pageSize + 4 +
12b80 20 69 73 4d 61 69 6e 4a 72 6e 6c 2a 34 3b 0a 0a   isMainJrnl*4;..
12b90 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63    /* Sanity chec
12ba0 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65  king on the page
12bb0 2e 20 20 54 68 69 73 20 69 73 20 6d 6f 72 65 20  .  This is more 
12bc0 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 49  important that I
12bd0 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a   originally.  **
12be0 20 74 68 6f 75 67 68 74 2e 20 20 49 66 20 61 20   thought.  If a 
12bf0 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63  power failure oc
12c00 63 75 72 73 20 77 68 69 6c 65 20 74 68 65 20 6a  curs while the j
12c10 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 20  ournal is being 
12c20 77 72 69 74 74 65 6e 2c 0a 20 20 2a 2a 20 69 74  written,.  ** it
12c30 20 63 6f 75 6c 64 20 63 61 75 73 65 20 69 6e 76   could cause inv
12c40 61 6c 69 64 20 64 61 74 61 20 74 6f 20 62 65 20  alid data to be 
12c50 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
12c60 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 65 20 6e 65   journal.  We ne
12c70 65 64 20 74 6f 0a 20 20 2a 2a 20 64 65 74 65 63  ed to.  ** detec
12c80 74 20 74 68 69 73 20 69 6e 76 61 6c 69 64 20 64  t this invalid d
12c90 61 74 61 20 28 77 69 74 68 20 68 69 67 68 20 70  ata (with high p
12ca0 72 6f 62 61 62 69 6c 69 74 79 29 20 61 6e 64 20  robability) and 
12cb0 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20 2a 2f 0a  ignore it..  */.
12cc0 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c    if( pgno==0 ||
12cd0 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f   pgno==PAGER_MJ_
12ce0 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a  PGNO(pPager) ){.
12cf0 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73 53      assert( !isS
12d00 61 76 65 70 6e 74 20 29 3b 0a 20 20 20 20 72 65  avepnt );.    re
12d10 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
12d20 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f  ;.  }.  if( pgno
12d30 3e 28 50 67 6e 6f 29 70 50 61 67 65 72 2d 3e 64  >(Pgno)pPager->d
12d40 62 53 69 7a 65 20 7c 7c 20 73 71 6c 69 74 65 33  bSize || sqlite3
12d50 42 69 74 76 65 63 54 65 73 74 28 70 44 6f 6e 65  BitvecTest(pDone
12d60 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20 72  , pgno) ){.    r
12d70 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
12d80 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4d 61 69  .  }.  if( isMai
12d90 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 72 63 20  nJrnl ){.    rc 
12da0 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64  = read32bits(jfd
12db0 2c 20 28 2a 70 4f 66 66 73 65 74 29 2d 34 2c 20  , (*pOffset)-4, 
12dc0 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66 28  &cksum);.    if(
12dd0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
12de0 0a 20 20 20 20 69 66 28 20 21 69 73 53 61 76 65  .    if( !isSave
12df0 70 6e 74 20 26 26 20 70 61 67 65 72 5f 63 6b 73  pnt && pager_cks
12e00 75 6d 28 70 50 61 67 65 72 2c 20 28 75 38 2a 29  um(pPager, (u8*)
12e10 61 44 61 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b  aData)!=cksum ){
12e20 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
12e30 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d  LITE_DONE;.    }
12e40 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
12e50 69 73 20 70 61 67 65 20 68 61 73 20 61 6c 72 65  is page has alre
12e60 61 64 79 20 62 65 65 6e 20 70 6c 61 79 65 64 20  ady been played 
12e70 62 79 20 62 65 66 6f 72 65 20 64 75 72 69 6e 67  by before during
12e80 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20 2a   the current.  *
12e90 2a 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e  * rollback, then
12ea0 20 64 6f 6e 27 74 20 62 6f 74 68 65 72 20 74 6f   don't bother to
12eb0 20 70 6c 61 79 20 69 74 20 62 61 63 6b 20 61 67   play it back ag
12ec0 61 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ain..  */.  if( 
12ed0 70 44 6f 6e 65 20 26 26 20 28 72 63 20 3d 20 73  pDone && (rc = s
12ee0 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28  qlite3BitvecSet(
12ef0 70 44 6f 6e 65 2c 20 70 67 6e 6f 29 29 21 3d 53  pDone, pgno))!=S
12f00 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
12f10 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
12f20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
12f30 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57  >eState>=PAGER_W
12f40 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 29  RITER_CACHEMOD )
12f50 3b 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 70 6c 61  ;..  /* When pla
12f60 79 69 6e 67 20 62 61 63 6b 20 70 61 67 65 20 31  ying back page 1
12f70 2c 20 72 65 73 74 6f 72 65 20 74 68 65 20 6e 52  , restore the nR
12f80 65 73 65 72 76 65 20 73 65 74 74 69 6e 67 0a 20  eserve setting. 
12f90 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d   */.  if( pgno==
12fa0 31 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 52 65  1 && pPager->nRe
12fb0 73 65 72 76 65 21 3d 28 28 75 38 2a 29 61 44 61  serve!=((u8*)aDa
12fc0 74 61 29 5b 32 30 5d 20 29 7b 0a 20 20 20 20 70  ta)[20] ){.    p
12fd0 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 20  Pager->nReserve 
12fe0 3d 20 28 28 75 38 2a 29 61 44 61 74 61 29 5b 32  = ((u8*)aData)[2
12ff0 30 5d 3b 0a 20 20 20 20 70 61 67 65 72 52 65 70  0];.    pagerRep
13000 6f 72 74 53 69 7a 65 28 70 50 61 67 65 72 29 3b  ortSize(pPager);
13010 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
13020 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 52 45  e pager is in RE
13030 53 45 52 56 45 44 20 73 74 61 74 65 2c 20 74 68  SERVED state, th
13040 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65  en there must be
13050 20 61 20 63 6f 70 79 20 6f 66 20 74 68 69 73 0a   a copy of this.
13060 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65    ** page in the
13070 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 49 6e   pager cache. In
13080 20 74 68 69 73 20 63 61 73 65 20 6a 75 73 74 20   this case just 
13090 75 70 64 61 74 65 20 74 68 65 20 70 61 67 65 72  update the pager
130a0 20 63 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74   cache,.  ** not
130b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
130c0 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20  le. The page is 
130d0 6c 65 66 74 20 6d 61 72 6b 65 64 20 64 69 72 74  left marked dirt
130e0 79 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  y in this case..
130f0 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 65 78 63    **.  ** An exc
13100 65 70 74 69 6f 6e 20 74 6f 20 74 68 65 20 61 62  eption to the ab
13110 6f 76 65 20 72 75 6c 65 3a 20 49 66 20 74 68 65  ove rule: If the
13120 20 64 61 74 61 62 61 73 65 20 69 73 20 69 6e 20   database is in 
13130 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 0a 20 20 2a  no-sync mode.  *
13140 2a 20 61 6e 64 20 61 20 70 61 67 65 20 69 73 20  * and a page is 
13150 6d 6f 76 65 64 20 64 75 72 69 6e 67 20 61 6e 20  moved during an 
13160 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75  incremental vacu
13170 75 6d 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  um then the page
13180 20 6d 61 79 0a 20 20 2a 2a 20 6e 6f 74 20 62 65   may.  ** not be
13190 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61   in the pager ca
131a0 63 68 65 2e 20 4c 61 74 65 72 3a 20 69 66 20 61  che. Later: if a
131b0 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20   malloc() or IO 
131c0 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 20 20 2a  error occurs.  *
131d0 2a 20 64 75 72 69 6e 67 20 61 20 4d 6f 76 65 70  * during a Movep
131e0 61 67 65 28 29 20 63 61 6c 6c 2c 20 74 68 65 6e  age() call, then
131f0 20 74 68 65 20 70 61 67 65 20 6d 61 79 20 6e 6f   the page may no
13200 74 20 62 65 20 69 6e 20 74 68 65 20 63 61 63 68  t be in the cach
13210 65 0a 20 20 2a 2a 20 65 69 74 68 65 72 2e 20 53  e.  ** either. S
13220 6f 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20  o the condition 
13230 64 65 73 63 72 69 62 65 64 20 69 6e 20 74 68 65  described in the
13240 20 61 62 6f 76 65 20 70 61 72 61 67 72 61 70 68   above paragraph
13250 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 73 73   is not.  ** ass
13260 65 72 74 28 29 61 62 6c 65 2e 0a 20 20 2a 2a 0a  ert()able..  **.
13270 20 20 2a 2a 20 49 66 20 69 6e 20 45 58 43 4c 55    ** If in EXCLU
13280 53 49 56 45 20 73 74 61 74 65 2c 20 74 68 65 6e  SIVE state, then
13290 20 77 65 20 75 70 64 61 74 65 20 74 68 65 20 70   we update the p
132a0 61 67 65 72 20 63 61 63 68 65 20 69 66 20 69 74  ager cache if it
132b0 20 65 78 69 73 74 73 0a 20 20 2a 2a 20 61 6e 64   exists.  ** and
132c0 20 74 68 65 20 6d 61 69 6e 20 66 69 6c 65 2e 20   the main file. 
132d0 54 68 65 20 70 61 67 65 20 69 73 20 74 68 65 6e  The page is then
132e0 20 6d 61 72 6b 65 64 20 6e 6f 74 20 64 69 72 74   marked not dirt
132f0 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 69 63  y..  **.  ** Tic
13300 6b 65 74 20 23 31 31 37 31 3a 20 20 54 68 65 20  ket #1171:  The 
13310 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
13320 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20  l might contain 
13330 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 68 61  page content tha
13340 74 20 69 73 0a 20 20 2a 2a 20 64 69 66 66 65 72  t is.  ** differ
13350 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 70 61 67  ent from the pag
13360 65 20 63 6f 6e 74 65 6e 74 20 61 74 20 74 68 65  e content at the
13370 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72   start of the tr
13380 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20  ansaction..  ** 
13390 54 68 69 73 20 6f 63 63 75 72 73 20 77 68 65 6e  This occurs when
133a0 20 61 20 70 61 67 65 20 69 73 20 63 68 61 6e 67   a page is chang
133b0 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
133c0 73 74 61 72 74 20 6f 66 20 61 20 73 74 61 74 65  start of a state
133d0 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 65 6e 20 63  ment.  ** then c
133e0 68 61 6e 67 65 64 20 61 67 61 69 6e 20 77 69 74  hanged again wit
133f0 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e  hin the statemen
13400 74 2e 20 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67  t.  When rolling
13410 20 62 61 63 6b 20 73 75 63 68 20 61 0a 20 20 2a   back such a.  *
13420 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 65 20 6d  * statement we m
13430 75 73 74 20 6e 6f 74 20 77 72 69 74 65 20 74 6f  ust not write to
13440 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
13450 74 61 62 61 73 65 20 75 6e 6c 65 73 73 20 77 65  tabase unless we
13460 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72 20 63   know.  ** for c
13470 65 72 74 61 69 6e 20 74 68 61 74 20 6f 72 69 67  ertain that orig
13480 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e  inal page conten
13490 74 73 20 61 72 65 20 73 79 6e 63 65 64 20 69 6e  ts are synced in
134a0 74 6f 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c  to the main roll
134b0 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  back.  ** journa
134c0 6c 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20 61  l.  Otherwise, a
134d0 20 70 6f 77 65 72 20 6c 6f 73 73 20 6d 69 67 68   power loss migh
134e0 74 20 6c 65 61 76 65 20 6d 6f 64 69 66 69 65 64  t leave modified
134f0 20 64 61 74 61 20 69 6e 20 74 68 65 0a 20 20 2a   data in the.  *
13500 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  * database file 
13510 77 69 74 68 6f 75 74 20 61 6e 20 65 6e 74 72 79  without an entry
13520 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   in the rollback
13530 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20 63 61   journal that ca
13540 6e 0a 20 20 2a 2a 20 72 65 73 74 6f 72 65 20 74  n.  ** restore t
13550 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 69  he database to i
13560 74 73 20 6f 72 69 67 69 6e 61 6c 20 66 6f 72 6d  ts original form
13570 2e 20 20 54 77 6f 20 63 6f 6e 64 69 74 69 6f 6e  .  Two condition
13580 73 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6d  s must be.  ** m
13590 65 74 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e  et before writin
135a0 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
135b0 65 20 66 69 6c 65 73 2e 20 28 31 29 20 74 68 65  e files. (1) the
135c0 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62   database must b
135d0 65 0a 20 20 2a 2a 20 6c 6f 63 6b 65 64 2e 20 20  e.  ** locked.  
135e0 28 32 29 20 77 65 20 6b 6e 6f 77 20 74 68 61 74  (2) we know that
135f0 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61   the original pa
13600 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 66 75  ge content is fu
13610 6c 6c 79 20 73 79 6e 63 65 64 0a 20 20 2a 2a 20  lly synced.  ** 
13620 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  in the main jour
13630 6e 61 6c 20 65 69 74 68 65 72 20 62 65 63 61 75  nal either becau
13640 73 65 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  se the page is n
13650 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20 65  ot in cache or e
13660 6c 73 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67  lse.  ** the pag
13670 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 6e  e is marked as n
13680 65 65 64 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2a  eedSync==0..  **
13690 0a 20 20 2a 2a 20 32 30 30 38 2d 30 34 2d 31 34  .  ** 2008-04-14
136a0 3a 20 20 57 68 65 6e 20 61 74 74 65 6d 70 74 69  :  When attempti
136b0 6e 67 20 74 6f 20 76 61 63 75 75 6d 20 61 20 63  ng to vacuum a c
136c0 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20  orrupt database 
136d0 66 69 6c 65 2c 20 69 74 0a 20 20 2a 2a 20 69 73  file, it.  ** is
136e0 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 66 61 69   possible to fai
136f0 6c 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e  l a statement on
13700 20 61 20 64 61 74 61 62 61 73 65 20 74 68 61 74   a database that
13710 20 64 6f 65 73 20 6e 6f 74 20 79 65 74 20 65 78   does not yet ex
13720 69 73 74 2e 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74  ist..  ** Do not
13730 20 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74   attempt to writ
13740 65 20 69 66 20 64 61 74 61 62 61 73 65 20 66 69  e if database fi
13750 6c 65 20 68 61 73 20 6e 65 76 65 72 20 62 65 65  le has never bee
13760 6e 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20  n opened..  */. 
13770 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c   if( pagerUseWal
13780 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
13790 70 50 67 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  pPg = 0;.  }else
137a0 7b 0a 20 20 20 20 70 50 67 20 3d 20 70 61 67 65  {.    pPg = page
137b0 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c  r_lookup(pPager,
137c0 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 61 73   pgno);.  }.  as
137d0 73 65 72 74 28 20 70 50 67 20 7c 7c 20 21 4d 45  sert( pPg || !ME
137e0 4d 44 42 20 29 3b 0a 20 20 50 41 47 45 52 54 52  MDB );.  PAGERTR
137f0 41 43 45 28 28 22 50 4c 41 59 42 41 43 4b 20 25  ACE(("PLAYBACK %
13800 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28 25  d page %d hash(%
13810 30 38 78 29 20 25 73 5c 6e 22 2c 0a 20 20 20 20  08x) %s\n",.    
13820 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70         PAGERID(p
13830 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61  Pager), pgno, pa
13840 67 65 72 5f 64 61 74 61 68 61 73 68 28 70 50 61  ger_datahash(pPa
13850 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28  ger->pageSize, (
13860 75 38 2a 29 61 44 61 74 61 29 2c 0a 20 20 20 20  u8*)aData),.    
13870 20 20 20 20 20 20 20 28 69 73 4d 61 69 6e 4a 72         (isMainJr
13880 6e 6c 3f 22 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c  nl?"main-journal
13890 22 3a 22 73 75 62 2d 6a 6f 75 72 6e 61 6c 22 29  ":"sub-journal")
138a0 0a 20 20 29 29 3b 0a 20 20 69 66 28 20 69 73 4d  .  ));.  if( isM
138b0 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 69  ainJrnl ){.    i
138c0 73 53 79 6e 63 65 64 20 3d 20 70 50 61 67 65 72  sSynced = pPager
138d0 2d 3e 6e 6f 53 79 6e 63 20 7c 7c 20 28 2a 70 4f  ->noSync || (*pO
138e0 66 66 73 65 74 20 3c 3d 20 70 50 61 67 65 72 2d  ffset <= pPager-
138f0 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 3b 0a 20 20  >journalHdr);.  
13900 7d 65 6c 73 65 7b 0a 20 20 20 20 69 73 53 79 6e  }else{.    isSyn
13910 63 65 64 20 3d 20 28 70 50 67 3d 3d 30 20 7c 7c  ced = (pPg==0 ||
13920 20 30 3d 3d 28 70 50 67 2d 3e 66 6c 61 67 73 20   0==(pPg->flags 
13930 26 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  & PGHDR_NEED_SYN
13940 43 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28  C));.  }.  if( (
13950 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
13960 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d  PAGER_WRITER_DBM
13970 4f 44 29 0a 20 20 20 26 26 20 69 73 4f 70 65 6e  OD).   && isOpen
13980 28 70 50 61 67 65 72 2d 3e 66 64 29 0a 20 20 20  (pPager->fd).   
13990 26 26 20 69 73 53 79 6e 63 65 64 0a 20 20 29 7b  && isSynced.  ){
139a0 0a 20 20 20 20 69 36 34 20 6f 66 73 74 20 3d 20  .    i64 ofst = 
139b0 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50  (pgno-1)*(i64)pP
139c0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
139d0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 21 69      testcase( !i
139e0 73 53 61 76 65 70 6e 74 20 26 26 20 70 50 67 21  sSavepnt && pPg!
139f0 3d 30 20 26 26 20 28 70 50 67 2d 3e 66 6c 61 67  =0 && (pPg->flag
13a00 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
13a10 43 29 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  C)!=0 );.    ass
13a20 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
13a30 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  l(pPager) );.   
13a40 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
13a50 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  rite(pPager->fd,
13a60 20 28 75 38 2a 29 61 44 61 74 61 2c 20 70 50 61   (u8*)aData, pPa
13a70 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f  ger->pageSize, o
13a80 66 73 74 29 3b 0a 20 20 20 20 69 66 28 20 70 67  fst);.    if( pg
13a90 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  no>pPager->dbFil
13aa0 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70  eSize ){.      p
13ab0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
13ac0 65 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 7d 0a  e = pgno;.    }.
13ad0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
13ae0 70 42 61 63 6b 75 70 20 29 7b 0a 20 20 20 20 20  pBackup ){.     
13af0 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20   CODEC1(pPager, 
13b00 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20  aData, pgno, 3, 
13b10 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29  rc=SQLITE_NOMEM)
13b20 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  ;.      sqlite3B
13b30 61 63 6b 75 70 55 70 64 61 74 65 28 70 50 61 67  ackupUpdate(pPag
13b40 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e  er->pBackup, pgn
13b50 6f 2c 20 28 75 38 2a 29 61 44 61 74 61 29 3b 0a  o, (u8*)aData);.
13b60 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50 61        CODEC2(pPa
13b70 67 65 72 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f  ger, aData, pgno
13b80 2c 20 37 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e  , 7, rc=SQLITE_N
13b90 4f 4d 45 4d 2c 20 61 44 61 74 61 29 3b 0a 20 20  OMEM, aData);.  
13ba0 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
13bb0 21 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 70  !isMainJrnl && p
13bc0 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  Pg==0 ){.    /* 
13bd0 49 66 20 74 68 69 73 20 69 73 20 61 20 72 6f 6c  If this is a rol
13be0 6c 62 61 63 6b 20 6f 66 20 61 20 73 61 76 65 70  lback of a savep
13bf0 6f 69 6e 74 20 61 6e 64 20 64 61 74 61 20 77 61  oint and data wa
13c00 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f  s not written to
13c10 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61  .    ** the data
13c20 62 61 73 65 20 61 6e 64 20 74 68 65 20 70 61 67  base and the pag
13c30 65 20 69 73 20 6e 6f 74 20 69 6e 2d 6d 65 6d 6f  e is not in-memo
13c40 72 79 2c 20 74 68 65 72 65 20 69 73 20 61 20 70  ry, there is a p
13c50 6f 74 65 6e 74 69 61 6c 0a 20 20 20 20 2a 2a 20  otential.    ** 
13c60 70 72 6f 62 6c 65 6d 2e 20 57 68 65 6e 20 74 68  problem. When th
13c70 65 20 70 61 67 65 20 69 73 20 6e 65 78 74 20 66  e page is next f
13c80 65 74 63 68 65 64 20 62 79 20 74 68 65 20 62 2d  etched by the b-
13c90 74 72 65 65 20 6c 61 79 65 72 2c 20 69 74 20 0a  tree layer, it .
13ca0 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 72      ** will be r
13cb0 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ead from the dat
13cc0 61 62 61 73 65 20 66 69 6c 65 2c 20 77 68 69 63  abase file, whic
13cd0 68 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74  h may or may not
13ce0 20 62 65 20 0a 20 20 20 20 2a 2a 20 63 75 72 72   be .    ** curr
13cf0 65 6e 74 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20  ent. .    **.   
13d00 20 2a 2a 20 54 68 65 72 65 20 61 72 65 20 61 20   ** There are a 
13d10 63 6f 75 70 6c 65 20 6f 66 20 64 69 66 66 65 72  couple of differ
13d20 65 6e 74 20 77 61 79 73 20 74 68 69 73 20 63 61  ent ways this ca
13d30 6e 20 68 61 70 70 65 6e 2e 20 41 6c 6c 20 61 72  n happen. All ar
13d40 65 20 71 75 69 74 65 0a 20 20 20 20 2a 2a 20 6f  e quite.    ** o
13d50 62 73 63 75 72 65 2e 20 57 68 65 6e 20 72 75 6e  bscure. When run
13d60 6e 69 6e 67 20 69 6e 20 73 79 6e 63 68 72 6f 6e  ning in synchron
13d70 6f 75 73 20 6d 6f 64 65 2c 20 74 68 69 73 20 63  ous mode, this c
13d80 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 0a  an only happen .
13d90 20 20 20 20 2a 2a 20 69 66 20 74 68 65 20 70 61      ** if the pa
13da0 67 65 20 69 73 20 6f 6e 20 74 68 65 20 66 72 65  ge is on the fre
13db0 65 2d 6c 69 73 74 20 61 74 20 74 68 65 20 73 74  e-list at the st
13dc0 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73  art of the trans
13dd0 61 63 74 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20  action, then.   
13de0 20 2a 2a 20 70 6f 70 75 6c 61 74 65 64 2c 20 74   ** populated, t
13df0 68 65 6e 20 6d 6f 76 65 64 20 75 73 69 6e 67 20  hen moved using 
13e00 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65  sqlite3PagerMove
13e10 70 61 67 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20  page()..    **. 
13e20 20 20 20 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69     ** The soluti
13e30 6f 6e 20 69 73 20 74 6f 20 61 64 64 20 61 6e 20  on is to add an 
13e40 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 74  in-memory page t
13e50 6f 20 74 68 65 20 63 61 63 68 65 20 63 6f 6e 74  o the cache cont
13e60 61 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68  aining.    ** th
13e70 65 20 64 61 74 61 20 6a 75 73 74 20 72 65 61 64  e data just read
13e80 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f   from the sub-jo
13e90 75 72 6e 61 6c 2e 20 4d 61 72 6b 20 74 68 65 20  urnal. Mark the 
13ea0 70 61 67 65 20 61 73 20 64 69 72 74 79 20 0a 20  page as dirty . 
13eb0 20 20 20 2a 2a 20 61 6e 64 20 69 66 20 74 68 65     ** and if the
13ec0 20 70 61 67 65 72 20 72 65 71 75 69 72 65 73 20   pager requires 
13ed0 61 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63 2c 20  a journal-sync, 
13ee0 74 68 65 6e 20 6d 61 72 6b 20 74 68 65 20 70 61  then mark the pa
13ef0 67 65 20 61 73 20 0a 20 20 20 20 2a 2a 20 72 65  ge as .    ** re
13f00 71 75 69 72 69 6e 67 20 61 20 6a 6f 75 72 6e 61  quiring a journa
13f10 6c 2d 73 79 6e 63 20 62 65 66 6f 72 65 20 69 74  l-sync before it
13f20 20 69 73 20 77 72 69 74 74 65 6e 2e 0a 20 20 20   is written..   
13f30 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
13f40 69 73 53 61 76 65 70 6e 74 20 29 3b 0a 20 20 20  isSavepnt );.   
13f50 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
13f60 3e 64 6f 4e 6f 74 53 70 69 6c 6c 3d 3d 30 20 29  >doNotSpill==0 )
13f70 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f  ;.    pPager->do
13f80 4e 6f 74 53 70 69 6c 6c 2b 2b 3b 0a 20 20 20 20  NotSpill++;.    
13f90 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
13fa0 72 41 63 71 75 69 72 65 28 70 50 61 67 65 72 2c  rAcquire(pPager,
13fb0 20 70 67 6e 6f 2c 20 26 70 50 67 2c 20 31 29 3b   pgno, &pPg, 1);
13fc0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
13fd0 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 3d  ger->doNotSpill=
13fe0 3d 31 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  =1 );.    pPager
13ff0 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 2d 2d 3b 0a  ->doNotSpill--;.
14000 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
14010 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
14020 63 3b 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61 67  c;.    pPg->flag
14030 73 20 26 3d 20 7e 50 47 48 44 52 5f 4e 45 45 44  s &= ~PGHDR_NEED
14040 5f 52 45 41 44 3b 0a 20 20 20 20 73 71 6c 69 74  _READ;.    sqlit
14050 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74  e3PcacheMakeDirt
14060 79 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 69 66  y(pPg);.  }.  if
14070 28 20 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a 20  ( pPg ){.    /* 
14080 4e 6f 20 70 61 67 65 20 73 68 6f 75 6c 64 20 65  No page should e
14090 76 65 72 20 62 65 20 65 78 70 6c 69 63 69 74 6c  ver be explicitl
140a0 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68  y rolled back th
140b0 61 74 20 69 73 20 69 6e 20 75 73 65 2c 20 65 78  at is in use, ex
140c0 63 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20  cept.    ** for 
140d0 70 61 67 65 20 31 20 77 68 69 63 68 20 69 73 20  page 1 which is 
140e0 68 65 6c 64 20 69 6e 20 75 73 65 20 69 6e 20 6f  held in use in o
140f0 72 64 65 72 20 74 6f 20 6b 65 65 70 20 74 68 65  rder to keep the
14100 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20   lock on the.   
14110 20 2a 2a 20 64 61 74 61 62 61 73 65 20 61 63 74   ** database act
14120 69 76 65 2e 20 48 6f 77 65 76 65 72 20 73 75 63  ive. However suc
14130 68 20 61 20 70 61 67 65 20 6d 61 79 20 62 65 20  h a page may be 
14140 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61  rolled back as a
14150 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 6f   result.    ** o
14160 66 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65 72  f an internal er
14170 72 6f 72 20 72 65 73 75 6c 74 69 6e 67 20 69 6e  ror resulting in
14180 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 63 61   an automatic ca
14190 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c  ll to.    ** sql
141a0 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63  ite3PagerRollbac
141b0 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  k()..    */.    
141c0 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20 20 20  void *pData;.   
141d0 20 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44   pData = pPg->pD
141e0 61 74 61 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  ata;.    memcpy(
141f0 70 44 61 74 61 2c 20 28 75 38 2a 29 61 44 61 74  pData, (u8*)aDat
14200 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
14210 69 7a 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72  ize);.    pPager
14220 2d 3e 78 52 65 69 6e 69 74 65 72 28 70 50 67 29  ->xReiniter(pPg)
14230 3b 0a 20 20 20 20 69 66 28 20 69 73 4d 61 69 6e  ;.    if( isMain
14240 4a 72 6e 6c 20 26 26 20 28 21 69 73 53 61 76 65  Jrnl && (!isSave
14250 70 6e 74 20 7c 7c 20 2a 70 4f 66 66 73 65 74 3c  pnt || *pOffset<
14260 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
14270 48 64 72 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Hdr) ){.      /*
14280 20 49 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 73   If the contents
14290 20 6f 66 20 74 68 69 73 20 70 61 67 65 20 77 65   of this page we
142a0 72 65 20 6a 75 73 74 20 72 65 73 74 6f 72 65 64  re just restored
142b0 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 0a   from the main .
142c0 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c        ** journal
142d0 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 73 20   file, then its 
142e0 63 6f 6e 74 65 6e 74 20 6d 75 73 74 20 62 65 20  content must be 
142f0 61 73 20 74 68 65 79 20 77 65 72 65 20 77 68 65  as they were whe
14300 6e 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  n the .      ** 
14310 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
14320 66 69 72 73 74 20 6f 70 65 6e 65 64 2e 20 49 6e  first opened. In
14330 20 74 68 69 73 20 63 61 73 65 20 77 65 20 63 61   this case we ca
14340 6e 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 0a  n mark the page.
14350 20 20 20 20 20 20 2a 2a 20 61 73 20 63 6c 65 61        ** as clea
14360 6e 2c 20 73 69 6e 63 65 20 74 68 65 72 65 20 77  n, since there w
14370 69 6c 6c 20 62 65 20 6e 6f 20 6e 65 65 64 20 74  ill be no need t
14380 6f 20 77 72 69 74 65 20 69 74 20 6f 75 74 20 74  o write it out t
14390 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64  o the.      ** d
143a0 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20 2a  atabase..      *
143b0 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65  *.      ** There
143c0 20 69 73 20 6f 6e 65 20 65 78 63 65 70 74 69 6f   is one exceptio
143d0 6e 20 74 6f 20 74 68 69 73 20 72 75 6c 65 2e 20  n to this rule. 
143e0 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20 62  If the page is b
143f0 65 69 6e 67 20 72 6f 6c 6c 65 64 0a 20 20 20 20  eing rolled.    
14400 20 20 2a 2a 20 62 61 63 6b 20 61 73 20 70 61 72    ** back as par
14410 74 20 6f 66 20 61 20 73 61 76 65 70 6f 69 6e 74  t of a savepoint
14420 20 28 6f 72 20 73 74 61 74 65 6d 65 6e 74 29 20   (or statement) 
14430 72 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 61 6e  rollback from an
14440 20 0a 20 20 20 20 20 20 2a 2a 20 75 6e 73 79 6e   .      ** unsyn
14450 63 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74  ced portion of t
14460 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
14470 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 69 73  file, then it is
14480 20 6e 6f 74 20 73 61 66 65 0a 20 20 20 20 20 20   not safe.      
14490 2a 2a 20 74 6f 20 6d 61 72 6b 20 74 68 65 20 70  ** to mark the p
144a0 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 20 54 68  age as clean. Th
144b0 69 73 20 69 73 20 62 65 63 61 75 73 65 20 6d 61  is is because ma
144c0 72 6b 69 6e 67 20 74 68 65 20 70 61 67 65 20 61  rking the page a
144d0 73 0a 20 20 20 20 20 20 2a 2a 20 63 6c 65 61 6e  s.      ** clean
144e0 20 77 69 6c 6c 20 63 6c 65 61 72 20 74 68 65 20   will clear the 
144f0 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
14500 66 6c 61 67 2e 20 53 69 6e 63 65 20 74 68 65 20  flag. Since the 
14510 70 61 67 65 20 69 73 0a 20 20 20 20 20 20 2a 2a  page is.      **
14520 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
14530 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 72 65  journal file (re
14540 63 6f 72 64 65 64 20 69 6e 20 50 61 67 65 72 2e  corded in Pager.
14550 70 49 6e 4a 6f 75 72 6e 61 6c 29 20 61 6e 64 0a  pInJournal) and.
14560 20 20 20 20 20 20 2a 2a 20 74 68 65 20 50 47 48        ** the PGH
14570 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61  DR_NEED_SYNC fla
14580 67 20 69 73 20 63 6c 65 61 72 65 64 2c 20 69 66  g is cleared, if
14590 20 74 68 65 20 70 61 67 65 20 69 73 20 77 72 69   the page is wri
145a0 74 74 65 6e 20 74 6f 0a 20 20 20 20 20 20 2a 2a  tten to.      **
145b0 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68   again within th
145c0 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  is transaction, 
145d0 69 74 20 77 69 6c 6c 20 62 65 20 6d 61 72 6b 65  it will be marke
145e0 64 20 61 73 20 64 69 72 74 79 20 62 75 74 0a 20  d as dirty but. 
145f0 20 20 20 20 20 2a 2a 20 74 68 65 20 50 47 48 44       ** the PGHD
14600 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67  R_NEED_SYNC flag
14610 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 73 65 74   will not be set
14620 2e 20 49 74 20 63 6f 75 6c 64 20 74 68 65 6e 20  . It could then 
14630 70 6f 74 65 6e 74 69 61 6c 6c 79 0a 20 20 20 20  potentially.    
14640 20 20 2a 2a 20 62 65 20 77 72 69 74 74 65 6e 20    ** be written 
14650 6f 75 74 20 69 6e 74 6f 20 74 68 65 20 64 61 74  out into the dat
14660 61 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72  abase file befor
14670 65 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69  e its journal fi
14680 6c 65 0a 20 20 20 20 20 20 2a 2a 20 73 65 67 6d  le.      ** segm
14690 65 6e 74 20 69 73 20 73 79 6e 63 65 64 2e 20 49  ent is synced. I
146a0 66 20 61 20 63 72 61 73 68 20 6f 63 63 75 72 73  f a crash occurs
146b0 20 64 75 72 69 6e 67 20 6f 72 20 66 6f 6c 6c 6f   during or follo
146c0 77 69 6e 67 20 74 68 69 73 2c 0a 20 20 20 20 20  wing this,.     
146d0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 72   ** database cor
146e0 72 75 70 74 69 6f 6e 20 6d 61 79 20 65 6e 73 75  ruption may ensu
146f0 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
14700 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72    assert( !pager
14710 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
14720 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  ;.      sqlite3P
14730 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70  cacheMakeClean(p
14740 50 67 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65  Pg);.    }.#ifde
14750 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
14760 41 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61  AGES.    pPg->pa
14770 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70  geHash = pager_p
14780 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65  agehash(pPg);.#e
14790 6e 64 69 66 0a 20 20 20 20 2f 2a 20 49 66 20 74  ndif.    /* If t
147a0 68 69 73 20 77 61 73 20 70 61 67 65 20 31 2c 20  his was page 1, 
147b0 74 68 65 6e 20 72 65 73 74 6f 72 65 20 74 68 65  then restore the
147c0 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e   value of Pager.
147d0 64 62 46 69 6c 65 56 65 72 73 2e 0a 20 20 20 20  dbFileVers..    
147e0 2a 2a 20 44 6f 20 74 68 69 73 20 62 65 66 6f 72  ** Do this befor
147f0 65 20 61 6e 79 20 64 65 63 6f 64 69 6e 67 2e 20  e any decoding. 
14800 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3d  */.    if( pgno=
14810 3d 31 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  =1 ){.      memc
14820 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69  py(&pPager->dbFi
14830 6c 65 56 65 72 73 2c 20 26 28 28 75 38 2a 29 70  leVers, &((u8*)p
14840 44 61 74 61 29 5b 32 34 5d 2c 73 69 7a 65 6f 66  Data)[24],sizeof
14850 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
14860 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ers));.    }..  
14870 20 20 2f 2a 20 44 65 63 6f 64 65 20 74 68 65 20    /* Decode the 
14880 70 61 67 65 20 6a 75 73 74 20 72 65 61 64 20 66  page just read f
14890 72 6f 6d 20 64 69 73 6b 20 2a 2f 0a 20 20 20 20  rom disk */.    
148a0 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 70  CODEC1(pPager, p
148b0 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  Data, pPg->pgno,
148c0 20 33 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f   3, rc=SQLITE_NO
148d0 4d 45 4d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  MEM);.    sqlite
148e0 33 50 63 61 63 68 65 52 65 6c 65 61 73 65 28 70  3PcacheRelease(p
148f0 50 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Pg);.  }.  retur
14900 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  n rc;.}../*.** P
14910 61 72 61 6d 65 74 65 72 20 7a 4d 61 73 74 65 72  arameter zMaster
14920 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
14930 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
14940 20 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65 20   file. A single 
14950 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20  journal.** file 
14960 74 68 61 74 20 72 65 66 65 72 72 65 64 20 74 6f  that referred to
14970 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
14980 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6a 75 73  nal file has jus
14990 74 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61  t been rolled ba
149a0 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ck..** This rout
149b0 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 69 74  ine checks if it
149c0 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
149d0 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
149e0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 0a  r journal file,.
149f0 2a 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f 20 69  ** and does so i
14a00 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 41  f it is..**.** A
14a10 72 67 75 6d 65 6e 74 20 7a 4d 61 73 74 65 72 20  rgument zMaster 
14a20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 50 61 67  may point to Pag
14a30 65 72 2e 70 54 6d 70 53 70 61 63 65 2e 20 53 6f  er.pTmpSpace. So
14a40 20 74 68 61 74 20 62 75 66 66 65 72 20 69 73 20   that buffer is 
14a50 6e 6f 74 20 0a 2a 2a 20 61 76 61 69 6c 61 62 6c  not .** availabl
14a60 65 20 66 6f 72 20 75 73 65 20 77 69 74 68 69 6e  e for use within
14a70 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
14a80 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 6d 61 73  **.** When a mas
14a90 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
14aa0 20 69 73 20 63 72 65 61 74 65 64 2c 20 69 74 20   is created, it 
14ab0 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  is populated wit
14ac0 68 20 74 68 65 20 6e 61 6d 65 73 20 0a 2a 2a 20  h the names .** 
14ad0 6f 66 20 61 6c 6c 20 6f 66 20 69 74 73 20 63 68  of all of its ch
14ae0 69 6c 64 20 6a 6f 75 72 6e 61 6c 73 2c 20 6f 6e  ild journals, on
14af0 65 20 61 66 74 65 72 20 61 6e 6f 74 68 65 72 2c  e after another,
14b00 20 66 6f 72 6d 61 74 74 65 64 20 61 73 20 75 74   formatted as ut
14b10 66 2d 38 20 0a 2a 2a 20 65 6e 63 6f 64 65 64 20  f-8 .** encoded 
14b20 74 65 78 74 2e 20 54 68 65 20 65 6e 64 20 6f 66  text. The end of
14b30 20 65 61 63 68 20 63 68 69 6c 64 20 6a 6f 75 72   each child jour
14b40 6e 61 6c 20 66 69 6c 65 20 69 73 20 6d 61 72 6b  nal file is mark
14b50 65 64 20 77 69 74 68 20 61 20 0a 2a 2a 20 6e 75  ed with a .** nu
14b60 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74  l-terminator byt
14b70 65 20 28 30 78 30 30 29 2e 20 69 2e 65 2e 20 74  e (0x00). i.e. t
14b80 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e  he entire conten
14b90 74 73 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a  ts of a master j
14ba0 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 66  ournal.** file f
14bb0 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  or a transaction
14bc0 20 69 6e 76 6f 6c 76 69 6e 67 20 74 77 6f 20 64   involving two d
14bd0 61 74 61 62 61 73 65 73 20 6d 69 67 68 74 20 62  atabases might b
14be0 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 2f 68 6f 6d  e:.**.**   "/hom
14bf0 65 2f 62 69 6c 6c 2f 61 2e 64 62 2d 6a 6f 75 72  e/bill/a.db-jour
14c00 6e 61 6c 5c 78 30 30 2f 68 6f 6d 65 2f 62 69 6c  nal\x00/home/bil
14c10 6c 2f 62 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78  l/b.db-journal\x
14c20 30 30 22 0a 2a 2a 0a 2a 2a 20 41 20 6d 61 73 74  00".**.** A mast
14c30 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
14c40 6d 61 79 20 6f 6e 6c 79 20 62 65 20 64 65 6c 65  may only be dele
14c50 74 65 64 20 6f 6e 63 65 20 61 6c 6c 20 6f 66 20  ted once all of 
14c60 69 74 73 20 63 68 69 6c 64 20 0a 2a 2a 20 6a 6f  its child .** jo
14c70 75 72 6e 61 6c 73 20 68 61 76 65 20 62 65 65 6e  urnals have been
14c80 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a   rolled back..**
14c90 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
14ca0 6e 20 72 65 61 64 73 20 74 68 65 20 63 6f 6e 74  n reads the cont
14cb0 65 6e 74 73 20 6f 66 20 74 68 65 20 6d 61 73 74  ents of the mast
14cc0 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er-journal file 
14cd0 69 6e 74 6f 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20  into .** memory 
14ce0 61 6e 64 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67  and loops throug
14cf0 68 20 65 61 63 68 20 6f 66 20 74 68 65 20 63 68  h each of the ch
14d00 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ild journal name
14d10 73 2e 20 46 6f 72 0a 2a 2a 20 65 61 63 68 20 63  s. For.** each c
14d20 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 2c 20 69 74  hild journal, it
14d30 20 63 68 65 63 6b 73 20 69 66 3a 0a 2a 2a 0a 2a   checks if:.**.*
14d40 2a 20 20 20 2a 20 69 66 20 74 68 65 20 63 68 69  *   * if the chi
14d50 6c 64 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74  ld journal exist
14d60 73 2c 20 61 6e 64 20 69 66 20 73 6f 0a 2a 2a 20  s, and if so.** 
14d70 20 20 2a 20 69 66 20 74 68 65 20 63 68 69 6c 64    * if the child
14d80 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e   journal contain
14d90 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  s a reference to
14da0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
14db0 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20 7a 4d 61  .**     file zMa
14dc0 73 74 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ster.**.** If a 
14dd0 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61  child journal ca
14de0 6e 20 62 65 20 66 6f 75 6e 64 20 74 68 61 74 20  n be found that 
14df0 6d 61 74 63 68 65 73 20 62 6f 74 68 20 6f 66 20  matches both of 
14e00 74 68 65 20 63 72 69 74 65 72 69 61 0a 2a 2a 20  the criteria.** 
14e10 61 62 6f 76 65 2c 20 74 68 69 73 20 66 75 6e 63  above, this func
14e20 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 74  tion returns wit
14e30 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68  hout doing anyth
14e40 69 6e 67 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ing. Otherwise, 
14e50 69 66 0a 2a 2a 20 6e 6f 20 73 75 63 68 20 63 68  if.** no such ch
14e60 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20  ild journal can 
14e70 62 65 20 66 6f 75 6e 64 2c 20 66 69 6c 65 20 7a  be found, file z
14e80 4d 61 73 74 65 72 20 69 73 20 64 65 6c 65 74 65  Master is delete
14e90 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 66 69  d from.** the fi
14ea0 6c 65 2d 73 79 73 74 65 6d 20 75 73 69 6e 67 20  le-system using 
14eb0 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
14ec0 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49  )..**.** If an I
14ed0 4f 20 65 72 72 6f 72 20 77 69 74 68 69 6e 20 74  O error within t
14ee0 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 6e  his function, an
14ef0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
14f00 65 74 75 72 6e 65 64 2e 20 54 68 69 73 0a 2a 2a  eturned. This.**
14f10 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61   function alloca
14f20 74 65 73 20 6d 65 6d 6f 72 79 20 62 79 20 63 61  tes memory by ca
14f30 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 4d 61 6c  lling sqlite3Mal
14f40 6c 6f 63 28 29 2e 20 49 66 20 61 6e 20 61 6c 6c  loc(). If an all
14f50 6f 63 61 74 69 6f 6e 0a 2a 2a 20 66 61 69 6c 73  ocation.** fails
14f60 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69  , SQLITE_NOMEM i
14f70 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
14f80 72 77 69 73 65 2c 20 69 66 20 6e 6f 20 49 4f 20  rwise, if no IO 
14f90 6f 72 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73  or malloc errors
14fa0 20 0a 2a 2a 20 6f 63 63 75 72 2c 20 53 51 4c 49   .** occur, SQLI
14fb0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
14fc0 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 54  d..**.** TODO: T
14fd0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c  his function all
14fe0 6f 63 61 74 65 73 20 61 20 73 69 6e 67 6c 65 20  ocates a single 
14ff0 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79 20  block of memory 
15000 74 6f 20 6c 6f 61 64 0a 2a 2a 20 74 68 65 20 65  to load.** the e
15010 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f  ntire contents o
15020 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  f the master jou
15030 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20  rnal file. This 
15040 63 6f 75 6c 64 20 62 65 0a 2a 2a 20 61 20 63 6f  could be.** a co
15050 75 70 6c 65 20 6f 66 20 6b 69 6c 6f 62 79 74 65  uple of kilobyte
15060 73 20 6f 72 20 73 6f 20 2d 20 70 6f 74 65 6e 74  s or so - potent
15070 69 61 6c 6c 79 20 6c 61 72 67 65 72 20 74 68 61  ially larger tha
15080 6e 20 74 68 65 20 70 61 67 65 20 0a 2a 2a 20 73  n the page .** s
15090 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ize..*/.static i
150a0 6e 74 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74  nt pager_delmast
150b0 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  er(Pager *pPager
150c0 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d  , const char *zM
150d0 61 73 74 65 72 29 7b 0a 20 20 73 71 6c 69 74 65  aster){.  sqlite
150e0 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50  3_vfs *pVfs = pP
150f0 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e  ager->pVfs;.  in
15100 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
15110 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
15120 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69  n code */.  sqli
15130 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65  te3_file *pMaste
15140 72 3b 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27  r;    /* Malloc'
15150 64 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  d master-journal
15160 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
15170 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
15180 6c 65 20 2a 70 4a 6f 75 72 6e 61 6c 3b 20 20 20  le *pJournal;   
15190 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20 63 68 69 6c  /* Malloc'd chil
151a0 64 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  d-journal file d
151b0 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 63  escriptor */.  c
151c0 68 61 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75 72  har *zMasterJour
151d0 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74  nal = 0; /* Cont
151e0 65 6e 74 73 20 6f 66 20 6d 61 73 74 65 72 20 6a  ents of master j
151f0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
15200 20 69 36 34 20 6e 4d 61 73 74 65 72 4a 6f 75 72   i64 nMasterJour
15210 6e 61 6c 3b 20 20 20 20 20 20 20 2f 2a 20 53 69  nal;       /* Si
15220 7a 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  ze of master jou
15230 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 63  rnal file */.  c
15240 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20  har *zJournal;  
15250 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
15260 74 65 72 20 74 6f 20 6f 6e 65 20 6a 6f 75 72 6e  ter to one journ
15270 61 6c 20 77 69 74 68 69 6e 20 4d 4a 20 66 69 6c  al within MJ fil
15280 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61  e */.  char *zMa
15290 73 74 65 72 50 74 72 3b 20 20 20 20 20 20 20 20  sterPtr;        
152a0 20 2f 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c   /* Space to hol
152b0 64 20 4d 4a 20 66 69 6c 65 6e 61 6d 65 20 66 72  d MJ filename fr
152c0 6f 6d 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  om a journal fil
152d0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 73 74  e */.  int nMast
152e0 65 72 50 74 72 3b 20 20 20 20 20 20 20 20 20 20  erPtr;          
152f0 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 73 70   /* Amount of sp
15300 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f  ace allocated to
15310 20 7a 4d 61 73 74 65 72 50 74 72 5b 5d 20 2a 2f   zMasterPtr[] */
15320 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
15330 73 70 61 63 65 20 66 6f 72 20 62 6f 74 68 20 74  space for both t
15340 68 65 20 70 4a 6f 75 72 6e 61 6c 20 61 6e 64 20  he pJournal and 
15350 70 4d 61 73 74 65 72 20 66 69 6c 65 20 64 65 73  pMaster file des
15360 63 72 69 70 74 6f 72 73 2e 0a 20 20 2a 2a 20 49  criptors..  ** I
15370 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 70  f successful, op
15380 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  en the master jo
15390 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 72  urnal file for r
153a0 65 61 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 70  eading..  */.  p
153b0 4d 61 73 74 65 72 20 3d 20 28 73 71 6c 69 74 65  Master = (sqlite
153c0 33 5f 66 69 6c 65 20 2a 29 73 71 6c 69 74 65 33  3_file *)sqlite3
153d0 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 56 66 73 2d  MallocZero(pVfs-
153e0 3e 73 7a 4f 73 46 69 6c 65 20 2a 20 32 29 3b 0a  >szOsFile * 2);.
153f0 20 20 70 4a 6f 75 72 6e 61 6c 20 3d 20 28 73 71    pJournal = (sq
15400 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 28 28 28  lite3_file *)(((
15410 75 38 20 2a 29 70 4d 61 73 74 65 72 29 20 2b 20  u8 *)pMaster) + 
15420 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 3b  pVfs->szOsFile);
15430 0a 20 20 69 66 28 20 21 70 4d 61 73 74 65 72 20  .  if( !pMaster 
15440 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
15450 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73  TE_NOMEM;.  }els
15460 65 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  e{.    const int
15470 20 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45   flags = (SQLITE
15480 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53  _OPEN_READONLY|S
15490 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45  QLITE_OPEN_MASTE
154a0 52 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20  R_JOURNAL);.    
154b0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
154c0 65 6e 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  en(pVfs, zMaster
154d0 2c 20 70 4d 61 73 74 65 72 2c 20 66 6c 61 67 73  , pMaster, flags
154e0 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  , 0);.  }.  if( 
154f0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
15500 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
15510 75 74 3b 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 74  ut;..  /* Load t
15520 68 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72  he entire master
15530 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e   journal file in
15540 74 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65  to space obtaine
15550 64 20 66 72 6f 6d 0a 20 20 2a 2a 20 73 71 6c 69  d from.  ** sqli
15560 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e 64  te3_malloc() and
15570 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a   pointed to by z
15580 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20 20  MasterJournal.  
15590 20 41 6c 73 6f 20 6f 62 74 61 69 6e 0a 20 20 2a   Also obtain.  *
155a0 2a 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61  * sufficient spa
155b0 63 65 20 28 69 6e 20 7a 4d 61 73 74 65 72 50 74  ce (in zMasterPt
155c0 72 29 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e  r) to hold the n
155d0 61 6d 65 73 20 6f 66 20 6d 61 73 74 65 72 0a 20  ames of master. 
155e0 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   ** journal file
155f0 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  s extracted from
15600 20 72 65 67 75 6c 61 72 20 72 6f 6c 6c 62 61 63   regular rollbac
15610 6b 2d 6a 6f 75 72 6e 61 6c 73 2e 0a 20 20 2a 2f  k-journals..  */
15620 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
15630 73 46 69 6c 65 53 69 7a 65 28 70 4d 61 73 74 65  sFileSize(pMaste
15640 72 2c 20 26 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  r, &nMasterJourn
15650 61 6c 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  al);.  if( rc!=S
15660 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
15670 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
15680 20 6e 4d 61 73 74 65 72 50 74 72 20 3d 20 70 56   nMasterPtr = pV
15690 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
156a0 3b 0a 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  ;.  zMasterJourn
156b0 61 6c 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  al = sqlite3Mall
156c0 6f 63 28 28 69 6e 74 29 6e 4d 61 73 74 65 72 4a  oc((int)nMasterJ
156d0 6f 75 72 6e 61 6c 20 2b 20 6e 4d 61 73 74 65 72  ournal + nMaster
156e0 50 74 72 20 2b 20 31 29 3b 0a 20 20 69 66 28 20  Ptr + 1);.  if( 
156f0 21 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20  !zMasterJournal 
15700 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
15710 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f  TE_NOMEM;.    go
15720 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
15730 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 50  ;.  }.  zMasterP
15740 74 72 20 3d 20 26 7a 4d 61 73 74 65 72 4a 6f 75  tr = &zMasterJou
15750 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72  rnal[nMasterJour
15760 6e 61 6c 2b 31 5d 3b 0a 20 20 72 63 20 3d 20 73  nal+1];.  rc = s
15770 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4d 61  qlite3OsRead(pMa
15780 73 74 65 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75  ster, zMasterJou
15790 72 6e 61 6c 2c 20 28 69 6e 74 29 6e 4d 61 73 74  rnal, (int)nMast
157a0 65 72 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20  erJournal, 0);. 
157b0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
157c0 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73  OK ) goto delmas
157d0 74 65 72 5f 6f 75 74 3b 0a 20 20 7a 4d 61 73 74  ter_out;.  zMast
157e0 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65  erJournal[nMaste
157f0 72 4a 6f 75 72 6e 61 6c 5d 20 3d 20 30 3b 0a 0a  rJournal] = 0;..
15800 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61    zJournal = zMa
15810 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 77  sterJournal;.  w
15820 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d  hile( (zJournal-
15830 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3c  zMasterJournal)<
15840 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29  nMasterJournal )
15850 7b 0a 20 20 20 20 69 6e 74 20 65 78 69 73 74 73  {.    int exists
15860 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
15870 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c  e3OsAccess(pVfs,
15880 20 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54   zJournal, SQLIT
15890 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c  E_ACCESS_EXISTS,
158a0 20 26 65 78 69 73 74 73 29 3b 0a 20 20 20 20 69   &exists);.    i
158b0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
158c0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 64   ){.      goto d
158d0 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
158e0 20 20 7d 0a 20 20 20 20 69 66 28 20 65 78 69 73    }.    if( exis
158f0 74 73 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f  ts ){.      /* O
15900 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ne of the journa
15910 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  ls pointed to by
15920 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
15930 6e 61 6c 20 65 78 69 73 74 73 2e 0a 20 20 20 20  nal exists..    
15940 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64    ** Open it and
15950 20 63 68 65 63 6b 20 69 66 20 69 74 20 70 6f 69   check if it poi
15960 6e 74 73 20 61 74 20 74 68 65 20 6d 61 73 74 65  nts at the maste
15970 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20  r journal. If.  
15980 20 20 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72      ** so, retur
15990 6e 20 77 69 74 68 6f 75 74 20 64 65 6c 65 74 69  n without deleti
159a0 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  ng the master jo
159b0 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20  urnal file..    
159c0 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 63    */.      int c
159d0 3b 0a 20 20 20 20 20 20 69 6e 74 20 66 6c 61 67  ;.      int flag
159e0 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e  s = (SQLITE_OPEN
159f0 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45  _READONLY|SQLITE
15a00 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
15a10 41 4c 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  AL);.      rc = 
15a20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56  sqlite3OsOpen(pV
15a30 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 70 4a  fs, zJournal, pJ
15a40 6f 75 72 6e 61 6c 2c 20 66 6c 61 67 73 2c 20 30  ournal, flags, 0
15a50 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
15a60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15a70 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61        goto delma
15a80 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20  ster_out;.      
15a90 7d 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65  }..      rc = re
15aa0 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  adMasterJournal(
15ab0 70 4a 6f 75 72 6e 61 6c 2c 20 7a 4d 61 73 74 65  pJournal, zMaste
15ac0 72 50 74 72 2c 20 6e 4d 61 73 74 65 72 50 74 72  rPtr, nMasterPtr
15ad0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
15ae0 4f 73 43 6c 6f 73 65 28 70 4a 6f 75 72 6e 61 6c  OsClose(pJournal
15af0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
15b00 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15b10 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61        goto delma
15b20 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20  ster_out;.      
15b30 7d 0a 0a 20 20 20 20 20 20 63 20 3d 20 7a 4d 61  }..      c = zMa
15b40 73 74 65 72 50 74 72 5b 30 5d 21 3d 30 20 26 26  sterPtr[0]!=0 &&
15b50 20 73 74 72 63 6d 70 28 7a 4d 61 73 74 65 72 50   strcmp(zMasterP
15b60 74 72 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b  tr, zMaster)==0;
15b70 0a 20 20 20 20 20 20 69 66 28 20 63 20 29 7b 0a  .      if( c ){.
15b80 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61          /* We ha
15b90 76 65 20 61 20 6d 61 74 63 68 2e 20 44 6f 20 6e  ve a match. Do n
15ba0 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61  ot delete the ma
15bb0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
15bc0 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 67 6f  e. */.        go
15bd0 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
15be0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
15bf0 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20      zJournal += 
15c00 28 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30  (sqlite3Strlen30
15c10 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a 20  (zJournal)+1);. 
15c20 20 7d 0a 20 0a 20 20 73 71 6c 69 74 65 33 4f 73   }. .  sqlite3Os
15c30 43 6c 6f 73 65 28 70 4d 61 73 74 65 72 29 3b 0a  Close(pMaster);.
15c40 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
15c50 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61  Delete(pVfs, zMa
15c60 73 74 65 72 2c 20 30 29 3b 0a 0a 64 65 6c 6d 61  ster, 0);..delma
15c70 73 74 65 72 5f 6f 75 74 3a 0a 20 20 73 71 6c 69  ster_out:.  sqli
15c80 74 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72  te3_free(zMaster
15c90 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20  Journal);.  if( 
15ca0 70 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 73  pMaster ){.    s
15cb0 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4d  qlite3OsClose(pM
15cc0 61 73 74 65 72 29 3b 0a 20 20 20 20 61 73 73 65  aster);.    asse
15cd0 72 74 28 20 21 69 73 4f 70 65 6e 28 70 4a 6f 75  rt( !isOpen(pJou
15ce0 72 6e 61 6c 29 20 29 3b 0a 20 20 20 20 73 71 6c  rnal) );.    sql
15cf0 69 74 65 33 5f 66 72 65 65 28 70 4d 61 73 74 65  ite3_free(pMaste
15d00 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  r);.  }.  return
15d10 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54   rc;.}.../*.** T
15d20 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
15d30 75 73 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74  used to change t
15d40 68 65 20 61 63 74 75 61 6c 20 73 69 7a 65 20 6f  he actual size o
15d50 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a  f the database .
15d60 2a 2a 20 66 69 6c 65 20 69 6e 20 74 68 65 20 66  ** file in the f
15d70 69 6c 65 2d 73 79 73 74 65 6d 2e 20 54 68 69 73  ile-system. This
15d80 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 77 68   only happens wh
15d90 65 6e 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20  en committing a 
15da0 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20  transaction,.** 
15db0 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  or rolling back 
15dc0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69  a transaction (i
15dd0 6e 63 6c 75 64 69 6e 67 20 72 6f 6c 6c 69 6e 67  ncluding rolling
15de0 20 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72   back a hot-jour
15df0 6e 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  nal)..**.** If t
15e00 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
15e10 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 6f 70 65   file is not ope
15e20 6e 2c 20 6f 72 20 61 6e 20 65 78 63 6c 75 73 69  n, or an exclusi
15e30 76 65 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 0a 2a  ve lock is not.*
15e40 2a 20 68 65 6c 64 2c 20 74 68 69 73 20 66 75 6e  * held, this fun
15e50 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
15e60 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65  . Otherwise, the
15e70 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c   size of the fil
15e80 65 20 69 73 0a 2a 2a 20 63 68 61 6e 67 65 64 20  e is.** changed 
15e90 74 6f 20 6e 50 61 67 65 20 70 61 67 65 73 20 28  to nPage pages (
15ea0 6e 50 61 67 65 2a 70 50 61 67 65 72 2d 3e 70 61  nPage*pPager->pa
15eb0 67 65 53 69 7a 65 20 62 79 74 65 73 29 2e 20 49  geSize bytes). I
15ec0 66 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 6f 6e  f the file.** on
15ed0 20 64 69 73 6b 20 69 73 20 63 75 72 72 65 6e 74   disk is current
15ee0 6c 79 20 6c 61 72 67 65 72 20 74 68 61 6e 20 6e  ly larger than n
15ef0 50 61 67 65 20 70 61 67 65 73 2c 20 74 68 65 6e  Page pages, then
15f00 20 75 73 65 20 74 68 65 20 56 46 53 0a 2a 2a 20   use the VFS.** 
15f10 78 54 72 75 6e 63 61 74 65 28 29 20 6d 65 74 68  xTruncate() meth
15f20 6f 64 20 74 6f 20 74 72 75 6e 63 61 74 65 20 69  od to truncate i
15f30 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 74 20  t..**.** Or, it 
15f40 6d 69 67 68 74 20 6d 69 67 68 74 20 62 65 20 74  might might be t
15f50 68 65 20 63 61 73 65 20 74 68 61 74 20 74 68 65  he case that the
15f60 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73   file on disk is
15f70 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 0a 2a   smaller than .*
15f80 2a 20 6e 50 61 67 65 20 70 61 67 65 73 2e 20 53  * nPage pages. S
15f90 6f 6d 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  ome operating sy
15fa0 73 74 65 6d 20 69 6d 70 6c 65 6d 65 6e 74 61 74  stem implementat
15fb0 69 6f 6e 73 20 63 61 6e 20 67 65 74 20 63 6f 6e  ions can get con
15fc0 66 75 73 65 64 20 69 66 20 0a 2a 2a 20 79 6f 75  fused if .** you
15fd0 20 74 72 79 20 74 6f 20 74 72 75 6e 63 61 74 65   try to truncate
15fe0 20 61 20 66 69 6c 65 20 74 6f 20 73 6f 6d 65 20   a file to some 
15ff0 73 69 7a 65 20 74 68 61 74 20 69 73 20 6c 61 72  size that is lar
16000 67 65 72 20 74 68 61 6e 20 69 74 20 0a 2a 2a 20  ger than it .** 
16010 63 75 72 72 65 6e 74 6c 79 20 69 73 2c 20 73 6f  currently is, so
16020 20 64 65 74 65 63 74 20 74 68 69 73 20 63 61 73   detect this cas
16030 65 20 61 6e 64 20 77 72 69 74 65 20 61 20 73 69  e and write a si
16040 6e 67 6c 65 20 7a 65 72 6f 20 62 79 74 65 20 74  ngle zero byte t
16050 6f 20 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66  o .** the end of
16060 20 74 68 65 20 6e 65 77 20 66 69 6c 65 20 69 6e   the new file in
16070 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  stead..**.** If 
16080 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75  successful, retu
16090 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66  rn SQLITE_OK. If
160a0 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
160b0 75 72 73 20 77 68 69 6c 65 20 6d 6f 64 69 66 79  urs while modify
160c0 69 6e 67 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  ing.** the datab
160d0 61 73 65 20 66 69 6c 65 2c 20 72 65 74 75 72 6e  ase file, return
160e0 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
160f0 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a  to the caller..*
16100 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
16110 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65  er_truncate(Page
16120 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
16130 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63  nPage){.  int rc
16140 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
16150 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
16160 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52  eState!=PAGER_ER
16170 52 4f 52 20 29 3b 0a 20 20 69 66 28 20 70 50 61  ROR );.  if( pPa
16180 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
16190 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  ER_WRITER_DBMOD 
161a0 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  && isOpen(pPager
161b0 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 69 36 34  ->fd) ){.    i64
161c0 20 63 75 72 72 65 6e 74 53 69 7a 65 2c 20 6e 65   currentSize, ne
161d0 77 53 69 7a 65 3b 0a 20 20 20 20 2f 2a 20 54 4f  wSize;.    /* TO
161e0 44 4f 3a 20 49 73 20 69 74 20 73 61 66 65 20 74  DO: Is it safe t
161f0 6f 20 75 73 65 20 50 61 67 65 72 2e 64 62 46 69  o use Pager.dbFi
16200 6c 65 53 69 7a 65 20 68 65 72 65 3f 20 2a 2f 0a  leSize here? */.
16210 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
16220 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65  OsFileSize(pPage
16230 72 2d 3e 66 64 2c 20 26 63 75 72 72 65 6e 74 53  r->fd, &currentS
16240 69 7a 65 29 3b 0a 20 20 20 20 6e 65 77 53 69 7a  ize);.    newSiz
16250 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65  e = pPager->page
16260 53 69 7a 65 2a 28 69 36 34 29 6e 50 61 67 65 3b  Size*(i64)nPage;
16270 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
16280 49 54 45 5f 4f 4b 20 26 26 20 63 75 72 72 65 6e  ITE_OK && curren
16290 74 53 69 7a 65 21 3d 6e 65 77 53 69 7a 65 20 29  tSize!=newSize )
162a0 7b 0a 20 20 20 20 20 20 69 66 28 20 63 75 72 72  {.      if( curr
162b0 65 6e 74 53 69 7a 65 3e 6e 65 77 53 69 7a 65 20  entSize>newSize 
162c0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
162d0 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
162e0 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 6e 65  e(pPager->fd, ne
162f0 77 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 65  wSize);.      }e
16300 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
16310 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
16320 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 22 22 2c  (pPager->fd, "",
16330 20 31 2c 20 6e 65 77 53 69 7a 65 2d 31 29 3b 0a   1, newSize-1);.
16340 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
16350 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
16360 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ){.        pPage
16370 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20  r->dbFileSize = 
16380 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 20  nPage;.      }. 
16390 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
163a0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
163b0 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  et the value of 
163c0 74 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f 72  the Pager.sector
163d0 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 66 6f  Size variable fo
163e0 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 70  r the given.** p
163f0 61 67 65 72 20 62 61 73 65 64 20 6f 6e 20 74 68  ager based on th
16400 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
16410 20 62 79 20 74 68 65 20 78 53 65 63 74 6f 72 53   by the xSectorS
16420 69 7a 65 20 6d 65 74 68 6f 64 0a 2a 2a 20 6f 66  ize method.** of
16430 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61   the open databa
16440 73 65 20 66 69 6c 65 2e 20 54 68 65 20 73 65 63  se file. The sec
16450 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62 65  tor size will be
16460 20 75 73 65 64 20 75 73 65 64 20 0a 2a 2a 20 74   used used .** t
16470 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
16480 73 69 7a 65 20 61 6e 64 20 61 6c 69 67 6e 6d 65  size and alignme
16490 6e 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65  nt of journal he
164a0 61 64 65 72 20 61 6e 64 20 0a 2a 2a 20 6d 61 73  ader and .** mas
164b0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter journal poin
164c0 74 65 72 73 20 77 69 74 68 69 6e 20 63 72 65 61  ters within crea
164d0 74 65 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ted journal file
164e0 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d  s..**.** For tem
164f0 70 6f 72 61 72 79 20 66 69 6c 65 73 20 74 68 65  porary files the
16500 20 65 66 66 65 63 74 69 76 65 20 73 65 63 74 6f   effective secto
16510 72 20 73 69 7a 65 20 69 73 20 61 6c 77 61 79 73  r size is always
16520 20 35 31 32 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a   512 bytes..**.*
16530 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 66 6f 72  * Otherwise, for
16540 20 6e 6f 6e 2d 74 65 6d 70 6f 72 61 72 79 20 66   non-temporary f
16550 69 6c 65 73 2c 20 74 68 65 20 65 66 66 65 63 74  iles, the effect
16560 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20  ive sector size 
16570 69 73 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  is.** the value 
16580 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20  returned by the 
16590 78 53 65 63 74 6f 72 53 69 7a 65 28 29 20 6d 65  xSectorSize() me
165a0 74 68 6f 64 20 72 6f 75 6e 64 65 64 20 75 70 20  thod rounded up 
165b0 74 6f 20 33 32 20 69 66 0a 2a 2a 20 69 74 20 69  to 32 if.** it i
165c0 73 20 6c 65 73 73 20 74 68 61 6e 20 33 32 2c 20  s less than 32, 
165d0 6f 72 20 72 6f 75 6e 64 65 64 20 64 6f 77 6e 20  or rounded down 
165e0 74 6f 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49  to MAX_SECTOR_SI
165f0 5a 45 20 69 66 20 69 74 0a 2a 2a 20 69 73 20 67  ZE if it.** is g
16600 72 65 61 74 65 72 20 74 68 61 6e 20 4d 41 58 5f  reater than MAX_
16610 53 45 43 54 4f 52 5f 53 49 5a 45 2e 0a 2a 2f 0a  SECTOR_SIZE..*/.
16620 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 53  static void setS
16630 65 63 74 6f 72 53 69 7a 65 28 50 61 67 65 72 20  ectorSize(Pager 
16640 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73 65  *pPager){.  asse
16650 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
16660 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72  r->fd) || pPager
16670 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 0a 20  ->tempFile );.. 
16680 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65   if( !pPager->te
16690 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 2f 2a  mpFile ){.    /*
166a0 20 53 65 63 74 6f 72 20 73 69 7a 65 20 64 6f 65   Sector size doe
166b0 73 6e 27 74 20 6d 61 74 74 65 72 20 66 6f 72 20  sn't matter for 
166c0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e  temporary files.
166d0 20 41 6c 73 6f 2c 20 74 68 65 20 66 69 6c 65 0a   Also, the file.
166e0 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 68      ** may not h
166f0 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20  ave been opened 
16700 79 65 74 2c 20 69 6e 20 77 68 69 63 68 20 63 61  yet, in which ca
16710 73 65 20 74 68 65 20 4f 73 53 65 63 74 6f 72 53  se the OsSectorS
16720 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c  ize().    ** cal
16730 6c 20 77 69 6c 6c 20 73 65 67 66 61 75 6c 74 2e  l will segfault.
16740 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67  .    */.    pPag
16750 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  er->sectorSize =
16760 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72   sqlite3OsSector
16770 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 29  Size(pPager->fd)
16780 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
16790 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3c 33  er->sectorSize<3
167a0 32 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  2 ){.    pPager-
167b0 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 35 31  >sectorSize = 51
167c0 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  2;.  }.  if( pPa
167d0 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3e  ger->sectorSize>
167e0 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20  MAX_SECTOR_SIZE 
167f0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 4d  ){.    assert( M
16800 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3e 3d  AX_SECTOR_SIZE>=
16810 35 31 32 20 29 3b 0a 20 20 20 20 70 50 61 67 65  512 );.    pPage
16820 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20  r->sectorSize = 
16830 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b  MAX_SECTOR_SIZE;
16840 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c  .  }.}../*.** Pl
16850 61 79 62 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e  ayback the journ
16860 61 6c 20 61 6e 64 20 74 68 75 73 20 72 65 73 74  al and thus rest
16870 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ore the database
16880 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20   file to.** the 
16890 73 74 61 74 65 20 69 74 20 77 61 73 20 69 6e 20  state it was in 
168a0 62 65 66 6f 72 65 20 77 65 20 73 74 61 72 74 65  before we starte
168b0 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65 73  d making changes
168c0 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f  .  .**.** The jo
168d0 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61  urnal file forma
168e0 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  t is as follows:
168f0 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20 20 38 20   .**.**  (1)  8 
16900 62 79 74 65 20 70 72 65 66 69 78 2e 20 20 41 20  byte prefix.  A 
16910 63 6f 70 79 20 6f 66 20 61 4a 6f 75 72 6e 61 6c  copy of aJournal
16920 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29  Magic[]..**  (2)
16930 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64    4 byte big-end
16940 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63  ian integer whic
16950 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  h is the number 
16960 6f 66 20 76 61 6c 69 64 20 70 61 67 65 20 72 65  of valid page re
16970 63 6f 72 64 73 0a 2a 2a 20 20 20 20 20 20 20 69  cords.**       i
16980 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  n the journal.  
16990 49 66 20 74 68 69 73 20 76 61 6c 75 65 20 69 73  If this value is
169a0 20 30 78 66 66 66 66 66 66 66 66 2c 20 74 68 65   0xffffffff, the
169b0 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a  n compute the.**
169c0 20 20 20 20 20 20 20 6e 75 6d 62 65 72 20 6f 66         number of
169d0 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66 72   page records fr
169e0 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73  om the journal s
169f0 69 7a 65 2e 0a 2a 2a 20 20 28 33 29 20 20 34 20  ize..**  (3)  4 
16a00 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20  byte big-endian 
16a10 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
16a20 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76 61 6c   the initial val
16a30 75 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 20  ue for the .**  
16a40 20 20 20 20 20 73 61 6e 69 74 79 20 63 68 65 63       sanity chec
16a50 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34 29 20 20 34  ksum..**  (4)  4
16a60 20 62 79 74 65 20 69 6e 74 65 67 65 72 20 77 68   byte integer wh
16a70 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65  ich is the numbe
16a80 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20 74 72  r of pages to tr
16a90 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 20 20  uncate the.**   
16aa0 20 20 20 20 64 61 74 61 62 61 73 65 20 74 6f 20      database to 
16ab0 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63  during a rollbac
16ac0 6b 2e 0a 2a 2a 20 20 28 35 29 20 20 34 20 62 79  k..**  (5)  4 by
16ad0 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
16ae0 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
16af0 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 2e 20  he sector size. 
16b00 20 54 68 65 20 68 65 61 64 65 72 0a 2a 2a 20 20   The header.**  
16b10 20 20 20 20 20 69 73 20 74 68 69 73 20 6d 61 6e       is this man
16b20 79 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  y bytes in size.
16b30 0a 2a 2a 20 20 28 36 29 20 20 34 20 62 79 74 65  .**  (6)  4 byte
16b40 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
16b50 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
16b60 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 20   page size..**  
16b70 28 37 29 20 20 7a 65 72 6f 20 70 61 64 64 69 6e  (7)  zero paddin
16b80 67 20 6f 75 74 20 74 6f 20 74 68 65 20 6e 65 78  g out to the nex
16b90 74 20 73 65 63 74 6f 72 20 73 69 7a 65 2e 0a 2a  t sector size..*
16ba0 2a 20 20 28 38 29 20 20 5a 65 72 6f 20 6f 72 20  *  (8)  Zero or 
16bb0 6d 6f 72 65 20 70 61 67 65 73 20 69 6e 73 74 61  more pages insta
16bc0 6e 63 65 73 2c 20 65 61 63 68 20 61 73 20 66 6f  nces, each as fo
16bd0 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20 20 20  llows:.**       
16be0 20 2b 20 20 34 20 62 79 74 65 20 70 61 67 65 20   +  4 byte page 
16bf0 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20 20 20  number..**      
16c00 20 20 2b 20 20 70 50 61 67 65 72 2d 3e 70 61 67    +  pPager->pag
16c10 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64  eSize bytes of d
16c20 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b  ata..**        +
16c30 20 20 34 20 62 79 74 65 20 63 68 65 63 6b 73 75    4 byte checksu
16c40 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 65 20  m.**.** When we 
16c50 73 70 65 61 6b 20 6f 66 20 74 68 65 20 6a 6f 75  speak of the jou
16c60 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 77 65 20  rnal header, we 
16c70 6d 65 61 6e 20 74 68 65 20 66 69 72 73 74 20 37  mean the first 7
16c80 20 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a   items above..**
16c90 20 45 61 63 68 20 65 6e 74 72 79 20 69 6e 20 74   Each entry in t
16ca0 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6e  he journal is an
16cb0 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
16cc0 20 38 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a   8th item..**.**
16cd0 20 43 61 6c 6c 20 74 68 65 20 76 61 6c 75 65 20   Call the value 
16ce0 66 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64 20  from the second 
16cf0 62 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e 20 20  bullet "nRec".  
16d00 6e 52 65 63 20 69 73 20 74 68 65 20 6e 75 6d 62  nRec is the numb
16d10 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64 20 70  er of.** valid p
16d20 61 67 65 20 65 6e 74 72 69 65 73 20 69 6e 20 74  age entries in t
16d30 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20  he journal.  In 
16d40 6d 6f 73 74 20 63 61 73 65 73 2c 20 79 6f 75 20  most cases, you 
16d50 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a  can compute the.
16d60 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63  ** value of nRec
16d70 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f   from the size o
16d80 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
16d90 6c 65 2e 20 20 42 75 74 20 69 66 20 61 20 70 6f  le.  But if a po
16da0 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 20 6f  wer.** failure o
16db0 63 63 75 72 72 65 64 20 77 68 69 6c 65 20 74 68  ccurred while th
16dc0 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65  e journal was be
16dd0 69 6e 67 20 77 72 69 74 74 65 6e 2c 20 69 74 20  ing written, it 
16de0 63 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a 2a 20  could be the.** 
16df0 63 61 73 65 20 74 68 61 74 20 74 68 65 20 73 69  case that the si
16e00 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
16e10 6c 20 66 69 6c 65 20 68 61 64 20 61 6c 72 65 61  l file had alrea
16e20 64 79 20 62 65 65 6e 20 69 6e 63 72 65 61 73 65  dy been increase
16e30 64 20 62 75 74 0a 2a 2a 20 74 68 65 20 65 78 74  d but.** the ext
16e40 72 61 20 65 6e 74 72 69 65 73 20 68 61 64 20 6e  ra entries had n
16e50 6f 74 20 79 65 74 20 6d 61 64 65 20 69 74 20 73  ot yet made it s
16e60 61 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e 20 20  afely to disk.  
16e70 49 6e 20 73 75 63 68 20 61 20 63 61 73 65 2c 0a  In such a case,.
16e80 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ** the value of 
16e90 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66 72  nRec computed fr
16ea0 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  om the file size
16eb0 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20 6c 61   would be too la
16ec0 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 61  rge.  For.** tha
16ed0 74 20 72 65 61 73 6f 6e 2c 20 77 65 20 61 6c 77  t reason, we alw
16ee0 61 79 73 20 75 73 65 20 74 68 65 20 6e 52 65 63  ays use the nRec
16ef0 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 68 65   value in the he
16f00 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ader..**.** If t
16f10 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 73  he nRec value is
16f20 20 30 78 66 66 66 66 66 66 66 66 20 69 74 20 6d   0xffffffff it m
16f30 65 61 6e 73 20 74 68 61 74 20 6e 52 65 63 20 73  eans that nRec s
16f40 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65  hould be compute
16f50 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66 69  d.** from the fi
16f60 6c 65 20 73 69 7a 65 2e 20 20 54 68 69 73 20 76  le size.  This v
16f70 61 6c 75 65 20 69 73 20 75 73 65 64 20 77 68 65  alue is used whe
16f80 6e 20 74 68 65 20 75 73 65 72 20 73 65 6c 65 63  n the user selec
16f90 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e  ts the.** no-syn
16fa0 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74 68 65  c option for the
16fb0 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70 6f 77   journal.  A pow
16fc0 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64  er failure could
16fd0 20 6c 65 61 64 20 74 6f 20 63 6f 72 72 75 70 74   lead to corrupt
16fe0 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63  ion.** in this c
16ff0 61 73 65 2e 20 20 42 75 74 20 66 6f 72 20 74 68  ase.  But for th
17000 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70 6f 72  ings like tempor
17010 61 72 79 20 74 61 62 6c 65 20 28 77 68 69 63 68  ary table (which
17020 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c 65   will be.** dele
17030 74 65 64 20 77 68 65 6e 20 74 68 65 20 70 6f 77  ted when the pow
17040 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 29 20  er is restored) 
17050 77 65 20 64 6f 6e 27 74 20 63 61 72 65 2e 20 20  we don't care.  
17060 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69  .**.** If the fi
17070 6c 65 20 6f 70 65 6e 65 64 20 61 73 20 74 68 65  le opened as the
17080 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
17090 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72 6d   not a well-form
170a0 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  ed.** journal fi
170b0 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65  le then all page
170c0 73 20 75 70 20 74 6f 20 74 68 65 20 66 69 72 73  s up to the firs
170d0 74 20 63 6f 72 72 75 70 74 65 64 20 70 61 67 65  t corrupted page
170e0 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62   are rolled.** b
170f0 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61 67 65 73  ack (or no pages
17100 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   if the journal 
17110 68 65 61 64 65 72 20 69 73 20 63 6f 72 72 75 70  header is corrup
17120 74 65 64 29 2e 20 54 68 65 20 6a 6f 75 72 6e 61  ted). The journa
17130 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 74 68 65  l file.** is the
17140 6e 20 64 65 6c 65 74 65 64 20 61 6e 64 20 53 51  n deleted and SQ
17150 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
17160 2c 20 6a 75 73 74 20 61 73 20 69 66 20 6e 6f 20  , just as if no 
17170 63 6f 72 72 75 70 74 69 6f 6e 20 68 61 64 0a 2a  corruption had.*
17180 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72  * been encounter
17190 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ed..**.** If an 
171a0 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20  I/O or malloc() 
171b0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
171c0 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 69  e journal-file i
171d0 73 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a 2a 2a  s not deleted.**
171e0 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f   and an error co
171f0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  de is returned..
17200 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 48 6f 74 20  **.** The isHot 
17210 70 61 72 61 6d 65 74 65 72 20 69 6e 64 69 63 61  parameter indica
17220 74 65 73 20 74 68 61 74 20 77 65 20 61 72 65 20  tes that we are 
17230 74 72 79 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61  trying to rollba
17240 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  ck a journal.** 
17250 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 61 20  that might be a 
17260 68 6f 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 72  hot journal.  Or
17270 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68  , it could be th
17280 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  at the journal i
17290 73 20 0a 2a 2a 20 70 72 65 73 65 72 76 65 64 20  s .** preserved 
172a0 62 65 63 61 75 73 65 20 6f 66 20 4a 4f 55 52 4e  because of JOURN
172b0 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20 6f  ALMODE_PERSIST o
172c0 72 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52  r JOURNALMODE_TR
172d0 55 4e 43 41 54 45 2e 0a 2a 2a 20 49 66 20 74 68  UNCATE..** If th
172e0 65 20 6a 6f 75 72 6e 61 6c 20 72 65 61 6c 6c 79  e journal really
172f0 20 69 73 20 68 6f 74 2c 20 72 65 73 65 74 20 74   is hot, reset t
17300 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20 70  he pager cache p
17310 72 69 6f 72 20 72 6f 6c 6c 69 6e 67 0a 2a 2a 20  rior rolling.** 
17320 62 61 63 6b 20 61 6e 79 20 63 6f 6e 74 65 6e 74  back any content
17330 2e 20 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  .  If the journa
17340 6c 20 69 73 20 6d 65 72 65 6c 79 20 70 65 72 73  l is merely pers
17350 69 73 74 65 6e 74 2c 20 6e 6f 20 72 65 73 65 74  istent, no reset
17360 20 69 73 0a 2a 2a 20 6e 65 65 64 65 64 2e 0a 2a   is.** needed..*
17370 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
17380 65 72 5f 70 6c 61 79 62 61 63 6b 28 50 61 67 65  er_playback(Page
17390 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 69  r *pPager, int i
173a0 73 48 6f 74 29 7b 0a 20 20 73 71 6c 69 74 65 33  sHot){.  sqlite3
173b0 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61  _vfs *pVfs = pPa
173c0 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 36 34  ger->pVfs;.  i64
173d0 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20   szJ;           
173e0 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
173f0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
17400 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  e in bytes */.  
17410 75 33 32 20 6e 52 65 63 3b 20 20 20 20 20 20 20  u32 nRec;       
17420 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
17430 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20 69 6e  er of Records in
17440 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   the journal */.
17450 20 20 75 33 32 20 75 3b 20 20 20 20 20 20 20 20    u32 u;        
17460 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e             /* Un
17470 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e  signed loop coun
17480 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78  ter */.  Pgno mx
17490 50 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  Pg = 0;         
174a0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
174b0 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 20 69   original file i
174c0 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74  n pages */.  int
174d0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
174e0 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
174f0 63 6f 64 65 20 6f 66 20 61 20 73 75 62 72 6f 75  code of a subrou
17500 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65  tine */.  int re
17510 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20  s = 1;          
17520 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75     /* Value retu
17530 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 4f  rned by sqlite3O
17540 73 41 63 63 65 73 73 28 29 20 2a 2f 0a 20 20 63  sAccess() */.  c
17550 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30  har *zMaster = 0
17560 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  ;       /* Name 
17570 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  of master journa
17580 6c 20 66 69 6c 65 20 69 66 20 61 6e 79 20 2a 2f  l file if any */
17590 0a 20 20 69 6e 74 20 6e 65 65 64 50 61 67 65 72  .  int needPager
175a0 52 65 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 54  Reset;      /* T
175b0 72 75 65 20 74 6f 20 72 65 73 65 74 20 70 61 67  rue to reset pag
175c0 65 20 70 72 69 6f 72 20 74 6f 20 66 69 72 73 74  e prior to first
175d0 20 70 61 67 65 20 72 6f 6c 6c 62 61 63 6b 20 2a   page rollback *
175e0 2f 0a 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e  /..  if( !isOpen
175f0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b  (pPager->jfd) ){
17600 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
17610 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TE_OK;.  }..  /*
17620 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20   Figure out how 
17630 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61 72 65  many records are
17640 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   in the journal.
17650 20 20 41 62 6f 72 74 20 65 61 72 6c 79 20 69 66    Abort early if
17660 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61  .  ** the journa
17670 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a 2f  l is empty..  */
17680 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
17690 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
176a0 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20  ->jfd, &szJ);.  
176b0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
176c0 4b 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29 7b 0a 20  K || szJ==0 ){. 
176d0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
176e0 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  back;.  }..  /* 
176f0 52 65 61 64 20 74 68 65 20 6d 61 73 74 65 72 20  Read the master 
17700 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 66 72 6f  journal name fro
17710 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69  m the journal, i
17720 66 20 69 74 20 69 73 20 70 72 65 73 65 6e 74 2e  f it is present.
17730 0a 20 20 2a 2a 20 49 66 20 61 20 6d 61 73 74 65  .  ** If a maste
17740 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
17750 61 6d 65 20 69 73 20 73 70 65 63 69 66 69 65 64  ame is specified
17760 2c 20 62 75 74 20 74 68 65 20 66 69 6c 65 20 69  , but the file i
17770 73 20 6e 6f 74 0a 20 20 2a 2a 20 70 72 65 73 65  s not.  ** prese
17780 6e 74 20 6f 6e 20 64 69 73 6b 2c 20 74 68 65 6e  nt on disk, then
17790 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
177a0 6e 6f 74 20 68 6f 74 20 61 6e 64 20 64 6f 65 73  not hot and does
177b0 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 0a   not need to be.
177c0 20 20 2a 2a 20 70 6c 61 79 65 64 20 62 61 63 6b    ** played back
177d0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f 44 4f  ..  **.  ** TODO
177e0 3a 20 54 65 63 68 6e 69 63 61 6c 6c 79 20 74 68  : Technically th
177f0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61  e following is a
17800 6e 20 65 72 72 6f 72 20 62 65 63 61 75 73 65 20  n error because 
17810 69 74 20 61 73 73 75 6d 65 73 20 74 68 61 74 0a  it assumes that.
17820 20 20 2a 2a 20 62 75 66 66 65 72 20 50 61 67 65    ** buffer Page
17830 72 2e 70 54 6d 70 53 70 61 63 65 20 69 73 20 28  r.pTmpSpace is (
17840 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 20 62 79  mxPathname+1) by
17850 74 65 73 20 6f 72 20 6c 61 72 67 65 72 2e 20 69  tes or larger. i
17860 2e 65 2e 20 74 68 61 74 0a 20 20 2a 2a 20 28 70  .e. that.  ** (p
17870 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
17880 3e 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d  >= pPager->pVfs-
17890 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 2e 20  >mxPathname+1). 
178a0 55 73 69 6e 67 20 6f 73 5f 75 6e 69 78 2e 63 2c  Using os_unix.c,
178b0 0a 20 20 2a 2a 20 20 6d 78 50 61 74 68 6e 61 6d  .  **  mxPathnam
178c0 65 20 69 73 20 35 31 32 2c 20 77 68 69 63 68 20  e is 512, which 
178d0 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  is the same as t
178e0 68 65 20 6d 69 6e 69 6d 75 6d 20 61 6c 6c 6f 77  he minimum allow
178f0 61 62 6c 65 20 76 61 6c 75 65 0a 20 20 2a 2a 20  able value.  ** 
17900 66 6f 72 20 70 61 67 65 53 69 7a 65 2e 0a 20 20  for pageSize..  
17910 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20 70  */.  zMaster = p
17920 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
17930 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73  ;.  rc = readMas
17940 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  terJournal(pPage
17950 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c  r->jfd, zMaster,
17960 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d   pPager->pVfs->m
17970 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20  xPathname+1);.  
17980 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
17990 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20  K && zMaster[0] 
179a0 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
179b0 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73  te3OsAccess(pVfs
179c0 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49 54  , zMaster, SQLIT
179d0 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c  E_ACCESS_EXISTS,
179e0 20 26 72 65 73 29 3b 0a 20 20 7d 0a 20 20 7a 4d   &res);.  }.  zM
179f0 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 69 66 28  aster = 0;.  if(
17a00 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
17a10 7c 20 21 72 65 73 20 29 7b 0a 20 20 20 20 67 6f  | !res ){.    go
17a20 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
17a30 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a  .  }.  pPager->j
17a40 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
17a50 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 20   needPagerReset 
17a60 3d 20 69 73 48 6f 74 3b 0a 0a 20 20 2f 2a 20 54  = isHot;..  /* T
17a70 68 69 73 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61  his loop termina
17a80 74 65 73 20 65 69 74 68 65 72 20 77 68 65 6e 20  tes either when 
17a90 61 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72  a readJournalHdr
17aa0 28 29 20 6f 72 20 0a 20 20 2a 2a 20 70 61 67 65  () or .  ** page
17ab0 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
17ac0 61 67 65 28 29 20 63 61 6c 6c 20 72 65 74 75 72  age() call retur
17ad0 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f  ns SQLITE_DONE o
17ae0 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a 20  r an IO error . 
17af0 20 2a 2a 20 6f 63 63 75 72 73 2e 20 0a 20 20 2a   ** occurs. .  *
17b00 2f 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a  /.  while( 1 ){.
17b10 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20      /* Read the 
17b20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  next journal hea
17b30 64 65 72 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  der from the jou
17b40 72 6e 61 6c 20 66 69 6c 65 2e 20 20 49 66 20 74  rnal file.  If t
17b50 68 65 72 65 20 61 72 65 0a 20 20 20 20 2a 2a 20  here are.    ** 
17b60 6e 6f 74 20 65 6e 6f 75 67 68 20 62 79 74 65 73  not enough bytes
17b70 20 6c 65 66 74 20 69 6e 20 74 68 65 20 6a 6f 75   left in the jou
17b80 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 61 20  rnal file for a 
17b90 63 6f 6d 70 6c 65 74 65 20 68 65 61 64 65 72 2c  complete header,
17ba0 20 6f 72 0a 20 20 20 20 2a 2a 20 69 74 20 69 73   or.    ** it is
17bb0 20 63 6f 72 72 75 70 74 65 64 2c 20 74 68 65 6e   corrupted, then
17bc0 20 61 20 70 72 6f 63 65 73 73 20 6d 75 73 74 20   a process must 
17bd0 6f 66 20 66 61 69 6c 65 64 20 77 68 69 6c 65 20  of failed while 
17be0 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20 20 20  writing it..    
17bf0 2a 2a 20 54 68 69 73 20 69 6e 64 69 63 61 74 65  ** This indicate
17c00 73 20 6e 6f 74 68 69 6e 67 20 6d 6f 72 65 20 6e  s nothing more n
17c10 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65  eeds to be rolle
17c20 64 20 62 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20  d back..    */. 
17c30 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72     rc = readJour
17c40 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 69  nalHdr(pPager, i
17c50 73 48 6f 74 2c 20 73 7a 4a 2c 20 26 6e 52 65 63  sHot, szJ, &nRec
17c60 2c 20 26 6d 78 50 67 29 3b 0a 20 20 20 20 69 66  , &mxPg);.    if
17c70 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
17c80 29 7b 20 0a 20 20 20 20 20 20 69 66 28 20 72 63  ){ .      if( rc
17c90 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b  ==SQLITE_DONE ){
17ca0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
17cb0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
17cc0 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  .      goto end_
17cd0 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a  playback;.    }.
17ce0 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20  .    /* If nRec 
17cf0 69 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74  is 0xffffffff, t
17d00 68 65 6e 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  hen this journal
17d10 20 77 61 73 20 63 72 65 61 74 65 64 20 62 79 20   was created by 
17d20 61 20 70 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a  a process.    **
17d30 20 77 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73   working in no-s
17d40 79 6e 63 20 6d 6f 64 65 2e 20 54 68 69 73 20 6d  ync mode. This m
17d50 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 72 65  eans that the re
17d60 73 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  st of the journa
17d70 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 6f  l.    ** file co
17d80 6e 73 69 73 74 73 20 6f 66 20 70 61 67 65 73 2c  nsists of pages,
17d90 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f   there are no mo
17da0 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  re journal heade
17db0 72 73 2e 20 43 6f 6d 70 75 74 65 0a 20 20 20 20  rs. Compute.    
17dc0 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ** the value of 
17dd0 6e 52 65 63 20 62 61 73 65 64 20 6f 6e 20 74 68  nRec based on th
17de0 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 2e 0a 20  is assumption.. 
17df0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52     */.    if( nR
17e00 65 63 3d 3d 30 78 66 66 66 66 66 66 66 66 20 29  ec==0xffffffff )
17e10 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
17e20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
17e30 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ff==JOURNAL_HDR_
17e40 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  SZ(pPager) );.  
17e50 20 20 20 20 6e 52 65 63 20 3d 20 28 69 6e 74 29      nRec = (int)
17e60 28 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f  ((szJ - JOURNAL_
17e70 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 29 2f  HDR_SZ(pPager))/
17e80 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50  JOURNAL_PG_SZ(pP
17e90 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 0a 20  ager));.    }.. 
17ea0 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73     /* If nRec is
17eb0 20 30 20 61 6e 64 20 74 68 69 73 20 72 6f 6c 6c   0 and this roll
17ec0 62 61 63 6b 20 69 73 20 6f 66 20 61 20 74 72 61  back is of a tra
17ed0 6e 73 61 63 74 69 6f 6e 20 63 72 65 61 74 65 64  nsaction created
17ee0 20 62 79 20 74 68 69 73 0a 20 20 20 20 2a 2a 20   by this.    ** 
17ef0 70 72 6f 63 65 73 73 20 61 6e 64 20 69 66 20 74  process and if t
17f00 68 69 73 20 69 73 20 74 68 65 20 66 69 6e 61 6c  his is the final
17f10 20 68 65 61 64 65 72 20 69 6e 20 74 68 65 20 6a   header in the j
17f20 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20 69 74 20  ournal, then it 
17f30 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 74 68 61  means.    ** tha
17f40 74 20 74 68 69 73 20 70 61 72 74 20 6f 66 20 74  t this part of t
17f50 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62  he journal was b
17f60 65 69 6e 67 20 66 69 6c 6c 65 64 20 62 75 74 20  eing filled but 
17f70 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  has not yet been
17f80 0a 20 20 20 20 2a 2a 20 73 79 6e 63 65 64 20 74  .    ** synced t
17f90 6f 20 64 69 73 6b 2e 20 20 43 6f 6d 70 75 74 65  o disk.  Compute
17fa0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
17fb0 61 67 65 73 20 62 61 73 65 64 20 6f 6e 20 74 68  ages based on th
17fc0 65 20 72 65 6d 61 69 6e 69 6e 67 0a 20 20 20 20  e remaining.    
17fd0 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66  ** size of the f
17fe0 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ile..    **.    
17ff0 2a 2a 20 54 68 65 20 74 68 69 72 64 20 74 65 72  ** The third ter
18000 6d 20 6f 66 20 74 68 65 20 74 65 73 74 20 77 61  m of the test wa
18010 73 20 61 64 64 65 64 20 74 6f 20 66 69 78 20 74  s added to fix t
18020 69 63 6b 65 74 20 23 32 35 36 35 2e 0a 20 20 20  icket #2565..   
18030 20 2a 2a 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67   ** When rolling
18040 20 62 61 63 6b 20 61 20 68 6f 74 20 6a 6f 75 72   back a hot jour
18050 6e 61 6c 2c 20 6e 52 65 63 3d 3d 30 20 61 6c 77  nal, nRec==0 alw
18060 61 79 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74  ays means that t
18070 68 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 63  he next.    ** c
18080 68 75 6e 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72  hunk of the jour
18090 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 20 7a 65 72  nal contains zer
180a0 6f 20 70 61 67 65 73 20 74 6f 20 62 65 20 72 6f  o pages to be ro
180b0 6c 6c 65 64 20 62 61 63 6b 2e 20 20 42 75 74 0a  lled back.  But.
180c0 20 20 20 20 2a 2a 20 77 68 65 6e 20 64 6f 69 6e      ** when doin
180d0 67 20 61 20 52 4f 4c 4c 42 41 43 4b 20 61 6e 64  g a ROLLBACK and
180e0 20 74 68 65 20 6e 52 65 63 3d 3d 30 20 63 68 75   the nRec==0 chu
180f0 6e 6b 20 69 73 20 74 68 65 20 6c 61 73 74 20 63  nk is the last c
18100 68 75 6e 6b 20 69 6e 0a 20 20 20 20 2a 2a 20 74  hunk in.    ** t
18110 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 6d  he journal, it m
18120 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 6a 6f  eans that the jo
18130 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74  urnal might cont
18140 61 69 6e 20 61 64 64 69 74 69 6f 6e 61 6c 0a 20  ain additional. 
18150 20 20 20 2a 2a 20 70 61 67 65 73 20 74 68 61 74     ** pages that
18160 20 6e 65 65 64 20 74 6f 20 62 65 20 72 6f 6c 6c   need to be roll
18170 65 64 20 62 61 63 6b 20 61 6e 64 20 74 68 61 74  ed back and that
18180 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
18190 61 67 65 73 20 0a 20 20 20 20 2a 2a 20 73 68 6f  ages .    ** sho
181a0 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64 20  uld be computed 
181b0 62 61 73 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75  based on the jou
181c0 72 6e 61 6c 20 66 69 6c 65 20 73 69 7a 65 2e 0a  rnal file size..
181d0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e      */.    if( n
181e0 52 65 63 3d 3d 30 20 26 26 20 21 69 73 48 6f 74  Rec==0 && !isHot
181f0 20 26 26 0a 20 20 20 20 20 20 20 20 70 50 61 67   &&.        pPag
18200 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a  er->journalHdr+J
18210 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
18220 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a  ager)==pPager->j
18230 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20  ournalOff ){.   
18240 20 20 20 6e 52 65 63 20 3d 20 28 69 6e 74 29 28     nRec = (int)(
18250 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a  (szJ - pPager->j
18260 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f 55  ournalOff) / JOU
18270 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65  RNAL_PG_SZ(pPage
18280 72 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  r));.    }..    
18290 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68  /* If this is th
182a0 65 20 66 69 72 73 74 20 68 65 61 64 65 72 20 72  e first header r
182b0 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ead from the jou
182c0 72 6e 61 6c 2c 20 74 72 75 6e 63 61 74 65 20 74  rnal, truncate t
182d0 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
182e0 73 65 20 66 69 6c 65 20 62 61 63 6b 20 74 6f 20  se file back to 
182f0 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a  its original siz
18300 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
18310 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
18320 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44  lOff==JOURNAL_HD
18330 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a  R_SZ(pPager) ){.
18340 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
18350 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  _truncate(pPager
18360 2c 20 6d 78 50 67 29 3b 0a 20 20 20 20 20 20 69  , mxPg);.      i
18370 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
18380 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
18390 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
183a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61       }.      pPa
183b0 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 78  ger->dbSize = mx
183c0 50 67 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  Pg;.    }..    /
183d0 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20  * Copy original 
183e0 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74 68 65  pages out of the
183f0 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61 63   journal and bac
18400 6b 20 69 6e 74 6f 20 74 68 65 20 0a 20 20 20 20  k into the .    
18410 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
18420 20 61 6e 64 2f 6f 72 20 70 61 67 65 20 63 61 63   and/or page cac
18430 68 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  he..    */.    f
18440 6f 72 28 75 3d 30 3b 20 75 3c 6e 52 65 63 3b 20  or(u=0; u<nRec; 
18450 75 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  u++){.      if( 
18460 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 20 29  needPagerReset )
18470 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f  {.        pager_
18480 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
18490 20 20 20 20 20 20 20 6e 65 65 64 50 61 67 65 72         needPager
184a0 52 65 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20  Reset = 0;.     
184b0 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61   }.      rc = pa
184c0 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
184d0 5f 70 61 67 65 28 70 50 61 67 65 72 2c 26 70 50  _page(pPager,&pP
184e0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
184f0 2c 30 2c 31 2c 30 29 3b 0a 20 20 20 20 20 20 69  ,0,1,0);.      i
18500 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
18510 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
18520 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
18530 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
18540 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
18550 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
18560 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b  ournalOff = szJ;
18570 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
18580 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
18590 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49  if( rc==SQLITE_I
185a0 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20  OERR_SHORT_READ 
185b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
185c0 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  If the journal h
185d0 61 73 20 62 65 65 6e 20 74 72 75 6e 63 61 74 65  as been truncate
185e0 64 2c 20 73 69 6d 70 6c 79 20 73 74 6f 70 20 72  d, simply stop r
185f0 65 61 64 69 6e 67 20 61 6e 64 0a 20 20 20 20 20  eading and.     
18600 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 69       ** processi
18610 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  ng the journal. 
18620 54 68 69 73 20 6d 69 67 68 74 20 68 61 70 70 65  This might happe
18630 6e 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n if the journal
18640 20 77 61 73 0a 20 20 20 20 20 20 20 20 20 20 2a   was.          *
18650 2a 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79  * not completely
18660 20 77 72 69 74 74 65 6e 20 61 6e 64 20 73 79 6e   written and syn
18670 63 65 64 20 70 72 69 6f 72 20 74 6f 20 61 20 63  ced prior to a c
18680 72 61 73 68 2e 20 20 49 6e 20 74 68 61 74 0a 20  rash.  In that. 
18690 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65           ** case
186a0 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  , the database s
186b0 68 6f 75 6c 64 20 68 61 76 65 20 6e 65 76 65 72  hould have never
186c0 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 69 6e   been written in
186d0 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a   the.          *
186e0 2a 20 66 69 72 73 74 20 70 6c 61 63 65 20 73 6f  * first place so
186f0 20 69 74 20 69 73 20 4f 4b 20 74 6f 20 73 69 6d   it is OK to sim
18700 70 6c 79 20 61 62 61 6e 64 6f 6e 20 74 68 65 20  ply abandon the 
18710 72 6f 6c 6c 62 61 63 6b 2e 20 2a 2f 0a 20 20 20  rollback. */.   
18720 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
18730 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
18740 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
18750 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ck;.        }els
18760 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
18770 49 66 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65  If we are unable
18780 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20 71 75   to rollback, qu
18790 69 74 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  it and return th
187a0 65 20 65 72 72 6f 72 0a 20 20 20 20 20 20 20 20  e error.        
187b0 20 20 2a 2a 20 63 6f 64 65 2e 20 20 54 68 69 73    ** code.  This
187c0 20 77 69 6c 6c 20 63 61 75 73 65 20 74 68 65 20   will cause the 
187d0 70 61 67 65 72 20 74 6f 20 65 6e 74 65 72 20 74  pager to enter t
187e0 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 0a 20  he error state. 
187f0 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 74           ** so t
18800 68 61 74 20 6e 6f 20 66 75 72 74 68 65 72 20 68  hat no further h
18810 61 72 6d 20 77 69 6c 6c 20 62 65 20 64 6f 6e 65  arm will be done
18820 2e 20 20 50 65 72 68 61 70 73 20 74 68 65 20 6e  .  Perhaps the n
18830 65 78 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ext.          **
18840 20 70 72 6f 63 65 73 73 20 74 6f 20 63 6f 6d 65   process to come
18850 20 61 6c 6f 6e 67 20 77 69 6c 6c 20 62 65 20 61   along will be a
18860 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20  ble to rollback 
18870 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20  the database..  
18880 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
18890 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c       goto end_pl
188a0 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20  ayback;.        
188b0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
188c0 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41 43 48    }.  /*NOTREACH
188d0 45 44 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30  ED*/.  assert( 0
188e0 20 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62 61 63   );..end_playbac
188f0 6b 3a 0a 20 20 2f 2a 20 46 6f 6c 6c 6f 77 69 6e  k:.  /* Followin
18900 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68  g a rollback, th
18910 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
18920 73 68 6f 75 6c 64 20 62 65 20 62 61 63 6b 20 69  should be back i
18930 6e 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 0a 20  n its original. 
18940 20 2a 2a 20 73 74 61 74 65 20 70 72 69 6f 72 20   ** state prior 
18950 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
18960 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  the transaction,
18970 20 73 6f 20 69 6e 76 6f 6b 65 20 74 68 65 0a 20   so invoke the. 
18980 20 2a 2a 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c   ** SQLITE_FCNTL
18990 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 20 66 69  _DB_UNCHANGED fi
189a0 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f  le-control metho
189b0 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65  d to disable the
189c0 0a 20 20 2a 2a 20 61 73 73 65 72 74 69 6f 6e 20  .  ** assertion 
189d0 74 68 61 74 20 74 68 65 20 74 72 61 6e 73 61 63  that the transac
189e0 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61 73  tion counter was
189f0 20 6d 6f 64 69 66 69 65 64 2e 0a 20 20 2a 2f 0a   modified..  */.
18a00 20 20 61 73 73 65 72 74 28 0a 20 20 20 20 70 50    assert(.    pP
18a10 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f  ager->fd->pMetho
18a20 64 73 3d 3d 30 20 7c 7c 0a 20 20 20 20 73 71 6c  ds==0 ||.    sql
18a30 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f  ite3OsFileContro
18a40 6c 28 70 50 61 67 65 72 2d 3e 66 64 2c 53 51 4c  l(pPager->fd,SQL
18a50 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43  ITE_FCNTL_DB_UNC
18a60 48 41 4e 47 45 44 2c 30 29 3e 3d 53 51 4c 49 54  HANGED,0)>=SQLIT
18a70 45 5f 4f 4b 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20  E_OK.  );..  /* 
18a80 49 66 20 74 68 69 73 20 70 6c 61 79 62 61 63 6b  If this playback
18a90 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20 61 75   is happening au
18aa0 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 61  tomatically as a
18ab0 20 72 65 73 75 6c 74 20 6f 66 20 61 6e 20 49 4f   result of an IO
18ac0 20 6f 72 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63   or .  ** malloc
18ad0 20 65 72 72 6f 72 20 74 68 61 74 20 6f 63 63 75   error that occu
18ae0 72 72 65 64 20 61 66 74 65 72 20 74 68 65 20 63  rred after the c
18af0 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 77 61  hange-counter wa
18b00 73 20 75 70 64 61 74 65 64 20 62 75 74 20 0a 20  s updated but . 
18b10 20 2a 2a 20 62 65 66 6f 72 65 20 74 68 65 20 74   ** before the t
18b20 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 63  ransaction was c
18b30 6f 6d 6d 69 74 74 65 64 2c 20 74 68 65 6e 20 74  ommitted, then t
18b40 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
18b50 72 20 0a 20 20 2a 2a 20 6d 6f 64 69 66 69 63 61  r .  ** modifica
18b60 74 69 6f 6e 20 6d 61 79 20 6a 75 73 74 20 68 61  tion may just ha
18b70 76 65 20 62 65 65 6e 20 72 65 76 65 72 74 65 64  ve been reverted
18b80 2e 20 49 66 20 74 68 69 73 20 68 61 70 70 65 6e  . If this happen
18b90 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 0a  s in exclusive .
18ba0 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 6e 20    ** mode, then 
18bb0 73 75 62 73 65 71 75 65 6e 74 20 74 72 61 6e 73  subsequent trans
18bc0 61 63 74 69 6f 6e 73 20 70 65 72 66 6f 72 6d 65  actions performe
18bd0 64 20 62 79 20 74 68 65 20 63 6f 6e 6e 65 63 74  d by the connect
18be0 69 6f 6e 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 2a  ion will not.  *
18bf0 2a 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61  * update the cha
18c00 6e 67 65 2d 63 6f 75 6e 74 65 72 20 61 74 20 61  nge-counter at a
18c10 6c 6c 2e 20 54 68 69 73 20 6d 61 79 20 6c 65 61  ll. This may lea
18c20 64 20 74 6f 20 63 61 63 68 65 20 69 6e 63 6f 6e  d to cache incon
18c30 73 69 73 74 65 6e 63 79 0a 20 20 2a 2a 20 70 72  sistency.  ** pr
18c40 6f 62 6c 65 6d 73 20 66 6f 72 20 6f 74 68 65 72  oblems for other
18c50 20 70 72 6f 63 65 73 73 65 73 20 61 74 20 73 6f   processes at so
18c60 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20  me point in the 
18c70 66 75 74 75 72 65 2e 20 53 6f 2c 20 6a 75 73 74  future. So, just
18c80 0a 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 74 68  .  ** in case th
18c90 69 73 20 68 61 73 20 68 61 70 70 65 6e 65 64 2c  is has happened,
18ca0 20 63 6c 65 61 72 20 74 68 65 20 63 68 61 6e 67   clear the chang
18cb0 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20  eCountDone flag 
18cc0 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67  now..  */.  pPag
18cd0 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
18ce0 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65  one = pPager->te
18cf0 6d 70 46 69 6c 65 3b 0a 0a 20 20 69 66 28 20 72  mpFile;..  if( r
18d00 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
18d10 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 70 50      zMaster = pP
18d20 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
18d30 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61  .    rc = readMa
18d40 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67  sterJournal(pPag
18d50 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72  er->jfd, zMaster
18d60 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e  , pPager->pVfs->
18d70 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20  mxPathname+1);. 
18d80 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21     testcase( rc!
18d90 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
18da0 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
18db0 54 45 5f 4f 4b 20 26 26 20 21 70 50 61 67 65 72  TE_OK && !pPager
18dc0 2d 3e 6e 6f 53 79 6e 63 20 26 26 20 70 50 61 67  ->noSync && pPag
18dd0 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
18de0 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 29  R_WRITER_DBMOD )
18df0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
18e00 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
18e10 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e  >fd, pPager->syn
18e20 63 5f 66 6c 61 67 73 29 3b 0a 20 20 7d 0a 20 20  c_flags);.  }.  
18e30 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
18e40 4b 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f  K && !pPager->no
18e50 53 79 6e 63 20 26 26 20 70 50 61 67 65 72 2d 3e  Sync && pPager->
18e60 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52  eState>=PAGER_WR
18e70 49 54 45 52 5f 44 42 4d 4f 44 20 29 7b 0a 20 20  ITER_DBMOD ){.  
18e80 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
18e90 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 66 64 2c  Sync(pPager->fd,
18ea0 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c   pPager->sync_fl
18eb0 61 67 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ags);.  }.  if( 
18ec0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
18ed0 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
18ee0 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
18ef0 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 5b  pPager, zMaster[
18f00 30 5d 21 3d 27 5c 30 27 29 3b 0a 20 20 20 20 74  0]!='\0');.    t
18f10 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c  estcase( rc!=SQL
18f20 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20  ITE_OK );.  }.  
18f30 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
18f40 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20  K && zMaster[0] 
18f50 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20 2f 2a  && res ){.    /*
18f60 20 49 66 20 74 68 65 72 65 20 77 61 73 20 61 20   If there was a 
18f70 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61  master journal a
18f80 6e 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  nd this routine 
18f90 77 69 6c 6c 20 72 65 74 75 72 6e 20 73 75 63 63  will return succ
18fa0 65 73 73 2c 0a 20 20 20 20 2a 2a 20 73 65 65 20  ess,.    ** see 
18fb0 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c  if it is possibl
18fc0 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20  e to delete the 
18fd0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a  master journal..
18fe0 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
18ff0 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28  pager_delmaster(
19000 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 29  pPager, zMaster)
19010 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
19020 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
19030 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 50  .  }..  /* The P
19040 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20  ager.sectorSize 
19050 76 61 72 69 61 62 6c 65 20 6d 61 79 20 68 61 76  variable may hav
19060 65 20 62 65 65 6e 20 75 70 64 61 74 65 64 20 77  e been updated w
19070 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a  hile rolling.  *
19080 2a 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c  * back a journal
19090 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72   created by a pr
190a0 6f 63 65 73 73 20 77 69 74 68 20 61 20 64 69 66  ocess with a dif
190b0 66 65 72 65 6e 74 20 73 65 63 74 6f 72 20 73 69  ferent sector si
190c0 7a 65 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 52  ze.  ** value. R
190d0 65 73 65 74 20 69 74 20 74 6f 20 74 68 65 20 63  eset it to the c
190e0 6f 72 72 65 63 74 20 76 61 6c 75 65 20 66 6f 72  orrect value for
190f0 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e 0a 20   this process.. 
19100 20 2a 2f 0a 20 20 73 65 74 53 65 63 74 6f 72 53   */.  setSectorS
19110 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72  ize(pPager);.  r
19120 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
19130 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 63 6f 6e  .** Read the con
19140 74 65 6e 74 20 66 6f 72 20 70 61 67 65 20 70 50  tent for page pP
19150 67 20 6f 75 74 20 6f 66 20 74 68 65 20 64 61 74  g out of the dat
19160 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 69  abase file and i
19170 6e 74 6f 20 0a 2a 2a 20 70 50 67 2d 3e 70 44 61  nto .** pPg->pDa
19180 74 61 2e 20 41 20 73 68 61 72 65 64 20 6c 6f 63  ta. A shared loc
19190 6b 20 6f 72 20 67 72 65 61 74 65 72 20 6d 75 73  k or greater mus
191a0 74 20 62 65 20 68 65 6c 64 20 6f 6e 20 74 68 65  t be held on the
191b0 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c   database.** fil
191c0 65 20 62 65 66 6f 72 65 20 74 68 69 73 20 66 75  e before this fu
191d0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
191e0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20  ..**.** If page 
191f0 31 20 69 73 20 72 65 61 64 2c 20 74 68 65 6e 20  1 is read, then 
19200 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61 67  the value of Pag
19210 65 72 2e 64 62 46 69 6c 65 56 65 72 73 5b 5d 20  er.dbFileVers[] 
19220 69 73 20 73 65 74 20 74 6f 0a 2a 2a 20 74 68 65  is set to.** the
19230 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d   value read from
19240 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
19250 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  le..**.** If an 
19260 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  IO error occurs,
19270 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72   then the IO err
19280 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 74  or is returned t
19290 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a  o the caller..**
192a0 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49   Otherwise, SQLI
192b0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
192c0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
192d0 20 72 65 61 64 44 62 50 61 67 65 28 50 67 48 64   readDbPage(PgHd
192e0 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  r *pPg){.  Pager
192f0 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
19300 70 50 61 67 65 72 3b 20 2f 2a 20 50 61 67 65 72  pPager; /* Pager
19310 20 6f 62 6a 65 63 74 20 61 73 73 6f 63 69 61 74   object associat
19320 65 64 20 77 69 74 68 20 70 61 67 65 20 70 50 67  ed with page pPg
19330 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20   */.  Pgno pgno 
19340 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 20 20 20 20  = pPg->pgno;    
19350 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
19360 72 20 74 6f 20 72 65 61 64 20 2a 2f 0a 20 20 69  r to read */.  i
19370 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
19380 4b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  K;          /* R
19390 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
193a0 69 6e 74 20 69 73 49 6e 57 61 6c 20 3d 20 30 3b  int isInWal = 0;
193b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
193c0 54 72 75 65 20 69 66 20 70 61 67 65 20 69 73 20  True if page is 
193d0 69 6e 20 6c 6f 67 20 66 69 6c 65 20 2a 2f 0a 20  in log file */. 
193e0 20 69 6e 74 20 70 67 73 7a 20 3d 20 70 50 61 67   int pgsz = pPag
193f0 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20 2f 2a  er->pageSize; /*
19400 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
19410 20 74 6f 20 72 65 61 64 20 2a 2f 0a 0a 20 20 61   to read */..  a
19420 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
19430 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41  State>=PAGER_REA
19440 44 45 52 20 26 26 20 21 4d 45 4d 44 42 20 29 3b  DER && !MEMDB );
19450 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
19460 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b  n(pPager->fd) );
19470 0a 0a 20 20 69 66 28 20 4e 45 56 45 52 28 21 69  ..  if( NEVER(!i
19480 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
19490 29 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  )) ){.    assert
194a0 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  ( pPager->tempFi
194b0 6c 65 20 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74  le );.    memset
194c0 28 70 50 67 2d 3e 70 44 61 74 61 2c 20 30 2c 20  (pPg->pData, 0, 
194d0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
194e0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
194f0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
19500 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  if( pagerUseWal(
19510 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 2f  pPager) ){.    /
19520 2a 20 54 72 79 20 74 6f 20 70 75 6c 6c 20 74 68  * Try to pull th
19530 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  e page from the 
19540 77 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 2e  write-ahead log.
19550 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
19560 69 74 65 33 57 61 6c 52 65 61 64 28 70 50 61 67  ite3WalRead(pPag
19570 65 72 2d 3e 70 57 61 6c 2c 20 70 67 6e 6f 2c 20  er->pWal, pgno, 
19580 26 69 73 49 6e 57 61 6c 2c 20 70 67 73 7a 2c 20  &isInWal, pgsz, 
19590 70 50 67 2d 3e 70 44 61 74 61 29 3b 0a 20 20 7d  pPg->pData);.  }
195a0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
195b0 45 5f 4f 4b 20 26 26 20 21 69 73 49 6e 57 61 6c  E_OK && !isInWal
195c0 20 29 7b 0a 20 20 20 20 69 36 34 20 69 4f 66 66   ){.    i64 iOff
195d0 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28  set = (pgno-1)*(
195e0 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65  i64)pPager->page
195f0 53 69 7a 65 3b 0a 20 20 20 20 72 63 20 3d 20 73  Size;.    rc = s
19600 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61  qlite3OsRead(pPa
19610 67 65 72 2d 3e 66 64 2c 20 70 50 67 2d 3e 70 44  ger->fd, pPg->pD
19620 61 74 61 2c 20 70 67 73 7a 2c 20 69 4f 66 66 73  ata, pgsz, iOffs
19630 65 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  et);.    if( rc=
19640 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  =SQLITE_IOERR_SH
19650 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20  ORT_READ ){.    
19660 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
19670 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
19680 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20  f( pgno==1 ){.  
19690 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
196a0 20 20 2f 2a 20 49 66 20 74 68 65 20 72 65 61 64    /* If the read
196b0 20 69 73 20 75 6e 73 75 63 63 65 73 73 66 75 6c   is unsuccessful
196c0 2c 20 73 65 74 20 74 68 65 20 64 62 46 69 6c 65  , set the dbFile
196d0 56 65 72 73 5b 5d 20 74 6f 20 73 6f 6d 65 74 68  Vers[] to someth
196e0 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74 68 61  ing.      ** tha
196f0 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20  t will never be 
19700 61 20 76 61 6c 69 64 20 66 69 6c 65 20 76 65 72  a valid file ver
19710 73 69 6f 6e 2e 20 20 64 62 46 69 6c 65 56 65 72  sion.  dbFileVer
19720 73 5b 5d 20 69 73 20 61 20 63 6f 70 79 0a 20 20  s[] is a copy.  
19730 20 20 20 20 2a 2a 20 6f 66 20 62 79 74 65 73 20      ** of bytes 
19740 32 34 2e 2e 33 39 20 6f 66 20 74 68 65 20 64 61  24..39 of the da
19750 74 61 62 61 73 65 2e 20 20 42 79 74 65 73 20 32  tabase.  Bytes 2
19760 38 2e 2e 33 31 20 73 68 6f 75 6c 64 20 61 6c 77  8..31 should alw
19770 61 79 73 20 62 65 0a 20 20 20 20 20 20 2a 2a 20  ays be.      ** 
19780 7a 65 72 6f 20 6f 72 20 74 68 65 20 73 69 7a 65  zero or the size
19790 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
197a0 20 69 6e 20 70 61 67 65 2e 20 42 79 74 65 73 20   in page. Bytes 
197b0 33 32 2e 2e 33 35 20 61 6e 64 20 33 35 2e 2e 33  32..35 and 35..3
197c0 39 0a 20 20 20 20 20 20 2a 2a 20 73 68 6f 75 6c  9.      ** shoul
197d0 64 20 62 65 20 70 61 67 65 20 6e 75 6d 62 65 72  d be page number
197e0 73 20 77 68 69 63 68 20 61 72 65 20 6e 65 76 65  s which are neve
197f0 72 20 30 78 66 66 66 66 66 66 66 66 2e 20 20 53  r 0xffffffff.  S
19800 6f 20 66 69 6c 6c 69 6e 67 0a 20 20 20 20 20 20  o filling.      
19810 2a 2a 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  ** pPager->dbFil
19820 65 56 65 72 73 5b 5d 20 77 69 74 68 20 61 6c 6c  eVers[] with all
19830 20 30 78 66 66 20 62 79 74 65 73 20 73 68 6f 75   0xff bytes shou
19840 6c 64 20 73 75 66 66 69 63 65 2e 0a 20 20 20 20  ld suffice..    
19850 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f    **.      ** Fo
19860 72 20 61 6e 20 65 6e 63 72 79 70 74 65 64 20 64  r an encrypted d
19870 61 74 61 62 61 73 65 2c 20 74 68 65 20 73 69 74  atabase, the sit
19880 75 61 74 69 6f 6e 20 69 73 20 6d 6f 72 65 20 63  uation is more c
19890 6f 6d 70 6c 65 78 3a 20 20 62 79 74 65 73 0a 20  omplex:  bytes. 
198a0 20 20 20 20 20 2a 2a 20 32 34 2e 2e 33 39 20 6f       ** 24..39 o
198b0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  f the database a
198c0 72 65 20 77 68 69 74 65 20 6e 6f 69 73 65 2e 20  re white noise. 
198d0 20 42 75 74 20 74 68 65 20 70 72 6f 62 61 62 69   But the probabi
198e0 6c 69 74 79 20 6f 66 0a 20 20 20 20 20 20 2a 2a  lity of.      **
198f0 20 77 68 69 74 65 20 6e 6f 69 73 69 6e 67 20 65   white noising e
19900 71 75 61 6c 69 6e 67 20 31 36 20 62 79 74 65 73  qualing 16 bytes
19910 20 6f 66 20 30 78 66 66 20 69 73 20 76 61 6e 69   of 0xff is vani
19920 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20 73 6f  shingly small so
19930 0a 20 20 20 20 20 20 2a 2a 20 77 65 20 73 68 6f  .      ** we sho
19940 75 6c 64 20 73 74 69 6c 6c 20 62 65 20 6f 6b 2e  uld still be ok.
19950 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
19960 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e 64  memset(pPager->d
19970 62 46 69 6c 65 56 65 72 73 2c 20 30 78 66 66 2c  bFileVers, 0xff,
19980 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e   sizeof(pPager->
19990 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20  dbFileVers));.  
199a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75    }else{.      u
199b0 38 20 2a 64 62 46 69 6c 65 56 65 72 73 20 3d 20  8 *dbFileVers = 
199c0 26 28 28 75 38 2a 29 70 50 67 2d 3e 70 44 61 74  &((u8*)pPg->pDat
199d0 61 29 5b 32 34 5d 3b 0a 20 20 20 20 20 20 6d 65  a)[24];.      me
199e0 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62  mcpy(&pPager->db
199f0 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c 65  FileVers, dbFile
19a00 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 70 50 61  Vers, sizeof(pPa
19a10 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29  ger->dbFileVers)
19a20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 43  );.    }.  }.  C
19a30 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 70 50  ODEC1(pPager, pP
19a40 67 2d 3e 70 44 61 74 61 2c 20 70 67 6e 6f 2c 20  g->pData, pgno, 
19a50 33 2c 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  3, rc = SQLITE_N
19a60 4f 4d 45 4d 29 3b 0a 0a 20 20 50 41 47 45 52 5f  OMEM);..  PAGER_
19a70 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67  INCR(sqlite3_pag
19a80 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 29  er_readdb_count)
19a90 3b 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70  ;.  PAGER_INCR(p
19aa0 50 61 67 65 72 2d 3e 6e 52 65 61 64 29 3b 0a 20  Pager->nRead);. 
19ab0 20 49 4f 54 52 41 43 45 28 28 22 50 47 49 4e 20   IOTRACE(("PGIN 
19ac0 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
19ad0 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 50 41 47 45  , pgno));.  PAGE
19ae0 52 54 52 41 43 45 28 28 22 46 45 54 43 48 20 25  RTRACE(("FETCH %
19af0 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28 25  d page %d hash(%
19b00 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20  08x)\n",.       
19b10 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28          PAGERID(
19b20 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70  pPager), pgno, p
19b30 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
19b40 67 29 29 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  g)));..  return 
19b50 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  rc;.}..#ifndef S
19b60 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f  QLITE_OMIT_WAL./
19b70 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
19b80 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e  on is invoked on
19b90 63 65 20 66 6f 72 20 65 61 63 68 20 70 61 67 65  ce for each page
19ba0 20 74 68 61 74 20 68 61 73 20 61 6c 72 65 61 64   that has alread
19bb0 79 20 62 65 65 6e 20 0a 2a 2a 20 77 72 69 74 74  y been .** writt
19bc0 65 6e 20 69 6e 74 6f 20 74 68 65 20 6c 6f 67 20  en into the log 
19bd0 66 69 6c 65 20 77 68 65 6e 20 61 20 57 41 4c 20  file when a WAL 
19be0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
19bf0 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 50  olled back..** P
19c00 61 72 61 6d 65 74 65 72 20 69 50 67 20 69 73 20  arameter iPg is 
19c10 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
19c20 6f 66 20 73 61 69 64 20 70 61 67 65 2e 20 54 68  of said page. Th
19c30 65 20 70 43 74 78 20 61 72 67 75 6d 65 6e 74 20  e pCtx argument 
19c40 0a 2a 2a 20 69 73 20 61 63 74 75 61 6c 6c 79 20  .** is actually 
19c50 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
19c60 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
19c70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20  ..**.** If page 
19c80 69 50 67 20 69 73 20 70 72 65 73 65 6e 74 20 69  iPg is present i
19c90 6e 20 74 68 65 20 63 61 63 68 65 2c 20 61 6e 64  n the cache, and
19ca0 20 68 61 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64   has no outstand
19cb0 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2c 0a  ing references,.
19cc0 2a 2a 20 69 74 20 69 73 20 64 69 73 63 61 72 64  ** it is discard
19cd0 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ed. Otherwise, i
19ce0 66 20 74 68 65 72 65 20 61 72 65 20 6f 6e 65 20  f there are one 
19cf0 6f 72 20 6d 6f 72 65 20 6f 75 74 73 74 61 6e 64  or more outstand
19d00 69 6e 67 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65  ing.** reference
19d10 73 2c 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74  s, the page cont
19d20 65 6e 74 20 69 73 20 72 65 6c 6f 61 64 65 64 20  ent is reloaded 
19d30 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
19d40 65 2e 20 49 66 20 74 68 65 0a 2a 2a 20 61 74 74  e. If the.** att
19d50 65 6d 70 74 20 74 6f 20 72 65 6c 6f 61 64 20 63  empt to reload c
19d60 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20  ontent from the 
19d70 64 61 74 61 62 61 73 65 20 69 73 20 72 65 71 75  database is requ
19d80 69 72 65 64 20 61 6e 64 20 66 61 69 6c 73 2c 20  ired and fails, 
19d90 0a 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20 53 51  .** return an SQ
19da0 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  Lite error code.
19db0 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49   Otherwise, SQLI
19dc0 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63  TE_OK..*/.static
19dd0 20 69 6e 74 20 70 61 67 65 72 55 6e 64 6f 43 61   int pagerUndoCa
19de0 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70 43 74  llback(void *pCt
19df0 78 2c 20 50 67 6e 6f 20 69 50 67 29 7b 0a 20 20  x, Pgno iPg){.  
19e00 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
19e10 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  OK;.  Pager *pPa
19e20 67 65 72 20 3d 20 28 50 61 67 65 72 20 2a 29 70  ger = (Pager *)p
19e30 43 74 78 3b 0a 20 20 50 67 48 64 72 20 2a 70 50  Ctx;.  PgHdr *pP
19e40 67 3b 0a 0a 20 20 70 50 67 20 3d 20 73 71 6c 69  g;..  pPg = sqli
19e50 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70  te3PagerLookup(p
19e60 50 61 67 65 72 2c 20 69 50 67 29 3b 0a 20 20 69  Pager, iPg);.  i
19e70 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 69 66  f( pPg ){.    if
19e80 28 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 50  ( sqlite3PcacheP
19e90 61 67 65 52 65 66 63 6f 75 6e 74 28 70 50 67 29  ageRefcount(pPg)
19ea0 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==1 ){.      sql
19eb0 69 74 65 33 50 63 61 63 68 65 44 72 6f 70 28 70  ite3PcacheDrop(p
19ec0 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  Pg);.    }else{.
19ed0 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 44        rc = readD
19ee0 62 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20  bPage(pPg);.    
19ef0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
19f00 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
19f10 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72  Pager->xReiniter
19f20 28 70 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  (pPg);.      }. 
19f30 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
19f40 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 20  rUnref(pPg);.   
19f50 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72   }.  }..  /* Nor
19f60 6d 61 6c 6c 79 2c 20 69 66 20 61 20 74 72 61 6e  mally, if a tran
19f70 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
19f80 64 20 62 61 63 6b 2c 20 61 6e 79 20 62 61 63 6b  d back, any back
19f90 75 70 20 70 72 6f 63 65 73 73 65 73 20 61 72 65  up processes are
19fa0 0a 20 20 2a 2a 20 75 70 64 61 74 65 64 20 61 73  .  ** updated as
19fb0 20 64 61 74 61 20 69 73 20 63 6f 70 69 65 64 20   data is copied 
19fc0 6f 75 74 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62  out of the rollb
19fd0 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  ack journal and 
19fe0 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61  into the.  ** da
19ff0 74 61 62 61 73 65 2e 20 54 68 69 73 20 69 73 20  tabase. This is 
1a000 6e 6f 74 20 67 65 6e 65 72 61 6c 6c 79 20 70 6f  not generally po
1a010 73 73 69 62 6c 65 20 77 69 74 68 20 61 20 57 41  ssible with a WA
1a020 4c 20 64 61 74 61 62 61 73 65 2c 20 61 73 0a 20  L database, as. 
1a030 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 69 6e 76   ** rollback inv
1a040 6f 6c 76 65 73 20 73 69 6d 70 6c 79 20 74 72 75  olves simply tru
1a050 6e 63 61 74 69 6e 67 20 74 68 65 20 6c 6f 67 20  ncating the log 
1a060 66 69 6c 65 2e 20 54 68 65 72 65 66 6f 72 65 2c  file. Therefore,
1a070 20 69 66 20 6f 6e 65 0a 20 20 2a 2a 20 6f 72 20   if one.  ** or 
1a080 6d 6f 72 65 20 66 72 61 6d 65 73 20 68 61 76 65  more frames have
1a090 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72   already been wr
1a0a0 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6c 6f 67  itten to the log
1a0b0 20 28 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20   (and therefore 
1a0c0 0a 20 20 2a 2a 20 61 6c 73 6f 20 63 6f 70 69 65  .  ** also copie
1a0d0 64 20 69 6e 74 6f 20 74 68 65 20 62 61 63 6b 75  d into the backu
1a0e0 70 20 64 61 74 61 62 61 73 65 73 29 20 61 73 20  p databases) as 
1a0f0 70 61 72 74 20 6f 66 20 74 68 69 73 20 74 72 61  part of this tra
1a100 6e 73 61 63 74 69 6f 6e 2c 0a 20 20 2a 2a 20 74  nsaction,.  ** t
1a110 68 65 20 62 61 63 6b 75 70 73 20 6d 75 73 74 20  he backups must 
1a120 62 65 20 72 65 73 74 61 72 74 65 64 2e 0a 20 20  be restarted..  
1a130 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 61 63 6b  */.  sqlite3Back
1a140 75 70 52 65 73 74 61 72 74 28 70 50 61 67 65 72  upRestart(pPager
1a150 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 0a 20 20 72  ->pBackup);..  r
1a160 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1a170 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1a180 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 6f   is called to ro
1a190 6c 6c 62 61 63 6b 20 61 20 74 72 61 6e 73 61 63  llback a transac
1a1a0 74 69 6f 6e 20 6f 6e 20 61 20 57 41 4c 20 64 61  tion on a WAL da
1a1b0 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  tabase..*/.stati
1a1c0 63 20 69 6e 74 20 70 61 67 65 72 52 6f 6c 6c 62  c int pagerRollb
1a1d0 61 63 6b 57 61 6c 28 50 61 67 65 72 20 2a 70 50  ackWal(Pager *pP
1a1e0 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
1a1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a200 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
1a210 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 50 67 48  rn Code */.  PgH
1a220 64 72 20 2a 70 4c 69 73 74 3b 20 20 20 20 20 20  dr *pList;      
1a230 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a240 4c 69 73 74 20 6f 66 20 64 69 72 74 79 20 70 61  List of dirty pa
1a250 67 65 73 20 74 6f 20 72 65 76 65 72 74 20 2a 2f  ges to revert */
1a260 0a 0a 20 20 2f 2a 20 46 6f 72 20 61 6c 6c 20 70  ..  /* For all p
1a270 61 67 65 73 20 69 6e 20 74 68 65 20 63 61 63 68  ages in the cach
1a280 65 20 74 68 61 74 20 61 72 65 20 63 75 72 72 65  e that are curre
1a290 6e 74 6c 79 20 64 69 72 74 79 20 6f 72 20 68 61  ntly dirty or ha
1a2a0 76 65 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20  ve already.  ** 
1a2b0 62 65 65 6e 20 77 72 69 74 74 65 6e 20 28 62 75  been written (bu
1a2c0 74 20 6e 6f 74 20 63 6f 6d 6d 69 74 74 65 64 29  t not committed)
1a2d0 20 74 6f 20 74 68 65 20 6c 6f 67 20 66 69 6c 65   to the log file
1a2e0 2c 20 64 6f 20 6f 6e 65 20 6f 66 20 74 68 65 20  , do one of the 
1a2f0 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 3a  .  ** following:
1a300 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2b 20 44  .  **.  **   + D
1a310 69 73 63 61 72 64 20 74 68 65 20 63 61 63 68 65  iscard the cache
1a320 64 20 70 61 67 65 20 28 69 66 20 72 65 66 63 6f  d page (if refco
1a330 75 6e 74 3d 3d 30 29 2c 20 6f 72 0a 20 20 2a 2a  unt==0), or.  **
1a340 20 20 20 2b 20 52 65 6c 6f 61 64 20 70 61 67 65     + Reload page
1a350 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68   content from th
1a360 65 20 64 61 74 61 62 61 73 65 20 28 69 66 20 72  e database (if r
1a370 65 66 63 6f 75 6e 74 3e 30 29 2e 0a 20 20 2a 2f  efcount>0)..  */
1a380 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  .  pPager->dbSiz
1a390 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 4f 72  e = pPager->dbOr
1a3a0 69 67 53 69 7a 65 3b 0a 20 20 72 63 20 3d 20 73  igSize;.  rc = s
1a3b0 71 6c 69 74 65 33 57 61 6c 55 6e 64 6f 28 70 50  qlite3WalUndo(pP
1a3c0 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 61 67 65  ager->pWal, page
1a3d0 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 2c 20 28  rUndoCallback, (
1a3e0 76 6f 69 64 20 2a 29 70 50 61 67 65 72 29 3b 0a  void *)pPager);.
1a3f0 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
1a400 33 50 63 61 63 68 65 44 69 72 74 79 4c 69 73 74  3PcacheDirtyList
1a410 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
1a420 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 4c 69 73  );.  while( pLis
1a430 74 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  t && rc==SQLITE_
1a440 4f 4b 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20  OK ){.    PgHdr 
1a450 2a 70 4e 65 78 74 20 3d 20 70 4c 69 73 74 2d 3e  *pNext = pList->
1a460 70 44 69 72 74 79 3b 0a 20 20 20 20 72 63 20 3d  pDirty;.    rc =
1a470 20 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61   pagerUndoCallba
1a480 63 6b 28 28 76 6f 69 64 20 2a 29 70 50 61 67 65  ck((void *)pPage
1a490 72 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b  r, pList->pgno);
1a4a0 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4e 65  .    pList = pNe
1a4b0 78 74 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  xt;.  }..  retur
1a4c0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
1a4d0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1a4e0 61 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64  a wrapper around
1a4f0 20 73 71 6c 69 74 65 33 57 61 6c 46 72 61 6d 65   sqlite3WalFrame
1a500 73 28 29 2e 20 41 73 20 77 65 6c 6c 20 61 73 20  s(). As well as 
1a510 6c 6f 67 67 69 6e 67 0a 2a 2a 20 74 68 65 20 63  logging.** the c
1a520 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6c  ontents of the l
1a530 69 73 74 20 6f 66 20 70 61 67 65 73 20 68 65 61  ist of pages hea
1a540 64 65 64 20 62 79 20 70 4c 69 73 74 20 28 63 6f  ded by pList (co
1a550 6e 6e 65 63 74 65 64 20 62 79 20 70 44 69 72 74  nnected by pDirt
1a560 79 29 2c 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63  y),.** this func
1a570 74 69 6f 6e 20 6e 6f 74 69 66 69 65 73 20 61 6e  tion notifies an
1a580 79 20 61 63 74 69 76 65 20 62 61 63 6b 75 70 20  y active backup 
1a590 70 72 6f 63 65 73 73 65 73 20 74 68 61 74 20 74  processes that t
1a5a0 68 65 20 70 61 67 65 73 20 68 61 76 65 0a 2a 2a  he pages have.**
1a5b0 20 63 68 61 6e 67 65 64 2e 20 0a 2a 2f 20 0a 73   changed. .*/ .s
1a5c0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 57  tatic int pagerW
1a5d0 61 6c 46 72 61 6d 65 73 28 0a 20 20 50 61 67 65  alFrames(.  Page
1a5e0 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
1a5f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
1a600 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  ager object */. 
1a610 20 50 67 48 64 72 20 2a 70 4c 69 73 74 2c 20 20   PgHdr *pList,  
1a620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a630 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72 61 6d   /* List of fram
1a640 65 73 20 74 6f 20 6c 6f 67 20 2a 2f 0a 20 20 50  es to log */.  P
1a650 67 6e 6f 20 6e 54 72 75 6e 63 61 74 65 2c 20 20  gno nTruncate,  
1a660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a670 2a 20 44 61 74 61 62 61 73 65 20 73 69 7a 65 20  * Database size 
1a680 61 66 74 65 72 20 74 68 69 73 20 63 6f 6d 6d 69  after this commi
1a690 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d  t */.  int isCom
1a6a0 6d 69 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  mit,            
1a6b0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1a6c0 66 20 74 68 69 73 20 69 73 20 61 20 63 6f 6d 6d  f this is a comm
1a6d0 69 74 20 2a 2f 0a 20 20 69 6e 74 20 73 79 6e 63  it */.  int sync
1a6e0 5f 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20  _flags          
1a6f0 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
1a700 20 74 6f 20 70 61 73 73 20 74 6f 20 4f 73 53 79   to pass to OsSy
1a710 6e 63 28 29 20 28 6f 72 20 30 29 20 2a 2f 0a 29  nc() (or 0) */.)
1a720 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
1a730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a740 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
1a750 64 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  de */..  assert(
1a760 20 70 50 61 67 65 72 2d 3e 70 57 61 6c 20 29 3b   pPager->pWal );
1a770 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57  .  rc = sqlite3W
1a780 61 6c 46 72 61 6d 65 73 28 70 50 61 67 65 72 2d  alFrames(pPager-
1a790 3e 70 57 61 6c 2c 20 0a 20 20 20 20 20 20 70 50  >pWal, .      pP
1a7a0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
1a7b0 70 4c 69 73 74 2c 20 6e 54 72 75 6e 63 61 74 65  pList, nTruncate
1a7c0 2c 20 69 73 43 6f 6d 6d 69 74 2c 20 73 79 6e 63  , isCommit, sync
1a7d0 5f 66 6c 61 67 73 0a 20 20 29 3b 0a 20 20 69 66  _flags.  );.  if
1a7e0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1a7f0 26 26 20 70 50 61 67 65 72 2d 3e 70 42 61 63 6b  && pPager->pBack
1a800 75 70 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20  up ){.    PgHdr 
1a810 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 4c  *p;.    for(p=pL
1a820 69 73 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 44 69  ist; p; p=p->pDi
1a830 72 74 79 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  rty){.      sqli
1a840 74 65 33 42 61 63 6b 75 70 55 70 64 61 74 65 28  te3BackupUpdate(
1a850 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c  pPager->pBackup,
1a860 20 70 2d 3e 70 67 6e 6f 2c 20 28 75 38 20 2a 29   p->pgno, (u8 *)
1a870 70 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20 20 7d  p->pData);.    }
1a880 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1a890 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e  ;.}../*.** Begin
1a8a0 20 61 20 72 65 61 64 20 74 72 61 6e 73 61 63 74   a read transact
1a8b0 69 6f 6e 20 6f 6e 20 74 68 65 20 57 41 4c 2e 0a  ion on the WAL..
1a8c0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1a8d0 6e 65 20 75 73 65 64 20 74 6f 20 62 65 20 63 61  ne used to be ca
1a8e0 6c 6c 65 64 20 22 70 61 67 65 72 4f 70 65 6e 53  lled "pagerOpenS
1a8f0 6e 61 70 73 68 6f 74 28 29 22 20 62 65 63 61 75  napshot()" becau
1a900 73 65 20 69 74 20 65 73 73 65 6e 74 69 61 6c 6c  se it essentiall
1a910 79 0a 2a 2a 20 6d 61 6b 65 73 20 61 20 73 6e 61  y.** makes a sna
1a920 70 73 68 6f 74 20 6f 66 20 74 68 65 20 64 61 74  pshot of the dat
1a930 61 62 61 73 65 20 61 74 20 74 68 65 20 63 75 72  abase at the cur
1a940 72 65 6e 74 20 70 6f 69 6e 74 20 69 6e 20 74 69  rent point in ti
1a950 6d 65 20 61 6e 64 20 70 72 65 73 65 72 76 65 73  me and preserves
1a960 0a 2a 2a 20 74 68 61 74 20 73 6e 61 70 73 68 6f  .** that snapsho
1a970 74 20 66 6f 72 20 75 73 65 20 62 79 20 74 68 65  t for use by the
1a980 20 72 65 61 64 65 72 20 69 6e 20 73 70 69 74 65   reader in spite
1a990 20 6f 66 20 63 6f 6e 63 75 72 72 65 6e 74 6c 79   of concurrently
1a9a0 20 63 68 61 6e 67 65 73 20 62 79 0a 2a 2a 20 6f   changes by.** o
1a9b0 74 68 65 72 20 77 72 69 74 65 72 73 20 6f 72 20  ther writers or 
1a9c0 63 68 65 63 6b 70 6f 69 6e 74 65 72 73 2e 0a 2a  checkpointers..*
1a9d0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
1a9e0 65 72 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73  erBeginReadTrans
1a9f0 61 63 74 69 6f 6e 28 50 61 67 65 72 20 2a 70 50  action(Pager *pP
1aa00 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
1aa10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
1aa30 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
1aa40 20 63 68 61 6e 67 65 64 20 3d 20 30 3b 20 20 20   changed = 0;   
1aa50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1aa60 54 72 75 65 20 69 66 20 63 61 63 68 65 20 6d 75  True if cache mu
1aa70 73 74 20 62 65 20 72 65 73 65 74 20 2a 2f 0a 0a  st be reset */..
1aa80 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55    assert( pagerU
1aa90 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
1aaa0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1aab0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
1aac0 5f 4e 4f 4e 45 20 7c 7c 20 70 50 61 67 65 72 2d  _NONE || pPager-
1aad0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 53  >eState==PAGER_S
1aae0 48 41 52 45 44 20 29 3b 0a 0a 20 20 2f 2a 20 73  HARED );..  /* s
1aaf0 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65 61 64  qlite3WalEndRead
1ab00 54 72 61 6e 73 61 63 74 69 6f 6e 28 29 20 77 61  Transaction() wa
1ab10 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 66 6f 72  s not called for
1ab20 20 74 68 65 20 70 72 65 76 69 6f 75 73 0a 20 20   the previous.  
1ab30 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
1ab40 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45  n locking_mode=E
1ab50 58 43 4c 55 53 49 56 45 2e 20 20 53 6f 20 63 61  XCLUSIVE.  So ca
1ab60 6c 6c 20 69 74 20 6e 6f 77 2e 20 20 49 66 20 77  ll it now.  If w
1ab70 65 0a 20 20 2a 2a 20 61 72 65 20 69 6e 20 6c 6f  e.  ** are in lo
1ab80 63 6b 69 6e 67 5f 6d 6f 64 65 3d 4e 4f 52 4d 41  cking_mode=NORMA
1ab90 4c 20 61 6e 64 20 45 6e 64 52 65 61 64 28 29 20  L and EndRead() 
1aba0 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 63  was previously c
1abb0 61 6c 6c 65 64 2c 0a 20 20 2a 2a 20 74 68 65 20  alled,.  ** the 
1abc0 64 75 70 6c 69 63 61 74 65 20 63 61 6c 6c 20 69  duplicate call i
1abd0 73 20 68 61 72 6d 6c 65 73 73 2e 0a 20 20 2a 2f  s harmless..  */
1abe0 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 45 6e 64  .  sqlite3WalEnd
1abf0 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  ReadTransaction(
1ac00 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 0a  pPager->pWal);..
1ac10 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61    rc = sqlite3Wa
1ac20 6c 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61  lBeginReadTransa
1ac30 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57  ction(pPager->pW
1ac40 61 6c 2c 20 26 63 68 61 6e 67 65 64 29 3b 0a 20  al, &changed);. 
1ac50 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1ac60 4f 4b 20 26 26 20 63 68 61 6e 67 65 64 20 29 7b  OK && changed ){
1ac70 0a 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74  .    pager_reset
1ac80 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20  (pPager);.  }.. 
1ac90 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
1aca0 2f 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 44 65 73 63  /*.** TODO: Desc
1acb0 72 69 70 74 69 6f 6e 20 68 65 72 65 2e 0a 2a 2f  ription here..*/
1acc0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
1acd0 72 50 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72  rPagecount(Pager
1ace0 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 2a   *pPager, Pgno *
1acf0 70 6e 50 61 67 65 29 7b 0a 20 20 50 67 6e 6f 20  pnPage){.  Pgno 
1ad00 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  nPage;          
1ad10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
1ad20 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 76 69  lue to return vi
1ad30 61 20 2a 70 6e 50 61 67 65 20 2a 2f 0a 0a 20 20  a *pnPage */..  
1ad40 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1ad50 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4e 4f  eState==PAGER_NO
1ad60 4e 45 20 29 3b 0a 20 20 6e 50 61 67 65 20 3d 20  NE );.  nPage = 
1ad70 73 71 6c 69 74 65 33 57 61 6c 44 62 73 69 7a 65  sqlite3WalDbsize
1ad80 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a  (pPager->pWal);.
1ad90 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29    if( nPage==0 )
1ada0 7b 0a 20 20 20 20 69 36 34 20 6e 20 3d 20 30 3b  {.    i64 n = 0;
1adb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1adc0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64      /* Size of d
1add0 62 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20  b file in bytes 
1ade0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  */.    assert( i
1adf0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
1ae00 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d  ) || pPager->tem
1ae10 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 69 66 28  pFile );.    if(
1ae20 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
1ae30 66 64 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  fd) ){.      int
1ae40 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
1ae50 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
1ae60 66 64 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 69  fd, &n);.      i
1ae70 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1ae80 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
1ae90 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
1aea0 20 20 20 7d 0a 20 20 20 20 6e 50 61 67 65 20 3d     }.    nPage =
1aeb0 20 28 50 67 6e 6f 29 28 6e 20 2f 20 70 50 61 67   (Pgno)(n / pPag
1aec0 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
1aed0 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20     if( nPage==0 
1aee0 26 26 20 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20  && n>0 ){.      
1aef0 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20 20 20 7d  nPage = 1;.    }
1af00 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
1af10 65 20 63 75 72 72 65 6e 74 20 6e 75 6d 62 65 72  e current number
1af20 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
1af30 20 66 69 6c 65 20 69 73 20 67 72 65 61 74 65 72   file is greater
1af40 20 74 68 61 6e 20 74 68 65 20 0a 20 20 2a 2a 20   than the .  ** 
1af50 63 6f 6e 66 69 67 75 72 65 64 20 6d 61 78 69 6d  configured maxim
1af60 75 6d 20 70 61 67 65 72 20 6e 75 6d 62 65 72 2c  um pager number,
1af70 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 61 6c   increase the al
1af80 6c 6f 77 65 64 20 6c 69 6d 69 74 20 73 6f 0a 20  lowed limit so. 
1af90 20 2a 2a 20 74 68 61 74 20 74 68 65 20 66 69 6c   ** that the fil
1afa0 65 20 63 61 6e 20 62 65 20 72 65 61 64 2e 0a 20  e can be read.. 
1afb0 20 2a 2f 0a 20 20 69 66 28 20 6e 50 61 67 65 3e   */.  if( nPage>
1afc0 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29  pPager->mxPgno )
1afd0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78  {.    pPager->mx
1afe0 50 67 6e 6f 20 3d 20 28 50 67 6e 6f 29 6e 50 61  Pgno = (Pgno)nPa
1aff0 67 65 3b 0a 20 20 7d 0a 0a 20 20 2a 70 6e 50 61  ge;.  }..  *pnPa
1b000 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 72 65  ge = nPage;.  re
1b010 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1b020 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  }.../*.** Check 
1b030 69 66 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c  if the *-wal fil
1b040 65 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e  e that correspon
1b050 64 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ds to the databa
1b060 73 65 20 6f 70 65 6e 65 64 20 62 79 20 70 50 61  se opened by pPa
1b070 67 65 72 0a 2a 2a 20 65 78 69 73 74 73 20 69 66  ger.** exists if
1b080 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
1b090 20 6e 6f 74 20 65 6d 70 79 2c 20 6f 72 20 76 65   not empy, or ve
1b0a0 72 69 66 79 20 74 68 61 74 20 74 68 65 20 2a 2d  rify that the *-
1b0b0 77 61 6c 20 66 69 6c 65 20 64 6f 65 73 0a 2a 2a  wal file does.**
1b0c0 20 6e 6f 74 20 65 78 69 73 74 20 28 62 79 20 64   not exist (by d
1b0d0 65 6c 65 74 69 6e 67 20 69 74 29 20 69 66 20 74  eleting it) if t
1b0e0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1b0f0 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a   is empty..**.**
1b100 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
1b110 20 69 73 20 6e 6f 74 20 65 6d 70 74 79 20 61 6e   is not empty an
1b120 64 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65  d the *-wal file
1b130 20 65 78 69 73 74 73 2c 20 6f 70 65 6e 20 74 68   exists, open th
1b140 65 20 70 61 67 65 72 0a 2a 2a 20 69 6e 20 57 41  e pager.** in WA
1b150 4c 20 6d 6f 64 65 2e 20 20 49 66 20 74 68 65 20  L mode.  If the 
1b160 64 61 74 61 62 61 73 65 20 69 73 20 65 6d 70 74  database is empt
1b170 79 20 6f 72 20 69 66 20 6e 6f 20 2a 2d 77 61 6c  y or if no *-wal
1b180 20 66 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64   file exists and
1b190 0a 2a 2a 20 69 66 20 6e 6f 20 65 72 72 6f 72 20  .** if no error 
1b1a0 6f 63 63 75 72 73 2c 20 6d 61 6b 65 20 73 75 72  occurs, make sur
1b1b0 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d  e Pager.journalM
1b1c0 6f 64 65 20 69 73 20 6e 6f 74 20 73 65 74 20 74  ode is not set t
1b1d0 6f 0a 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e  o.** PAGER_JOURN
1b1e0 41 4c 4d 4f 44 45 5f 57 41 4c 2e 0a 2a 2a 0a 2a  ALMODE_WAL..**.*
1b1f0 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
1b200 4f 4b 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63  OK or an error c
1b210 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ode..**.** If th
1b220 65 20 57 41 4c 20 66 69 6c 65 20 69 73 20 6f 70  e WAL file is op
1b230 65 6e 65 64 2c 20 61 6c 73 6f 20 6f 70 65 6e 20  ened, also open 
1b240 61 20 73 6e 61 70 73 68 6f 74 20 28 72 65 61 64  a snapshot (read
1b250 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a   transaction)..*
1b260 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20  *.** The caller 
1b270 6d 75 73 74 20 68 6f 6c 64 20 61 20 53 48 41 52  must hold a SHAR
1b280 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ED lock on the d
1b290 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
1b2a0 63 61 6c 6c 20 74 68 69 73 0a 2a 2a 20 66 75 6e  call this.** fun
1b2b0 63 74 69 6f 6e 2e 20 42 65 63 61 75 73 65 20 61  ction. Because a
1b2c0 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
1b2d0 20 6f 6e 20 74 68 65 20 64 62 20 66 69 6c 65 20   on the db file 
1b2e0 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 64  is required to d
1b2f0 65 6c 65 74 65 20 0a 2a 2a 20 61 20 57 41 4c 20  elete .** a WAL 
1b300 6f 6e 20 61 20 6e 6f 6e 65 2d 65 6d 70 74 79 20  on a none-empty 
1b310 64 61 74 61 62 61 73 65 2c 20 74 68 69 73 20 65  database, this e
1b320 6e 73 75 72 65 73 20 74 68 65 72 65 20 69 73 20  nsures there is 
1b330 6e 6f 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f  no race conditio
1b340 6e 20 0a 2a 2a 20 62 65 74 77 65 65 6e 20 74 68  n .** between th
1b350 65 20 78 41 63 63 65 73 73 28 29 20 62 65 6c 6f  e xAccess() belo
1b360 77 20 61 6e 64 20 61 6e 20 78 44 65 6c 65 74 65  w and an xDelete
1b370 28 29 20 62 65 69 6e 67 20 65 78 65 63 75 74 65  () being execute
1b380 64 20 62 79 20 73 6f 6d 65 20 0a 2a 2a 20 6f 74  d by some .** ot
1b390 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  her connection..
1b3a0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
1b3b0 67 65 72 4f 70 65 6e 57 61 6c 49 66 50 72 65 73  gerOpenWalIfPres
1b3c0 65 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  ent(Pager *pPage
1b3d0 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
1b3e0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
1b3f0 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
1b400 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 73 57  e ){.    int isW
1b410 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
1b420 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1b430 66 20 57 41 4c 20 66 69 6c 65 20 65 78 69 73 74  f WAL file exist
1b440 73 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 50  s */.    Pgno nP
1b450 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
1b460 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
1b470 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
1b480 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65  ile */..    asse
1b490 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
1b4a0 74 65 3d 3d 50 41 47 45 52 5f 4e 4f 4e 45 20 29  te==PAGER_NONE )
1b4b0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
1b4c0 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41  ager->eLock>=SHA
1b4d0 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 50 61 67  RED_LOCK || pPag
1b4e0 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 29  er->noReadlock )
1b4f0 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ;.    rc = pager
1b500 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
1b510 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 69  , &nPage);.    i
1b520 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
1b530 63 3b 0a 20 20 20 20 69 66 28 20 6e 50 61 67 65  c;.    if( nPage
1b540 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
1b550 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74  = sqlite3OsDelet
1b560 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20  e(pPager->pVfs, 
1b570 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 30 29  pPager->zWal, 0)
1b580 3b 0a 20 20 20 20 20 20 69 73 57 61 6c 20 3d 20  ;.      isWal = 
1b590 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
1b5a0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1b5b0 4f 73 41 63 63 65 73 73 28 0a 20 20 20 20 20 20  OsAccess(.      
1b5c0 20 20 20 20 70 50 61 67 65 72 2d 3e 70 56 66 73      pPager->pVfs
1b5d0 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20  , pPager->zWal, 
1b5e0 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
1b5f0 49 53 54 53 2c 20 26 69 73 57 61 6c 0a 20 20 20  ISTS, &isWal.   
1b600 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20     );.    }.    
1b610 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1b620 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  K ){.      if( i
1b630 73 57 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  sWal ){.        
1b640 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
1b650 63 61 63 68 65 50 61 67 65 63 6f 75 6e 74 28 70  cachePagecount(p
1b660 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d  Pager->pPCache)=
1b670 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63  =0 );.        rc
1b680 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f   = sqlite3PagerO
1b690 70 65 6e 57 61 6c 28 70 50 61 67 65 72 2c 20 30  penWal(pPager, 0
1b6a0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
1b6b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1b6c0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70            rc = p
1b6d0 61 67 65 72 42 65 67 69 6e 52 65 61 64 54 72 61  agerBeginReadTra
1b6e0 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 29  nsaction(pPager)
1b6f0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1b700 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67    }else if( pPag
1b710 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
1b720 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
1b730 44 45 5f 57 41 4c 20 29 7b 0a 20 20 20 20 20 20  DE_WAL ){.      
1b740 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
1b750 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f  lMode = PAGER_JO
1b760 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45  URNALMODE_DELETE
1b770 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1b780 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1b790 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
1b7a0 20 50 6c 61 79 62 61 63 6b 20 73 61 76 65 70 6f   Playback savepo
1b7b0 69 6e 74 20 70 53 61 76 65 70 6f 69 6e 74 2e 20  int pSavepoint. 
1b7c0 4f 72 2c 20 69 66 20 70 53 61 76 65 70 6f 69 6e  Or, if pSavepoin
1b7d0 74 3d 3d 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 6c  t==NULL, then pl
1b7e0 61 79 62 61 63 6b 0a 2a 2a 20 74 68 65 20 65 6e  ayback.** the en
1b7f0 74 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72  tire master jour
1b800 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 20 63 61  nal file. The ca
1b810 73 65 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e  se pSavepoint==N
1b820 55 4c 4c 20 6f 63 63 75 72 73 20 77 68 65 6e 20  ULL occurs when 
1b830 0a 2a 2a 20 61 20 52 4f 4c 4c 42 41 43 4b 20 54  .** a ROLLBACK T
1b840 4f 20 63 6f 6d 6d 61 6e 64 20 69 73 20 69 6e 76  O command is inv
1b850 6f 6b 65 64 20 6f 6e 20 61 20 53 41 56 45 50 4f  oked on a SAVEPO
1b860 49 4e 54 20 74 68 61 74 20 69 73 20 61 20 74 72  INT that is a tr
1b870 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 73 61  ansaction .** sa
1b880 76 65 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57  vepoint..**.** W
1b890 68 65 6e 20 70 53 61 76 65 70 6f 69 6e 74 20 69  hen pSavepoint i
1b8a0 73 20 6e 6f 74 20 4e 55 4c 4c 20 28 6d 65 61 6e  s not NULL (mean
1b8b0 69 6e 67 20 61 20 6e 6f 6e 2d 74 72 61 6e 73 61  ing a non-transa
1b8c0 63 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20  ction savepoint 
1b8d0 69 73 20 0a 2a 2a 20 62 65 69 6e 67 20 72 6f 6c  is .** being rol
1b8e0 6c 65 64 20 62 61 63 6b 29 2c 20 74 68 65 6e 20  led back), then 
1b8f0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 63 6f 6e  the rollback con
1b900 73 69 73 74 73 20 6f 66 20 75 70 20 74 6f 20 74  sists of up to t
1b910 68 72 65 65 20 73 74 61 67 65 73 2c 0a 2a 2a 20  hree stages,.** 
1b920 70 65 72 66 6f 72 6d 65 64 20 69 6e 20 74 68 65  performed in the
1b930 20 6f 72 64 65 72 20 73 70 65 63 69 66 69 65 64   order specified
1b940 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65  :.**.**   * Page
1b950 73 20 61 72 65 20 70 6c 61 79 65 64 20 62 61 63  s are played bac
1b960 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20  k from the main 
1b970 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67  journal starting
1b980 20 61 74 20 62 79 74 65 0a 2a 2a 20 20 20 20 20   at byte.**     
1b990 6f 66 66 73 65 74 20 50 61 67 65 72 53 61 76 65  offset PagerSave
1b9a0 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e  point.iOffset an
1b9b0 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20  d continuing to 
1b9c0 0a 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61 76  .**     PagerSav
1b9d0 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65  epoint.iHdrOffse
1b9e0 74 2c 20 6f 72 20 74 6f 20 74 68 65 20 65 6e 64  t, or to the end
1b9f0 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   of the main jou
1ba00 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65  rnal.**     file
1ba10 20 69 66 20 50 61 67 65 72 53 61 76 65 70 6f 69   if PagerSavepoi
1ba20 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73  nt.iHdrOffset is
1ba30 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a   zero..**.**   *
1ba40 20 49 66 20 50 61 67 65 72 53 61 76 65 70 6f 69   If PagerSavepoi
1ba50 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73  nt.iHdrOffset is
1ba60 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20   not zero, then 
1ba70 70 61 67 65 73 20 61 72 65 20 70 6c 61 79 65 64  pages are played
1ba80 0a 2a 2a 20 20 20 20 20 62 61 63 6b 20 73 74 61  .**     back sta
1ba90 72 74 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a  rting from the j
1baa0 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6d  ournal header im
1bab0 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77  mediately follow
1bac0 69 6e 67 20 0a 2a 2a 20 20 20 20 20 50 61 67 65  ing .**     Page
1bad0 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f  rSavepoint.iHdrO
1bae0 66 66 73 65 74 20 74 6f 20 74 68 65 20 65 6e 64  ffset to the end
1baf0 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   of the main jou
1bb00 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  rnal file..**.**
1bb10 20 20 20 2a 20 50 61 67 65 73 20 61 72 65 20 74     * Pages are t
1bb20 68 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 20  hen played back 
1bb30 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75  from the sub-jou
1bb40 72 6e 61 6c 20 66 69 6c 65 2c 20 73 74 61 72 74  rnal file, start
1bb50 69 6e 67 0a 2a 2a 20 20 20 20 20 77 69 74 68 20  ing.**     with 
1bb60 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69  the PagerSavepoi
1bb70 6e 74 2e 69 53 75 62 52 65 63 20 61 6e 64 20 63  nt.iSubRec and c
1bb80 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65  ontinuing to the
1bb90 20 65 6e 64 20 6f 66 0a 2a 2a 20 20 20 20 20 74   end of.**     t
1bba0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
1bbb0 0a 2a 2a 0a 2a 2a 20 54 68 72 6f 75 67 68 6f 75  .**.** Throughou
1bbc0 74 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 70  t the rollback p
1bbd0 72 6f 63 65 73 73 2c 20 65 61 63 68 20 74 69 6d  rocess, each tim
1bbe0 65 20 61 20 70 61 67 65 20 69 73 20 72 6f 6c 6c  e a page is roll
1bbf0 65 64 20 62 61 63 6b 2c 20 74 68 65 0a 2a 2a 20  ed back, the.** 
1bc00 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69  corresponding bi
1bc10 74 20 69 73 20 73 65 74 20 69 6e 20 61 20 62 69  t is set in a bi
1bc20 74 76 65 63 20 73 74 72 75 63 74 75 72 65 20 28  tvec structure (
1bc30 76 61 72 69 61 62 6c 65 20 70 44 6f 6e 65 20 69  variable pDone i
1bc40 6e 20 74 68 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65  n the.** impleme
1bc50 6e 74 61 74 69 6f 6e 20 62 65 6c 6f 77 29 2e 20  ntation below). 
1bc60 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20  This is used to 
1bc70 65 6e 73 75 72 65 20 74 68 61 74 20 61 20 70 61  ensure that a pa
1bc80 67 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 72 6f  ge is only.** ro
1bc90 6c 6c 65 64 20 62 61 63 6b 20 74 68 65 20 66 69  lled back the fi
1bca0 72 73 74 20 74 69 6d 65 20 69 74 20 69 73 20 65  rst time it is e
1bcb0 6e 63 6f 75 6e 74 65 72 65 64 20 69 6e 20 65 69  ncountered in ei
1bcc0 74 68 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a  ther journal..**
1bcd0 0a 2a 2a 20 49 66 20 70 53 61 76 65 70 6f 69 6e  .** If pSavepoin
1bce0 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  t is NULL, then 
1bcf0 70 61 67 65 73 20 61 72 65 20 6f 6e 6c 79 20 70  pages are only p
1bd00 6c 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20  layed back from 
1bd10 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72  the main.** jour
1bd20 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 72 65 20  nal file. There 
1bd30 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 61  is no need for a
1bd40 20 62 69 74 76 65 63 20 69 6e 20 74 68 69 73 20   bitvec in this 
1bd50 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 65  case..**.** In e
1bd60 69 74 68 65 72 20 63 61 73 65 2c 20 62 65 66 6f  ither case, befo
1bd70 72 65 20 70 6c 61 79 62 61 63 6b 20 63 6f 6d 6d  re playback comm
1bd80 65 6e 63 65 73 20 74 68 65 20 50 61 67 65 72 2e  ences the Pager.
1bd90 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65 0a  dbSize variable.
1bda0 2a 2a 20 69 73 20 72 65 73 65 74 20 74 6f 20 74  ** is reset to t
1bdb0 68 65 20 76 61 6c 75 65 20 74 68 61 74 20 69 74  he value that it
1bdc0 20 68 65 6c 64 20 61 74 20 74 68 65 20 73 74 61   held at the sta
1bdd0 72 74 20 6f 66 20 74 68 65 20 73 61 76 65 70 6f  rt of the savepo
1bde0 69 6e 74 20 0a 2a 2a 20 28 6f 72 20 74 72 61 6e  int .** (or tran
1bdf0 73 61 63 74 69 6f 6e 29 2e 20 4e 6f 20 70 61 67  saction). No pag
1be00 65 20 77 69 74 68 20 61 20 70 61 67 65 2d 6e 75  e with a page-nu
1be10 6d 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61  mber greater tha
1be20 6e 20 74 68 69 73 20 76 61 6c 75 65 0a 2a 2a 20  n this value.** 
1be30 69 73 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20  is played back. 
1be40 49 66 20 6f 6e 65 20 69 73 20 65 6e 63 6f 75 6e  If one is encoun
1be50 74 65 72 65 64 20 69 74 20 69 73 20 73 69 6d 70  tered it is simp
1be60 6c 79 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73  ly skipped..*/.s
1be70 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 50  tatic int pagerP
1be80 6c 61 79 62 61 63 6b 53 61 76 65 70 6f 69 6e 74  laybackSavepoint
1be90 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
1bea0 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a  PagerSavepoint *
1beb0 70 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69  pSavepoint){.  i
1bec0 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20  64 szJ;         
1bed0 20 20 20 20 20 20 20 20 2f 2a 20 45 66 66 65 63          /* Effec
1bee0 74 69 76 65 20 73 69 7a 65 20 6f 66 20 74 68 65  tive size of the
1bef0 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f   main journal */
1bf00 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20  .  i64 iHdrOff; 
1bf10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
1bf20 6e 64 20 6f 66 20 66 69 72 73 74 20 73 65 67 6d  nd of first segm
1bf30 65 6e 74 20 6f 66 20 6d 61 69 6e 2d 6a 6f 75 72  ent of main-jour
1bf40 6e 61 6c 20 72 65 63 6f 72 64 73 20 2a 2f 0a 20  nal records */. 
1bf50 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1bf60 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65 74  _OK;      /* Ret
1bf70 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 69  urn code */.  Bi
1bf80 74 76 65 63 20 2a 70 44 6f 6e 65 20 3d 20 30 3b  tvec *pDone = 0;
1bf90 20 20 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63         /* Bitvec
1bfa0 20 74 6f 20 65 6e 73 75 72 65 20 70 61 67 65 73   to ensure pages
1bfb0 20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 6e 6c   played back onl
1bfc0 79 20 6f 6e 63 65 20 2a 2f 0a 0a 20 20 61 73 73  y once */..  ass
1bfd0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
1bfe0 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate!=PAGER_ERROR
1bff0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
1c000 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
1c010 47 45 52 5f 57 52 49 54 45 52 5f 49 4e 49 54 49  GER_WRITER_INITI
1c020 41 4c 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  AL );..  /* Allo
1c030 63 61 74 65 20 61 20 62 69 74 76 65 63 20 74 6f  cate a bitvec to
1c040 20 75 73 65 20 74 6f 20 73 74 6f 72 65 20 74 68   use to store th
1c050 65 20 73 65 74 20 6f 66 20 70 61 67 65 73 20 72  e set of pages r
1c060 6f 6c 6c 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20  olled back */.  
1c070 69 66 28 20 70 53 61 76 65 70 6f 69 6e 74 20 29  if( pSavepoint )
1c080 7b 0a 20 20 20 20 70 44 6f 6e 65 20 3d 20 73 71  {.    pDone = sq
1c090 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74  lite3BitvecCreat
1c0a0 65 28 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f  e(pSavepoint->nO
1c0b0 72 69 67 29 3b 0a 20 20 20 20 69 66 28 20 21 70  rig);.    if( !p
1c0c0 44 6f 6e 65 20 29 7b 0a 20 20 20 20 20 20 72 65  Done ){.      re
1c0d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
1c0e0 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  M;.    }.  }..  
1c0f0 2f 2a 20 53 65 74 20 74 68 65 20 64 61 74 61 62  /* Set the datab
1c100 61 73 65 20 73 69 7a 65 20 62 61 63 6b 20 74 6f  ase size back to
1c110 20 74 68 65 20 76 61 6c 75 65 20 69 74 20 77 61   the value it wa
1c120 73 20 62 65 66 6f 72 65 20 74 68 65 20 73 61 76  s before the sav
1c130 65 70 6f 69 6e 74 20 0a 20 20 2a 2a 20 62 65 69  epoint .  ** bei
1c140 6e 67 20 72 65 76 65 72 74 65 64 20 77 61 73 20  ng reverted was 
1c150 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 70  opened..  */.  p
1c160 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
1c170 70 53 61 76 65 70 6f 69 6e 74 20 3f 20 70 53 61  pSavepoint ? pSa
1c180 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67 20 3a  vepoint->nOrig :
1c190 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
1c1a0 69 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63  ize;.  pPager->c
1c1b0 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
1c1c0 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
1c1d0 65 3b 0a 0a 20 20 69 66 28 20 21 70 53 61 76 65  e;..  if( !pSave
1c1e0 70 6f 69 6e 74 20 26 26 20 70 61 67 65 72 55 73  point && pagerUs
1c1f0 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
1c200 20 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72      return pager
1c210 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 70 50 61 67  RollbackWal(pPag
1c220 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55  er);.  }..  /* U
1c230 73 65 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  se pPager->journ
1c240 61 6c 4f 66 66 20 61 73 20 74 68 65 20 65 66 66  alOff as the eff
1c250 65 63 74 69 76 65 20 73 69 7a 65 20 6f 66 20 74  ective size of t
1c260 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b  he main rollback
1c270 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20  .  ** journal.  
1c280 54 68 65 20 61 63 74 75 61 6c 20 66 69 6c 65 20  The actual file 
1c290 6d 69 67 68 74 20 62 65 20 6c 61 72 67 65 72 20  might be larger 
1c2a0 74 68 61 6e 20 74 68 69 73 20 69 6e 0a 20 20 2a  than this in.  *
1c2b0 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  * PAGER_JOURNALM
1c2c0 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 6f 72 20  ODE_TRUNCATE or 
1c2d0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
1c2e0 45 5f 50 45 52 53 49 53 54 2e 20 20 42 75 74 20  E_PERSIST.  But 
1c2f0 61 6e 79 74 68 69 6e 67 0a 20 20 2a 2a 20 70 61  anything.  ** pa
1c300 73 74 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  st pPager->journ
1c310 61 6c 4f 66 66 20 69 73 20 6f 66 66 2d 6c 69 6d  alOff is off-lim
1c320 69 74 73 20 74 6f 20 75 73 2e 0a 20 20 2a 2f 0a  its to us..  */.
1c330 20 20 73 7a 4a 20 3d 20 70 50 61 67 65 72 2d 3e    szJ = pPager->
1c340 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 61 73  journalOff;.  as
1c350 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61  sert( pagerUseWa
1c360 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 7c 7c 20  l(pPager)==0 || 
1c370 73 7a 4a 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  szJ==0 );..  /* 
1c380 42 65 67 69 6e 20 62 79 20 72 6f 6c 6c 69 6e 67  Begin by rolling
1c390 20 62 61 63 6b 20 72 65 63 6f 72 64 73 20 66 72   back records fr
1c3a0 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  om the main jour
1c3b0 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74 0a  nal starting at.
1c3c0 20 20 2a 2a 20 50 61 67 65 72 53 61 76 65 70 6f    ** PagerSavepo
1c3d0 69 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e 64 20  int.iOffset and 
1c3e0 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74 68  continuing to th
1c3f0 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68  e next journal h
1c400 65 61 64 65 72 2e 0a 20 20 2a 2a 20 54 68 65 72  eader..  ** Ther
1c410 65 20 6d 69 67 68 74 20 62 65 20 72 65 63 6f 72  e might be recor
1c420 64 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a  ds in the main j
1c430 6f 75 72 6e 61 6c 20 74 68 61 74 20 68 61 76 65  ournal that have
1c440 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20   a page number. 
1c450 20 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e   ** greater than
1c460 20 74 68 65 20 63 75 72 72 65 6e 74 20 64 61 74   the current dat
1c470 61 62 61 73 65 20 73 69 7a 65 20 28 70 50 61 67  abase size (pPag
1c480 65 72 2d 3e 64 62 53 69 7a 65 29 20 62 75 74 20  er->dbSize) but 
1c490 74 68 6f 73 65 0a 20 20 2a 2a 20 77 69 6c 6c 20  those.  ** will 
1c4a0 62 65 20 73 6b 69 70 70 65 64 20 61 75 74 6f 6d  be skipped autom
1c4b0 61 74 69 63 61 6c 6c 79 2e 20 20 50 61 67 65 73  atically.  Pages
1c4c0 20 61 72 65 20 61 64 64 65 64 20 74 6f 20 70 44   are added to pD
1c4d0 6f 6e 65 20 61 73 20 74 68 65 79 0a 20 20 2a 2a  one as they.  **
1c4e0 20 61 72 65 20 70 6c 61 79 65 64 20 62 61 63 6b   are played back
1c4f0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 61  ..  */.  if( pSa
1c500 76 65 70 6f 69 6e 74 20 26 26 20 21 70 61 67 65  vepoint && !page
1c510 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
1c520 29 7b 0a 20 20 20 20 69 48 64 72 4f 66 66 20 3d  ){.    iHdrOff =
1c530 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64   pSavepoint->iHd
1c540 72 4f 66 66 73 65 74 20 3f 20 70 53 61 76 65 70  rOffset ? pSavep
1c550 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65 74  oint->iHdrOffset
1c560 20 3a 20 73 7a 4a 3b 0a 20 20 20 20 70 50 61 67   : szJ;.    pPag
1c570 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
1c580 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 4f 66   pSavepoint->iOf
1c590 66 73 65 74 3b 0a 20 20 20 20 77 68 69 6c 65 28  fset;.    while(
1c5a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1c5b0 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
1c5c0 6c 4f 66 66 3c 69 48 64 72 4f 66 66 20 29 7b 0a  lOff<iHdrOff ){.
1c5d0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
1c5e0 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
1c5f0 67 65 28 70 50 61 67 65 72 2c 20 26 70 50 61 67  ge(pPager, &pPag
1c600 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20  er->journalOff, 
1c610 70 44 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a 20 20  pDone, 1, 1);.  
1c620 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
1c630 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc!=SQLITE_DONE 
1c640 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1c650 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1c660 66 66 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  ff = 0;.  }..  /
1c670 2a 20 43 6f 6e 74 69 6e 75 65 20 72 6f 6c 6c 69  * Continue rolli
1c680 6e 67 20 62 61 63 6b 20 72 65 63 6f 72 64 73 20  ng back records 
1c690 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  out of the main 
1c6a0 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67  journal starting
1c6b0 20 61 74 0a 20 20 2a 2a 20 74 68 65 20 66 69 72   at.  ** the fir
1c6c0 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  st journal heade
1c6d0 72 20 73 65 65 6e 20 61 6e 64 20 63 6f 6e 74 69  r seen and conti
1c6e0 6e 75 69 6e 67 20 75 6e 74 69 6c 20 74 68 65 20  nuing until the 
1c6f0 65 66 66 65 63 74 69 76 65 20 65 6e 64 0a 20 20  effective end.  
1c700 2a 2a 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a  ** of the main j
1c710 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 43 6f  ournal file.  Co
1c720 6e 74 69 6e 75 65 20 74 6f 20 73 6b 69 70 20 6f  ntinue to skip o
1c730 75 74 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67 65  ut-of-range page
1c740 73 20 61 6e 64 0a 20 20 2a 2a 20 63 6f 6e 74 69  s and.  ** conti
1c750 6e 75 65 20 61 64 64 69 6e 67 20 70 61 67 65 73  nue adding pages
1c760 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 6f 20   rolled back to 
1c770 70 44 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 77 68  pDone..  */.  wh
1c780 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
1c790 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f  OK && pPager->jo
1c7a0 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 20 29 7b 0a  urnalOff<szJ ){.
1c7b0 20 20 20 20 75 33 32 20 69 69 3b 20 20 20 20 20      u32 ii;     
1c7c0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
1c7d0 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 75 33  ounter */.    u3
1c7e0 32 20 6e 4a 52 65 63 20 3d 20 30 3b 20 20 20 20  2 nJRec = 0;    
1c7f0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4a 6f   /* Number of Jo
1c800 75 72 6e 61 6c 20 52 65 63 6f 72 64 73 20 2a 2f  urnal Records */
1c810 0a 20 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a  .    u32 dummy;.
1c820 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75      rc = readJou
1c830 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20  rnalHdr(pPager, 
1c840 30 2c 20 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20  0, szJ, &nJRec, 
1c850 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 61 73 73  &dummy);.    ass
1c860 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
1c870 44 4f 4e 45 20 29 3b 0a 0a 20 20 20 20 2f 2a 0a  DONE );..    /*.
1c880 20 20 20 20 2a 2a 20 54 68 65 20 22 70 50 61 67      ** The "pPag
1c890 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a  er->journalHdr+J
1c8a0 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
1c8b0 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a  ager)==pPager->j
1c8c0 6f 75 72 6e 61 6c 4f 66 66 22 0a 20 20 20 20 2a  ournalOff".    *
1c8d0 2a 20 74 65 73 74 20 69 73 20 72 65 6c 61 74 65  * test is relate
1c8e0 64 20 74 6f 20 74 69 63 6b 65 74 20 23 32 35 36  d to ticket #256
1c8f0 35 2e 20 20 53 65 65 20 74 68 65 20 64 69 73 63  5.  See the disc
1c900 75 73 73 69 6f 6e 20 69 6e 20 74 68 65 0a 20 20  ussion in the.  
1c910 20 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79 62    ** pager_playb
1c920 61 63 6b 28 29 20 66 75 6e 63 74 69 6f 6e 20 66  ack() function f
1c930 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
1c940 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 20 20 2a  formation..    *
1c950 2f 0a 20 20 20 20 69 66 28 20 6e 4a 52 65 63 3d  /.    if( nJRec=
1c960 3d 30 20 0a 20 20 20 20 20 26 26 20 70 50 61 67  =0 .     && pPag
1c970 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a  er->journalHdr+J
1c980 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
1c990 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a  ager)==pPager->j
1c9a0 6f 75 72 6e 61 6c 4f 66 66 0a 20 20 20 20 29 7b  ournalOff.    ){
1c9b0 0a 20 20 20 20 20 20 6e 4a 52 65 63 20 3d 20 28  .      nJRec = (
1c9c0 75 33 32 29 28 28 73 7a 4a 20 2d 20 70 50 61 67  u32)((szJ - pPag
1c9d0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 2f  er->journalOff)/
1c9e0 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50  JOURNAL_PG_SZ(pP
1c9f0 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20  ager));.    }.  
1ca00 20 20 66 6f 72 28 69 69 3d 30 3b 20 72 63 3d 3d    for(ii=0; rc==
1ca10 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c  SQLITE_OK && ii<
1ca20 6e 4a 52 65 63 20 26 26 20 70 50 61 67 65 72 2d  nJRec && pPager-
1ca30 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 3b  >journalOff<szJ;
1ca40 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63   ii++){.      rc
1ca50 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
1ca60 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65  k_one_page(pPage
1ca70 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72  r, &pPager->jour
1ca80 6e 61 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c 20 31  nalOff, pDone, 1
1ca90 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 1);.    }.    
1caa0 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
1cab0 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 20  TE_DONE );.  }. 
1cac0 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
1cad0 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72  ITE_OK || pPager
1cae0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 3d 73 7a  ->journalOff>=sz
1caf0 4a 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c  J );..  /* Final
1cb00 6c 79 2c 20 20 72 6f 6c 6c 62 61 63 6b 20 70 61  ly,  rollback pa
1cb10 67 65 73 20 66 72 6f 6d 20 74 68 65 20 73 75 62  ges from the sub
1cb20 2d 6a 6f 75 72 6e 61 6c 2e 20 20 50 61 67 65 20  -journal.  Page 
1cb30 74 68 61 74 20 77 65 72 65 0a 20 20 2a 2a 20 70  that were.  ** p
1cb40 72 65 76 69 6f 75 73 6c 79 20 72 6f 6c 6c 65 64  reviously rolled
1cb50 20 62 61 63 6b 20 6f 75 74 20 6f 66 20 74 68 65   back out of the
1cb60 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 28 61   main journal (a
1cb70 6e 64 20 61 72 65 20 68 65 6e 63 65 20 69 6e 20  nd are hence in 
1cb80 70 44 6f 6e 65 29 0a 20 20 2a 2a 20 77 69 6c 6c  pDone).  ** will
1cb90 20 62 65 20 73 6b 69 70 70 65 64 2e 20 20 4f 75   be skipped.  Ou
1cba0 74 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67 65 73  t-of-range pages
1cbb0 20 61 72 65 20 61 6c 73 6f 20 73 6b 69 70 70 65   are also skippe
1cbc0 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53  d..  */.  if( pS
1cbd0 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20  avepoint ){.    
1cbe0 75 33 32 20 69 69 3b 20 20 20 20 20 20 20 20 20  u32 ii;         
1cbf0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
1cc00 65 72 20 2a 2f 0a 20 20 20 20 69 36 34 20 6f 66  er */.    i64 of
1cc10 66 73 65 74 20 3d 20 70 53 61 76 65 70 6f 69 6e  fset = pSavepoin
1cc20 74 2d 3e 69 53 75 62 52 65 63 2a 28 34 2b 70 50  t->iSubRec*(4+pP
1cc30 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
1cc40 0a 0a 20 20 20 20 69 66 28 20 70 61 67 65 72 55  ..    if( pagerU
1cc50 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
1cc60 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1cc70 74 65 33 57 61 6c 53 61 76 65 70 6f 69 6e 74 55  te3WalSavepointU
1cc80 6e 64 6f 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ndo(pPager->pWal
1cc90 2c 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 61 57  , pSavepoint->aW
1cca0 61 6c 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20  alData);.    }. 
1ccb0 20 20 20 66 6f 72 28 69 69 3d 70 53 61 76 65 70     for(ii=pSavep
1ccc0 6f 69 6e 74 2d 3e 69 53 75 62 52 65 63 3b 20 72  oint->iSubRec; r
1ccd0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1cce0 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 75 62 52  ii<pPager->nSubR
1ccf0 65 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  ec; ii++){.     
1cd00 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 3d   assert( offset=
1cd10 3d 69 69 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70  =ii*(4+pPager->p
1cd20 61 67 65 53 69 7a 65 29 20 29 3b 0a 20 20 20 20  ageSize) );.    
1cd30 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
1cd40 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70  yback_one_page(p
1cd50 50 61 67 65 72 2c 20 26 6f 66 66 73 65 74 2c 20  Pager, &offset, 
1cd60 70 44 6f 6e 65 2c 20 30 2c 20 31 29 3b 0a 20 20  pDone, 0, 1);.  
1cd70 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
1cd80 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc!=SQLITE_DONE 
1cd90 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65  );.  }..  sqlite
1cda0 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
1cdb0 44 6f 6e 65 29 3b 0a 20 20 69 66 28 20 72 63 3d  Done);.  if( rc=
1cdc0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1cdd0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
1cde0 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a  lOff = szJ;.  }.
1cdf0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1ce00 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
1ce10 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  e maximum number
1ce20 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61   of in-memory pa
1ce30 67 65 73 20 74 68 61 74 20 61 72 65 20 61 6c 6c  ges that are all
1ce40 6f 77 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  owed..*/.void sq
1ce50 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63  lite3PagerSetCac
1ce60 68 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50  hesize(Pager *pP
1ce70 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65  ager, int mxPage
1ce80 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  ){.  sqlite3Pcac
1ce90 68 65 53 65 74 43 61 63 68 65 73 69 7a 65 28 70  heSetCachesize(p
1cea0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
1ceb0 6d 78 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  mxPage);.}../*.*
1cec0 2a 20 41 64 6a 75 73 74 20 74 68 65 20 72 6f 62  * Adjust the rob
1ced0 75 73 74 6e 65 73 73 20 6f 66 20 74 68 65 20 64  ustness of the d
1cee0 61 74 61 62 61 73 65 20 74 6f 20 64 61 6d 61 67  atabase to damag
1cef0 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73  e due to OS cras
1cf00 68 65 73 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20  hes.** or power 
1cf10 66 61 69 6c 75 72 65 73 20 62 79 20 63 68 61 6e  failures by chan
1cf20 67 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20  ging the number 
1cf30 6f 66 20 73 79 6e 63 73 28 29 73 20 77 68 65 6e  of syncs()s when
1cf40 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20   writing.** the 
1cf50 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
1cf60 2e 20 20 54 68 65 72 65 20 61 72 65 20 74 68 72  .  There are thr
1cf70 65 65 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a  ee levels:.**.**
1cf80 20 20 20 20 4f 46 46 20 20 20 20 20 20 20 73 71      OFF       sq
1cf90 6c 69 74 65 33 4f 73 53 79 6e 63 28 29 20 69 73  lite3OsSync() is
1cfa0 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20   never called.  
1cfb0 54 68 69 73 20 69 73 20 74 68 65 20 64 65 66 61  This is the defa
1cfc0 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ult.**          
1cfd0 20 20 20 20 66 6f 72 20 74 65 6d 70 6f 72 61 72      for temporar
1cfe0 79 20 61 6e 64 20 74 72 61 6e 73 69 65 6e 74 20  y and transient 
1cff0 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  files..**.**    
1d000 4e 4f 52 4d 41 4c 20 20 20 20 54 68 65 20 6a 6f  NORMAL    The jo
1d010 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20  urnal is synced 
1d020 6f 6e 63 65 20 62 65 66 6f 72 65 20 77 72 69 74  once before writ
1d030 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a  es begin on the.
1d040 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1d050 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20  database.  This 
1d060 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 61 64 65 71  is normally adeq
1d070 75 61 74 65 20 70 72 6f 74 65 63 74 69 6f 6e 2c  uate protection,
1d080 20 62 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20   but.**         
1d090 20 20 20 20 20 69 74 20 69 73 20 74 68 65 6f 72       it is theor
1d0a0 65 74 69 63 61 6c 6c 79 20 70 6f 73 73 69 62 6c  etically possibl
1d0b0 65 2c 20 74 68 6f 75 67 68 20 76 65 72 79 20 75  e, though very u
1d0c0 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20 20  nlikely,.**     
1d0d0 20 20 20 20 20 20 20 20 20 74 68 61 74 20 61 6e           that an
1d0e0 20 69 6e 6f 70 65 72 74 75 6e 65 20 70 6f 77 65   inopertune powe
1d0f0 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20  r failure could 
1d100 6c 65 61 76 65 20 74 68 65 20 6a 6f 75 72 6e 61  leave the journa
1d110 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  l.**            
1d120 20 20 69 6e 20 61 20 73 74 61 74 65 20 77 68 69    in a state whi
1d130 63 68 20 77 6f 75 6c 64 20 63 61 75 73 65 20 64  ch would cause d
1d140 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61 74  amage to the dat
1d150 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20  abase.**        
1d160 20 20 20 20 20 20 77 68 65 6e 20 69 74 20 69 73        when it is
1d170 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a   rolled back..**
1d180 0a 2a 2a 20 20 20 20 46 55 4c 4c 20 20 20 20 20  .**    FULL     
1d190 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   The journal is 
1d1a0 73 79 6e 63 65 64 20 74 77 69 63 65 20 62 65 66  synced twice bef
1d1b0 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e  ore writes begin
1d1c0 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   on the.**      
1d1d0 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65          database
1d1e0 20 28 77 69 74 68 20 73 6f 6d 65 20 61 64 64 69   (with some addi
1d1f0 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
1d200 6f 6e 20 2d 20 74 68 65 20 6e 52 65 63 20 66 69  on - the nRec fi
1d210 65 6c 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  eld.**          
1d220 20 20 20 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e      of the journ
1d230 61 6c 20 68 65 61 64 65 72 20 2d 20 62 65 69 6e  al header - bein
1d240 67 20 77 72 69 74 74 65 6e 20 69 6e 20 62 65 74  g written in bet
1d250 77 65 65 6e 20 74 68 65 20 74 77 6f 0a 2a 2a 20  ween the two.** 
1d260 20 20 20 20 20 20 20 20 20 20 20 20 20 73 79 6e               syn
1d270 63 73 29 2e 20 20 49 66 20 77 65 20 61 73 73 75  cs).  If we assu
1d280 6d 65 20 74 68 61 74 20 77 72 69 74 69 6e 67 20  me that writing 
1d290 61 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  a.**            
1d2a0 20 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65    single disk se
1d2b0 63 74 6f 72 20 69 73 20 61 74 6f 6d 69 63 2c 20  ctor is atomic, 
1d2c0 74 68 65 6e 20 74 68 69 73 20 6d 6f 64 65 20 70  then this mode p
1d2d0 72 6f 76 69 64 65 73 0a 2a 2a 20 20 20 20 20 20  rovides.**      
1d2e0 20 20 20 20 20 20 20 20 61 73 73 75 72 61 6e 63          assuranc
1d2f0 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  e that the journ
1d300 61 6c 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63  al will not be c
1d310 6f 72 72 75 70 74 65 64 20 74 6f 20 74 68 65 0a  orrupted to the.
1d320 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1d330 70 6f 69 6e 74 20 6f 66 20 63 61 75 73 69 6e 67  point of causing
1d340 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64   damage to the d
1d350 61 74 61 62 61 73 65 20 64 75 72 69 6e 67 20 72  atabase during r
1d360 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4e  ollback..**.** N
1d370 75 6d 65 72 69 63 20 76 61 6c 75 65 73 20 61 73  umeric values as
1d380 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
1d390 65 73 65 20 73 74 61 74 65 73 20 61 72 65 20 4f  ese states are O
1d3a0 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c  FF==1, NORMAL=2,
1d3b0 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a  .** and FULL=3..
1d3c0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
1d3d0 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41  E_OMIT_PAGER_PRA
1d3e0 47 4d 41 53 0a 76 6f 69 64 20 73 71 6c 69 74 65  GMAS.void sqlite
1d3f0 33 50 61 67 65 72 53 65 74 53 61 66 65 74 79 4c  3PagerSetSafetyL
1d400 65 76 65 6c 28 50 61 67 65 72 20 2a 70 50 61 67  evel(Pager *pPag
1d410 65 72 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 69  er, int level, i
1d420 6e 74 20 62 46 75 6c 6c 46 73 79 6e 63 29 7b 0a  nt bFullFsync){.
1d430 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63    pPager->noSync
1d440 20 3d 20 20 28 6c 65 76 65 6c 3d 3d 31 20 7c 7c   =  (level==1 ||
1d450 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
1d460 65 29 20 3f 31 3a 30 3b 0a 20 20 70 50 61 67 65  e) ?1:0;.  pPage
1d470 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 28 6c  r->fullSync = (l
1d480 65 76 65 6c 3d 3d 33 20 26 26 20 21 70 50 61 67  evel==3 && !pPag
1d490 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 20 3f 31  er->tempFile) ?1
1d4a0 3a 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 79  :0;.  pPager->sy
1d4b0 6e 63 5f 66 6c 61 67 73 20 3d 20 28 62 46 75 6c  nc_flags = (bFul
1d4c0 6c 46 73 79 6e 63 3f 53 51 4c 49 54 45 5f 53 59  lFsync?SQLITE_SY
1d4d0 4e 43 5f 46 55 4c 4c 3a 53 51 4c 49 54 45 5f 53  NC_FULL:SQLITE_S
1d4e0 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 7d 0a 23  YNC_NORMAL);.}.#
1d4f0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
1d500 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61   following globa
1d510 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20 69 6e  l variable is in
1d520 63 72 65 6d 65 6e 74 65 64 20 77 68 65 6e 65 76  cremented whenev
1d530 65 72 20 74 68 65 20 6c 69 62 72 61 72 79 0a 2a  er the library.*
1d540 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20 6f 70  * attempts to op
1d550 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  en a temporary f
1d560 69 6c 65 2e 20 20 54 68 69 73 20 69 6e 66 6f 72  ile.  This infor
1d570 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 66  mation is used f
1d580 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e  or.** testing an
1d590 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e  d analysis only.
1d5a0 20 20 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c    .*/.#ifdef SQL
1d5b0 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c  ITE_TEST.int sql
1d5c0 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f  ite3_opentemp_co
1d5d0 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  unt = 0;.#endif.
1d5e0 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65  ./*.** Open a te
1d5f0 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 0a 2a 2a  mporary file..**
1d600 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 66 69  .** Write the fi
1d610 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 6e  le descriptor in
1d620 74 6f 20 2a 70 46 69 6c 65 2e 20 52 65 74 75 72  to *pFile. Retur
1d630 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
1d640 75 63 63 65 73 73 20 0a 2a 2a 20 6f 72 20 73 6f  uccess .** or so
1d650 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63  me other error c
1d660 6f 64 65 20 69 66 20 77 65 20 66 61 69 6c 2e 20  ode if we fail. 
1d670 54 68 65 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f  The OS will auto
1d680 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 64 65  matically .** de
1d690 6c 65 74 65 20 74 68 65 20 74 65 6d 70 6f 72 61  lete the tempora
1d6a0 72 79 20 66 69 6c 65 20 77 68 65 6e 20 69 74 20  ry file when it 
1d6b0 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a  is closed..**.**
1d6c0 20 54 68 65 20 66 6c 61 67 73 20 70 61 73 73 65   The flags passe
1d6d0 64 20 74 6f 20 74 68 65 20 56 46 53 20 6c 61 79  d to the VFS lay
1d6e0 65 72 20 78 4f 70 65 6e 28 29 20 63 61 6c 6c 20  er xOpen() call 
1d6f0 61 72 65 20 74 68 6f 73 65 20 73 70 65 63 69 66  are those specif
1d700 69 65 64 0a 2a 2a 20 62 79 20 70 61 72 61 6d 65  ied.** by parame
1d710 74 65 72 20 76 66 73 46 6c 61 67 73 20 4f 52 65  ter vfsFlags ORe
1d720 64 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f  d with the follo
1d730 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  wing:.**.**     
1d740 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
1d750 57 52 49 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c  WRITE.**     SQL
1d760 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 0a  ITE_OPEN_CREATE.
1d770 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50  **     SQLITE_OP
1d780 45 4e 5f 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  EN_EXCLUSIVE.** 
1d790 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
1d7a0 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 0a 2a 2f  DELETEONCLOSE.*/
1d7b0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
1d7c0 72 4f 70 65 6e 74 65 6d 70 28 0a 20 20 50 61 67  rOpentemp(.  Pag
1d7d0 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
1d7e0 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20     /* The pager 
1d7f0 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69  object */.  sqli
1d800 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c  te3_file *pFile,
1d810 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 66    /* Write the f
1d820 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 68  ile descriptor h
1d830 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73  ere */.  int vfs
1d840 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 2f  Flags          /
1d850 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64 20 74  * Flags passed t
1d860 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20 56 46  hrough to the VF
1d870 53 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  S */.){.  int rc
1d880 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1d890 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
1d8a0 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
1d8b0 5f 54 45 53 54 0a 20 20 73 71 6c 69 74 65 33 5f  _TEST.  sqlite3_
1d8c0 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b  opentemp_count++
1d8d0 3b 20 20 2f 2a 20 55 73 65 64 20 66 6f 72 20 74  ;  /* Used for t
1d8e0 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79  esting and analy
1d8f0 73 69 73 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64  sis only */.#end
1d900 69 66 0a 0a 20 20 76 66 73 46 6c 61 67 73 20 7c  if..  vfsFlags |
1d910 3d 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  =  SQLITE_OPEN_R
1d920 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54  EADWRITE | SQLIT
1d930 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a  E_OPEN_CREATE |.
1d940 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
1d950 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56  TE_OPEN_EXCLUSIV
1d960 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E | SQLITE_OPEN_
1d970 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20  DELETEONCLOSE;. 
1d980 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
1d990 70 65 6e 28 70 50 61 67 65 72 2d 3e 70 56 66 73  pen(pPager->pVfs
1d9a0 2c 20 30 2c 20 70 46 69 6c 65 2c 20 76 66 73 46  , 0, pFile, vfsF
1d9b0 6c 61 67 73 2c 20 30 29 3b 0a 20 20 61 73 73 65  lags, 0);.  asse
1d9c0 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
1d9d0 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 46 69 6c  K || isOpen(pFil
1d9e0 65 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e) );.  return r
1d9f0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  c;.}../*.** Set 
1da00 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72  the busy handler
1da10 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
1da20 20 54 68 65 20 70 61 67 65 72 20 69 6e 76 6f 6b   The pager invok
1da30 65 73 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64  es the busy-hand
1da40 6c 65 72 20 69 66 20 73 71 6c 69 74 65 33 4f 73  ler if sqlite3Os
1da50 4c 6f 63 6b 28 29 20 72 65 74 75 72 6e 73 20 0a  Lock() returns .
1da60 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 77  ** SQLITE_BUSY w
1da70 68 65 6e 20 74 72 79 69 6e 67 20 74 6f 20 75 70  hen trying to up
1da80 67 72 61 64 65 20 66 72 6f 6d 20 6e 6f 2d 6c 6f  grade from no-lo
1da90 63 6b 20 74 6f 20 61 20 53 48 41 52 45 44 20 6c  ck to a SHARED l
1daa0 6f 63 6b 2c 0a 2a 2a 20 6f 72 20 77 68 65 6e 20  ock,.** or when 
1dab0 74 72 79 69 6e 67 20 74 6f 20 75 70 67 72 61 64  trying to upgrad
1dac0 65 20 66 72 6f 6d 20 61 20 52 45 53 45 52 56 45  e from a RESERVE
1dad0 44 20 6c 6f 63 6b 20 74 6f 20 61 6e 20 45 58 43  D lock to an EXC
1dae0 4c 55 53 49 56 45 20 0a 2a 2a 20 6c 6f 63 6b 2e  LUSIVE .** lock.
1daf0 20 49 74 20 64 6f 65 73 20 2a 6e 6f 74 2a 20 69   It does *not* i
1db00 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68  nvoke the busy h
1db10 61 6e 64 6c 65 72 20 77 68 65 6e 20 75 70 67 72  andler when upgr
1db20 61 64 69 6e 67 20 66 72 6f 6d 0a 2a 2a 20 53 48  ading from.** SH
1db30 41 52 45 44 20 74 6f 20 52 45 53 45 52 56 45 44  ARED to RESERVED
1db40 2c 20 6f 72 20 77 68 65 6e 20 75 70 67 72 61 64  , or when upgrad
1db50 69 6e 67 20 66 72 6f 6d 20 53 48 41 52 45 44 20  ing from SHARED 
1db60 74 6f 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  to EXCLUSIVE.** 
1db70 28 77 68 69 63 68 20 6f 63 63 75 72 73 20 64 75  (which occurs du
1db80 72 69 6e 67 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ring hot-journal
1db90 20 72 6f 6c 6c 62 61 63 6b 29 2e 20 53 75 6d 6d   rollback). Summ
1dba0 61 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 54 72 61  ary:.**.**   Tra
1dbb0 6e 73 69 74 69 6f 6e 20 20 20 20 20 20 20 20 20  nsition         
1dbc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1dbd0 20 49 6e 76 6f 6b 65 73 20 78 42 75 73 79 48 61   Invokes xBusyHa
1dbe0 6e 64 6c 65 72 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d  ndler.**   -----
1dbf0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1dc00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1dc10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1dc20 2d 2d 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b  ---.**   NO_LOCK
1dc30 20 20 20 20 20 20 20 2d 3e 20 53 48 41 52 45 44         -> SHARED
1dc40 5f 4c 4f 43 4b 20 20 20 20 20 20 7c 20 59 65 73  _LOCK      | Yes
1dc50 0a 2a 2a 20 20 20 53 48 41 52 45 44 5f 4c 4f 43  .**   SHARED_LOC
1dc60 4b 20 20 20 2d 3e 20 52 45 53 45 52 56 45 44 5f  K   -> RESERVED_
1dc70 4c 4f 43 4b 20 20 20 20 7c 20 4e 6f 0a 2a 2a 20  LOCK    | No.** 
1dc80 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20    SHARED_LOCK   
1dc90 2d 3e 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  -> EXCLUSIVE_LOC
1dca0 4b 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 52 45  K   | No.**   RE
1dcb0 53 45 52 56 45 44 5f 4c 4f 43 4b 20 2d 3e 20 45  SERVED_LOCK -> E
1dcc0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20  XCLUSIVE_LOCK   
1dcd0 7c 20 59 65 73 0a 2a 2a 0a 2a 2a 20 49 66 20 74  | Yes.**.** If t
1dce0 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20  he busy-handler 
1dcf0 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73  callback returns
1dd00 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 6c   non-zero, the l
1dd10 6f 63 6b 20 69 73 20 0a 2a 2a 20 72 65 74 72 69  ock is .** retri
1dd20 65 64 2e 20 49 66 20 69 74 20 72 65 74 75 72 6e  ed. If it return
1dd30 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  s zero, then the
1dd40 20 53 51 4c 49 54 45 5f 42 55 53 59 20 65 72 72   SQLITE_BUSY err
1dd50 6f 72 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65  or is.** returne
1dd60 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20  d to the caller 
1dd70 6f 66 20 74 68 65 20 70 61 67 65 72 20 41 50 49  of the pager API
1dd80 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f   function..*/.vo
1dd90 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  id sqlite3PagerS
1dda0 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28 0a 20  etBusyhandler(. 
1ddb0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
1ddc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ddd0 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f        /* Pager o
1dde0 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 28  bject */.  int (
1ddf0 2a 78 42 75 73 79 48 61 6e 64 6c 65 72 29 28 76  *xBusyHandler)(v
1de00 6f 69 64 20 2a 29 2c 20 20 20 20 20 20 20 20 20  oid *),         
1de10 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75  /* Pointer to bu
1de20 73 79 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63 74  sy-handler funct
1de30 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  ion */.  void *p
1de40 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20 20  BusyHandlerArg  
1de50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1de60 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 70 61 73   Argument to pas
1de70 73 20 74 6f 20 78 42 75 73 79 48 61 6e 64 6c 65  s to xBusyHandle
1de80 72 20 2a 2f 0a 29 7b 20 20 0a 20 20 70 50 61 67  r */.){  .  pPag
1de90 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72  er->xBusyHandler
1dea0 20 3d 20 78 42 75 73 79 48 61 6e 64 6c 65 72 3b   = xBusyHandler;
1deb0 0a 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79  .  pPager->pBusy
1dec0 48 61 6e 64 6c 65 72 41 72 67 20 3d 20 70 42 75  HandlerArg = pBu
1ded0 73 79 48 61 6e 64 6c 65 72 41 72 67 3b 0a 7d 0a  syHandlerArg;.}.
1dee0 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
1def0 65 20 70 61 67 65 20 73 69 7a 65 20 75 73 65 64  e page size used
1df00 20 62 79 20 74 68 65 20 50 61 67 65 72 20 6f 62   by the Pager ob
1df10 6a 65 63 74 2e 20 54 68 65 20 6e 65 77 20 70 61  ject. The new pa
1df20 67 65 20 73 69 7a 65 20 0a 2a 2a 20 69 73 20 70  ge size .** is p
1df30 61 73 73 65 64 20 69 6e 20 2a 70 50 61 67 65 53  assed in *pPageS
1df40 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ize..**.** If th
1df50 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 74 68  e pager is in th
1df60 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 77 68  e error state wh
1df70 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
1df80 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 0a 2a   is called, it.*
1df90 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 54 68  * is a no-op. Th
1dfa0 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
1dfb0 20 69 73 20 74 68 65 20 65 72 72 6f 72 20 73 74   is the error st
1dfc0 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 28  ate error code (
1dfd0 69 2e 65 2e 20 0a 2a 2a 20 6f 6e 65 20 6f 66 20  i.e. .** one of 
1dfe0 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53 51  SQLITE_IOERR, SQ
1dff0 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 6f 72 20  LITE_CORRUPT or 
1e000 53 51 4c 49 54 45 5f 46 55 4c 4c 29 2e 0a 2a 2a  SQLITE_FULL)..**
1e010 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
1e020 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c  f all of the fol
1e030 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a  lowing are true:
1e040 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 20 6e  .**.**   * the n
1e050 65 77 20 70 61 67 65 20 73 69 7a 65 20 28 76 61  ew page size (va
1e060 6c 75 65 20 6f 66 20 2a 70 50 61 67 65 53 69 7a  lue of *pPageSiz
1e070 65 29 20 69 73 20 76 61 6c 69 64 20 28 61 20 70  e) is valid (a p
1e080 6f 77 65 72 20 0a 2a 2a 20 20 20 20 20 6f 66 20  ower .**     of 
1e090 74 77 6f 20 62 65 74 77 65 65 6e 20 35 31 32 20  two between 512 
1e0a0 61 6e 64 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50  and SQLITE_MAX_P
1e0b0 41 47 45 5f 53 49 5a 45 2c 20 69 6e 63 6c 75 73  AGE_SIZE, inclus
1e0c0 69 76 65 29 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20  ive), and.**.** 
1e0d0 20 20 2a 20 74 68 65 72 65 20 61 72 65 20 6e 6f    * there are no
1e0e0 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67   outstanding pag
1e0f0 65 20 72 65 66 65 72 65 6e 63 65 73 2c 20 61 6e  e references, an
1e100 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 20  d.**.**   * the 
1e110 64 61 74 61 62 61 73 65 20 69 73 20 65 69 74 68  database is eith
1e120 65 72 20 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d  er not an in-mem
1e130 6f 72 79 20 64 61 74 61 62 61 73 65 20 6f 72 20  ory database or 
1e140 69 74 20 69 73 0a 2a 2a 20 20 20 20 20 61 6e 20  it is.**     an 
1e150 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
1e160 73 65 20 74 68 61 74 20 63 75 72 72 65 6e 74 6c  se that currentl
1e170 79 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 7a 65  y consists of ze
1e180 72 6f 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20  ro pages..**.** 
1e190 74 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 6f  then the pager o
1e1a0 62 6a 65 63 74 20 70 61 67 65 20 73 69 7a 65 20  bject page size 
1e1b0 69 73 20 73 65 74 20 74 6f 20 2a 70 50 61 67 65  is set to *pPage
1e1c0 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  Size..**.** If t
1e1d0 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  he page size is 
1e1e0 63 68 61 6e 67 65 64 2c 20 74 68 65 6e 20 74 68  changed, then th
1e1f0 69 73 20 66 75 6e 63 74 69 6f 6e 20 75 73 65 73  is function uses
1e200 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61 6c   sqlite3PagerMal
1e210 6c 6f 63 28 29 20 0a 2a 2a 20 74 6f 20 6f 62 74  loc() .** to obt
1e220 61 69 6e 20 61 20 6e 65 77 20 50 61 67 65 72 2e  ain a new Pager.
1e230 70 54 6d 70 53 70 61 63 65 20 62 75 66 66 65 72  pTmpSpace buffer
1e240 2e 20 49 66 20 74 68 69 73 20 61 6c 6c 6f 63 61  . If this alloca
1e250 74 69 6f 6e 20 61 74 74 65 6d 70 74 20 0a 2a 2a  tion attempt .**
1e260 20 66 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e   fails, SQLITE_N
1e270 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64  OMEM is returned
1e280 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 73 69   and the page si
1e290 7a 65 20 72 65 6d 61 69 6e 73 20 75 6e 63 68 61  ze remains uncha
1e2a0 6e 67 65 64 2e 20 0a 2a 2a 20 49 6e 20 61 6c 6c  nged. .** In all
1e2b0 20 6f 74 68 65 72 20 63 61 73 65 73 2c 20 53 51   other cases, SQ
1e2c0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
1e2d0 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ned..**.** If th
1e2e0 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 6e  e page size is n
1e2f0 6f 74 20 63 68 61 6e 67 65 64 2c 20 65 69 74 68  ot changed, eith
1e300 65 72 20 62 65 63 61 75 73 65 20 6f 6e 65 20 6f  er because one o
1e310 66 20 74 68 65 20 65 6e 75 6d 65 72 61 74 65 64  f the enumerated
1e320 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61  .** conditions a
1e330 62 6f 76 65 20 69 73 20 6e 6f 74 20 74 72 75 65  bove is not true
1e340 2c 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20  , the pager was 
1e350 69 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20 77  in error state w
1e360 68 65 6e 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63  hen this.** func
1e370 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 2c  tion was called,
1e380 20 6f 72 20 62 65 63 61 75 73 65 20 74 68 65 20   or because the 
1e390 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
1e3a0 6e 20 61 74 74 65 6d 70 74 20 66 61 69 6c 65 64  n attempt failed
1e3b0 2c 20 0a 2a 2a 20 74 68 65 6e 20 2a 70 50 61 67  , .** then *pPag
1e3c0 65 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20  eSize is set to 
1e3d0 74 68 65 20 6f 6c 64 2c 20 72 65 74 61 69 6e 65  the old, retaine
1e3e0 64 20 70 61 67 65 20 73 69 7a 65 20 62 65 66 6f  d page size befo
1e3f0 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f  re returning..*/
1e400 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
1e410 72 53 65 74 50 61 67 65 73 69 7a 65 28 50 61 67  rSetPagesize(Pag
1e420 65 72 20 2a 70 50 61 67 65 72 2c 20 75 31 36 20  er *pPager, u16 
1e430 2a 70 50 61 67 65 53 69 7a 65 2c 20 69 6e 74 20  *pPageSize, int 
1e440 6e 52 65 73 65 72 76 65 29 7b 0a 20 20 69 6e 74  nReserve){.  int
1e450 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72   rc = pPager->er
1e460 72 43 6f 64 65 3b 0a 0a 20 20 2f 2a 20 49 74 20  rCode;..  /* It 
1e470 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
1e480 74 6f 20 64 6f 20 61 20 66 75 6c 6c 20 61 73 73  to do a full ass
1e490 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
1e4a0 29 20 68 65 72 65 2c 20 61 73 20 74 68 69 73 0a  ) here, as this.
1e4b0 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6d 61    ** function ma
1e4c0 79 20 62 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d  y be called from
1e4d0 20 77 69 74 68 69 6e 20 50 61 67 65 72 4f 70 65   within PagerOpe
1e4e0 6e 28 29 2c 20 62 65 66 6f 72 65 20 74 68 65 20  n(), before the 
1e4f0 73 74 61 74 65 0a 20 20 2a 2a 20 6f 66 20 74 68  state.  ** of th
1e500 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 69  e Pager object i
1e510 73 20 69 6e 74 65 72 6e 61 6c 6c 79 20 63 6f 6e  s internally con
1e520 73 69 73 74 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20  sistent..  */.  
1e530 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
1e540 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d  TE_OK || pPager-
1e550 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 45  >eState==PAGER_E
1e560 52 52 4f 52 20 29 3b 0a 0a 20 20 69 66 28 20 72  RROR );..  if( r
1e570 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1e580 20 20 20 20 75 31 36 20 70 61 67 65 53 69 7a 65      u16 pageSize
1e590 20 3d 20 2a 70 50 61 67 65 53 69 7a 65 3b 0a 20   = *pPageSize;. 
1e5a0 20 20 20 61 73 73 65 72 74 28 20 70 61 67 65 53     assert( pageS
1e5b0 69 7a 65 3d 3d 30 20 7c 7c 20 28 70 61 67 65 53  ize==0 || (pageS
1e5c0 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65  ize>=512 && page
1e5d0 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58  Size<=SQLITE_MAX
1e5e0 5f 50 41 47 45 5f 53 49 5a 45 29 20 29 3b 0a 20  _PAGE_SIZE) );. 
1e5f0 20 20 20 69 66 28 20 28 70 50 61 67 65 72 2d 3e     if( (pPager->
1e600 6d 65 6d 44 62 3d 3d 30 20 7c 7c 20 70 50 61 67  memDb==0 || pPag
1e610 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 29 0a 20  er->dbSize==0). 
1e620 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 50 63      && sqlite3Pc
1e630 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61  acheRefCount(pPa
1e640 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30  ger->pPCache)==0
1e650 20 0a 20 20 20 20 20 26 26 20 70 61 67 65 53 69   .     && pageSi
1e660 7a 65 20 26 26 20 70 61 67 65 53 69 7a 65 21 3d  ze && pageSize!=
1e670 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1e680 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 63   .    ){.      c
1e690 68 61 72 20 2a 70 4e 65 77 3b 20 20 20 20 20 20  har *pNew;      
1e6a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
1e6b0 77 20 74 65 6d 70 20 73 70 61 63 65 20 2a 2f 0a  w temp space */.
1e6c0 20 20 20 20 20 20 69 36 34 20 6e 42 79 74 65 20        i64 nByte 
1e6d0 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70  = 0;.      if( p
1e6e0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 50 41  Pager->eState>PA
1e6f0 47 45 52 5f 4e 4f 4e 45 20 26 26 20 69 73 4f 70  GER_NONE && isOp
1e700 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
1e710 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
1e720 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
1e730 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e 42  (pPager->fd, &nB
1e740 79 74 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  yte);.        if
1e750 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1e760 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
1e770 20 20 20 7d 0a 20 20 20 20 20 20 70 4e 65 77 20     }.      pNew 
1e780 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  = (char *)sqlite
1e790 33 50 61 67 65 4d 61 6c 6c 6f 63 28 70 61 67 65  3PageMalloc(page
1e7a0 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Size);.      if(
1e7b0 20 21 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20   !pNew ){.      
1e7c0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
1e7d0 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  MEM;.      }else
1e7e0 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
1e7f0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
1e800 3d 3d 50 41 47 45 52 5f 4e 4f 4e 45 20 7c 7c 20  ==PAGER_NONE || 
1e810 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
1e820 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a  PAGER_READER );.
1e830 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 72 65          pager_re
1e840 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  set(pPager);.   
1e850 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53       pPager->dbS
1e860 69 7a 65 20 3d 20 6e 42 79 74 65 2f 70 61 67 65  ize = nByte/page
1e870 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 70 50  Size;.        pP
1e880 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d  ager->pageSize =
1e890 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20   pageSize;.     
1e8a0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72     sqlite3PageFr
1e8b0 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d 70 53  ee(pPager->pTmpS
1e8c0 70 61 63 65 29 3b 0a 20 20 20 20 20 20 20 20 70  pace);.        p
1e8d0 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
1e8e0 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 20   = pNew;.       
1e8f0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 65   sqlite3PcacheSe
1e900 74 50 61 67 65 53 69 7a 65 28 70 50 61 67 65 72  tPageSize(pPager
1e910 2d 3e 70 50 43 61 63 68 65 2c 20 70 61 67 65 53  ->pPCache, pageS
1e920 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ize);.      }.  
1e930 20 20 7d 0a 20 20 20 20 2a 70 50 61 67 65 53 69    }.    *pPageSi
1e940 7a 65 20 3d 20 28 75 31 36 29 70 50 61 67 65 72  ze = (u16)pPager
1e950 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  ->pageSize;.    
1e960 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30 20 29  if( nReserve<0 )
1e970 20 6e 52 65 73 65 72 76 65 20 3d 20 70 50 61 67   nReserve = pPag
1e980 65 72 2d 3e 6e 52 65 73 65 72 76 65 3b 0a 20 20  er->nReserve;.  
1e990 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 65 72    assert( nReser
1e9a0 76 65 3e 3d 30 20 26 26 20 6e 52 65 73 65 72 76  ve>=0 && nReserv
1e9b0 65 3c 31 30 30 30 20 29 3b 0a 20 20 20 20 70 50  e<1000 );.    pP
1e9c0 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 20 3d  ager->nReserve =
1e9d0 20 28 69 31 36 29 6e 52 65 73 65 72 76 65 3b 0a   (i16)nReserve;.
1e9e0 20 20 20 20 70 61 67 65 72 52 65 70 6f 72 74 53      pagerReportS
1e9f0 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ize(pPager);.  }
1ea00 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1ea10 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
1ea20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 22  pointer to the "
1ea30 74 65 6d 70 6f 72 61 72 79 20 70 61 67 65 22 20  temporary page" 
1ea40 62 75 66 66 65 72 20 68 65 6c 64 20 69 6e 74 65  buffer held inte
1ea50 72 6e 61 6c 6c 79 0a 2a 2a 20 62 79 20 74 68 65  rnally.** by the
1ea60 20 70 61 67 65 72 2e 20 20 54 68 69 73 20 69 73   pager.  This is
1ea70 20 61 20 62 75 66 66 65 72 20 74 68 61 74 20 69   a buffer that i
1ea80 73 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20  s big enough to 
1ea90 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 65 6e 74 69  hold the.** enti
1eaa0 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20  re content of a 
1eab0 64 61 74 61 62 61 73 65 20 70 61 67 65 2e 20 20  database page.  
1eac0 54 68 69 73 20 62 75 66 66 65 72 20 69 73 20 75  This buffer is u
1ead0 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a  sed internally.*
1eae0 2a 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63  * during rollbac
1eaf0 6b 20 61 6e 64 20 77 69 6c 6c 20 62 65 20 6f 76  k and will be ov
1eb00 65 72 77 72 69 74 74 65 6e 20 77 68 65 6e 65 76  erwritten whenev
1eb10 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a  er a rollback.**
1eb20 20 6f 63 63 75 72 73 2e 20 20 42 75 74 20 6f 74   occurs.  But ot
1eb30 68 65 72 20 6d 6f 64 75 6c 65 73 20 61 72 65 20  her modules are 
1eb40 66 72 65 65 20 74 6f 20 75 73 65 20 69 74 20 74  free to use it t
1eb50 6f 6f 2c 20 61 73 20 6c 6f 6e 67 20 61 73 0a 2a  oo, as long as.*
1eb60 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 73 20 61  * no rollbacks a
1eb70 72 65 20 68 61 70 70 65 6e 69 6e 67 2e 0a 2a 2f  re happening..*/
1eb80 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61  .void *sqlite3Pa
1eb90 67 65 72 54 65 6d 70 53 70 61 63 65 28 50 61 67  gerTempSpace(Pag
1eba0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
1ebb0 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 54  eturn pPager->pT
1ebc0 6d 70 53 70 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  mpSpace;.}../*.*
1ebd0 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 65 74  * Attempt to set
1ebe0 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 64 61 74   the maximum dat
1ebf0 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74  abase page count
1ec00 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f   if mxPage is po
1ec10 73 69 74 69 76 65 2e 20 0a 2a 2a 20 4d 61 6b 65  sitive. .** Make
1ec20 20 6e 6f 20 63 68 61 6e 67 65 73 20 69 66 20 6d   no changes if m
1ec30 78 50 61 67 65 20 69 73 20 7a 65 72 6f 20 6f 72  xPage is zero or
1ec40 20 6e 65 67 61 74 69 76 65 2e 20 20 41 6e 64 20   negative.  And 
1ec50 6e 65 76 65 72 20 72 65 64 75 63 65 20 74 68 65  never reduce the
1ec60 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  .** maximum page
1ec70 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20 74 68 65   count below the
1ec80 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   current size of
1ec90 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
1eca0 2a 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20  *.** Regardless 
1ecb0 6f 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72  of mxPage, retur
1ecc0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d 61  n the current ma
1ecd0 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74  ximum page count
1ece0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1ecf0 50 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e  PagerMaxPageCoun
1ed00 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  t(Pager *pPager,
1ed10 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20   int mxPage){.  
1ed20 69 66 28 20 6d 78 50 61 67 65 3e 30 20 29 7b 0a  if( mxPage>0 ){.
1ed30 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67      pPager->mxPg
1ed40 6e 6f 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d  no = mxPage;.  }
1ed50 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
1ed60 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4e 4f 4e  State!=PAGER_NON
1ed70 45 20 26 26 20 70 50 61 67 65 72 2d 3e 6d 78 50  E && pPager->mxP
1ed80 67 6e 6f 3c 70 50 61 67 65 72 2d 3e 64 62 53 69  gno<pPager->dbSi
1ed90 7a 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  ze ){.    pPager
1eda0 2d 3e 6d 78 50 67 6e 6f 20 3d 20 70 50 61 67 65  ->mxPgno = pPage
1edb0 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 7d 0a 20  r->dbSize;.  }. 
1edc0 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
1edd0 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  mxPgno;.}../*.**
1ede0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   The following s
1edf0 65 74 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 61  et of routines a
1ee00 72 65 20 75 73 65 64 20 74 6f 20 64 69 73 61 62  re used to disab
1ee10 6c 65 20 74 68 65 20 73 69 6d 75 6c 61 74 65 64  le the simulated
1ee20 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65  .** I/O error me
1ee30 63 68 61 6e 69 73 6d 2e 20 20 54 68 65 73 65 20  chanism.  These 
1ee40 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65  routines are use
1ee50 64 20 74 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c  d to avoid simul
1ee60 61 74 65 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69  ated.** errors i
1ee70 6e 20 70 6c 61 63 65 73 20 77 68 65 72 65 20 77  n places where w
1ee80 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62  e do not care ab
1ee90 6f 75 74 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a  out errors..**.*
1eea0 2a 20 55 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54  * Unless -DSQLIT
1eeb0 45 5f 54 45 53 54 3d 31 20 69 73 20 75 73 65 64  E_TEST=1 is used
1eec0 2c 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73  , these routines
1eed0 20 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a   are all no-ops.
1eee0 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20  ** and generate 
1eef0 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64  no code..*/.#ifd
1ef00 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 65  ef SQLITE_TEST.e
1ef10 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
1ef20 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
1ef30 6e 67 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20 73  ng;.extern int s
1ef40 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
1ef50 68 69 74 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  hit;.static int 
1ef60 73 61 76 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20  saved_cnt;.void 
1ef70 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65  disable_simulate
1ef80 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64  d_io_errors(void
1ef90 29 7b 0a 20 20 73 61 76 65 64 5f 63 6e 74 20 3d  ){.  saved_cnt =
1efa0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
1efb0 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c  r_pending;.  sql
1efc0 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  ite3_io_error_pe
1efd0 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f  nding = -1;.}.vo
1efe0 69 64 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61  id enable_simula
1eff0 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f  ted_io_errors(vo
1f000 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69  id){.  sqlite3_i
1f010 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20  o_error_pending 
1f020 3d 20 73 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23  = saved_cnt;.}.#
1f030 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 64 69  else.# define di
1f040 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  sable_simulated_
1f050 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 20 64 65  io_errors().# de
1f060 66 69 6e 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75  fine enable_simu
1f070 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
1f080 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
1f090 52 65 61 64 20 74 68 65 20 66 69 72 73 74 20 4e  Read the first N
1f0a0 20 62 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20   bytes from the 
1f0b0 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
1f0c0 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72   file into memor
1f0d0 79 0a 2a 2a 20 74 68 61 74 20 70 44 65 73 74 20  y.** that pDest 
1f0e0 70 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a  points to. .**.*
1f0f0 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 77  * If the pager w
1f100 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 74  as opened on a t
1f110 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 20 28 7a  ransient file (z
1f120 46 69 6c 65 6e 61 6d 65 3d 3d 22 22 29 2c 20 6f  Filename==""), o
1f130 72 0a 2a 2a 20 6f 70 65 6e 65 64 20 6f 6e 20 61  r.** opened on a
1f140 20 66 69 6c 65 20 6c 65 73 73 20 74 68 61 6e 20   file less than 
1f150 4e 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c  N bytes in size,
1f160 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66   the output buff
1f170 65 72 20 69 73 0a 2a 2a 20 7a 65 72 6f 65 64 20  er is.** zeroed 
1f180 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
1f190 74 75 72 6e 65 64 2e 20 54 68 65 20 72 61 74 69  turned. The rati
1f1a0 6f 6e 61 6c 65 20 66 6f 72 20 74 68 69 73 20 69  onale for this i
1f1b0 73 20 74 68 61 74 20 74 68 69 73 20 0a 2a 2a 20  s that this .** 
1f1c0 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
1f1d0 20 74 6f 20 72 65 61 64 20 64 61 74 61 62 61 73   to read databas
1f1e0 65 20 68 65 61 64 65 72 73 2c 20 61 6e 64 20 61  e headers, and a
1f1f0 20 6e 65 77 20 74 72 61 6e 73 69 65 6e 74 20 6f   new transient o
1f200 72 0a 2a 2a 20 7a 65 72 6f 20 73 69 7a 65 64 20  r.** zero sized 
1f210 64 61 74 61 62 61 73 65 20 68 61 73 20 61 20 68  database has a h
1f220 65 61 64 65 72 20 74 68 61 6e 20 63 6f 6e 73 69  eader than consi
1f230 73 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 66 20  sts entirely of 
1f240 7a 65 72 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  zeroes..**.** If
1f250 20 61 6e 79 20 49 4f 20 65 72 72 6f 72 20 61 70   any IO error ap
1f260 61 72 74 20 66 72 6f 6d 20 53 51 4c 49 54 45 5f  art from SQLITE_
1f270 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
1f280 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c   is encountered,
1f290 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 20 63 6f  .** the error co
1f2a0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 74  de is returned t
1f2b0 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 61 6e 64  o the caller and
1f2c0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
1f2d0 20 74 68 65 0a 2a 2a 20 6f 75 74 70 75 74 20 62   the.** output b
1f2e0 75 66 66 65 72 20 75 6e 64 65 66 69 6e 65 64 2e  uffer undefined.
1f2f0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
1f300 61 67 65 72 52 65 61 64 46 69 6c 65 68 65 61 64  agerReadFilehead
1f310 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  er(Pager *pPager
1f320 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65  , int N, unsigne
1f330 64 20 63 68 61 72 20 2a 70 44 65 73 74 29 7b 0a  d char *pDest){.
1f340 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1f350 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74 28 70  E_OK;.  memset(p
1f360 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 61  Dest, 0, N);.  a
1f370 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
1f380 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61  ager->fd) || pPa
1f390 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
1f3a0 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74  ..  /* This rout
1f3b0 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c  ine is only call
1f3c0 65 64 20 62 79 20 62 74 72 65 65 20 69 6d 6d 65  ed by btree imme
1f3d0 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 63 72  diately after cr
1f3e0 65 61 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20  eating.  ** the 
1f3f0 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 20 54  Pager object.  T
1f400 68 65 72 65 20 68 61 73 20 6e 6f 74 20 62 65 65  here has not bee
1f410 6e 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79  n an opportunity
1f420 20 74 6f 20 74 72 61 6e 73 69 74 69 6f 6e 0a 20   to transition. 
1f430 20 2a 2a 20 74 6f 20 57 41 4c 20 6d 6f 64 65 20   ** to WAL mode 
1f440 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  yet..  */.  asse
1f450 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  rt( !pagerUseWal
1f460 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 69  (pPager) );..  i
1f470 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
1f480 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 49 4f 54  ->fd) ){.    IOT
1f490 52 41 43 45 28 28 22 44 42 48 44 52 20 25 70 20  RACE(("DBHDR %p 
1f4a0 30 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  0 %d\n", pPager,
1f4b0 20 4e 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71   N)).    rc = sq
1f4c0 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
1f4d0 65 72 2d 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e  er->fd, pDest, N
1f4e0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
1f4f0 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  ==SQLITE_IOERR_S
1f500 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20  HORT_READ ){.   
1f510 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
1f520 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  K;.    }.  }.  r
1f530 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1f540 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1f550 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c   may only be cal
1f560 6c 65 64 20 77 68 65 6e 20 61 20 72 65 61 64 2d  led when a read-
1f570 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f  transaction is o
1f580 70 65 6e 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 61  pen on.** the pa
1f590 67 65 72 2e 20 49 74 20 72 65 74 75 72 6e 73 20  ger. It returns 
1f5a0 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
1f5b0 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
1f5c0 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
1f5d0 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65   However, if the
1f5e0 20 66 69 6c 65 20 69 73 20 62 65 74 77 65 65 6e   file is between
1f5f0 20 31 20 61 6e 64 20 3c 70 61 67 65 2d 73 69 7a   1 and <page-siz
1f600 65 3e 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  e> bytes in size
1f610 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20  , then .** this 
1f620 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20  is considered a 
1f630 31 20 70 61 67 65 20 66 69 6c 65 2e 0a 2a 2f 0a  1 page file..*/.
1f640 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
1f650 50 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20  Pagecount(Pager 
1f660 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 2a 70 6e  *pPager, int *pn
1f670 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28  Page){.  assert(
1f680 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
1f690 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b  =PAGER_SHARED );
1f6a0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1f6b0 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
1f6c0 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44  _WRITER_FINISHED
1f6d0 20 29 3b 0a 20 20 2a 70 6e 50 61 67 65 20 3d 20   );.  *pnPage = 
1f6e0 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 64 62 53  (int)pPager->dbS
1f6f0 69 7a 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ize;.  return SQ
1f700 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 73 74 61  LITE_OK;.}...sta
1f710 74 69 63 20 69 6e 74 20 70 61 67 65 72 4c 6f 63  tic int pagerLoc
1f720 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  k(Pager *pPager,
1f730 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69   int eLock){.  i
1f740 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  nt rc;.  assert(
1f750 20 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c   eLock==SHARED_L
1f760 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 52 45  OCK || eLock==RE
1f770 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65  SERVED_LOCK || e
1f780 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
1f790 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 50  LOCK );.  if( pP
1f7a0 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 65 4c 6f  ager->eLock>=eLo
1f7b0 63 6b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  ck ){.    rc = S
1f7c0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
1f7d0 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  e{.    rc = sqli
1f7e0 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72  te3OsLock(pPager
1f7f0 2d 3e 66 64 2c 20 65 4c 6f 63 6b 29 3b 0a 20 20  ->fd, eLock);.  
1f800 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1f810 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61  _OK ){.      pPa
1f820 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 65 4c 6f  ger->eLock = eLo
1f830 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ck;.    }.  }.  
1f840 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1f850 0a 2a 2a 20 54 72 79 20 74 6f 20 6f 62 74 61 69  .** Try to obtai
1f860 6e 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70 65  n a lock of type
1f870 20 6c 6f 63 6b 74 79 70 65 20 6f 6e 20 74 68 65   locktype on the
1f880 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
1f890 49 66 0a 2a 2a 20 61 20 73 69 6d 69 6c 61 72 20  If.** a similar 
1f8a0 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20  or greater lock 
1f8b0 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c  is already held,
1f8c0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
1f8d0 73 20 61 20 6e 6f 2d 6f 70 0a 2a 2a 20 28 72 65  s a no-op.** (re
1f8e0 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f  turning SQLITE_O
1f8f0 4b 20 69 6d 6d 65 64 69 61 74 65 6c 79 29 2e 0a  K immediately)..
1f900 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
1f910 20 61 74 74 65 6d 70 74 20 74 6f 20 6f 62 74 61   attempt to obta
1f920 69 6e 20 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e  in the lock usin
1f930 67 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  g sqlite3OsLock(
1f940 29 2e 20 49 6e 76 6f 6b 65 20 0a 2a 2a 20 74 68  ). Invoke .** th
1f950 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20  e busy callback 
1f960 69 66 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 63  if the lock is c
1f970 75 72 72 65 6e 74 6c 79 20 6e 6f 74 20 61 76 61  urrently not ava
1f980 69 6c 61 62 6c 65 2e 20 52 65 70 65 61 74 20 0a  ilable. Repeat .
1f990 2a 2a 20 75 6e 74 69 6c 20 74 68 65 20 62 75 73  ** until the bus
1f9a0 79 20 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72  y callback retur
1f9b0 6e 73 20 66 61 6c 73 65 20 6f 72 20 75 6e 74 69  ns false or unti
1f9c0 6c 20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f  l the attempt to
1f9d0 20 0a 2a 2a 20 6f 62 74 61 69 6e 20 74 68 65 20   .** obtain the 
1f9e0 6c 6f 63 6b 20 73 75 63 63 65 65 64 73 2e 0a 2a  lock succeeds..*
1f9f0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
1fa00 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
1fa10 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f   and an error co
1fa20 64 65 20 69 66 20 77 65 20 63 61 6e 6e 6f 74 20  de if we cannot 
1fa30 6f 62 74 61 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f  obtain.** the lo
1fa40 63 6b 2e 20 49 66 20 74 68 65 20 6c 6f 63 6b 20  ck. If the lock 
1fa50 69 73 20 6f 62 74 61 69 6e 65 64 20 73 75 63 63  is obtained succ
1fa60 65 73 73 66 75 6c 6c 79 2c 20 73 65 74 20 74 68  essfully, set th
1fa70 65 20 50 61 67 65 72 2e 73 74 61 74 65 20 0a 2a  e Pager.state .*
1fa80 2a 20 76 61 72 69 61 62 6c 65 20 74 6f 20 6c 6f  * variable to lo
1fa90 63 6b 74 79 70 65 20 62 65 66 6f 72 65 20 72 65  cktype before re
1faa0 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  turning..*/.stat
1fab0 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 61 69  ic int pager_wai
1fac0 74 5f 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65 72 20  t_on_lock(Pager 
1fad0 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 6f 63  *pPager, int loc
1fae0 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 72 63  ktype){.  int rc
1faf0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1fb00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1fb10 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
1fb20 0a 0a 20 20 2f 2a 20 54 68 65 20 4f 53 20 6c 6f  ..  /* The OS lo
1fb30 63 6b 20 76 61 6c 75 65 73 20 6d 75 73 74 20 62  ck values must b
1fb40 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  e the same as th
1fb50 65 20 50 61 67 65 72 20 6c 6f 63 6b 20 76 61 6c  e Pager lock val
1fb60 75 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ues */.  assert(
1fb70 20 50 41 47 45 52 5f 53 48 41 52 45 44 3d 3d 53   PAGER_SHARED==S
1fb80 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
1fb90 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 52 45  assert( PAGER_RE
1fba0 53 45 52 56 45 44 3d 3d 52 45 53 45 52 56 45 44  SERVED==RESERVED
1fbb0 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
1fbc0 74 28 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49  t( PAGER_EXCLUSI
1fbd0 56 45 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  VE==EXCLUSIVE_LO
1fbe0 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  CK );..  /* Chec
1fbf0 6b 20 74 68 61 74 20 74 68 69 73 20 69 73 20 65  k that this is e
1fc00 69 74 68 65 72 20 61 20 6e 6f 2d 6f 70 20 28 62  ither a no-op (b
1fc10 65 63 61 75 73 65 20 74 68 65 20 72 65 71 75 65  ecause the reque
1fc20 73 74 65 64 20 6c 6f 63 6b 20 69 73 20 0a 20 20  sted lock is .  
1fc30 2a 2a 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c  ** already held,
1fc40 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 74   or one of the t
1fc50 72 61 6e 73 69 73 74 69 6f 6e 73 20 74 68 61 74  ransistions that
1fc60 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65   the busy-handle
1fc70 72 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20 69 6e  r.  ** may be in
1fc80 76 6f 6b 65 64 20 64 75 72 69 6e 67 2c 20 61 63  voked during, ac
1fc90 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 63  cording to the c
1fca0 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 0a 20 20 2a  omment above.  *
1fcb0 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  * sqlite3PagerSe
1fcc0 74 42 75 73 79 68 61 6e 64 6c 65 72 28 29 2e 0a  tBusyhandler()..
1fcd0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28    */.  assert( (
1fce0 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 6c  pPager->eLock>=l
1fcf0 6f 63 6b 74 79 70 65 29 0a 20 20 20 20 20 20 20  ocktype).       
1fd00 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63  || (pPager->eLoc
1fd10 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 26 26 20 6c 6f  k==NO_LOCK && lo
1fd20 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
1fd30 4f 43 4b 29 0a 20 20 20 20 20 20 20 7c 7c 20 28  OCK).       || (
1fd40 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52  pPager->eLock==R
1fd50 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20  ESERVED_LOCK && 
1fd60 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53  locktype==EXCLUS
1fd70 49 56 45 5f 4c 4f 43 4b 29 0a 20 20 29 3b 0a 0a  IVE_LOCK).  );..
1fd80 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 4c    if( pPager->eL
1fd90 6f 63 6b 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b  ock>=locktype ){
1fda0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
1fdb0 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
1fdc0 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 72 63 20    do {.      rc 
1fdd0 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  = sqlite3OsLock(
1fde0 70 50 61 67 65 72 2d 3e 66 64 2c 20 6c 6f 63 6b  pPager->fd, lock
1fdf0 74 79 70 65 29 3b 0a 20 20 20 20 7d 77 68 69 6c  type);.    }whil
1fe00 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  e( rc==SQLITE_BU
1fe10 53 59 20 26 26 20 70 50 61 67 65 72 2d 3e 78 42  SY && pPager->xB
1fe20 75 73 79 48 61 6e 64 6c 65 72 28 70 50 61 67 65  usyHandler(pPage
1fe30 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41  r->pBusyHandlerA
1fe40 72 67 29 20 29 3b 0a 20 20 20 20 69 66 28 20 72  rg) );.    if( r
1fe50 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1fe60 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 4c        pPager->eL
1fe70 6f 63 6b 20 3d 20 28 75 38 29 6c 6f 63 6b 74 79  ock = (u8)lockty
1fe80 70 65 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43  pe;.      IOTRAC
1fe90 45 28 28 22 4c 4f 43 4b 20 25 70 20 25 64 5c 6e  E(("LOCK %p %d\n
1fea0 22 2c 20 70 50 61 67 65 72 2c 20 6c 6f 63 6b 74  ", pPager, lockt
1feb0 79 70 65 29 29 0a 20 20 20 20 7d 0a 20 20 7d 0a  ype)).    }.  }.
1fec0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1fed0 2f 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 61  /*.** Function a
1fee0 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e  ssertTruncateCon
1fef0 73 74 72 61 69 6e 74 28 70 50 61 67 65 72 29 20  straint(pPager) 
1ff00 63 68 65 63 6b 73 20 74 68 61 74 20 6f 6e 65 20  checks that one 
1ff10 6f 66 20 74 68 65 20 0a 2a 2a 20 66 6f 6c 6c 6f  of the .** follo
1ff20 77 69 6e 67 20 69 73 20 74 72 75 65 20 66 6f 72  wing is true for
1ff30 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73   all dirty pages
1ff40 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68   currently in th
1ff50 65 20 70 61 67 65 2d 63 61 63 68 65 3a 0a 2a 2a  e page-cache:.**
1ff60 0a 2a 2a 20 20 20 61 29 20 54 68 65 20 70 61 67  .**   a) The pag
1ff70 65 20 6e 75 6d 62 65 72 20 69 73 20 6c 65 73 73  e number is less
1ff80 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
1ff90 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  o the size of th
1ffa0 65 20 0a 2a 2a 20 20 20 20 20 20 63 75 72 72 65  e .**      curre
1ffb0 6e 74 20 64 61 74 61 62 61 73 65 20 69 6d 61 67  nt database imag
1ffc0 65 2c 20 69 6e 20 70 61 67 65 73 2c 20 4f 52 0a  e, in pages, OR.
1ffd0 2a 2a 0a 2a 2a 20 20 20 62 29 20 69 66 20 74 68  **.**   b) if th
1ffe0 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 77  e page content w
1fff0 65 72 65 20 77 72 69 74 74 65 6e 20 61 74 20 74  ere written at t
20000 68 69 73 20 74 69 6d 65 2c 20 69 74 20 77 6f 75  his time, it wou
20010 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 62  ld not.**      b
20020 65 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77  e necessary to w
20030 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74  rite the current
20040 20 63 6f 6e 74 65 6e 74 20 6f 75 74 20 74 6f 20   content out to 
20050 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a  the sub-journal.
20060 2a 2a 20 20 20 20 20 20 28 61 73 20 64 65 74 65  **      (as dete
20070 72 6d 69 6e 65 64 20 62 79 20 66 75 6e 63 74 69  rmined by functi
20080 6f 6e 20 73 75 62 6a 52 65 71 75 69 72 65 73 50  on subjRequiresP
20090 61 67 65 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  age())..**.** If
200a0 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 61   the condition a
200b0 73 73 65 72 74 65 64 20 62 79 20 74 68 69 73 20  sserted by this 
200c0 66 75 6e 63 74 69 6f 6e 20 77 65 72 65 20 6e 6f  function were no
200d0 74 20 74 72 75 65 2c 20 61 6e 64 20 74 68 65 0a  t true, and the.
200e0 2a 2a 20 64 69 72 74 79 20 70 61 67 65 20 77 65  ** dirty page we
200f0 72 65 20 74 6f 20 62 65 20 64 69 73 63 61 72 64  re to be discard
20100 65 64 20 66 72 6f 6d 20 74 68 65 20 63 61 63 68  ed from the cach
20110 65 20 76 69 61 20 74 68 65 20 70 61 67 65 72 53  e via the pagerS
20120 74 72 65 73 73 28 29 0a 2a 2a 20 72 6f 75 74 69  tress().** routi
20130 6e 65 2c 20 70 61 67 65 72 53 74 72 65 73 73 28  ne, pagerStress(
20140 29 20 77 6f 75 6c 64 20 6e 6f 74 20 77 72 69 74  ) would not writ
20150 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  e the current pa
20160 67 65 20 63 6f 6e 74 65 6e 74 20 74 6f 0a 2a 2a  ge content to.**
20170 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
20180 6c 65 2e 20 49 66 20 61 20 73 61 76 65 70 6f 69  le. If a savepoi
20190 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  nt transaction w
201a0 65 72 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  ere rolled back 
201b0 61 66 74 65 72 0a 2a 2a 20 74 68 69 73 20 68 61  after.** this ha
201c0 70 70 65 6e 65 64 2c 20 74 68 65 20 63 6f 72 72  ppened, the corr
201d0 65 63 74 20 62 65 68 61 76 69 6f 75 72 20 77 6f  ect behaviour wo
201e0 75 6c 64 20 62 65 20 74 6f 20 72 65 73 74 6f 72  uld be to restor
201f0 65 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a  e the current.**
20200 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
20210 70 61 67 65 2e 20 48 6f 77 65 76 65 72 2c 20 73  page. However, s
20220 69 6e 63 65 20 74 68 69 73 20 63 6f 6e 74 65 6e  ince this conten
20230 74 20 69 73 20 6e 6f 74 20 70 72 65 73 65 6e 74  t is not present
20240 20 69 6e 20 65 69 74 68 65 72 0a 2a 2a 20 74 68   in either.** th
20250 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
20260 6f 72 20 74 68 65 20 70 6f 72 74 69 6f 6e 20 6f  or the portion o
20270 66 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  f the rollback j
20280 6f 75 72 6e 61 6c 20 61 6e 64 20 0a 2a 2a 20 73  ournal and .** s
20290 75 62 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 65  ub-journal rolle
202a0 64 20 62 61 63 6b 20 74 68 65 20 63 6f 6e 74 65  d back the conte
202b0 6e 74 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20  nt could not be 
202c0 72 65 73 74 6f 72 65 64 20 61 6e 64 20 74 68 65  restored and the
202d0 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6d 61  .** database ima
202e0 67 65 20 77 6f 75 6c 64 20 62 65 63 6f 6d 65 20  ge would become 
202f0 63 6f 72 72 75 70 74 2e 20 49 74 20 69 73 20 74  corrupt. It is t
20300 68 65 72 65 66 6f 72 65 20 66 6f 72 74 75 6e 61  herefore fortuna
20310 74 65 20 74 68 61 74 20 0a 2a 2a 20 74 68 69 73  te that .** this
20320 20 63 69 72 63 75 6d 73 74 61 6e 63 65 20 63 61   circumstance ca
20330 6e 6e 6f 74 20 61 72 69 73 65 2e 0a 2a 2f 0a 23  nnot arise..*/.#
20340 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
20350 45 5f 44 45 42 55 47 29 0a 73 74 61 74 69 63 20  E_DEBUG).static 
20360 76 6f 69 64 20 61 73 73 65 72 74 54 72 75 6e 63  void assertTrunc
20370 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 62 28  ateConstraintCb(
20380 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 61  PgHdr *pPg){.  a
20390 73 73 65 72 74 28 20 70 50 67 2d 3e 66 6c 61 67  ssert( pPg->flag
203a0 73 26 50 47 48 44 52 5f 44 49 52 54 59 20 29 3b  s&PGHDR_DIRTY );
203b0 0a 20 20 61 73 73 65 72 74 28 20 21 73 75 62 6a  .  assert( !subj
203c0 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50 67  RequiresPage(pPg
203d0 29 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d  ) || pPg->pgno<=
203e0 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 64 62 53  pPg->pPager->dbS
203f0 69 7a 65 20 29 3b 0a 7d 0a 73 74 61 74 69 63 20  ize );.}.static 
20400 76 6f 69 64 20 61 73 73 65 72 74 54 72 75 6e 63  void assertTrunc
20410 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 50 61  ateConstraint(Pa
20420 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
20430 73 71 6c 69 74 65 33 50 63 61 63 68 65 49 74 65  sqlite3PcacheIte
20440 72 61 74 65 44 69 72 74 79 28 70 50 61 67 65 72  rateDirty(pPager
20450 2d 3e 70 50 43 61 63 68 65 2c 20 61 73 73 65 72  ->pPCache, asser
20460 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61  tTruncateConstra
20470 69 6e 74 43 62 29 3b 0a 7d 0a 23 65 6c 73 65 0a  intCb);.}.#else.
20480 23 20 64 65 66 69 6e 65 20 61 73 73 65 72 74 54  # define assertT
20490 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e  runcateConstrain
204a0 74 28 70 50 61 67 65 72 29 0a 23 65 6e 64 69 66  t(pPager).#endif
204b0 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65  ../*.** Truncate
204c0 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 64   the in-memory d
204d0 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6d 61  atabase file ima
204e0 67 65 20 74 6f 20 6e 50 61 67 65 20 70 61 67 65  ge to nPage page
204f0 73 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63  s. This .** func
20500 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 61 63  tion does not ac
20510 74 75 61 6c 6c 79 20 6d 6f 64 69 66 79 20 74 68  tually modify th
20520 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
20530 6f 6e 20 64 69 73 6b 2e 20 49 74 20 0a 2a 2a 20  on disk. It .** 
20540 6a 75 73 74 20 73 65 74 73 20 74 68 65 20 69 6e  just sets the in
20550 74 65 72 6e 61 6c 20 73 74 61 74 65 20 6f 66 20  ternal state of 
20560 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74  the pager object
20570 20 73 6f 20 74 68 61 74 20 74 68 65 20 0a 2a 2a   so that the .**
20580 20 74 72 75 6e 63 61 74 69 6f 6e 20 77 69 6c 6c   truncation will
20590 20 62 65 20 64 6f 6e 65 20 77 68 65 6e 20 74 68   be done when th
205a0 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
205b0 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74  ction is committ
205c0 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
205d0 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65  te3PagerTruncate
205e0 49 6d 61 67 65 28 50 61 67 65 72 20 2a 70 50 61  Image(Pager *pPa
205f0 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29  ger, Pgno nPage)
20600 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  {.  assert( pPag
20610 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 6e 50 61 67  er->dbSize>=nPag
20620 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
20630 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
20640 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
20650 45 4d 4f 44 20 29 3b 0a 20 20 70 50 61 67 65 72  EMOD );.  pPager
20660 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65  ->dbSize = nPage
20670 3b 0a 20 20 61 73 73 65 72 74 54 72 75 6e 63 61  ;.  assertTrunca
20680 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61  teConstraint(pPa
20690 67 65 72 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  ger);.}.../*.** 
206a0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
206b0 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 61   called before a
206c0 74 74 65 6d 70 74 69 6e 67 20 61 20 68 6f 74 2d  ttempting a hot-
206d0 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
206e0 2e 20 49 74 0a 2a 2a 20 73 79 6e 63 73 20 74 68  . It.** syncs th
206f0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  e journal file t
20700 6f 20 64 69 73 6b 2c 20 74 68 65 6e 20 73 65 74  o disk, then set
20710 73 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  s pPager->journa
20720 6c 48 64 72 20 74 6f 20 74 68 65 0a 2a 2a 20 73  lHdr to the.** s
20730 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
20740 61 6c 20 66 69 6c 65 20 73 6f 20 74 68 61 74 20  al file so that 
20750 74 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61  the pager_playba
20760 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 6b 6e 6f  ck() routine kno
20770 77 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 65  ws.** that the e
20780 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c 20 66 69  ntire journal fi
20790 6c 65 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63  le has been sync
207a0 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 79 6e 63 69 6e  ed..**.** Syncin
207b0 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  g a hot-journal 
207c0 74 6f 20 64 69 73 6b 20 62 65 66 6f 72 65 20 61  to disk before a
207d0 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 72 6f 6c  ttempting to rol
207e0 6c 20 69 74 20 62 61 63 6b 20 65 6e 73 75 72 65  l it back ensure
207f0 73 20 0a 2a 2a 20 74 68 61 74 20 69 66 20 61 20  s .** that if a 
20800 70 6f 77 65 72 2d 66 61 69 6c 75 72 65 20 6f 63  power-failure oc
20810 63 75 72 73 20 64 75 72 69 6e 67 20 74 68 65 20  curs during the 
20820 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 70 72  rollback, the pr
20830 6f 63 65 73 73 20 74 68 61 74 0a 2a 2a 20 61 74  ocess that.** at
20840 74 65 6d 70 74 73 20 72 6f 6c 6c 62 61 63 6b 20  tempts rollback 
20850 66 6f 6c 6c 6f 77 69 6e 67 20 73 79 73 74 65 6d  following system
20860 20 72 65 63 6f 76 65 72 79 20 73 65 65 73 20 74   recovery sees t
20870 68 65 20 73 61 6d 65 20 6a 6f 75 72 6e 61 6c 0a  he same journal.
20880 2a 2a 20 63 6f 6e 74 65 6e 74 20 61 73 20 74 68  ** content as th
20890 69 73 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a  is process..**.*
208a0 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e 67 20  * If everything 
208b0 67 6f 65 73 20 61 73 20 70 6c 61 6e 6e 65 64 2c  goes as planned,
208c0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
208d0 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
208e0 65 2c 20 0a 2a 2a 20 61 6e 20 53 51 4c 69 74 65  e, .** an SQLite
208f0 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a   error code..*/.
20900 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
20910 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 50  SyncHotJournal(P
20920 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
20930 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
20940 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 70 50 61 67  _OK;.  if( !pPag
20950 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20  er->noSync ){.  
20960 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
20970 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64  Sync(pPager->jfd
20980 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f  , SQLITE_SYNC_NO
20990 52 4d 41 4c 29 3b 0a 20 20 7d 0a 20 20 69 66 28  RMAL);.  }.  if(
209a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
209b0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
209c0 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
209d0 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65  ger->jfd, &pPage
209e0 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 3b 0a  r->journalHdr);.
209f0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
20a00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f  .}../*.** Shutdo
20a10 77 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68  wn the page cach
20a20 65 2e 20 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d  e.  Free all mem
20a30 6f 72 79 20 61 6e 64 20 63 6c 6f 73 65 20 61 6c  ory and close al
20a40 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49  l files..**.** I
20a50 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
20a60 77 61 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20  was in progress 
20a70 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
20a80 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 61  e is called, tha
20a90 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  t.** transaction
20aa0 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   is rolled back.
20ab0 20 20 41 6c 6c 20 6f 75 74 73 74 61 6e 64 69 6e    All outstandin
20ac0 67 20 70 61 67 65 73 20 61 72 65 20 69 6e 76 61  g pages are inva
20ad0 6c 69 64 61 74 65 64 0a 2a 2a 20 61 6e 64 20 74  lidated.** and t
20ae0 68 65 69 72 20 6d 65 6d 6f 72 79 20 69 73 20 66  heir memory is f
20af0 72 65 65 64 2e 20 20 41 6e 79 20 61 74 74 65 6d  reed.  Any attem
20b00 70 74 20 74 6f 20 75 73 65 20 61 20 70 61 67 65  pt to use a page
20b10 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77   associated.** w
20b20 69 74 68 20 74 68 69 73 20 70 61 67 65 20 63 61  ith this page ca
20b30 63 68 65 20 61 66 74 65 72 20 74 68 69 73 20 66  che after this f
20b40 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
20b50 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72  will likely.** r
20b60 65 73 75 6c 74 20 69 6e 20 61 20 63 6f 72 65 64  esult in a cored
20b70 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ump..**.** This 
20b80 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73 20  function always 
20b90 73 75 63 63 65 65 64 73 2e 20 49 66 20 61 20 74  succeeds. If a t
20ba0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
20bb0 74 69 76 65 20 61 6e 20 61 74 74 65 6d 70 74 0a  tive an attempt.
20bc0 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f 20 72 6f  ** is made to ro
20bd0 6c 6c 20 69 74 20 62 61 63 6b 2e 20 49 66 20 61  ll it back. If a
20be0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  n error occurs d
20bf0 75 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61  uring the rollba
20c00 63 6b 20 0a 2a 2a 20 61 20 68 6f 74 20 6a 6f 75  ck .** a hot jou
20c10 72 6e 61 6c 20 6d 61 79 20 62 65 20 6c 65 66 74  rnal may be left
20c20 20 69 6e 20 74 68 65 20 66 69 6c 65 73 79 73 74   in the filesyst
20c30 65 6d 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20  em but no error 
20c40 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 74  is returned.** t
20c50 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f  o the caller..*/
20c60 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
20c70 72 43 6c 6f 73 65 28 50 61 67 65 72 20 2a 70 50  rClose(Pager *pP
20c80 61 67 65 72 29 7b 0a 20 20 75 38 20 2a 70 54 6d  ager){.  u8 *pTm
20c90 70 20 3d 20 28 75 38 20 2a 29 70 50 61 67 65 72  p = (u8 *)pPager
20ca0 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 0a 20 20  ->pTmpSpace;..  
20cb0 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65  disable_simulate
20cc0 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20  d_io_errors();. 
20cd0 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
20ce0 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 2f  ignMalloc();.  /
20cf0 2a 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  * pPager->errCod
20d00 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  e = 0; */.  pPag
20d10 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
20d20 65 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53  e = 0;.#ifndef S
20d30 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20  QLITE_OMIT_WAL. 
20d40 20 73 71 6c 69 74 65 33 57 61 6c 43 6c 6f 73 65   sqlite3WalClose
20d50 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 0a 20  (pPager->pWal,. 
20d60 20 20 20 28 70 50 61 67 65 72 2d 3e 6e 6f 53 79     (pPager->noSy
20d70 6e 63 20 3f 20 30 20 3a 20 70 50 61 67 65 72 2d  nc ? 0 : pPager-
20d80 3e 73 79 6e 63 5f 66 6c 61 67 73 29 2c 20 0a 20  >sync_flags), . 
20d90 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53     pPager->pageS
20da0 69 7a 65 2c 20 70 54 6d 70 0a 20 20 29 3b 0a 20  ize, pTmp.  );. 
20db0 20 70 50 61 67 65 72 2d 3e 70 57 61 6c 20 3d 20   pPager->pWal = 
20dc0 30 3b 0a 23 65 6e 64 69 66 0a 20 20 70 61 67 65  0;.#endif.  page
20dd0 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
20de0 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a  .  if( MEMDB ){.
20df0 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b      pager_unlock
20e00 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73  (pPager);.  }els
20e10 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 69 74 20  e{.    /* If it 
20e20 69 73 20 6f 70 65 6e 2c 20 73 79 6e 63 20 74 68  is open, sync th
20e30 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62  e journal file b
20e40 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 55 6e  efore calling Un
20e50 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 2e  lockAndRollback.
20e60 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20  .    ** If this 
20e70 69 73 20 6e 6f 74 20 64 6f 6e 65 2c 20 74 68 65  is not done, the
20e80 6e 20 61 6e 20 75 6e 73 79 6e 63 65 64 20 70 6f  n an unsynced po
20e90 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6f 70 65  rtion of the ope
20ea0 6e 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 20 20 2a  n journal .    *
20eb0 2a 20 66 69 6c 65 20 6d 61 79 20 62 65 20 70 6c  * file may be pl
20ec0 61 79 65 64 20 62 61 63 6b 20 69 6e 74 6f 20 74  ayed back into t
20ed0 68 65 20 64 61 74 61 62 61 73 65 2e 20 49 66 20  he database. If 
20ee0 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  a power failure 
20ef0 6f 63 63 75 72 73 20 0a 20 20 20 20 2a 2a 20 77  occurs .    ** w
20f00 68 69 6c 65 20 74 68 69 73 20 69 73 20 68 61 70  hile this is hap
20f10 70 65 6e 69 6e 67 2c 20 74 68 65 20 64 61 74 61  pening, the data
20f20 62 61 73 65 20 63 6f 75 6c 64 20 62 65 63 6f 6d  base could becom
20f30 65 20 63 6f 72 72 75 70 74 2e 0a 20 20 20 20 2a  e corrupt..    *
20f40 2a 0a 20 20 20 20 2a 2a 20 49 66 20 61 6e 20 65  *.    ** If an e
20f50 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
20f60 65 20 74 72 79 69 6e 67 20 74 6f 20 73 79 6e 63  e trying to sync
20f70 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 73 68   the journal, sh
20f80 69 66 74 20 74 68 65 20 70 61 67 65 72 0a 20 20  ift the pager.  
20f90 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 45 52    ** into the ER
20fa0 52 4f 52 20 73 74 61 74 65 2e 20 54 68 69 73 20  ROR state. This 
20fb0 63 61 75 73 65 73 20 55 6e 6c 6f 63 6b 41 6e 64  causes UnlockAnd
20fc0 52 6f 6c 6c 62 61 63 6b 20 74 6f 20 75 6e 6c 6f  Rollback to unlo
20fd0 63 6b 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61  ck the.    ** da
20fe0 74 61 62 61 73 65 20 61 6e 64 20 63 6c 6f 73 65  tabase and close
20ff0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
21000 65 20 77 69 74 68 6f 75 74 20 61 74 74 65 6d 70  e without attemp
21010 74 69 6e 67 20 74 6f 20 72 6f 6c 6c 20 69 74 0a  ting to roll it.
21020 20 20 20 20 2a 2a 20 62 61 63 6b 20 6f 72 20 66      ** back or f
21030 69 6e 61 6c 69 7a 65 20 69 74 2e 20 54 68 65 20  inalize it. The 
21040 6e 65 78 74 20 64 61 74 61 62 61 73 65 20 75 73  next database us
21050 65 72 20 77 69 6c 6c 20 68 61 76 65 20 74 6f 20  er will have to 
21060 64 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 20  do hot-journal. 
21070 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 62     ** rollback b
21080 65 66 6f 72 65 20 61 63 63 65 73 73 69 6e 67 20  efore accessing 
21090 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
210a0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
210b0 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
210c0 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 70  >jfd) ){.      p
210d0 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
210e0 72 2c 20 70 61 67 65 72 53 79 6e 63 48 6f 74 4a  r, pagerSyncHotJ
210f0 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 29 3b  ournal(pPager));
21100 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72  .    }.    pager
21110 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63  UnlockAndRollbac
21120 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  k(pPager);.  }. 
21130 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
21140 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 65 6e 61  nMalloc();.  ena
21150 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
21160 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 50 41 47  _errors();.  PAG
21170 45 52 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20  ERTRACE(("CLOSE 
21180 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
21190 50 61 67 65 72 29 29 29 3b 0a 20 20 49 4f 54 52  Pager)));.  IOTR
211a0 41 43 45 28 28 22 43 4c 4f 53 45 20 25 70 5c 6e  ACE(("CLOSE %p\n
211b0 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 73 71  ", pPager)).  sq
211c0 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
211d0 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 73 71 6c  ger->jfd);.  sql
211e0 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
211f0 65 72 2d 3e 66 64 29 3b 0a 20 20 73 71 6c 69 74  er->fd);.  sqlit
21200 65 33 50 61 67 65 46 72 65 65 28 70 54 6d 70 29  e3PageFree(pTmp)
21210 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  ;.  sqlite3Pcach
21220 65 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 70  eClose(pPager->p
21230 50 43 61 63 68 65 29 3b 0a 0a 23 69 66 64 65 66  PCache);..#ifdef
21240 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
21250 43 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  C.  if( pPager->
21260 78 43 6f 64 65 63 46 72 65 65 20 29 20 70 50 61  xCodecFree ) pPa
21270 67 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 65 28  ger->xCodecFree(
21280 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 29 3b  pPager->pCodec);
21290 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
212a0 74 28 20 21 70 50 61 67 65 72 2d 3e 61 53 61 76  t( !pPager->aSav
212b0 65 70 6f 69 6e 74 20 26 26 20 21 70 50 61 67 65  epoint && !pPage
212c0 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b  r->pInJournal );
212d0 0a 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70  .  assert( !isOp
212e0 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
212f0 26 26 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  && !isOpen(pPage
21300 72 2d 3e 73 6a 66 64 29 20 29 3b 0a 0a 20 20 73  r->sjfd) );..  s
21310 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67  qlite3_free(pPag
21320 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  er);.  return SQ
21330 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20  LITE_OK;.}..#if 
21340 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29  !defined(NDEBUG)
21350 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
21360 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52  TE_TEST)./*.** R
21370 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 20 6e  eturn the page n
21380 75 6d 62 65 72 20 66 6f 72 20 70 61 67 65 20 70  umber for page p
21390 50 67 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69  Pg..*/.Pgno sqli
213a0 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62  te3PagerPagenumb
213b0 65 72 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  er(DbPage *pPg){
213c0 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 70  .  return pPg->p
213d0 67 6e 6f 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  gno;.}.#endif../
213e0 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74  *.** Increment t
213f0 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
21400 6e 74 20 66 6f 72 20 70 61 67 65 20 70 50 67 2e  nt for page pPg.
21410 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
21420 50 61 67 65 72 52 65 66 28 44 62 50 61 67 65 20  PagerRef(DbPage 
21430 2a 70 50 67 29 7b 0a 20 20 73 71 6c 69 74 65 33  *pPg){.  sqlite3
21440 50 63 61 63 68 65 52 65 66 28 70 50 67 29 3b 0a  PcacheRef(pPg);.
21450 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68  }../*.** Sync th
21460 65 20 6a 6f 75 72 6e 61 6c 2e 20 49 6e 20 6f 74  e journal. In ot
21470 68 65 72 20 77 6f 72 64 73 2c 20 6d 61 6b 65 20  her words, make 
21480 73 75 72 65 20 61 6c 6c 20 74 68 65 20 70 61 67  sure all the pag
21490 65 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20  es that have.** 
214a0 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
214b0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 76 65  the journal have
214c0 20 61 63 74 75 61 6c 6c 79 20 72 65 61 63 68 65   actually reache
214d0 64 20 74 68 65 20 73 75 72 66 61 63 65 20 6f 66  d the surface of
214e0 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64   the.** disk and
214f0 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64   can be restored
21500 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66   in the event of
21510 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72   a hot-journal r
21520 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49  ollback..**.** I
21530 66 20 74 68 65 20 50 61 67 65 72 2e 6e 6f 53 79  f the Pager.noSy
21540 6e 63 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  nc flag is set, 
21550 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  then this functi
21560 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
21570 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65  * Otherwise, the
21580 20 61 63 74 69 6f 6e 73 20 72 65 71 75 69 72 65   actions require
21590 64 20 64 65 70 65 6e 64 20 6f 6e 20 74 68 65 20  d depend on the 
215a0 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 61 6e 64  journal-mode and
215b0 20 74 68 65 20 0a 2a 2a 20 64 65 76 69 63 65 20   the .** device 
215c0 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  characteristics 
215d0 6f 66 20 74 68 65 20 74 68 65 20 66 69 6c 65 2d  of the the file-
215e0 73 79 73 74 65 6d 2c 20 61 73 20 66 6f 6c 6c 6f  system, as follo
215f0 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66  ws:.**.**   * If
21600 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
21610 65 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  e is an in-memor
21620 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  y journal file, 
21630 6e 6f 20 61 63 74 69 6f 6e 20 6e 65 65 64 0a 2a  no action need.*
21640 2a 20 20 20 20 20 62 65 20 74 61 6b 65 6e 2e 0a  *     be taken..
21650 2a 2a 0a 2a 2a 20 20 20 2a 20 4f 74 68 65 72 77  **.**   * Otherw
21660 69 73 65 2c 20 69 66 20 74 68 65 20 64 65 76 69  ise, if the devi
21670 63 65 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70  ce does not supp
21680 6f 72 74 20 74 68 65 20 53 41 46 45 5f 41 50 50  ort the SAFE_APP
21690 45 4e 44 20 70 72 6f 70 65 72 74 79 2c 0a 2a 2a  END property,.**
216a0 20 20 20 20 20 74 68 65 6e 20 74 68 65 20 6e 52       then the nR
216b0 65 63 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  ec field of the 
216c0 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 77 72  most recently wr
216d0 69 74 74 65 6e 20 6a 6f 75 72 6e 61 6c 20 68 65  itten journal he
216e0 61 64 65 72 0a 2a 2a 20 20 20 20 20 69 73 20 75  ader.**     is u
216f0 70 64 61 74 65 64 20 74 6f 20 63 6f 6e 74 61 69  pdated to contai
21700 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
21710 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 73 20  journal records 
21720 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 20 20 20  that have.**    
21730 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 66 6f   been written fo
21740 6c 6c 6f 77 69 6e 67 20 69 74 2e 20 49 66 20 74  llowing it. If t
21750 68 65 20 70 61 67 65 72 20 69 73 20 6f 70 65 72  he pager is oper
21760 61 74 69 6e 67 20 69 6e 20 66 75 6c 6c 2d 73 79  ating in full-sy
21770 6e 63 0a 2a 2a 20 20 20 20 20 6d 6f 64 65 2c 20  nc.**     mode, 
21780 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  then the journal
21790 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64 20   file is synced 
217a0 62 65 66 6f 72 65 20 74 68 69 73 20 66 69 65 6c  before this fiel
217b0 64 20 69 73 20 75 70 64 61 74 65 64 2e 0a 2a 2a  d is updated..**
217c0 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20 64  .**   * If the d
217d0 65 76 69 63 65 20 64 6f 65 73 20 6e 6f 74 20 73  evice does not s
217e0 75 70 70 6f 72 74 20 74 68 65 20 53 45 51 55 45  upport the SEQUE
217f0 4e 54 49 41 4c 20 70 72 6f 70 65 72 74 79 2c 20  NTIAL property, 
21800 74 68 65 6e 20 0a 2a 2a 20 20 20 20 20 6a 6f 75  then .**     jou
21810 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 73 79 6e  rnal file is syn
21820 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69  ced..**.** Or, i
21830 6e 20 70 73 65 75 64 6f 2d 63 6f 64 65 3a 0a 2a  n pseudo-code:.*
21840 2a 0a 2a 2a 20 20 20 69 66 28 20 4e 4f 54 20 3c  *.**   if( NOT <
21850 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61  in-memory journa
21860 6c 3e 20 29 7b 0a 2a 2a 20 20 20 20 20 69 66 28  l> ){.**     if(
21870 20 4e 4f 54 20 53 41 46 45 5f 41 50 50 45 4e 44   NOT SAFE_APPEND
21880 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 69 66 28   ){.**       if(
21890 20 3c 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65   <full-sync mode
218a0 3e 20 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72 6e  > ) xSync(<journ
218b0 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20  al file>);.**   
218c0 20 20 20 20 3c 75 70 64 61 74 65 20 6e 52 65 63      <update nRec
218d0 20 66 69 65 6c 64 3e 0a 2a 2a 20 20 20 20 20 7d   field>.**     }
218e0 20 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f 54   .**     if( NOT
218f0 20 53 45 51 55 45 4e 54 49 41 4c 20 29 20 78 53   SEQUENTIAL ) xS
21900 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c  ync(<journal fil
21910 65 3e 29 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a  e>);.**   }.**.*
21920 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
21930 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6c   this routine cl
21940 65 61 72 73 20 74 68 65 20 50 47 48 44 52 5f 4e  ears the PGHDR_N
21950 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 6f 66  EED_SYNC flag of
21960 20 65 76 65 72 79 20 0a 2a 2a 20 70 61 67 65 20   every .** page 
21970 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 69  currently held i
21980 6e 20 6d 65 6d 6f 72 79 20 62 65 66 6f 72 65 20  n memory before 
21990 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45  returning SQLITE
219a0 5f 4f 4b 2e 20 49 66 20 61 6e 20 49 4f 0a 2a 2a  _OK. If an IO.**
219b0 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e   error is encoun
219c0 74 65 72 65 64 2c 20 74 68 65 6e 20 74 68 65 20  tered, then the 
219d0 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
219e0 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65   returned to the
219f0 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74   caller..*/.stat
21a00 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e  ic int syncJourn
21a10 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
21a20 2c 20 69 6e 74 20 6e 65 77 48 64 72 29 7b 0a 20  , int newHdr){. 
21a30 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
21a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a50 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
21a60 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
21a70 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
21a80 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
21a90 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 50  MOD.       || pP
21aa0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
21ab0 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44  GER_WRITER_DBMOD
21ac0 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  .  );.  assert( 
21ad0 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
21ae0 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  te(pPager) );.  
21af0 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73  assert( !pagerUs
21b00 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
21b10 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
21b20 61 67 65 72 45 78 63 6c 75 73 69 76 65 4c 6f 63  agerExclusiveLoc
21b30 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  k(pPager);.  if(
21b40 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
21b50 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 69   return rc;..  i
21b60 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79  f( !pPager->noSy
21b70 6e 63 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  nc ){.    assert
21b80 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  ( !pPager->tempF
21b90 69 6c 65 20 29 3b 0a 20 20 20 20 69 66 28 20 69  ile );.    if( i
21ba0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
21bb0 64 29 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f  d) && pPager->jo
21bc0 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52  urnalMode!=PAGER
21bd0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
21be0 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e  ORY ){.      con
21bf0 73 74 20 69 6e 74 20 69 44 63 20 3d 20 73 71 6c  st int iDc = sql
21c00 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
21c10 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67  acteristics(pPag
21c20 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 61  er->fd);.      a
21c30 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
21c40 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20  ager->jfd) );.. 
21c50 20 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63       if( 0==(iDc
21c60 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41  &SQLITE_IOCAP_SA
21c70 46 45 5f 41 50 50 45 4e 44 29 20 29 7b 0a 20 20  FE_APPEND) ){.  
21c80 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c        /* This bl
21c90 6f 63 6b 20 64 65 61 6c 73 20 77 69 74 68 20 61  ock deals with a
21ca0 6e 20 6f 62 73 63 75 72 65 20 70 72 6f 62 6c 65  n obscure proble
21cb0 6d 2e 20 49 66 20 74 68 65 20 6c 61 73 74 20 63  m. If the last c
21cc0 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20 20 20 20 20  onnection.      
21cd0 20 20 2a 2a 20 74 68 61 74 20 77 72 6f 74 65 20    ** that wrote 
21ce0 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65  to this database
21cf0 20 77 61 73 20 6f 70 65 72 61 74 69 6e 67 20 69   was operating i
21d00 6e 20 70 65 72 73 69 73 74 65 6e 74 2d 6a 6f 75  n persistent-jou
21d10 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20  rnal.        ** 
21d20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20 6a  mode, then the j
21d30 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20  ournal file may 
21d40 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 61 63  at this point ac
21d50 74 75 61 6c 6c 79 20 62 65 20 6c 61 72 67 65 72  tually be larger
21d60 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 6e  .        ** than
21d70 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66   Pager.journalOf
21d80 66 20 62 79 74 65 73 2e 20 49 66 20 74 68 65 20  f bytes. If the 
21d90 6e 65 78 74 20 74 68 69 6e 67 20 69 6e 20 74 68  next thing in th
21da0 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20  e journal.      
21db0 20 20 2a 2a 20 66 69 6c 65 20 68 61 70 70 65 6e    ** file happen
21dc0 73 20 74 6f 20 62 65 20 61 20 6a 6f 75 72 6e 61  s to be a journa
21dd0 6c 2d 68 65 61 64 65 72 20 28 77 72 69 74 74 65  l-header (writte
21de0 6e 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65  n as part of the
21df0 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 65 76  .        ** prev
21e00 69 6f 75 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 27  ious connection'
21e10 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20  s transaction), 
21e20 61 6e 64 20 61 20 63 72 61 73 68 20 6f 72 20 70  and a crash or p
21e30 6f 77 65 72 2d 66 61 69 6c 75 72 65 20 0a 20 20  ower-failure .  
21e40 20 20 20 20 20 20 2a 2a 20 6f 63 63 75 72 73 20        ** occurs 
21e50 61 66 74 65 72 20 6e 52 65 63 20 69 73 20 75 70  after nRec is up
21e60 64 61 74 65 64 20 62 75 74 20 62 65 66 6f 72 65  dated but before
21e70 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e   this connection
21e80 20 77 72 69 74 65 73 20 0a 20 20 20 20 20 20 20   writes .       
21e90 20 2a 2a 20 61 6e 79 74 68 69 6e 67 20 65 6c 73   ** anything els
21ea0 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e to the journal
21eb0 20 66 69 6c 65 20 28 6f 72 20 63 6f 6d 6d 69 74   file (or commit
21ec0 73 2f 72 6f 6c 6c 73 20 62 61 63 6b 20 69 74 73  s/rolls back its
21ed0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72 61   .        ** tra
21ee0 6e 73 61 63 74 69 6f 6e 29 2c 20 74 68 65 6e 20  nsaction), then 
21ef0 53 51 4c 69 74 65 20 6d 61 79 20 62 65 63 6f 6d  SQLite may becom
21f00 65 20 63 6f 6e 66 75 73 65 64 20 77 68 65 6e 20  e confused when 
21f10 64 6f 69 6e 67 20 74 68 65 20 0a 20 20 20 20 20  doing the .     
21f20 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61     ** hot-journa
21f30 6c 20 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f  l rollback follo
21f40 77 69 6e 67 20 72 65 63 6f 76 65 72 79 2e 20 49  wing recovery. I
21f50 74 20 6d 61 79 20 72 6f 6c 6c 20 62 61 63 6b 20  t may roll back 
21f60 61 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  all.        ** o
21f70 66 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f  f this connectio
21f80 6e 73 20 64 61 74 61 2c 20 74 68 65 6e 20 70 72  ns data, then pr
21f90 6f 63 65 65 64 20 74 6f 20 72 6f 6c 6c 69 6e 67  oceed to rolling
21fa0 20 62 61 63 6b 20 74 68 65 20 6f 6c 64 2c 0a 20   back the old,. 
21fb0 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 2d 6f 66         ** out-of
21fc0 2d 64 61 74 65 20 64 61 74 61 20 74 68 61 74 20  -date data that 
21fd0 66 6f 6c 6c 6f 77 73 20 69 74 2e 20 44 61 74 61  follows it. Data
21fe0 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e  base corruption.
21ff0 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
22000 20 20 20 20 2a 2a 20 54 6f 20 77 6f 72 6b 20 61      ** To work a
22010 72 6f 75 6e 64 20 74 68 69 73 2c 20 69 66 20 74  round this, if t
22020 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
22030 64 6f 65 73 20 61 70 70 65 61 72 20 74 6f 20 63  does appear to c
22040 6f 6e 74 61 69 6e 0a 20 20 20 20 20 20 20 20 2a  ontain.        *
22050 2a 20 61 20 76 61 6c 69 64 20 68 65 61 64 65 72  * a valid header
22060 20 66 6f 6c 6c 6f 77 69 6e 67 20 50 61 67 65 72   following Pager
22070 2e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 74 68 65  .journalOff, the
22080 6e 20 77 72 69 74 65 20 61 20 30 78 30 30 0a 20  n write a 0x00. 
22090 20 20 20 20 20 20 20 2a 2a 20 62 79 74 65 20 74         ** byte t
220a0 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 69  o the start of i
220b0 74 20 74 6f 20 70 72 65 76 65 6e 74 20 69 74 20  t to prevent it 
220c0 66 72 6f 6d 20 62 65 69 6e 67 20 72 65 63 6f 67  from being recog
220d0 6e 69 7a 65 64 2e 0a 20 20 20 20 20 20 20 20 2a  nized..        *
220e0 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 56 61 72  *.        ** Var
220f0 69 61 62 6c 65 20 69 4e 65 78 74 48 64 72 4f 66  iable iNextHdrOf
22100 66 73 65 74 20 69 73 20 73 65 74 20 74 6f 20 74  fset is set to t
22110 68 65 20 6f 66 66 73 65 74 20 61 74 20 77 68 69  he offset at whi
22120 63 68 20 74 68 69 73 0a 20 20 20 20 20 20 20 20  ch this.        
22130 2a 2a 20 70 72 6f 62 6c 65 6d 61 74 69 63 20 68  ** problematic h
22140 65 61 64 65 72 20 77 69 6c 6c 20 6f 63 63 75 72  eader will occur
22150 2c 20 69 66 20 69 74 20 65 78 69 73 74 73 2e 20  , if it exists. 
22160 61 4d 61 67 69 63 20 69 73 20 75 73 65 64 20 0a  aMagic is used .
22170 20 20 20 20 20 20 20 20 2a 2a 20 61 73 20 61 20          ** as a 
22180 74 65 6d 70 6f 72 61 72 79 20 62 75 66 66 65 72  temporary buffer
22190 20 74 6f 20 69 6e 73 70 65 63 74 20 74 68 65 20   to inspect the 
221a0 66 69 72 73 74 20 63 6f 75 70 6c 65 20 6f 66 20  first couple of 
221b0 62 79 74 65 73 20 6f 66 0a 20 20 20 20 20 20 20  bytes of.       
221c0 20 2a 2a 20 74 68 65 20 70 6f 74 65 6e 74 69 61   ** the potentia
221d0 6c 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  l journal header
221e0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
221f0 20 20 20 20 20 69 36 34 20 69 4e 65 78 74 48 64       i64 iNextHd
22200 72 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20  rOffset;.       
22210 20 75 38 20 61 4d 61 67 69 63 5b 38 5d 3b 0a 20   u8 aMagic[8];. 
22220 20 20 20 20 20 20 20 75 38 20 7a 48 65 61 64 65         u8 zHeade
22230 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
22240 6c 4d 61 67 69 63 29 2b 34 5d 3b 0a 0a 20 20 20  lMagic)+4];..   
22250 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 48 65 61       memcpy(zHea
22260 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  der, aJournalMag
22270 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72  ic, sizeof(aJour
22280 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 20 20  nalMagic));.    
22290 20 20 20 20 70 75 74 33 32 62 69 74 73 28 26 7a      put32bits(&z
222a0 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
222b0 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 70  ournalMagic)], p
222c0 50 61 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 0a 20  Pager->nRec);.. 
222d0 20 20 20 20 20 20 20 69 4e 65 78 74 48 64 72 4f         iNextHdrO
222e0 66 66 73 65 74 20 3d 20 6a 6f 75 72 6e 61 6c 48  ffset = journalH
222f0 64 72 4f 66 66 73 65 74 28 70 50 61 67 65 72 29  drOffset(pPager)
22300 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
22310 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61  qlite3OsRead(pPa
22320 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63  ger->jfd, aMagic
22330 2c 20 38 2c 20 69 4e 65 78 74 48 64 72 4f 66 66  , 8, iNextHdrOff
22340 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66  set);.        if
22350 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
22360 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 61 4d 61  && 0==memcmp(aMa
22370 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  gic, aJournalMag
22380 69 63 2c 20 38 29 20 29 7b 0a 20 20 20 20 20 20  ic, 8) ){.      
22390 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
223a0 20 75 38 20 7a 65 72 6f 62 79 74 65 20 3d 20 30   u8 zerobyte = 0
223b0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
223c0 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
223d0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 7a 65  pPager->jfd, &ze
223e0 72 6f 62 79 74 65 2c 20 31 2c 20 69 4e 65 78 74  robyte, 1, iNext
223f0 48 64 72 4f 66 66 73 65 74 29 3b 0a 20 20 20 20  HdrOffset);.    
22400 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
22410 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
22420 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f  && rc!=SQLITE_IO
22430 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29  ERR_SHORT_READ )
22440 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
22450 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
22460 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69  ..        /* Wri
22470 74 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75  te the nRec valu
22480 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  e into the journ
22490 61 6c 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20  al file header. 
224a0 49 66 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a  If in.        **
224b0 20 66 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75   full-synchronou
224c0 73 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65  s mode, sync the
224d0 20 6a 6f 75 72 6e 61 6c 20 66 69 72 73 74 2e 20   journal first. 
224e0 54 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 61  This ensures tha
224f0 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c  t.        ** all
22500 20 64 61 74 61 20 68 61 73 20 72 65 61 6c 6c 79   data has really
22510 20 68 69 74 20 74 68 65 20 64 69 73 6b 20 62 65   hit the disk be
22520 66 6f 72 65 20 6e 52 65 63 20 69 73 20 75 70 64  fore nRec is upd
22530 61 74 65 64 20 74 6f 20 6d 61 72 6b 0a 20 20 20  ated to mark.   
22540 20 20 20 20 20 2a 2a 20 69 74 20 61 73 20 61 20       ** it as a 
22550 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 72 6f  candidate for ro
22560 6c 6c 62 61 63 6b 2e 0a 20 20 20 20 20 20 20 20  llback..        
22570 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68  **.        ** Th
22580 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72  is is not requir
22590 65 64 20 69 66 20 74 68 65 20 70 65 72 73 69 73  ed if the persis
225a0 74 65 6e 74 20 6d 65 64 69 61 20 73 75 70 70 6f  tent media suppo
225b0 72 74 73 20 74 68 65 0a 20 20 20 20 20 20 20 20  rts the.        
225c0 2a 2a 20 53 41 46 45 5f 41 50 50 45 4e 44 20 70  ** SAFE_APPEND p
225d0 72 6f 70 65 72 74 79 2e 20 42 65 63 61 75 73 65  roperty. Because
225e0 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 69 74   in this case it
225f0 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
22600 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72   .        ** for
22610 20 67 61 72 62 61 67 65 20 64 61 74 61 20 74 6f   garbage data to
22620 20 62 65 20 61 70 70 65 6e 64 65 64 20 74 6f 20   be appended to 
22630 74 68 65 20 66 69 6c 65 2c 20 74 68 65 20 6e 52  the file, the nR
22640 65 63 20 66 69 65 6c 64 0a 20 20 20 20 20 20 20  ec field.       
22650 20 2a 2a 20 69 73 20 70 6f 70 75 6c 61 74 65 64   ** is populated
22660 20 77 69 74 68 20 30 78 46 46 46 46 46 46 46 46   with 0xFFFFFFFF
22670 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   when the journa
22680 6c 20 68 65 61 64 65 72 20 69 73 20 77 72 69 74  l header is writ
22690 74 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ten.        ** a
226a0 6e 64 20 6e 65 76 65 72 20 6e 65 65 64 73 20 74  nd never needs t
226b0 6f 20 62 65 20 75 70 64 61 74 65 64 2e 0a 20 20  o be updated..  
226c0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
226d0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c   if( pPager->ful
226e0 6c 53 79 6e 63 20 26 26 20 30 3d 3d 28 69 44 63  lSync && 0==(iDc
226f0 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45  &SQLITE_IOCAP_SE
22700 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20  QUENTIAL) ){.   
22710 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43         PAGERTRAC
22720 45 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c  E(("SYNC journal
22730 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52   of %d\n", PAGER
22740 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20  ID(pPager)));.  
22750 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28          IOTRACE(
22760 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70  ("JSYNC %p\n", p
22770 50 61 67 65 72 29 29 0a 20 20 20 20 20 20 20 20  Pager)).        
22780 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
22790 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64  Sync(pPager->jfd
227a0 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66  , pPager->sync_f
227b0 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 20 20 20  lags);.         
227c0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
227d0 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
227e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
227f0 20 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52    IOTRACE(("JHDR
22800 20 25 70 20 25 6c 6c 64 5c 6e 22 2c 20 70 50 61   %p %lld\n", pPa
22810 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ger, pPager->jou
22820 72 6e 61 6c 48 64 72 29 29 3b 0a 20 20 20 20 20  rnalHdr));.     
22830 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
22840 73 57 72 69 74 65 28 0a 20 20 20 20 20 20 20 20  sWrite(.        
22850 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c      pPager->jfd,
22860 20 7a 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66   zHeader, sizeof
22870 28 7a 48 65 61 64 65 72 29 2c 20 70 50 61 67 65  (zHeader), pPage
22880 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 0a 20 20  r->journalHdr.  
22890 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
228a0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
228b0 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
228c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
228d0 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45  ( 0==(iDc&SQLITE
228e0 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41  _IOCAP_SEQUENTIA
228f0 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 50 41  L) ){.        PA
22900 47 45 52 54 52 41 43 45 28 28 22 53 59 4e 43 20  GERTRACE(("SYNC 
22910 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22  journal of %d\n"
22920 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
22930 29 29 29 3b 0a 20 20 20 20 20 20 20 20 49 4f 54  )));.        IOT
22940 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c  RACE(("JSYNC %p\
22950 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20  n", pPager)).   
22960 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
22970 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
22980 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e  jfd, pPager->syn
22990 63 5f 66 6c 61 67 73 7c 20 0a 20 20 20 20 20 20  c_flags| .      
229a0 20 20 20 20 28 70 50 61 67 65 72 2d 3e 73 79 6e      (pPager->syn
229b0 63 5f 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f  c_flags==SQLITE_
229c0 53 59 4e 43 5f 46 55 4c 4c 3f 53 51 4c 49 54 45  SYNC_FULL?SQLITE
229d0 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 3a 30  _SYNC_DATAONLY:0
229e0 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  ).        );.   
229f0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
22a00 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
22a10 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  rc;.      }..   
22a20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
22a30 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d 3e  alHdr = pPager->
22a40 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20  journalOff;.    
22a50 20 20 69 66 28 20 6e 65 77 48 64 72 20 26 26 20    if( newHdr && 
22a60 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49  0==(iDc&SQLITE_I
22a70 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44  OCAP_SAFE_APPEND
22a80 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  ) ){.        pPa
22a90 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20  ger->nRec = 0;. 
22aa0 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74         rc = writ
22ab0 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  eJournalHdr(pPag
22ac0 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
22ad0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50   }else{.      pP
22ae0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
22af0 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
22b00 61 6c 4f 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d  alOff;.    }.  }
22b10 0a 0a 20 20 2f 2a 20 55 6e 6c 65 73 73 20 74 68  ..  /* Unless th
22b20 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 6e 6f  e pager is in no
22b30 53 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 20 6a  Sync mode, the j
22b40 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 61 73 20  ournal file was 
22b50 6a 75 73 74 20 0a 20 20 2a 2a 20 73 75 63 63 65  just .  ** succe
22b60 73 73 66 75 6c 6c 79 20 73 79 6e 63 65 64 2e 20  ssfully synced. 
22b70 45 69 74 68 65 72 20 77 61 79 2c 20 63 6c 65 61  Either way, clea
22b80 72 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44  r the PGHDR_NEED
22b90 5f 53 59 4e 43 20 66 6c 61 67 20 6f 6e 20 0a 20  _SYNC flag on . 
22ba0 20 2a 2a 20 61 6c 6c 20 70 61 67 65 73 2e 0a 20   ** all pages.. 
22bb0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 50 63 61   */.  sqlite3Pca
22bc0 63 68 65 43 6c 65 61 72 53 79 6e 63 46 6c 61 67  cheClearSyncFlag
22bd0 73 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  s(pPager->pPCach
22be0 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 53  e);.  pPager->eS
22bf0 74 61 74 65 20 3d 20 50 41 47 45 52 5f 57 52 49  tate = PAGER_WRI
22c00 54 45 52 5f 44 42 4d 4f 44 3b 0a 20 20 61 73 73  TER_DBMOD;.  ass
22c10 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
22c20 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
22c30 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
22c40 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
22c50 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20  The argument is 
22c60 74 68 65 20 66 69 72 73 74 20 69 6e 20 61 20 6c  the first in a l
22c70 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 64 69  inked list of di
22c80 72 74 79 20 70 61 67 65 73 20 63 6f 6e 6e 65 63  rty pages connec
22c90 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 50 67  ted.** by the Pg
22ca0 48 64 72 2e 70 44 69 72 74 79 20 70 6f 69 6e 74  Hdr.pDirty point
22cb0 65 72 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  er. This functio
22cc0 6e 20 77 72 69 74 65 73 20 65 61 63 68 20 6f 6e  n writes each on
22cd0 65 20 6f 66 20 74 68 65 0a 2a 2a 20 69 6e 2d 6d  e of the.** in-m
22ce0 65 6d 6f 72 79 20 70 61 67 65 73 20 69 6e 20 74  emory pages in t
22cf0 68 65 20 6c 69 73 74 20 74 6f 20 74 68 65 20 64  he list to the d
22d00 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68  atabase file. Th
22d10 65 20 61 72 67 75 6d 65 6e 74 20 6d 61 79 0a 2a  e argument may.*
22d20 2a 20 62 65 20 4e 55 4c 4c 2c 20 72 65 70 72 65  * be NULL, repre
22d30 73 65 6e 74 69 6e 67 20 61 6e 20 65 6d 70 74 79  senting an empty
22d40 20 6c 69 73 74 2e 20 49 6e 20 74 68 69 73 20 63   list. In this c
22d50 61 73 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ase this functio
22d60 6e 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e  n is.** a no-op.
22d70 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72  .**.** The pager
22d80 20 6d 75 73 74 20 68 6f 6c 64 20 61 74 20 6c 65   must hold at le
22d90 61 73 74 20 61 20 52 45 53 45 52 56 45 44 20 6c  ast a RESERVED l
22da0 6f 63 6b 20 77 68 65 6e 20 74 68 69 73 20 66 75  ock when this fu
22db0 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c  nction.** is cal
22dc0 6c 65 64 2e 20 42 65 66 6f 72 65 20 77 72 69 74  led. Before writ
22dd0 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 74 6f 20  ing anything to 
22de0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
22df0 65 2c 20 74 68 69 73 20 6c 6f 63 6b 0a 2a 2a 20  e, this lock.** 
22e00 69 73 20 75 70 67 72 61 64 65 64 20 74 6f 20 61  is upgraded to a
22e10 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
22e20 2e 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 63 61  . If the lock ca
22e30 6e 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64  nnot be obtained
22e40 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59  ,.** SQLITE_BUSY
22e50 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
22e60 20 6e 6f 20 64 61 74 61 20 69 73 20 77 72 69 74   no data is writ
22e70 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62  ten to the datab
22e80 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a  ase file..** .**
22e90 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
22ea0 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 70 61 67   a temp-file pag
22eb0 65 72 20 61 6e 64 20 74 68 65 20 61 63 74 75 61  er and the actua
22ec0 6c 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 69  l file-system fi
22ed0 6c 65 0a 2a 2a 20 69 73 20 6e 6f 74 20 79 65 74  le.** is not yet
22ee0 20 6f 70 65 6e 2c 20 69 74 20 69 73 20 63 72 65   open, it is cre
22ef0 61 74 65 64 20 61 6e 64 20 6f 70 65 6e 65 64 20  ated and opened 
22f00 62 65 66 6f 72 65 20 61 6e 79 20 64 61 74 61 20  before any data 
22f10 69 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 6f  is .** written o
22f20 75 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74  ut..**.** Once t
22f30 68 65 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e  he lock has been
22f40 20 75 70 67 72 61 64 65 64 20 61 6e 64 2c 20 69   upgraded and, i
22f50 66 20 6e 65 63 65 73 73 61 72 79 2c 20 74 68 65  f necessary, the
22f60 20 66 69 6c 65 20 6f 70 65 6e 65 64 2c 0a 2a 2a   file opened,.**
22f70 20 74 68 65 20 70 61 67 65 73 20 61 72 65 20 77   the pages are w
22f80 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 74 68  ritten out to th
22f90 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
22fa0 69 6e 20 6c 69 73 74 20 6f 72 64 65 72 2e 20 57  in list order. W
22fb0 72 69 74 69 6e 67 0a 2a 2a 20 61 20 70 61 67 65  riting.** a page
22fc0 20 69 73 20 73 6b 69 70 70 65 64 20 69 66 20 69   is skipped if i
22fd0 74 20 6d 65 65 74 73 20 65 69 74 68 65 72 20 6f  t meets either o
22fe0 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
22ff0 63 72 69 74 65 72 69 61 3a 0a 2a 2a 0a 2a 2a 20  criteria:.**.** 
23000 20 20 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d    * The page num
23010 62 65 72 20 69 73 20 67 72 65 61 74 65 72 20 74  ber is greater t
23020 68 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65  han Pager.dbSize
23030 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20 54 68 65 20  , or.**   * The 
23040 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45  PGHDR_DONT_WRITE
23050 20 66 6c 61 67 20 69 73 20 73 65 74 20 6f 6e 20   flag is set on 
23060 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  the page..**.** 
23070 49 66 20 77 72 69 74 69 6e 67 20 6f 75 74 20 61  If writing out a
23080 20 70 61 67 65 20 63 61 75 73 65 73 20 74 68 65   page causes the
23090 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
230a0 6f 20 67 72 6f 77 2c 20 50 61 67 65 72 2e 64 62  o grow, Pager.db
230b0 46 69 6c 65 53 69 7a 65 0a 2a 2a 20 69 73 20 75  FileSize.** is u
230c0 70 64 61 74 65 64 20 61 63 63 6f 72 64 69 6e 67  pdated according
230d0 6c 79 2e 20 49 66 20 70 61 67 65 20 31 20 69 73  ly. If page 1 is
230e0 20 77 72 69 74 74 65 6e 20 6f 75 74 2c 20 74 68   written out, th
230f0 65 6e 20 74 68 65 20 76 61 6c 75 65 20 63 61 63  en the value cac
23100 68 65 64 0a 2a 2a 20 69 6e 20 50 61 67 65 72 2e  hed.** in Pager.
23110 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 69 73 20  dbFileVers[] is 
23120 75 70 64 61 74 65 64 20 74 6f 20 6d 61 74 63 68  updated to match
23130 20 74 68 65 20 6e 65 77 20 76 61 6c 75 65 20 73   the new value s
23140 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20  tored in.** the 
23150 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
23160 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69  *.** If everythi
23170 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  ng is successful
23180 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
23190 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49  eturned. If an I
231a0 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75  O error .** occu
231b0 72 73 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72 20  rs, an IO error 
231c0 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
231d0 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 45 58 43  . Or, if the EXC
231e0 4c 55 53 49 56 45 20 6c 6f 63 6b 20 63 61 6e 6e  LUSIVE lock cann
231f0 6f 74 0a 2a 2a 20 62 65 20 6f 62 74 61 69 6e 65  ot.** be obtaine
23200 64 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69  d, SQLITE_BUSY i
23210 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
23220 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
23230 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 50  write_pagelist(P
23240 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
23250 48 64 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69  Hdr *pList){.  i
23260 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
23270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23280 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
23290 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 41 74 20 74  de */..  /* At t
232a0 68 69 73 20 70 6f 69 6e 74 20 74 68 65 72 65 20  his point there 
232b0 6d 61 79 20 62 65 20 65 69 74 68 65 72 20 61 20  may be either a 
232c0 52 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c  RESERVED or EXCL
232d0 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
232e0 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20  e.  ** database 
232f0 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69  file. If there i
23300 73 20 61 6c 72 65 61 64 79 20 61 6e 20 45 58 43  s already an EXC
23310 4c 55 53 49 56 45 20 6c 6f 63 6b 2c 20 74 68 65  LUSIVE lock, the
23320 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20   following.  ** 
23330 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  call is a no-op.
23340 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 6f 76 69 6e  .  **.  ** Movin
23350 67 20 74 68 65 20 6c 6f 63 6b 20 66 72 6f 6d 20  g the lock from 
23360 52 45 53 45 52 56 45 44 20 74 6f 20 45 58 43 4c  RESERVED to EXCL
23370 55 53 49 56 45 20 61 63 74 75 61 6c 6c 79 20 69  USIVE actually i
23380 6e 76 6f 6c 76 65 73 20 67 6f 69 6e 67 0a 20 20  nvolves going.  
23390 2a 2a 20 74 68 72 6f 75 67 68 20 61 6e 20 69 6e  ** through an in
233a0 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65  termediate state
233b0 20 50 45 4e 44 49 4e 47 2e 20 20 20 41 20 50 45   PENDING.   A PE
233c0 4e 44 49 4e 47 20 6c 6f 63 6b 20 70 72 65 76 65  NDING lock preve
233d0 6e 74 73 20 6e 65 77 0a 20 20 2a 2a 20 72 65 61  nts new.  ** rea
233e0 64 65 72 73 20 66 72 6f 6d 20 61 74 74 61 63 68  ders from attach
233f0 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
23400 61 73 65 20 62 75 74 20 69 73 20 75 6e 73 75 66  ase but is unsuf
23410 66 69 63 69 65 6e 74 20 66 6f 72 20 75 73 20 74  ficient for us t
23420 6f 0a 20 20 2a 2a 20 77 72 69 74 65 2e 20 20 54  o.  ** write.  T
23430 68 65 20 69 64 65 61 20 6f 66 20 61 20 50 45 4e  he idea of a PEN
23440 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 74 6f 20  DING lock is to 
23450 70 72 65 76 65 6e 74 20 6e 65 77 20 72 65 61 64  prevent new read
23460 65 72 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 6f  ers from.  ** co
23470 6d 69 6e 67 20 69 6e 20 77 68 69 6c 65 20 77 65  ming in while we
23480 20 77 61 69 74 20 66 6f 72 20 65 78 69 73 74 69   wait for existi
23490 6e 67 20 72 65 61 64 65 72 73 20 74 6f 20 63 6c  ng readers to cl
234a0 65 61 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57  ear..  **.  ** W
234b0 68 69 6c 65 20 74 68 65 20 70 61 67 65 72 20 69  hile the pager i
234c0 73 20 69 6e 20 74 68 65 20 52 45 53 45 52 56 45  s in the RESERVE
234d0 44 20 73 74 61 74 65 2c 20 74 68 65 20 6f 72 69  D state, the ori
234e0 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66  ginal database f
234f0 69 6c 65 0a 20 20 2a 2a 20 69 73 20 75 6e 63 68  ile.  ** is unch
23500 61 6e 67 65 64 20 61 6e 64 20 77 65 20 63 61 6e  anged and we can
23510 20 72 6f 6c 6c 62 61 63 6b 20 77 69 74 68 6f 75   rollback withou
23520 74 20 68 61 76 69 6e 67 20 74 6f 20 70 6c 61 79  t having to play
23530 62 61 63 6b 20 74 68 65 0a 20 20 2a 2a 20 6a 6f  back the.  ** jo
23540 75 72 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20 6f  urnal into the o
23550 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
23560 20 66 69 6c 65 2e 20 20 4f 6e 63 65 20 77 65 20   file.  Once we 
23570 74 72 61 6e 73 69 74 69 6f 6e 20 74 6f 0a 20 20  transition to.  
23580 2a 2a 20 45 58 43 4c 55 53 49 56 45 2c 20 69 74  ** EXCLUSIVE, it
23590 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61 62   means the datab
235a0 61 73 65 20 66 69 6c 65 20 68 61 73 20 62 65 65  ase file has bee
235b0 6e 20 63 68 61 6e 67 65 64 20 61 6e 64 20 61 6e  n changed and an
235c0 79 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20  y rollback.  ** 
235d0 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61 20 6a  will require a j
235e0 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b 2e  ournal playback.
235f0 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 4e 6f 72 6d  .  */..  /* Norm
23600 61 6c 6c 79 2c 20 74 68 69 73 20 66 75 6e 63 74  ally, this funct
23610 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 69 6e  ion is called in
23620 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 73 74   WRITER_DBMOD st
23630 61 74 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 48  ate..  **.  ** H
23640 6f 77 65 76 65 72 20 69 74 20 6d 61 79 20 62 65  owever it may be
23650 20 63 61 6c 6c 65 64 20 69 6e 20 57 52 49 54 45   called in WRITE
23660 52 5f 43 41 43 48 45 4d 4f 44 20 73 74 61 74 65  R_CACHEMOD state
23670 20 69 66 20 74 68 65 20 70 61 67 65 20 62 65 69   if the page bei
23680 6e 67 0a 20 20 2a 2a 20 77 72 69 74 74 65 6e 20  ng.  ** written 
23690 28 61 6e 64 20 61 6c 6c 20 6f 74 68 65 72 20 70  (and all other p
236a0 61 67 65 73 20 74 68 61 74 20 72 65 73 69 64 65  ages that reside
236b0 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 64 69 73   on the same dis
236c0 6b 20 73 65 63 74 6f 72 29 20 77 61 73 0a 20 20  k sector) was.  
236d0 2a 2a 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c  ** a free-list l
236e0 65 61 66 20 70 61 67 65 20 61 74 20 74 68 65 20  eaf page at the 
236f0 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61  start of the tra
23700 6e 73 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68 61  nsaction. In tha
23710 74 20 63 61 73 65 0a 20 20 2a 2a 20 74 68 65 20  t case.  ** the 
23720 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
23730 20 6e 6f 74 20 72 65 61 6c 6c 79 20 62 65 69 6e   not really bein
23740 67 20 6d 6f 64 69 66 69 65 64 2c 20 73 6f 20 69  g modified, so i
23750 74 20 69 73 20 4f 6b 20 74 6f 20 77 72 69 74 65  t is Ok to write
23760 0a 20 20 2a 2a 20 74 6f 20 69 74 20 69 6e 20 43  .  ** to it in C
23770 41 43 48 45 4d 4f 44 20 73 74 61 74 65 2e 0a 20  ACHEMOD state.. 
23780 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 70   */.  assert( !p
23790 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
237a0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
237b0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
237c0 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d  PAGER_WRITER_DBM
237d0 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61  OD.       || pPa
237e0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
237f0 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d  ER_WRITER_CACHEM
23800 4f 44 20 0a 20 20 29 3b 0a 20 20 61 73 73 65 72  OD .  );.  asser
23810 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
23820 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
23830 44 42 4d 4f 44 20 0a 20 20 20 20 20 20 20 7c 7c  DBMOD .       ||
23840 20 28 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3d   (pList->pDirty=
23850 3d 30 20 26 26 20 70 4c 69 73 74 2d 3e 70 67 6e  =0 && pList->pgn
23860 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  o<=pPager->dbFil
23870 65 53 69 7a 65 29 0a 20 20 29 3b 0a 0a 20 20 72  eSize).  );..  r
23880 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  c = pager_wait_o
23890 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45  n_lock(pPager, E
238a0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a  XCLUSIVE_LOCK);.
238b0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c  .  /* If the fil
238c0 65 20 69 73 20 61 20 74 65 6d 70 2d 66 69 6c 65  e is a temp-file
238d0 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65   has not yet bee
238e0 6e 20 6f 70 65 6e 65 64 2c 20 6f 70 65 6e 20 69  n opened, open i
238f0 74 20 6e 6f 77 2e 20 49 74 0a 20 20 2a 2a 20 69  t now. It.  ** i
23900 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66  s not possible f
23910 6f 72 20 72 63 20 74 6f 20 62 65 20 6f 74 68 65  or rc to be othe
23920 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b  r than SQLITE_OK
23930 20 69 66 20 74 68 69 73 20 62 72 61 6e 63 68 0a   if this branch.
23940 20 20 2a 2a 20 69 73 20 74 61 6b 65 6e 2c 20 61    ** is taken, a
23950 73 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f  s pager_wait_on_
23960 6c 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f  lock() is a no-o
23970 70 20 66 6f 72 20 74 65 6d 70 2d 66 69 6c 65 73  p for temp-files
23980 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 69 73  ..  */.  if( !is
23990 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
239a0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
239b0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
239c0 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
239d0 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61  K );.    rc = pa
239e0 67 65 72 4f 70 65 6e 74 65 6d 70 28 70 50 61 67  gerOpentemp(pPag
239f0 65 72 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 20  er, pPager->fd, 
23a00 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73  pPager->vfsFlags
23a10 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 66  );.  }..  /* Bef
23a20 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 77 72  ore the first wr
23a30 69 74 65 2c 20 67 69 76 65 20 74 68 65 20 56 46  ite, give the VF
23a40 53 20 61 20 68 69 6e 74 20 6f 66 20 77 68 61 74  S a hint of what
23a50 20 74 68 65 20 66 69 6e 61 6c 0a 20 20 2a 2a 20   the final.  ** 
23a60 66 69 6c 65 20 73 69 7a 65 20 77 69 6c 6c 20 62  file size will b
23a70 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
23a80 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
23a90 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  || isOpen(pPager
23aa0 2d 3e 66 64 29 20 29 3b 0a 20 20 69 66 28 20 72  ->fd) );.  if( r
23ab0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
23ac0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 70  pPager->dbSize>p
23ad0 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
23ae0 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
23af0 5f 69 6e 74 36 34 20 73 7a 46 69 6c 65 20 3d 20  _int64 szFile = 
23b00 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
23b10 20 2a 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36   * (sqlite3_int6
23b20 34 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  4)pPager->dbSize
23b30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46  ;.    sqlite3OsF
23b40 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 50 61 67 65  ileControl(pPage
23b50 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46 43  r->fd, SQLITE_FC
23b60 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 2c 20 26  NTL_SIZE_HINT, &
23b70 73 7a 46 69 6c 65 29 3b 0a 20 20 7d 0a 0a 20 20  szFile);.  }..  
23b80 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
23b90 45 5f 4f 4b 20 26 26 20 70 4c 69 73 74 20 29 7b  E_OK && pList ){
23ba0 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d  .    Pgno pgno =
23bb0 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3b 0a 0a 20   pList->pgno;.. 
23bc0 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61     /* If there a
23bd0 72 65 20 64 69 72 74 79 20 70 61 67 65 73 20 69  re dirty pages i
23be0 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  n the page cache
23bf0 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65   with page numbe
23c00 72 73 20 67 72 65 61 74 65 72 0a 20 20 20 20 2a  rs greater.    *
23c10 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 64 62 53  * than Pager.dbS
23c20 69 7a 65 2c 20 74 68 69 73 20 6d 65 61 6e 73 20  ize, this means 
23c30 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e  sqlite3PagerTrun
23c40 63 61 74 65 49 6d 61 67 65 28 29 20 77 61 73 20  cateImage() was 
23c50 63 61 6c 6c 65 64 20 74 6f 0a 20 20 20 20 2a 2a  called to.    **
23c60 20 6d 61 6b 65 20 74 68 65 20 66 69 6c 65 20 73   make the file s
23c70 6d 61 6c 6c 65 72 20 28 70 72 65 73 75 6d 61 62  maller (presumab
23c80 6c 79 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75  ly by auto-vacuu
23c90 6d 20 63 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20  m code). Do not 
23ca0 77 72 69 74 65 0a 20 20 20 20 2a 2a 20 61 6e 79  write.    ** any
23cb0 20 73 75 63 68 20 70 61 67 65 73 20 74 6f 20 74   such pages to t
23cc0 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a  he file..    **.
23cd0 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 64 6f 20      ** Also, do 
23ce0 6e 6f 74 20 77 72 69 74 65 20 6f 75 74 20 61 6e  not write out an
23cf0 79 20 70 61 67 65 20 74 68 61 74 20 68 61 73 20  y page that has 
23d00 74 68 65 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57  the PGHDR_DONT_W
23d10 52 49 54 45 20 66 6c 61 67 0a 20 20 20 20 2a 2a  RITE flag.    **
23d20 20 73 65 74 20 28 73 65 74 20 62 79 20 73 71 6c   set (set by sql
23d30 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69  ite3PagerDontWri
23d40 74 65 28 29 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  te())..    */.  
23d50 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67    if( pgno<=pPag
23d60 65 72 2d 3e 64 62 53 69 7a 65 20 26 26 20 30 3d  er->dbSize && 0=
23d70 3d 28 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26 50  =(pList->flags&P
23d80 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 29  GHDR_DONT_WRITE)
23d90 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 6f 66   ){.      i64 of
23da0 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a  fset = (pgno-1)*
23db0 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67  (i64)pPager->pag
23dc0 65 53 69 7a 65 3b 20 20 20 2f 2a 20 4f 66 66 73  eSize;   /* Offs
23dd0 65 74 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20  et to write */. 
23de0 20 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61       char *pData
23df0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
23e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23e10 20 20 20 20 2f 2a 20 44 61 74 61 20 74 6f 20 77      /* Data to w
23e20 72 69 74 65 20 2a 2f 20 20 20 20 0a 0a 20 20 20  rite */    ..   
23e30 20 20 20 61 73 73 65 72 74 28 20 28 70 4c 69 73     assert( (pLis
23e40 74 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  t->flags&PGHDR_N
23e50 45 45 44 5f 53 59 4e 43 29 3d 3d 30 20 29 3b 0a  EED_SYNC)==0 );.
23e60 0a 20 20 20 20 20 20 2f 2a 20 45 6e 63 6f 64 65  .      /* Encode
23e70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   the database */
23e80 0a 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50  .      CODEC2(pP
23e90 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70 44 61  ager, pList->pDa
23ea0 74 61 2c 20 70 67 6e 6f 2c 20 36 2c 20 72 65 74  ta, pgno, 6, ret
23eb0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
23ec0 2c 20 70 44 61 74 61 29 3b 0a 0a 20 20 20 20 20  , pData);..     
23ed0 20 2f 2a 20 57 72 69 74 65 20 6f 75 74 20 74 68   /* Write out th
23ee0 65 20 70 61 67 65 20 64 61 74 61 2e 20 2a 2f 0a  e page data. */.
23ef0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
23f00 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
23f10 2d 3e 66 64 2c 20 70 44 61 74 61 2c 20 70 50 61  ->fd, pData, pPa
23f20 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f  ger->pageSize, o
23f30 66 66 73 65 74 29 3b 0a 0a 20 20 20 20 20 20 2f  ffset);..      /
23f40 2a 20 49 66 20 70 61 67 65 20 31 20 77 61 73 20  * If page 1 was 
23f50 6a 75 73 74 20 77 72 69 74 74 65 6e 2c 20 75 70  just written, up
23f60 64 61 74 65 20 50 61 67 65 72 2e 64 62 46 69 6c  date Pager.dbFil
23f70 65 56 65 72 73 20 74 6f 20 6d 61 74 63 68 0a 20  eVers to match. 
23f80 20 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75       ** the valu
23f90 65 20 6e 6f 77 20 73 74 6f 72 65 64 20 69 6e 20  e now stored in 
23fa0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
23fb0 65 2e 20 49 66 20 77 72 69 74 69 6e 67 20 74 68  e. If writing th
23fc0 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 70 61 67  is .      ** pag
23fd0 65 20 63 61 75 73 65 64 20 74 68 65 20 64 61 74  e caused the dat
23fe0 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 67 72  abase file to gr
23ff0 6f 77 2c 20 75 70 64 61 74 65 20 64 62 46 69 6c  ow, update dbFil
24000 65 53 69 7a 65 2e 20 0a 20 20 20 20 20 20 2a 2f  eSize. .      */
24010 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3d  .      if( pgno=
24020 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65  =1 ){.        me
24030 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62  mcpy(&pPager->db
24040 46 69 6c 65 56 65 72 73 2c 20 26 70 44 61 74 61  FileVers, &pData
24050 5b 32 34 5d 2c 20 73 69 7a 65 6f 66 28 70 50 61  [24], sizeof(pPa
24060 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29  ger->dbFileVers)
24070 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
24080 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72   if( pgno>pPager
24090 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a  ->dbFileSize ){.
240a0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
240b0 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 70 67 6e  dbFileSize = pgn
240c0 6f 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  o;.      }..    
240d0 20 20 2f 2a 20 55 70 64 61 74 65 20 61 6e 79 20    /* Update any 
240e0 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 20 63  backup objects c
240f0 6f 70 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65  opying the conte
24100 6e 74 73 20 6f 66 20 74 68 69 73 20 70 61 67 65  nts of this page
24110 72 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  r. */.      sqli
24120 74 65 33 42 61 63 6b 75 70 55 70 64 61 74 65 28  te3BackupUpdate(
24130 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c  pPager->pBackup,
24140 20 70 67 6e 6f 2c 20 28 75 38 2a 29 70 4c 69 73   pgno, (u8*)pLis
24150 74 2d 3e 70 44 61 74 61 29 3b 0a 0a 20 20 20 20  t->pData);..    
24160 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53    PAGERTRACE(("S
24170 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64 20  TORE %d page %d 
24180 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20  hash(%08x)\n",. 
24190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
241a0 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
241b0 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70  ), pgno, pager_p
241c0 61 67 65 68 61 73 68 28 70 4c 69 73 74 29 29 29  agehash(pList)))
241d0 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28  ;.      IOTRACE(
241e0 28 22 50 47 4f 55 54 20 25 70 20 25 64 5c 6e 22  ("PGOUT %p %d\n"
241f0 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29  , pPager, pgno))
24200 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e  ;.      PAGER_IN
24210 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72  CR(sqlite3_pager
24220 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 29 3b  _writedb_count);
24230 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43  .      PAGER_INC
24240 52 28 70 50 61 67 65 72 2d 3e 6e 57 72 69 74 65  R(pPager->nWrite
24250 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
24260 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28      PAGERTRACE((
24270 22 4e 4f 53 54 4f 52 45 20 25 64 20 70 61 67 65  "NOSTORE %d page
24280 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
24290 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 29 29 3b  pPager), pgno));
242a0 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51  .    }.#ifdef SQ
242b0 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
242c0 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70 61 67 65  .    pList->page
242d0 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67  Hash = pager_pag
242e0 65 68 61 73 68 28 70 4c 69 73 74 29 3b 0a 23 65  ehash(pList);.#e
242f0 6e 64 69 66 0a 20 20 20 20 70 4c 69 73 74 20 3d  ndif.    pList =
24300 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a   pList->pDirty;.
24310 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
24320 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 73 75 72  ;.}../*.** Ensur
24330 65 20 74 68 61 74 20 74 68 65 20 73 75 62 2d 6a  e that the sub-j
24340 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f  ournal file is o
24350 70 65 6e 2e 20 49 66 20 69 74 20 69 73 20 61 6c  pen. If it is al
24360 72 65 61 64 79 20 6f 70 65 6e 2c 20 74 68 69 73  ready open, this
24370 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73   .** function is
24380 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
24390 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
243a0 75 72 6e 65 64 20 69 66 20 65 76 65 72 79 74 68  urned if everyth
243b0 69 6e 67 20 67 6f 65 73 20 61 63 63 6f 72 64 69  ing goes accordi
243c0 6e 67 20 74 6f 20 70 6c 61 6e 2e 20 41 6e 20 0a  ng to plan. An .
243d0 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  ** SQLITE_IOERR_
243e0 58 58 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69  XXX error code i
243f0 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 61 20  s returned if a 
24400 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f  call to sqlite3O
24410 73 4f 70 65 6e 28 29 20 0a 2a 2a 20 66 61 69 6c  sOpen() .** fail
24420 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
24430 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28   openSubJournal(
24440 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
24450 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
24460 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 69 73 4f  E_OK;.  if( !isO
24470 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  pen(pPager->sjfd
24480 29 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  ) ){.    if( pPa
24490 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
244a0 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
244b0 4f 44 45 5f 4d 45 4d 4f 52 59 20 7c 7c 20 70 50  ODE_MEMORY || pP
244c0 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f  ager->subjInMemo
244d0 72 79 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ry ){.      sqli
244e0 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65  te3MemJournalOpe
244f0 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 3b  n(pPager->sjfd);
24500 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
24510 20 20 72 63 20 3d 20 70 61 67 65 72 4f 70 65 6e    rc = pagerOpen
24520 74 65 6d 70 28 70 50 61 67 65 72 2c 20 70 50 61  temp(pPager, pPa
24530 67 65 72 2d 3e 73 6a 66 64 2c 20 53 51 4c 49 54  ger->sjfd, SQLIT
24540 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41  E_OPEN_SUBJOURNA
24550 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  L);.    }.  }.  
24560 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
24570 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 72 65 63  .** Append a rec
24580 6f 72 64 20 6f 66 20 74 68 65 20 63 75 72 72 65  ord of the curre
24590 6e 74 20 73 74 61 74 65 20 6f 66 20 70 61 67 65  nt state of page
245a0 20 70 50 67 20 74 6f 20 74 68 65 20 73 75 62 2d   pPg to the sub-
245b0 6a 6f 75 72 6e 61 6c 2e 20 0a 2a 2a 20 49 74 20  journal. .** It 
245c0 69 73 20 74 68 65 20 63 61 6c 6c 65 72 73 20 72  is the callers r
245d0 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 74 6f  esponsibility to
245e0 20 75 73 65 20 73 75 62 6a 52 65 71 75 69 72 65   use subjRequire
245f0 73 50 61 67 65 28 29 20 74 6f 20 63 68 65 63 6b  sPage() to check
24600 20 0a 2a 2a 20 74 68 61 74 20 69 74 20 69 73 20   .** that it is 
24610 72 65 61 6c 6c 79 20 72 65 71 75 69 72 65 64 20  really required 
24620 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74  before calling t
24630 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
24640 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
24650 6c 2c 20 73 65 74 20 74 68 65 20 62 69 74 20 63  l, set the bit c
24660 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
24670 70 50 67 2d 3e 70 67 6e 6f 20 69 6e 20 74 68 65  pPg->pgno in the
24680 20 62 69 74 76 65 63 73 0a 2a 2a 20 66 6f 72 20   bitvecs.** for 
24690 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f 69  all open savepoi
246a0 6e 74 73 20 62 65 66 6f 72 65 20 72 65 74 75 72  nts before retur
246b0 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ning..**.** This
246c0 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
246d0 73 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65  s SQLITE_OK if e
246e0 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75 63  verything is suc
246f0 63 65 73 73 66 75 6c 2c 20 61 6e 20 49 4f 0a 2a  cessful, an IO.*
24700 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  * error code if 
24710 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 77  the attempt to w
24720 72 69 74 65 20 74 6f 20 74 68 65 20 73 75 62 2d  rite to the sub-
24730 6a 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c 20 6f  journal fails, o
24740 72 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d  r .** SQLITE_NOM
24750 45 4d 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66  EM if a malloc f
24760 61 69 6c 73 20 77 68 69 6c 65 20 73 65 74 74 69  ails while setti
24770 6e 67 20 61 20 62 69 74 20 69 6e 20 61 20 73 61  ng a bit in a sa
24780 76 65 70 6f 69 6e 74 0a 2a 2a 20 62 69 74 76 65  vepoint.** bitve
24790 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  c..*/.static int
247a0 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28   subjournalPage(
247b0 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69  PgHdr *pPg){.  i
247c0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
247d0 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  K;.  Pager *pPag
247e0 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
247f0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
24800 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47  journalMode!=PAG
24810 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
24820 46 46 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 4f 70  FF ){..    /* Op
24830 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  en the sub-journ
24840 61 6c 2c 20 69 66 20 69 74 20 68 61 73 20 6e 6f  al, if it has no
24850 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f  t already been o
24860 70 65 6e 65 64 20 2a 2f 0a 20 20 20 20 61 73 73  pened */.    ass
24870 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65  ert( pPager->use
24880 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 61  Journal );.    a
24890 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
248a0 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 61  ager->jfd) || pa
248b0 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
248c0 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
248d0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
248e0 73 6a 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d  sjfd) || pPager-
248f0 3e 6e 53 75 62 52 65 63 3d 3d 30 20 29 3b 0a 20  >nSubRec==0 );. 
24900 20 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72     assert( pager
24910 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 0a  UseWal(pPager) .
24920 20 20 20 20 20 20 20 20 20 7c 7c 20 70 61 67 65           || page
24930 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 0a  InJournal(pPg) .
24940 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 67 2d           || pPg-
24950 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62  >pgno>pPager->db
24960 4f 72 69 67 53 69 7a 65 20 0a 20 20 20 20 29 3b  OrigSize .    );
24970 0a 20 20 20 20 72 63 20 3d 20 6f 70 65 6e 53 75  .    rc = openSu
24980 62 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  bJournal(pPager)
24990 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
249a0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 77 61 73   sub-journal was
249b0 20 6f 70 65 6e 65 64 20 73 75 63 63 65 73 73 66   opened successf
249c0 75 6c 6c 79 20 28 6f 72 20 77 61 73 20 61 6c 72  ully (or was alr
249d0 65 61 64 79 20 6f 70 65 6e 29 2c 0a 20 20 20 20  eady open),.    
249e0 2a 2a 20 77 72 69 74 65 20 74 68 65 20 6a 6f 75  ** write the jou
249f0 72 6e 61 6c 20 72 65 63 6f 72 64 20 69 6e 74 6f  rnal record into
24a00 20 74 68 65 20 66 69 6c 65 2e 20 20 2a 2f 0a 20   the file.  */. 
24a10 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
24a20 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 76 6f  E_OK ){.      vo
24a30 69 64 20 2a 70 44 61 74 61 20 3d 20 70 50 67 2d  id *pData = pPg-
24a40 3e 70 44 61 74 61 3b 0a 20 20 20 20 20 20 69 36  >pData;.      i6
24a50 34 20 6f 66 66 73 65 74 20 3d 20 70 50 61 67 65  4 offset = pPage
24a60 72 2d 3e 6e 53 75 62 52 65 63 2a 28 34 2b 70 50  r->nSubRec*(4+pP
24a70 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
24a80 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70 44 61  .      char *pDa
24a90 74 61 32 3b 0a 20 20 0a 20 20 20 20 20 20 43 4f  ta2;.  .      CO
24aa0 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 44 61  DEC2(pPager, pDa
24ab0 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37  ta, pPg->pgno, 7
24ac0 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
24ad0 4e 4f 4d 45 4d 2c 20 70 44 61 74 61 32 29 3b 0a  NOMEM, pData2);.
24ae0 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
24af0 28 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20  (("STMT-JOURNAL 
24b00 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50  %d page %d\n", P
24b10 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
24b20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20  pPg->pgno));.   
24b30 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62     rc = write32b
24b40 69 74 73 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  its(pPager->sjfd
24b50 2c 20 6f 66 66 73 65 74 2c 20 70 50 67 2d 3e 70  , offset, pPg->p
24b60 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  gno);.      if( 
24b70 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
24b80 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
24b90 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
24ba0 67 65 72 2d 3e 73 6a 66 64 2c 20 70 44 61 74 61  ger->sjfd, pData
24bb0 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  2, pPager->pageS
24bc0 69 7a 65 2c 20 6f 66 66 73 65 74 2b 34 29 3b 0a  ize, offset+4);.
24bd0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
24be0 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
24bf0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61  TE_OK ){.    pPa
24c00 67 65 72 2d 3e 6e 53 75 62 52 65 63 2b 2b 3b 0a  ger->nSubRec++;.
24c10 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
24c20 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3e 30  er->nSavepoint>0
24c30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 64 64   );.    rc = add
24c40 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65  ToSavepointBitve
24c50 63 73 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  cs(pPager, pPg->
24c60 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74  pgno);.  }.  ret
24c70 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
24c80 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
24c90 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
24ca0 70 63 61 63 68 65 20 6c 61 79 65 72 20 77 68 65  pcache layer whe
24cb0 6e 20 69 74 20 68 61 73 20 72 65 61 63 68 65 64  n it has reached
24cc0 20 73 6f 6d 65 0a 2a 2a 20 73 6f 66 74 20 6d 65   some.** soft me
24cd0 6d 6f 72 79 20 6c 69 6d 69 74 2e 20 54 68 65 20  mory limit. The 
24ce0 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69  first argument i
24cf0 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
24d00 20 50 61 67 65 72 20 6f 62 6a 65 63 74 0a 2a 2a   Pager object.**
24d10 20 28 63 61 73 74 20 61 73 20 61 20 76 6f 69 64   (cast as a void
24d20 2a 29 2e 20 54 68 65 20 70 61 67 65 72 20 69 73  *). The pager is
24d30 20 61 6c 77 61 79 73 20 27 70 75 72 67 65 61 62   always 'purgeab
24d40 6c 65 27 20 28 6e 6f 74 20 61 6e 20 69 6e 2d 6d  le' (not an in-m
24d50 65 6d 6f 72 79 0a 2a 2a 20 64 61 74 61 62 61 73  emory.** databas
24d60 65 29 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 61  e). The second a
24d70 72 67 75 6d 65 6e 74 20 69 73 20 61 20 72 65 66  rgument is a ref
24d80 65 72 65 6e 63 65 20 74 6f 20 61 20 70 61 67 65  erence to a page
24d90 20 74 68 61 74 20 69 73 20 0a 2a 2a 20 63 75 72   that is .** cur
24da0 72 65 6e 74 6c 79 20 64 69 72 74 79 20 62 75 74  rently dirty but
24db0 20 68 61 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64   has no outstand
24dc0 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2e 20  ing references. 
24dd0 54 68 65 20 70 61 67 65 0a 2a 2a 20 69 73 20 61  The page.** is a
24de0 6c 77 61 79 73 20 61 73 73 6f 63 69 61 74 65 64  lways associated
24df0 20 77 69 74 68 20 74 68 65 20 50 61 67 65 72 20   with the Pager 
24e00 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73  object passed as
24e10 20 74 68 65 20 66 69 72 73 74 20 0a 2a 2a 20 61   the first .** a
24e20 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  rgument..**.** T
24e30 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20 66  he job of this f
24e40 75 6e 63 74 69 6f 6e 20 69 73 20 74 6f 20 6d 61  unction is to ma
24e50 6b 65 20 70 50 67 20 63 6c 65 61 6e 20 62 79 20  ke pPg clean by 
24e60 77 72 69 74 69 6e 67 20 69 74 73 20 63 6f 6e 74  writing its cont
24e70 65 6e 74 73 0a 2a 2a 20 6f 75 74 20 74 6f 20 74  ents.** out to t
24e80 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
24e90 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2e 20 54  , if possible. T
24ea0 68 69 73 20 6d 61 79 20 69 6e 76 6f 6c 76 65 20  his may involve 
24eb0 73 79 6e 63 69 6e 67 20 74 68 65 0a 2a 2a 20 6a  syncing the.** j
24ec0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 0a 2a 2a  ournal file. .**
24ed0 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
24ee0 6c 2c 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  l, sqlite3Pcache
24ef0 4d 61 6b 65 43 6c 65 61 6e 28 29 20 69 73 20 63  MakeClean() is c
24f00 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 70 61 67  alled on the pag
24f10 65 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f  e and.** SQLITE_
24f20 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  OK returned. If 
24f30 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
24f40 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20  rs while trying 
24f50 74 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20 70  to make the.** p
24f60 61 67 65 20 63 6c 65 61 6e 2c 20 74 68 65 20 49  age clean, the I
24f70 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  O error code is 
24f80 72 65 74 75 72 6e 65 64 2e 20 49 66 20 74 68 65  returned. If the
24f90 20 70 61 67 65 20 63 61 6e 6e 6f 74 20 62 65 0a   page cannot be.
24fa0 2a 2a 20 6d 61 64 65 20 63 6c 65 61 6e 20 66 6f  ** made clean fo
24fb0 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 72 65 61  r some other rea
24fc0 73 6f 6e 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f  son, but no erro
24fd0 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 53  r occurs, then S
24fe0 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72  QLITE_OK.** is r
24ff0 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74  eturned by sqlit
25000 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61  e3PcacheMakeClea
25010 6e 28 29 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65  n() is not calle
25020 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
25030 20 70 61 67 65 72 53 74 72 65 73 73 28 76 6f 69   pagerStress(voi
25040 64 20 2a 70 2c 20 50 67 48 64 72 20 2a 70 50 67  d *p, PgHdr *pPg
25050 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
25060 65 72 20 3d 20 28 50 61 67 65 72 20 2a 29 70 3b  er = (Pager *)p;
25070 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
25080 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
25090 28 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70  ( pPg->pPager==p
250a0 50 61 67 65 72 20 29 3b 0a 20 20 61 73 73 65 72  Pager );.  asser
250b0 74 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  t( pPg->flags&PG
250c0 48 44 52 5f 44 49 52 54 59 20 29 3b 0a 0a 20 20  HDR_DIRTY );..  
250d0 2f 2a 20 54 68 65 20 64 6f 4e 6f 74 53 79 6e 63  /* The doNotSync
250e0 53 70 69 6c 6c 20 66 6c 61 67 20 69 73 20 73 65  Spill flag is se
250f0 74 20 64 75 72 69 6e 67 20 74 69 6d 65 73 20 77  t during times w
25100 68 65 6e 20 64 6f 69 6e 67 20 61 20 73 79 6e 63  hen doing a sync
25110 20 6f 66 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c   of.  ** journal
25120 20 28 61 6e 64 20 61 64 64 69 6e 67 20 61 20 6e   (and adding a n
25130 65 77 20 68 65 61 64 65 72 29 20 69 73 20 6e 6f  ew header) is no
25140 74 20 61 6c 6c 6f 77 65 64 2e 20 20 54 68 69 73  t allowed.  This
25150 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64 75 72   occurs.  ** dur
25160 69 6e 67 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c  ing calls to sql
25170 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
25180 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f   while trying to
25190 20 6a 6f 75 72 6e 61 6c 20 6d 75 6c 74 69 70 6c   journal multipl
251a0 65 0a 20 20 2a 2a 20 70 61 67 65 73 20 62 65 6c  e.  ** pages bel
251b0 6f 6e 67 69 6e 67 20 74 6f 20 74 68 65 20 73 61  onging to the sa
251c0 6d 65 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2a 0a  me sector..  **.
251d0 20 20 2a 2a 20 54 68 65 20 64 6f 4e 6f 74 53 70    ** The doNotSp
251e0 69 6c 6c 20 66 6c 61 67 20 69 6e 68 69 62 69 74  ill flag inhibit
251f0 73 20 61 6c 6c 20 63 61 63 68 65 20 73 70 69 6c  s all cache spil
25200 6c 69 6e 67 20 72 65 67 61 72 64 6c 65 73 73 20  ling regardless 
25210 6f 66 20 77 68 65 74 68 65 72 0a 20 20 2a 2a 20  of whether.  ** 
25220 6f 72 20 6e 6f 74 20 61 20 73 79 6e 63 20 69 73  or not a sync is
25230 20 72 65 71 75 69 72 65 64 2e 20 20 54 68 69 73   required.  This
25240 20 69 73 20 73 65 74 20 64 75 72 69 6e 67 20 61   is set during a
25250 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 2a 2a 0a   rollback..  **.
25260 20 20 2a 2a 20 53 70 69 6c 6c 69 6e 67 20 69 73    ** Spilling is
25270 20 61 6c 73 6f 20 69 6e 68 69 62 69 74 65 64 20   also inhibited 
25280 77 68 65 6e 20 69 6e 20 61 6e 20 65 72 72 6f 72  when in an error
25290 20 73 74 61 74 65 2e 0a 20 20 2a 2f 0a 20 20 69   state..  */.  i
252a0 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
252b0 64 65 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  de ) return SQLI
252c0 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61  TE_OK;.  if( pPa
252d0 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20  ger->doNotSpill 
252e0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
252f0 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  OK;.  if( pPager
25300 2d 3e 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c  ->doNotSyncSpill
25310 20 26 26 20 28 70 50 67 2d 3e 66 6c 61 67 73 20   && (pPg->flags 
25320 26 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  & PGHDR_NEED_SYN
25330 43 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  C)!=0 ){.    ret
25340 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
25350 20 7d 0a 0a 20 20 70 50 67 2d 3e 70 44 69 72 74   }..  pPg->pDirt
25360 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 61 67  y = 0;.  if( pag
25370 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
25380 20 29 7b 0a 20 20 20 20 2f 2a 20 57 72 69 74 65   ){.    /* Write
25390 20 61 20 73 69 6e 67 6c 65 20 66 72 61 6d 65 20   a single frame 
253a0 66 6f 72 20 74 68 69 73 20 70 61 67 65 20 74 6f  for this page to
253b0 20 74 68 65 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20   the log. */.   
253c0 20 69 66 28 20 73 75 62 6a 52 65 71 75 69 72 65   if( subjRequire
253d0 73 50 61 67 65 28 70 50 67 29 20 29 7b 20 0a 20  sPage(pPg) ){ . 
253e0 20 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f 75       rc = subjou
253f0 72 6e 61 6c 50 61 67 65 28 70 50 67 29 3b 20 0a  rnalPage(pPg); .
25400 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
25410 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
25420 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 57       rc = pagerW
25430 61 6c 46 72 61 6d 65 73 28 70 50 61 67 65 72 2c  alFrames(pPager,
25440 20 70 50 67 2c 20 30 2c 20 30 2c 20 30 29 3b 0a   pPg, 0, 0, 0);.
25450 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
25460 20 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68   .    /* Sync th
25470 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
25480 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20  f required. */. 
25490 20 20 20 69 66 28 20 70 50 67 2d 3e 66 6c 61 67     if( pPg->flag
254a0 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
254b0 43 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  C ){.      rc = 
254c0 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67  syncJournal(pPag
254d0 65 72 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20  er, 1);.    }.  
254e0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70  .    /* If the p
254f0 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
25500 69 73 20 70 61 67 65 20 69 73 20 6c 61 72 67 65  is page is large
25510 72 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65  r than the curre
25520 6e 74 20 73 69 7a 65 20 6f 66 0a 20 20 20 20 2a  nt size of.    *
25530 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  * the database i
25540 6d 61 67 65 2c 20 69 74 20 6d 61 79 20 6e 65 65  mage, it may nee
25550 64 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  d to be written 
25560 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  to the sub-journ
25570 61 6c 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20  al..    ** This 
25580 69 73 20 62 65 63 61 75 73 65 20 74 68 65 20 63  is because the c
25590 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 77 72 69  all to pager_wri
255a0 74 65 5f 70 61 67 65 6c 69 73 74 28 29 20 62 65  te_pagelist() be
255b0 6c 6f 77 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 20  low will not.   
255c0 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 77 72 69   ** actually wri
255d0 74 65 20 64 61 74 61 20 74 6f 20 74 68 65 20 66  te data to the f
255e0 69 6c 65 20 69 6e 20 74 68 69 73 20 63 61 73 65  ile in this case
255f0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
25600 43 6f 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c  Consider the fol
25610 6c 6f 77 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lowing sequence 
25620 6f 66 20 65 76 65 6e 74 73 3a 0a 20 20 20 20 2a  of events:.    *
25630 2a 0a 20 20 20 20 2a 2a 20 20 20 42 45 47 49 4e  *.    **   BEGIN
25640 3b 0a 20 20 20 20 2a 2a 20 20 20 20 20 3c 6a 6f  ;.    **     <jo
25650 75 72 6e 61 6c 20 70 61 67 65 20 58 3e 0a 20 20  urnal page X>.  
25660 20 20 2a 2a 20 20 20 20 20 3c 6d 6f 64 69 66 79    **     <modify
25670 20 70 61 67 65 20 58 3e 0a 20 20 20 20 2a 2a 20   page X>.    ** 
25680 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20 73 70      SAVEPOINT sp
25690 3b 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 3c  ;.    **       <
256a0 73 68 72 69 6e 6b 20 64 61 74 61 62 61 73 65 20  shrink database 
256b0 66 69 6c 65 20 74 6f 20 59 20 70 61 67 65 73 3e  file to Y pages>
256c0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 70 61  .    **       pa
256d0 67 65 72 53 74 72 65 73 73 28 70 61 67 65 20 58  gerStress(page X
256e0 29 0a 20 20 20 20 2a 2a 20 20 20 20 20 52 4f 4c  ).    **     ROL
256f0 4c 42 41 43 4b 20 54 4f 20 73 70 3b 0a 20 20 20  LBACK TO sp;.   
25700 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 28 58   **.    ** If (X
25710 3e 59 29 2c 20 74 68 65 6e 20 77 68 65 6e 20 70  >Y), then when p
25720 61 67 65 72 53 74 72 65 73 73 20 69 73 20 63 61  agerStress is ca
25730 6c 6c 65 64 20 70 61 67 65 20 58 20 77 69 6c 6c  lled page X will
25740 20 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e 0a   not be written.
25750 20 20 20 20 2a 2a 20 6f 75 74 20 74 6f 20 74 68      ** out to th
25760 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
25770 20 62 75 74 20 77 69 6c 6c 20 62 65 20 64 72 6f   but will be dro
25780 70 70 65 64 20 66 72 6f 6d 20 74 68 65 20 63 61  pped from the ca
25790 63 68 65 2e 20 54 68 65 6e 2c 0a 20 20 20 20 2a  che. Then,.    *
257a0 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  * following the 
257b0 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70 22  "ROLLBACK TO sp"
257c0 20 73 74 61 74 65 6d 65 6e 74 2c 20 72 65 61 64   statement, read
257d0 69 6e 67 20 70 61 67 65 20 58 20 77 69 6c 6c 20  ing page X will 
257e0 72 65 61 64 0a 20 20 20 20 2a 2a 20 64 61 74 61  read.    ** data
257f0 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
25800 73 65 20 66 69 6c 65 2e 20 54 68 69 73 20 77 69  se file. This wi
25810 6c 6c 20 62 65 20 74 68 65 20 63 6f 70 79 20 6f  ll be the copy o
25820 66 20 70 61 67 65 20 58 20 61 73 20 69 74 0a 20  f page X as it. 
25830 20 20 20 2a 2a 20 77 61 73 20 77 68 65 6e 20 74     ** was when t
25840 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  he transaction s
25850 74 61 72 74 65 64 2c 20 6e 6f 74 20 61 73 20 69  tarted, not as i
25860 74 20 77 61 73 20 77 68 65 6e 20 22 53 41 56 45  t was when "SAVE
25870 50 4f 49 4e 54 20 73 70 22 0a 20 20 20 20 2a 2a  POINT sp".    **
25880 20 77 61 73 20 65 78 65 63 75 74 65 64 2e 0a 20   was executed.. 
25890 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
258a0 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74 6f 20   solution is to 
258b0 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e  write the curren
258c0 74 20 64 61 74 61 20 66 6f 72 20 70 61 67 65 20  t data for page 
258d0 58 20 69 6e 74 6f 20 74 68 65 20 0a 20 20 20 20  X into the .    
258e0 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66  ** sub-journal f
258f0 69 6c 65 20 6e 6f 77 20 28 69 66 20 69 74 20 69  ile now (if it i
25900 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 74 68  s not already th
25910 65 72 65 29 2c 20 73 6f 20 74 68 61 74 20 69 74  ere), so that it
25920 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20   will.    ** be 
25930 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20  restored to its 
25940 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 77 68  current value wh
25950 65 6e 20 74 68 65 20 22 52 4f 4c 4c 42 41 43 4b  en the "ROLLBACK
25960 20 54 4f 20 73 70 22 20 69 73 20 0a 20 20 20 20   TO sp" is .    
25970 2a 2a 20 65 78 65 63 75 74 65 64 2e 0a 20 20 20  ** executed..   
25980 20 2a 2f 0a 20 20 20 20 69 66 28 20 4e 45 56 45   */.    if( NEVE
25990 52 28 0a 20 20 20 20 20 20 20 20 72 63 3d 3d 53  R(.        rc==S
259a0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 67 2d  QLITE_OK && pPg-
259b0 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62  >pgno>pPager->db
259c0 53 69 7a 65 20 26 26 20 73 75 62 6a 52 65 71 75  Size && subjRequ
259d0 69 72 65 73 50 61 67 65 28 70 50 67 29 0a 20 20  iresPage(pPg).  
259e0 20 20 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20    ) ){.      rc 
259f0 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65  = subjournalPage
25a00 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 0a  (pPg);.    }.  .
25a10 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
25a20 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
25a30 20 70 61 67 65 20 6f 75 74 20 74 6f 20 74 68 65   page out to the
25a40 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
25a50 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
25a60 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
25a70 20 20 61 73 73 65 72 74 28 20 28 70 50 67 2d 3e    assert( (pPg->
25a80 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
25a90 5f 53 59 4e 43 29 3d 3d 30 20 29 3b 0a 20 20 20  _SYNC)==0 );.   
25aa0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72     rc = pager_wr
25ab0 69 74 65 5f 70 61 67 65 6c 69 73 74 28 70 50 61  ite_pagelist(pPa
25ac0 67 65 72 2c 20 70 50 67 29 3b 0a 20 20 20 20 7d  ger, pPg);.    }
25ad0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20  .  }..  /* Mark 
25ae0 74 68 65 20 70 61 67 65 20 61 73 20 63 6c 65 61  the page as clea
25af0 6e 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  n. */.  if( rc==
25b00 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
25b10 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53 54   PAGERTRACE(("ST
25b20 52 45 53 53 20 25 64 20 70 61 67 65 20 25 64 5c  RESS %d page %d\
25b30 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
25b40 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29  er), pPg->pgno))
25b50 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  ;.    sqlite3Pca
25b60 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67  cheMakeClean(pPg
25b70 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
25b80 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
25b90 67 65 72 2c 20 72 63 29 3b 0a 7d 0a 0a 0a 2f 2a  ger, rc);.}.../*
25ba0 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64  .** Allocate and
25bb0 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e 65   initialize a ne
25bc0 77 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 61  w Pager object a
25bd0 6e 64 20 70 75 74 20 61 20 70 6f 69 6e 74 65 72  nd put a pointer
25be0 20 74 6f 20 69 74 0a 2a 2a 20 69 6e 20 2a 70 70   to it.** in *pp
25bf0 50 61 67 65 72 2e 20 54 68 65 20 70 61 67 65 72  Pager. The pager
25c00 20 73 68 6f 75 6c 64 20 65 76 65 6e 74 75 61 6c   should eventual
25c10 6c 79 20 62 65 20 66 72 65 65 64 20 62 79 20 70  ly be freed by p
25c20 61 73 73 69 6e 67 20 69 74 0a 2a 2a 20 74 6f 20  assing it.** to 
25c30 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73  sqlite3PagerClos
25c40 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a  e()..**.** The z
25c50 46 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e  Filename argumen
25c60 74 20 69 73 20 74 68 65 20 70 61 74 68 20 74 6f  t is the path to
25c70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
25c80 6c 65 20 74 6f 20 6f 70 65 6e 2e 0a 2a 2a 20 49  le to open..** I
25c90 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e  f zFilename is N
25ca0 55 4c 4c 20 74 68 65 6e 20 61 20 72 61 6e 64 6f  ULL then a rando
25cb0 6d 6c 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72  mly-named tempor
25cc0 61 72 79 20 66 69 6c 65 20 69 73 20 63 72 65 61  ary file is crea
25cd0 74 65 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20  ted.** and used 
25ce0 61 73 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62  as the file to b
25cf0 65 20 63 61 63 68 65 64 2e 20 54 65 6d 70 6f 72  e cached. Tempor
25d00 61 72 79 20 66 69 6c 65 73 20 61 72 65 20 62 65  ary files are be
25d10 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f   deleted.** auto
25d20 6d 61 74 69 63 61 6c 6c 79 20 77 68 65 6e 20 74  matically when t
25d30 68 65 79 20 61 72 65 20 63 6c 6f 73 65 64 2e 20  hey are closed. 
25d40 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  If zFilename is 
25d50 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20  ":memory:" then 
25d60 0a 2a 2a 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74  .** all informat
25d70 69 6f 6e 20 69 73 20 68 65 6c 64 20 69 6e 20 63  ion is held in c
25d80 61 63 68 65 2e 20 49 74 20 69 73 20 6e 65 76 65  ache. It is neve
25d90 72 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73  r written to dis
25da0 6b 2e 20 0a 2a 2a 20 54 68 69 73 20 63 61 6e 20  k. .** This can 
25db0 62 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65  be used to imple
25dc0 6d 65 6e 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  ment an in-memor
25dd0 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  y database..**.*
25de0 2a 20 54 68 65 20 6e 45 78 74 72 61 20 70 61 72  * The nExtra par
25df0 61 6d 65 74 65 72 20 73 70 65 63 69 66 69 65 73  ameter specifies
25e00 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
25e10 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 6c  ytes of space al
25e20 6c 6f 63 61 74 65 64 0a 2a 2a 20 61 6c 6f 6e 67  located.** along
25e30 20 77 69 74 68 20 65 61 63 68 20 70 61 67 65 20   with each page 
25e40 72 65 66 65 72 65 6e 63 65 2e 20 54 68 69 73 20  reference. This 
25e50 73 70 61 63 65 20 69 73 20 61 76 61 69 6c 61 62  space is availab
25e60 6c 65 20 74 6f 20 74 68 65 20 75 73 65 72 0a 2a  le to the user.*
25e70 2a 20 76 69 61 20 74 68 65 20 73 71 6c 69 74 65  * via the sqlite
25e80 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 29  3PagerGetExtra()
25e90 20 41 50 49 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20   API..**.** The 
25ea0 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 20 69  flags argument i
25eb0 73 20 75 73 65 64 20 74 6f 20 73 70 65 63 69 66  s used to specif
25ec0 79 20 70 72 6f 70 65 72 74 69 65 73 20 74 68 61  y properties tha
25ed0 74 20 61 66 66 65 63 74 20 74 68 65 0a 2a 2a 20  t affect the.** 
25ee0 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  operation of the
25ef0 20 70 61 67 65 72 2e 20 49 74 20 73 68 6f 75 6c   pager. It shoul
25f00 64 20 62 65 20 70 61 73 73 65 64 20 73 6f 6d 65  d be passed some
25f10 20 62 69 74 77 69 73 65 20 63 6f 6d 62 69 6e 61   bitwise combina
25f20 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 50  tion.** of the P
25f30 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41  AGER_OMIT_JOURNA
25f40 4c 20 61 6e 64 20 50 41 47 45 52 5f 4e 4f 5f 52  L and PAGER_NO_R
25f50 45 41 44 4c 4f 43 4b 20 66 6c 61 67 73 2e 0a 2a  EADLOCK flags..*
25f60 2a 0a 2a 2a 20 54 68 65 20 76 66 73 46 6c 61 67  *.** The vfsFlag
25f70 73 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61  s parameter is a
25f80 20 62 69 74 6d 61 73 6b 20 74 6f 20 70 61 73 73   bitmask to pass
25f90 20 74 6f 20 74 68 65 20 66 6c 61 67 73 20 70 61   to the flags pa
25fa0 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 66 20 74 68  rameter.** of th
25fb0 65 20 78 4f 70 65 6e 28 29 20 6d 65 74 68 6f 64  e xOpen() method
25fc0 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65 64   of the supplied
25fd0 20 56 46 53 20 77 68 65 6e 20 6f 70 65 6e 69 6e   VFS when openin
25fe0 67 20 66 69 6c 65 73 2e 20 0a 2a 2a 0a 2a 2a 20  g files. .**.** 
25ff0 49 66 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a  If the pager obj
26000 65 63 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ect is allocated
26010 20 61 6e 64 20 74 68 65 20 73 70 65 63 69 66 69   and the specifi
26020 65 64 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 0a  ed file opened .
26030 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c  ** successfully,
26040 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
26050 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61  turned and *ppPa
26060 67 65 72 20 73 65 74 20 74 6f 20 70 6f 69 6e 74  ger set to point
26070 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 65 77 20 70   to.** the new p
26080 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 49 66 20  ager object. If 
26090 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
260a0 20 2a 70 70 50 61 67 65 72 20 69 73 20 73 65 74   *ppPager is set
260b0 20 74 6f 20 4e 55 4c 4c 0a 2a 2a 20 61 6e 64 20   to NULL.** and 
260c0 65 72 72 6f 72 20 63 6f 64 65 20 72 65 74 75 72  error code retur
260d0 6e 65 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ned. This functi
260e0 6f 6e 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51  on may return SQ
260f0 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 28 73  LITE_NOMEM.** (s
26100 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29 20 69  qlite3Malloc() i
26110 73 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61  s used to alloca
26120 74 65 20 6d 65 6d 6f 72 79 29 2c 20 53 51 4c 49  te memory), SQLI
26130 54 45 5f 43 41 4e 54 4f 50 45 4e 20 6f 72 20 0a  TE_CANTOPEN or .
26140 2a 2a 20 76 61 72 69 6f 75 73 20 53 51 4c 49 54  ** various SQLIT
26150 45 5f 49 4f 5f 58 58 58 20 65 72 72 6f 72 73 2e  E_IO_XXX errors.
26160 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
26170 61 67 65 72 4f 70 65 6e 28 0a 20 20 73 71 6c 69  agerOpen(.  sqli
26180 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20  te3_vfs *pVfs,  
26190 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74       /* The virt
261a0 75 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 20  ual file system 
261b0 74 6f 20 75 73 65 20 2a 2f 0a 20 20 50 61 67 65  to use */.  Page
261c0 72 20 2a 2a 70 70 50 61 67 65 72 2c 20 20 20 20  r **ppPager,    
261d0 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 74       /* OUT: Ret
261e0 75 72 6e 20 74 68 65 20 50 61 67 65 72 20 73 74  urn the Pager st
261f0 72 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a  ructure here */.
26200 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
26210 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61  ilename,   /* Na
26220 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
26230 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20  se file to open 
26240 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c  */.  int nExtra,
26250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26260 20 45 78 74 72 61 20 62 79 74 65 73 20 61 70 70   Extra bytes app
26270 65 6e 64 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d  end to each in-m
26280 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20  emory page */.  
26290 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20  int flags,      
262a0 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67           /* flag
262b0 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74 68  s controlling th
262c0 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  is file */.  int
262d0 20 76 66 73 46 6c 61 67 73 2c 20 20 20 20 20 20   vfsFlags,      
262e0 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 70        /* flags p
262f0 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f  assed through to
26300 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70   sqlite3_vfs.xOp
26310 65 6e 28 29 20 2a 2f 0a 20 20 76 6f 69 64 20 28  en() */.  void (
26320 2a 78 52 65 69 6e 69 74 29 28 44 62 50 61 67 65  *xReinit)(DbPage
26330 2a 29 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74  *) /* Function t
26340 6f 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 20 70  o reinitialize p
26350 61 67 65 73 20 2a 2f 0a 29 7b 0a 20 20 75 38 20  ages */.){.  u8 
26360 2a 70 50 74 72 3b 0a 20 20 50 61 67 65 72 20 2a  *pPtr;.  Pager *
26370 70 50 61 67 65 72 20 3d 20 30 3b 20 20 20 20 20  pPager = 0;     
26380 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63    /* Pager objec
26390 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 6e  t to allocate an
263a0 64 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e  d return */.  in
263b0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
263c0 3b 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e  ;      /* Return
263d0 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 74   code */.  int t
263e0 65 6d 70 46 69 6c 65 20 3d 20 30 3b 20 20 20 20  empFile = 0;    
263f0 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
26400 74 65 6d 70 20 66 69 6c 65 73 20 28 69 6e 63 6c  temp files (incl
26410 2e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  . in-memory file
26420 73 29 20 2a 2f 0a 20 20 69 6e 74 20 6d 65 6d 44  s) */.  int memD
26430 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  b = 0;          
26440 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
26450 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   is an in-memory
26460 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72   file */.  int r
26470 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 20 20 20 20  eadOnly = 0;    
26480 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
26490 68 69 73 20 69 73 20 61 20 72 65 61 64 2d 6f 6e  his is a read-on
264a0 6c 79 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  ly file */.  int
264b0 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65   journalFileSize
264c0 3b 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 74  ;     /* Bytes t
264d0 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72 20 65  o allocate for e
264e0 61 63 68 20 6a 6f 75 72 6e 61 6c 20 66 64 20 2a  ach journal fd *
264f0 2f 0a 20 20 63 68 61 72 20 2a 7a 50 61 74 68 6e  /.  char *zPathn
26500 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  ame = 0;     /* 
26510 46 75 6c 6c 20 70 61 74 68 20 74 6f 20 64 61 74  Full path to dat
26520 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
26530 69 6e 74 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20  int nPathname = 
26540 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  0;       /* Numb
26550 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 7a  er of bytes in z
26560 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e  Pathname */.  in
26570 74 20 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28  t useJournal = (
26580 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4f 4d  flags & PAGER_OM
26590 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b 20  IT_JOURNAL)==0; 
265a0 2f 2a 20 46 61 6c 73 65 20 74 6f 20 6f 6d 69 74  /* False to omit
265b0 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e   journal */.  in
265c0 74 20 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 28  t noReadlock = (
265d0 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4e 4f  flags & PAGER_NO
265e0 5f 52 45 41 44 4c 4f 43 4b 29 21 3d 30 3b 20 20  _READLOCK)!=0;  
265f0 2f 2a 20 54 72 75 65 20 74 6f 20 6f 6d 69 74 20  /* True to omit 
26600 72 65 61 64 2d 6c 6f 63 6b 20 2a 2f 0a 20 20 69  read-lock */.  i
26610 6e 74 20 70 63 61 63 68 65 53 69 7a 65 20 3d 20  nt pcacheSize = 
26620 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 69 7a  sqlite3PcacheSiz
26630 65 28 29 3b 20 20 20 20 20 20 20 2f 2a 20 42 79  e();       /* By
26640 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  tes to allocate 
26650 66 6f 72 20 50 43 61 63 68 65 20 2a 2f 0a 20 20  for PCache */.  
26660 75 31 36 20 73 7a 50 61 67 65 44 66 6c 74 20 3d  u16 szPageDflt =
26670 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
26680 50 41 47 45 5f 53 49 5a 45 3b 20 20 2f 2a 20 44  PAGE_SIZE;  /* D
26690 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65  efault page size
266a0 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65   */..  /* Figure
266b0 20 6f 75 74 20 68 6f 77 20 6d 75 63 68 20 73 70   out how much sp
266c0 61 63 65 20 69 73 20 72 65 71 75 69 72 65 64 20  ace is required 
266d0 66 6f 72 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c  for each journal
266e0 20 66 69 6c 65 2d 68 61 6e 64 6c 65 0a 20 20 2a   file-handle.  *
266f0 2a 20 28 74 68 65 72 65 20 61 72 65 20 74 77 6f  * (there are two
26700 20 6f 66 20 74 68 65 6d 2c 20 74 68 65 20 6d 61   of them, the ma
26710 69 6e 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74  in journal and t
26720 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 29 2e  he sub-journal).
26730 20 54 68 69 73 0a 20 20 2a 2a 20 69 73 20 74 68   This.  ** is th
26740 65 20 6d 61 78 69 6d 75 6d 20 73 70 61 63 65 20  e maximum space 
26750 72 65 71 75 69 72 65 64 20 66 6f 72 20 61 6e 20  required for an 
26760 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61  in-memory journa
26770 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 0a 20  l file handle . 
26780 20 2a 2a 20 61 6e 64 20 61 20 72 65 67 75 6c 61   ** and a regula
26790 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 68  r journal file-h
267a0 61 6e 64 6c 65 2e 20 4e 6f 74 65 20 74 68 61 74  andle. Note that
267b0 20 61 20 22 72 65 67 75 6c 61 72 20 6a 6f 75 72   a "regular jour
267c0 6e 61 6c 2d 68 61 6e 64 6c 65 22 0a 20 20 2a 2a  nal-handle".  **
267d0 20 6d 61 79 20 62 65 20 61 20 77 72 61 70 70 65   may be a wrappe
267e0 72 20 63 61 70 61 62 6c 65 20 6f 66 20 63 61 63  r capable of cac
267f0 68 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 70  hing the first p
26800 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6a 6f  ortion of the jo
26810 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20  urnal.  ** file 
26820 69 6e 20 6d 65 6d 6f 72 79 20 74 6f 20 69 6d 70  in memory to imp
26830 6c 65 6d 65 6e 74 20 74 68 65 20 61 74 6f 6d 69  lement the atomi
26840 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61  c-write optimiza
26850 74 69 6f 6e 20 28 73 65 65 20 0a 20 20 2a 2a 20  tion (see .  ** 
26860 73 6f 75 72 63 65 20 66 69 6c 65 20 6a 6f 75 72  source file jour
26870 6e 61 6c 2e 63 29 2e 0a 20 20 2a 2f 0a 20 20 69  nal.c)..  */.  i
26880 66 28 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61  f( sqlite3Journa
26890 6c 53 69 7a 65 28 70 56 66 73 29 3e 73 71 6c 69  lSize(pVfs)>sqli
268a0 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a  te3MemJournalSiz
268b0 65 28 29 20 29 7b 0a 20 20 20 20 6a 6f 75 72 6e  e() ){.    journ
268c0 61 6c 46 69 6c 65 53 69 7a 65 20 3d 20 52 4f 55  alFileSize = ROU
268d0 4e 44 38 28 73 71 6c 69 74 65 33 4a 6f 75 72 6e  ND8(sqlite3Journ
268e0 61 6c 53 69 7a 65 28 70 56 66 73 29 29 3b 0a 20  alSize(pVfs));. 
268f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6a 6f 75 72   }else{.    jour
26900 6e 61 6c 46 69 6c 65 53 69 7a 65 20 3d 20 52 4f  nalFileSize = RO
26910 55 4e 44 38 28 73 71 6c 69 74 65 33 4d 65 6d 4a  UND8(sqlite3MemJ
26920 6f 75 72 6e 61 6c 53 69 7a 65 28 29 29 3b 0a 20  ournalSize());. 
26930 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65   }..  /* Set the
26940 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65   output variable
26950 20 74 6f 20 4e 55 4c 4c 20 69 6e 20 63 61 73 65   to NULL in case
26960 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
26970 2e 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72 20  . */.  *ppPager 
26980 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75  = 0;..  /* Compu
26990 74 65 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  te and store the
269a0 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 69   full pathname i
269b0 6e 20 61 6e 20 61 6c 6c 6f 63 61 74 65 64 20 62  n an allocated b
269c0 75 66 66 65 72 20 70 6f 69 6e 74 65 64 0a 20 20  uffer pointed.  
269d0 2a 2a 20 74 6f 20 62 79 20 7a 50 61 74 68 6e 61  ** to by zPathna
269e0 6d 65 2c 20 6c 65 6e 67 74 68 20 6e 50 61 74 68  me, length nPath
269f0 6e 61 6d 65 2e 20 4f 72 2c 20 69 66 20 74 68 69  name. Or, if thi
26a00 73 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79  s is a temporary
26a10 20 66 69 6c 65 2c 0a 20 20 2a 2a 20 6c 65 61 76   file,.  ** leav
26a20 65 20 62 6f 74 68 20 6e 50 61 74 68 6e 61 6d 65  e both nPathname
26a30 20 61 6e 64 20 7a 50 61 74 68 6e 61 6d 65 20 73   and zPathname s
26a40 65 74 20 74 6f 20 30 2e 0a 20 20 2a 2f 0a 20 20  et to 0..  */.  
26a50 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26  if( zFilename &&
26a60 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b   zFilename[0] ){
26a70 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d  .    nPathname =
26a80 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
26a90 65 2b 31 3b 0a 20 20 20 20 7a 50 61 74 68 6e 61  e+1;.    zPathna
26aa0 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  me = sqlite3Mall
26ab0 6f 63 28 6e 50 61 74 68 6e 61 6d 65 2a 32 29 3b  oc(nPathname*2);
26ac0 0a 20 20 20 20 69 66 28 20 7a 50 61 74 68 6e 61  .    if( zPathna
26ad0 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  me==0 ){.      r
26ae0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
26af0 45 4d 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  EM;.    }.#ifnde
26b00 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  f SQLITE_OMIT_ME
26b10 4d 4f 52 59 44 42 0a 20 20 20 20 69 66 28 20 73  MORYDB.    if( s
26b20 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c  trcmp(zFilename,
26b30 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 20 29  ":memory:")==0 )
26b40 7b 0a 20 20 20 20 20 20 6d 65 6d 44 62 20 3d 20  {.      memDb = 
26b50 31 3b 0a 20 20 20 20 20 20 7a 50 61 74 68 6e 61  1;.      zPathna
26b60 6d 65 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 7d  me[0] = 0;.    }
26b70 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20  else.#endif.    
26b80 7b 0a 20 20 20 20 20 20 7a 50 61 74 68 6e 61 6d  {.      zPathnam
26b90 65 5b 30 5d 20 3d 20 30 3b 20 2f 2a 20 4d 61 6b  e[0] = 0; /* Mak
26ba0 65 20 73 75 72 65 20 69 6e 69 74 69 61 6c 69 7a  e sure initializ
26bb0 65 64 20 65 76 65 6e 20 69 66 20 46 75 6c 6c 50  ed even if FullP
26bc0 61 74 68 6e 61 6d 65 28 29 20 66 61 69 6c 73 20  athname() fails 
26bd0 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  */.      rc = sq
26be0 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e  lite3OsFullPathn
26bf0 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e  ame(pVfs, zFilen
26c00 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 2c 20  ame, nPathname, 
26c10 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  zPathname);.    
26c20 7d 0a 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65  }..    nPathname
26c30 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
26c40 33 30 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20  30(zPathname);. 
26c50 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
26c60 45 5f 4f 4b 20 26 26 20 6e 50 61 74 68 6e 61 6d  E_OK && nPathnam
26c70 65 2b 38 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68  e+8>pVfs->mxPath
26c80 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a  name ){.      /*
26c90 20 54 68 69 73 20 62 72 61 6e 63 68 20 69 73 20   This branch is 
26ca0 74 61 6b 65 6e 20 77 68 65 6e 20 74 68 65 20 6a  taken when the j
26cb0 6f 75 72 6e 61 6c 20 70 61 74 68 20 72 65 71 75  ournal path requ
26cc0 69 72 65 64 20 62 79 0a 20 20 20 20 20 20 2a 2a  ired by.      **
26cd0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65   the database be
26ce0 69 6e 67 20 6f 70 65 6e 65 64 20 77 69 6c 6c 20  ing opened will 
26cf0 62 65 20 6d 6f 72 65 20 74 68 61 6e 20 70 56 66  be more than pVf
26d00 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 0a 20 20  s->mxPathname.  
26d10 20 20 20 20 2a 2a 20 62 79 74 65 73 20 69 6e 20      ** bytes in 
26d20 6c 65 6e 67 74 68 2e 20 54 68 69 73 20 6d 65 61  length. This mea
26d30 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ns the database 
26d40 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64  cannot be opened
26d50 2c 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 69 74  ,.      ** as it
26d60 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 70 6f 73   will not be pos
26d70 73 69 62 6c 65 20 74 6f 20 6f 70 65 6e 20 74 68  sible to open th
26d80 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  e journal file o
26d90 72 20 65 76 65 6e 0a 20 20 20 20 20 20 2a 2a 20  r even.      ** 
26da0 63 68 65 63 6b 20 66 6f 72 20 61 20 68 6f 74 2d  check for a hot-
26db0 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 72  journal before r
26dc0 65 61 64 69 6e 67 2e 0a 20 20 20 20 20 20 2a 2f  eading..      */
26dd0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
26de0 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54  TE_CANTOPEN_BKPT
26df0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
26e00 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
26e10 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
26e20 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a  ree(zPathname);.
26e30 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
26e40 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
26e50 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79   Allocate memory
26e60 20 66 6f 72 20 74 68 65 20 50 61 67 65 72 20 73   for the Pager s
26e70 74 72 75 63 74 75 72 65 2c 20 50 43 61 63 68 65  tructure, PCache
26e80 20 6f 62 6a 65 63 74 2c 20 74 68 65 0a 20 20 2a   object, the.  *
26e90 2a 20 74 68 72 65 65 20 66 69 6c 65 20 64 65 73  * three file des
26ea0 63 72 69 70 74 6f 72 73 2c 20 74 68 65 20 64 61  criptors, the da
26eb0 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65  tabase file name
26ec0 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c   and the journal
26ed0 20 0a 20 20 2a 2a 20 66 69 6c 65 20 6e 61 6d 65   .  ** file name
26ee0 2e 20 54 68 65 20 6c 61 79 6f 75 74 20 69 6e 20  . The layout in 
26ef0 6d 65 6d 6f 72 79 20 69 73 20 61 73 20 66 6f 6c  memory is as fol
26f00 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  lows:.  **.  ** 
26f10 20 20 20 20 50 61 67 65 72 20 6f 62 6a 65 63 74      Pager object
26f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26f30 20 20 20 20 28 73 69 7a 65 6f 66 28 50 61 67 65      (sizeof(Page
26f40 72 29 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20  r) bytes).  **  
26f50 20 20 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74     PCache object
26f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26f70 20 20 20 28 73 71 6c 69 74 65 33 50 63 61 63 68     (sqlite3Pcach
26f80 65 53 69 7a 65 28 29 20 62 79 74 65 73 29 0a 20  eSize() bytes). 
26f90 20 2a 2a 20 20 20 20 20 44 61 74 61 62 61 73 65   **     Database
26fa0 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20   file handle    
26fb0 20 20 20 20 20 20 20 20 28 70 56 66 73 2d 3e 73          (pVfs->s
26fc0 7a 4f 73 46 69 6c 65 20 62 79 74 65 73 29 0a 20  zOsFile bytes). 
26fd0 20 2a 2a 20 20 20 20 20 53 75 62 2d 6a 6f 75 72   **     Sub-jour
26fe0 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20  nal file handle 
26ff0 20 20 20 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c          (journal
27000 46 69 6c 65 53 69 7a 65 20 62 79 74 65 73 29 0a  FileSize bytes).
27010 20 20 2a 2a 20 20 20 20 20 4d 61 69 6e 20 6a 6f    **     Main jo
27020 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c  urnal file handl
27030 65 20 20 20 20 20 20 20 20 28 6a 6f 75 72 6e 61  e        (journa
27040 6c 46 69 6c 65 53 69 7a 65 20 62 79 74 65 73 29  lFileSize bytes)
27050 0a 20 20 2a 2a 20 20 20 20 20 44 61 74 61 62 61  .  **     Databa
27060 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 20 20 20  se file name    
27070 20 20 20 20 20 20 20 20 20 20 28 6e 50 61 74 68            (nPath
27080 6e 61 6d 65 2b 31 20 62 79 74 65 73 29 0a 20 20  name+1 bytes).  
27090 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66  **     Journal f
270a0 69 6c 65 20 6e 61 6d 65 20 20 20 20 20 20 20 20  ile name        
270b0 20 20 20 20 20 20 20 28 6e 50 61 74 68 6e 61 6d         (nPathnam
270c0 65 2b 38 2b 31 20 62 79 74 65 73 29 0a 20 20 2a  e+8+1 bytes).  *
270d0 2f 0a 20 20 70 50 74 72 20 3d 20 28 75 38 20 2a  /.  pPtr = (u8 *
270e0 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65  )sqlite3MallocZe
270f0 72 6f 28 0a 20 20 20 20 52 4f 55 4e 44 38 28 73  ro(.    ROUND8(s
27100 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 29 20  izeof(*pPager)) 
27110 2b 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20  +      /* Pager 
27120 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20  structure */.   
27130 20 52 4f 55 4e 44 38 28 70 63 61 63 68 65 53 69   ROUND8(pcacheSi
27140 7a 65 29 20 2b 20 20 20 20 20 20 20 20 20 20 20  ze) +           
27150 2f 2a 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74  /* PCache object
27160 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44 38 28 70   */.    ROUND8(p
27170 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 20 2b  Vfs->szOsFile) +
27180 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61         /* The ma
27190 69 6e 20 64 62 20 66 69 6c 65 20 2a 2f 0a 20 20  in db file */.  
271a0 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a    journalFileSiz
271b0 65 20 2a 20 32 20 2b 20 20 20 20 20 20 20 20 20  e * 2 +         
271c0 20 2f 2a 20 54 68 65 20 74 77 6f 20 6a 6f 75 72   /* The two jour
271d0 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 20 0a 20 20  nal files */ .  
271e0 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31 20    nPathname + 1 
271f0 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  +               
27200 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 2a 2f   /* zFilename */
27210 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b  .    nPathname +
27220 20 38 20 2b 20 31 20 20 20 20 20 20 20 20 20 20   8 + 1          
27230 20 20 20 20 2f 2a 20 7a 4a 6f 75 72 6e 61 6c 20      /* zJournal 
27240 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
27250 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 2b  E_OMIT_WAL.    +
27260 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 34 20 2b   nPathname + 4 +
27270 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20   1              
27280 2f 2a 20 7a 57 61 6c 20 2a 2f 0a 23 65 6e 64 69  /* zWal */.#endi
27290 66 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28  f.  );.  assert(
272a0 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47   EIGHT_BYTE_ALIG
272b0 4e 4d 45 4e 54 28 53 51 4c 49 54 45 5f 49 4e 54  NMENT(SQLITE_INT
272c0 5f 54 4f 5f 50 54 52 28 6a 6f 75 72 6e 61 6c 46  _TO_PTR(journalF
272d0 69 6c 65 53 69 7a 65 29 29 20 29 3b 0a 20 20 69  ileSize)) );.  i
272e0 66 28 20 21 70 50 74 72 20 29 7b 0a 20 20 20 20  f( !pPtr ){.    
272f0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61  sqlite3_free(zPa
27300 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74  thname);.    ret
27310 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
27320 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 20 3d  ;.  }.  pPager =
27330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 50                (P
27340 61 67 65 72 2a 29 28 70 50 74 72 29 3b 0a 20 20  ager*)(pPtr);.  
27350 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 20  pPager->pPCache 
27360 3d 20 20 20 20 28 50 43 61 63 68 65 2a 29 28 70  =    (PCache*)(p
27370 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 73 69  Ptr += ROUND8(si
27380 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 29 29 3b  zeof(*pPager)));
27390 0a 20 20 70 50 61 67 65 72 2d 3e 66 64 20 3d 20  .  pPager->fd = 
273a0 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a    (sqlite3_file*
273b0 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38  )(pPtr += ROUND8
273c0 28 70 63 61 63 68 65 53 69 7a 65 29 29 3b 0a 20  (pcacheSize));. 
273d0 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 20 3d 20   pPager->sjfd = 
273e0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28  (sqlite3_file*)(
273f0 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 70  pPtr += ROUND8(p
27400 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 29 3b  Vfs->szOsFile));
27410 0a 20 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3d  .  pPager->jfd =
27420 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a    (sqlite3_file*
27430 29 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61  )(pPtr += journa
27440 6c 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50  lFileSize);.  pP
27450 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20  ager->zFilename 
27460 3d 20 20 20 20 28 63 68 61 72 2a 29 28 70 50 74  =    (char*)(pPt
27470 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c 65  r += journalFile
27480 53 69 7a 65 29 3b 0a 20 20 61 73 73 65 72 74 28  Size);.  assert(
27490 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47   EIGHT_BYTE_ALIG
274a0 4e 4d 45 4e 54 28 70 50 61 67 65 72 2d 3e 6a 66  NMENT(pPager->jf
274b0 64 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c  d) );..  /* Fill
274c0 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e 7a 46   in the Pager.zF
274d0 69 6c 65 6e 61 6d 65 20 61 6e 64 20 50 61 67 65  ilename and Page
274e0 72 2e 7a 4a 6f 75 72 6e 61 6c 20 62 75 66 66 65  r.zJournal buffe
274f0 72 73 2c 20 69 66 20 72 65 71 75 69 72 65 64 2e  rs, if required.
27500 20 2a 2f 0a 20 20 69 66 28 20 7a 50 61 74 68 6e   */.  if( zPathn
27510 61 6d 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65  ame ){.    pPage
27520 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 20 20  r->zJournal =   
27530 28 63 68 61 72 2a 29 28 70 50 74 72 20 2b 3d 20  (char*)(pPtr += 
27540 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31 29 3b 0a  nPathname + 1);.
27550 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65      memcpy(pPage
27560 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50  r->zFilename, zP
27570 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61  athname, nPathna
27580 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  me);.    memcpy(
27590 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
275a0 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61  , zPathname, nPa
275b0 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d  thname);.    mem
275c0 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 4a 6f  cpy(&pPager->zJo
275d0 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d  urnal[nPathname]
275e0 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22 2c 20 38 29  , "-journal", 8)
275f0 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
27600 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d  ->zFilename[0]==
27610 30 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  0 ){.      pPage
27620 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 30 5d 20 3d  r->zJournal[0] =
27630 20 30 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65   0;.    }.#ifnde
27640 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
27650 4c 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20  L.    else{.    
27660 20 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 20 3d    pPager->zWal =
27670 20 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e   &pPager->zJourn
27680 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 2b 38 2b 31  al[nPathname+8+1
27690 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ];.      memcpy(
276a0 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 7a 50  pPager->zWal, zP
276b0 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61  athname, nPathna
276c0 6d 65 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  me);.      memcp
276d0 79 28 26 70 50 61 67 65 72 2d 3e 7a 57 61 6c 5b  y(&pPager->zWal[
276e0 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 77 61  nPathname], "-wa
276f0 6c 22 2c 20 34 29 3b 0a 20 20 20 20 7d 0a 23 65  l", 4);.    }.#e
27700 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33  ndif.    sqlite3
27710 5f 66 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29  _free(zPathname)
27720 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
27730 70 56 66 73 20 3d 20 70 56 66 73 3b 0a 20 20 70  pVfs = pVfs;.  p
27740 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 20  Pager->vfsFlags 
27750 3d 20 76 66 73 46 6c 61 67 73 3b 0a 0a 20 20 2f  = vfsFlags;..  /
27760 2a 20 4f 70 65 6e 20 74 68 65 20 70 61 67 65 72  * Open the pager
27770 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   file..  */.  if
27780 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a  ( zFilename && z
27790 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 26 26 20 21  Filename[0] && !
277a0 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 69 6e 74  memDb ){.    int
277b0 20 66 6f 75 74 20 3d 20 30 3b 20 20 20 20 20 20   fout = 0;      
277c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
277d0 20 56 46 53 20 66 6c 61 67 73 20 72 65 74 75 72   VFS flags retur
277e0 6e 65 64 20 62 79 20 78 4f 70 65 6e 28 29 20 2a  ned by xOpen() *
277f0 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
27800 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70  e3OsOpen(pVfs, p
27810 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
27820 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 20 76 66  , pPager->fd, vf
27830 73 46 6c 61 67 73 2c 20 26 66 6f 75 74 29 3b 0a  sFlags, &fout);.
27840 20 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28      readOnly = (
27850 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e  fout&SQLITE_OPEN
27860 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 0a 20 20 20  _READONLY);..   
27870 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20   /* If the file 
27880 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79  was successfully
27890 20 6f 70 65 6e 65 64 20 66 6f 72 20 72 65 61 64   opened for read
278a0 2f 77 72 69 74 65 20 61 63 63 65 73 73 2c 0a 20  /write access,. 
278b0 20 20 20 2a 2a 20 63 68 6f 6f 73 65 20 61 20 64     ** choose a d
278c0 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65  efault page size
278d0 20 69 6e 20 63 61 73 65 20 77 65 20 68 61 76 65   in case we have
278e0 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 0a 20   to create the. 
278f0 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66     ** database f
27900 69 6c 65 2e 20 54 68 65 20 64 65 66 61 75 6c 74  ile. The default
27910 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 74 68   page size is th
27920 65 20 6d 61 78 69 6d 75 6d 20 6f 66 3a 0a 20 20  e maximum of:.  
27930 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 2b    **.    **    +
27940 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
27950 50 41 47 45 5f 53 49 5a 45 2c 0a 20 20 20 20 2a  PAGE_SIZE,.    *
27960 2a 20 20 20 20 2b 20 54 68 65 20 76 61 6c 75 65  *    + The value
27970 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c   returned by sql
27980 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65  ite3OsSectorSize
27990 28 29 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54  ().    **    + T
279a0 68 65 20 6c 61 72 67 65 73 74 20 70 61 67 65 20  he largest page 
279b0 73 69 7a 65 20 74 68 61 74 20 63 61 6e 20 62 65  size that can be
279c0 20 77 72 69 74 74 65 6e 20 61 74 6f 6d 69 63 61   written atomica
279d0 6c 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  lly..    */.    
279e0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
279f0 4b 20 26 26 20 21 72 65 61 64 4f 6e 6c 79 20 29  K && !readOnly )
27a00 7b 0a 20 20 20 20 20 20 73 65 74 53 65 63 74 6f  {.      setSecto
27a10 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20  rSize(pPager);. 
27a20 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49       assert(SQLI
27a30 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  TE_DEFAULT_PAGE_
27a40 53 49 5a 45 3c 3d 53 51 4c 49 54 45 5f 4d 41 58  SIZE<=SQLITE_MAX
27a50 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
27a60 5a 45 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  ZE);.      if( s
27a70 7a 50 61 67 65 44 66 6c 74 3c 70 50 61 67 65 72  zPageDflt<pPager
27a80 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 29 7b 0a  ->sectorSize ){.
27a90 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
27aa0 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3e 53  er->sectorSize>S
27ab0 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c  QLITE_MAX_DEFAUL
27ac0 54 5f 50 41 47 45 5f 53 49 5a 45 20 29 7b 0a 20  T_PAGE_SIZE ){. 
27ad0 20 20 20 20 20 20 20 20 20 73 7a 50 61 67 65 44           szPageD
27ae0 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58  flt = SQLITE_MAX
27af0 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
27b00 5a 45 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ZE;.        }els
27b10 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 7a 50  e{.          szP
27b20 61 67 65 44 66 6c 74 20 3d 20 28 75 31 36 29 70  ageDflt = (u16)p
27b30 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
27b40 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
27b50 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
27b60 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43  TE_ENABLE_ATOMIC
27b70 5f 57 52 49 54 45 0a 20 20 20 20 20 20 7b 0a 20  _WRITE.      {. 
27b80 20 20 20 20 20 20 20 69 6e 74 20 69 44 63 20 3d         int iDc =
27b90 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65   sqlite3OsDevice
27ba0 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
27bb0 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20  pPager->fd);.   
27bc0 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20       int ii;.   
27bd0 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49       assert(SQLI
27be0 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35  TE_IOCAP_ATOMIC5
27bf0 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20  12==(512>>8));. 
27c00 20 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51         assert(SQ
27c10 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
27c20 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29  C64K==(65536>>8)
27c30 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
27c40 74 28 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46  t(SQLITE_MAX_DEF
27c50 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d  AULT_PAGE_SIZE<=
27c60 36 35 35 33 36 29 3b 0a 20 20 20 20 20 20 20 20  65536);.        
27c70 66 6f 72 28 69 69 3d 73 7a 50 61 67 65 44 66 6c  for(ii=szPageDfl
27c80 74 3b 20 69 69 3c 3d 53 51 4c 49 54 45 5f 4d 41  t; ii<=SQLITE_MA
27c90 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  X_DEFAULT_PAGE_S
27ca0 49 5a 45 3b 20 69 69 3d 69 69 2a 32 29 7b 0a 20  IZE; ii=ii*2){. 
27cb0 20 20 20 20 20 20 20 20 20 69 66 28 20 69 44 63           if( iDc
27cc0 26 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  &(SQLITE_IOCAP_A
27cd0 54 4f 4d 49 43 7c 28 69 69 3e 3e 38 29 29 20 29  TOMIC|(ii>>8)) )
27ce0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 7a  {.            sz
27cf0 50 61 67 65 44 66 6c 74 20 3d 20 69 69 3b 0a 20  PageDflt = ii;. 
27d00 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
27d10 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e     }.      }.#en
27d20 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  dif.    }.  }els
27d30 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 74  e{.    /* If a t
27d40 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73  emporary file is
27d50 20 72 65 71 75 65 73 74 65 64 2c 20 69 74 20 69   requested, it i
27d60 73 20 6e 6f 74 20 6f 70 65 6e 65 64 20 69 6d 6d  s not opened imm
27d70 65 64 69 61 74 65 6c 79 2e 0a 20 20 20 20 2a 2a  ediately..    **
27d80 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 77 65   In this case we
27d90 20 61 63 63 65 70 74 20 74 68 65 20 64 65 66 61   accept the defa
27da0 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 61 6e  ult page size an
27db0 64 20 64 65 6c 61 79 20 61 63 74 75 61 6c 6c 79  d delay actually
27dc0 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 69 6e 67 20  .    ** opening 
27dd0 74 68 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 74  the file until t
27de0 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f  he first call to
27df0 20 4f 73 57 72 69 74 65 28 29 2e 0a 20 20 20 20   OsWrite()..    
27e00 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 62  **.    ** This b
27e10 72 61 6e 63 68 20 69 73 20 61 6c 73 6f 20 72 75  ranch is also ru
27e20 6e 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f  n for an in-memo
27e30 72 79 20 64 61 74 61 62 61 73 65 2e 20 41 6e 20  ry database. An 
27e40 69 6e 2d 6d 65 6d 6f 72 79 0a 20 20 20 20 2a 2a  in-memory.    **
27e50 20 64 61 74 61 62 61 73 65 20 69 73 20 74 68 65   database is the
27e60 20 73 61 6d 65 20 61 73 20 61 20 74 65 6d 70 2d   same as a temp-
27e70 66 69 6c 65 20 74 68 61 74 20 69 73 20 6e 65 76  file that is nev
27e80 65 72 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74  er written out t
27e90 6f 0a 20 20 20 20 2a 2a 20 64 69 73 6b 20 61 6e  o.    ** disk an
27ea0 64 20 75 73 65 73 20 61 6e 20 69 6e 2d 6d 65 6d  d uses an in-mem
27eb0 6f 72 79 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  ory rollback jou
27ec0 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 20 0a 20 20  rnal..    */ .  
27ed0 20 20 74 65 6d 70 46 69 6c 65 20 3d 20 31 3b 0a    tempFile = 1;.
27ee0 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61      pPager->eSta
27ef0 74 65 20 3d 20 50 41 47 45 52 5f 52 45 41 44 45  te = PAGER_READE
27f00 52 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  R;.    pPager->e
27f10 4c 6f 63 6b 20 3d 20 45 58 43 4c 55 53 49 56 45  Lock = EXCLUSIVE
27f20 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 65 61 64 4f  _LOCK;.    readO
27f30 6e 6c 79 20 3d 20 28 76 66 73 46 6c 61 67 73 26  nly = (vfsFlags&
27f40 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
27f50 4f 4e 4c 59 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ONLY);.  }..  /*
27f60 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
27f70 61 6c 6c 20 74 6f 20 50 61 67 65 72 53 65 74 50  all to PagerSetP
27f80 61 67 65 73 69 7a 65 28 29 20 73 65 72 76 65 73  agesize() serves
27f90 20 74 6f 20 73 65 74 20 74 68 65 20 76 61 6c 75   to set the valu
27fa0 65 20 6f 66 20 0a 20 20 2a 2a 20 50 61 67 65 72  e of .  ** Pager
27fb0 2e 70 61 67 65 53 69 7a 65 20 61 6e 64 20 74 6f  .pageSize and to
27fc0 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 50 61   allocate the Pa
27fd0 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20 62 75  ger.pTmpSpace bu
27fe0 66 66 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ffer..  */.  if(
27ff0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
28000 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
28010 61 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 29  ager->memDb==0 )
28020 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
28030 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69  e3PagerSetPagesi
28040 7a 65 28 70 50 61 67 65 72 2c 20 26 73 7a 50 61  ze(pPager, &szPa
28050 67 65 44 66 6c 74 2c 20 2d 31 29 3b 0a 20 20 20  geDflt, -1);.   
28060 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53   testcase( rc!=S
28070 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a  QLITE_OK );.  }.
28080 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f  .  /* If an erro
28090 72 20 6f 63 63 75 72 72 65 64 20 69 6e 20 65 69  r occurred in ei
280a0 74 68 65 72 20 6f 66 20 74 68 65 20 62 6c 6f 63  ther of the bloc
280b0 6b 73 20 61 62 6f 76 65 2c 20 66 72 65 65 20 74  ks above, free t
280c0 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 20 73  he .  ** Pager s
280d0 74 72 75 63 74 75 72 65 20 61 6e 64 20 63 6c 6f  tructure and clo
280e0 73 65 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a  se the file..  *
280f0 2f 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  /.  if( rc!=SQLI
28100 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
28110 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 70 54  ert( !pPager->pT
28120 6d 70 53 70 61 63 65 20 29 3b 0a 20 20 20 20 73  mpSpace );.    s
28130 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
28140 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 73  ager->fd);.    s
28150 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67  qlite3_free(pPag
28160 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  er);.    return 
28170 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e  rc;.  }..  /* In
28180 69 74 69 61 6c 69 7a 65 20 74 68 65 20 50 43 61  itialize the PCa
28190 63 68 65 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20  che object. */. 
281a0 20 61 73 73 65 72 74 28 20 6e 45 78 74 72 61 3c   assert( nExtra<
281b0 31 30 30 30 20 29 3b 0a 20 20 6e 45 78 74 72 61  1000 );.  nExtra
281c0 20 3d 20 52 4f 55 4e 44 38 28 6e 45 78 74 72 61   = ROUND8(nExtra
281d0 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  );.  sqlite3Pcac
281e0 68 65 4f 70 65 6e 28 73 7a 50 61 67 65 44 66 6c  heOpen(szPageDfl
281f0 74 2c 20 6e 45 78 74 72 61 2c 20 21 6d 65 6d 44  t, nExtra, !memD
28200 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
28210 20 20 20 20 20 20 20 21 6d 65 6d 44 62 3f 70 61         !memDb?pa
28220 67 65 72 53 74 72 65 73 73 3a 30 2c 20 28 76 6f  gerStress:0, (vo
28230 69 64 20 2a 29 70 50 61 67 65 72 2c 20 70 50 61  id *)pPager, pPa
28240 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 0a  ger->pPCache);..
28250 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 4f    PAGERTRACE(("O
28260 50 45 4e 20 25 64 20 25 73 5c 6e 22 2c 20 46 49  PEN %d %s\n", FI
28270 4c 45 48 41 4e 44 4c 45 49 44 28 70 50 61 67 65  LEHANDLEID(pPage
28280 72 2d 3e 66 64 29 2c 20 70 50 61 67 65 72 2d 3e  r->fd), pPager->
28290 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 49  zFilename));.  I
282a0 4f 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25 70  OTRACE(("OPEN %p
282b0 20 25 73 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %s\n", pPager, 
282c0 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
282d0 65 29 29 0a 0a 20 20 70 50 61 67 65 72 2d 3e 75  e))..  pPager->u
282e0 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 75 38 29  seJournal = (u8)
282f0 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20 70 50  useJournal;.  pP
28300 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b  ager->noReadlock
28310 20 3d 20 28 6e 6f 52 65 61 64 6c 6f 63 6b 20 26   = (noReadlock &
28320 26 20 72 65 61 64 4f 6e 6c 79 29 20 3f 31 3a 30  & readOnly) ?1:0
28330 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  ;.  /* pPager->s
28340 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a  tmtOpen = 0; */.
28350 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d    /* pPager->stm
28360 74 49 6e 55 73 65 20 3d 20 30 3b 20 2a 2f 0a 20  tInUse = 0; */. 
28370 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 52 65 66   /* pPager->nRef
28380 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
28390 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d  ager->stmtSize =
283a0 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
283b0 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20  er->stmtJSize = 
283c0 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
283d0 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 20 2a 2f  r->nPage = 0; */
283e0 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e  .  pPager->mxPgn
283f0 6f 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50  o = SQLITE_MAX_P
28400 41 47 45 5f 43 4f 55 4e 54 3b 0a 20 20 2f 2a 20  AGE_COUNT;.  /* 
28410 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
28420 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f  PAGER_UNLOCK; */
28430 0a 23 69 66 20 30 0a 20 20 61 73 73 65 72 74 28  .#if 0.  assert(
28440 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
28450 3d 20 28 74 65 6d 70 46 69 6c 65 20 3f 20 50 41  = (tempFile ? PA
28460 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 3a 20  GER_EXCLUSIVE : 
28470 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 29 20 29 3b  PAGER_UNLOCK) );
28480 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 70 50 61  .#endif.  /* pPa
28490 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30  ger->errMask = 0
284a0 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 74  ; */.  pPager->t
284b0 65 6d 70 46 69 6c 65 20 3d 20 28 75 38 29 74 65  empFile = (u8)te
284c0 6d 70 46 69 6c 65 3b 0a 20 20 61 73 73 65 72 74  mpFile;.  assert
284d0 28 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45  ( tempFile==PAGE
284e0 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f  R_LOCKINGMODE_NO
284f0 52 4d 41 4c 20 0a 20 20 20 20 20 20 20 20 20 20  RMAL .          
28500 7c 7c 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47  || tempFile==PAG
28510 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45  ER_LOCKINGMODE_E
28520 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20 61 73  XCLUSIVE );.  as
28530 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b  sert( PAGER_LOCK
28540 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56  INGMODE_EXCLUSIV
28550 45 3d 3d 31 20 29 3b 0a 20 20 70 50 61 67 65 72  E==1 );.  pPager
28560 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
28570 3d 20 28 75 38 29 74 65 6d 70 46 69 6c 65 3b 20  = (u8)tempFile; 
28580 0a 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67  .  pPager->chang
28590 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61  eCountDone = pPa
285a0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20  ger->tempFile;. 
285b0 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3d   pPager->memDb =
285c0 20 28 75 38 29 6d 65 6d 44 62 3b 0a 20 20 70 50   (u8)memDb;.  pP
285d0 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d  ager->readOnly =
285e0 20 28 75 38 29 72 65 61 64 4f 6e 6c 79 3b 0a 20   (u8)readOnly;. 
285f0 20 61 73 73 65 72 74 28 20 75 73 65 4a 6f 75 72   assert( useJour
28600 6e 61 6c 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74  nal || pPager->t
28610 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 70 50 61  empFile );.  pPa
28620 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50  ger->noSync = pP
28630 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a  ager->tempFile;.
28640 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79    pPager->fullSy
28650 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e 6e 6f 53  nc = pPager->noS
28660 79 6e 63 20 3f 30 3a 31 3b 0a 20 20 70 50 61 67  ync ?0:1;.  pPag
28670 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 20 3d  er->sync_flags =
28680 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
28690 4d 41 4c 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72  MAL;.  /* pPager
286a0 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 20 2a 2f  ->pFirst = 0; */
286b0 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46  .  /* pPager->pF
286c0 69 72 73 74 53 79 6e 63 65 64 20 3d 20 30 3b 20  irstSynced = 0; 
286d0 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
286e0 70 4c 61 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20  pLast = 0; */.  
286f0 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 20 3d  pPager->nExtra =
28700 20 28 75 31 36 29 6e 45 78 74 72 61 3b 0a 20 20   (u16)nExtra;.  
28710 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
28720 69 7a 65 4c 69 6d 69 74 20 3d 20 53 51 4c 49 54  izeLimit = SQLIT
28730 45 5f 44 45 46 41 55 4c 54 5f 4a 4f 55 52 4e 41  E_DEFAULT_JOURNA
28740 4c 5f 53 49 5a 45 5f 4c 49 4d 49 54 3b 0a 20 20  L_SIZE_LIMIT;.  
28750 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
28760 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 74 65  Pager->fd) || te
28770 6d 70 46 69 6c 65 20 29 3b 0a 20 20 73 65 74 53  mpFile );.  setS
28780 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72  ectorSize(pPager
28790 29 3b 0a 20 20 69 66 28 20 21 75 73 65 4a 6f 75  );.  if( !useJou
287a0 72 6e 61 6c 20 29 7b 0a 20 20 20 20 70 50 61 67  rnal ){.    pPag
287b0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20  er->journalMode 
287c0 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  = PAGER_JOURNALM
287d0 4f 44 45 5f 4f 46 46 3b 0a 20 20 7d 65 6c 73 65  ODE_OFF;.  }else
287e0 20 69 66 28 20 6d 65 6d 44 62 20 29 7b 0a 20 20   if( memDb ){.  
287f0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
28800 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f  lMode = PAGER_JO
28810 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
28820 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50 61 67 65  ;.  }.  /* pPage
28830 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 20  r->xBusyHandler 
28840 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
28850 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65  ger->pBusyHandle
28860 72 41 72 67 20 3d 20 30 3b 20 2a 2f 0a 20 20 70  rArg = 0; */.  p
28870 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72  Pager->xReiniter
28880 20 3d 20 78 52 65 69 6e 69 74 3b 0a 20 20 2f 2a   = xReinit;.  /*
28890 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e   memset(pPager->
288a0 61 48 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66  aHash, 0, sizeof
288b0 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29 29  (pPager->aHash))
288c0 3b 20 2a 2f 0a 0a 20 20 2a 70 70 50 61 67 65 72  ; */..  *ppPager
288d0 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 72 65 74   = pPager;.  ret
288e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
288f0 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  ..../*.** This f
28900 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
28910 64 20 61 66 74 65 72 20 74 72 61 6e 73 69 74 69  d after transiti
28920 6f 6e 69 6e 67 20 66 72 6f 6d 20 50 41 47 45 52  oning from PAGER
28930 5f 55 4e 4c 4f 43 4b 20 74 6f 0a 2a 2a 20 50 41  _UNLOCK to.** PA
28940 47 45 52 5f 53 48 41 52 45 44 20 73 74 61 74 65  GER_SHARED state
28950 2e 20 49 74 20 74 65 73 74 73 20 69 66 20 74 68  . It tests if th
28960 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a 6f 75  ere is a hot jou
28970 72 6e 61 6c 20 70 72 65 73 65 6e 74 20 69 6e 0a  rnal present in.
28980 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  ** the file-syst
28990 65 6d 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  em for the given
289a0 20 70 61 67 65 72 2e 20 41 20 68 6f 74 20 6a 6f   pager. A hot jo
289b0 75 72 6e 61 6c 20 69 73 20 6f 6e 65 20 74 68 61  urnal is one tha
289c0 74 20 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20 62  t .** needs to b
289d0 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 41  e played back. A
289e0 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 69 73  ccording to this
289f0 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 68 6f 74   function, a hot
28a00 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65  -journal.** file
28a10 20 65 78 69 73 74 73 20 69 66 20 74 68 65 20 66   exists if the f
28a20 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65 72 69  ollowing criteri
28a30 61 20 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a  a are met:.**.**
28a40 20 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c     * The journal
28a50 20 66 69 6c 65 20 65 78 69 73 74 73 20 69 6e 20   file exists in 
28a60 74 68 65 20 66 69 6c 65 20 73 79 73 74 65 6d 2c  the file system,
28a70 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 4e 6f 20 70   and.**   * No p
28a80 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 61 20 52  rocess holds a R
28a90 45 53 45 52 56 45 44 20 6f 72 20 67 72 65 61 74  ESERVED or great
28aa0 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  er lock on the d
28ab0 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 61 6e  atabase file, an
28ac0 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 64 61 74  d.**   * The dat
28ad0 61 62 61 73 65 20 66 69 6c 65 20 69 74 73 65 6c  abase file itsel
28ae0 66 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  f is greater tha
28af0 6e 20 30 20 62 79 74 65 73 20 69 6e 20 73 69 7a  n 0 bytes in siz
28b00 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68  e, and.**   * Th
28b10 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20  e first byte of 
28b20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
28b30 20 65 78 69 73 74 73 20 61 6e 64 20 69 73 20 6e   exists and is n
28b40 6f 74 20 30 78 30 30 2e 0a 2a 2a 0a 2a 2a 20 49  ot 0x00..**.** I
28b50 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69  f the current si
28b60 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
28b70 73 65 20 66 69 6c 65 20 69 73 20 30 20 62 75 74  se file is 0 but
28b80 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a   a journal file.
28b90 2a 2a 20 65 78 69 73 74 73 2c 20 74 68 61 74 20  ** exists, that 
28ba0 69 73 20 70 72 6f 62 61 62 6c 79 20 61 6e 20 6f  is probably an o
28bb0 6c 64 20 6a 6f 75 72 6e 61 6c 20 6c 65 66 74 20  ld journal left 
28bc0 6f 76 65 72 20 66 72 6f 6d 20 61 20 70 72 69 6f  over from a prio
28bd0 72 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 77 69  r.** database wi
28be0 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  th the same name
28bf0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
28c00 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
28c10 69 73 0a 2a 2a 20 6a 75 73 74 20 64 65 6c 65 74  is.** just delet
28c20 65 64 20 75 73 69 6e 67 20 4f 73 44 65 6c 65 74  ed using OsDelet
28c30 65 2c 20 2a 70 45 78 69 73 74 73 20 69 73 20 73  e, *pExists is s
28c40 65 74 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49  et to 0 and SQLI
28c50 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75  TE_OK.** is retu
28c60 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  rned..**.** This
28c70 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f   routine does no
28c80 74 20 63 68 65 63 6b 20 69 66 20 74 68 65 72 65  t check if there
28c90 20 69 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   is a master jou
28ca0 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 0a 2a 2a  rnal filename.**
28cb0 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
28cc0 68 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72  he file. If ther
28cd0 65 20 69 73 2c 20 61 6e 64 20 74 68 61 74 20 6d  e is, and that m
28ce0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
28cf0 6c 65 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 65  le.** does not e
28d00 78 69 73 74 2c 20 74 68 65 6e 20 74 68 65 20 6a  xist, then the j
28d10 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e  ournal file is n
28d20 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74 2e 20 49  ot really hot. I
28d30 6e 20 74 68 69 73 0a 2a 2a 20 63 61 73 65 20 74  n this.** case t
28d40 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
28d50 20 72 65 74 75 72 6e 20 61 20 66 61 6c 73 65 2d   return a false-
28d60 70 6f 73 69 74 69 76 65 2e 20 54 68 65 20 70 61  positive. The pa
28d70 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 0a 2a  ger_playback().*
28d80 2a 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64  * routine will d
28d90 69 73 63 6f 76 65 72 20 74 68 61 74 20 74 68 65  iscover that the
28da0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
28db0 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74 20   not really hot 
28dc0 61 6e 64 20 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74  and .** will not
28dd0 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 0a   roll it back. .
28de0 2a 2a 0a 2a 2a 20 49 66 20 61 20 68 6f 74 2d 6a  **.** If a hot-j
28df0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 66  ournal file is f
28e00 6f 75 6e 64 20 74 6f 20 65 78 69 73 74 2c 20 2a  ound to exist, *
28e10 70 45 78 69 73 74 73 20 69 73 20 73 65 74 20 74  pExists is set t
28e20 6f 20 31 20 61 6e 64 20 0a 2a 2a 20 53 51 4c 49  o 1 and .** SQLI
28e30 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20  TE_OK returned. 
28e40 49 66 20 6e 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61  If no hot-journa
28e50 6c 20 66 69 6c 65 20 69 73 20 70 72 65 73 65 6e  l file is presen
28e60 74 2c 20 2a 70 45 78 69 73 74 73 20 69 73 0a 2a  t, *pExists is.*
28e70 2a 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53  * set to 0 and S
28e80 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
28e90 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  d. If an IO erro
28ea0 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74  r occurs while t
28eb0 72 79 69 6e 67 0a 2a 2a 20 74 6f 20 64 65 74 65  rying.** to dete
28ec0 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72  rmine whether or
28ed0 20 6e 6f 74 20 61 20 68 6f 74 2d 6a 6f 75 72 6e   not a hot-journ
28ee0 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20  al file exists, 
28ef0 74 68 65 20 49 4f 20 65 72 72 6f 72 0a 2a 2a 20  the IO error.** 
28f00 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
28f10 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20 6f   and the value o
28f20 66 20 2a 70 45 78 69 73 74 73 20 69 73 20 75 6e  f *pExists is un
28f30 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  defined..*/.stat
28f40 69 63 20 69 6e 74 20 68 61 73 48 6f 74 4a 6f 75  ic int hasHotJou
28f50 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
28f60 65 72 2c 20 69 6e 74 20 2a 70 45 78 69 73 74 73  er, int *pExists
28f70 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ){.  sqlite3_vfs
28f80 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20   * const pVfs = 
28f90 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20  pPager->pVfs;.  
28fa0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
28fb0 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  OK;           /*
28fc0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
28fd0 20 20 69 6e 74 20 65 78 69 73 74 73 20 3d 20 31    int exists = 1
28fe0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
28ff0 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6a 6f 75  /* True if a jou
29000 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 70 72 65  rnal file is pre
29010 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6a 72  sent */.  int jr
29020 6e 6c 4f 70 65 6e 20 3d 20 21 21 69 73 4f 70 65  nlOpen = !!isOpe
29030 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  n(pPager->jfd);.
29040 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
29050 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b  r->useJournal );
29060 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
29070 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b  n(pPager->fd) );
29080 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
29090 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
290a0 5f 4e 4f 4e 45 20 29 3b 0a 0a 20 20 61 73 73 65  _NONE );..  asse
290b0 72 74 28 20 6a 72 6e 6c 4f 70 65 6e 3d 3d 30 20  rt( jrnlOpen==0 
290c0 7c 7c 20 28 20 73 71 6c 69 74 65 33 4f 73 44 65  || ( sqlite3OsDe
290d0 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
290e0 69 63 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ics(pPager->jfd)
290f0 20 26 0a 20 20 20 20 53 51 4c 49 54 45 5f 49 4f   &.    SQLITE_IO
29100 43 41 50 5f 55 4e 44 45 4c 45 54 41 42 4c 45 5f  CAP_UNDELETABLE_
29110 57 48 45 4e 5f 4f 50 45 4e 0a 20 20 29 29 3b 0a  WHEN_OPEN.  ));.
29120 0a 20 20 2a 70 45 78 69 73 74 73 20 3d 20 30 3b  .  *pExists = 0;
29130 0a 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e  .  if( !jrnlOpen
29140 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
29150 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66  ite3OsAccess(pVf
29160 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
29170 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45  nal, SQLITE_ACCE
29180 53 53 5f 45 58 49 53 54 53 2c 20 26 65 78 69 73  SS_EXISTS, &exis
29190 74 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  ts);.  }.  if( r
291a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
291b0 65 78 69 73 74 73 20 29 7b 0a 20 20 20 20 69 6e  exists ){.    in
291c0 74 20 6c 6f 63 6b 65 64 3b 20 20 20 20 20 20 20  t locked;       
291d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
291e0 65 20 69 66 20 73 6f 6d 65 20 70 72 6f 63 65 73  e if some proces
291f0 73 20 68 6f 6c 64 73 20 61 20 52 45 53 45 52 56  s holds a RESERV
29200 45 44 20 6c 6f 63 6b 20 2a 2f 0a 0a 20 20 20 20  ED lock */..    
29210 2f 2a 20 52 61 63 65 20 63 6f 6e 64 69 74 69 6f  /* Race conditio
29220 6e 20 68 65 72 65 3a 20 20 41 6e 6f 74 68 65 72  n here:  Another
29230 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20 68   process might h
29240 61 76 65 20 62 65 65 6e 20 68 6f 6c 64 69 6e 67  ave been holding
29250 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 68 65 20   the.    ** the 
29260 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 61 6e  RESERVED lock an
29270 64 20 68 61 76 65 20 61 20 6a 6f 75 72 6e 61 6c  d have a journal
29280 20 6f 70 65 6e 20 61 74 20 74 68 65 20 73 71 6c   open at the sql
29290 69 74 65 33 4f 73 41 63 63 65 73 73 28 29 20 0a  ite3OsAccess() .
292a0 20 20 20 20 2a 2a 20 63 61 6c 6c 20 61 62 6f 76      ** call abov
292b0 65 2c 20 62 75 74 20 74 68 65 6e 20 64 65 6c 65  e, but then dele
292c0 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61  te the journal a
292d0 6e 64 20 64 72 6f 70 20 74 68 65 20 6c 6f 63 6b  nd drop the lock
292e0 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 77   before.    ** w
292f0 65 20 67 65 74 20 74 6f 20 74 68 65 20 66 6f 6c  e get to the fol
29300 6c 6f 77 69 6e 67 20 73 71 6c 69 74 65 33 4f 73  lowing sqlite3Os
29310 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
29320 6b 28 29 20 63 61 6c 6c 2e 20 20 49 66 20 74 68  k() call.  If th
29330 61 74 0a 20 20 20 20 2a 2a 20 69 73 20 74 68 65  at.    ** is the
29340 20 63 61 73 65 2c 20 74 68 69 73 20 72 6f 75 74   case, this rout
29350 69 6e 65 20 6d 69 67 68 74 20 74 68 69 6e 6b 20  ine might think 
29360 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a  there is a hot j
29370 6f 75 72 6e 61 6c 20 77 68 65 6e 0a 20 20 20 20  ournal when.    
29380 2a 2a 20 69 6e 20 66 61 63 74 20 74 68 65 72 65  ** in fact there
29390 20 69 73 20 6e 6f 6e 65 2e 20 20 54 68 69 73 20   is none.  This 
293a0 72 65 73 75 6c 74 73 20 69 6e 20 61 20 66 61 6c  results in a fal
293b0 73 65 2d 70 6f 73 69 74 69 76 65 20 77 68 69 63  se-positive whic
293c0 68 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65  h will.    ** be
293d0 20 64 65 61 6c 74 20 77 69 74 68 20 62 79 20 74   dealt with by t
293e0 68 65 20 70 6c 61 79 62 61 63 6b 20 72 6f 75 74  he playback rout
293f0 69 6e 65 2e 20 20 54 69 63 6b 65 74 20 23 33 38  ine.  Ticket #38
29400 38 33 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  83..    */.    r
29410 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 43 68 65  c = sqlite3OsChe
29420 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 70  ckReservedLock(p
29430 50 61 67 65 72 2d 3e 66 64 2c 20 26 6c 6f 63 6b  Pager->fd, &lock
29440 65 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ed);.    if( rc=
29450 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 6c  =SQLITE_OK && !l
29460 6f 63 6b 65 64 20 29 7b 0a 20 20 20 20 20 20 50  ocked ){.      P
29470 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20 20 20  gno nPage;      
29480 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
29490 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
294a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
294b0 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63  /..      /* Chec
294c0 6b 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  k the size of th
294d0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
294e0 20 49 66 20 69 74 20 63 6f 6e 73 69 73 74 73 20   If it consists 
294f0 6f 66 20 30 20 70 61 67 65 73 2c 0a 20 20 20 20  of 0 pages,.    
29500 20 20 2a 2a 20 74 68 65 6e 20 64 65 6c 65 74 65    ** then delete
29510 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
29520 65 2e 20 53 65 65 20 74 68 65 20 68 65 61 64 65  e. See the heade
29530 72 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20  r comment above 
29540 66 6f 72 20 0a 20 20 20 20 20 20 2a 2a 20 74 68  for .      ** th
29550 65 20 72 65 61 73 6f 6e 69 6e 67 20 68 65 72 65  e reasoning here
29560 2e 20 20 44 65 6c 65 74 65 20 74 68 65 20 6f 62  .  Delete the ob
29570 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66  solete journal f
29580 69 6c 65 20 75 6e 64 65 72 0a 20 20 20 20 20 20  ile under.      
29590 2a 2a 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  ** a RESERVED lo
295a0 63 6b 20 74 6f 20 61 76 6f 69 64 20 72 61 63 65  ck to avoid race
295b0 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 6e 64 20   conditions and 
295c0 74 6f 20 61 76 6f 69 64 20 76 69 6f 6c 61 74 69  to avoid violati
295d0 6e 67 0a 20 20 20 20 20 20 2a 2a 20 5b 48 33 33  ng.      ** [H33
295e0 30 32 30 5d 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  020]..      */. 
295f0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 50       rc = pagerP
29600 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c  agecount(pPager,
29610 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20   &nPage);.      
29620 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
29630 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  K ){.        if(
29640 20 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20   nPage==0 ){.   
29650 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65         sqlite3Be
29660 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
29670 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
29680 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70   sqlite3OsLock(p
29690 50 61 67 65 72 2d 3e 66 64 2c 20 52 45 53 45 52  Pager->fd, RESER
296a0 56 45 44 5f 4c 4f 43 4b 29 3d 3d 53 51 4c 49 54  VED_LOCK)==SQLIT
296b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
296c0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c      sqlite3OsDel
296d0 65 74 65 28 70 56 66 73 2c 20 70 50 61 67 65 72  ete(pVfs, pPager
296e0 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a  ->zJournal, 0);.
296f0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
29700 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61 67  te3OsUnlock(pPag
29710 65 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c  er->fd, SHARED_L
29720 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  OCK);.          
29730 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  }.          sqli
29740 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
29750 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  oc();.        }e
29760 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
29770 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
29780 6c 65 20 65 78 69 73 74 73 20 61 6e 64 20 6e 6f  le exists and no
29790 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
297a0 6e 20 68 61 73 20 61 20 72 65 73 65 72 76 65 64  n has a reserved
297b0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72  .          ** or
297c0 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e   greater lock on
297d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
297e0 6c 65 2e 20 4e 6f 77 20 63 68 65 63 6b 20 74 68  le. Now check th
297f0 61 74 20 74 68 65 72 65 20 69 73 0a 20 20 20 20  at there is.    
29800 20 20 20 20 20 20 2a 2a 20 61 74 20 6c 65 61 73        ** at leas
29810 74 20 6f 6e 65 20 6e 6f 6e 2d 7a 65 72 6f 20 62  t one non-zero b
29820 79 74 65 73 20 61 74 20 74 68 65 20 73 74 61 72  ytes at the star
29830 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
29840 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 20   file..         
29850 20 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 2c   ** If there is,
29860 20 74 68 65 6e 20 77 65 20 63 6f 6e 73 69 64 65   then we conside
29870 72 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 74  r this journal t
29880 6f 20 62 65 20 68 6f 74 2e 20 49 66 20 6e 6f 74  o be hot. If not
29890 2c 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  , .          ** 
298a0 69 74 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65  it can be ignore
298b0 64 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  d..          */.
298c0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 6a            if( !j
298d0 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20  rnlOpen ){.     
298e0 20 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20 53         int f = S
298f0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
29900 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  NLY|SQLITE_OPEN_
29910 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20  MAIN_JOURNAL;.  
29920 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
29930 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
29940 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
29950 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64  nal, pPager->jfd
29960 2c 20 66 2c 20 26 66 29 3b 0a 20 20 20 20 20 20  , f, &f);.      
29970 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
29980 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
29990 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
299a0 20 75 38 20 66 69 72 73 74 20 3d 20 30 3b 0a 20   u8 first = 0;. 
299b0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
299c0 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
299d0 61 67 65 72 2d 3e 6a 66 64 2c 20 28 76 6f 69 64  ager->jfd, (void
299e0 20 2a 29 26 66 69 72 73 74 2c 20 31 2c 20 30 29   *)&first, 1, 0)
299f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
29a00 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45  ( rc==SQLITE_IOE
29a10 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b  RR_SHORT_READ ){
29a20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
29a30 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
29a40 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
29a50 20 20 20 20 20 20 20 20 20 69 66 28 20 21 6a 72           if( !jr
29a60 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20  nlOpen ){.      
29a70 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
29a80 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a  sClose(pPager->j
29a90 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  fd);.           
29aa0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a   }.            *
29ab0 70 45 78 69 73 74 73 20 3d 20 28 66 69 72 73 74  pExists = (first
29ac0 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  !=0);.          
29ad0 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51  }else if( rc==SQ
29ae0 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 29 7b  LITE_CANTOPEN ){
29af0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
29b00 49 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 70 65  If we cannot ope
29b10 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  n the rollback j
29b20 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 6f  ournal file in o
29b30 72 64 65 72 20 74 6f 20 73 65 65 20 69 66 0a 20  rder to see if. 
29b40 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74             ** it
29b50 73 20 68 61 73 20 61 20 7a 65 72 6f 20 68 65 61  s has a zero hea
29b60 64 65 72 2c 20 74 68 61 74 20 6d 69 67 68 74 20  der, that might 
29b70 62 65 20 64 75 65 20 74 6f 20 61 6e 20 49 2f 4f  be due to an I/O
29b80 20 65 72 72 6f 72 2c 20 6f 72 0a 20 20 20 20 20   error, or.     
29b90 20 20 20 20 20 20 20 2a 2a 20 69 74 20 6d 69 67         ** it mig
29ba0 68 74 20 62 65 20 64 75 65 20 74 6f 20 74 68 65  ht be due to the
29bb0 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20   race condition 
29bc0 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 20  described above 
29bd0 61 6e 64 20 69 6e 0a 20 20 20 20 20 20 20 20 20  and in.         
29be0 20 20 20 2a 2a 20 74 69 63 6b 65 74 20 23 33 38     ** ticket #38
29bf0 38 33 2e 20 20 45 69 74 68 65 72 20 77 61 79 2c  83.  Either way,
29c00 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65   assume that the
29c10 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68 6f 74 2e   journal is hot.
29c20 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
29c30 54 68 69 73 20 6d 69 67 68 74 20 62 65 20 61 20  This might be a 
29c40 66 61 6c 73 65 20 70 6f 73 69 74 69 76 65 2e 20  false positive. 
29c50 20 42 75 74 20 69 66 20 69 74 20 69 73 2c 20 74   But if it is, t
29c60 68 65 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20  hen the.        
29c70 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63      ** automatic
29c80 20 6a 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61 63   journal playbac
29c90 6b 20 61 6e 64 20 72 65 63 6f 76 65 72 79 20 6d  k and recovery m
29ca0 65 63 68 61 6e 69 73 6d 20 77 69 6c 6c 20 64 65  echanism will de
29cb0 61 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  al.            *
29cc0 2a 20 77 69 74 68 20 69 74 20 75 6e 64 65 72 20  * with it under 
29cd0 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
29ce0 6b 20 77 68 65 72 65 20 77 65 20 64 6f 20 6e 6f  k where we do no
29cf0 74 20 6e 65 65 64 20 74 6f 0a 20 20 20 20 20 20  t need to.      
29d00 20 20 20 20 20 20 2a 2a 20 77 6f 72 72 79 20 73        ** worry s
29d10 6f 20 6d 75 63 68 20 77 69 74 68 20 72 61 63 65  o much with race
29d20 20 63 6f 6e 64 69 74 69 6f 6e 73 2e 0a 20 20 20   conditions..   
29d30 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
29d40 20 20 20 20 20 20 20 20 2a 70 45 78 69 73 74 73          *pExists
29d50 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
29d60 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
29d70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
29d80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
29d90 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
29da0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
29db0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
29dc0 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61  s called to obta
29dd0 69 6e 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  in a shared lock
29de0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
29df0 20 66 69 6c 65 2e 0a 2a 2a 20 49 74 20 69 73 20   file..** It is 
29e00 69 6c 6c 65 67 61 6c 20 74 6f 20 63 61 6c 6c 20  illegal to call 
29e10 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75  sqlite3PagerAcqu
29e20 69 72 65 28 29 20 75 6e 74 69 6c 20 61 66 74 65  ire() until afte
29e30 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  r this function.
29e40 2a 2a 20 68 61 73 20 62 65 65 6e 20 73 75 63 63  ** has been succ
29e50 65 73 73 66 75 6c 6c 79 20 63 61 6c 6c 65 64 2e  essfully called.
29e60 20 49 66 20 61 20 73 68 61 72 65 64 2d 6c 6f 63   If a shared-loc
29e70 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c  k is already hel
29e80 64 20 77 68 65 6e 0a 2a 2a 20 74 68 69 73 20 66  d when.** this f
29e90 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
29ea0 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70  d, it is a no-op
29eb0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ..**.** The foll
29ec0 6f 77 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73  owing operations
29ed0 20 61 72 65 20 61 6c 73 6f 20 70 65 72 66 6f 72   are also perfor
29ee0 6d 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  med by this func
29ef0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 31 29  tion..**.**   1)
29f00 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
29f10 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 50 41   currently in PA
29f20 47 45 52 5f 55 4e 4c 4f 43 4b 20 73 74 61 74 65  GER_UNLOCK state
29f30 20 28 6e 6f 20 6c 6f 63 6b 20 68 65 6c 64 0a 2a   (no lock held.*
29f40 2a 20 20 20 20 20 20 6f 6e 20 74 68 65 20 64 61  *      on the da
29f50 74 61 62 61 73 65 20 66 69 6c 65 29 2c 20 74 68  tabase file), th
29f60 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73  en an attempt is
29f70 20 6d 61 64 65 20 74 6f 20 6f 62 74 61 69 6e 20   made to obtain 
29f80 61 0a 2a 2a 20 20 20 20 20 20 53 48 41 52 45 44  a.**      SHARED
29f90 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
29fa0 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6d 6d 65  abase file. Imme
29fb0 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 6f 62  diately after ob
29fc0 74 61 69 6e 69 6e 67 0a 2a 2a 20 20 20 20 20 20  taining.**      
29fd0 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c  the SHARED lock,
29fe0 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
29ff0 20 69 73 20 63 68 65 63 6b 65 64 20 66 6f 72 20   is checked for 
2a000 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 0a 2a  a hot-journal,.*
2a010 2a 20 20 20 20 20 20 77 68 69 63 68 20 69 73 20  *      which is 
2a020 70 6c 61 79 65 64 20 62 61 63 6b 20 69 66 20 70  played back if p
2a030 72 65 73 65 6e 74 2e 20 46 6f 6c 6c 6f 77 69 6e  resent. Followin
2a040 67 20 61 6e 79 20 68 6f 74 2d 6a 6f 75 72 6e 61  g any hot-journa
2a050 6c 20 0a 2a 2a 20 20 20 20 20 20 72 6f 6c 6c 62  l .**      rollb
2a060 61 63 6b 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74  ack, the content
2a070 73 20 6f 66 20 74 68 65 20 63 61 63 68 65 20 61  s of the cache a
2a080 72 65 20 76 61 6c 69 64 61 74 65 64 20 62 79 20  re validated by 
2a090 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20  checking.**     
2a0a0 20 74 68 65 20 27 63 68 61 6e 67 65 2d 63 6f 75   the 'change-cou
2a0b0 6e 74 65 72 27 20 66 69 65 6c 64 20 6f 66 20 74  nter' field of t
2a0c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2a0d0 20 68 65 61 64 65 72 20 61 6e 64 0a 2a 2a 20 20   header and.**  
2a0e0 20 20 20 20 64 69 73 63 61 72 64 65 64 20 69 66      discarded if
2a0f0 20 74 68 65 79 20 61 72 65 20 66 6f 75 6e 64 20   they are found 
2a100 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 2e 0a 2a  to be invalid..*
2a110 2a 0a 2a 2a 20 20 20 32 29 20 49 66 20 74 68 65  *.**   2) If the
2a120 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e   pager is runnin
2a130 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 6d  g in exclusive-m
2a140 6f 64 65 2c 20 61 6e 64 20 74 68 65 72 65 20 61  ode, and there a
2a150 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20  re currently.** 
2a160 20 20 20 20 20 6e 6f 20 6f 75 74 73 74 61 6e 64       no outstand
2a170 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20 74  ing references t
2a180 6f 20 61 6e 79 20 70 61 67 65 73 2c 20 61 6e 64  o any pages, and
2a190 20 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72   is in the error
2a1a0 20 73 74 61 74 65 2c 0a 2a 2a 20 20 20 20 20 20   state,.**      
2a1b0 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20  then an attempt 
2a1c0 69 73 20 6d 61 64 65 20 74 6f 20 63 6c 65 61 72  is made to clear
2a1d0 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
2a1e0 20 62 79 20 64 69 73 63 61 72 64 69 6e 67 0a 2a   by discarding.*
2a1f0 2a 20 20 20 20 20 20 74 68 65 20 63 6f 6e 74 65  *      the conte
2a200 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 20  nts of the page 
2a210 63 61 63 68 65 20 61 6e 64 20 72 6f 6c 6c 69 6e  cache and rollin
2a220 67 20 62 61 63 6b 20 61 6e 79 20 6f 70 65 6e 20  g back any open 
2a230 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20  journal.**      
2a240 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  file..**.** If t
2a250 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 64 65 73  he operation des
2a260 63 72 69 62 65 64 20 62 79 20 28 32 29 20 61 62  cribed by (2) ab
2a270 6f 76 65 20 69 73 20 6e 6f 74 20 61 74 74 65 6d  ove is not attem
2a280 70 74 65 64 2c 20 61 6e 64 20 69 66 20 74 68 65  pted, and if the
2a290 0a 2a 2a 20 70 61 67 65 72 20 69 73 20 69 6e 20  .** pager is in 
2a2a0 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20 6f  an error state o
2a2b0 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45  ther than SQLITE
2a2c0 5f 46 55 4c 4c 20 77 68 65 6e 20 74 68 69 73 20  _FULL when this 
2a2d0 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 74 68  is called,.** th
2a2e0 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 65 72  e error state er
2a2f0 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
2a300 72 6e 65 64 2e 20 49 74 20 69 73 20 70 65 72 6d  rned. It is perm
2a310 69 74 74 65 64 20 74 6f 20 72 65 61 64 20 74 68  itted to read th
2a320 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 77 68  e.** database wh
2a330 65 6e 20 69 6e 20 53 51 4c 49 54 45 5f 46 55 4c  en in SQLITE_FUL
2a340 4c 20 65 72 72 6f 72 20 73 74 61 74 65 2e 0a 2a  L error state..*
2a350 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
2a360 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73  if everything is
2a370 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c   successful, SQL
2a380 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
2a390 65 64 2e 20 49 66 20 61 6e 0a 2a 2a 20 49 4f 20  ed. If an.** IO 
2a3a0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
2a3b0 6c 65 20 6c 6f 63 6b 69 6e 67 20 74 68 65 20 64  le locking the d
2a3c0 61 74 61 62 61 73 65 2c 20 63 68 65 63 6b 69 6e  atabase, checkin
2a3d0 67 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72  g for a hot-jour
2a3e0 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 6f 72 20 72  nal.** file or r
2a3f0 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f  olling back a jo
2a400 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20  urnal file, the 
2a410 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
2a420 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e   returned..*/.in
2a430 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 68  t sqlite3PagerSh
2a440 61 72 65 64 4c 6f 63 6b 28 50 61 67 65 72 20 2a  aredLock(Pager *
2a450 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
2a460 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
2a470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a480 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
2a490 20 20 69 6e 74 20 69 73 45 72 72 6f 72 52 65 73    int isErrorRes
2a4a0 65 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  et = 0;         
2a4b0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2a4c0 72 65 63 6f 76 65 72 69 6e 67 20 66 72 6f 6d 20  recovering from 
2a4d0 65 72 72 6f 72 20 73 74 61 74 65 20 2a 2f 0a 0a  error state */..
2a4e0 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e    /* This routin
2a4f0 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64  e is only called
2a500 20 66 72 6f 6d 20 62 2d 74 72 65 65 20 61 6e 64   from b-tree and
2a510 20 6f 6e 6c 79 20 77 68 65 6e 20 74 68 65 72 65   only when there
2a520 20 61 72 65 20 6e 6f 0a 20 20 2a 2a 20 6f 75 74   are no.  ** out
2a530 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 2e 20  standing pages. 
2a540 54 68 69 73 20 69 6d 70 6c 69 65 73 20 74 68 61  This implies tha
2a550 74 20 74 68 65 20 70 61 67 65 72 20 73 74 61 74  t the pager stat
2a560 65 20 73 68 6f 75 6c 64 20 65 69 74 68 65 72 0a  e should either.
2a570 20 20 2a 2a 20 62 65 20 4e 4f 4e 45 20 6f 72 20    ** be NONE or 
2a580 52 45 41 44 45 52 2e 20 52 45 41 44 45 52 20 69  READER. READER i
2a590 73 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65 20  s only possible 
2a5a0 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  if the pager is 
2a5b0 6f 72 20 77 61 73 20 69 6e 20 0a 20 20 2a 2a 20  or was in .  ** 
2a5c0 65 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73  exclusive access
2a5d0 20 6d 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 73   mode..  */.  as
2a5e0 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61  sert( sqlite3Pca
2a5f0 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
2a600 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20  er->pPCache)==0 
2a610 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
2a620 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
2a630 45 52 5f 4e 4f 4e 45 20 7c 7c 20 70 50 61 67 65  ER_NONE || pPage
2a640 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
2a650 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 61 73 73  _READER );.  ass
2a660 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
2a670 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
2a680 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 4d  );.  if( NEVER(M
2a690 45 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e  EMDB && pPager->
2a6a0 65 72 72 43 6f 64 65 29 20 29 7b 20 72 65 74 75  errCode) ){ retu
2a6b0 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  rn pPager->errCo
2a6c0 64 65 3b 20 7d 0a 0a 20 20 69 66 28 20 21 70 61  de; }..  if( !pa
2a6d0 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
2a6e0 29 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74  ) && pPager->eSt
2a6f0 61 74 65 3d 3d 50 41 47 45 52 5f 4e 4f 4e 45 20  ate==PAGER_NONE 
2a700 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76  ){.    sqlite3_v
2a710 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20  fs * const pVfs 
2a720 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a  = pPager->pVfs;.
2a730 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45  .    assert( !ME
2a740 4d 44 42 20 26 26 20 21 70 50 61 67 65 72 2d 3e  MDB && !pPager->
2a750 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20  tempFile );.    
2a760 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2a770 6e 6f 52 65 61 64 6c 6f 63 6b 3d 3d 30 20 7c 7c  noReadlock==0 ||
2a780 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c   pPager->readOnl
2a790 79 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 50  y );..    if( pP
2a7a0 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b  ager->noReadlock
2a7b0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
2a7c0 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f  = pager_wait_on_
2a7d0 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 53 48 41  lock(pPager, SHA
2a7e0 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  RED_LOCK);.     
2a7f0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2a800 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  OK ){.        as
2a810 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c  sert( pPager->eL
2a820 6f 63 6b 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ock==PAGER_UNLOC
2a830 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  K );.        got
2a840 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  o failed;.      
2a850 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
2a860 49 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  If a journal fil
2a870 65 20 65 78 69 73 74 73 2c 20 61 6e 64 20 74 68  e exists, and th
2a880 65 72 65 20 69 73 20 6e 6f 20 52 45 53 45 52 56  ere is no RESERV
2a890 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20  ED lock on the. 
2a8a0 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66     ** database f
2a8b0 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 65 69 74  ile, then it eit
2a8c0 68 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20  her needs to be 
2a8d0 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 72 20 64  played back or d
2a8e0 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  eleted..    */. 
2a8f0 20 20 20 69 66 28 20 21 69 73 45 72 72 6f 72 52     if( !isErrorR
2a900 65 73 65 74 20 29 7b 0a 20 20 20 20 20 20 72 63  eset ){.      rc
2a910 20 3d 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c   = hasHotJournal
2a920 28 70 50 61 67 65 72 2c 20 26 69 73 45 72 72 6f  (pPager, &isErro
2a930 72 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 69  rReset);.      i
2a940 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2a950 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
2a960 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d   failed;.      }
2a970 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
2a980 73 45 72 72 6f 72 52 65 73 65 74 20 29 7b 0a 20  sErrorReset ){. 
2a990 20 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 45       /* Get an E
2a9a0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
2a9b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2a9c0 6c 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e  le. At this poin
2a9d0 74 20 69 74 20 69 73 0a 20 20 20 20 20 20 2a 2a  t it is.      **
2a9e0 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20   important that 
2a9f0 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
2aa00 69 73 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20  is not obtained 
2aa10 6f 6e 20 74 68 65 20 77 61 79 20 74 6f 20 74 68  on the way to th
2aa20 65 0a 20 20 20 20 20 20 2a 2a 20 45 58 43 4c 55  e.      ** EXCLU
2aa30 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 69 74  SIVE lock. If it
2aa40 20 77 65 72 65 2c 20 61 6e 6f 74 68 65 72 20 70   were, another p
2aa50 72 6f 63 65 73 73 20 6d 69 67 68 74 20 6f 70 65  rocess might ope
2aa60 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64  n the.      ** d
2aa70 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 64 65  atabase file, de
2aa80 74 65 63 74 20 74 68 65 20 52 45 53 45 52 56 45  tect the RESERVE
2aa90 44 20 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e 63  D lock, and conc
2aaa0 6c 75 64 65 20 74 68 61 74 20 74 68 65 0a 20 20  lude that the.  
2aab0 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
2aac0 69 73 20 73 61 66 65 20 74 6f 20 72 65 61 64 20  is safe to read 
2aad0 77 68 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65  while this proce
2aae0 73 73 20 69 73 20 73 74 69 6c 6c 20 72 6f 6c 6c  ss is still roll
2aaf0 69 6e 67 20 74 68 65 20 0a 20 20 20 20 20 20 2a  ing the .      *
2ab00 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 61  * hot-journal ba
2ab10 63 6b 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20  ck..      ** .  
2ab20 20 20 20 20 2a 2a 20 42 65 63 61 75 73 65 20 74      ** Because t
2ab30 68 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  he intermediate 
2ab40 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73  RESERVED lock is
2ab50 20 6e 6f 74 20 72 65 71 75 65 73 74 65 64 2c 20   not requested, 
2ab60 61 6e 79 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68  any.      ** oth
2ab70 65 72 20 70 72 6f 63 65 73 73 20 61 74 74 65 6d  er process attem
2ab80 70 74 69 6e 67 20 74 6f 20 61 63 63 65 73 73 20  pting to access 
2ab90 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2aba0 65 20 77 69 6c 6c 20 67 65 74 20 74 6f 20 0a 20  e will get to . 
2abb0 20 20 20 20 20 2a 2a 20 74 68 69 73 20 70 6f 69       ** this poi
2abc0 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65 20 61  nt in the code a
2abd0 6e 64 20 66 61 69 6c 20 74 6f 20 6f 62 74 61 69  nd fail to obtai
2abe0 6e 20 69 74 73 20 6f 77 6e 20 45 58 43 4c 55 53  n its own EXCLUS
2abf0 49 56 45 20 6c 6f 63 6b 20 0a 20 20 20 20 20 20  IVE lock .      
2ac00 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ** on the databa
2ac10 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a  se file..      *
2ac20 2a 0a 20 20 20 20 20 20 2a 2a 20 55 6e 6c 65 73  *.      ** Unles
2ac30 73 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  s the pager is i
2ac40 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65  n locking_mode=e
2ac50 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74  xclusive mode, t
2ac60 68 65 20 6c 6f 63 6b 20 69 73 0a 20 20 20 20 20  he lock is.     
2ac70 20 2a 2a 20 64 6f 77 6e 67 72 61 64 65 64 20 74   ** downgraded t
2ac80 6f 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 62 65  o SHARED_LOCK be
2ac90 66 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74 69  fore this functi
2aca0 6f 6e 20 72 65 74 75 72 6e 73 2e 0a 20 20 20 20  on returns..    
2acb0 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20    */.      rc = 
2acc0 70 61 67 65 72 4c 6f 63 6b 28 70 50 61 67 65 72  pagerLock(pPager
2acd0 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  , EXCLUSIVE_LOCK
2ace0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
2acf0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2ad00 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65        goto faile
2ad10 64 3b 0a 20 20 20 20 20 20 7d 0a 20 0a 20 20 20  d;.      }. .   
2ad20 20 20 20 2f 2a 20 49 66 20 69 74 20 69 73 20 6e     /* If it is n
2ad30 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20  ot already open 
2ad40 61 6e 64 20 74 68 65 20 66 69 6c 65 20 65 78 69  and the file exi
2ad50 73 74 73 20 6f 6e 20 64 69 73 6b 2c 20 6f 70 65  sts on disk, ope
2ad60 6e 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  n the .      ** 
2ad70 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65 61 64  journal for read
2ad80 2f 77 72 69 74 65 20 61 63 63 65 73 73 2e 20 57  /write access. W
2ad90 72 69 74 65 20 61 63 63 65 73 73 20 69 73 20 72  rite access is r
2ada0 65 71 75 69 72 65 64 20 62 65 63 61 75 73 65 20  equired because 
2adb0 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 65 78 63  .      ** in exc
2adc0 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f  lusive-access mo
2add0 64 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  de the file desc
2ade0 72 69 70 74 6f 72 20 77 69 6c 6c 20 62 65 20 6b  riptor will be k
2adf0 65 70 74 20 6f 70 65 6e 20 0a 20 20 20 20 20 20  ept open .      
2ae00 2a 2a 20 61 6e 64 20 70 6f 73 73 69 62 6c 79 20  ** and possibly 
2ae10 75 73 65 64 20 66 6f 72 20 61 20 74 72 61 6e 73  used for a trans
2ae20 61 63 74 69 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e  action later on.
2ae30 20 41 6c 73 6f 2c 20 77 72 69 74 65 2d 61 63 63   Also, write-acc
2ae40 65 73 73 20 0a 20 20 20 20 20 20 2a 2a 20 69 73  ess .      ** is
2ae50 20 75 73 75 61 6c 6c 79 20 72 65 71 75 69 72 65   usually require
2ae60 64 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68  d to finalize th
2ae70 65 20 6a 6f 75 72 6e 61 6c 20 69 6e 20 6a 6f 75  e journal in jou
2ae80 72 6e 61 6c 5f 6d 6f 64 65 3d 70 65 72 73 69 73  rnal_mode=persis
2ae90 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65  t .      ** mode
2aea0 20 28 61 6e 64 20 61 6c 73 6f 20 66 6f 72 20 6a   (and also for j
2aeb0 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 74 72 75 6e  ournal_mode=trun
2aec0 63 61 74 65 20 6f 6e 20 73 6f 6d 65 20 73 79 73  cate on some sys
2aed0 74 65 6d 73 29 2e 0a 20 20 20 20 20 20 2a 2a 0a  tems)..      **.
2aee0 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20        ** If the 
2aef0 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74  journal does not
2af00 20 65 78 69 73 74 2c 20 69 74 20 75 73 75 61 6c   exist, it usual
2af10 6c 79 20 6d 65 61 6e 73 20 74 68 61 74 20 73 6f  ly means that so
2af20 6d 65 20 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68  me .      ** oth
2af30 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61  er connection ma
2af40 6e 61 67 65 64 20 74 6f 20 67 65 74 20 69 6e 20  naged to get in 
2af50 61 6e 64 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b  and roll it back
2af60 20 62 65 66 6f 72 65 20 0a 20 20 20 20 20 20 2a   before .      *
2af70 2a 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f  * this connectio
2af80 6e 20 6f 62 74 61 69 6e 65 64 20 74 68 65 20 65  n obtained the e
2af90 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 61 62  xclusive lock ab
2afa0 6f 76 65 2e 20 4f 72 2c 20 69 74 20 0a 20 20 20  ove. Or, it .   
2afb0 20 20 20 2a 2a 20 6d 61 79 20 6d 65 61 6e 20 74     ** may mean t
2afc0 68 61 74 20 74 68 65 20 70 61 67 65 72 20 77 61  hat the pager wa
2afd0 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 2d 73  s in the error-s
2afe0 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a 20  tate when this. 
2aff0 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e       ** function
2b000 20 77 61 73 20 63 61 6c 6c 65 64 20 61 6e 64 20   was called and 
2b010 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2b020 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e   does not exist.
2b030 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2b040 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67  if( !isOpen(pPag
2b050 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20  er->jfd) ){.    
2b060 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 20      int res;.   
2b070 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2b080 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 70  3OsAccess(pVfs,p
2b090 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
2b0a0 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
2b0b0 49 53 54 53 2c 26 72 65 73 29 3b 0a 20 20 20 20  ISTS,&res);.    
2b0c0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2b0d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2b0e0 20 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20     if( res ){.  
2b0f0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 66 6f            int fo
2b100 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ut = 0;.        
2b110 20 20 20 20 69 6e 74 20 66 20 3d 20 53 51 4c 49      int f = SQLI
2b120 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
2b130 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  E|SQLITE_OPEN_MA
2b140 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20  IN_JOURNAL;.    
2b150 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2b160 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
2b170 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  e );.           
2b180 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
2b190 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72  pen(pVfs, pPager
2b1a0 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67  ->zJournal, pPag
2b1b0 65 72 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 6f 75  er->jfd, f, &fou
2b1c0 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t);.            
2b1d0 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
2b1e0 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28  TE_OK || isOpen(
2b1f0 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a  pPager->jfd) );.
2b200 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2b210 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2b220 20 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50 45   fout&SQLITE_OPE
2b230 4e 5f 52 45 41 44 4f 4e 4c 59 20 29 7b 0a 20 20  N_READONLY ){.  
2b240 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
2b250 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
2b260 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20  _BKPT;.         
2b270 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
2b280 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ose(pPager->jfd)
2b290 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
2b2a0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2b2b0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2b2c0 20 20 20 20 69 66 28 20 72 63 21 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 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20   goto failed;.  
2b2f0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
2b300 52 65 73 65 74 20 74 68 65 20 6a 6f 75 72 6e 61  Reset the journa
2b310 6c 20 73 74 61 74 75 73 20 66 69 65 6c 64 73 20  l status fields 
2b320 74 6f 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  to indicates tha
2b330 74 20 77 65 20 68 61 76 65 20 6e 6f 0a 20 20 20  t we have no.   
2b340 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a     ** rollback j
2b350 6f 75 72 6e 61 6c 20 61 74 20 74 68 69 73 20 74  ournal at this t
2b360 69 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20 70 50  ime. */.      pP
2b370 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
2b380 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67   = 0;.      pPag
2b390 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20  er->setMaster = 
2b3a0 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  0;.      pPager-
2b3b0 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b  >journalHdr = 0;
2b3c0 0a 20 0a 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65  . .      /* Make
2b3d0 20 73 75 72 65 20 74 68 65 20 6a 6f 75 72 6e 61   sure the journa
2b3e0 6c 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20  l file has been 
2b3f0 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 20  synced to disk. 
2b400 2a 2f 0a 20 0a 20 20 20 20 20 20 2f 2a 20 50 6c  */. .      /* Pl
2b410 61 79 62 61 63 6b 20 61 6e 64 20 64 65 6c 65 74  ayback and delet
2b420 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  e the journal.  
2b430 44 72 6f 70 20 74 68 65 20 64 61 74 61 62 61 73  Drop the databas
2b440 65 20 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a  e write.      **
2b450 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61 63 71 75   lock and reacqu
2b460 69 72 65 20 74 68 65 20 72 65 61 64 20 6c 6f 63  ire the read loc
2b470 6b 2e 20 50 75 72 67 65 20 74 68 65 20 63 61 63  k. Purge the cac
2b480 68 65 20 62 65 66 6f 72 65 0a 20 20 20 20 20 20  he before.      
2b490 2a 2a 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20  ** playing back 
2b4a0 74 68 65 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  the hot-journal 
2b4b0 73 6f 20 74 68 61 74 20 77 65 20 64 6f 6e 27 74  so that we don't
2b4c0 20 65 6e 64 20 75 70 20 77 69 74 68 0a 20 20 20   end up with.   
2b4d0 20 20 20 2a 2a 20 61 6e 20 69 6e 63 6f 6e 73 69     ** an inconsi
2b4e0 73 74 65 6e 74 20 63 61 63 68 65 2e 20 20 53 79  stent cache.  Sy
2b4f0 6e 63 20 74 68 65 20 68 6f 74 20 6a 6f 75 72 6e  nc the hot journ
2b500 61 6c 20 62 65 66 6f 72 65 20 70 6c 61 79 69 6e  al before playin
2b510 67 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 62 61  g.      ** it ba
2b520 63 6b 20 73 69 6e 63 65 20 74 68 65 20 70 72 6f  ck since the pro
2b530 63 65 73 73 20 74 68 61 74 20 63 72 61 73 68 65  cess that crashe
2b540 64 20 61 6e 64 20 6c 65 66 74 20 74 68 65 20 68  d and left the h
2b550 6f 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20  ot journal.     
2b560 20 2a 2a 20 70 72 6f 62 61 62 6c 79 20 64 69 64   ** probably did
2b570 20 6e 6f 74 20 73 79 6e 63 20 69 74 20 61 6e 64   not sync it and
2b580 20 77 65 20 61 72 65 20 72 65 71 75 69 72 65 64   we are required
2b590 20 74 6f 20 61 6c 77 61 79 73 20 73 79 6e 63 0a   to always sync.
2b5a0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75        ** the jou
2b5b0 72 6e 61 6c 20 62 65 66 6f 72 65 20 70 6c 61 79  rnal before play
2b5c0 69 6e 67 20 69 74 20 62 61 63 6b 2e 0a 20 20 20  ing it back..   
2b5d0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45     **.      ** E
2b5e0 76 65 6e 20 69 66 20 61 6e 20 65 72 72 6f 72 20  ven if an error 
2b5f0 6f 63 63 75 72 73 20 77 68 69 6c 65 20 73 79 6e  occurs while syn
2b600 63 69 6e 67 20 6f 72 20 72 6f 6c 6c 69 6e 67 20  cing or rolling 
2b610 62 61 63 6b 20 74 68 65 20 0a 20 20 20 20 20 20  back the .      
2b620 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 20  ** hot-journal, 
2b630 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  there is no need
2b640 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20 45 52   to enter the ER
2b650 52 4f 52 20 73 74 61 74 65 20 68 65 72 65 2c 20  ROR state here, 
2b660 61 73 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  as.      ** the 
2b670 70 61 67 65 72 20 6e 65 76 65 72 20 6c 65 66 74  pager never left
2b680 20 73 74 61 74 65 20 4e 4f 4e 45 20 61 6e 79 68   state NONE anyh
2b690 6f 77 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ow..      */.   
2b6a0 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50     if( isOpen(pP
2b6b0 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20  ager->jfd) ){.  
2b6c0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
2b6d0 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 70  SyncHotJournal(p
2b6e0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
2b6f0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2b700 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  K ){.          a
2b710 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
2b720 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4e 4f 4e  State==PAGER_NON
2b730 45 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  E );.          p
2b740 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20  Pager->eState = 
2b750 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e  PAGER_WRITER_FIN
2b760 49 53 48 45 44 3b 0a 20 20 20 20 20 20 20 20 20  ISHED;.         
2b770 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
2b780 62 61 63 6b 28 70 50 61 67 65 72 2c 20 31 29 3b  back(pPager, 1);
2b790 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
2b7a0 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45  r->eState = PAGE
2b7b0 52 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20  R_NONE;.        
2b7c0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  }.        if( rc
2b7d0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2b7e0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61           goto fa
2b7f0 69 6c 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a  iled;.        }.
2b800 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2b810 20 20 20 20 20 6f 73 55 6e 6c 6f 63 6b 28 70 50       osUnlock(pP
2b820 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43  ager, SHARED_LOC
2b830 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  K);.      }..   
2b840 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2b850 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
2b860 5f 4e 4f 4e 45 20 29 3b 0a 20 20 20 20 20 20 61  _NONE );.      a
2b870 73 73 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e  ssert( (pPager->
2b880 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
2b890 43 4b 29 0a 20 20 20 20 20 20 20 20 20 20 20 7c  CK).           |
2b8a0 7c 20 28 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  | (pPager->exclu
2b8b0 73 69 76 65 4d 6f 64 65 20 26 26 20 70 50 61 67  siveMode && pPag
2b8c0 65 72 2d 3e 65 4c 6f 63 6b 3e 53 48 41 52 45 44  er->eLock>SHARED
2b8d0 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20 29 3b 0a  _LOCK).      );.
2b8e0 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70      }..    if( p
2b8f0 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 20 7c  Pager->pBackup |
2b900 7c 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 50  | sqlite3PcacheP
2b910 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2d  agecount(pPager-
2b920 3e 70 50 43 61 63 68 65 29 3e 30 20 29 7b 0a 20  >pPCache)>0 ){. 
2b930 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68 61 72       /* The shar
2b940 65 64 2d 6c 6f 63 6b 20 68 61 73 20 6a 75 73 74  ed-lock has just
2b950 20 62 65 65 6e 20 61 63 71 75 69 72 65 64 20 6f   been acquired o
2b960 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2b970 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64  ile.      ** and
2b980 20 74 68 65 72 65 20 61 72 65 20 61 6c 72 65 61   there are alrea
2b990 64 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  dy pages in the 
2b9a0 63 61 63 68 65 20 28 66 72 6f 6d 20 61 20 70 72  cache (from a pr
2b9b0 65 76 69 6f 75 73 0a 20 20 20 20 20 20 2a 2a 20  evious.      ** 
2b9c0 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72  read or write tr
2b9d0 61 6e 73 61 63 74 69 6f 6e 29 2e 20 20 43 68 65  ansaction).  Che
2b9e0 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
2b9f0 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 20   database.      
2ba00 2a 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69  ** has been modi
2ba10 66 69 65 64 2e 20 20 49 66 20 74 68 65 20 64 61  fied.  If the da
2ba20 74 61 62 61 73 65 20 68 61 73 20 63 68 61 6e 67  tabase has chang
2ba30 65 64 2c 20 66 6c 75 73 68 20 74 68 65 0a 20 20  ed, flush the.  
2ba40 20 20 20 20 2a 2a 20 63 61 63 68 65 2e 0a 20 20      ** cache..  
2ba50 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
2ba60 44 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73  Database changes
2ba70 20 69 73 20 64 65 74 65 63 74 65 64 20 62 79 20   is detected by 
2ba80 6c 6f 6f 6b 69 6e 67 20 61 74 20 31 35 20 62 79  looking at 15 by
2ba90 74 65 73 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20  tes beginning.  
2baa0 20 20 20 20 2a 2a 20 61 74 20 6f 66 66 73 65 74      ** at offset
2bab0 20 32 34 20 69 6e 74 6f 20 74 68 65 20 66 69 6c   24 into the fil
2bac0 65 2e 20 20 54 68 65 20 66 69 72 73 74 20 34 20  e.  The first 4 
2bad0 6f 66 20 74 68 65 73 65 20 31 36 20 62 79 74 65  of these 16 byte
2bae0 73 20 61 72 65 0a 20 20 20 20 20 20 2a 2a 20 61  s are.      ** a
2baf0 20 33 32 2d 62 69 74 20 63 6f 75 6e 74 65 72 20   32-bit counter 
2bb00 74 68 61 74 20 69 73 20 69 6e 63 72 65 6d 65 6e  that is incremen
2bb10 74 65 64 20 77 69 74 68 20 65 61 63 68 20 63 68  ted with each ch
2bb20 61 6e 67 65 2e 20 20 54 68 65 0a 20 20 20 20 20  ange.  The.     
2bb30 20 2a 2a 20 6f 74 68 65 72 20 62 79 74 65 73 20   ** other bytes 
2bb40 63 68 61 6e 67 65 20 72 61 6e 64 6f 6d 6c 79 20  change randomly 
2bb50 77 69 74 68 20 65 61 63 68 20 66 69 6c 65 20 63  with each file c
2bb60 68 61 6e 67 65 20 77 68 65 6e 0a 20 20 20 20 20  hange when.     
2bb70 20 2a 2a 20 61 20 63 6f 64 65 63 20 69 73 20 69   ** a codec is i
2bb80 6e 20 75 73 65 2e 0a 20 20 20 20 20 20 2a 2a 20  n use..      ** 
2bb90 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65 20  .      ** There 
2bba0 69 73 20 61 20 76 61 6e 69 73 68 69 6e 67 6c 79  is a vanishingly
2bbb0 20 73 6d 61 6c 6c 20 63 68 61 6e 63 65 20 74 68   small chance th
2bbc0 61 74 20 61 20 63 68 61 6e 67 65 20 77 69 6c 6c  at a change will
2bbd0 20 6e 6f 74 20 62 65 20 0a 20 20 20 20 20 20 2a   not be .      *
2bbe0 2a 20 64 65 74 65 63 74 65 64 2e 20 20 54 68 65  * detected.  The
2bbf0 20 63 68 61 6e 63 65 20 6f 66 20 61 6e 20 75 6e   chance of an un
2bc00 64 65 74 65 63 74 65 64 20 63 68 61 6e 67 65 20  detected change 
2bc10 69 73 20 73 6f 20 73 6d 61 6c 6c 20 74 68 61 74  is so small that
2bc20 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 63 61 6e  .      ** it can
2bc30 20 62 65 20 6e 65 67 6c 65 63 74 65 64 2e 0a 20   be neglected.. 
2bc40 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 50 67       */.      Pg
2bc50 6e 6f 20 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20  no nPage = 0;.  
2bc60 20 20 20 20 63 68 61 72 20 64 62 46 69 6c 65 56      char dbFileV
2bc70 65 72 73 5b 73 69 7a 65 6f 66 28 70 50 61 67 65  ers[sizeof(pPage
2bc80 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 5d 3b  r->dbFileVers)];
2bc90 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  ..      rc = pag
2bca0 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
2bcb0 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20  er, &nPage);.   
2bcc0 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
2bcd0 20 66 61 69 6c 65 64 3b 0a 0a 20 20 20 20 20 20   failed;..      
2bce0 69 66 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20  if( nPage>0 ){. 
2bcf0 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28         IOTRACE((
2bd00 22 43 4b 56 45 52 53 20 25 70 20 25 64 5c 6e 22  "CKVERS %p %d\n"
2bd10 2c 20 70 50 61 67 65 72 2c 20 73 69 7a 65 6f 66  , pPager, sizeof
2bd20 28 64 62 46 69 6c 65 56 65 72 73 29 29 29 3b 0a  (dbFileVers)));.
2bd30 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
2bd40 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
2bd50 72 2d 3e 66 64 2c 20 26 64 62 46 69 6c 65 56 65  r->fd, &dbFileVe
2bd60 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c  rs, sizeof(dbFil
2bd70 65 56 65 72 73 29 2c 20 32 34 29 3b 0a 20 20 20  eVers), 24);.   
2bd80 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2bd90 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2bda0 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b      goto failed;
2bdb0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2bdc0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2bdd0 6d 65 6d 73 65 74 28 64 62 46 69 6c 65 56 65 72  memset(dbFileVer
2bde0 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 62 46  s, 0, sizeof(dbF
2bdf0 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20  ileVers));.     
2be00 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 6d 65   }..      if( me
2be10 6d 63 6d 70 28 70 50 61 67 65 72 2d 3e 64 62 46  mcmp(pPager->dbF
2be20 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c 65 56  ileVers, dbFileV
2be30 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69  ers, sizeof(dbFi
2be40 6c 65 56 65 72 73 29 29 21 3d 30 20 29 7b 0a 20  leVers))!=0 ){. 
2be50 20 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73         pager_res
2be60 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  et(pPager);.    
2be70 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
2be80 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20  * If there is a 
2be90 57 41 4c 20 66 69 6c 65 20 69 6e 20 74 68 65 20  WAL file in the 
2bea0 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 6f 70 65  file-system, ope
2beb0 6e 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  n this database 
2bec0 69 6e 20 57 41 4c 0a 20 20 20 20 2a 2a 20 6d 6f  in WAL.    ** mo
2bed0 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74  de. Otherwise, t
2bee0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e  he following fun
2bef0 63 74 69 6f 6e 20 63 61 6c 6c 20 69 73 20 61 20  ction call is a 
2bf00 6e 6f 2d 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20  no-op..    */.  
2bf10 20 20 72 63 20 3d 20 70 61 67 65 72 4f 70 65 6e    rc = pagerOpen
2bf20 57 61 6c 49 66 50 72 65 73 65 6e 74 28 70 50 61  WalIfPresent(pPa
2bf30 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  ger);.  }..  if(
2bf40 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
2bf50 67 65 72 29 20 26 26 20 72 63 3d 3d 53 51 4c 49  ger) && rc==SQLI
2bf60 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
2bf70 3d 20 70 61 67 65 72 42 65 67 69 6e 52 65 61 64  = pagerBeginRead
2bf80 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  Transaction(pPag
2bf90 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  er);.  }..  if( 
2bfa0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
2bfb0 50 41 47 45 52 5f 4e 4f 4e 45 20 26 26 20 72 63  PAGER_NONE && rc
2bfc0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2bfd0 20 20 20 72 63 20 3d 20 70 61 67 65 72 50 61 67     rc = pagerPag
2bfe0 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26  ecount(pPager, &
2bff0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b  pPager->dbSize);
2c000 0a 20 20 7d 0a 0a 20 66 61 69 6c 65 64 3a 0a 20  .  }.. failed:. 
2c010 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2c020 4f 4b 20 29 7b 0a 20 20 20 20 70 61 67 65 72 5f  OK ){.    pager_
2c030 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  unlock(pPager);.
2c040 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2c050 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
2c060 52 5f 4e 4f 4e 45 20 29 3b 0a 20 20 7d 65 6c 73  R_NONE );.  }els
2c070 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  e{.    pPager->e
2c080 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45  State = PAGER_RE
2c090 41 44 45 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ADER;.  }.  retu
2c0a0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2c0b0 49 66 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  If the reference
2c0c0 20 63 6f 75 6e 74 20 68 61 73 20 72 65 61 63 68   count has reach
2c0d0 65 64 20 7a 65 72 6f 2c 20 72 6f 6c 6c 62 61 63  ed zero, rollbac
2c0e0 6b 20 61 6e 79 20 61 63 74 69 76 65 0a 2a 2a 20  k any active.** 
2c0f0 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20  transaction and 
2c100 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67 65 72  unlock the pager
2c110 2e 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20  ..**.** Except, 
2c120 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  in locking_mode=
2c130 45 58 43 4c 55 53 49 56 45 20 77 68 65 6e 20 74  EXCLUSIVE when t
2c140 68 65 72 65 20 69 73 20 6e 6f 74 68 69 6e 67 20  here is nothing 
2c150 74 6f 20 69 6e 0a 2a 2a 20 74 68 65 20 72 6f 6c  to in.** the rol
2c160 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 74  lback journal, t
2c170 68 65 20 75 6e 6c 6f 63 6b 20 69 73 20 6e 6f 74  he unlock is not
2c180 20 70 65 72 66 6f 72 6d 65 64 20 61 6e 64 20 74   performed and t
2c190 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 74 68 69  here is.** nothi
2c1a0 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20  ng to rollback, 
2c1b0 73 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  so this routine 
2c1c0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 20 0a  is a no-op..*/ .
2c1d0 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
2c1e0 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28  rUnlockIfUnused(
2c1f0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
2c200 20 20 69 66 28 20 28 73 71 6c 69 74 65 33 50 63    if( (sqlite3Pc
2c210 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61  acheRefCount(pPa
2c220 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30  ger->pPCache)==0
2c230 29 0a 20 20 20 26 26 20 28 21 70 50 61 67 65 72  ).   && (!pPager
2c240 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
2c250 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  || pPager->journ
2c260 61 6c 4f 66 66 3e 30 29 20 0a 20 20 29 7b 0a 20  alOff>0) .  ){. 
2c270 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e     pagerUnlockAn
2c280 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  dRollback(pPager
2c290 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
2c2a0 41 63 71 75 69 72 65 20 61 20 72 65 66 65 72 65  Acquire a refere
2c2b0 6e 63 65 20 74 6f 20 70 61 67 65 20 6e 75 6d 62  nce to page numb
2c2c0 65 72 20 70 67 6e 6f 20 69 6e 20 70 61 67 65 72  er pgno in pager
2c2d0 20 70 50 61 67 65 72 20 28 61 20 70 61 67 65 0a   pPager (a page.
2c2e0 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 68 61 73  ** reference has
2c2f0 20 74 79 70 65 20 44 62 50 61 67 65 2a 29 2e 20   type DbPage*). 
2c300 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64  If the requested
2c310 20 72 65 66 65 72 65 6e 63 65 20 69 73 20 0a 2a   reference is .*
2c320 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f  * successfully o
2c330 62 74 61 69 6e 65 64 2c 20 69 74 20 69 73 20 63  btained, it is c
2c340 6f 70 69 65 64 20 74 6f 20 2a 70 70 50 61 67 65  opied to *ppPage
2c350 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
2c360 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  eturned..**.** I
2c370 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  f the requested 
2c380 70 61 67 65 20 69 73 20 61 6c 72 65 61 64 79 20  page is already 
2c390 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20 69 74  in the cache, it
2c3a0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a   is returned. .*
2c3b0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20 6e  * Otherwise, a n
2c3c0 65 77 20 70 61 67 65 20 6f 62 6a 65 63 74 20 69  ew page object i
2c3d0 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  s allocated and 
2c3e0 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 64  populated with d
2c3f0 61 74 61 0a 2a 2a 20 72 65 61 64 20 66 72 6f 6d  ata.** read from
2c400 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2c410 6c 65 2e 20 49 6e 20 73 6f 6d 65 20 63 61 73 65  le. In some case
2c420 73 2c 20 74 68 65 20 70 63 61 63 68 65 20 6d 6f  s, the pcache mo
2c430 64 75 6c 65 20 6d 61 79 0a 2a 2a 20 63 68 6f 6f  dule may.** choo
2c440 73 65 20 6e 6f 74 20 74 6f 20 61 6c 6c 6f 63 61  se not to alloca
2c450 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 6f 62  te a new page ob
2c460 6a 65 63 74 20 61 6e 64 20 6d 61 79 20 72 65 75  ject and may reu
2c470 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 2a  se an existing.*
2c480 2a 20 6f 62 6a 65 63 74 20 77 69 74 68 20 6e 6f  * object with no
2c490 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66   outstanding ref
2c4a0 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 54  erences..**.** T
2c4b0 68 65 20 65 78 74 72 61 20 64 61 74 61 20 61 70  he extra data ap
2c4c0 70 65 6e 64 65 64 20 74 6f 20 61 20 70 61 67 65  pended to a page
2c4d0 20 69 73 20 61 6c 77 61 79 73 20 69 6e 69 74 69   is always initi
2c4e0 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f 73 20  alized to zeros 
2c4f0 74 68 65 20 0a 2a 2a 20 66 69 72 73 74 20 74 69  the .** first ti
2c500 6d 65 20 61 20 70 61 67 65 20 69 73 20 6c 6f 61  me a page is loa
2c510 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e  ded into memory.
2c520 20 49 66 20 74 68 65 20 70 61 67 65 20 72 65 71   If the page req
2c530 75 65 73 74 65 64 20 69 73 20 0a 2a 2a 20 61 6c  uested is .** al
2c540 72 65 61 64 79 20 69 6e 20 74 68 65 20 63 61 63  ready in the cac
2c550 68 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  he when this fun
2c560 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
2c570 20 74 68 65 6e 20 74 68 65 20 65 78 74 72 61 0a   then the extra.
2c580 2a 2a 20 64 61 74 61 20 69 73 20 6c 65 66 74 20  ** data is left 
2c590 61 73 20 69 74 20 77 61 73 20 77 68 65 6e 20 74  as it was when t
2c5a0 68 65 20 70 61 67 65 20 6f 62 6a 65 63 74 20 77  he page object w
2c5b0 61 73 20 6c 61 73 74 20 75 73 65 64 2e 0a 2a 2a  as last used..**
2c5c0 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 62  .** If the datab
2c5d0 61 73 65 20 69 6d 61 67 65 20 69 73 20 73 6d 61  ase image is sma
2c5e0 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 72 65  ller than the re
2c5f0 71 75 65 73 74 65 64 20 70 61 67 65 20 6f 72 20  quested page or 
2c600 69 66 20 61 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72  if a .** non-zer
2c610 6f 20 76 61 6c 75 65 20 69 73 20 70 61 73 73 65  o value is passe
2c620 64 20 61 73 20 74 68 65 20 6e 6f 43 6f 6e 74 65  d as the noConte
2c630 6e 74 20 70 61 72 61 6d 65 74 65 72 20 61 6e 64  nt parameter and
2c640 20 74 68 65 20 0a 2a 2a 20 72 65 71 75 65 73 74   the .** request
2c650 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61  ed page is not a
2c660 6c 72 65 61 64 79 20 73 74 6f 72 65 64 20 69 6e  lready stored in
2c670 20 74 68 65 20 63 61 63 68 65 2c 20 74 68 65 6e   the cache, then
2c680 20 6e 6f 20 0a 2a 2a 20 61 63 74 75 61 6c 20 64   no .** actual d
2c690 69 73 6b 20 72 65 61 64 20 6f 63 63 75 72 73 2e  isk read occurs.
2c6a0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
2c6b0 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f  e memory image o
2c6c0 66 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 20 69  f the .** page i
2c6d0 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  s initialized to
2c6e0 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 0a 2a 2a 0a   all zeros. .**.
2c6f0 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74 20  ** If noContent 
2c700 69 73 20 74 72 75 65 2c 20 69 74 20 6d 65 61 6e  is true, it mean
2c710 73 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74  s that we do not
2c720 20 63 61 72 65 20 61 62 6f 75 74 20 74 68 65 20   care about the 
2c730 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66 20 74  contents.** of t
2c740 68 65 20 70 61 67 65 2e 20 54 68 69 73 20 6f 63  he page. This oc
2c750 63 75 72 73 20 69 6e 20 74 77 6f 20 73 65 70 65  curs in two sepe
2c760 72 61 74 65 20 73 63 65 6e 61 72 69 6f 73 3a 0a  rate scenarios:.
2c770 2a 2a 0a 2a 2a 20 20 20 61 29 20 57 68 65 6e 20  **.**   a) When 
2c780 72 65 61 64 69 6e 67 20 61 20 66 72 65 65 2d 6c  reading a free-l
2c790 69 73 74 20 6c 65 61 66 20 70 61 67 65 20 66 72  ist leaf page fr
2c7a0 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  om the database,
2c7b0 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20   and.**.**   b) 
2c7c0 57 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e 74  When a savepoint
2c7d0 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64   is being rolled
2c7e0 20 62 61 63 6b 20 61 6e 64 20 77 65 20 6e 65 65   back and we nee
2c7f0 64 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20 20 20 20  d to load.**    
2c800 20 20 61 20 6e 65 77 20 70 61 67 65 20 69 6e 74    a new page int
2c810 6f 20 74 68 65 20 63 61 63 68 65 20 74 6f 20 62  o the cache to b
2c820 65 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68  e filled with th
2c830 65 20 64 61 74 61 20 72 65 61 64 0a 2a 2a 20 20  e data read.**  
2c840 20 20 20 20 66 72 6f 6d 20 74 68 65 20 73 61 76      from the sav
2c850 65 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a  epoint journal..
2c860 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65  **.** If noConte
2c870 6e 74 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  nt is true, then
2c880 20 74 68 65 20 64 61 74 61 20 72 65 74 75 72 6e   the data return
2c890 65 64 20 69 73 20 7a 65 72 6f 65 64 20 69 6e 73  ed is zeroed ins
2c8a0 74 65 61 64 20 6f 66 0a 2a 2a 20 62 65 69 6e 67  tead of.** being
2c8b0 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64   read from the d
2c8c0 61 74 61 62 61 73 65 2e 20 41 64 64 69 74 69 6f  atabase. Additio
2c8d0 6e 61 6c 6c 79 2c 20 74 68 65 20 62 69 74 73 20  nally, the bits 
2c8e0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a  corresponding.**
2c8f0 20 74 6f 20 70 67 6e 6f 20 69 6e 20 50 61 67 65   to pgno in Page
2c900 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 28 62 69  r.pInJournal (bi
2c910 74 76 65 63 20 6f 66 20 70 61 67 65 73 20 61 6c  tvec of pages al
2c920 72 65 61 64 79 20 77 72 69 74 74 65 6e 20 74 6f  ready written to
2c930 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
2c940 66 69 6c 65 29 20 61 6e 64 20 74 68 65 20 50 61  file) and the Pa
2c950 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e  gerSavepoint.pIn
2c960 53 61 76 65 70 6f 69 6e 74 20 62 69 74 76 65 63  Savepoint bitvec
2c970 73 20 6f 66 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a  s of any open.**
2c980 20 73 61 76 65 70 6f 69 6e 74 73 20 61 72 65 20   savepoints are 
2c990 73 65 74 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  set. This means 
2c9a0 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6d  if the page is m
2c9b0 61 64 65 20 77 72 69 74 61 62 6c 65 20 61 74 20  ade writable at 
2c9c0 61 6e 79 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e 20  any.** point in 
2c9d0 74 68 65 20 66 75 74 75 72 65 2c 20 75 73 69 6e  the future, usin
2c9e0 67 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  g a call to sqli
2c9f0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 2c  te3PagerWrite(),
2ca00 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a   its contents.**
2ca10 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 6a 6f 75   will not be jou
2ca20 72 6e 61 6c 65 64 2e 20 54 68 69 73 20 73 61 76  rnaled. This sav
2ca30 65 73 20 49 4f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  es IO..**.** The
2ca40 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6d 69 67   acquisition mig
2ca50 68 74 20 66 61 69 6c 20 66 6f 72 20 73 65 76 65  ht fail for seve
2ca60 72 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e  ral reasons.  In
2ca70 20 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61   all cases,.** a
2ca80 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72  n appropriate er
2ca90 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
2caa0 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65  rned and *ppPage
2cab0 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e   is set to NULL.
2cac0 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
2cad0 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b  sqlite3PagerLook
2cae0 75 70 28 29 2e 20 20 42 6f 74 68 20 74 68 69 73  up().  Both this
2caf0 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 4c 6f 6f   routine and Loo
2cb00 6b 75 70 28 29 20 61 74 74 65 6d 70 74 0a 2a 2a  kup() attempt.**
2cb10 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20   to find a page 
2cb20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  in the in-memory
2cb30 20 63 61 63 68 65 20 66 69 72 73 74 2e 20 20 49   cache first.  I
2cb40 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
2cb50 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20  t already.** in 
2cb60 6d 65 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f 75  memory, this rou
2cb70 74 69 6e 65 20 67 6f 65 73 20 74 6f 20 64 69 73  tine goes to dis
2cb80 6b 20 74 6f 20 72 65 61 64 20 69 74 20 69 6e 20  k to read it in 
2cb90 77 68 65 72 65 61 73 20 4c 6f 6f 6b 75 70 28 29  whereas Lookup()
2cba0 0a 2a 2a 20 6a 75 73 74 20 72 65 74 75 72 6e 73  .** just returns
2cbb0 20 30 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e   0.  This routin
2cbc0 65 20 61 63 71 75 69 72 65 73 20 61 20 72 65 61  e acquires a rea
2cbd0 64 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72 73 74  d-lock the first
2cbe0 20 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20   time it.** has 
2cbf0 74 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61  to go to disk, a
2cc00 6e 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c  nd could also pl
2cc10 61 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f  ayback an old jo
2cc20 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61  urnal if necessa
2cc30 72 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 4c 6f 6f  ry..** Since Loo
2cc40 6b 75 70 28 29 20 6e 65 76 65 72 20 67 6f 65 73  kup() never goes
2cc50 20 74 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65 76   to disk, it nev
2cc60 65 72 20 68 61 73 20 74 6f 20 64 65 61 6c 20 77  er has to deal w
2cc70 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20  ith locks.** or 
2cc80 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a  journal files..*
2cc90 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
2cca0 65 72 41 63 71 75 69 72 65 28 0a 20 20 50 61 67  erAcquire(.  Pag
2ccb0 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
2ccc0 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f 70   /* The pager op
2ccd0 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  en on the databa
2cce0 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e  se file */.  Pgn
2ccf0 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20  o pgno,         
2cd00 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
2cd10 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 44 62  to fetch */.  Db
2cd20 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20  Page **ppPage,  
2cd30 20 20 2f 2a 20 57 72 69 74 65 20 61 20 70 6f 69    /* Write a poi
2cd40 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
2cd50 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   here */.  int n
2cd60 6f 43 6f 6e 74 65 6e 74 20 20 20 20 20 20 20 2f  oContent       /
2cd70 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20  * Do not bother 
2cd80 72 65 61 64 69 6e 67 20 63 6f 6e 74 65 6e 74 20  reading content 
2cd90 66 72 6f 6d 20 64 69 73 6b 20 69 66 20 74 72 75  from disk if tru
2cda0 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
2cdb0 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  ;.  PgHdr *pPg;.
2cdc0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
2cdd0 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
2cde0 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 61 73 73  _READER );.  ass
2cdf0 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
2ce00 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
2ce10 29 3b 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d  );..  if( pgno==
2ce20 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
2ce30 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
2ce40 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  KPT;.  }..  /* I
2ce50 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
2ce60 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  n the error stat
2ce70 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72  e, return an err
2ce80 6f 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20  or immediately. 
2ce90 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  .  ** Otherwise,
2cea0 20 72 65 71 75 65 73 74 20 74 68 65 20 70 61 67   request the pag
2ceb0 65 20 66 72 6f 6d 20 74 68 65 20 50 43 61 63 68  e from the PCach
2cec0 65 20 6c 61 79 65 72 2e 20 2a 2f 0a 20 20 69 66  e layer. */.  if
2ced0 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
2cee0 65 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  e!=SQLITE_OK && 
2cef0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21  pPager->errCode!
2cf00 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a  =SQLITE_FULL ){.
2cf10 20 20 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d      rc = pPager-
2cf20 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 65 6c 73  >errCode;.  }els
2cf30 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  e{.    rc = sqli
2cf40 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28 70  te3PcacheFetch(p
2cf50 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
2cf60 70 67 6e 6f 2c 20 31 2c 20 70 70 50 61 67 65 29  pgno, 1, ppPage)
2cf70 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21  ;.  }..  if( rc!
2cf80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2cf90 20 20 2f 2a 20 45 69 74 68 65 72 20 74 68 65 20    /* Either the 
2cfa0 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50  call to sqlite3P
2cfb0 63 61 63 68 65 46 65 74 63 68 28 29 20 72 65 74  cacheFetch() ret
2cfc0 75 72 6e 65 64 20 61 6e 20 65 72 72 6f 72 20 6f  urned an error o
2cfd0 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 61 67  r the.    ** pag
2cfe0 65 72 20 77 61 73 20 61 6c 72 65 61 64 79 20 69  er was already i
2cff0 6e 20 74 68 65 20 65 72 72 6f 72 2d 73 74 61 74  n the error-stat
2d000 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  e when this func
2d010 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 2e  tion was called.
2d020 0a 20 20 20 20 2a 2a 20 53 65 74 20 70 50 67 20  .    ** Set pPg 
2d030 74 6f 20 30 20 61 6e 64 20 6a 75 6d 70 20 74 6f  to 0 and jump to
2d040 20 74 68 65 20 65 78 63 65 70 74 69 6f 6e 20 68   the exception h
2d050 61 6e 64 6c 65 72 2e 20 20 2a 2f 0a 20 20 20 20  andler.  */.    
2d060 70 50 67 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74  pPg = 0;.    got
2d070 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f  o pager_acquire_
2d080 65 72 72 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  err;.  }.  asser
2d090 74 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 67  t( (*ppPage)->pg
2d0a0 6e 6f 3d 3d 70 67 6e 6f 20 29 3b 0a 20 20 61 73  no==pgno );.  as
2d0b0 73 65 72 74 28 20 28 2a 70 70 50 61 67 65 29 2d  sert( (*ppPage)-
2d0c0 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20  >pPager==pPager 
2d0d0 7c 7c 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 50  || (*ppPage)->pP
2d0e0 61 67 65 72 3d 3d 30 20 29 3b 0a 0a 20 20 69 66  ager==0 );..  if
2d0f0 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 50 61  ( (*ppPage)->pPa
2d100 67 65 72 20 26 26 20 21 6e 6f 43 6f 6e 74 65 6e  ger && !noConten
2d110 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74  t ){.    /* In t
2d120 68 69 73 20 63 61 73 65 20 74 68 65 20 70 63 61  his case the pca
2d130 63 68 65 20 61 6c 72 65 61 64 79 20 63 6f 6e 74  che already cont
2d140 61 69 6e 73 20 61 6e 20 69 6e 69 74 69 61 6c 69  ains an initiali
2d150 7a 65 64 20 63 6f 70 79 20 6f 66 0a 20 20 20 20  zed copy of.    
2d160 2a 2a 20 74 68 65 20 70 61 67 65 2e 20 52 65 74  ** the page. Ret
2d170 75 72 6e 20 77 69 74 68 6f 75 74 20 66 75 72 74  urn without furt
2d180 68 65 72 20 61 64 6f 2e 20 20 2a 2f 0a 20 20 20  her ado.  */.   
2d190 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d 50   assert( pgno<=P
2d1a0 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 26 26  AGER_MAX_PGNO &&
2d1b0 20 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f   pgno!=PAGER_MJ_
2d1c0 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b 0a  PGNO(pPager) );.
2d1d0 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70      PAGER_INCR(p
2d1e0 50 61 67 65 72 2d 3e 6e 48 69 74 29 3b 0a 20 20  Pager->nHit);.  
2d1f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2d200 4f 4b 3b 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  OK;..  }else{.  
2d210 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 63    /* The pager c
2d220 61 63 68 65 20 68 61 73 20 63 72 65 61 74 65 64  ache has created
2d230 20 61 20 6e 65 77 20 70 61 67 65 2e 20 49 74 73   a new page. Its
2d240 20 63 6f 6e 74 65 6e 74 20 6e 65 65 64 73 20 74   content needs t
2d250 6f 20 0a 20 20 20 20 2a 2a 20 62 65 20 69 6e 69  o .    ** be ini
2d260 74 69 61 6c 69 7a 65 64 2e 20 20 2a 2f 0a 0a 20  tialized.  */.. 
2d270 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50     PAGER_INCR(pP
2d280 61 67 65 72 2d 3e 6e 4d 69 73 73 29 3b 0a 20 20  ager->nMiss);.  
2d290 20 20 70 50 67 20 3d 20 2a 70 70 50 61 67 65 3b    pPg = *ppPage;
2d2a0 0a 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72  .    pPg->pPager
2d2b0 20 3d 20 70 50 61 67 65 72 3b 0a 0a 20 20 20 20   = pPager;..    
2d2c0 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 70  /* The maximum p
2d2d0 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 32 5e  age number is 2^
2d2e0 33 31 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54  31. Return SQLIT
2d2f0 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61 20 70  E_CORRUPT if a p
2d300 61 67 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65  age.    ** numbe
2d310 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  r greater than t
2d320 68 69 73 2c 20 6f 72 20 74 68 65 20 75 6e 75 73  his, or the unus
2d330 65 64 20 6c 6f 63 6b 69 6e 67 2d 70 61 67 65 2c  ed locking-page,
2d340 20 69 73 20 72 65 71 75 65 73 74 65 64 2e 20 2a   is requested. *
2d350 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 50  /.    if( pgno>P
2d360 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c  AGER_MAX_PGNO ||
2d370 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f   pgno==PAGER_MJ_
2d380 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a  PGNO(pPager) ){.
2d390 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2d3a0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
2d3b0 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72        goto pager
2d3c0 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20  _acquire_err;.  
2d3d0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 4d 45 4d    }..    if( MEM
2d3e0 44 42 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62  DB || pPager->db
2d3f0 53 69 7a 65 3c 28 69 6e 74 29 70 67 6e 6f 20 7c  Size<(int)pgno |
2d400 7c 20 6e 6f 43 6f 6e 74 65 6e 74 20 7c 7c 20 21  | noContent || !
2d410 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
2d420 64 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  d) ){.      if( 
2d430 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6d 78 50  pgno>pPager->mxP
2d440 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 72  gno ){.        r
2d450 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b  c = SQLITE_FULL;
2d460 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61  .        goto pa
2d470 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b  ger_acquire_err;
2d480 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2d490 66 28 20 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a  f( noContent ){.
2d4a0 20 20 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 75          /* Failu
2d4b0 72 65 20 74 6f 20 73 65 74 20 74 68 65 20 62 69  re to set the bi
2d4c0 74 73 20 69 6e 20 74 68 65 20 49 6e 4a 6f 75 72  ts in the InJour
2d4d0 6e 61 6c 20 62 69 74 2d 76 65 63 74 6f 72 73 20  nal bit-vectors 
2d4e0 69 73 20 62 65 6e 69 67 6e 2e 0a 20 20 20 20 20  is benign..     
2d4f0 20 20 20 2a 2a 20 49 74 20 6d 65 72 65 6c 79 20     ** It merely 
2d500 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 6d 69  means that we mi
2d510 67 68 74 20 64 6f 20 73 6f 6d 65 20 65 78 74 72  ght do some extr
2d520 61 20 77 6f 72 6b 20 74 6f 20 6a 6f 75 72 6e 61  a work to journa
2d530 6c 20 61 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  l a .        ** 
2d540 70 61 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e  page that does n
2d550 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6a 6f  ot need to be jo
2d560 75 72 6e 61 6c 65 64 2e 20 20 4e 65 76 65 72 74  urnaled.  Nevert
2d570 68 65 6c 65 73 73 2c 20 62 65 20 73 75 72 65 20  heless, be sure 
2d580 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 74  .        ** to t
2d590 65 73 74 20 74 68 65 20 63 61 73 65 20 77 68 65  est the case whe
2d5a0 72 65 20 61 20 6d 61 6c 6c 6f 63 20 65 72 72 6f  re a malloc erro
2d5b0 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74  r occurs while t
2d5c0 72 79 69 6e 67 20 74 6f 20 73 65 74 20 0a 20 20  rying to set .  
2d5d0 20 20 20 20 20 20 2a 2a 20 61 20 62 69 74 20 69        ** a bit i
2d5e0 6e 20 61 20 62 69 74 20 76 65 63 74 6f 72 2e 0a  n a bit vector..
2d5f0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2d600 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42     sqlite3BeginB
2d610 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
2d620 20 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3c         if( pgno<
2d630 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53  =pPager->dbOrigS
2d640 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ize ){.         
2d650 20 54 45 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20   TESTONLY( rc = 
2d660 29 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53  ) sqlite3BitvecS
2d670 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  et(pPager->pInJo
2d680 75 72 6e 61 6c 2c 20 70 67 6e 6f 29 3b 0a 20 20  urnal, pgno);.  
2d690 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
2d6a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
2d6b0 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  EM );.        }.
2d6c0 20 20 20 20 20 20 20 20 54 45 53 54 4f 4e 4c 59          TESTONLY
2d6d0 28 20 72 63 20 3d 20 29 20 61 64 64 54 6f 53 61  ( rc = ) addToSa
2d6e0 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70  vepointBitvecs(p
2d6f0 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
2d700 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2d710 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
2d720 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
2d730 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
2d740 6f 63 28 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  oc();.      }.  
2d750 20 20 20 20 6d 65 6d 73 65 74 28 70 50 67 2d 3e      memset(pPg->
2d760 70 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65 72  pData, 0, pPager
2d770 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
2d780 20 20 20 49 4f 54 52 41 43 45 28 28 22 5a 45 52     IOTRACE(("ZER
2d790 4f 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  O %p %d\n", pPag
2d7a0 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20  er, pgno));.    
2d7b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
2d7c0 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72  ert( pPg->pPager
2d7d0 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20 20 20 20  ==pPager );.    
2d7e0 20 20 72 63 20 3d 20 72 65 61 64 44 62 50 61 67    rc = readDbPag
2d7f0 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 69 66  e(pPg);.      if
2d800 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2d810 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
2d820 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72  pager_acquire_er
2d830 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  r;.      }.    }
2d840 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
2d850 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70  HECK_PAGES.    p
2d860 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70  Pg->pageHash = p
2d870 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
2d880 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a  g);.#endif.  }..
2d890 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2d8a0 4f 4b 3b 0a 0a 70 61 67 65 72 5f 61 63 71 75 69  OK;..pager_acqui
2d8b0 72 65 5f 65 72 72 3a 0a 20 20 61 73 73 65 72 74  re_err:.  assert
2d8c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2d8d0 29 3b 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a  );.  if( pPg ){.
2d8e0 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
2d8f0 65 44 72 6f 70 28 70 50 67 29 3b 0a 20 20 7d 0a  eDrop(pPg);.  }.
2d900 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55    pagerUnlockIfU
2d910 6e 75 73 65 64 28 70 50 61 67 65 72 29 3b 0a 0a  nused(pPager);..
2d920 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20    *ppPage = 0;. 
2d930 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2d940 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70  *.** Acquire a p
2d950 61 67 65 20 69 66 20 69 74 20 69 73 20 61 6c 72  age if it is alr
2d960 65 61 64 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d  eady in the in-m
2d970 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20 44 6f  emory cache.  Do
2d980 0a 2a 2a 20 6e 6f 74 20 72 65 61 64 20 74 68 65  .** not read the
2d990 20 70 61 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e   page from disk.
2d9a0 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74    Return a point
2d9b0 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 2c 0a  er to the page,.
2d9c0 2a 2a 20 6f 72 20 30 20 69 66 20 74 68 65 20 70  ** or 0 if the p
2d9d0 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61  age is not in ca
2d9e0 63 68 65 2e 20 41 6c 73 6f 2c 20 72 65 74 75 72  che. Also, retur
2d9f0 6e 20 30 20 69 66 20 74 68 65 20 0a 2a 2a 20 70  n 0 if the .** p
2da00 61 67 65 72 20 69 73 20 69 6e 20 50 41 47 45 52  ager is in PAGER
2da10 5f 55 4e 4c 4f 43 4b 20 73 74 61 74 65 20 77 68  _UNLOCK state wh
2da20 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
2da30 20 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 6f   is called,.** o
2da40 72 20 69 66 20 74 68 65 20 70 61 67 65 72 20 69  r if the pager i
2da50 73 20 69 6e 20 61 6e 20 65 72 72 6f 72 20 73 74  s in an error st
2da60 61 74 65 20 6f 74 68 65 72 20 74 68 61 6e 20 53  ate other than S
2da70 51 4c 49 54 45 5f 46 55 4c 4c 2e 0a 2a 2a 0a 2a  QLITE_FULL..**.*
2da80 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74  * See also sqlit
2da90 65 33 50 61 67 65 72 47 65 74 28 29 2e 20 20 54  e3PagerGet().  T
2daa0 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65  he difference be
2dab0 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69  tween this routi
2dac0 6e 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65  ne.** and sqlite
2dad0 33 50 61 67 65 72 47 65 74 28 29 20 69 73 20 74  3PagerGet() is t
2dae0 68 61 74 20 5f 67 65 74 28 29 20 77 69 6c 6c 20  hat _get() will 
2daf0 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61  go to the disk a
2db00 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74 68  nd read.** in th
2db10 65 20 70 61 67 65 20 69 66 20 74 68 65 20 70 61  e page if the pa
2db20 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  ge is not alread
2db30 79 20 69 6e 20 63 61 63 68 65 2e 20 20 54 68 69  y in cache.  Thi
2db40 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74  s routine.** ret
2db50 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68 65  urns NULL if the
2db60 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
2db70 63 61 63 68 65 20 6f 72 20 69 66 20 61 20 64 69  cache or if a di
2db80 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a  sk I/O error .**
2db90 20 68 61 73 20 65 76 65 72 20 68 61 70 70 65 6e   has ever happen
2dba0 65 64 2e 0a 2a 2f 0a 44 62 50 61 67 65 20 2a 73  ed..*/.DbPage *s
2dbb0 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75  qlite3PagerLooku
2dbc0 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  p(Pager *pPager,
2dbd0 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50   Pgno pgno){.  P
2dbe0 67 48 64 72 20 2a 70 50 67 20 3d 20 30 3b 0a 20  gHdr *pPg = 0;. 
2dbf0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21   assert( pPager!
2dc00 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2dc10 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 61 73 73  pgno!=0 );.  ass
2dc20 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 50 43  ert( pPager->pPC
2dc30 61 63 68 65 21 3d 30 20 29 3b 0a 20 20 61 73 73  ache!=0 );.  ass
2dc40 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
2dc50 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45  ate>=PAGER_READE
2dc60 52 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63  R );.  sqlite3Pc
2dc70 61 63 68 65 46 65 74 63 68 28 70 50 61 67 65 72  acheFetch(pPager
2dc80 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c  ->pPCache, pgno,
2dc90 20 30 2c 20 26 70 50 67 29 3b 0a 20 20 72 65 74   0, &pPg);.  ret
2dca0 75 72 6e 20 70 50 67 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn pPg;.}../*.*
2dcb0 2a 20 52 65 6c 65 61 73 65 20 61 20 70 61 67 65  * Release a page
2dcc0 20 72 65 66 65 72 65 6e 63 65 2e 0a 2a 2a 0a 2a   reference..**.*
2dcd0 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20  * If the number 
2dce0 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  of references to
2dcf0 20 74 68 65 20 70 61 67 65 20 64 72 6f 70 20 74   the page drop t
2dd00 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  o zero, then the
2dd10 0a 2a 2a 20 70 61 67 65 20 69 73 20 61 64 64 65  .** page is adde
2dd20 64 20 74 6f 20 74 68 65 20 4c 52 55 20 6c 69 73  d to the LRU lis
2dd30 74 2e 20 20 57 68 65 6e 20 61 6c 6c 20 72 65 66  t.  When all ref
2dd40 65 72 65 6e 63 65 73 20 74 6f 20 61 6c 6c 20 70  erences to all p
2dd50 61 67 65 73 0a 2a 2a 20 61 72 65 20 72 65 6c 65  ages.** are rele
2dd60 61 73 65 64 2c 20 61 20 72 6f 6c 6c 62 61 63 6b  ased, a rollback
2dd70 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65 20   occurs and the 
2dd80 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
2dd90 62 61 73 65 20 69 73 0a 2a 2a 20 72 65 6d 6f 76  base is.** remov
2dda0 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
2ddb0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 44 62  te3PagerUnref(Db
2ddc0 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 69 66  Page *pPg){.  if
2ddd0 28 20 70 50 67 20 29 7b 0a 20 20 20 20 50 61 67  ( pPg ){.    Pag
2dde0 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
2ddf0 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20 20 73 71  ->pPager;.    sq
2de00 6c 69 74 65 33 50 63 61 63 68 65 52 65 6c 65 61  lite3PcacheRelea
2de10 73 65 28 70 50 67 29 3b 0a 20 20 20 20 70 61 67  se(pPg);.    pag
2de20 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64  erUnlockIfUnused
2de30 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a  (pPager);.  }.}.
2de40 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
2de50 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61  tion is called a
2de60 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 65  t the start of e
2de70 76 65 72 79 20 77 72 69 74 65 20 74 72 61 6e 73  very write trans
2de80 61 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 72 65  action..** There
2de90 20 6d 75 73 74 20 61 6c 72 65 61 64 79 20 62 65   must already be
2dea0 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45   a RESERVED or E
2deb0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
2dec0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a   the database .*
2ded0 2a 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73  * file when this
2dee0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
2def0 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 74  ed..**.** Open t
2df00 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2df10 66 6f 72 20 70 61 67 65 72 20 70 50 61 67 65 72  for pager pPager
2df20 20 61 6e 64 20 77 72 69 74 65 20 61 20 6a 6f 75   and write a jou
2df30 72 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20 74  rnal header.** t
2df40 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 69  o the start of i
2df50 74 2e 20 49 66 20 74 68 65 72 65 20 61 72 65 20  t. If there are 
2df60 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74  active savepoint
2df70 73 2c 20 6f 70 65 6e 20 74 68 65 20 73 75 62 2d  s, open the sub-
2df80 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 61 73 20 77 65  journal.** as we
2df90 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ll. This functio
2dfa0 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 77  n is only used w
2dfb0 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
2dfc0 66 69 6c 65 20 69 73 20 62 65 69 6e 67 20 0a 2a  file is being .*
2dfd0 2a 20 6f 70 65 6e 65 64 20 74 6f 20 77 72 69 74  * opened to writ
2dfe0 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6c 6f 67  e a rollback log
2dff0 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69   for a transacti
2e000 6f 6e 2e 20 49 74 20 69 73 20 6e 6f 74 20 75 73  on. It is not us
2e010 65 64 20 0a 2a 2a 20 77 68 65 6e 20 6f 70 65 6e  ed .** when open
2e020 69 6e 67 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61  ing a hot journa
2e030 6c 20 66 69 6c 65 20 74 6f 20 72 6f 6c 6c 20 69  l file to roll i
2e040 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  t back..**.** If
2e050 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2e060 65 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65  e is already ope
2e070 6e 20 28 61 73 20 69 74 20 6d 61 79 20 62 65 20  n (as it may be 
2e080 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
2e090 65 29 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73  e),.** then this
2e0a0 20 66 75 6e 63 74 69 6f 6e 20 6a 75 73 74 20 77   function just w
2e0b0 72 69 74 65 73 20 61 20 6a 6f 75 72 6e 61 6c 20  rites a journal 
2e0c0 68 65 61 64 65 72 20 74 6f 20 74 68 65 20 73 74  header to the st
2e0d0 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20 61 6c  art of the.** al
2e0e0 72 65 61 64 79 20 6f 70 65 6e 20 66 69 6c 65 2e  ready open file.
2e0f0 20 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20   .**.** Whether 
2e100 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e  or not the journ
2e110 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65  al file is opene
2e120 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
2e130 6f 6e 2c 20 74 68 65 0a 2a 2a 20 50 61 67 65 72  on, the.** Pager
2e140 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 76  .pInJournal bitv
2e150 65 63 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ec structure is 
2e160 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  allocated..**.**
2e170 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
2e180 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20  K if everything 
2e190 69 73 20 73 75 63 63 65 73 73 66 75 6c 2e 20 4f  is successful. O
2e1a0 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e  therwise, return
2e1b0 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45   .** SQLITE_NOME
2e1c0 4d 20 69 66 20 74 68 65 20 61 74 74 65 6d 70 74  M if the attempt
2e1d0 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 50 61 67   to allocate Pag
2e1e0 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 66 61  er.pInJournal fa
2e1f0 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20 61 6e 20 49  ils, or .** an I
2e200 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  O error code if 
2e210 6f 70 65 6e 69 6e 67 20 6f 72 20 77 72 69 74 69  opening or writi
2e220 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ng the journal f
2e230 69 6c 65 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74  ile fails..*/.st
2e240 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 6f  atic int pager_o
2e250 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67 65  pen_journal(Page
2e260 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
2e270 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2e280 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2e290 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
2e2a0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c  rn code */.  sql
2e2b0 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74  ite3_vfs * const
2e2c0 20 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e   pVfs = pPager->
2e2d0 70 56 66 73 3b 20 20 20 2f 2a 20 4c 6f 63 61 6c  pVfs;   /* Local
2e2e0 20 63 61 63 68 65 20 6f 66 20 76 66 73 20 70 6f   cache of vfs po
2e2f0 69 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65  inter */..  asse
2e300 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
2e310 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
2e320 5f 49 4e 49 54 49 41 4c 20 29 3b 0a 20 20 61 73  _INITIAL );.  as
2e330 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
2e340 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
2e350 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
2e360 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
2e370 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49  ==0 );.  .  /* I
2e380 66 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  f already in the
2e390 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 74 68   error state, th
2e3a0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
2e3b0 20 6e 6f 2d 6f 70 2e 20 20 42 75 74 20 6f 6e 0a   no-op.  But on.
2e3c0 20 20 2a 2a 20 74 68 65 20 6f 74 68 65 72 20 68    ** the other h
2e3d0 61 6e 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  and, this routin
2e3e0 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65  e is never calle
2e3f0 64 20 69 66 20 77 65 20 61 72 65 20 61 6c 72 65  d if we are alre
2e400 61 64 79 20 69 6e 0a 20 20 2a 2a 20 61 6e 20 65  ady in.  ** an e
2e410 72 72 6f 72 20 73 74 61 74 65 2e 20 2a 2f 0a 20  rror state. */. 
2e420 20 69 66 28 20 4e 45 56 45 52 28 70 50 61 67 65   if( NEVER(pPage
2e430 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 72 65  r->errCode) ) re
2e440 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72  turn pPager->err
2e450 43 6f 64 65 3b 0a 0a 20 20 69 66 28 20 21 70 61  Code;..  if( !pa
2e460 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
2e470 29 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ) && pPager->jou
2e480 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f  rnalMode!=PAGER_
2e490 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
2e4a0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  ){.    pPager->p
2e4b0 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69  InJournal = sqli
2e4c0 74 65 33 42 69 74 76 65 63 43 72 65 61 74 65 28  te3BitvecCreate(
2e4d0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b  pPager->dbSize);
2e4e0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
2e4f0 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >pInJournal==0 )
2e500 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
2e510 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
2e520 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 4f 70 65   }.  .    /* Ope
2e530 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
2e540 6c 65 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20  le if it is not 
2e550 61 6c 72 65 61 64 79 20 6f 70 65 6e 2e 20 2a 2f  already open. */
2e560 0a 20 20 20 20 69 66 28 20 21 69 73 4f 70 65 6e  .    if( !isOpen
2e570 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b  (pPager->jfd) ){
2e580 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
2e590 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
2e5a0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
2e5b0 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20  E_MEMORY ){.    
2e5c0 20 20 20 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f      sqlite3MemJo
2e5d0 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65 72  urnalOpen(pPager
2e5e0 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 7d 65  ->jfd);.      }e
2e5f0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  lse{.        con
2e600 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 20  st int flags =  
2e610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e620 20 2f 2a 20 56 46 53 20 66 6c 61 67 73 20 74 6f   /* VFS flags to
2e630 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   open journal fi
2e640 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  le */.          
2e650 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
2e660 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45  WRITE|SQLITE_OPE
2e670 4e 5f 43 52 45 41 54 45 7c 0a 20 20 20 20 20 20  N_CREATE|.      
2e680 20 20 20 20 28 70 50 61 67 65 72 2d 3e 74 65 6d      (pPager->tem
2e690 70 46 69 6c 65 20 3f 20 0a 20 20 20 20 20 20 20  pFile ? .       
2e6a0 20 20 20 20 20 28 53 51 4c 49 54 45 5f 4f 50 45       (SQLITE_OPE
2e6b0 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 7c  N_DELETEONCLOSE|
2e6c0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
2e6d0 5f 4a 4f 55 52 4e 41 4c 29 3a 0a 20 20 20 20 20  _JOURNAL):.     
2e6e0 20 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f 4f         (SQLITE_O
2e6f0 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
2e700 29 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20  ).          );. 
2e710 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45   #ifdef SQLITE_E
2e720 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49  NABLE_ATOMIC_WRI
2e730 54 45 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  TE.        rc = 
2e740 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 4f 70  sqlite3JournalOp
2e750 65 6e 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  en(.            
2e760 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
2e770 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e  ournal, pPager->
2e780 6a 66 64 2c 20 66 6c 61 67 73 2c 20 6a 72 6e 6c  jfd, flags, jrnl
2e790 42 75 66 66 65 72 53 69 7a 65 28 70 50 61 67 65  BufferSize(pPage
2e7a0 72 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  r).        );.  
2e7b0 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20 72 63  #else.        rc
2e7c0 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
2e7d0 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
2e7e0 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d  Journal, pPager-
2e7f0 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20 30 29 3b  >jfd, flags, 0);
2e800 0a 20 20 23 65 6e 64 69 66 0a 20 20 20 20 20 20  .  #endif.      
2e810 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
2e820 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
2e830 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
2e840 6a 66 64 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20  jfd) );.    }.  
2e850 0a 20 20 0a 20 20 20 20 2f 2a 20 57 72 69 74 65  .  .    /* Write
2e860 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e   the first journ
2e870 61 6c 20 68 65 61 64 65 72 20 74 6f 20 74 68 65  al header to the
2e880 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e   journal file an
2e890 64 20 6f 70 65 6e 20 0a 20 20 20 20 2a 2a 20 74  d open .    ** t
2e8a0 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69  he sub-journal i
2e8b0 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 20  f necessary..   
2e8c0 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
2e8d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2e8e0 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 43 68 65 63     /* TODO: Chec
2e8f0 6b 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 73  k if all of thes
2e900 65 20 61 72 65 20 72 65 61 6c 6c 79 20 72 65 71  e are really req
2e910 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20  uired. */.      
2e920 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30  pPager->nRec = 0
2e930 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
2e940 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
2e950 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65        pPager->se
2e960 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20  tMaster = 0;.   
2e970 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
2e980 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20 20 20 20  alHdr = 0;.     
2e990 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e   rc = writeJourn
2e9a0 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20  alHdr(pPager);. 
2e9b0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
2e9c0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2e9d0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76  .    sqlite3Bitv
2e9e0 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72  ecDestroy(pPager
2e9f0 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20  ->pInJournal);. 
2ea00 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f     pPager->pInJo
2ea10 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 7d 65 6c  urnal = 0;.  }el
2ea20 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
2ea30 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
2ea40 50 41 47 45 52 5f 57 52 49 54 45 52 5f 49 4e 49  PAGER_WRITER_INI
2ea50 54 49 41 4c 20 29 3b 0a 20 20 20 20 70 50 61 67  TIAL );.    pPag
2ea60 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47  er->eState = PAG
2ea70 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d  ER_WRITER_CACHEM
2ea80 4f 44 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  OD;.  }..  retur
2ea90 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42  n rc;.}../*.** B
2eaa0 65 67 69 6e 20 61 20 77 72 69 74 65 2d 74 72 61  egin a write-tra
2eab0 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20  nsaction on the 
2eac0 73 70 65 63 69 66 69 65 64 20 70 61 67 65 72 20  specified pager 
2ead0 6f 62 6a 65 63 74 2e 20 49 66 20 61 20 0a 2a 2a  object. If a .**
2eae0 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
2eaf0 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  on has already b
2eb00 65 65 6e 20 6f 70 65 6e 65 64 2c 20 74 68 69 73  een opened, this
2eb10 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
2eb20 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  o-op..**.** If t
2eb30 68 65 20 65 78 46 6c 61 67 20 61 72 67 75 6d 65  he exFlag argume
2eb40 6e 74 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65  nt is false, the
2eb50 6e 20 61 63 71 75 69 72 65 20 61 74 20 6c 65 61  n acquire at lea
2eb60 73 74 20 61 20 52 45 53 45 52 56 45 44 0a 2a 2a  st a RESERVED.**
2eb70 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
2eb80 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 65  abase file. If e
2eb90 78 46 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74  xFlag is true, t
2eba0 68 65 6e 20 61 63 71 75 69 72 65 20 61 74 20 6c  hen acquire at l
2ebb0 65 61 73 74 0a 2a 2a 20 61 6e 20 45 58 43 4c 55  east.** an EXCLU
2ebc0 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 73 75  SIVE lock. If su
2ebd0 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 61 6c 72  ch a lock is alr
2ebe0 65 61 64 79 20 68 65 6c 64 2c 20 6e 6f 20 6c 6f  eady held, no lo
2ebf0 63 6b 69 6e 67 20 0a 2a 2a 20 66 75 6e 63 74 69  cking .** functi
2ec00 6f 6e 73 20 6e 65 65 64 20 62 65 20 63 61 6c 6c  ons need be call
2ec10 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69  ed..**.** If thi
2ec20 73 20 69 73 20 6e 6f 74 20 61 20 74 65 6d 70 6f  s is not a tempo
2ec30 72 61 72 79 20 6f 72 20 69 6e 2d 6d 65 6d 6f 72  rary or in-memor
2ec40 79 20 66 69 6c 65 20 61 6e 64 2c 20 74 68 65 20  y file and, the 
2ec50 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
2ec60 0a 2a 2a 20 6f 70 65 6e 65 64 20 69 66 20 69 74  .** opened if it
2ec70 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c   has not been al
2ec80 72 65 61 64 79 2e 20 46 6f 72 20 61 20 74 65 6d  ready. For a tem
2ec90 70 6f 72 61 72 79 20 66 69 6c 65 2c 20 74 68 65  porary file, the
2eca0 20 6f 70 65 6e 69 6e 67 20 0a 2a 2a 20 6f 66 20   opening .** of 
2ecb0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2ecc0 20 69 73 20 64 65 66 65 72 72 65 64 20 75 6e 74   is deferred unt
2ecd0 69 6c 20 74 68 65 72 65 20 69 73 20 61 6e 20 61  il there is an a
2ece0 63 74 75 61 6c 20 6e 65 65 64 20 74 6f 20 0a 2a  ctual need to .*
2ecf0 2a 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a  * write to the j
2ed00 6f 75 72 6e 61 6c 2e 20 54 4f 44 4f 3a 20 57 68  ournal. TODO: Wh
2ed10 79 20 68 61 6e 64 6c 65 20 74 65 6d 70 6f 72 61  y handle tempora
2ed20 72 79 20 66 69 6c 65 73 20 64 69 66 66 65 72 65  ry files differe
2ed30 6e 74 6c 79 3f 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ntly?.**.** If t
2ed40 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2ed50 69 73 20 6f 70 65 6e 65 64 20 28 6f 72 20 69 66  is opened (or if
2ed60 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 6f   it is already o
2ed70 70 65 6e 29 2c 20 74 68 65 6e 20 61 0a 2a 2a 20  pen), then a.** 
2ed80 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 69  journal-header i
2ed90 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  s written to the
2eda0 20 73 74 61 72 74 20 6f 66 20 69 74 2e 0a 2a 2a   start of it..**
2edb0 0a 2a 2a 20 49 66 20 74 68 65 20 73 75 62 6a 49  .** If the subjI
2edc0 6e 4d 65 6d 6f 72 79 20 61 72 67 75 6d 65 6e 74  nMemory argument
2edd0 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
2ede0 65 6e 20 61 6e 79 20 73 75 62 2d 6a 6f 75 72 6e  en any sub-journ
2edf0 61 6c 20 6f 70 65 6e 65 64 0a 2a 2a 20 77 69 74  al opened.** wit
2ee00 68 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63  hin this transac
2ee10 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 6f 70 65  tion will be ope
2ee20 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d 65 6d  ned as an in-mem
2ee30 6f 72 79 20 66 69 6c 65 2e 20 54 68 69 73 0a 2a  ory file. This.*
2ee40 2a 20 68 61 73 20 6e 6f 20 65 66 66 65 63 74 20  * has no effect 
2ee50 69 66 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  if the sub-journ
2ee60 61 6c 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70  al is already op
2ee70 65 6e 65 64 20 28 61 73 20 69 74 20 6d 61 79 20  ened (as it may 
2ee80 62 65 20 77 68 65 6e 0a 2a 2a 20 72 75 6e 6e 69  be when.** runni
2ee90 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  ng in exclusive 
2eea0 6d 6f 64 65 29 20 6f 72 20 69 66 20 74 68 65 20  mode) or if the 
2eeb0 74 72 61 6e 73 61 63 74 69 6f 6e 20 64 6f 65 73  transaction does
2eec0 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61 0a 2a   not require a.*
2eed0 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 49  * sub-journal. I
2eee0 66 20 74 68 65 20 73 75 62 6a 49 6e 4d 65 6d 6f  f the subjInMemo
2eef0 72 79 20 61 72 67 75 6d 65 6e 74 20 69 73 20 7a  ry argument is z
2ef00 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20 72 65  ero, then any re
2ef10 71 75 69 72 65 64 0a 2a 2a 20 73 75 62 2d 6a 6f  quired.** sub-jo
2ef20 75 72 6e 61 6c 20 69 73 20 69 6d 70 6c 65 6d 65  urnal is impleme
2ef30 6e 74 65 64 20 69 6e 2d 6d 65 6d 6f 72 79 20 69  nted in-memory i
2ef40 66 20 70 50 61 67 65 72 20 69 73 20 61 6e 20 69  f pPager is an i
2ef50 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
2ef60 65 2c 20 0a 2a 2a 20 6f 72 20 75 73 69 6e 67 20  e, .** or using 
2ef70 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
2ef80 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69   otherwise..*/.i
2ef90 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 42  nt sqlite3PagerB
2efa0 65 67 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67  egin(Pager *pPag
2efb0 65 72 2c 20 69 6e 74 20 65 78 46 6c 61 67 2c 20  er, int exFlag, 
2efc0 69 6e 74 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79  int subjInMemory
2efd0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
2efe0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72  LITE_OK;.  asser
2eff0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
2f000 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e>=PAGER_READER 
2f010 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 75 62  );.  pPager->sub
2f020 6a 49 6e 4d 65 6d 6f 72 79 20 3d 20 28 75 38 29  jInMemory = (u8)
2f030 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 0a 0a 20  subjInMemory;.. 
2f040 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74   if( pPager->eSt
2f050 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45  ate==PAGER_READE
2f060 52 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  R ){.    assert(
2f070 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
2f080 6e 61 6c 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 69  nal==0 );..    i
2f090 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  f( pagerUseWal(p
2f0a0 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
2f0b0 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  /* If the pager 
2f0c0 69 73 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f  is configured to
2f0d0 20 75 73 65 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64   use locking_mod
2f0e0 65 3d 65 78 63 6c 75 73 69 76 65 2c 20 61 6e 64  e=exclusive, and
2f0f0 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20 65 78 63   an.      ** exc
2f100 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74  lusive lock on t
2f110 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6e  he database is n
2f120 6f 74 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c  ot already held,
2f130 20 6f 62 74 61 69 6e 20 69 74 20 6e 6f 77 2e 0a   obtain it now..
2f140 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
2f150 66 28 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  f( pPager->exclu
2f160 73 69 76 65 4d 6f 64 65 20 26 26 20 73 71 6c 69  siveMode && sqli
2f170 74 65 33 57 61 6c 45 78 63 6c 75 73 69 76 65 4d  te3WalExclusiveM
2f180 6f 64 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ode(pPager->pWal
2f190 2c 20 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20  , -1) ){.       
2f1a0 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 28   rc = pagerLock(
2f1b0 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56  pPager, EXCLUSIV
2f1c0 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20  E_LOCK);.       
2f1d0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2f1e0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
2f1f0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
2f200 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
2f210 69 74 65 33 57 61 6c 45 78 63 6c 75 73 69 76 65  ite3WalExclusive
2f220 4d 6f 64 65 28 70 50 61 67 65 72 2d 3e 70 57 61  Mode(pPager->pWa
2f230 6c 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  l, 1);.      }..
2f240 20 20 20 20 20 20 2f 2a 20 47 72 61 62 20 74 68        /* Grab th
2f250 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20  e write lock on 
2f260 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20 49 66  the log file. If
2f270 20 73 75 63 63 65 73 73 66 75 6c 2c 20 75 70 67   successful, upg
2f280 72 61 64 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a  rade to.      **
2f290 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20   PAGER_RESERVED 
2f2a0 73 74 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65  state. Otherwise
2f2b0 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  , return an erro
2f2c0 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61  r code to the ca
2f2d0 6c 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2a 20 54  ller..      ** T
2f2e0 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20  he busy-handler 
2f2f0 69 73 20 6e 6f 74 20 69 6e 76 6f 6b 65 64 20 69  is not invoked i
2f300 66 20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e 65 63  f another connec
2f310 74 69 6f 6e 20 61 6c 72 65 61 64 79 0a 20 20 20  tion already.   
2f320 20 20 20 2a 2a 20 68 6f 6c 64 73 20 74 68 65 20     ** holds the 
2f330 77 72 69 74 65 2d 6c 6f 63 6b 2e 20 49 66 20 70  write-lock. If p
2f340 6f 73 73 69 62 6c 65 2c 20 74 68 65 20 75 70 70  ossible, the upp
2f350 65 72 20 6c 61 79 65 72 20 77 69 6c 6c 20 63 61  er layer will ca
2f360 6c 6c 20 69 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  ll it..      */.
2f370 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2f380 65 33 57 61 6c 42 65 67 69 6e 57 72 69 74 65 54  e3WalBeginWriteT
2f390 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
2f3a0 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20 7d 65  r->pWal);.    }e
2f3b0 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 62  lse{.      /* Ob
2f3c0 74 61 69 6e 20 61 20 52 45 53 45 52 56 45 44 20  tain a RESERVED 
2f3d0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
2f3e0 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68  base file. If th
2f3f0 65 20 65 78 46 6c 61 67 20 70 61 72 61 6d 65 74  e exFlag paramet
2f400 65 72 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 74  er.      ** is t
2f410 72 75 65 2c 20 74 68 65 6e 20 69 6d 6d 65 64 69  rue, then immedi
2f420 61 74 65 6c 79 20 75 70 67 72 61 64 65 20 74 68  ately upgrade th
2f430 69 73 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49  is to an EXCLUSI
2f440 56 45 20 6c 6f 63 6b 2e 20 54 68 65 0a 20 20 20  VE lock. The.   
2f450 20 20 20 2a 2a 20 62 75 73 79 2d 68 61 6e 64 6c     ** busy-handl
2f460 65 72 20 63 61 6c 6c 62 61 63 6b 20 63 61 6e 20  er callback can 
2f470 62 65 20 75 73 65 64 20 77 68 65 6e 20 75 70 67  be used when upg
2f480 72 61 64 69 6e 67 20 74 6f 20 74 68 65 20 45 58  rading to the EX
2f490 43 4c 55 53 49 56 45 0a 20 20 20 20 20 20 2a 2a  CLUSIVE.      **
2f4a0 20 6c 6f 63 6b 2c 20 62 75 74 20 6e 6f 74 20 77   lock, but not w
2f4b0 68 65 6e 20 6f 62 74 61 69 6e 69 6e 67 20 74 68  hen obtaining th
2f4c0 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e  e RESERVED lock.
2f4d0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2f4e0 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 28 70  rc = pagerLock(p
2f4f0 50 61 67 65 72 2c 20 52 45 53 45 52 56 45 44 5f  Pager, RESERVED_
2f500 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28  LOCK);.      if(
2f510 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2f520 26 20 65 78 46 6c 61 67 20 29 7b 0a 20 20 20 20  & exFlag ){.    
2f530 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
2f540 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67  ait_on_lock(pPag
2f550 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  er, EXCLUSIVE_LO
2f560 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  CK);.      }.   
2f570 20 7d 0a 0a 0a 20 20 20 20 69 66 28 20 72 63 3d   }...    if( rc=
2f580 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2f590 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 20 74 6f      /* Change to
2f5a0 20 57 52 49 54 45 52 5f 49 4e 49 54 49 41 4c 20   WRITER_INITIAL 
2f5b0 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2a 0a  state..      **.
2f5c0 20 20 20 20 20 20 2a 2a 20 57 41 4c 20 6d 6f 64        ** WAL mod
2f5d0 65 20 73 65 74 73 20 50 61 67 65 72 2e 65 53 74  e sets Pager.eSt
2f5e0 61 74 65 20 74 6f 20 50 41 47 45 52 5f 57 52 49  ate to PAGER_WRI
2f5f0 54 45 52 5f 49 4e 49 54 49 41 4c 20 6f 72 20 43  TER_INITIAL or C
2f600 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 2a 2a  ACHEMOD.      **
2f610 20 77 68 65 6e 20 69 74 20 68 61 73 20 61 6e 20   when it has an 
2f620 6f 70 65 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e  open transaction
2f630 2c 20 62 75 74 20 6e 65 76 65 72 20 74 6f 20 44  , but never to D
2f640 42 4d 4f 44 20 6f 72 20 46 49 4e 49 53 48 45 44  BMOD or FINISHED
2f650 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20  ..      ** This 
2f660 69 73 20 62 65 63 61 75 73 65 20 69 6e 20 74 68  is because in th
2f670 6f 73 65 20 73 74 61 74 65 73 20 74 68 65 20 63  ose states the c
2f680 6f 64 65 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b  ode to roll back
2f690 20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 20 20   savepoint .    
2f6a0 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
2f6b0 73 20 6d 61 79 20 63 6f 70 79 20 64 61 74 61 20  s may copy data 
2f6c0 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75  from the sub-jou
2f6d0 72 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20 64 61  rnal into the da
2f6e0 74 61 62 61 73 65 20 0a 20 20 20 20 20 20 2a 2a  tabase .      **
2f6f0 20 66 69 6c 65 20 61 73 20 77 65 6c 6c 20 61 73   file as well as
2f700 20 69 6e 74 6f 20 74 68 65 20 70 61 67 65 20 63   into the page c
2f710 61 63 68 65 2e 20 57 68 69 63 68 20 77 6f 75 6c  ache. Which woul
2f720 64 20 62 65 20 69 6e 63 6f 72 72 65 63 74 20 69  d be incorrect i
2f730 6e 20 0a 20 20 20 20 20 20 2a 2a 20 57 41 4c 20  n .      ** WAL 
2f740 6d 6f 64 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  mode..      */. 
2f750 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74       pPager->eSt
2f760 61 74 65 20 3d 20 50 41 47 45 52 5f 57 52 49 54  ate = PAGER_WRIT
2f770 45 52 5f 49 4e 49 54 49 41 4c 3b 0a 20 20 20 20  ER_INITIAL;.    
2f780 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65    pPager->dbFile
2f790 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
2f7a0 62 4f 72 69 67 53 69 7a 65 20 3d 20 70 50 61 67  bOrigSize = pPag
2f7b0 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20  er->dbSize;.    
2f7c0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
2f7d0 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 7d 65  lOff = 0;.    }e
2f7e0 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 67  lse{.      /* Ig
2f7f0 6e 6f 72 65 20 61 6e 79 20 49 4f 20 65 72 72 6f  nore any IO erro
2f800 72 20 74 68 61 74 20 6f 63 63 75 72 73 20 77 69  r that occurs wi
2f810 74 68 69 6e 20 70 61 67 65 72 5f 65 6e 64 5f 74  thin pager_end_t
2f820 72 61 6e 73 61 63 74 69 6f 6e 28 29 2e 20 54 68  ransaction(). Th
2f830 65 0a 20 20 20 20 20 20 2a 2a 20 70 75 72 70 6f  e.      ** purpo
2f840 73 65 20 6f 66 20 74 68 69 73 20 63 61 6c 6c 20  se of this call 
2f850 69 73 20 74 6f 20 72 65 73 65 74 20 74 68 65 20  is to reset the 
2f860 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20 6f  internal state o
2f870 66 20 74 68 65 20 70 61 67 65 72 0a 20 20 20 20  f the pager.    
2f880 20 20 2a 2a 20 73 75 62 2d 73 79 73 74 65 6d 2e    ** sub-system.
2f890 20 49 74 20 64 6f 65 73 6e 27 74 20 6d 61 74 74   It doesn't matt
2f8a0 65 72 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61  er if the journa
2f8b0 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20 70 72  l-file is not pr
2f8c0 6f 70 65 72 6c 79 0a 20 20 20 20 20 20 2a 2a 20  operly.      ** 
2f8d0 66 69 6e 61 6c 69 7a 65 64 20 61 74 20 74 68 69  finalized at thi
2f8e0 73 20 70 6f 69 6e 74 20 28 73 69 6e 63 65 20 69  s point (since i
2f8f0 74 20 69 73 20 6e 6f 74 20 61 20 76 61 6c 69 64  t is not a valid
2f900 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e   journal file an
2f910 79 77 61 79 29 2e 0a 20 20 20 20 20 20 2a 2f 0a  yway)..      */.
2f920 20 20 20 20 20 20 70 61 67 65 72 5f 65 6e 64 5f        pager_end_
2f930 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  transaction(pPag
2f940 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20  er, 0);.    }.. 
2f950 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
2f960 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67  QLITE_OK || pPag
2f970 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
2f980 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 20 20  R_READER );.    
2f990 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
2f9a0 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d  TE_OK || pPager-
2f9b0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
2f9c0 52 49 54 45 52 5f 49 4e 49 54 49 41 4c 20 29 3b  RITER_INITIAL );
2f9d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 73 73  .    assert( ass
2f9e0 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
2f9f0 70 50 61 67 65 72 29 20 29 3b 0a 20 20 7d 0a 0a  pPager) );.  }..
2fa00 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 54    PAGERTRACE(("T
2fa10 52 41 4e 53 41 43 54 49 4f 4e 20 25 64 5c 6e 22  RANSACTION %d\n"
2fa20 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
2fa30 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  )));.  return rc
2fa40 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20  ;.}../*.** Mark 
2fa50 61 20 73 69 6e 67 6c 65 20 64 61 74 61 20 70 61  a single data pa
2fa60 67 65 20 61 73 20 77 72 69 74 65 61 62 6c 65 2e  ge as writeable.
2fa70 20 54 68 65 20 70 61 67 65 20 69 73 20 77 72 69   The page is wri
2fa80 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 0a 2a  tten into the .*
2fa90 2a 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 6f  * main journal o
2faa0 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 61 73  r sub-journal as
2fab0 20 72 65 71 75 69 72 65 64 2e 20 49 66 20 74 68   required. If th
2fac0 65 20 70 61 67 65 20 69 73 20 77 72 69 74 74 65  e page is writte
2fad0 6e 20 69 6e 74 6f 0a 2a 2a 20 6f 6e 65 20 6f 66  n into.** one of
2fae0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 2c 20 74   the journals, t
2faf0 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
2fb00 20 62 69 74 20 69 73 20 73 65 74 20 69 6e 20 74   bit is set in t
2fb10 68 65 20 0a 2a 2a 20 50 61 67 65 72 2e 70 49 6e  he .** Pager.pIn
2fb20 4a 6f 75 72 6e 61 6c 20 62 69 74 76 65 63 20 61  Journal bitvec a
2fb30 6e 64 20 74 68 65 20 50 61 67 65 72 53 61 76 65  nd the PagerSave
2fb40 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69  point.pInSavepoi
2fb50 6e 74 20 62 69 74 76 65 63 73 0a 2a 2a 20 6f 66  nt bitvecs.** of
2fb60 20 61 6e 79 20 6f 70 65 6e 20 73 61 76 65 70 6f   any open savepo
2fb70 69 6e 74 73 20 61 73 20 61 70 70 72 6f 70 72 69  ints as appropri
2fb80 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ate..*/.static i
2fb90 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65 28 50  nt pager_write(P
2fba0 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 76 6f  gHdr *pPg){.  vo
2fbb0 69 64 20 2a 70 44 61 74 61 20 3d 20 70 50 67 2d  id *pData = pPg-
2fbc0 3e 70 44 61 74 61 3b 0a 20 20 50 61 67 65 72 20  >pData;.  Pager 
2fbd0 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
2fbe0 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 20  Pager;.  int rc 
2fbf0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
2fc00 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  /* This routine 
2fc10 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 75 6e  is not called un
2fc20 6c 65 73 73 20 61 20 77 72 69 74 65 2d 74 72 61  less a write-tra
2fc30 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72  nsaction has alr
2fc40 65 61 64 79 20 0a 20 20 2a 2a 20 62 65 65 6e 20  eady .  ** been 
2fc50 73 74 61 72 74 65 64 2e 20 54 68 65 20 6a 6f 75  started. The jou
2fc60 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f 72  rnal file may or
2fc70 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 70 65 6e   may not be open
2fc80 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a   at this point..
2fc90 20 20 2a 2a 20 49 74 20 69 73 20 6e 65 76 65 72    ** It is never
2fca0 20 63 61 6c 6c 65 64 20 69 6e 20 74 68 65 20 45   called in the E
2fcb0 52 52 4f 52 20 73 74 61 74 65 2e 0a 20 20 2a 2f  RROR state..  */
2fcc0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
2fcd0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
2fce0 5f 57 52 49 54 45 52 5f 49 4e 49 54 49 41 4c 0a  _WRITER_INITIAL.
2fcf0 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72         || pPager
2fd00 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
2fd10 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a  WRITER_CACHEMOD.
2fd20 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72         || pPager
2fd30 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
2fd40 57 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20 20 29  WRITER_DBMOD.  )
2fd50 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65  ;.  assert( asse
2fd60 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
2fd70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 2f 2a 20  Pager) );..  /* 
2fd80 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20  If an error has 
2fd90 62 65 65 6e 20 70 72 65 76 69 6f 75 73 6c 79 20  been previously 
2fda0 64 65 74 65 63 74 65 64 2c 20 72 65 70 6f 72 74  detected, report
2fdb0 20 74 68 65 20 73 61 6d 65 20 65 72 72 6f 72 0a   the same error.
2fdc0 20 20 2a 2a 20 61 67 61 69 6e 2e 20 54 68 69 73    ** again. This
2fdd0 20 73 68 6f 75 6c 64 20 6e 6f 74 20 68 61 70 70   should not happ
2fde0 65 6e 2c 20 62 75 74 20 74 68 65 20 63 68 65 63  en, but the chec
2fdf0 6b 20 70 72 6f 76 69 64 65 73 20 72 6f 62 75 73  k provides robus
2fe00 74 6e 65 73 73 2e 20 2a 2f 0a 20 20 69 66 28 20  tness. */.  if( 
2fe10 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e 65 72  NEVER(pPager->er
2fe20 72 43 6f 64 65 29 20 29 20 20 72 65 74 75 72 6e  rCode) )  return
2fe30 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
2fe40 3b 0a 0a 20 20 2f 2a 20 48 69 67 68 65 72 2d 6c  ;..  /* Higher-l
2fe50 65 76 65 6c 20 72 6f 75 74 69 6e 65 73 20 6e 65  evel routines ne
2fe60 76 65 72 20 63 61 6c 6c 20 74 68 69 73 20 66 75  ver call this fu
2fe70 6e 63 74 69 6f 6e 20 69 66 20 64 61 74 61 62 61  nction if databa
2fe80 73 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 77  se is not.  ** w
2fe90 72 69 74 61 62 6c 65 2e 20 20 42 75 74 20 63 68  ritable.  But ch
2fea0 65 63 6b 20 61 6e 79 77 61 79 2c 20 6a 75 73 74  eck anyway, just
2feb0 20 66 6f 72 20 72 6f 62 75 73 74 6e 65 73 73 2e   for robustness.
2fec0 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28   */.  if( NEVER(
2fed0 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79  pPager->readOnly
2fee0 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ) ) return SQLIT
2fef0 45 5f 50 45 52 4d 3b 0a 0a 20 20 43 48 45 43 4b  E_PERM;..  CHECK
2ff00 5f 50 41 47 45 28 70 50 67 29 3b 0a 0a 20 20 2f  _PAGE(pPg);..  /
2ff10 2a 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20  * Mark the page 
2ff20 61 73 20 64 69 72 74 79 2e 20 20 49 66 20 74 68  as dirty.  If th
2ff30 65 20 70 61 67 65 20 68 61 73 20 61 6c 72 65 61  e page has alrea
2ff40 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 0a  dy been written.
2ff50 20 20 2a 2a 20 74 6f 20 74 68 65 20 6a 6f 75 72    ** to the jour
2ff60 6e 61 6c 20 74 68 65 6e 20 77 65 20 63 61 6e 20  nal then we can 
2ff70 72 65 74 75 72 6e 20 72 69 67 68 74 20 61 77 61  return right awa
2ff80 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  y..  */.  sqlite
2ff90 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79  3PcacheMakeDirty
2ffa0 28 70 50 67 29 3b 0a 20 20 69 66 28 20 70 61 67  (pPg);.  if( pag
2ffb0 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20  eInJournal(pPg) 
2ffc0 26 26 20 21 73 75 62 6a 52 65 71 75 69 72 65 73  && !subjRequires
2ffd0 50 61 67 65 28 70 50 67 29 20 29 7b 0a 20 20 20  Page(pPg) ){.   
2ffe0 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
2fff0 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
30000 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
30010 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
30020 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d  ER_WRITER_CACHEM
30030 4f 44 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 0a  OD );.  }else{..
30040 20 20 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74      /* If we get
30050 20 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d 65   this far, it me
30060 61 6e 73 20 74 68 61 74 20 74 68 65 20 70 61 67  ans that the pag
30070 65 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20  e needs to be.  
30080 20 20 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20    ** written to 
30090 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
300a0 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 68 65 20 63  journal or the c
300b0 68 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61  heckpoint journa
300c0 6c 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f 74 68  l.    ** or both
300d0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
300e0 48 69 67 68 65 72 20 6c 65 76 65 6c 20 72 6f 75  Higher level rou
300f0 74 69 6e 65 73 20 68 61 76 65 20 61 6c 72 65 61  tines have alrea
30100 64 79 20 6f 62 74 61 69 6e 65 64 20 74 68 65 20  dy obtained the 
30110 6e 65 63 65 73 73 61 72 79 20 6c 6f 63 6b 73 0a  necessary locks.
30120 20 20 20 20 2a 2a 20 74 6f 20 62 65 67 69 6e 20      ** to begin 
30130 74 68 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61  the write-transa
30140 63 74 69 6f 6e 2c 20 62 75 74 20 74 68 65 20 72  ction, but the r
30150 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
30160 6d 69 67 68 74 20 6e 6f 74 20 0a 20 20 20 20 2a  might not .    *
30170 2a 20 79 65 74 20 62 65 20 6f 70 65 6e 2e 20 4f  * yet be open. O
30180 70 65 6e 20 69 74 20 6e 6f 77 20 69 66 20 74 68  pen it now if th
30190 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2e 0a  is is the case..
301a0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
301b0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
301c0 41 47 45 52 5f 57 52 49 54 45 52 5f 49 4e 49 54  AGER_WRITER_INIT
301d0 49 41 4c 20 29 7b 0a 20 20 20 20 20 20 72 63 20  IAL ){.      rc 
301e0 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75  = pager_open_jou
301f0 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
30200 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
30210 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
30220 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  c;.    }.    ass
30230 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
30240 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45  ate>=PAGER_WRITE
30250 52 5f 43 41 43 48 45 4d 4f 44 20 29 3b 0a 20 20  R_CACHEMOD );.  
30260 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74    assert( assert
30270 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61  _pager_state(pPa
30280 67 65 72 29 20 29 3b 0a 20 20 0a 20 20 20 20 2f  ger) );.  .    /
30290 2a 20 54 68 65 20 74 72 61 6e 73 61 63 74 69 6f  * The transactio
302a0 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20 65 78  n journal now ex
302b0 69 73 74 73 20 61 6e 64 20 77 65 20 68 61 76 65  ists and we have
302c0 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 61   a RESERVED or a
302d0 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49  n.    ** EXCLUSI
302e0 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6d  VE lock on the m
302f0 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
30300 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 63 75  e.  Write the cu
30310 72 72 65 6e 74 20 70 61 67 65 20 74 6f 0a 20 20  rrent page to.  
30320 20 20 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63    ** the transac
30330 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 69 66 20  tion journal if 
30340 69 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65 20  it is not there 
30350 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a  already..    */.
30360 20 20 20 20 69 66 28 20 21 70 61 67 65 49 6e 4a      if( !pageInJ
30370 6f 75 72 6e 61 6c 28 70 50 67 29 20 26 26 20 21  ournal(pPg) && !
30380 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
30390 65 72 29 20 29 7b 0a 20 20 20 20 20 20 61 73 73  er) ){.      ass
303a0 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c  ert( pagerUseWal
303b0 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20  (pPager)==0 );. 
303c0 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67       if( pPg->pg
303d0 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72  no<=pPager->dbOr
303e0 69 67 53 69 7a 65 20 26 26 20 69 73 4f 70 65 6e  igSize && isOpen
303f0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b  (pPager->jfd) ){
30400 0a 20 20 20 20 20 20 20 20 75 33 32 20 63 6b 73  .        u32 cks
30410 75 6d 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72  um;.        char
30420 20 2a 70 44 61 74 61 32 3b 0a 0a 20 20 20 20 20   *pData2;..     
30430 20 20 20 2f 2a 20 57 65 20 73 68 6f 75 6c 64 20     /* We should 
30440 6e 65 76 65 72 20 77 72 69 74 65 20 74 6f 20 74  never write to t
30450 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
30460 74 68 65 20 70 61 67 65 20 74 68 61 74 0a 20 20  the page that.  
30470 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e        ** contain
30480 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6c  s the database l
30490 6f 63 6b 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  ocks.  The follo
304a0 77 69 6e 67 20 61 73 73 65 72 74 20 76 65 72 69  wing assert veri
304b0 66 69 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  fies.        ** 
304c0 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 2e 20  that we do not. 
304d0 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
304e0 74 28 20 70 50 67 2d 3e 70 67 6e 6f 21 3d 50 41  t( pPg->pgno!=PA
304f0 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
30500 65 72 29 20 29 3b 0a 0a 20 20 20 20 20 20 20 20  er) );..        
30510 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
30520 6a 6f 75 72 6e 61 6c 48 64 72 20 3c 3d 20 70 50  journalHdr <= pP
30530 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
30540 20 29 3b 0a 20 20 20 20 20 20 20 20 43 4f 44 45   );.        CODE
30550 43 32 28 70 50 61 67 65 72 2c 20 70 44 61 74 61  C2(pPager, pData
30560 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20  , pPg->pgno, 7, 
30570 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
30580 4d 45 4d 2c 20 70 44 61 74 61 32 29 3b 0a 20 20  MEM, pData2);.  
30590 20 20 20 20 20 20 63 6b 73 75 6d 20 3d 20 70 61        cksum = pa
305a0 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72  ger_cksum(pPager
305b0 2c 20 28 75 38 2a 29 70 44 61 74 61 32 29 3b 0a  , (u8*)pData2);.
305c0 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69          rc = wri
305d0 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  te32bits(pPager-
305e0 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  >jfd, pPager->jo
305f0 75 72 6e 61 6c 4f 66 66 2c 20 70 50 67 2d 3e 70  urnalOff, pPg->p
30600 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66  gno);.        if
30610 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
30620 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
30630 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
30640 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 44  (pPager->jfd, pD
30650 61 74 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61  ata2, pPager->pa
30660 67 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20  geSize,.        
30670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30680 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
30690 75 72 6e 61 6c 4f 66 66 20 2b 20 34 29 3b 0a 20  urnalOff + 4);. 
306a0 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
306b0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 70  >journalOff += p
306c0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b  Pager->pageSize+
306d0 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  4;.        }.   
306e0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
306f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
30700 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32      rc = write32
30710 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
30720 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
30730 6c 4f 66 66 2c 20 63 6b 73 75 6d 29 3b 0a 20 20  lOff, cksum);.  
30740 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
30750 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 34 3b  journalOff += 4;
30760 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
30770 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 4f 55     IOTRACE(("JOU
30780 54 20 25 70 20 25 64 20 25 6c 6c 64 20 25 64 5c  T %p %d %lld %d\
30790 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d  n", pPager, pPg-
307a0 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 20 20 20 20  >pgno, .        
307b0 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
307c0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 50 61  >journalOff, pPa
307d0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 29 3b  ger->pageSize));
307e0 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 5f 49  .        PAGER_I
307f0 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65  NCR(sqlite3_page
30800 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 29 3b  r_writej_count);
30810 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52  .        PAGERTR
30820 41 43 45 28 28 22 4a 4f 55 52 4e 41 4c 20 25 64  ACE(("JOURNAL %d
30830 20 70 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e   page %d needSyn
30840 63 3d 25 64 20 68 61 73 68 28 25 30 38 78 29 5c  c=%d hash(%08x)\
30850 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
30860 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
30870 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20  , pPg->pgno, .  
30880 20 20 20 20 20 20 20 20 20 20 20 28 28 70 50 67             ((pPg
30890 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45  ->flags&PGHDR_NE
308a0 45 44 5f 53 59 4e 43 29 3f 31 3a 30 29 2c 20 70  ED_SYNC)?1:0), p
308b0 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
308c0 67 29 29 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f  g)));..        /
308d0 2a 20 45 76 65 6e 20 69 66 20 61 6e 20 49 4f 20  * Even if an IO 
308e0 6f 72 20 64 69 73 6b 66 75 6c 6c 20 65 72 72 6f  or diskfull erro
308f0 72 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65  r occurred while
30900 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 74 68 65   journalling the
30910 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65  .        ** page
30920 20 69 6e 20 74 68 65 20 62 6c 6f 63 6b 20 61 62   in the block ab
30930 6f 76 65 2c 20 73 65 74 20 74 68 65 20 6e 65 65  ove, set the nee
30940 64 2d 73 79 6e 63 20 66 6c 61 67 20 66 6f 72 20  d-sync flag for 
30950 74 68 65 20 70 61 67 65 2e 0a 20 20 20 20 20 20  the page..      
30960 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20    ** Otherwise, 
30970 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63  when the transac
30980 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
30990 61 63 6b 2c 20 74 68 65 20 6c 6f 67 69 63 20 69  ack, the logic i
309a0 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6c 61  n.        ** pla
309b0 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29  yback_one_page()
309c0 20 77 69 6c 6c 20 74 68 69 6e 6b 20 74 68 61 74   will think that
309d0 20 74 68 65 20 70 61 67 65 20 6e 65 65 64 73 20   the page needs 
309e0 74 6f 20 62 65 20 72 65 73 74 6f 72 65 64 0a 20  to be restored. 
309f0 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65         ** in the
30a00 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
30a10 41 6e 64 20 69 66 20 61 6e 20 49 4f 20 65 72 72  And if an IO err
30a20 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
30a30 64 6f 69 6e 67 20 73 6f 2c 0a 20 20 20 20 20 20  doing so,.      
30a40 20 20 2a 2a 20 74 68 65 6e 20 63 6f 72 72 75 70    ** then corrup
30a50 74 69 6f 6e 20 6d 61 79 20 66 6f 6c 6c 6f 77 2e  tion may follow.
30a60 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
30a70 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c      pPg->flags |
30a80 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  = PGHDR_NEED_SYN
30a90 43 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 41  C;..        /* A
30aa0 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75  n error has occu
30ab0 72 72 65 64 20 77 72 69 74 69 6e 67 20 74 6f 20  rred writing to 
30ac0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
30ad0 2e 20 54 68 65 20 0a 20 20 20 20 20 20 20 20 2a  . The .        *
30ae0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69  * transaction wi
30af0 6c 6c 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  ll be rolled bac
30b00 6b 20 62 79 20 74 68 65 20 6c 61 79 65 72 20 61  k by the layer a
30b10 62 6f 76 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f  bove..        */
30b20 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
30b30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
30b40 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
30b50 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  c;.        }..  
30b60 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52        pPager->nR
30b70 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73  ec++;.        as
30b80 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49  sert( pPager->pI
30b90 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20  nJournal!=0 );. 
30ba0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
30bb0 74 65 33 42 69 74 76 65 63 53 65 74 28 70 50 61  te3BitvecSet(pPa
30bc0 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c  ger->pInJournal,
30bd0 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
30be0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
30bf0 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
30c00 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
30c10 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
30c20 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e   || rc==SQLITE_N
30c30 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20  OMEM );.        
30c40 72 63 20 7c 3d 20 61 64 64 54 6f 53 61 76 65 70  rc |= addToSavep
30c50 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50 61 67  ointBitvecs(pPag
30c60 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  er, pPg->pgno);.
30c70 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
30c80 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
30c90 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72         assert( r
30ca0 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
30cb0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
30cc0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
30cd0 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
30ce0 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
30cf0 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
30d00 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 29 7b  _WRITER_DBMOD ){
30d10 0a 20 20 20 20 20 20 20 20 20 20 70 50 67 2d 3e  .          pPg->
30d20 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e  flags |= PGHDR_N
30d30 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20  EED_SYNC;.      
30d40 20 20 7d 0a 20 20 20 20 20 20 20 20 50 41 47 45    }.        PAGE
30d50 52 54 52 41 43 45 28 28 22 41 50 50 45 4e 44 20  RTRACE(("APPEND 
30d60 25 64 20 70 61 67 65 20 25 64 20 6e 65 65 64 53  %d page %d needS
30d70 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  ync=%d\n",.     
30d80 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52             PAGER
30d90 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
30da0 3e 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  >pgno,.         
30db0 20 20 20 20 20 20 28 28 70 50 67 2d 3e 66 6c 61        ((pPg->fla
30dc0 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
30dd0 4e 43 29 3f 31 3a 30 29 29 29 3b 0a 20 20 20 20  NC)?1:0)));.    
30de0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
30df0 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61 74 65   /* If the state
30e00 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20  ment journal is 
30e10 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67  open and the pag
30e20 65 20 69 73 20 6e 6f 74 20 69 6e 20 69 74 2c 0a  e is not in it,.
30e30 20 20 20 20 2a 2a 20 74 68 65 6e 20 77 72 69 74      ** then writ
30e40 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  e the current pa
30e50 67 65 20 74 6f 20 74 68 65 20 73 74 61 74 65 6d  ge to the statem
30e60 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4e 6f  ent journal.  No
30e70 74 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74  te that.    ** t
30e80 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
30e90 72 6e 61 6c 20 66 6f 72 6d 61 74 20 64 69 66 66  rnal format diff
30ea0 65 72 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61  ers from the sta
30eb0 6e 64 61 72 64 20 6a 6f 75 72 6e 61 6c 20 66 6f  ndard journal fo
30ec0 72 6d 61 74 0a 20 20 20 20 2a 2a 20 69 6e 20 74  rmat.    ** in t
30ed0 68 61 74 20 69 74 20 6f 6d 69 74 73 20 74 68 65  hat it omits the
30ee0 20 63 68 65 63 6b 73 75 6d 73 20 61 6e 64 20 74   checksums and t
30ef0 68 65 20 68 65 61 64 65 72 2e 0a 20 20 20 20 2a  he header..    *
30f00 2f 0a 20 20 20 20 69 66 28 20 73 75 62 6a 52 65  /.    if( subjRe
30f10 71 75 69 72 65 73 50 61 67 65 28 70 50 67 29 20  quiresPage(pPg) 
30f20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 75  ){.      rc = su
30f30 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70 50 67  bjournalPage(pPg
30f40 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
30f50 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 64 61  /* Update the da
30f60 74 61 62 61 73 65 20 73 69 7a 65 20 61 6e 64 20  tabase size and 
30f70 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 69  return..  */.  i
30f80 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  f( pPager->dbSiz
30f90 65 3c 70 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20  e<pPg->pgno ){. 
30fa0 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
30fb0 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20  e = pPg->pgno;. 
30fc0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
30fd0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20  }../*.** Mark a 
30fe0 64 61 74 61 20 70 61 67 65 20 61 73 20 77 72 69  data page as wri
30ff0 74 65 61 62 6c 65 2e 20 54 68 69 73 20 72 6f 75  teable. This rou
31000 74 69 6e 65 20 6d 75 73 74 20 62 65 20 63 61 6c  tine must be cal
31010 6c 65 64 20 62 65 66 6f 72 65 20 0a 2a 2a 20 6d  led before .** m
31020 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 20 74 6f  aking changes to
31030 20 61 20 70 61 67 65 2e 20 54 68 65 20 63 61 6c   a page. The cal
31040 6c 65 72 20 6d 75 73 74 20 63 68 65 63 6b 20 74  ler must check t
31050 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
31060 0a 2a 2a 20 6f 66 20 74 68 69 73 20 66 75 6e 63  .** of this func
31070 74 69 6f 6e 20 61 6e 64 20 62 65 20 63 61 72 65  tion and be care
31080 66 75 6c 20 6e 6f 74 20 74 6f 20 63 68 61 6e 67  ful not to chang
31090 65 20 61 6e 79 20 70 61 67 65 20 64 61 74 61 20  e any page data 
310a0 75 6e 6c 65 73 73 20 0a 2a 2a 20 74 68 69 73 20  unless .** this 
310b0 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
310c0 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a  SQLITE_OK..**.**
310d0 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   The difference 
310e0 62 65 74 77 65 65 6e 20 74 68 69 73 20 66 75 6e  between this fun
310f0 63 74 69 6f 6e 20 61 6e 64 20 70 61 67 65 72 5f  ction and pager_
31100 77 72 69 74 65 28 29 20 69 73 20 74 68 61 74 20  write() is that 
31110 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  this.** function
31120 20 61 6c 73 6f 20 64 65 61 6c 73 20 77 69 74 68   also deals with
31130 20 74 68 65 20 73 70 65 63 69 61 6c 20 63 61 73   the special cas
31140 65 20 77 68 65 72 65 20 32 20 6f 72 20 6d 6f 72  e where 2 or mor
31150 65 20 70 61 67 65 73 0a 2a 2a 20 66 69 74 20 6f  e pages.** fit o
31160 6e 20 61 20 73 69 6e 67 6c 65 20 64 69 73 6b 20  n a single disk 
31170 73 65 63 74 6f 72 2e 20 49 6e 20 74 68 69 73 20  sector. In this 
31180 63 61 73 65 20 61 6c 6c 20 63 6f 2d 72 65 73 69  case all co-resi
31190 64 65 6e 74 20 70 61 67 65 73 0a 2a 2a 20 6d 75  dent pages.** mu
311a0 73 74 20 68 61 76 65 20 62 65 65 6e 20 77 72 69  st have been wri
311b0 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72  tten to the jour
311c0 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72 65 20  nal file before 
311d0 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a  returning..**.**
311e0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
311f0 75 72 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  urs, SQLITE_NOME
31200 4d 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72  M or an IO error
31210 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
31220 64 0a 2a 2a 20 61 73 20 61 70 70 72 6f 70 72 69  d.** as appropri
31230 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ate. Otherwise, 
31240 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e  SQLITE_OK..*/.in
31250 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  t sqlite3PagerWr
31260 69 74 65 28 44 62 50 61 67 65 20 2a 70 44 62 50  ite(DbPage *pDbP
31270 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  age){.  int rc =
31280 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 50   SQLITE_OK;..  P
31290 67 48 64 72 20 2a 70 50 67 20 3d 20 70 44 62 50  gHdr *pPg = pDbP
312a0 61 67 65 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  age;.  Pager *pP
312b0 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
312c0 65 72 3b 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65  er;.  Pgno nPage
312d0 50 65 72 53 65 63 74 6f 72 20 3d 20 28 70 50 61  PerSector = (pPa
312e0 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 2f  ger->sectorSize/
312f0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
31300 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  );..  assert( pP
31310 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
31320 47 45 52 5f 57 52 49 54 45 52 5f 49 4e 49 54 49  GER_WRITER_INITI
31330 41 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  AL );.  assert( 
31340 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
31350 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20  PAGER_ERROR );. 
31360 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
31370 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
31380 65 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 6e 50  er) );..  if( nP
31390 61 67 65 50 65 72 53 65 63 74 6f 72 3e 31 20 29  agePerSector>1 )
313a0 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65  {.    Pgno nPage
313b0 43 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20  Count;          
313c0 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20  /* Total number 
313d0 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61 74 61  of pages in data
313e0 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20  base file */.   
313f0 20 50 67 6e 6f 20 70 67 31 3b 20 20 20 20 20 20   Pgno pg1;      
31400 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
31410 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  rst page of the 
31420 73 65 63 74 6f 72 20 70 50 67 20 69 73 20 6c 6f  sector pPg is lo
31430 63 61 74 65 64 20 6f 6e 2e 20 2a 2f 0a 20 20 20  cated on. */.   
31440 20 69 6e 74 20 6e 50 61 67 65 20 3d 20 30 3b 20   int nPage = 0; 
31450 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
31460 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 73 74  mber of pages st
31470 61 72 74 69 6e 67 20 61 74 20 70 67 31 20 74 6f  arting at pg1 to
31480 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20   journal */.    
31490 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20  int ii;         
314a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
314b0 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  p counter */.   
314c0 20 69 6e 74 20 6e 65 65 64 53 79 6e 63 20 3d 20   int needSync = 
314d0 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72  0;         /* Tr
314e0 75 65 20 69 66 20 61 6e 79 20 70 61 67 65 20 68  ue if any page h
314f0 61 73 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  as PGHDR_NEED_SY
31500 4e 43 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65  NC */..    /* Se
31510 74 20 74 68 65 20 64 6f 4e 6f 74 53 79 6e 63 53  t the doNotSyncS
31520 70 69 6c 6c 20 66 6c 61 67 20 74 6f 20 31 2e 20  pill flag to 1. 
31530 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20  This is because 
31540 77 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 0a  we cannot allow.
31550 20 20 20 20 2a 2a 20 61 20 6a 6f 75 72 6e 61 6c      ** a journal
31560 20 68 65 61 64 65 72 20 74 6f 20 62 65 20 77 72   header to be wr
31570 69 74 74 65 6e 20 62 65 74 77 65 65 6e 20 74 68  itten between th
31580 65 20 70 61 67 65 73 20 6a 6f 75 72 6e 61 6c 65  e pages journale
31590 64 20 62 79 0a 20 20 20 20 2a 2a 20 74 68 69 73  d by.    ** this
315a0 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 2a   function..    *
315b0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 4d  /.    assert( !M
315c0 45 4d 44 42 20 29 3b 0a 20 20 20 20 61 73 73 65  EMDB );.    asse
315d0 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  rt( pPager->doNo
315e0 74 53 79 6e 63 53 70 69 6c 6c 3d 3d 30 20 29 3b  tSyncSpill==0 );
315f0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e  .    pPager->doN
31600 6f 74 53 79 6e 63 53 70 69 6c 6c 2b 2b 3b 0a 0a  otSyncSpill++;..
31610 20 20 20 20 2f 2a 20 54 68 69 73 20 74 72 69 63      /* This tric
31620 6b 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 62  k assumes that b
31630 6f 74 68 20 74 68 65 20 70 61 67 65 2d 73 69 7a  oth the page-siz
31640 65 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a  e and sector-siz
31650 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 61 6e 20  e are.    ** an 
31660 69 6e 74 65 67 65 72 20 70 6f 77 65 72 20 6f 66  integer power of
31670 20 32 2e 20 49 74 20 73 65 74 73 20 76 61 72 69   2. It sets vari
31680 61 62 6c 65 20 70 67 31 20 74 6f 20 74 68 65 20  able pg1 to the 
31690 69 64 65 6e 74 69 66 69 65 72 0a 20 20 20 20 2a  identifier.    *
316a0 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 70  * of the first p
316b0 61 67 65 20 6f 66 20 74 68 65 20 73 65 63 74 6f  age of the secto
316c0 72 20 70 50 67 20 69 73 20 6c 6f 63 61 74 65 64  r pPg is located
316d0 20 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   on..    */.    
316e0 70 67 31 20 3d 20 28 28 70 50 67 2d 3e 70 67 6e  pg1 = ((pPg->pgn
316f0 6f 2d 31 29 20 26 20 7e 28 6e 50 61 67 65 50 65  o-1) & ~(nPagePe
31700 72 53 65 63 74 6f 72 2d 31 29 29 20 2b 20 31 3b  rSector-1)) + 1;
31710 0a 0a 20 20 20 20 6e 50 61 67 65 43 6f 75 6e 74  ..    nPageCount
31720 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
31730 65 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e  e;.    if( pPg->
31740 70 67 6e 6f 3e 6e 50 61 67 65 43 6f 75 6e 74 20  pgno>nPageCount 
31750 29 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d  ){.      nPage =
31760 20 28 70 50 67 2d 3e 70 67 6e 6f 20 2d 20 70 67   (pPg->pgno - pg
31770 31 29 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20  1)+1;.    }else 
31780 69 66 28 20 28 70 67 31 2b 6e 50 61 67 65 50 65  if( (pg1+nPagePe
31790 72 53 65 63 74 6f 72 2d 31 29 3e 6e 50 61 67 65  rSector-1)>nPage
317a0 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e  Count ){.      n
317b0 50 61 67 65 20 3d 20 6e 50 61 67 65 43 6f 75 6e  Page = nPageCoun
317c0 74 2b 31 2d 70 67 31 3b 0a 20 20 20 20 7d 65 6c  t+1-pg1;.    }el
317d0 73 65 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20  se{.      nPage 
317e0 3d 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72  = nPagePerSector
317f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
31800 72 74 28 6e 50 61 67 65 3e 30 29 3b 0a 20 20 20  rt(nPage>0);.   
31810 20 61 73 73 65 72 74 28 70 67 31 3c 3d 70 50 67   assert(pg1<=pPg
31820 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 61 73 73  ->pgno);.    ass
31830 65 72 74 28 28 70 67 31 2b 6e 50 61 67 65 29 3e  ert((pg1+nPage)>
31840 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 20  pPg->pgno);..   
31850 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50   for(ii=0; ii<nP
31860 61 67 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  age && rc==SQLIT
31870 45 5f 4f 4b 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  E_OK; ii++){.   
31880 20 20 20 50 67 6e 6f 20 70 67 20 3d 20 70 67 31     Pgno pg = pg1
31890 2b 69 69 3b 0a 20 20 20 20 20 20 50 67 48 64 72  +ii;.      PgHdr
318a0 20 2a 70 50 61 67 65 3b 0a 20 20 20 20 20 20 69   *pPage;.      i
318b0 66 28 20 70 67 3d 3d 70 50 67 2d 3e 70 67 6e 6f  f( pg==pPg->pgno
318c0 20 7c 7c 20 21 73 71 6c 69 74 65 33 42 69 74 76   || !sqlite3Bitv
318d0 65 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70  ecTest(pPager->p
318e0 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 29 20 29  InJournal, pg) )
318f0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 67  {.        if( pg
31900 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  !=PAGER_MJ_PGNO(
31910 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
31920 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
31930 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72  3PagerGet(pPager
31940 2c 20 70 67 2c 20 26 70 50 61 67 65 29 3b 0a 20  , pg, &pPage);. 
31950 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
31960 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
31970 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70            rc = p
31980 61 67 65 72 5f 77 72 69 74 65 28 70 50 61 67 65  ager_write(pPage
31990 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
319a0 66 28 20 70 50 61 67 65 2d 3e 66 6c 61 67 73 26  f( pPage->flags&
319b0 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
319c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
319d0 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20   needSync = 1;. 
319e0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
319f0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
31a00 50 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65  PagerUnref(pPage
31a10 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
31a20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
31a30 65 6c 73 65 20 69 66 28 20 28 70 50 61 67 65 20  else if( (pPage 
31a40 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70  = pager_lookup(p
31a50 50 61 67 65 72 2c 20 70 67 29 29 21 3d 30 20 29  Pager, pg))!=0 )
31a60 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  {.        if( pP
31a70 61 67 65 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  age->flags&PGHDR
31a80 5f 4e 45 45 44 5f 53 59 4e 43 20 29 7b 0a 20 20  _NEED_SYNC ){.  
31a90 20 20 20 20 20 20 20 20 6e 65 65 64 53 79 6e 63          needSync
31aa0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 1;.        }.
31ab0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
31ac0 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 29  agerUnref(pPage)
31ad0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
31ae0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 50  .    /* If the P
31af0 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66  GHDR_NEED_SYNC f
31b00 6c 61 67 20 69 73 20 73 65 74 20 66 6f 72 20 61  lag is set for a
31b10 6e 79 20 6f 66 20 74 68 65 20 6e 50 61 67 65 20  ny of the nPage 
31b20 70 61 67 65 73 20 0a 20 20 20 20 2a 2a 20 73 74  pages .    ** st
31b30 61 72 74 69 6e 67 20 61 74 20 70 67 31 2c 20 74  arting at pg1, t
31b40 68 65 6e 20 69 74 20 6e 65 65 64 73 20 74 6f 20  hen it needs to 
31b50 62 65 20 73 65 74 20 66 6f 72 20 61 6c 6c 20 6f  be set for all o
31b60 66 20 74 68 65 6d 2e 20 42 65 63 61 75 73 65 0a  f them. Because.
31b70 20 20 20 20 2a 2a 20 77 72 69 74 69 6e 67 20 74      ** writing t
31b80 6f 20 61 6e 79 20 6f 66 20 74 68 65 73 65 20 6e  o any of these n
31b90 50 61 67 65 20 70 61 67 65 73 20 6d 61 79 20 64  Page pages may d
31ba0 61 6d 61 67 65 20 74 68 65 20 6f 74 68 65 72 73  amage the others
31bb0 2c 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75  , the.    ** jou
31bc0 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 63  rnal file must c
31bd0 6f 6e 74 61 69 6e 20 73 79 6e 63 28 29 65 64 20  ontain sync()ed 
31be0 63 6f 70 69 65 73 20 6f 66 20 61 6c 6c 20 6f 66  copies of all of
31bf0 20 74 68 65 6d 0a 20 20 20 20 2a 2a 20 62 65 66   them.    ** bef
31c00 6f 72 65 20 61 6e 79 20 6f 66 20 74 68 65 6d 20  ore any of them 
31c10 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 6f  can be written o
31c20 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ut to the databa
31c30 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a  se file..    */.
31c40 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
31c50 54 45 5f 4f 4b 20 26 26 20 6e 65 65 64 53 79 6e  TE_OK && needSyn
31c60 63 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  c ){.      asser
31c70 74 28 20 21 4d 45 4d 44 42 20 26 26 20 70 50 61  t( !MEMDB && pPa
31c80 67 65 72 2d 3e 6e 6f 53 79 6e 63 3d 3d 30 20 29  ger->noSync==0 )
31c90 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30  ;.      for(ii=0
31ca0 3b 20 69 69 3c 6e 50 61 67 65 3b 20 69 69 2b 2b  ; ii<nPage; ii++
31cb0 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48 64 72  ){.        PgHdr
31cc0 20 2a 70 50 61 67 65 20 3d 20 70 61 67 65 72 5f   *pPage = pager_
31cd0 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70  lookup(pPager, p
31ce0 67 31 2b 69 69 29 3b 0a 20 20 20 20 20 20 20 20  g1+ii);.        
31cf0 69 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20  if( pPage ){.   
31d00 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e 66 6c         pPage->fl
31d10 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45  ags |= PGHDR_NEE
31d20 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20 20 20  D_SYNC;.        
31d30 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
31d40 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20  ref(pPage);.    
31d50 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
31d60 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28    }..    assert(
31d70 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79   pPager->doNotSy
31d80 6e 63 53 70 69 6c 6c 3d 3d 31 20 29 3b 0a 20 20  ncSpill==1 );.  
31d90 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53    pPager->doNotS
31da0 79 6e 63 53 70 69 6c 6c 2d 2d 3b 0a 20 20 7d 65  yncSpill--;.  }e
31db0 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  lse{.    rc = pa
31dc0 67 65 72 5f 77 72 69 74 65 28 70 44 62 50 61 67  ger_write(pDbPag
31dd0 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
31de0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
31df0 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
31e00 20 70 61 67 65 20 67 69 76 65 6e 20 69 6e 20 74   page given in t
31e10 68 65 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20  he argument was 
31e20 70 72 65 76 69 6f 75 73 6c 79 20 70 61 73 73 65  previously passe
31e30 64 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 50  d.** to sqlite3P
31e40 61 67 65 72 57 72 69 74 65 28 29 2e 20 20 49 6e  agerWrite().  In
31e50 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65   other words, re
31e60 74 75 72 6e 20 54 52 55 45 20 69 66 20 69 74 20  turn TRUE if it 
31e70 69 73 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e  is ok.** to chan
31e80 67 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ge the content o
31e90 66 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 23  f the page..*/.#
31ea0 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 69 6e  ifndef NDEBUG.in
31eb0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  t sqlite3PagerIs
31ec0 77 72 69 74 65 61 62 6c 65 28 44 62 50 61 67 65  writeable(DbPage
31ed0 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e   *pPg){.  return
31ee0 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44   pPg->flags&PGHD
31ef0 52 5f 44 49 52 54 59 3b 0a 7d 0a 23 65 6e 64 69  R_DIRTY;.}.#endi
31f00 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20  f../*.** A call 
31f10 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
31f20 74 65 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20  tells the pager 
31f30 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20 6e  that it is not n
31f40 65 63 65 73 73 61 72 79 20 74 6f 0a 2a 2a 20 77  ecessary to.** w
31f50 72 69 74 65 20 74 68 65 20 69 6e 66 6f 72 6d 61  rite the informa
31f60 74 69 6f 6e 20 6f 6e 20 70 61 67 65 20 70 50 67  tion on page pPg
31f70 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64 69 73   back to the dis
31f80 6b 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 0a 2a  k, even though.*
31f90 2a 20 74 68 61 74 20 70 61 67 65 20 6d 69 67 68  * that page migh
31fa0 74 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20 64  t be marked as d
31fb0 69 72 74 79 2e 20 20 54 68 69 73 20 68 61 70 70  irty.  This happ
31fc0 65 6e 73 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65  ens, for example
31fd0 2c 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70 61  , when.** the pa
31fe0 67 65 20 68 61 73 20 62 65 65 6e 20 61 64 64 65  ge has been adde
31ff0 64 20 61 73 20 61 20 6c 65 61 66 20 6f 66 20 74  d as a leaf of t
32000 68 65 20 66 72 65 65 6c 69 73 74 20 61 6e 64 20  he freelist and 
32010 73 6f 20 69 74 73 0a 2a 2a 20 63 6f 6e 74 65 6e  so its.** conten
32020 74 20 6e 6f 20 6c 6f 6e 67 65 72 20 6d 61 74 74  t no longer matt
32030 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f  ers..**.** The o
32040 76 65 72 6c 79 69 6e 67 20 73 6f 66 74 77 61 72  verlying softwar
32050 65 20 6c 61 79 65 72 20 63 61 6c 6c 73 20 74 68  e layer calls th
32060 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20  is routine when 
32070 61 6c 6c 20 6f 66 20 74 68 65 20 64 61 74 61 0a  all of the data.
32080 2a 2a 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20  ** on the given 
32090 70 61 67 65 20 69 73 20 75 6e 75 73 65 64 2e 20  page is unused. 
320a0 54 68 65 20 70 61 67 65 72 20 6d 61 72 6b 73 20  The pager marks 
320b0 74 68 65 20 70 61 67 65 20 61 73 20 63 6c 65 61  the page as clea
320c0 6e 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20  n so.** that it 
320d0 64 6f 65 73 20 6e 6f 74 20 67 65 74 20 77 72 69  does not get wri
320e0 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a  tten to disk..**
320f0 0a 2a 2a 20 54 65 73 74 73 20 73 68 6f 77 20 74  .** Tests show t
32100 68 61 74 20 74 68 69 73 20 6f 70 74 69 6d 69 7a  hat this optimiz
32110 61 74 69 6f 6e 20 63 61 6e 20 71 75 61 64 72 75  ation can quadru
32120 70 6c 65 20 74 68 65 20 73 70 65 65 64 20 6f 66  ple the speed of
32130 20 6c 61 72 67 65 20 0a 2a 2a 20 44 45 4c 45 54   large .** DELET
32140 45 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2f  E operations..*/
32150 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
32160 65 72 44 6f 6e 74 57 72 69 74 65 28 50 67 48 64  erDontWrite(PgHd
32170 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  r *pPg){.  Pager
32180 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
32190 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20 28 70  pPager;.  if( (p
321a0 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
321b0 44 49 52 54 59 29 20 26 26 20 70 50 61 67 65 72  DIRTY) && pPager
321c0 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3d 3d 30 20  ->nSavepoint==0 
321d0 29 7b 0a 20 20 20 20 50 41 47 45 52 54 52 41 43  ){.    PAGERTRAC
321e0 45 28 28 22 44 4f 4e 54 5f 57 52 49 54 45 20 70  E(("DONT_WRITE p
321f0 61 67 65 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c  age %d of %d\n",
32200 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 41 47 45   pPg->pgno, PAGE
32210 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20  RID(pPager)));. 
32220 20 20 20 49 4f 54 52 41 43 45 28 28 22 43 4c 45     IOTRACE(("CLE
32230 41 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  AN %p %d\n", pPa
32240 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29  ger, pPg->pgno))
32250 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20  .    pPg->flags 
32260 7c 3d 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52  |= PGHDR_DONT_WR
32270 49 54 45 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  ITE;.#ifdef SQLI
32280 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20  TE_CHECK_PAGES. 
32290 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68     pPg->pageHash
322a0 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73   = pager_pagehas
322b0 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20  h(pPg);.#endif. 
322c0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
322d0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
322e0 65 64 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74 20  ed to increment 
322f0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
32300 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 0a   database file .
32310 2a 2a 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  ** change-counte
32320 72 2c 20 73 74 6f 72 65 64 20 61 73 20 61 20 34  r, stored as a 4
32330 2d 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e  -byte big-endian
32340 20 69 6e 74 65 67 65 72 20 73 74 61 72 74 69 6e   integer startin
32350 67 20 61 74 20 0a 2a 2a 20 62 79 74 65 20 6f 66  g at .** byte of
32360 66 73 65 74 20 32 34 20 6f 66 20 74 68 65 20 70  fset 24 of the p
32370 61 67 65 72 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  ager file..**.**
32380 20 49 66 20 74 68 65 20 69 73 44 69 72 65 63 74   If the isDirect
32390 4d 6f 64 65 20 66 6c 61 67 20 69 73 20 7a 65 72  Mode flag is zer
323a0 6f 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73 20  o, then this is 
323b0 64 6f 6e 65 20 62 79 20 63 61 6c 6c 69 6e 67 20  done by calling 
323c0 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72  .** sqlite3Pager
323d0 57 72 69 74 65 28 29 20 6f 6e 20 70 61 67 65 20  Write() on page 
323e0 31 2c 20 74 68 65 6e 20 6d 6f 64 69 66 79 69 6e  1, then modifyin
323f0 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  g the contents o
32400 66 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 64 61  f the.** page da
32410 74 61 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ta. In this case
32420 20 74 68 65 20 66 69 6c 65 20 77 69 6c 6c 20 62   the file will b
32430 65 20 75 70 64 61 74 65 64 20 77 68 65 6e 20 74  e updated when t
32440 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 74 72  he current.** tr
32450 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d  ansaction is com
32460 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  mitted..**.** Th
32470 65 20 69 73 44 69 72 65 63 74 4d 6f 64 65 20 66  e isDirectMode f
32480 6c 61 67 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20  lag may only be 
32490 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20  non-zero if the 
324a0 6c 69 62 72 61 72 79 20 77 61 73 20 63 6f 6d 70  library was comp
324b0 69 6c 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65  iled.** with the
324c0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
324d0 54 4f 4d 49 43 5f 57 52 49 54 45 20 6d 61 63 72  TOMIC_WRITE macr
324e0 6f 20 64 65 66 69 6e 65 64 2e 20 49 6e 20 74 68  o defined. In th
324f0 69 73 20 63 61 73 65 2c 0a 2a 2a 20 69 66 20 69  is case,.** if i
32500 73 44 69 72 65 63 74 20 69 73 20 6e 6f 6e 2d 7a  sDirect is non-z
32510 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 64 61  ero, then the da
32520 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 75  tabase file is u
32530 70 64 61 74 65 64 20 64 69 72 65 63 74 6c 79 0a  pdated directly.
32540 2a 2a 20 62 79 20 77 72 69 74 69 6e 67 20 61 6e  ** by writing an
32550 20 75 70 64 61 74 65 64 20 76 65 72 73 69 6f 6e   updated version
32560 20 6f 66 20 70 61 67 65 20 31 20 75 73 69 6e 67   of page 1 using
32570 20 61 20 63 61 6c 6c 20 74 6f 20 74 68 65 20 0a   a call to the .
32580 2a 2a 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74  ** sqlite3OsWrit
32590 65 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  e() function..*/
325a0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
325b0 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75  r_incr_changecou
325c0 6e 74 65 72 28 50 61 67 65 72 20 2a 70 50 61 67  nter(Pager *pPag
325d0 65 72 2c 20 69 6e 74 20 69 73 44 69 72 65 63 74  er, int isDirect
325e0 4d 6f 64 65 29 7b 0a 20 20 69 6e 74 20 72 63 20  Mode){.  int rc 
325f0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
32600 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
32610 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
32620 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20  ITER_CACHEMOD.  
32630 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e       || pPager->
32640 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
32650 49 54 45 52 5f 44 42 4d 4f 44 0a 20 20 29 3b 0a  ITER_DBMOD.  );.
32660 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74    assert( assert
32670 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61  _pager_state(pPa
32680 67 65 72 29 20 29 3b 0a 0a 20 20 2f 2a 20 44 65  ger) );..  /* De
32690 63 6c 61 72 65 20 61 6e 64 20 69 6e 69 74 69 61  clare and initia
326a0 6c 69 7a 65 20 63 6f 6e 73 74 61 6e 74 20 69 6e  lize constant in
326b0 74 65 67 65 72 20 27 69 73 44 69 72 65 63 74 27  teger 'isDirect'
326c0 2e 20 49 66 20 74 68 65 0a 20 20 2a 2a 20 61 74  . If the.  ** at
326d0 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d  omic-write optim
326e0 69 7a 61 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c  ization is enabl
326f0 65 64 20 69 6e 20 74 68 69 73 20 62 75 69 6c 64  ed in this build
32700 2c 20 74 68 65 6e 20 69 73 44 69 72 65 63 74 0a  , then isDirect.
32710 20 20 2a 2a 20 69 73 20 69 6e 69 74 69 61 6c 69    ** is initiali
32720 7a 65 64 20 74 6f 20 74 68 65 20 76 61 6c 75 65  zed to the value
32730 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 69   passed as the i
32740 73 44 69 72 65 63 74 4d 6f 64 65 20 70 61 72 61  sDirectMode para
32750 6d 65 74 65 72 0a 20 20 2a 2a 20 74 6f 20 74 68  meter.  ** to th
32760 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 4f 74 68  is function. Oth
32770 65 72 77 69 73 65 2c 20 69 74 20 69 73 20 61 6c  erwise, it is al
32780 77 61 79 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  ways set to zero
32790 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
327a0 69 64 65 61 20 69 73 20 74 68 61 74 20 69 66 20  idea is that if 
327b0 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65  the atomic-write
327c0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73   optimization is
327d0 20 6e 6f 74 0a 20 20 2a 2a 20 65 6e 61 62 6c 65   not.  ** enable
327e0 64 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d  d at compile tim
327f0 65 2c 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20  e, the compiler 
32800 63 61 6e 20 6f 6d 69 74 20 74 68 65 20 74 65 73  can omit the tes
32810 74 73 20 6f 66 0a 20 20 2a 2a 20 27 69 73 44 69  ts of.  ** 'isDi
32820 72 65 63 74 27 20 62 65 6c 6f 77 2c 20 61 73 20  rect' below, as 
32830 77 65 6c 6c 20 61 73 20 74 68 65 20 62 6c 6f 63  well as the bloc
32840 6b 20 65 6e 63 6c 6f 73 65 64 20 69 6e 20 74 68  k enclosed in th
32850 65 0a 20 20 2a 2a 20 22 69 66 28 20 69 73 44 69  e.  ** "if( isDi
32860 72 65 63 74 20 29 22 20 63 6f 6e 64 69 74 69 6f  rect )" conditio
32870 6e 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  n..  */.#ifndef 
32880 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54  SQLITE_ENABLE_AT
32890 4f 4d 49 43 5f 57 52 49 54 45 0a 23 20 64 65 66  OMIC_WRITE.# def
328a0 69 6e 65 20 44 49 52 45 43 54 5f 4d 4f 44 45 20  ine DIRECT_MODE 
328b0 30 0a 20 20 61 73 73 65 72 74 28 20 69 73 44 69  0.  assert( isDi
328c0 72 65 63 74 4d 6f 64 65 3d 3d 30 20 29 3b 0a 20  rectMode==0 );. 
328d0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
328e0 52 28 69 73 44 69 72 65 63 74 4d 6f 64 65 29 3b  R(isDirectMode);
328f0 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
32900 44 49 52 45 43 54 5f 4d 4f 44 45 20 69 73 44 69  DIRECT_MODE isDi
32910 72 65 63 74 4d 6f 64 65 0a 23 65 6e 64 69 66 0a  rectMode.#endif.
32920 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
32930 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
32940 26 26 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  && pPager->dbSiz
32950 65 3e 30 20 29 7b 0a 20 20 20 20 50 67 48 64 72  e>0 ){.    PgHdr
32960 20 2a 70 50 67 48 64 72 3b 20 20 20 20 20 20 20   *pPgHdr;       
32970 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 66 65           /* Refe
32980 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20 31 20  rence to page 1 
32990 2a 2f 0a 20 20 20 20 75 33 32 20 63 68 61 6e 67  */.    u32 chang
329a0 65 5f 63 6f 75 6e 74 65 72 3b 20 20 20 20 20 20  e_counter;      
329b0 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20       /* Initial 
329c0 76 61 6c 75 65 20 6f 66 20 63 68 61 6e 67 65 2d  value of change-
329d0 63 6f 75 6e 74 65 72 20 66 69 65 6c 64 20 2a 2f  counter field */
329e0 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  ..    assert( !p
329f0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
32a00 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  && isOpen(pPager
32a10 2d 3e 66 64 29 20 29 3b 0a 0a 20 20 20 20 2f 2a  ->fd) );..    /*
32a20 20 4f 70 65 6e 20 70 61 67 65 20 31 20 6f 66 20   Open page 1 of 
32a30 74 68 65 20 66 69 6c 65 20 66 6f 72 20 77 72 69  the file for wri
32a40 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20  ting. */.    rc 
32a50 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
32a60 74 28 70 50 61 67 65 72 2c 20 31 2c 20 26 70 50  t(pPager, 1, &pP
32a70 67 48 64 72 29 3b 0a 20 20 20 20 61 73 73 65 72  gHdr);.    asser
32a80 74 28 20 70 50 67 48 64 72 3d 3d 30 20 7c 7c 20  t( pPgHdr==0 || 
32a90 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
32aa0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 61 67 65  ..    /* If page
32ab0 20 6f 6e 65 20 77 61 73 20 66 65 74 63 68 65 64   one was fetched
32ac0 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 61   successfully, a
32ad0 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  nd this function
32ae0 20 69 73 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 6f   is not.    ** o
32af0 70 65 72 61 74 69 6e 67 20 69 6e 20 64 69 72 65  perating in dire
32b00 63 74 2d 6d 6f 64 65 2c 20 6d 61 6b 65 20 70 61  ct-mode, make pa
32b10 67 65 20 31 20 77 72 69 74 61 62 6c 65 2e 20 20  ge 1 writable.  
32b20 57 68 65 6e 20 6e 6f 74 20 69 6e 20 0a 20 20 20  When not in .   
32b30 20 2a 2a 20 64 69 72 65 63 74 20 6d 6f 64 65 2c   ** direct mode,
32b40 20 70 61 67 65 20 31 20 69 73 20 61 6c 77 61 79   page 1 is alway
32b50 73 20 68 65 6c 64 20 69 6e 20 63 61 63 68 65 20  s held in cache 
32b60 61 6e 64 20 68 65 6e 63 65 20 74 68 65 20 50 61  and hence the Pa
32b70 67 65 72 47 65 74 28 29 0a 20 20 20 20 2a 2a 20  gerGet().    ** 
32b80 61 62 6f 76 65 20 69 73 20 61 6c 77 61 79 73 20  above is always 
32b90 73 75 63 63 65 73 73 66 75 6c 20 2d 20 68 65 6e  successful - hen
32ba0 63 65 20 74 68 65 20 41 4c 57 41 59 53 20 6f 6e  ce the ALWAYS on
32bb0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 2e 0a   rc==SQLITE_OK..
32bc0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21      */.    if( !
32bd0 44 49 52 45 43 54 5f 4d 4f 44 45 20 26 26 20 41  DIRECT_MODE && A
32be0 4c 57 41 59 53 28 72 63 3d 3d 53 51 4c 49 54 45  LWAYS(rc==SQLITE
32bf0 5f 4f 4b 29 20 29 7b 0a 20 20 20 20 20 20 72 63  _OK) ){.      rc
32c00 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
32c10 72 69 74 65 28 70 50 67 48 64 72 29 3b 0a 20 20  rite(pPgHdr);.  
32c20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d    }..    if( rc=
32c30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
32c40 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74      /* Increment
32c50 20 74 68 65 20 76 61 6c 75 65 20 6a 75 73 74 20   the value just 
32c60 72 65 61 64 20 61 6e 64 20 77 72 69 74 65 20 69  read and write i
32c70 74 20 62 61 63 6b 20 74 6f 20 62 79 74 65 20 32  t back to byte 2
32c80 34 2e 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 6e  4. */.      chan
32c90 67 65 5f 63 6f 75 6e 74 65 72 20 3d 20 73 71 6c  ge_counter = sql
32ca0 69 74 65 33 47 65 74 34 62 79 74 65 28 28 75 38  ite3Get4byte((u8
32cb0 2a 29 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  *)pPager->dbFile
32cc0 56 65 72 73 29 3b 0a 20 20 20 20 20 20 63 68 61  Vers);.      cha
32cd0 6e 67 65 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20  nge_counter++;. 
32ce0 20 20 20 20 20 70 75 74 33 32 62 69 74 73 28 28       put32bits((
32cf0 28 63 68 61 72 2a 29 70 50 67 48 64 72 2d 3e 70  (char*)pPgHdr->p
32d00 44 61 74 61 29 2b 32 34 2c 20 63 68 61 6e 67 65  Data)+24, change
32d10 5f 63 6f 75 6e 74 65 72 29 3b 0a 0a 20 20 20 20  _counter);..    
32d20 20 20 2f 2a 20 41 6c 73 6f 20 73 74 6f 72 65 20    /* Also store 
32d30 74 68 65 20 53 51 4c 69 74 65 20 76 65 72 73 69  the SQLite versi
32d40 6f 6e 20 6e 75 6d 62 65 72 20 69 6e 20 62 79 74  on number in byt
32d50 65 73 20 39 36 2e 2e 39 39 20 61 6e 64 20 69 6e  es 96..99 and in
32d60 0a 20 20 20 20 20 20 2a 2a 20 62 79 74 65 73 20  .      ** bytes 
32d70 39 32 2e 2e 39 35 20 73 74 6f 72 65 20 74 68 65  92..95 store the
32d80 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20   change counter 
32d90 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 76 65  for which the ve
32da0 72 73 69 6f 6e 20 6e 75 6d 62 65 72 0a 20 20 20  rsion number.   
32db0 20 20 20 2a 2a 20 69 73 20 76 61 6c 69 64 2e 20     ** is valid. 
32dc0 2a 2f 0a 20 20 20 20 20 20 70 75 74 33 32 62 69  */.      put32bi
32dd0 74 73 28 28 28 63 68 61 72 2a 29 70 50 67 48 64  ts(((char*)pPgHd
32de0 72 2d 3e 70 44 61 74 61 29 2b 39 32 2c 20 63 68  r->pData)+92, ch
32df0 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 20  ange_counter);. 
32e00 20 20 20 20 20 70 75 74 33 32 62 69 74 73 28 28       put32bits((
32e10 28 63 68 61 72 2a 29 70 50 67 48 64 72 2d 3e 70  (char*)pPgHdr->p
32e20 44 61 74 61 29 2b 39 36 2c 20 53 51 4c 49 54 45  Data)+96, SQLITE
32e30 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 29  _VERSION_NUMBER)
32e40 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 72  ;..      /* If r
32e50 75 6e 6e 69 6e 67 20 69 6e 20 64 69 72 65 63 74  unning in direct
32e60 20 6d 6f 64 65 2c 20 77 72 69 74 65 20 74 68 65   mode, write the
32e70 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 61 67   contents of pag
32e80 65 20 31 20 74 6f 20 74 68 65 20 66 69 6c 65 2e  e 1 to the file.
32e90 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 44 49   */.      if( DI
32ea0 52 45 43 54 5f 4d 4f 44 45 20 29 7b 0a 20 20 20  RECT_MODE ){.   
32eb0 20 20 20 20 20 63 6f 6e 73 74 20 76 6f 69 64 20       const void 
32ec0 2a 7a 42 75 66 3b 0a 20 20 20 20 20 20 20 20 61  *zBuf;.        a
32ed0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
32ee0 62 46 69 6c 65 53 69 7a 65 3e 30 20 29 3b 0a 20  bFileSize>0 );. 
32ef0 20 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50         CODEC2(pP
32f00 61 67 65 72 2c 20 70 50 67 48 64 72 2d 3e 70 44  ager, pPgHdr->pD
32f10 61 74 61 2c 20 31 2c 20 36 2c 20 72 63 3d 53 51  ata, 1, 6, rc=SQ
32f20 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 7a 42 75 66  LITE_NOMEM, zBuf
32f30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
32f40 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
32f50 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
32f60 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
32f70 61 67 65 72 2d 3e 66 64 2c 20 7a 42 75 66 2c 20  ager->fd, zBuf, 
32f80 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
32f90 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , 0);.        }.
32fa0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
32fb0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
32fc0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 63         pPager->c
32fd0 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
32fe0 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
32ff0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
33000 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67     pPager->chang
33010 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 31 3b 0a  eCountDone = 1;.
33020 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
33030 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68     /* Release th
33040 65 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65  e page reference
33050 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  . */.    sqlite3
33060 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 48 64  PagerUnref(pPgHd
33070 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  r);.  }.  return
33080 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79   rc;.}../*.** Sy
33090 6e 63 20 74 68 65 20 70 61 67 65 72 20 66 69 6c  nc the pager fil
330a0 65 20 74 6f 20 64 69 73 6b 2e 20 54 68 69 73 20  e to disk. This 
330b0 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 69  is a no-op for i
330c0 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 73 0a 2a  n-memory files.*
330d0 2a 20 6f 72 20 70 61 67 65 73 20 77 69 74 68 20  * or pages with 
330e0 74 68 65 20 50 61 67 65 72 2e 6e 6f 53 79 6e 63  the Pager.noSync
330f0 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a 2a   flag set..**.**
33100 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
33110 6f 72 20 63 61 6c 6c 65 64 20 6f 6e 20 61 20 70  or called on a p
33120 61 67 65 72 20 66 6f 72 20 77 68 69 63 68 20 69  ager for which i
33130 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2c 20 74 68  t is a no-op, th
33140 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72  is.** function r
33150 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b  eturns SQLITE_OK
33160 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20  . Otherwise, an 
33170 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
33180 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e   returned..*/.in
33190 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 79  t sqlite3PagerSy
331a0 6e 63 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nc(Pager *pPager
331b0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
331c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
331d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
331e0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 61 73  urn code */.  as
331f0 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a  sert( !MEMDB );.
33200 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f    if( pPager->no
33210 53 79 6e 63 20 29 7b 0a 20 20 20 20 72 63 20 3d  Sync ){.    rc =
33220 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
33230 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  lse{.    rc = sq
33240 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67  lite3OsSync(pPag
33250 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e  er->fd, pPager->
33260 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 7d  sync_flags);.  }
33270 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
33280 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
33290 74 69 6f 6e 20 6d 61 79 20 6f 6e 6c 79 20 62 65  tion may only be
332a0 20 63 61 6c 6c 65 64 20 77 68 69 6c 65 20 61 20   called while a 
332b0 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
332c0 6e 20 69 73 20 61 63 74 69 76 65 20 69 6e 0a 2a  n is active in.*
332d0 2a 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 66 20 74  * rollback. If t
332e0 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  he connection is
332f0 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2c 20 74 68   in WAL mode, th
33300 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d  is call is a no-
33310 6f 70 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73  op. .** Otherwis
33320 65 2c 20 69 66 20 74 68 65 20 63 6f 6e 6e 65 63  e, if the connec
33330 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 61 6c  tion does not al
33340 72 65 61 64 79 20 68 61 76 65 20 61 6e 20 45 58  ready have an EX
33350 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
33360 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
33370 20 66 69 6c 65 2c 20 61 6e 20 61 74 74 65 6d 70   file, an attemp
33380 74 20 69 73 20 6d 61 64 65 20 74 6f 20 6f 62 74  t is made to obt
33390 61 69 6e 20 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 49  ain one..**.** I
333a0 66 20 74 68 65 20 45 58 43 4c 55 53 49 56 45 20  f the EXCLUSIVE 
333b0 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20  lock is already 
333c0 68 65 6c 64 20 6f 72 20 74 68 65 20 61 74 74 65  held or the atte
333d0 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e 20 69 74  mpt to obtain it
333e0 20 69 73 0a 2a 2a 20 73 75 63 63 65 73 73 66 75   is.** successfu
333f0 6c 2c 20 6f 72 20 74 68 65 20 63 6f 6e 6e 65 63  l, or the connec
33400 74 69 6f 6e 20 69 73 20 69 6e 20 57 41 4c 20 6d  tion is in WAL m
33410 6f 64 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ode, SQLITE_OK i
33420 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 20 4f  s returned..** O
33430 74 68 65 72 77 69 73 65 2c 20 65 69 74 68 65 72  therwise, either
33440 20 53 51 4c 49 54 45 5f 42 55 53 59 20 6f 72 20   SQLITE_BUSY or 
33450 61 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  an SQLITE_IOERR_
33460 58 58 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69  XXX error code i
33470 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a  s .** returned..
33480 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
33490 67 65 72 45 78 63 6c 75 73 69 76 65 4c 6f 63 6b  gerExclusiveLock
334a0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
334b0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
334c0 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28  TE_OK;.  assert(
334d0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
334e0 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41  =PAGER_WRITER_CA
334f0 43 48 45 4d 4f 44 20 0a 20 20 20 20 20 20 20 7c  CHEMOD .       |
33500 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
33510 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  ==PAGER_WRITER_D
33520 42 4d 4f 44 20 0a 20 20 20 20 20 20 20 7c 7c 20  BMOD .       || 
33530 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
33540 50 41 47 45 52 5f 57 52 49 54 45 52 5f 49 4e 49  PAGER_WRITER_INI
33550 54 49 41 4c 20 0a 20 20 29 3b 0a 20 20 61 73 73  TIAL .  );.  ass
33560 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
33570 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
33580 29 3b 0a 20 20 69 66 28 20 30 3d 3d 70 61 67 65  );.  if( 0==page
33590 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
335a0 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
335b0 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70  r_wait_on_lock(p
335c0 50 61 67 65 72 2c 20 50 41 47 45 52 5f 45 58 43  Pager, PAGER_EXC
335d0 4c 55 53 49 56 45 29 3b 0a 20 20 7d 0a 20 20 72  LUSIVE);.  }.  r
335e0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
335f0 2a 2a 20 53 79 6e 63 20 74 68 65 20 64 61 74 61  ** Sync the data
33600 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68  base file for th
33610 65 20 70 61 67 65 72 20 70 50 61 67 65 72 2e 20  e pager pPager. 
33620 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74  zMaster points t
33630 6f 20 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66  o the name.** of
33640 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
33650 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75  l file that shou
33660 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e  ld be written in
33670 74 6f 20 74 68 65 20 69 6e 64 69 76 69 64 75 61  to the individua
33680 6c 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  l.** journal fil
33690 65 2e 20 7a 4d 61 73 74 65 72 20 6d 61 79 20 62  e. zMaster may b
336a0 65 20 4e 55 4c 4c 2c 20 77 68 69 63 68 20 69 73  e NULL, which is
336b0 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20   interpreted as 
336c0 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75  no master.** jou
336d0 72 6e 61 6c 20 28 61 20 73 69 6e 67 6c 65 20 64  rnal (a single d
336e0 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74  atabase transact
336f0 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ion)..**.** This
33700 20 72 6f 75 74 69 6e 65 20 65 6e 73 75 72 65 73   routine ensures
33710 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a   that:.**.**   *
33720 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69   The database fi
33730 6c 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  le change-counte
33740 72 20 69 73 20 75 70 64 61 74 65 64 2c 0a 2a 2a  r is updated,.**
33750 20 20 20 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c     * the journal
33760 20 69 73 20 73 79 6e 63 65 64 20 28 75 6e 6c 65   is synced (unle
33770 73 73 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72  ss the atomic-wr
33780 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ite optimization
33790 20 69 73 20 75 73 65 64 29 2c 0a 2a 2a 20 20 20   is used),.**   
337a0 2a 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65  * all dirty page
337b0 73 20 61 72 65 20 77 72 69 74 74 65 6e 20 74 6f  s are written to
337c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
337d0 6c 65 2c 20 0a 2a 2a 20 20 20 2a 20 74 68 65 20  le, .**   * the 
337e0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
337f0 20 74 72 75 6e 63 61 74 65 64 20 28 69 66 20 72   truncated (if r
33800 65 71 75 69 72 65 64 29 2c 20 61 6e 64 0a 2a 2a  equired), and.**
33810 20 20 20 2a 20 74 68 65 20 64 61 74 61 62 61 73     * the databas
33820 65 20 66 69 6c 65 20 73 79 6e 63 65 64 2e 20 0a  e file synced. .
33830 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 74  **.** The only t
33840 68 69 6e 67 20 74 68 61 74 20 72 65 6d 61 69 6e  hing that remain
33850 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65 20  s to commit the 
33860 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 74  transaction is t
33870 6f 20 66 69 6e 61 6c 69 7a 65 20 0a 2a 2a 20 28  o finalize .** (
33880 64 65 6c 65 74 65 2c 20 74 72 75 6e 63 61 74 65  delete, truncate
33890 20 6f 72 20 7a 65 72 6f 20 74 68 65 20 66 69 72   or zero the fir
338a0 73 74 20 70 61 72 74 20 6f 66 29 20 74 68 65 20  st part of) the 
338b0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72  journal file (or
338c0 20 0a 2a 2a 20 64 65 6c 65 74 65 20 74 68 65 20   .** delete the 
338d0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
338e0 69 6c 65 20 69 66 20 73 70 65 63 69 66 69 65 64  ile if specified
338f0 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  )..**.** Note th
33900 61 74 20 69 66 20 7a 4d 61 73 74 65 72 3d 3d 4e  at if zMaster==N
33910 55 4c 4c 2c 20 74 68 69 73 20 64 6f 65 73 20 6e  ULL, this does n
33920 6f 74 20 6f 76 65 72 77 72 69 74 65 20 61 20 70  ot overwrite a p
33930 72 65 76 69 6f 75 73 20 76 61 6c 75 65 0a 2a 2a  revious value.**
33940 20 70 61 73 73 65 64 20 74 6f 20 61 6e 20 73 71   passed to an sq
33950 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
33960 50 68 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c 2e  PhaseOne() call.
33970 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69  .**.** If the fi
33980 6e 61 6c 20 70 61 72 61 6d 65 74 65 72 20 2d 20  nal parameter - 
33990 6e 6f 53 79 6e 63 20 2d 20 69 73 20 74 72 75 65  noSync - is true
339a0 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74 61 62  , then the datab
339b0 61 73 65 20 66 69 6c 65 20 69 74 73 65 6c 66 0a  ase file itself.
339c0 2a 2a 20 69 73 20 6e 6f 74 20 73 79 6e 63 65 64  ** is not synced
339d0 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73  . The caller mus
339e0 74 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61  t call sqlite3Pa
339f0 67 65 72 53 79 6e 63 28 29 20 64 69 72 65 63 74  gerSync() direct
33a00 6c 79 20 74 6f 0a 2a 2a 20 73 79 6e 63 20 74 68  ly to.** sync th
33a10 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
33a20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 43  before calling C
33a30 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20  ommitPhaseTwo() 
33a40 74 6f 20 64 65 6c 65 74 65 20 74 68 65 0a 2a 2a  to delete the.**
33a50 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e   journal file in
33a60 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 69   this case..*/.i
33a70 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  nt sqlite3PagerC
33a80 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 0a 20  ommitPhaseOne(. 
33a90 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
33aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33ab0 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74   /* Pager object
33ac0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
33ad0 20 2a 7a 4d 61 73 74 65 72 2c 20 20 20 20 20 20   *zMaster,      
33ae0 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20        /* If not 
33af0 4e 55 4c 4c 2c 20 74 68 65 20 6d 61 73 74 65 72  NULL, the master
33b00 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f   journal name */
33b10 0a 20 20 69 6e 74 20 6e 6f 53 79 6e 63 20 20 20  .  int noSync   
33b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33b30 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 6f 6d     /* True to om
33b40 69 74 20 74 68 65 20 78 53 79 6e 63 20 6f 6e 20  it the xSync on 
33b50 74 68 65 20 64 62 20 66 69 6c 65 20 2a 2f 0a 29  the db file */.)
33b60 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
33b70 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
33b80 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
33b90 64 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  de */..  assert(
33ba0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
33bb0 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 49 4e  =PAGER_WRITER_IN
33bc0 49 54 49 41 4c 0a 20 20 20 20 20 20 20 7c 7c 20  ITIAL.       || 
33bd0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
33be0 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
33bf0 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20  HEMOD.       || 
33c00 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
33c10 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d  PAGER_WRITER_DBM
33c20 4f 44 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74  OD.  );.  assert
33c30 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
33c40 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
33c50 0a 20 20 2f 2a 20 49 66 20 61 20 70 72 69 6f 72  .  /* If a prior
33c60 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c   error occurred,
33c70 20 72 65 70 6f 72 74 20 74 68 61 74 20 65 72 72   report that err
33c80 6f 72 20 61 67 61 69 6e 2e 20 2a 2f 0a 20 20 69  or again. */.  i
33c90 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
33ca0 64 65 20 29 20 72 65 74 75 72 6e 20 70 50 61 67  de ) return pPag
33cb0 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20  er->errCode;..  
33cc0 50 41 47 45 52 54 52 41 43 45 28 28 22 44 41 54  PAGERTRACE(("DAT
33cd0 41 42 41 53 45 20 53 59 4e 43 3a 20 46 69 6c 65  ABASE SYNC: File
33ce0 3d 25 73 20 7a 4d 61 73 74 65 72 3d 25 73 20 6e  =%s zMaster=%s n
33cf0 53 69 7a 65 3d 25 64 5c 6e 22 2c 20 0a 20 20 20  Size=%d\n", .   
33d00 20 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65     pPager->zFile
33d10 6e 61 6d 65 2c 20 7a 4d 61 73 74 65 72 2c 20 70  name, zMaster, p
33d20 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 29 3b  Pager->dbSize));
33d30 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 20 64 61 74  ..  /* If no dat
33d40 61 62 61 73 65 20 63 68 61 6e 67 65 73 20 68 61  abase changes ha
33d50 76 65 20 62 65 65 6e 20 6d 61 64 65 2c 20 72 65  ve been made, re
33d60 74 75 72 6e 20 65 61 72 6c 79 2e 20 2a 2f 0a 20  turn early. */. 
33d70 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74   if( pPager->eSt
33d80 61 74 65 3c 50 41 47 45 52 5f 57 52 49 54 45 52  ate<PAGER_WRITER
33d90 5f 43 41 43 48 45 4d 4f 44 20 29 20 72 65 74 75  _CACHEMOD ) retu
33da0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20  rn SQLITE_OK;.. 
33db0 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
33dc0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
33dd0 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 62 2c  an in-memory db,
33de0 20 6f 72 20 6e 6f 20 70 61 67 65 73 20 68 61 76   or no pages hav
33df0 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  e been written t
33e00 6f 2c 20 6f 72 20 74 68 69 73 0a 20 20 20 20 2a  o, or this.    *
33e10 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 61  * function has a
33e20 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c  lready been call
33e30 65 64 2c 20 69 74 20 69 73 20 6d 6f 73 74 6c 79  ed, it is mostly
33e40 20 61 20 6e 6f 2d 6f 70 2e 20 20 48 6f 77 65 76   a no-op.  Howev
33e50 65 72 2c 20 61 6e 79 0a 20 20 20 20 2a 2a 20 62  er, any.    ** b
33e60 61 63 6b 75 70 20 69 6e 20 70 72 6f 67 72 65 73  ackup in progres
33e70 73 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65  s needs to be re
33e80 73 74 61 72 74 65 64 2e 0a 20 20 20 20 2a 2f 0a  started..    */.
33e90 20 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75      sqlite3Backu
33ea0 70 52 65 73 74 61 72 74 28 70 50 61 67 65 72 2d  pRestart(pPager-
33eb0 3e 70 42 61 63 6b 75 70 29 3b 0a 20 20 7d 65 6c  >pBackup);.  }el
33ec0 73 65 7b 0a 20 20 20 20 69 66 28 20 70 61 67 65  se{.    if( page
33ed0 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
33ee0 29 7b 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a  ){.      PgHdr *
33ef0 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 50  pList = sqlite3P
33f00 63 61 63 68 65 44 69 72 74 79 4c 69 73 74 28 70  cacheDirtyList(p
33f10 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
33f20 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74  .      if( pList
33f30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
33f40 20 70 61 67 65 72 57 61 6c 46 72 61 6d 65 73 28   pagerWalFrames(
33f50 70 50 61 67 65 72 2c 20 70 4c 69 73 74 2c 20 70  pPager, pList, p
33f60 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2c 20 31  Pager->dbSize, 1
33f70 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 28  , .            (
33f80 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
33f90 20 3f 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f   ? pPager->sync_
33fa0 66 6c 61 67 73 20 3a 20 30 29 0a 20 20 20 20 20  flags : 0).     
33fb0 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20     );.      }.  
33fc0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
33fd0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
33fe0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c   sqlite3PcacheCl
33ff0 65 61 6e 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70  eanAll(pPager->p
34000 50 43 61 63 68 65 29 3b 0a 20 20 20 20 20 20 7d  PCache);.      }
34010 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
34020 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
34030 6e 67 20 62 6c 6f 63 6b 20 75 70 64 61 74 65 73  ng block updates
34040 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
34050 74 65 72 2e 20 45 78 61 63 74 6c 79 20 68 6f 77  ter. Exactly how
34060 20 69 74 0a 20 20 20 20 20 20 2a 2a 20 64 6f 65   it.      ** doe
34070 73 20 74 68 69 73 20 64 65 70 65 6e 64 73 20 6f  s this depends o
34080 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  n whether or not
34090 20 74 68 65 20 61 74 6f 6d 69 63 2d 75 70 64 61   the atomic-upda
340a0 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a  te optimization.
340b0 20 20 20 20 20 20 2a 2a 20 77 61 73 20 65 6e 61        ** was ena
340c0 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 20  bled at compile 
340d0 74 69 6d 65 2c 20 61 6e 64 20 69 66 20 74 68 69  time, and if thi
340e0 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 65  s transaction me
340f0 65 74 73 20 74 68 65 20 0a 20 20 20 20 20 20 2a  ets the .      *
34100 2a 20 72 75 6e 74 69 6d 65 20 63 72 69 74 65 72  * runtime criter
34110 69 61 20 74 6f 20 75 73 65 20 74 68 65 20 6f 70  ia to use the op
34120 65 72 61 74 69 6f 6e 3a 20 0a 20 20 20 20 20 20  eration: .      
34130 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 2a  **.      **    *
34140 20 54 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   The file-system
34150 20 73 75 70 70 6f 72 74 73 20 74 68 65 20 61 74   supports the at
34160 6f 6d 69 63 2d 77 72 69 74 65 20 70 72 6f 70 65  omic-write prope
34170 72 74 79 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a  rty for.      **
34180 20 20 20 20 20 20 62 6c 6f 63 6b 73 20 6f 66 20        blocks of 
34190 73 69 7a 65 20 70 61 67 65 2d 73 69 7a 65 2c 20  size page-size, 
341a0 61 6e 64 20 0a 20 20 20 20 20 20 2a 2a 20 20 20  and .      **   
341b0 20 2a 20 54 68 69 73 20 63 6f 6d 6d 69 74 20 69   * This commit i
341c0 73 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 20  s not part of a 
341d0 6d 75 6c 74 69 2d 66 69 6c 65 20 74 72 61 6e 73  multi-file trans
341e0 61 63 74 69 6f 6e 2c 20 61 6e 64 0a 20 20 20 20  action, and.    
341f0 20 20 2a 2a 20 20 20 20 2a 20 45 78 61 63 74 6c    **    * Exactl
34200 79 20 6f 6e 65 20 70 61 67 65 20 68 61 73 20 62  y one page has b
34210 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 61 6e 64  een modified and
34220 20 73 74 6f 72 65 20 69 6e 20 74 68 65 20 6a 6f   store in the jo
34230 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20  urnal file..    
34240 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66    **.      ** If
34250 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f   the optimizatio
34260 6e 20 77 61 73 20 6e 6f 74 20 65 6e 61 62 6c 65  n was not enable
34270 64 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d  d at compile tim
34280 65 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20  e, then the.    
34290 20 20 2a 2a 20 70 61 67 65 72 5f 69 6e 63 72 5f    ** pager_incr_
342a0 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 20  changecounter() 
342b0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
342c0 65 64 20 74 6f 20 75 70 64 61 74 65 20 74 68 65  ed to update the
342d0 20 63 68 61 6e 67 65 0a 20 20 20 20 20 20 2a 2a   change.      **
342e0 20 63 6f 75 6e 74 65 72 20 69 6e 20 27 69 6e 64   counter in 'ind
342f0 69 72 65 63 74 2d 6d 6f 64 65 27 2e 20 49 66 20  irect-mode'. If 
34300 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  the optimization
34310 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 69 6e 20   is compiled in 
34320 62 75 74 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  but.      ** is 
34330 6e 6f 74 20 61 70 70 6c 69 63 61 62 6c 65 20 74  not applicable t
34340 6f 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  o this transacti
34350 6f 6e 2c 20 63 61 6c 6c 20 73 71 6c 69 74 65 33  on, call sqlite3
34360 4a 6f 75 72 6e 61 6c 43 72 65 61 74 65 28 29 0a  JournalCreate().
34370 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61 6b 65        ** to make
34380 20 73 75 72 65 20 74 68 65 20 6a 6f 75 72 6e 61   sure the journa
34390 6c 20 66 69 6c 65 20 68 61 73 20 61 63 74 75 61  l file has actua
343a0 6c 6c 79 20 62 65 65 6e 20 63 72 65 61 74 65 64  lly been created
343b0 2c 20 74 68 65 6e 20 63 61 6c 6c 0a 20 20 20 20  , then call.    
343c0 20 20 2a 2a 20 70 61 67 65 72 5f 69 6e 63 72 5f    ** pager_incr_
343d0 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 20  changecounter() 
343e0 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 63 68  to update the ch
343f0 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 69 6e 20  ange-counter in 
34400 69 6e 64 69 72 65 63 74 0a 20 20 20 20 20 20 2a  indirect.      *
34410 2a 20 6d 6f 64 65 2e 20 0a 20 20 20 20 20 20 2a  * mode. .      *
34420 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 74 68 65 72  *.      ** Other
34430 77 69 73 65 2c 20 69 66 20 74 68 65 20 6f 70 74  wise, if the opt
34440 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 62 6f 74  imization is bot
34450 68 20 65 6e 61 62 6c 65 64 20 61 6e 64 20 61 70  h enabled and ap
34460 70 6c 69 63 61 62 6c 65 2c 0a 20 20 20 20 20 20  plicable,.      
34470 2a 2a 20 74 68 65 6e 20 63 61 6c 6c 20 70 61 67  ** then call pag
34480 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f  er_incr_changeco
34490 75 6e 74 65 72 28 29 20 74 6f 20 75 70 64 61 74  unter() to updat
344a0 65 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  e the change-cou
344b0 6e 74 65 72 0a 20 20 20 20 20 20 2a 2a 20 69 6e  nter.      ** in
344c0 20 27 64 69 72 65 63 74 27 20 6d 6f 64 65 2e 20   'direct' mode. 
344d0 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
344e0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69   journal file wi
344f0 6c 6c 20 6e 65 76 65 72 20 62 65 0a 20 20 20 20  ll never be.    
34500 20 20 2a 2a 20 63 72 65 61 74 65 64 20 66 6f 72    ** created for
34510 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
34520 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 23 69  n..      */.  #i
34530 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
34540 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a  LE_ATOMIC_WRITE.
34550 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 67        PgHdr *pPg
34560 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
34570 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
34580 66 64 29 20 0a 20 20 20 20 20 20 20 20 20 20 20  fd) .           
34590 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  || pPager->journ
345a0 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
345b0 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20  URNALMODE_OFF . 
345c0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61            || pPa
345d0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
345e0 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
345f0 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 29  ODE_WAL .      )
34600 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 4d 61  ;.      if( !zMa
34610 73 74 65 72 20 26 26 20 69 73 4f 70 65 6e 28 70  ster && isOpen(p
34620 50 61 67 65 72 2d 3e 6a 66 64 29 20 0a 20 20 20  Pager->jfd) .   
34630 20 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a      && pPager->j
34640 6f 75 72 6e 61 6c 4f 66 66 3d 3d 6a 72 6e 6c 42  ournalOff==jrnlB
34650 75 66 66 65 72 53 69 7a 65 28 70 50 61 67 65 72  ufferSize(pPager
34660 29 20 0a 20 20 20 20 20 20 20 26 26 20 70 50 61  ) .       && pPa
34670 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 70 50 61  ger->dbSize>=pPa
34680 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 0a  ger->dbOrigSize.
34690 20 20 20 20 20 20 20 26 26 20 28 30 3d 3d 28 70         && (0==(p
346a0 50 67 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  Pg = sqlite3Pcac
346b0 68 65 44 69 72 74 79 4c 69 73 74 28 70 50 61 67  heDirtyList(pPag
346c0 65 72 2d 3e 70 50 43 61 63 68 65 29 29 20 7c 7c  er->pPCache)) ||
346d0 20 30 3d 3d 70 50 67 2d 3e 70 44 69 72 74 79 29   0==pPg->pDirty)
346e0 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
346f0 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
34700 64 62 20 66 69 6c 65 20 63 68 61 6e 67 65 20 63  db file change c
34710 6f 75 6e 74 65 72 20 76 69 61 20 74 68 65 20 64  ounter via the d
34720 69 72 65 63 74 2d 77 72 69 74 65 20 6d 65 74 68  irect-write meth
34730 6f 64 2e 20 54 68 65 20 0a 20 20 20 20 20 20 20  od. The .       
34740 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61   ** following ca
34750 6c 6c 20 77 69 6c 6c 20 6d 6f 64 69 66 79 20 74  ll will modify t
34760 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70  he in-memory rep
34770 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 70  resentation of p
34780 61 67 65 20 31 20 0a 20 20 20 20 20 20 20 20 2a  age 1 .        *
34790 2a 20 74 6f 20 69 6e 63 6c 75 64 65 20 74 68 65  * to include the
347a0 20 75 70 64 61 74 65 64 20 63 68 61 6e 67 65 20   updated change 
347b0 63 6f 75 6e 74 65 72 20 61 6e 64 20 74 68 65 6e  counter and then
347c0 20 77 72 69 74 65 20 70 61 67 65 20 31 20 0a 20   write page 1 . 
347d0 20 20 20 20 20 20 20 2a 2a 20 64 69 72 65 63 74         ** direct
347e0 6c 79 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ly to the databa
347f0 73 65 20 66 69 6c 65 2e 20 42 65 63 61 75 73 65  se file. Because
34800 20 6f 66 20 74 68 65 20 61 74 6f 6d 69 63 2d 77   of the atomic-w
34810 72 69 74 65 20 0a 20 20 20 20 20 20 20 20 2a 2a  rite .        **
34820 20 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65   property of the
34830 20 68 6f 73 74 20 66 69 6c 65 2d 73 79 73 74 65   host file-syste
34840 6d 2c 20 74 68 69 73 20 69 73 20 73 61 66 65 2e  m, this is safe.
34850 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
34860 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 69      rc = pager_i
34870 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ncr_changecounte
34880 72 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20  r(pPager, 1);.  
34890 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
348a0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a     rc = sqlite3J
348b0 6f 75 72 6e 61 6c 43 72 65 61 74 65 28 70 50 61  ournalCreate(pPa
348c0 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20  ger->jfd);.     
348d0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
348e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
348f0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 69 6e 63    rc = pager_inc
34900 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  r_changecounter(
34910 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20  pPager, 0);.    
34920 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
34930 23 65 6c 73 65 0a 20 20 20 20 20 20 72 63 20 3d  #else.      rc =
34940 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e   pager_incr_chan
34950 67 65 63 6f 75 6e 74 65 72 28 70 50 61 67 65 72  gecounter(pPager
34960 2c 20 30 29 3b 0a 20 20 23 65 6e 64 69 66 0a 20  , 0);.  #endif. 
34970 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
34980 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f  ITE_OK ) goto co
34990 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65  mmit_phase_one_e
349a0 78 69 74 3b 0a 20 20 0a 20 20 20 20 20 20 2f 2a  xit;.  .      /*
349b0 20 49 66 20 74 68 69 73 20 74 72 61 6e 73 61 63   If this transac
349c0 74 69 6f 6e 20 68 61 73 20 6d 61 64 65 20 74 68  tion has made th
349d0 65 20 64 61 74 61 62 61 73 65 20 73 6d 61 6c 6c  e database small
349e0 65 72 2c 20 74 68 65 6e 20 61 6c 6c 20 70 61 67  er, then all pag
349f0 65 73 0a 20 20 20 20 20 20 2a 2a 20 62 65 69 6e  es.      ** bein
34a00 67 20 64 69 73 63 61 72 64 65 64 20 62 79 20 74  g discarded by t
34a10 68 65 20 74 72 75 6e 63 61 74 69 6f 6e 20 6d 75  he truncation mu
34a20 73 74 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f  st be written to
34a30 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20   the journal.   
34a40 20 20 20 2a 2a 20 66 69 6c 65 2e 20 54 68 69 73     ** file. This
34a50 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e   can only happen
34a60 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   in auto-vacuum 
34a70 6d 6f 64 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  mode..      **. 
34a80 20 20 20 20 20 2a 2a 20 42 65 66 6f 72 65 20 72       ** Before r
34a90 65 61 64 69 6e 67 20 74 68 65 20 70 61 67 65 73  eading the pages
34aa0 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65   with page numbe
34ab0 72 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  rs larger than t
34ac0 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 63 75 72  he .      ** cur
34ad0 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 50 61  rent value of Pa
34ae0 67 65 72 2e 64 62 53 69 7a 65 2c 20 73 65 74 20  ger.dbSize, set 
34af0 64 62 53 69 7a 65 20 62 61 63 6b 20 74 6f 20 74  dbSize back to t
34b00 68 65 20 76 61 6c 75 65 0a 20 20 20 20 20 20 2a  he value.      *
34b10 2a 20 74 68 61 74 20 69 74 20 74 6f 6f 6b 20 61  * that it took a
34b20 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
34b30 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  he transaction. 
34b40 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 0a 20  Otherwise, the. 
34b50 20 20 20 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f       ** calls to
34b60 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
34b70 28 29 20 72 65 74 75 72 6e 20 7a 65 72 6f 65 64  () return zeroed
34b80 20 70 61 67 65 73 20 69 6e 73 74 65 61 64 20 6f   pages instead o
34b90 66 20 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 64  f .      ** read
34ba0 69 6e 67 20 64 61 74 61 20 66 72 6f 6d 20 74 68  ing data from th
34bb0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
34bc0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
34bd0 2a 2a 20 57 68 65 6e 20 6a 6f 75 72 6e 61 6c 5f  ** When journal_
34be0 6d 6f 64 65 3d 3d 4f 46 46 20 74 68 65 20 64 62  mode==OFF the db
34bf0 4f 72 69 67 53 69 7a 65 20 69 73 20 61 6c 77 61  OrigSize is alwa
34c00 79 73 20 7a 65 72 6f 2c 20 73 6f 20 74 68 69 73  ys zero, so this
34c10 0a 20 20 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 20  .      ** block 
34c20 6e 65 76 65 72 20 72 75 6e 73 20 69 66 20 6a 6f  never runs if jo
34c30 75 72 6e 61 6c 5f 6d 6f 64 65 3d 4f 46 46 2e 0a  urnal_mode=OFF..
34c40 20 20 20 20 20 20 2a 2f 0a 20 20 23 69 66 6e 64        */.  #ifnd
34c50 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
34c60 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
34c70 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  if( pPager->dbSi
34c80 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  ze<pPager->dbOri
34c90 67 53 69 7a 65 20 0a 20 20 20 20 20 20 20 26 26  gSize .       &&
34ca0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
34cb0 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode!=PAGER_JOUR
34cc0 4e 41 4c 4d 4f 44 45 5f 4f 46 46 0a 20 20 20 20  NALMODE_OFF.    
34cd0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e    ){.        Pgn
34ce0 6f 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  o i;            
34cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34d00 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
34d10 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20  or variable */. 
34d20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 50 67 6e         const Pgn
34d30 6f 20 69 53 6b 69 70 20 3d 20 50 41 47 45 52 5f  o iSkip = PAGER_
34d40 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 3b  MJ_PGNO(pPager);
34d50 20 2f 2a 20 50 65 6e 64 69 6e 67 20 6c 6f 63 6b   /* Pending lock
34d60 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20   page */.       
34d70 20 63 6f 6e 73 74 20 50 67 6e 6f 20 64 62 53 69   const Pgno dbSi
34d80 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ze = pPager->dbS
34d90 69 7a 65 3b 20 20 20 20 20 20 20 2f 2a 20 44 61  ize;       /* Da
34da0 74 61 62 61 73 65 20 69 6d 61 67 65 20 73 69 7a  tabase image siz
34db0 65 20 2a 2f 20 0a 20 20 20 20 20 20 20 20 70 50  e */ .        pP
34dc0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70  ager->dbSize = p
34dd0 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
34de0 65 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 20  e;.        for( 
34df0 69 3d 64 62 53 69 7a 65 2b 31 3b 20 69 3c 3d 70  i=dbSize+1; i<=p
34e00 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
34e10 65 3b 20 69 2b 2b 20 29 7b 0a 20 20 20 20 20 20  e; i++ ){.      
34e20 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33      if( !sqlite3
34e30 42 69 74 76 65 63 54 65 73 74 28 70 50 61 67 65  BitvecTest(pPage
34e40 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 69  r->pInJournal, i
34e50 29 20 26 26 20 69 21 3d 69 53 6b 69 70 20 29 7b  ) && i!=iSkip ){
34e60 0a 20 20 20 20 20 20 20 20 20 20 20 20 50 67 48  .            PgH
34e70 64 72 20 2a 70 50 61 67 65 3b 20 20 20 20 20 20  dr *pPage;      
34e80 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 74         /* Page t
34e90 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20  o journal */.   
34ea0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
34eb0 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50  lite3PagerGet(pP
34ec0 61 67 65 72 2c 20 69 2c 20 26 70 50 61 67 65 29  ager, i, &pPage)
34ed0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
34ee0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
34ef0 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68  ) goto commit_ph
34f00 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20  ase_one_exit;.  
34f10 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
34f20 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
34f30 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  (pPage);.       
34f40 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
34f50 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20  rUnref(pPage);. 
34f60 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
34f70 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
34f80 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65  oto commit_phase
34f90 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 20 20 20  _one_exit;.     
34fa0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
34fb0 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
34fc0 3e 64 62 53 69 7a 65 20 3d 20 64 62 53 69 7a 65  >dbSize = dbSize
34fd0 3b 0a 20 20 20 20 20 20 7d 20 0a 20 20 23 65 6e  ;.      } .  #en
34fe0 64 69 66 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20  dif.  .      /* 
34ff0 57 72 69 74 65 20 74 68 65 20 6d 61 73 74 65 72  Write the master
35000 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e   journal name in
35010 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
35020 69 6c 65 2e 20 49 66 20 61 20 6d 61 73 74 65 72  ile. If a master
35030 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e   .      ** journ
35040 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 68 61 73  al file name has
35050 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72   already been wr
35060 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75  itten to the jou
35070 72 6e 61 6c 20 66 69 6c 65 2c 20 0a 20 20 20 20  rnal file, .    
35080 20 20 2a 2a 20 6f 72 20 69 66 20 7a 4d 61 73 74    ** or if zMast
35090 65 72 20 69 73 20 4e 55 4c 4c 20 28 6e 6f 20 6d  er is NULL (no m
350a0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 29 2c 20  aster journal), 
350b0 74 68 65 6e 20 74 68 69 73 20 63 61 6c 6c 20 69  then this call i
350c0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 20 20 20  s a no-op..     
350d0 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 77   */.      rc = w
350e0 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61  riteMasterJourna
350f0 6c 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65  l(pPager, zMaste
35100 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  r);.      if( rc
35110 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
35120 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f  to commit_phase_
35130 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 0a 20 20 20  one_exit;.  .   
35140 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a     /* Sync the j
35150 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64 20  ournal file and 
35160 77 72 69 74 65 20 61 6c 6c 20 64 69 72 74 79 20  write all dirty 
35170 70 61 67 65 73 20 74 6f 20 74 68 65 20 64 61 74  pages to the dat
35180 61 62 61 73 65 2e 0a 20 20 20 20 20 20 2a 2a 20  abase..      ** 
35190 49 66 20 74 68 65 20 61 74 6f 6d 69 63 2d 75 70  If the atomic-up
351a0 64 61 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  date optimizatio
351b0 6e 20 69 73 20 62 65 69 6e 67 20 75 73 65 64 2c  n is being used,
351c0 20 74 68 69 73 20 73 79 6e 63 20 77 69 6c 6c 20   this sync will 
351d0 6e 6f 74 20 0a 20 20 20 20 20 20 2a 2a 20 63 72  not .      ** cr
351e0 65 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  eate the journal
351f0 20 66 69 6c 65 20 6f 72 20 70 65 72 66 6f 72 6d   file or perform
35200 20 61 6e 79 20 72 65 61 6c 20 49 4f 2e 0a 20 20   any real IO..  
35210 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
35220 42 65 63 61 75 73 65 20 74 68 65 20 63 68 61 6e  Because the chan
35230 67 65 2d 63 6f 75 6e 74 65 72 20 70 61 67 65 20  ge-counter page 
35240 77 61 73 20 6a 75 73 74 20 6d 6f 64 69 66 69 65  was just modifie
35250 64 2c 20 75 6e 6c 65 73 73 20 74 68 65 0a 20 20  d, unless the.  
35260 20 20 20 20 2a 2a 20 61 74 6f 6d 69 63 2d 75 70      ** atomic-up
35270 64 61 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  date optimizatio
35280 6e 20 69 73 20 75 73 65 64 20 69 74 20 69 73 20  n is used it is 
35290 61 6c 6d 6f 73 74 20 63 65 72 74 61 69 6e 20 74  almost certain t
352a0 68 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  hat the.      **
352b0 20 6a 6f 75 72 6e 61 6c 20 72 65 71 75 69 72 65   journal require
352c0 73 20 61 20 73 79 6e 63 20 68 65 72 65 2e 20 48  s a sync here. H
352d0 6f 77 65 76 65 72 2c 20 69 6e 20 6c 6f 63 6b 69  owever, in locki
352e0 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76  ng_mode=exclusiv
352f0 65 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 61 20  e.      ** on a 
35300 73 79 73 74 65 6d 20 75 6e 64 65 72 20 6d 65 6d  system under mem
35310 6f 72 79 20 70 72 65 73 73 75 72 65 20 69 74 20  ory pressure it 
35320 69 73 20 6a 75 73 74 20 70 6f 73 73 69 62 6c 65  is just possible
35330 20 74 68 61 74 20 74 68 69 73 20 69 73 20 0a 20   that this is . 
35340 20 20 20 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20       ** not the 
35350 63 61 73 65 2e 20 49 6e 20 74 68 69 73 20 63 61  case. In this ca
35360 73 65 20 69 74 20 69 73 20 6c 69 6b 65 6c 79 20  se it is likely 
35370 65 6e 6f 75 67 68 20 74 68 61 74 20 74 68 65 20  enough that the 
35380 72 65 64 75 6e 64 61 6e 74 0a 20 20 20 20 20 20  redundant.      
35390 2a 2a 20 78 53 79 6e 63 28 29 20 63 61 6c 6c 20  ** xSync() call 
353a0 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 20  will be changed 
353b0 74 6f 20 61 20 6e 6f 2d 6f 70 20 62 79 20 74 68  to a no-op by th
353c0 65 20 4f 53 20 61 6e 79 68 6f 77 2e 20 0a 20 20  e OS anyhow. .  
353d0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
353e0 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50  = syncJournal(pP
353f0 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  ager, 0);.      
35400 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
35410 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f  K ) goto commit_
35420 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a  phase_one_exit;.
35430 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
35440 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74  r_write_pagelist
35450 28 70 50 61 67 65 72 2c 73 71 6c 69 74 65 33 50  (pPager,sqlite3P
35460 63 61 63 68 65 44 69 72 74 79 4c 69 73 74 28 70  cacheDirtyList(p
35470 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 29  Pager->pPCache))
35480 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
35490 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
354a0 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21       assert( rc!
354b0 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c  =SQLITE_IOERR_BL
354c0 4f 43 4b 45 44 20 29 3b 0a 20 20 20 20 20 20 20  OCKED );.       
354d0 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61   goto commit_pha
354e0 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 20  se_one_exit;.   
354f0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
35500 65 33 50 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c  e3PcacheCleanAll
35510 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
35520 29 3b 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 49  );.  .      /* I
35530 66 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69  f the file on di
35540 73 6b 20 69 73 20 6e 6f 74 20 74 68 65 20 73 61  sk is not the sa
35550 6d 65 20 73 69 7a 65 20 61 73 20 74 68 65 20 64  me size as the d
35560 61 74 61 62 61 73 65 20 69 6d 61 67 65 2c 0a 20  atabase image,. 
35570 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 75 73 65       ** then use
35580 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 20   pager_truncate 
35590 74 6f 20 67 72 6f 77 20 6f 72 20 73 68 72 69 6e  to grow or shrin
355a0 6b 20 74 68 65 20 66 69 6c 65 20 68 65 72 65 2e  k the file here.
355b0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
355c0 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  if( pPager->dbSi
355d0 7a 65 21 3d 70 50 61 67 65 72 2d 3e 64 62 46 69  ze!=pPager->dbFi
355e0 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  leSize ){.      
355f0 20 20 50 67 6e 6f 20 6e 4e 65 77 20 3d 20 70 50    Pgno nNew = pP
35600 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 2d 20 28  ager->dbSize - (
35610 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d  pPager->dbSize==
35620 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
35630 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 20 20  ager));.        
35640 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
35650 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
35660 49 54 45 52 5f 44 42 4d 4f 44 20 29 3b 0a 20 20  ITER_DBMOD );.  
35670 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
35680 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  _truncate(pPager
35690 2c 20 6e 4e 65 77 29 3b 0a 20 20 20 20 20 20 20  , nNew);.       
356a0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
356b0 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74  OK ) goto commit
356c0 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b  _phase_one_exit;
356d0 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  .      }.  .    
356e0 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 73 79    /* Finally, sy
356f0 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nc the database 
35700 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69  file. */.      i
35710 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79  f( !pPager->noSy
35720 6e 63 20 26 26 20 21 6e 6f 53 79 6e 63 20 29 7b  nc && !noSync ){
35730 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
35740 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67  lite3OsSync(pPag
35750 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e  er->fd, pPager->
35760 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 20  sync_flags);.   
35770 20 20 20 7d 0a 20 20 20 20 20 20 49 4f 54 52 41     }.      IOTRA
35780 43 45 28 28 22 44 42 53 59 4e 43 20 25 70 5c 6e  CE(("DBSYNC %p\n
35790 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20  ", pPager)).    
357a0 7d 0a 20 20 7d 0a 0a 63 6f 6d 6d 69 74 5f 70 68  }.  }..commit_ph
357b0 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3a 0a 20 20  ase_one_exit:.  
357c0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
357d0 4b 20 26 26 20 21 70 61 67 65 72 55 73 65 57 61  K && !pagerUseWa
357e0 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
357f0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20   pPager->eState 
35800 3d 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46  = PAGER_WRITER_F
35810 49 4e 49 53 48 45 44 3b 0a 20 20 7d 0a 20 20 72  INISHED;.  }.  r
35820 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
35830 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75  .** When this fu
35840 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
35850 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  , the database f
35860 69 6c 65 20 68 61 73 20 62 65 65 6e 20 63 6f 6d  ile has been com
35870 70 6c 65 74 65 6c 79 0a 2a 2a 20 75 70 64 61 74  pletely.** updat
35880 65 64 20 74 6f 20 72 65 66 6c 65 63 74 20 74 68  ed to reflect th
35890 65 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20 62  e changes made b
358a0 79 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  y the current tr
358b0 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a  ansaction and.**
358c0 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e   synced to disk.
358d0 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
358e0 65 20 73 74 69 6c 6c 20 65 78 69 73 74 73 20 69  e still exists i
358f0 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  n the file-syste
35900 6d 20 0a 2a 2a 20 74 68 6f 75 67 68 2c 20 61 6e  m .** though, an
35910 64 20 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f  d if a failure o
35920 63 63 75 72 73 20 61 74 20 74 68 69 73 20 70 6f  ccurs at this po
35930 69 6e 74 20 69 74 20 77 69 6c 6c 20 65 76 65 6e  int it will even
35940 74 75 61 6c 6c 79 0a 2a 2a 20 62 65 20 75 73 65  tually.** be use
35950 64 20 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  d as a hot-journ
35960 61 6c 20 61 6e 64 20 74 68 65 20 63 75 72 72 65  al and the curre
35970 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72  nt transaction r
35980 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a  olled back..**.*
35990 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
359a0 66 69 6e 61 6c 69 7a 65 73 20 74 68 65 20 6a 6f  finalizes the jo
359b0 75 72 6e 61 6c 20 66 69 6c 65 2c 20 65 69 74 68  urnal file, eith
359c0 65 72 20 62 79 20 64 65 6c 65 74 69 6e 67 2c 20  er by deleting, 
359d0 0a 2a 2a 20 74 72 75 6e 63 61 74 69 6e 67 20 6f  .** truncating o
359e0 72 20 70 61 72 74 69 61 6c 6c 79 20 7a 65 72 6f  r partially zero
359f0 69 6e 67 20 69 74 2c 20 73 6f 20 74 68 61 74 20  ing it, so that 
35a00 69 74 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65  it cannot be use
35a10 64 20 0a 2a 2a 20 66 6f 72 20 68 6f 74 2d 6a 6f  d .** for hot-jo
35a20 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20  urnal rollback. 
35a30 4f 6e 63 65 20 74 68 69 73 20 69 73 20 64 6f 6e  Once this is don
35a40 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  e the transactio
35a50 6e 20 69 73 0a 2a 2a 20 69 72 72 65 76 6f 63 61  n is.** irrevoca
35a60 62 6c 79 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a  bly committed..*
35a70 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
35a80 20 6f 63 63 75 72 73 2c 20 61 6e 20 49 4f 20 65   occurs, an IO e
35a90 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
35aa0 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 70 61  urned and the pa
35ab0 67 65 72 0a 2a 2a 20 6d 6f 76 65 73 20 69 6e 74  ger.** moves int
35ac0 6f 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  o the error stat
35ad0 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51  e. Otherwise, SQ
35ae0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
35af0 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ned..*/.int sqli
35b00 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
35b10 61 73 65 54 77 6f 28 50 61 67 65 72 20 2a 70 50  aseTwo(Pager *pP
35b20 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
35b30 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
35b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
35b50 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
35b60 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69  .  /* This routi
35b70 6e 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65  ne should not be
35b80 20 63 61 6c 6c 65 64 20 69 66 20 61 20 70 72 69   called if a pri
35b90 6f 72 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63  or error has occ
35ba0 75 72 72 65 64 2e 0a 20 20 2a 2a 20 42 75 74 20  urred..  ** But 
35bb0 69 66 20 28 64 75 65 20 74 6f 20 61 20 63 6f 64  if (due to a cod
35bc0 69 6e 67 20 65 72 72 6f 72 20 65 6c 73 65 77 68  ing error elsewh
35bd0 65 72 65 20 69 6e 20 74 68 65 20 73 79 73 74 65  ere in the syste
35be0 6d 29 20 69 74 20 64 6f 65 73 20 67 65 74 0a 20  m) it does get. 
35bf0 20 2a 2a 20 63 61 6c 6c 65 64 2c 20 6a 75 73 74   ** called, just
35c00 20 72 65 74 75 72 6e 20 74 68 65 20 73 61 6d 65   return the same
35c10 20 65 72 72 6f 72 20 63 6f 64 65 20 77 69 74 68   error code with
35c20 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69  out doing anythi
35c30 6e 67 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56  ng. */.  if( NEV
35c40 45 52 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  ER(pPager->errCo
35c50 64 65 29 20 29 20 72 65 74 75 72 6e 20 70 50 61  de) ) return pPa
35c60 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20  ger->errCode;.. 
35c70 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
35c80 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
35c90 52 49 54 45 52 5f 49 4e 49 54 49 41 4c 0a 20 20  RITER_INITIAL.  
35ca0 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e       || pPager->
35cb0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
35cc0 49 54 45 52 5f 46 49 4e 49 53 48 45 44 0a 20 20  ITER_FINISHED.  
35cd0 20 20 20 20 20 7c 7c 20 28 70 61 67 65 72 55 73       || (pagerUs
35ce0 65 57 61 6c 28 70 50 61 67 65 72 29 20 26 26 20  eWal(pPager) && 
35cf0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
35d00 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
35d10 48 45 4d 4f 44 29 0a 20 20 29 3b 0a 20 20 61 73  HEMOD).  );.  as
35d20 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
35d30 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
35d40 20 29 3b 0a 0a 20 20 2f 2a 20 41 6e 20 6f 70 74   );..  /* An opt
35d50 69 6d 69 7a 61 74 69 6f 6e 2e 20 49 66 20 74 68  imization. If th
35d60 65 20 64 61 74 61 62 61 73 65 20 77 61 73 20 6e  e database was n
35d70 6f 74 20 61 63 74 75 61 6c 6c 79 20 6d 6f 64 69  ot actually modi
35d80 66 69 65 64 20 64 75 72 69 6e 67 0a 20 20 2a 2a  fied during.  **
35d90 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
35da0 6e 2c 20 74 68 65 20 70 61 67 65 72 20 69 73 20  n, the pager is 
35db0 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75  running in exclu
35dc0 73 69 76 65 2d 6d 6f 64 65 20 61 6e 64 20 69 73  sive-mode and is
35dd0 0a 20 20 2a 2a 20 75 73 69 6e 67 20 70 65 72 73  .  ** using pers
35de0 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 2c  istent journals,
35df0 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   then this funct
35e00 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
35e10 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 73 74    **.  ** The st
35e20 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  art of the journ
35e30 61 6c 20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c  al file currentl
35e40 79 20 63 6f 6e 74 61 69 6e 73 20 61 20 73 69 6e  y contains a sin
35e50 67 6c 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a  gle journal .  *
35e60 2a 20 68 65 61 64 65 72 20 77 69 74 68 20 74 68  * header with th
35e70 65 20 6e 52 65 63 20 66 69 65 6c 64 20 73 65 74  e nRec field set
35e80 20 74 6f 20 30 2e 20 49 66 20 73 75 63 68 20 61   to 0. If such a
35e90 20 6a 6f 75 72 6e 61 6c 20 69 73 20 75 73 65 64   journal is used
35ea0 20 61 73 0a 20 20 2a 2a 20 61 20 68 6f 74 2d 6a   as.  ** a hot-j
35eb0 6f 75 72 6e 61 6c 20 64 75 72 69 6e 67 20 68 6f  ournal during ho
35ec0 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
35ed0 63 6b 2c 20 30 20 63 68 61 6e 67 65 73 20 77 69  ck, 0 changes wi
35ee0 6c 6c 20 62 65 20 6d 61 64 65 0a 20 20 2a 2a 20  ll be made.  ** 
35ef0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
35f00 66 69 6c 65 2e 20 53 6f 20 74 68 65 72 65 20 69  file. So there i
35f10 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 7a 65 72  s no need to zer
35f20 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20  o the journal . 
35f30 20 2a 2a 20 68 65 61 64 65 72 2e 20 53 69 6e 63   ** header. Sinc
35f40 65 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  e the pager is i
35f50 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
35f60 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65  , there is no ne
35f70 65 64 0a 20 20 2a 2a 20 74 6f 20 64 72 6f 70 20  ed.  ** to drop 
35f80 61 6e 79 20 6c 6f 63 6b 73 20 65 69 74 68 65 72  any locks either
35f90 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
35fa0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
35fb0 45 52 5f 57 52 49 54 45 52 5f 49 4e 49 54 49 41  ER_WRITER_INITIA
35fc0 4c 20 0a 20 20 20 26 26 20 70 50 61 67 65 72 2d  L .   && pPager-
35fd0 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a  >exclusiveMode .
35fe0 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f     && pPager->jo
35ff0 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
36000 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52  _JOURNALMODE_PER
36010 53 49 53 54 0a 20 20 29 7b 0a 20 20 20 20 61 73  SIST.  ){.    as
36020 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
36030 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41  urnalOff==JOURNA
36040 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
36050 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75   || !pPager->jou
36060 72 6e 61 6c 4f 66 66 20 29 3b 0a 20 20 20 20 70  rnalOff );.    p
36070 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20  Pager->eState = 
36080 50 41 47 45 52 5f 52 45 41 44 45 52 3b 0a 20 20  PAGER_READER;.  
36090 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
360a0 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52  OK;.  }..  PAGER
360b0 54 52 41 43 45 28 28 22 43 4f 4d 4d 49 54 20 25  TRACE(("COMMIT %
360c0 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
360d0 61 67 65 72 29 29 29 3b 0a 20 20 72 63 20 3d 20  ager)));.  rc = 
360e0 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61  pager_end_transa
360f0 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 70 50  ction(pPager, pP
36100 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 29  ager->setMaster)
36110 3b 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65 72  ;.  return pager
36120 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72  _error(pPager, r
36130 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c  c);.}../*.** Rol
36140 6c 62 61 63 6b 20 61 6c 6c 20 63 68 61 6e 67 65  lback all change
36150 73 2e 20 54 68 65 20 64 61 74 61 62 61 73 65 20  s. The database 
36160 66 61 6c 6c 73 20 62 61 63 6b 20 74 6f 20 50 41  falls back to PA
36170 47 45 52 5f 53 48 41 52 45 44 20 6d 6f 64 65 2e  GER_SHARED mode.
36180 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
36190 74 69 6f 6e 20 70 65 72 66 6f 72 6d 73 20 74 77  tion performs tw
361a0 6f 20 74 61 73 6b 73 3a 0a 2a 2a 0a 2a 2a 20 20  o tasks:.**.**  
361b0 20 31 29 20 49 74 20 72 6f 6c 6c 73 20 62 61 63   1) It rolls bac
361c0 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  k the journal fi
361d0 6c 65 2c 20 72 65 73 74 6f 72 69 6e 67 20 61 6c  le, restoring al
361e0 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  l database file 
361f0 61 6e 64 20 0a 2a 2a 20 20 20 20 20 20 69 6e 2d  and .**      in-
36200 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 70 61 67  memory cache pag
36210 65 73 20 74 6f 20 74 68 65 20 73 74 61 74 65 20  es to the state 
36220 74 68 65 79 20 77 65 72 65 20 69 6e 20 77 68 65  they were in whe
36230 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  n the transactio
36240 6e 0a 2a 2a 20 20 20 20 20 20 77 61 73 20 6f 70  n.**      was op
36250 65 6e 65 64 2c 20 61 6e 64 0a 2a 2a 20 20 20 32  ened, and.**   2
36260 29 20 49 74 20 66 69 6e 61 6c 69 7a 65 73 20 74  ) It finalizes t
36270 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  he journal file,
36280 20 73 6f 20 74 68 61 74 20 69 74 20 69 73 20 6e   so that it is n
36290 6f 74 20 75 73 65 64 20 66 6f 72 20 68 6f 74 0a  ot used for hot.
362a0 2a 2a 20 20 20 20 20 20 72 6f 6c 6c 62 61 63 6b  **      rollback
362b0 20 61 74 20 61 6e 79 20 70 6f 69 6e 74 20 69 6e   at any point in
362c0 20 74 68 65 20 66 75 74 75 72 65 2e 0a 2a 2a 0a   the future..**.
362d0 2a 2a 20 73 75 62 6a 65 63 74 20 74 6f 20 74 68  ** subject to th
362e0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 61 6c  e following qual
362f0 69 66 69 63 61 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a  ifications:.**.*
36300 2a 20 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  * * If the journ
36310 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 79  al file is not y
36320 65 74 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69  et open when thi
36330 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
36340 6c 6c 65 64 2c 0a 2a 2a 20 20 20 74 68 65 6e 20  lled,.**   then 
36350 6f 6e 6c 79 20 28 32 29 20 69 73 20 70 65 72 66  only (2) is perf
36360 6f 72 6d 65 64 2e 20 49 6e 20 74 68 69 73 20 63  ormed. In this c
36370 61 73 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20  ase there is no 
36380 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
36390 20 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 2e 0a    to roll back..
363a0 2a 2a 0a 2a 2a 20 2a 20 49 66 20 69 6e 20 61 6e  **.** * If in an
363b0 20 65 72 72 6f 72 20 73 74 61 74 65 20 6f 74 68   error state oth
363c0 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 46  er than SQLITE_F
363d0 55 4c 4c 2c 20 74 68 65 6e 20 74 61 73 6b 20 28  ULL, then task (
363e0 31 29 20 69 73 20 0a 2a 2a 20 20 20 70 65 72 66  1) is .**   perf
363f0 6f 72 6d 65 64 2e 20 49 66 20 73 75 63 63 65 73  ormed. If succes
36400 73 66 75 6c 2c 20 74 61 73 6b 20 28 32 29 2e 20  sful, task (2). 
36410 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68  Regardless of th
36420 65 20 6f 75 74 63 6f 6d 65 0a 2a 2a 20 20 20 6f  e outcome.**   o
36430 66 20 65 69 74 68 65 72 2c 20 74 68 65 20 65 72  f either, the er
36440 72 6f 72 20 73 74 61 74 65 20 65 72 72 6f 72 20  ror state error 
36450 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
36460 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 0a 2a   to the caller.*
36470 2a 20 20 20 28 69 2e 65 2e 20 65 69 74 68 65 72  *   (i.e. either
36480 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72   SQLITE_IOERR or
36490 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 29   SQLITE_CORRUPT)
364a0 2e 0a 2a 2a 0a 2a 2a 20 2a 20 49 66 20 74 68 65  ..**.** * If the
364b0 20 70 61 67 65 72 20 69 73 20 69 6e 20 50 41 47   pager is in PAG
364c0 45 52 5f 52 45 53 45 52 56 45 44 20 73 74 61 74  ER_RESERVED stat
364d0 65 2c 20 74 68 65 6e 20 61 74 74 65 6d 70 74 20  e, then attempt 
364e0 28 31 29 2e 20 57 68 65 74 68 65 72 0a 2a 2a 20  (1). Whether.** 
364f0 20 20 6f 72 20 6e 6f 74 20 28 31 29 20 69 73 20    or not (1) is 
36500 73 75 63 63 65 73 73 66 75 6c 2c 20 61 6c 73 6f  successful, also
36510 20 61 74 74 65 6d 70 74 20 28 32 29 2e 20 49 66   attempt (2). If
36520 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74   successful, ret
36530 75 72 6e 0a 2a 2a 20 20 20 53 51 4c 49 54 45 5f  urn.**   SQLITE_
36540 4f 4b 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 65  OK. Otherwise, e
36550 6e 74 65 72 20 74 68 65 20 65 72 72 6f 72 20 73  nter the error s
36560 74 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20  tate and return 
36570 74 68 65 20 66 69 72 73 74 20 0a 2a 2a 20 20 20  the first .**   
36580 65 72 72 6f 72 20 63 6f 64 65 20 65 6e 63 6f 75  error code encou
36590 6e 74 65 72 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 20  ntered. .**.**  
365a0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
365b0 65 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65  ere is no chance
365c0 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61   that the databa
365d0 73 65 20 77 61 73 20 77 72 69 74 74 65 6e 20 74  se was written t
365e0 6f 2e 20 0a 2a 2a 20 20 20 53 6f 20 69 73 20 73  o. .**   So is s
365f0 61 66 65 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20  afe to finalize 
36600 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
36610 20 65 76 65 6e 20 69 66 20 74 68 65 20 70 6c 61   even if the pla
36620 79 62 61 63 6b 20 0a 2a 2a 20 20 20 28 6f 70 65  yback .**   (ope
36630 72 61 74 69 6f 6e 20 31 29 20 66 61 69 6c 65 64  ration 1) failed
36640 2e 20 48 6f 77 65 76 65 72 20 74 68 65 20 70 61  . However the pa
36650 67 65 72 20 6d 75 73 74 20 65 6e 74 65 72 20 74  ger must enter t
36660 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 0a 2a  he error state.*
36670 2a 20 20 20 61 73 20 74 68 65 20 63 6f 6e 74 65  *   as the conte
36680 6e 74 73 20 6f 66 20 74 68 65 20 69 6e 2d 6d 65  nts of the in-me
36690 6d 6f 72 79 20 63 61 63 68 65 20 61 72 65 20 6e  mory cache are n
366a0 6f 77 20 73 75 73 70 65 63 74 2e 0a 2a 2a 0a 2a  ow suspect..**.*
366b0 2a 20 2a 20 46 69 6e 61 6c 6c 79 2c 20 69 66 20  * * Finally, if 
366c0 69 6e 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49  in PAGER_EXCLUSI
366d0 56 45 20 73 74 61 74 65 2c 20 74 68 65 6e 20 61  VE state, then a
366e0 74 74 65 6d 70 74 20 28 31 29 2e 20 4f 6e 6c 79  ttempt (1). Only
366f0 0a 2a 2a 20 20 20 61 74 74 65 6d 70 74 20 28 32  .**   attempt (2
36700 29 20 69 66 20 28 31 29 20 69 73 20 73 75 63 63  ) if (1) is succ
36710 65 73 73 66 75 6c 2e 20 52 65 74 75 72 6e 20 53  essful. Return S
36720 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63  QLITE_OK if succ
36730 65 73 73 66 75 6c 2c 0a 2a 2a 20 20 20 6f 74 68  essful,.**   oth
36740 65 72 77 69 73 65 20 65 6e 74 65 72 20 74 68 65  erwise enter the
36750 20 65 72 72 6f 72 20 73 74 61 74 65 20 61 6e 64   error state and
36760 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f   return the erro
36770 72 20 63 6f 64 65 20 66 72 6f 6d 20 74 68 65 20  r code from the 
36780 0a 2a 2a 20 20 20 66 61 69 6c 69 6e 67 20 6f 70  .**   failing op
36790 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20  eration..**.**  
367a0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
367b0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
367c0 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 77 72  may have been wr
367d0 69 74 74 65 6e 20 74 6f 2e 20 53 6f 20 69 66 20  itten to. So if 
367e0 74 68 65 0a 2a 2a 20 20 20 70 6c 61 79 62 61 63  the.**   playbac
367f0 6b 20 6f 70 65 72 61 74 69 6f 6e 20 64 69 64 20  k operation did 
36800 6e 6f 74 20 73 75 63 63 65 65 64 20 69 74 20 77  not succeed it w
36810 6f 75 6c 64 20 6e 6f 74 20 62 65 20 73 61 66 65  ould not be safe
36820 20 74 6f 20 66 69 6e 61 6c 69 7a 65 0a 2a 2a 20   to finalize.** 
36830 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69    the journal fi
36840 6c 65 2e 20 49 74 20 6e 65 65 64 73 20 74 6f 20  le. It needs to 
36850 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66  be left in the f
36860 69 6c 65 2d 73 79 73 74 65 6d 20 73 6f 20 74 68  ile-system so th
36870 61 74 0a 2a 2a 20 20 20 73 6f 6d 65 20 6f 74 68  at.**   some oth
36880 65 72 20 70 72 6f 63 65 73 73 20 63 61 6e 20 75  er process can u
36890 73 65 20 69 74 20 74 6f 20 72 65 73 74 6f 72 65  se it to restore
368a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 74   the database st
368b0 61 74 65 20 28 62 79 0a 2a 2a 20 20 20 68 6f 74  ate (by.**   hot
368c0 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
368d0 6b 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  k)..*/.int sqlit
368e0 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
368f0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
36900 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
36910 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
36920 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
36930 20 63 6f 64 65 20 2a 2f 0a 20 20 50 41 47 45 52   code */.  PAGER
36940 54 52 41 43 45 28 28 22 52 4f 4c 4c 42 41 43 4b  TRACE(("ROLLBACK
36950 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
36960 70 50 61 67 65 72 29 29 29 3b 0a 0a 20 20 2f 2a  pPager)));..  /*
36970 20 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29   PagerRollback()
36980 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 63   is a no-op if c
36990 61 6c 6c 65 64 20 69 6e 20 52 45 41 44 45 52 20  alled in READER 
369a0 6f 72 20 4e 4f 4e 45 20 73 74 61 74 65 2e 20 49  or NONE state. I
369b0 66 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 72  f.  ** the pager
369c0 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74   is already in t
369d0 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20  he ERROR state, 
369e0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20  the rollback is 
369f0 6e 6f 74 20 0a 20 20 2a 2a 20 61 74 74 65 6d 70  not .  ** attemp
36a00 74 65 64 20 68 65 72 65 2e 20 49 6e 73 74 65 61  ted here. Instea
36a10 64 2c 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  d, the error cod
36a20 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f  e is returned to
36a30 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 2a   the caller..  *
36a40 2f 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65  /.  assert( asse
36a50 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
36a60 50 61 67 65 72 29 20 29 3b 0a 20 20 69 66 28 20  Pager) );.  if( 
36a70 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
36a80 50 41 47 45 52 5f 45 52 52 4f 52 20 29 20 72 65  PAGER_ERROR ) re
36a90 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72  turn pPager->err
36aa0 43 6f 64 65 3b 0a 20 20 69 66 28 20 70 50 61 67  Code;.  if( pPag
36ab0 65 72 2d 3e 65 53 74 61 74 65 3c 3d 50 41 47 45  er->eState<=PAGE
36ac0 52 5f 52 45 41 44 45 52 20 29 20 72 65 74 75 72  R_READER ) retur
36ad0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  n SQLITE_OK;..  
36ae0 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  if( pagerUseWal(
36af0 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 69  pPager) ){.    i
36b00 6e 74 20 72 63 32 3b 0a 20 20 20 20 72 63 20 3d  nt rc2;.    rc =
36b10 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 61 76   sqlite3PagerSav
36b20 65 70 6f 69 6e 74 28 70 50 61 67 65 72 2c 20 53  epoint(pPager, S
36b30 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
36b40 4b 2c 20 2d 31 29 3b 0a 20 20 20 20 72 63 32 20  K, -1);.    rc2 
36b50 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e  = pager_end_tran
36b60 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20  saction(pPager, 
36b70 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
36b80 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  r);.    if( rc==
36b90 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d  SQLITE_OK ) rc =
36ba0 20 72 63 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66   rc2;.  }else if
36bb0 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  ( !isOpen(pPager
36bc0 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 72 63  ->jfd) ){.    rc
36bd0 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61   = pager_end_tra
36be0 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c  nsaction(pPager,
36bf0 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   0);.  }else{.  
36c00 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
36c10 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29  yback(pPager, 0)
36c20 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
36c30 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
36c40 50 41 47 45 52 5f 52 45 41 44 45 52 20 7c 7c 20  PAGER_READER || 
36c50 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
36c60 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53  .  assert( rc==S
36c70 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d  QLITE_OK || rc==
36c80 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 20 28  SQLITE_FULL || (
36c90 72 63 26 30 78 46 46 29 3d 3d 53 51 4c 49 54 45  rc&0xFF)==SQLITE
36ca0 5f 49 4f 45 52 52 20 29 3b 0a 0a 20 20 2f 2a 20  _IOERR );..  /* 
36cb0 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
36cc0 72 73 20 64 75 72 69 6e 67 20 61 20 52 4f 4c 4c  rs during a ROLL
36cd0 42 41 43 4b 2c 20 77 65 20 63 61 6e 20 6e 6f 20  BACK, we can no 
36ce0 6c 6f 6e 67 65 72 20 74 72 75 73 74 20 74 68 65  longer trust the
36cf0 20 70 61 67 65 72 0a 20 20 2a 2a 20 63 61 63 68   pager.  ** cach
36d00 65 2e 20 53 6f 20 63 61 6c 6c 20 70 61 67 65 72  e. So call pager
36d10 5f 65 72 72 6f 72 28 29 20 6f 6e 20 74 68 65 20  _error() on the 
36d20 77 61 79 20 6f 75 74 20 74 6f 20 6d 61 6b 65 20  way out to make 
36d30 61 6e 79 20 65 72 72 6f 72 20 70 65 72 73 69 73  any error persis
36d40 74 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 72 65 74  tent..  */.  ret
36d50 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28  urn pager_error(
36d60 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 7d 0a 0a  pPager, rc);.}..
36d70 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
36d80 45 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  E if the databas
36d90 65 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64  e file is opened
36da0 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 52 65 74   read-only.  Ret
36db0 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20  urn FALSE.** if 
36dc0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
36dd0 28 69 6e 20 74 68 65 6f 72 79 29 20 77 72 69 74  (in theory) writ
36de0 61 62 6c 65 2e 0a 2a 2f 0a 75 38 20 73 71 6c 69  able..*/.u8 sqli
36df0 74 65 33 50 61 67 65 72 49 73 72 65 61 64 6f 6e  te3PagerIsreadon
36e00 6c 79 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ly(Pager *pPager
36e10 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
36e20 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b 0a 7d 0a  er->readOnly;.}.
36e30 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
36e40 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65  e number of refe
36e50 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61  rences to the pa
36e60 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ger..*/.int sqli
36e70 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74  te3PagerRefcount
36e80 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
36e90 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
36ea0 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28  3PcacheRefCount(
36eb0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
36ec0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
36ed0 6e 20 74 68 65 20 61 70 70 72 6f 78 69 6d 61 74  n the approximat
36ee0 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
36ef0 73 20 6f 66 20 6d 65 6d 6f 72 79 20 63 75 72 72  s of memory curr
36f00 65 6e 74 6c 79 0a 2a 2a 20 75 73 65 64 20 62 79  ently.** used by
36f10 20 74 68 65 20 70 61 67 65 72 20 61 6e 64 20 69   the pager and i
36f20 74 73 20 61 73 73 6f 63 69 61 74 65 64 20 63 61  ts associated ca
36f30 63 68 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  che..*/.int sqli
36f40 74 65 33 50 61 67 65 72 4d 65 6d 55 73 65 64 28  te3PagerMemUsed(
36f50 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
36f60 20 20 69 6e 74 20 70 65 72 50 61 67 65 53 69 7a    int perPageSiz
36f70 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65  e = pPager->page
36f80 53 69 7a 65 20 2b 20 70 50 61 67 65 72 2d 3e 6e  Size + pPager->n
36f90 45 78 74 72 61 20 2b 20 73 69 7a 65 6f 66 28 50  Extra + sizeof(P
36fa0 67 48 64 72 29 0a 20 20 20 20 20 20 20 20 20 20  gHdr).          
36fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36fc0 20 20 20 20 20 20 20 20 20 20 20 2b 20 35 2a 73             + 5*s
36fd0 69 7a 65 6f 66 28 76 6f 69 64 2a 29 3b 0a 20 20  izeof(void*);.  
36fe0 72 65 74 75 72 6e 20 70 65 72 50 61 67 65 53 69  return perPageSi
36ff0 7a 65 2a 73 71 6c 69 74 65 33 50 63 61 63 68 65  ze*sqlite3Pcache
37000 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
37010 2d 3e 70 50 43 61 63 68 65 29 0a 20 20 20 20 20  ->pPCache).     
37020 20 20 20 20 20 20 2b 20 73 71 6c 69 74 65 33 4d        + sqlite3M
37030 61 6c 6c 6f 63 53 69 7a 65 28 70 50 61 67 65 72  allocSize(pPager
37040 29 0a 20 20 20 20 20 20 20 20 20 20 20 2b 20 70  ).           + p
37050 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
37060 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
37070 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
37080 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
37090 20 73 70 65 63 69 66 69 65 64 20 70 61 67 65 2e   specified page.
370a0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
370b0 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74  agerPageRefcount
370c0 28 44 62 50 61 67 65 20 2a 70 50 61 67 65 29 7b  (DbPage *pPage){
370d0 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
370e0 33 50 63 61 63 68 65 50 61 67 65 52 65 66 63 6f  3PcachePageRefco
370f0 75 6e 74 28 70 50 61 67 65 29 3b 0a 7d 0a 0a 23  unt(pPage);.}..#
37100 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
37110 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  T./*.** This rou
37120 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72  tine is used for
37130 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61   testing and ana
37140 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69  lysis only..*/.i
37150 6e 74 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  nt *sqlite3Pager
37160 53 74 61 74 73 28 50 61 67 65 72 20 2a 70 50 61  Stats(Pager *pPa
37170 67 65 72 29 7b 0a 20 20 73 74 61 74 69 63 20 69  ger){.  static i
37180 6e 74 20 61 5b 31 31 5d 3b 0a 20 20 61 5b 30 5d  nt a[11];.  a[0]
37190 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
371a0 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d  RefCount(pPager-
371b0 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 61 5b 31  >pPCache);.  a[1
371c0 5d 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  ] = sqlite3Pcach
371d0 65 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  ePagecount(pPage
371e0 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 61  r->pPCache);.  a
371f0 5b 32 5d 20 3d 20 73 71 6c 69 74 65 33 50 63 61  [2] = sqlite3Pca
37200 63 68 65 47 65 74 43 61 63 68 65 73 69 7a 65 28  cheGetCachesize(
37210 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
37220 3b 0a 20 20 61 5b 33 5d 20 3d 20 70 50 61 67 65  ;.  a[3] = pPage
37230 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
37240 5f 4e 4f 4e 45 20 3f 20 2d 31 20 3a 20 28 69 6e  _NONE ? -1 : (in
37250 74 29 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  t) pPager->dbSiz
37260 65 3b 0a 20 20 61 5b 34 5d 20 3d 20 70 50 61 67  e;.  a[4] = pPag
37270 65 72 2d 3e 65 53 74 61 74 65 3b 0a 20 20 61 5b  er->eState;.  a[
37280 35 5d 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72  5] = pPager->err
37290 43 6f 64 65 3b 0a 20 20 61 5b 36 5d 20 3d 20 70  Code;.  a[6] = p
372a0 50 61 67 65 72 2d 3e 6e 48 69 74 3b 0a 20 20 61  Pager->nHit;.  a
372b0 5b 37 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 4d  [7] = pPager->nM
372c0 69 73 73 3b 0a 20 20 61 5b 38 5d 20 3d 20 30 3b  iss;.  a[8] = 0;
372d0 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 62 65 20    /* Used to be 
372e0 70 50 61 67 65 72 2d 3e 6e 4f 76 66 6c 20 2a 2f  pPager->nOvfl */
372f0 0a 20 20 61 5b 39 5d 20 3d 20 70 50 61 67 65 72  .  a[9] = pPager
37300 2d 3e 6e 52 65 61 64 3b 0a 20 20 61 5b 31 30 5d  ->nRead;.  a[10]
37310 20 3d 20 70 50 61 67 65 72 2d 3e 6e 57 72 69 74   = pPager->nWrit
37320 65 3b 0a 20 20 72 65 74 75 72 6e 20 61 3b 0a 7d  e;.  return a;.}
37330 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
37340 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
37350 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f  is is an in-memo
37360 72 79 20 70 61 67 65 72 2e 0a 2a 2f 0a 69 6e 74  ry pager..*/.int
37370 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 4d   sqlite3PagerIsM
37380 65 6d 64 62 28 50 61 67 65 72 20 2a 70 50 61 67  emdb(Pager *pPag
37390 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 4d 45  er){.  return ME
373a0 4d 44 42 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  MDB;.}../*.** Ch
373b0 65 63 6b 20 74 68 61 74 20 74 68 65 72 65 20 61  eck that there a
373c0 72 65 20 61 74 20 6c 65 61 73 74 20 6e 53 61 76  re at least nSav
373d0 65 70 6f 69 6e 74 20 73 61 76 65 70 6f 69 6e 74  epoint savepoint
373e0 73 20 6f 70 65 6e 2e 20 49 66 20 74 68 65 72 65  s open. If there
373f0 20 61 72 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c   are.** currentl
37400 79 20 6c 65 73 73 20 74 68 61 6e 20 6e 53 61 76  y less than nSav
37410 65 70 6f 69 6e 74 73 20 6f 70 65 6e 2c 20 74 68  epoints open, th
37420 65 6e 20 6f 70 65 6e 20 6f 6e 65 20 6f 72 20 6d  en open one or m
37430 6f 72 65 20 73 61 76 65 70 6f 69 6e 74 73 0a 2a  ore savepoints.*
37440 2a 20 74 6f 20 6d 61 6b 65 20 75 70 20 74 68 65  * to make up the
37450 20 64 69 66 66 65 72 65 6e 63 65 2e 20 49 66 20   difference. If 
37460 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 61  the number of sa
37470 76 65 70 6f 69 6e 74 73 20 69 73 20 61 6c 72 65  vepoints is alre
37480 61 64 79 0a 2a 2a 20 65 71 75 61 6c 20 74 6f 20  ady.** equal to 
37490 6e 53 61 76 65 70 6f 69 6e 74 2c 20 74 68 65 6e  nSavepoint, then
374a0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
374b0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
374c0 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c   If a memory all
374d0 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20 53  ocation fails, S
374e0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72  QLITE_NOMEM is r
374f0 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 65  eturned. If an e
37500 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 20  rror .** occurs 
37510 77 68 69 6c 65 20 6f 70 65 6e 69 6e 67 20 74 68  while opening th
37520 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69  e sub-journal fi
37530 6c 65 2c 20 74 68 65 6e 20 61 6e 20 49 4f 20 65  le, then an IO e
37540 72 72 6f 72 20 63 6f 64 65 20 69 73 0a 2a 2a 20  rror code is.** 
37550 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
37560 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  ise, SQLITE_OK..
37570 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
37580 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74  gerOpenSavepoint
37590 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
375a0 69 6e 74 20 6e 53 61 76 65 70 6f 69 6e 74 29 7b  int nSavepoint){
375b0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
375c0 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
375d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
375e0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
375f0 20 69 6e 74 20 6e 43 75 72 72 65 6e 74 20 3d 20   int nCurrent = 
37600 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
37610 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 75  nt;        /* Cu
37620 72 72 65 6e 74 20 6e 75 6d 62 65 72 20 6f 66 20  rrent number of 
37630 73 61 76 65 70 6f 69 6e 74 73 20 2a 2f 0a 0a 20  savepoints */.. 
37640 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
37650 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57  >eState>=PAGER_W
37660 52 49 54 45 52 5f 49 4e 49 54 49 41 4c 20 29 3b  RITER_INITIAL );
37670 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72  .  assert( asser
37680 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
37690 61 67 65 72 29 20 29 3b 0a 0a 20 20 69 66 28 20  ager) );..  if( 
376a0 6e 53 61 76 65 70 6f 69 6e 74 3e 6e 43 75 72 72  nSavepoint>nCurr
376b0 65 6e 74 20 26 26 20 70 50 61 67 65 72 2d 3e 75  ent && pPager->u
376c0 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  seJournal ){.   
376d0 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20   int ii;        
376e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
376f0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
37700 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f  ator variable */
37710 0a 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f  .    PagerSavepo
37720 69 6e 74 20 2a 61 4e 65 77 3b 20 20 20 20 20 20  int *aNew;      
37730 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
37740 4e 65 77 20 50 61 67 65 72 2e 61 53 61 76 65 70  New Pager.aSavep
37750 6f 69 6e 74 20 61 72 72 61 79 20 2a 2f 0a 0a 20  oint array */.. 
37760 20 20 20 2f 2a 20 47 72 6f 77 20 74 68 65 20 50     /* Grow the P
37770 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 20  ager.aSavepoint 
37780 61 72 72 61 79 20 75 73 69 6e 67 20 72 65 61 6c  array using real
37790 6c 6f 63 28 29 2e 20 52 65 74 75 72 6e 20 53 51  loc(). Return SQ
377a0 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20 20 20 20 2a  LITE_NOMEM.    *
377b0 2a 20 69 66 20 74 68 65 20 61 6c 6c 6f 63 61 74  * if the allocat
377c0 69 6f 6e 20 66 61 69 6c 73 2e 20 4f 74 68 65 72  ion fails. Other
377d0 77 69 73 65 2c 20 7a 65 72 6f 20 74 68 65 20 6e  wise, zero the n
377e0 65 77 20 70 6f 72 74 69 6f 6e 20 69 6e 20 63 61  ew portion in ca
377f0 73 65 20 61 20 0a 20 20 20 20 2a 2a 20 6d 61 6c  se a .    ** mal
37800 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f 63 63 75  loc failure occu
37810 72 73 20 77 68 69 6c 65 20 70 6f 70 75 6c 61 74  rs while populat
37820 69 6e 67 20 69 74 20 69 6e 20 74 68 65 20 66 6f  ing it in the fo
37830 72 28 2e 2e 2e 29 20 6c 6f 6f 70 20 62 65 6c 6f  r(...) loop belo
37840 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 4e  w..    */.    aN
37850 65 77 20 3d 20 28 50 61 67 65 72 53 61 76 65 70  ew = (PagerSavep
37860 6f 69 6e 74 20 2a 29 73 71 6c 69 74 65 33 52 65  oint *)sqlite3Re
37870 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 70  alloc(.        p
37880 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
37890 74 2c 20 73 69 7a 65 6f 66 28 50 61 67 65 72 53  t, sizeof(PagerS
378a0 61 76 65 70 6f 69 6e 74 29 2a 6e 53 61 76 65 70  avepoint)*nSavep
378b0 6f 69 6e 74 0a 20 20 20 20 29 3b 0a 20 20 20 20  oint.    );.    
378c0 69 66 28 20 21 61 4e 65 77 20 29 7b 0a 20 20 20  if( !aNew ){.   
378d0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
378e0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
378f0 20 20 6d 65 6d 73 65 74 28 26 61 4e 65 77 5b 6e    memset(&aNew[n
37900 43 75 72 72 65 6e 74 5d 2c 20 30 2c 20 28 6e 53  Current], 0, (nS
37910 61 76 65 70 6f 69 6e 74 2d 6e 43 75 72 72 65 6e  avepoint-nCurren
37920 74 29 20 2a 20 73 69 7a 65 6f 66 28 50 61 67 65  t) * sizeof(Page
37930 72 53 61 76 65 70 6f 69 6e 74 29 29 3b 0a 20 20  rSavepoint));.  
37940 20 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70    pPager->aSavep
37950 6f 69 6e 74 20 3d 20 61 4e 65 77 3b 0a 0a 20 20  oint = aNew;..  
37960 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74 68    /* Populate th
37970 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e PagerSavepoint
37980 20 73 74 72 75 63 74 75 72 65 73 20 6a 75 73 74   structures just
37990 20 61 6c 6c 6f 63 61 74 65 64 2e 20 2a 2f 0a 20   allocated. */. 
379a0 20 20 20 66 6f 72 28 69 69 3d 6e 43 75 72 72 65     for(ii=nCurre
379b0 6e 74 3b 20 69 69 3c 6e 53 61 76 65 70 6f 69 6e  nt; ii<nSavepoin
379c0 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  t; ii++){.      
379d0 61 4e 65 77 5b 69 69 5d 2e 6e 4f 72 69 67 20 3d  aNew[ii].nOrig =
379e0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
379f0 0a 20 20 20 20 20 20 69 66 28 20 69 73 4f 70 65  .      if( isOpe
37a00 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26  n(pPager->jfd) &
37a10 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
37a20 6c 4f 66 66 3e 30 20 29 7b 0a 20 20 20 20 20 20  lOff>0 ){.      
37a30 20 20 61 4e 65 77 5b 69 69 5d 2e 69 4f 66 66 73    aNew[ii].iOffs
37a40 65 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  et = pPager->jou
37a50 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 20 20 7d  rnalOff;.      }
37a60 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 4e  else{.        aN
37a70 65 77 5b 69 69 5d 2e 69 4f 66 66 73 65 74 20 3d  ew[ii].iOffset =
37a80 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
37a90 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 7d  pPager);.      }
37aa0 0a 20 20 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e  .      aNew[ii].
37ab0 69 53 75 62 52 65 63 20 3d 20 70 50 61 67 65 72  iSubRec = pPager
37ac0 2d 3e 6e 53 75 62 52 65 63 3b 0a 20 20 20 20 20  ->nSubRec;.     
37ad0 20 61 4e 65 77 5b 69 69 5d 2e 70 49 6e 53 61 76   aNew[ii].pInSav
37ae0 65 70 6f 69 6e 74 20 3d 20 73 71 6c 69 74 65 33  epoint = sqlite3
37af0 42 69 74 76 65 63 43 72 65 61 74 65 28 70 50 61  BitvecCreate(pPa
37b00 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20  ger->dbSize);.  
37b10 20 20 20 20 69 66 28 20 21 61 4e 65 77 5b 69 69      if( !aNew[ii
37b20 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 29  ].pInSavepoint )
37b30 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
37b40 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
37b50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
37b60 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
37b70 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ger) ){.        
37b80 73 71 6c 69 74 65 33 57 61 6c 53 61 76 65 70 6f  sqlite3WalSavepo
37b90 69 6e 74 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  int(pPager->pWal
37ba0 2c 20 61 4e 65 77 5b 69 69 5d 2e 61 57 61 6c 44  , aNew[ii].aWalD
37bb0 61 74 61 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ata);.      }.  
37bc0 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 53 61 76      pPager->nSav
37bd0 65 70 6f 69 6e 74 20 3d 20 69 69 2b 31 3b 0a 20  epoint = ii+1;. 
37be0 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
37bf0 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f   pPager->nSavepo
37c00 69 6e 74 3d 3d 6e 53 61 76 65 70 6f 69 6e 74 20  int==nSavepoint 
37c10 29 3b 0a 20 20 20 20 61 73 73 65 72 74 54 72 75  );.    assertTru
37c20 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28  ncateConstraint(
37c30 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20  pPager);.  }..  
37c40 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
37c50 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
37c60 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72  n is called to r
37c70 6f 6c 6c 62 61 63 6b 20 6f 72 20 72 65 6c 65 61  ollback or relea
37c80 73 65 20 28 63 6f 6d 6d 69 74 29 20 61 20 73 61  se (commit) a sa
37c90 76 65 70 6f 69 6e 74 2e 0a 2a 2a 20 54 68 65 20  vepoint..** The 
37ca0 73 61 76 65 70 6f 69 6e 74 20 74 6f 20 72 65 6c  savepoint to rel
37cb0 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b  ease or rollback
37cc0 20 6e 65 65 64 20 6e 6f 74 20 62 65 20 74 68 65   need not be the
37cd0 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 0a   most recently .
37ce0 2a 2a 20 63 72 65 61 74 65 64 20 73 61 76 65 70  ** created savep
37cf0 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61  oint..**.** Para
37d00 6d 65 74 65 72 20 6f 70 20 69 73 20 61 6c 77 61  meter op is alwa
37d10 79 73 20 65 69 74 68 65 72 20 53 41 56 45 50 4f  ys either SAVEPO
37d20 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 6f 72 20  INT_ROLLBACK or 
37d30 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
37d40 45 2e 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 53  E..** If it is S
37d50 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
37d60 2c 20 74 68 65 6e 20 72 65 6c 65 61 73 65 20 61  , then release a
37d70 6e 64 20 64 65 73 74 72 6f 79 20 74 68 65 20 73  nd destroy the s
37d80 61 76 65 70 6f 69 6e 74 20 77 69 74 68 0a 2a 2a  avepoint with.**
37d90 20 69 6e 64 65 78 20 69 53 61 76 65 70 6f 69 6e   index iSavepoin
37da0 74 2e 20 49 66 20 69 74 20 69 73 20 53 41 56 45  t. If it is SAVE
37db0 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20  POINT_ROLLBACK, 
37dc0 74 68 65 6e 20 72 6f 6c 6c 62 61 63 6b 20 61 6c  then rollback al
37dd0 6c 20 63 68 61 6e 67 65 73 0a 2a 2a 20 74 68 61  l changes.** tha
37de0 74 20 68 61 76 65 20 6f 63 63 75 72 72 65 64 20  t have occurred 
37df0 73 69 6e 63 65 20 74 68 65 20 73 70 65 63 69 66  since the specif
37e00 69 65 64 20 73 61 76 65 70 6f 69 6e 74 20 77 61  ied savepoint wa
37e10 73 20 63 72 65 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  s created..**.**
37e20 20 54 68 65 20 73 61 76 65 70 6f 69 6e 74 20 74   The savepoint t
37e30 6f 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 72 65  o rollback or re
37e40 6c 65 61 73 65 20 69 73 20 69 64 65 6e 74 69 66  lease is identif
37e50 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72  ied by parameter
37e60 20 0a 2a 2a 20 69 53 61 76 65 70 6f 69 6e 74 2e   .** iSavepoint.
37e70 20 41 20 76 61 6c 75 65 20 6f 66 20 30 20 6d 65   A value of 0 me
37e80 61 6e 73 20 74 6f 20 6f 70 65 72 61 74 65 20 6f  ans to operate o
37e90 6e 20 74 68 65 20 6f 75 74 65 72 6d 6f 73 74 20  n the outermost 
37ea0 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20 28 74 68  savepoint.** (th
37eb0 65 20 66 69 72 73 74 20 63 72 65 61 74 65 64 29  e first created)
37ec0 2e 20 41 20 76 61 6c 75 65 20 6f 66 20 28 50 61  . A value of (Pa
37ed0 67 65 72 2e 6e 53 61 76 65 70 6f 69 6e 74 2d 31  ger.nSavepoint-1
37ee0 29 20 6d 65 61 6e 73 20 6f 70 65 72 61 74 65 0a  ) means operate.
37ef0 2a 2a 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72  ** on the most r
37f00 65 63 65 6e 74 6c 79 20 63 72 65 61 74 65 64 20  ecently created 
37f10 73 61 76 65 70 6f 69 6e 74 2e 20 49 66 20 69 53  savepoint. If iS
37f20 61 76 65 70 6f 69 6e 74 20 69 73 20 67 72 65 61  avepoint is grea
37f30 74 65 72 20 74 68 61 6e 0a 2a 2a 20 28 50 61 67  ter than.** (Pag
37f40 65 72 2e 6e 53 61 76 65 70 6f 69 6e 74 2d 31 29  er.nSavepoint-1)
37f50 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63  , then this func
37f60 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
37f70 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6e 65 67 61  .**.** If a nega
37f80 74 69 76 65 20 76 61 6c 75 65 20 69 73 20 70 61  tive value is pa
37f90 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e  ssed to this fun
37fa0 63 74 69 6f 6e 2c 20 74 68 65 6e 20 74 68 65 20  ction, then the 
37fb0 63 75 72 72 65 6e 74 0a 2a 2a 20 74 72 61 6e 73  current.** trans
37fc0 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64  action is rolled
37fd0 20 62 61 63 6b 2e 20 54 68 69 73 20 69 73 20 64   back. This is d
37fe0 69 66 66 65 72 65 6e 74 20 74 6f 20 63 61 6c 6c  ifferent to call
37ff0 69 6e 67 20 0a 2a 2a 20 73 71 6c 69 74 65 33 50  ing .** sqlite3P
38000 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 20 62  agerRollback() b
38010 65 63 61 75 73 65 20 74 68 69 73 20 66 75 6e 63  ecause this func
38020 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 74 65  tion does not te
38030 72 6d 69 6e 61 74 65 0a 2a 2a 20 74 68 65 20 74  rminate.** the t
38040 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20 75 6e  ransaction or un
38050 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73  lock the databas
38060 65 2c 20 69 74 20 6a 75 73 74 20 72 65 73 74 6f  e, it just resto
38070 72 65 73 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74  res the .** cont
38080 65 6e 74 73 20 6f 66 20 74 68 65 20 64 61 74 61  ents of the data
38090 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69 67  base to its orig
380a0 69 6e 61 6c 20 73 74 61 74 65 2e 20 0a 2a 2a 0a  inal state. .**.
380b0 2a 2a 20 49 6e 20 61 6e 79 20 63 61 73 65 2c 20  ** In any case, 
380c0 61 6c 6c 20 73 61 76 65 70 6f 69 6e 74 73 20 77  all savepoints w
380d0 69 74 68 20 61 6e 20 69 6e 64 65 78 20 67 72 65  ith an index gre
380e0 61 74 65 72 20 74 68 61 6e 20 69 53 61 76 65 70  ater than iSavep
380f0 6f 69 6e 74 20 0a 2a 2a 20 61 72 65 20 64 65 73  oint .** are des
38100 74 72 6f 79 65 64 2e 20 49 66 20 74 68 69 73 20  troyed. If this 
38110 69 73 20 61 20 72 65 6c 65 61 73 65 20 6f 70 65  is a release ope
38120 72 61 74 69 6f 6e 20 28 6f 70 3d 3d 53 41 56 45  ration (op==SAVE
38130 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 29 2c 0a  POINT_RELEASE),.
38140 2a 2a 20 74 68 65 6e 20 73 61 76 65 70 6f 69 6e  ** then savepoin
38150 74 20 69 53 61 76 65 70 6f 69 6e 74 20 69 73 20  t iSavepoint is 
38160 61 6c 73 6f 20 64 65 73 74 72 6f 79 65 64 2e 0a  also destroyed..
38170 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
38180 69 6f 6e 20 6d 61 79 20 72 65 74 75 72 6e 20 53  ion may return S
38190 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61  QLITE_NOMEM if a
381a0 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
381b0 6f 6e 20 66 61 69 6c 73 2c 0a 2a 2a 20 6f 72 20  on fails,.** or 
381c0 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  an IO error code
381d0 20 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   if an IO error 
381e0 6f 63 63 75 72 73 20 77 68 69 6c 65 20 72 6f 6c  occurs while rol
381f0 6c 69 6e 67 20 62 61 63 6b 20 61 20 0a 2a 2a 20  ling back a .** 
38200 73 61 76 65 70 6f 69 6e 74 2e 20 49 66 20 6e 6f  savepoint. If no
38210 20 65 72 72 6f 72 73 20 6f 63 63 75 72 2c 20 53   errors occur, S
38220 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
38230 72 6e 65 64 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71  rned..*/ .int sq
38240 6c 69 74 65 33 50 61 67 65 72 53 61 76 65 70 6f  lite3PagerSavepo
38250 69 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  int(Pager *pPage
38260 72 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 69  r, int op, int i
38270 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e  Savepoint){.  in
38280 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
38290 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3d  ;..  assert( op=
382a0 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41  =SAVEPOINT_RELEA
382b0 53 45 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f  SE || op==SAVEPO
382c0 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a  INT_ROLLBACK );.
382d0 20 20 61 73 73 65 72 74 28 20 69 53 61 76 65 70    assert( iSavep
382e0 6f 69 6e 74 3e 3d 30 20 7c 7c 20 6f 70 3d 3d 53  oint>=0 || op==S
382f0 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
38300 4b 20 29 3b 0a 0a 20 20 69 66 28 20 69 53 61 76  K );..  if( iSav
38310 65 70 6f 69 6e 74 3c 70 50 61 67 65 72 2d 3e 6e  epoint<pPager->n
38320 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20  Savepoint ){.   
38330 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20   int ii;        
38340 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
38350 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20  variable */.    
38360 69 6e 74 20 6e 4e 65 77 3b 20 20 20 20 20 20 20  int nNew;       
38370 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
38380 72 65 6d 61 69 6e 69 6e 67 20 73 61 76 65 70 6f  remaining savepo
38390 69 6e 74 73 20 61 66 74 65 72 20 74 68 69 73 20  ints after this 
383a0 6f 70 2e 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46  op. */..    /* F
383b0 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61  igure out how ma
383c0 6e 79 20 73 61 76 65 70 6f 69 6e 74 73 20 77 69  ny savepoints wi
383d0 6c 6c 20 73 74 69 6c 6c 20 62 65 20 61 63 74 69  ll still be acti
383e0 76 65 20 61 66 74 65 72 20 74 68 69 73 0a 20 20  ve after this.  
383f0 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2e 20    ** operation. 
38400 53 74 6f 72 65 20 74 68 69 73 20 76 61 6c 75 65  Store this value
38410 20 69 6e 20 6e 4e 65 77 2e 20 54 68 65 6e 20 66   in nNew. Then f
38420 72 65 65 20 72 65 73 6f 75 72 63 65 73 20 61 73  ree resources as
38430 73 6f 63 69 61 74 65 64 20 0a 20 20 20 20 2a 2a  sociated .    **
38440 20 77 69 74 68 20 61 6e 79 20 73 61 76 65 70 6f   with any savepo
38450 69 6e 74 73 20 74 68 61 74 20 61 72 65 20 64 65  ints that are de
38460 73 74 72 6f 79 65 64 20 62 79 20 74 68 69 73 20  stroyed by this 
38470 6f 70 65 72 61 74 69 6f 6e 2e 0a 20 20 20 20 2a  operation..    *
38480 2f 0a 20 20 20 20 6e 4e 65 77 20 3d 20 69 53 61  /.    nNew = iSa
38490 76 65 70 6f 69 6e 74 20 2b 20 28 28 20 6f 70 3d  vepoint + (( op=
384a0 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41  =SAVEPOINT_RELEA
384b0 53 45 20 29 20 3f 20 30 20 3a 20 31 29 3b 0a 20  SE ) ? 0 : 1);. 
384c0 20 20 20 66 6f 72 28 69 69 3d 6e 4e 65 77 3b 20     for(ii=nNew; 
384d0 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65  ii<pPager->nSave
384e0 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20  point; ii++){.  
384f0 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65      sqlite3Bitve
38500 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d  cDestroy(pPager-
38510 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e  >aSavepoint[ii].
38520 70 49 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  pInSavepoint);. 
38530 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d     }.    pPager-
38540 3e 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 6e 4e  >nSavepoint = nN
38550 65 77 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  ew;..    /* If t
38560 68 69 73 20 69 73 20 61 20 72 65 6c 65 61 73 65  his is a release
38570 20 6f 66 20 74 68 65 20 6f 75 74 65 72 6d 6f 73   of the outermos
38580 74 20 73 61 76 65 70 6f 69 6e 74 2c 20 74 72 75  t savepoint, tru
38590 6e 63 61 74 65 20 0a 20 20 20 20 2a 2a 20 74 68  ncate .    ** th
385a0 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 74 6f  e sub-journal to
385b0 20 7a 65 72 6f 20 62 79 74 65 73 20 69 6e 20 73   zero bytes in s
385c0 69 7a 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ize. */.    if( 
385d0 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45  op==SAVEPOINT_RE
385e0 4c 45 41 53 45 20 29 7b 0a 20 20 20 20 20 20 69  LEASE ){.      i
385f0 66 28 20 6e 4e 65 77 3d 3d 30 20 26 26 20 69 73  f( nNew==0 && is
38600 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66  Open(pPager->sjf
38610 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  d) ){.        /*
38620 20 4f 6e 6c 79 20 74 72 75 6e 63 61 74 65 20 69   Only truncate i
38630 66 20 69 74 20 69 73 20 61 6e 20 69 6e 2d 6d 65  f it is an in-me
38640 6d 6f 72 79 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  mory sub-journal
38650 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  . */.        if(
38660 20 73 71 6c 69 74 65 33 49 73 4d 65 6d 4a 6f 75   sqlite3IsMemJou
38670 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 73 6a 66  rnal(pPager->sjf
38680 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  d) ){.          
38690 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72  rc = sqlite3OsTr
386a0 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 73  uncate(pPager->s
386b0 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  jfd, 0);.       
386c0 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
386d0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
386e0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50