/ Hex Artifact Content
Login

Artifact 202e3dcb3f36c858d4339c0f6fa3d04d67258127:


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 70 61 67 65 20  ./*.** The page 
1480: 63 61 63 68 65 20 61 73 20 61 20 77 68 6f 6c 65  cache as a whole
1490: 20 69 73 20 61 6c 77 61 79 73 20 69 6e 20 6f 6e   is always in on
14a0: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
14b0: 6e 67 0a 2a 2a 20 73 74 61 74 65 73 3a 0a 2a 2a  ng.** states:.**
14c0: 0a 2a 2a 20 20 20 50 41 47 45 52 5f 55 4e 4c 4f  .**   PAGER_UNLO
14d0: 43 4b 20 20 20 20 20 20 20 20 54 68 65 20 70 61  CK        The pa
14e0: 67 65 20 63 61 63 68 65 20 69 73 20 6e 6f 74 20  ge cache is not 
14f0: 63 75 72 72 65 6e 74 6c 79 20 72 65 61 64 69 6e  currently readin
1500: 67 20 6f 72 20 0a 2a 2a 20 20 20 20 20 20 20 20  g or .**        
1510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
1520: 72 69 74 69 6e 67 20 74 68 65 20 64 61 74 61 62  riting the datab
1530: 61 73 65 20 66 69 6c 65 2e 20 20 54 68 65 72 65  ase file.  There
1540: 20 69 73 20 6e 6f 0a 2a 2a 20 20 20 20 20 20 20   is no.**       
1550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1560: 64 61 74 61 20 68 65 6c 64 20 69 6e 20 6d 65 6d  data held in mem
1570: 6f 72 79 2e 20 20 54 68 69 73 20 69 73 20 74 68  ory.  This is th
1580: 65 20 69 6e 69 74 69 61 6c 0a 2a 2a 20 20 20 20  e initial.**    
1590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a0: 20 20 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20     state..**.** 
15b0: 20 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 20    PAGER_SHARED  
15c0: 20 20 20 20 20 20 54 68 65 20 70 61 67 65 20 63        The page c
15d0: 61 63 68 65 20 69 73 20 72 65 61 64 69 6e 67 20  ache is reading 
15e0: 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
15f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1600: 20 20 20 20 20 20 20 57 72 69 74 69 6e 67 20 69         Writing i
1610: 73 20 6e 6f 74 20 70 65 72 6d 69 74 74 65 64 2e  s not permitted.
1620: 20 20 54 68 65 72 65 20 63 61 6e 20 62 65 0a 2a    There can be.*
1630: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1640: 20 20 20 20 20 20 20 20 6d 75 6c 74 69 70 6c 65          multiple
1650: 20 72 65 61 64 65 72 73 20 61 63 63 65 73 73 69   readers accessi
1660: 6e 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  ng the same data
1670: 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  base.**         
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69                fi
1690: 6c 65 20 61 74 20 74 68 65 20 73 61 6d 65 20 74  le at the same t
16a0: 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47  ime..**.**   PAG
16b0: 45 52 5f 52 45 53 45 52 56 45 44 20 20 20 20 20  ER_RESERVED     
16c0: 20 54 68 69 73 20 70 72 6f 63 65 73 73 20 68 61   This process ha
16d0: 73 20 72 65 73 65 72 76 65 64 20 74 68 65 20 64  s reserved the d
16e0: 61 74 61 62 61 73 65 20 66 6f 72 20 77 72 69 74  atabase for writ
16f0: 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ing.**          
1700: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 75 74               but
1710: 20 68 61 73 20 6e 6f 74 20 79 65 74 20 6d 61 64   has not yet mad
1720: 65 20 61 6e 79 20 63 68 61 6e 67 65 73 2e 20 20  e any changes.  
1730: 4f 6e 6c 79 20 6f 6e 65 20 70 72 6f 63 65 73 73  Only one process
1740: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1750: 20 20 20 20 20 20 20 20 20 20 61 74 20 61 20 74            at a t
1760: 69 6d 65 20 63 61 6e 20 72 65 73 65 72 76 65 20  ime can reserve 
1770: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
1780: 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20  he original.**  
1790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a0: 20 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69       database fi
17b0: 6c 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  le has not been 
17c0: 6d 6f 64 69 66 69 65 64 20 73 6f 20 6f 74 68 65  modified so othe
17d0: 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  r.**            
17e0: 20 20 20 20 20 20 20 20 20 20 20 70 72 6f 63 65             proce
17f0: 73 73 65 73 20 6d 61 79 20 73 74 69 6c 6c 20 62  sses may still b
1800: 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 6f 6e  e reading the on
1810: 2d 64 69 73 6b 0a 2a 2a 20 20 20 20 20 20 20 20  -disk.**        
1820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
1830: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
1840: 0a 2a 2a 20 20 20 50 41 47 45 52 5f 45 58 43 4c  .**   PAGER_EXCL
1850: 55 53 49 56 45 20 20 20 20 20 54 68 65 20 70 61  USIVE     The pa
1860: 67 65 20 63 61 63 68 65 20 69 73 20 77 72 69 74  ge cache is writ
1870: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
1880: 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ..**            
1890: 20 20 20 20 20 20 20 20 20 20 20 41 63 63 65 73             Acces
18a0: 73 20 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20  s is exclusive. 
18b0: 20 4e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73   No other proces
18c0: 73 65 73 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20  ses or.**       
18d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e0: 74 68 72 65 61 64 73 20 63 61 6e 20 62 65 20 72  threads can be r
18f0: 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
1900: 67 20 77 68 69 6c 65 20 6f 6e 65 0a 2a 2a 20 20  g while one.**  
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1920: 20 20 20 20 20 70 72 6f 63 65 73 73 20 69 73 20       process is 
1930: 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20  writing..**.**  
1940: 20 50 41 47 45 52 5f 53 59 4e 43 45 44 20 20 20   PAGER_SYNCED   
1950: 20 20 20 20 20 54 68 65 20 70 61 67 65 72 20 6d       The pager m
1960: 6f 76 65 73 20 74 6f 20 74 68 69 73 20 73 74 61  oves to this sta
1970: 74 65 20 66 72 6f 6d 20 50 41 47 45 52 5f 45 58  te from PAGER_EX
1980: 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 20 20  CLUSIVE.**      
1990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a0: 20 61 66 74 65 72 20 61 6c 6c 20 64 69 72 74 79   after all dirty
19b0: 20 70 61 67 65 73 20 68 61 76 65 20 62 65 65 6e   pages have been
19c0: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a   written to the.
19d0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
19e0: 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
19f0: 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66  e file and the f
1a00: 69 6c 65 20 68 61 73 20 62 65 65 6e 20 73 79 6e  ile has been syn
1a10: 63 65 64 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20  ced to.**       
1a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a30: 64 69 73 6b 2e 20 41 6c 6c 20 74 68 61 74 20 72  disk. All that r
1a40: 65 6d 61 69 6e 73 20 74 6f 20 64 6f 20 69 73 20  emains to do is 
1a50: 74 6f 20 72 65 6d 6f 76 65 20 6f 72 0a 2a 2a 20  to remove or.** 
1a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a70: 20 20 20 20 20 20 74 72 75 6e 63 61 74 65 20 74        truncate t
1a80: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1a90: 61 6e 64 20 74 68 65 20 74 72 61 6e 73 61 63 74  and the transact
1aa0: 69 6f 6e 20 0a 2a 2a 20 20 20 20 20 20 20 20 20  ion .**         
1ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 69                wi
1ac0: 6c 6c 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 2e  ll be committed.
1ad0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  .**.** The page 
1ae0: 63 61 63 68 65 20 63 6f 6d 65 73 20 75 70 20 69  cache comes up i
1af0: 6e 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20  n PAGER_UNLOCK. 
1b00: 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   The first time 
1b10: 61 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65  a.** sqlite3Page
1b20: 72 47 65 74 28 29 20 6f 63 63 75 72 73 2c 20 74  rGet() occurs, t
1b30: 68 65 20 73 74 61 74 65 20 74 72 61 6e 73 69 74  he state transit
1b40: 69 6f 6e 73 20 74 6f 20 50 41 47 45 52 5f 53 48  ions to PAGER_SH
1b50: 41 52 45 44 2e 0a 2a 2a 20 41 66 74 65 72 20 61  ARED..** After a
1b60: 6c 6c 20 70 61 67 65 73 20 68 61 76 65 20 62 65  ll pages have be
1b70: 65 6e 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e  en released usin
1b80: 67 20 73 71 6c 69 74 65 5f 70 61 67 65 5f 75 6e  g sqlite_page_un
1b90: 72 65 66 28 29 2c 0a 2a 2a 20 74 68 65 20 73 74  ref(),.** the st
1ba0: 61 74 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  ate transitions 
1bb0: 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 55 4e  back to PAGER_UN
1bc0: 4c 4f 43 4b 2e 20 20 54 68 65 20 66 69 72 73 74  LOCK.  The first
1bd0: 20 74 69 6d 65 0a 2a 2a 20 74 68 61 74 20 73 71   time.** that sq
1be0: 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1bf0: 29 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  ) is called, the
1c00: 20 73 74 61 74 65 20 74 72 61 6e 73 69 74 69 6f   state transitio
1c10: 6e 73 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 52  ns to.** PAGER_R
1c20: 45 53 45 52 56 45 44 2e 20 20 28 4e 6f 74 65 20  ESERVED.  (Note 
1c30: 74 68 61 74 20 73 71 6c 69 74 65 33 50 61 67 65  that sqlite3Page
1c40: 72 57 72 69 74 65 28 29 20 63 61 6e 20 6f 6e 6c  rWrite() can onl
1c50: 79 20 62 65 0a 2a 2a 20 63 61 6c 6c 65 64 20 6f  y be.** called o
1c60: 6e 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67  n an outstanding
1c70: 20 70 61 67 65 20 77 68 69 63 68 20 6d 65 61 6e   page which mean
1c80: 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  s that the pager
1c90: 20 6d 75 73 74 0a 2a 2a 20 62 65 20 69 6e 20 50   must.** be in P
1ca0: 41 47 45 52 5f 53 48 41 52 45 44 20 62 65 66 6f  AGER_SHARED befo
1cb0: 72 65 20 69 74 20 74 72 61 6e 73 69 74 69 6f 6e  re it transition
1cc0: 73 20 74 6f 20 50 41 47 45 52 5f 52 45 53 45 52  s to PAGER_RESER
1cd0: 56 45 44 2e 29 0a 2a 2a 20 50 41 47 45 52 5f 52  VED.).** PAGER_R
1ce0: 45 53 45 52 56 45 44 20 6d 65 61 6e 73 20 74 68  ESERVED means th
1cf0: 61 74 20 74 68 65 72 65 20 69 73 20 61 6e 20 6f  at there is an o
1d00: 70 65 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  pen rollback jou
1d10: 72 6e 61 6c 2e 0a 2a 2a 20 54 68 65 20 74 72 61  rnal..** The tra
1d20: 6e 73 69 74 69 6f 6e 20 74 6f 20 50 41 47 45 52  nsition to PAGER
1d30: 5f 45 58 43 4c 55 53 49 56 45 20 6f 63 63 75 72  _EXCLUSIVE occur
1d40: 73 20 62 65 66 6f 72 65 20 61 6e 79 20 63 68 61  s before any cha
1d50: 6e 67 65 73 0a 2a 2a 20 61 72 65 20 6d 61 64 65  nges.** are made
1d60: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1d70: 20 66 69 6c 65 2c 20 74 68 6f 75 67 68 20 77 72   file, though wr
1d80: 69 74 65 73 20 74 6f 20 74 68 65 20 72 6f 6c 6c  ites to the roll
1d90: 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  back.** journal 
1da0: 6f 63 63 75 72 73 20 77 69 74 68 20 6a 75 73 74  occurs with just
1db0: 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 2e   PAGER_RESERVED.
1dc0: 20 20 41 66 74 65 72 20 61 6e 20 73 71 6c 69 74    After an sqlit
1dd0: 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
1de0: 29 0a 2a 2a 20 6f 72 20 73 71 6c 69 74 65 33 50  ).** or sqlite3P
1df0: 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54  agerCommitPhaseT
1e00: 77 6f 28 29 2c 20 74 68 65 20 73 74 61 74 65 20  wo(), the state 
1e10: 63 61 6e 20 67 6f 20 62 61 63 6b 20 74 6f 20 50  can go back to P
1e20: 41 47 45 52 5f 53 48 41 52 45 44 2c 0a 2a 2a 20  AGER_SHARED,.** 
1e30: 6f 72 20 69 74 20 63 61 6e 20 73 74 61 79 20 61  or it can stay a
1e40: 74 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  t PAGER_EXCLUSIV
1e50: 45 20 69 66 20 77 65 20 61 72 65 20 69 6e 20 65  E if we are in e
1e60: 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73 20  xclusive access 
1e70: 6d 6f 64 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  mode..*/.#define
1e80: 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 20 20   PAGER_UNLOCK   
1e90: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 50 41 47     0.#define PAG
1ea0: 45 52 5f 53 48 41 52 45 44 20 20 20 20 20 20 31  ER_SHARED      1
1eb0: 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 53 48     /* same as SH
1ec0: 41 52 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65  ARED_LOCK */.#de
1ed0: 66 69 6e 65 20 50 41 47 45 52 5f 52 45 53 45 52  fine PAGER_RESER
1ee0: 56 45 44 20 20 20 20 32 20 20 20 2f 2a 20 73 61  VED    2   /* sa
1ef0: 6d 65 20 61 73 20 52 45 53 45 52 56 45 44 5f 4c  me as RESERVED_L
1f00: 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  OCK */.#define P
1f10: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 20  AGER_EXCLUSIVE  
1f20: 20 34 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20   4   /* same as 
1f30: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 2a  EXCLUSIVE_LOCK *
1f40: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
1f50: 53 59 4e 43 45 44 20 20 20 20 20 20 35 0a 0a 2f  SYNCED      5../
1f60: 2a 0a 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73 65  *.** A macro use
1f70: 64 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74  d for invoking t
1f80: 68 65 20 63 6f 64 65 63 20 69 66 20 74 68 65 72  he codec if ther
1f90: 65 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64  e is one.*/.#ifd
1fa0: 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
1fb0: 44 45 43 0a 23 20 64 65 66 69 6e 65 20 43 4f 44  DEC.# define COD
1fc0: 45 43 31 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 5c  EC1(P,D,N,X,E) \
1fd0: 0a 20 20 20 20 69 66 28 20 50 2d 3e 78 43 6f 64  .    if( P->xCod
1fe0: 65 63 20 26 26 20 50 2d 3e 78 43 6f 64 65 63 28  ec && P->xCodec(
1ff0: 50 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29  P->pCodec,D,N,X)
2000: 3d 3d 30 20 29 7b 20 45 3b 20 7d 0a 23 20 64 65  ==0 ){ E; }.# de
2010: 66 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c  fine CODEC2(P,D,
2020: 4e 2c 58 2c 45 2c 4f 29 20 5c 0a 20 20 20 20 69  N,X,E,O) \.    i
2030: 66 28 20 50 2d 3e 78 43 6f 64 65 63 3d 3d 30 20  f( P->xCodec==0 
2040: 29 7b 20 4f 3d 28 63 68 61 72 2a 29 44 3b 20 7d  ){ O=(char*)D; }
2050: 65 6c 73 65 20 5c 0a 20 20 20 20 69 66 28 20 28  else \.    if( (
2060: 4f 3d 28 63 68 61 72 2a 29 28 50 2d 3e 78 43 6f  O=(char*)(P->xCo
2070: 64 65 63 28 50 2d 3e 70 43 6f 64 65 63 2c 44 2c  dec(P->pCodec,D,
2080: 4e 2c 58 29 29 29 3d 3d 30 20 29 7b 20 45 3b 20  N,X)))==0 ){ E; 
2090: 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
20a0: 20 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 2c   CODEC1(P,D,N,X,
20b0: 45 29 20 20 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f  E)   /* NO-OP */
20c0: 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32  .# define CODEC2
20d0: 28 50 2c 44 2c 4e 2c 58 2c 45 2c 4f 29 20 4f 3d  (P,D,N,X,E,O) O=
20e0: 28 63 68 61 72 2a 29 44 0a 23 65 6e 64 69 66 0a  (char*)D.#endif.
20f0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d  ./*.** The maxim
2100: 75 6d 20 61 6c 6c 6f 77 65 64 20 73 65 63 74 6f  um allowed secto
2110: 72 20 73 69 7a 65 2e 20 36 34 4b 69 42 2e 20 49  r size. 64KiB. I
2120: 66 20 74 68 65 20 78 53 65 63 74 6f 72 73 69 7a  f the xSectorsiz
2130: 65 28 29 20 6d 65 74 68 6f 64 20 0a 2a 2a 20 72  e() method .** r
2140: 65 74 75 72 6e 73 20 61 20 76 61 6c 75 65 20 6c  eturns a value l
2150: 61 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 2c  arger than this,
2160: 20 74 68 65 6e 20 4d 41 58 5f 53 45 43 54 4f 52   then MAX_SECTOR
2170: 5f 53 49 5a 45 20 69 73 20 75 73 65 64 20 69 6e  _SIZE is used in
2180: 73 74 65 61 64 2e 0a 2a 2a 20 54 68 69 73 20 63  stead..** This c
2190: 6f 75 6c 64 20 63 6f 6e 63 65 69 76 61 62 6c 79  ould conceivably
21a0: 20 63 61 75 73 65 20 63 6f 72 72 75 70 74 69 6f   cause corruptio
21b0: 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f  n following a po
21c0: 77 65 72 20 66 61 69 6c 75 72 65 20 6f 6e 0a 2a  wer failure on.*
21d0: 2a 20 73 75 63 68 20 61 20 73 79 73 74 65 6d 2e  * such a system.
21e0: 20 54 68 69 73 20 69 73 20 63 75 72 72 65 6e 74   This is current
21f0: 6c 79 20 61 6e 20 75 6e 64 6f 63 75 6d 65 6e 74  ly an undocument
2200: 65 64 20 6c 69 6d 69 74 2e 0a 2a 2f 0a 23 64 65  ed limit..*/.#de
2210: 66 69 6e 65 20 4d 41 58 5f 53 45 43 54 4f 52 5f  fine MAX_SECTOR_
2220: 53 49 5a 45 20 30 78 31 30 30 30 30 0a 0a 2f 2a  SIZE 0x10000../*
2230: 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20  .** An instance 
2240: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
2250: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61 6c   structure is al
2260: 6c 6f 63 61 74 65 64 20 66 6f 72 20 65 61 63 68  located for each
2270: 20 61 63 74 69 76 65 0a 2a 2a 20 73 61 76 65 70   active.** savep
2280: 6f 69 6e 74 20 61 6e 64 20 73 74 61 74 65 6d 65  oint and stateme
2290: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  nt transaction i
22a0: 6e 20 74 68 65 20 73 79 73 74 65 6d 2e 20 41 6c  n the system. Al
22b0: 6c 20 73 75 63 68 20 73 74 72 75 63 74 75 72 65  l such structure
22c0: 73 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 20  s.** are stored 
22d0: 69 6e 20 74 68 65 20 50 61 67 65 72 2e 61 53 61  in the Pager.aSa
22e0: 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 2c  vepoint[] array,
22f0: 20 77 68 69 63 68 20 69 73 20 61 6c 6c 6f 63 61   which is alloca
2300: 74 65 64 20 61 6e 64 0a 2a 2a 20 72 65 73 69 7a  ted and.** resiz
2310: 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ed using sqlite3
2320: 52 65 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a  Realloc()..**.**
2330: 20 57 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e   When a savepoin
2340: 74 20 69 73 20 63 72 65 61 74 65 64 2c 20 74 68  t is created, th
2350: 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e PagerSavepoint
2360: 2e 69 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c  .iHdrOffset fiel
2370: 64 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30  d is.** set to 0
2380: 2e 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 2d 68  . If a journal-h
2390: 65 61 64 65 72 20 69 73 20 77 72 69 74 74 65 6e  eader is written
23a0: 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 6a   into the main j
23b0: 6f 75 72 6e 61 6c 20 77 68 69 6c 65 0a 2a 2a 20  ournal while.** 
23c0: 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 69 73  the savepoint is
23d0: 20 61 63 74 69 76 65 2c 20 74 68 65 6e 20 69 48   active, then iH
23e0: 64 72 4f 66 66 73 65 74 20 69 73 20 73 65 74 20  drOffset is set 
23f0: 74 6f 20 74 68 65 20 62 79 74 65 20 6f 66 66 73  to the byte offs
2400: 65 74 20 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65  et .** immediate
2410: 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ly following the
2420: 20 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 20 72 65   last journal re
2430: 63 6f 72 64 20 77 72 69 74 74 65 6e 20 69 6e 74  cord written int
2440: 6f 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f  o the main.** jo
2450: 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 74 68 65  urnal before the
2460: 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 2e   journal-header.
2470: 20 54 68 69 73 20 69 73 20 72 65 71 75 69 72 65   This is require
2480: 64 20 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69  d during savepoi
2490: 6e 74 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 28  nt.** rollback (
24a0: 73 65 65 20 70 61 67 65 72 50 6c 61 79 62 61 63  see pagerPlaybac
24b0: 6b 53 61 76 65 70 6f 69 6e 74 28 29 29 2e 0a 2a  kSavepoint())..*
24c0: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
24d0: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
24e0: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 3b 0a  PagerSavepoint;.
24f0: 73 74 72 75 63 74 20 50 61 67 65 72 53 61 76 65  struct PagerSave
2500: 70 6f 69 6e 74 20 7b 0a 20 20 69 36 34 20 69 4f  point {.  i64 iO
2510: 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20  ffset;          
2520: 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 69         /* Starti
2530: 6e 67 20 6f 66 66 73 65 74 20 69 6e 20 6d 61 69  ng offset in mai
2540: 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69  n journal */.  i
2550: 36 34 20 69 48 64 72 4f 66 66 73 65 74 3b 20 20  64 iHdrOffset;  
2560: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
2570: 65 65 20 61 62 6f 76 65 20 2a 2f 0a 20 20 42 69  ee above */.  Bi
2580: 74 76 65 63 20 2a 70 49 6e 53 61 76 65 70 6f 69  tvec *pInSavepoi
2590: 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 65  nt;        /* Se
25a0: 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  t of pages in th
25b0: 69 73 20 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a  is savepoint */.
25c0: 20 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20    Pgno nOrig;   
25d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25e0: 2a 20 4f 72 69 67 69 6e 61 6c 20 6e 75 6d 62 65  * Original numbe
25f0: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 66 69  r of pages in fi
2600: 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 53 75  le */.  Pgno iSu
2610: 62 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  bRec;           
2620: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
2630: 20 66 69 72 73 74 20 72 65 63 6f 72 64 20 69 6e   first record in
2640: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   sub-journal */.
2650: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2660: 4d 49 54 5f 57 41 4c 0a 20 20 75 33 32 20 61 57  MIT_WAL.  u32 aW
2670: 61 6c 44 61 74 61 5b 57 41 4c 5f 53 41 56 45 50  alData[WAL_SAVEP
2680: 4f 49 4e 54 5f 4e 44 41 54 41 5d 3b 20 20 20 20  OINT_NDATA];    
2690: 20 20 20 20 2f 2a 20 57 41 4c 20 73 61 76 65 70      /* WAL savep
26a0: 6f 69 6e 74 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  oint context */.
26b0: 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  #endif.};../*.**
26c0: 20 41 20 6f 70 65 6e 20 70 61 67 65 20 63 61 63   A open page cac
26d0: 68 65 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63  he is an instanc
26e0: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
26f0: 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  ng structure..**
2700: 0a 2a 2a 20 65 72 72 43 6f 64 65 0a 2a 2a 0a 2a  .** errCode.**.*
2710: 2a 20 20 20 50 61 67 65 72 2e 65 72 72 43 6f 64  *   Pager.errCod
2720: 65 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20  e may be set to 
2730: 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53 51  SQLITE_IOERR, SQ
2740: 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 6f 72  LITE_CORRUPT, or
2750: 0a 2a 2a 20 20 20 6f 72 20 53 51 4c 49 54 45 5f  .**   or SQLITE_
2760: 46 55 4c 4c 2e 20 4f 6e 63 65 20 6f 6e 65 20 6f  FULL. Once one o
2770: 66 20 74 68 65 20 66 69 72 73 74 20 74 68 72 65  f the first thre
2780: 65 20 65 72 72 6f 72 73 20 6f 63 63 75 72 73 2c  e errors occurs,
2790: 20 69 74 20 70 65 72 73 69 73 74 73 0a 2a 2a 20   it persists.** 
27a0: 20 20 61 6e 64 20 69 73 20 72 65 74 75 72 6e 65    and is returne
27b0: 64 20 61 73 20 74 68 65 20 72 65 73 75 6c 74 20  d as the result 
27c0: 6f 66 20 65 76 65 72 79 20 6d 61 6a 6f 72 20 70  of every major p
27d0: 61 67 65 72 20 41 50 49 20 63 61 6c 6c 2e 20 20  ager API call.  
27e0: 54 68 65 0a 2a 2a 20 20 20 53 51 4c 49 54 45 5f  The.**   SQLITE_
27f0: 46 55 4c 4c 20 72 65 74 75 72 6e 20 63 6f 64 65  FULL return code
2800: 20 69 73 20 73 6c 69 67 68 74 6c 79 20 64 69 66   is slightly dif
2810: 66 65 72 65 6e 74 2e 20 49 74 20 70 65 72 73 69  ferent. It persi
2820: 73 74 73 20 6f 6e 6c 79 20 75 6e 74 69 6c 20 74  sts only until t
2830: 68 65 0a 2a 2a 20 20 20 6e 65 78 74 20 73 75 63  he.**   next suc
2840: 63 65 73 73 66 75 6c 20 72 6f 6c 6c 62 61 63 6b  cessful rollback
2850: 20 69 73 20 70 65 72 66 6f 72 6d 65 64 20 6f 6e   is performed on
2860: 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
2870: 2e 20 41 6c 73 6f 2c 0a 2a 2a 20 20 20 53 51 4c  . Also,.**   SQL
2880: 49 54 45 5f 46 55 4c 4c 20 64 6f 65 73 20 6e 6f  ITE_FULL does no
2890: 74 20 61 66 66 65 63 74 20 74 68 65 20 73 71 6c  t affect the sql
28a0: 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20 61  ite3PagerGet() a
28b0: 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c  nd sqlite3PagerL
28c0: 6f 6f 6b 75 70 28 29 0a 2a 2a 20 20 20 41 50 49  ookup().**   API
28d0: 73 2c 20 74 68 65 79 20 6d 61 79 20 73 74 69 6c  s, they may stil
28e0: 6c 20 62 65 20 75 73 65 64 20 73 75 63 63 65 73  l be used succes
28f0: 73 66 75 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20 64 62  sfully..**.** db
2900: 53 69 7a 65 56 61 6c 69 64 2c 20 64 62 53 69 7a  SizeValid, dbSiz
2910: 65 2c 20 64 62 4f 72 69 67 53 69 7a 65 2c 20 64  e, dbOrigSize, d
2920: 62 46 69 6c 65 53 69 7a 65 0a 2a 2a 0a 2a 2a 20  bFileSize.**.** 
2930: 20 20 4d 61 6e 61 67 69 6e 67 20 74 68 65 20 73    Managing the s
2940: 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
2950: 61 73 65 20 66 69 6c 65 20 69 6e 20 70 61 67 65  ase file in page
2960: 73 20 69 73 20 61 20 6c 69 74 74 6c 65 20 63 6f  s is a little co
2970: 6d 70 6c 69 63 61 74 65 64 2e 0a 2a 2a 20 20 20  mplicated..**   
2980: 54 68 65 20 76 61 72 69 61 62 6c 65 20 50 61 67  The variable Pag
2990: 65 72 2e 64 62 53 69 7a 65 20 63 6f 6e 74 61 69  er.dbSize contai
29a0: 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ns the number of
29b0: 20 70 61 67 65 73 20 74 68 61 74 20 74 68 65 20   pages that the 
29c0: 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 69 6d  database.**   im
29d0: 61 67 65 20 63 75 72 72 65 6e 74 6c 79 20 63 6f  age currently co
29e0: 6e 74 61 69 6e 73 2e 20 41 73 20 74 68 65 20 64  ntains. As the d
29f0: 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 67 72  atabase image gr
2a00: 6f 77 73 20 6f 72 20 73 68 72 69 6e 6b 73 20 74  ows or shrinks t
2a10: 68 69 73 0a 2a 2a 20 20 20 76 61 72 69 61 62 6c  his.**   variabl
2a20: 65 20 69 73 20 75 70 64 61 74 65 64 2e 20 54 68  e is updated. Th
2a30: 65 20 76 61 72 69 61 62 6c 65 20 50 61 67 65 72  e variable Pager
2a40: 2e 64 62 46 69 6c 65 53 69 7a 65 20 63 6f 6e 74  .dbFileSize cont
2a50: 61 69 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 0a  ains the number.
2a60: 2a 2a 20 20 20 6f 66 20 70 61 67 65 73 20 69 6e  **   of pages in
2a70: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2a80: 6c 65 2e 20 54 68 69 73 20 6d 61 79 20 62 65 20  le. This may be 
2a90: 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 50  different from P
2aa0: 61 67 65 72 2e 64 62 53 69 7a 65 0a 2a 2a 20 20  ager.dbSize.**  
2ab0: 20 69 66 20 73 6f 6d 65 20 70 61 67 65 73 20 68   if some pages h
2ac0: 61 76 65 20 62 65 65 6e 20 61 70 70 65 6e 64 65  ave been appende
2ad0: 64 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  d to the databas
2ae0: 65 20 69 6d 61 67 65 20 62 75 74 20 6e 6f 74 20  e image but not 
2af0: 79 65 74 20 77 72 69 74 74 65 6e 0a 2a 2a 20 20  yet written.**  
2b00: 20 6f 75 74 20 66 72 6f 6d 20 74 68 65 20 63 61   out from the ca
2b10: 63 68 65 20 74 6f 20 74 68 65 20 61 63 74 75 61  che to the actua
2b20: 6c 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20  l file on disk. 
2b30: 4f 72 20 69 66 20 74 68 65 20 69 6d 61 67 65 20  Or if the image 
2b40: 68 61 73 20 62 65 65 6e 0a 2a 2a 20 20 20 74 72  has been.**   tr
2b50: 75 6e 63 61 74 65 64 20 62 79 20 61 6e 20 69 6e  uncated by an in
2b60: 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d  cremental-vacuum
2b70: 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68 65 20   operation. The 
2b80: 50 61 67 65 72 2e 64 62 4f 72 69 67 53 69 7a 65  Pager.dbOrigSize
2b90: 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 20 20 63   variable.**   c
2ba0: 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 75 6d 62  ontains the numb
2bb0: 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
2bc0: 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61 67  he database imag
2bd0: 65 20 77 68 65 6e 20 74 68 65 20 63 75 72 72 65  e when the curre
2be0: 6e 74 0a 2a 2a 20 20 20 74 72 61 6e 73 61 63 74  nt.**   transact
2bf0: 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64 2e 20  ion was opened. 
2c00: 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  The contents of 
2c10: 61 6c 6c 20 74 68 72 65 65 20 6f 66 20 74 68 65  all three of the
2c20: 73 65 20 76 61 72 69 61 62 6c 65 73 20 69 73 0a  se variables is.
2c30: 2a 2a 20 20 20 6f 6e 6c 79 20 67 75 61 72 61 6e  **   only guaran
2c40: 74 65 65 64 20 74 6f 20 62 65 20 63 6f 72 72 65  teed to be corre
2c50: 63 74 20 69 66 20 74 68 65 20 62 6f 6f 6c 65 61  ct if the boolea
2c60: 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65 56 61  n Pager.dbSizeVa
2c70: 6c 69 64 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a  lid is true..**.
2c80: 2a 2a 20 20 20 54 4f 44 4f 3a 20 55 6e 64 65 72  **   TODO: Under
2c90: 20 77 68 61 74 20 63 6f 6e 64 69 74 69 6f 6e 73   what conditions
2ca0: 20 69 73 20 64 62 53 69 7a 65 56 61 6c 69 64 20   is dbSizeValid 
2cb0: 73 65 74 3f 20 43 6c 65 61 72 65 64 3f 0a 2a 2a  set? Cleared?.**
2cc0: 0a 2a 2a 20 63 68 61 6e 67 65 43 6f 75 6e 74 44  .** changeCountD
2cd0: 6f 6e 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73  one.**.**   This
2ce0: 20 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61 62 6c   boolean variabl
2cf0: 65 20 69 73 20 75 73 65 64 20 74 6f 20 6d 61 6b  e is used to mak
2d00: 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20  e sure that the 
2d10: 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 0a  change-counter .
2d20: 2a 2a 20 20 20 28 74 68 65 20 34 2d 62 79 74 65  **   (the 4-byte
2d30: 20 68 65 61 64 65 72 20 66 69 65 6c 64 20 61 74   header field at
2d40: 20 62 79 74 65 20 6f 66 66 73 65 74 20 32 34 20   byte offset 24 
2d50: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
2d60: 66 69 6c 65 29 20 69 73 20 0a 2a 2a 20 20 20 6e  file) is .**   n
2d70: 6f 74 20 75 70 64 61 74 65 64 20 6d 6f 72 65 20  ot updated more 
2d80: 6f 66 74 65 6e 20 74 68 61 6e 20 6e 65 63 65 73  often than neces
2d90: 73 61 72 79 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 49  sary. .**.**   I
2da0: 74 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65  t is set to true
2db0: 20 77 68 65 6e 20 74 68 65 20 63 68 61 6e 67 65   when the change
2dc0: 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64 20 69  -counter field i
2dd0: 73 20 75 70 64 61 74 65 64 2c 20 77 68 69 63 68  s updated, which
2de0: 20 0a 2a 2a 20 20 20 63 61 6e 20 6f 6e 6c 79 20   .**   can only 
2df0: 68 61 70 70 65 6e 20 69 66 20 61 6e 20 65 78 63  happen if an exc
2e00: 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73 20 68  lusive lock is h
2e10: 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62  eld on the datab
2e20: 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 49  ase file..**   I
2e30: 74 20 69 73 20 63 6c 65 61 72 65 64 20 28 73 65  t is cleared (se
2e40: 74 20 74 6f 20 66 61 6c 73 65 29 20 77 68 65 6e  t to false) when
2e50: 65 76 65 72 20 61 6e 20 65 78 63 6c 75 73 69 76  ever an exclusiv
2e60: 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 20 20  e lock is .**   
2e70: 72 65 6c 69 6e 71 75 69 73 68 65 64 20 6f 6e 20  relinquished on 
2e80: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2e90: 65 2e 20 45 61 63 68 20 74 69 6d 65 20 61 20 74  e. Each time a t
2ea0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f  ransaction is co
2eb0: 6d 6d 69 74 74 65 64 2c 0a 2a 2a 20 20 20 54 68  mmitted,.**   Th
2ec0: 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  e changeCountDon
2ed0: 65 20 66 6c 61 67 20 69 73 20 69 6e 73 70 65 63  e flag is inspec
2ee0: 74 65 64 2e 20 49 66 20 69 74 20 69 73 20 74 72  ted. If it is tr
2ef0: 75 65 2c 20 74 68 65 20 77 6f 72 6b 20 6f 66 0a  ue, the work of.
2f00: 2a 2a 20 20 20 75 70 64 61 74 69 6e 67 20 74 68  **   updating th
2f10: 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
2f20: 20 69 73 20 6f 6d 69 74 74 65 64 20 66 6f 72 20   is omitted for 
2f30: 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e  the current tran
2f40: 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20  saction..**.**  
2f50: 20 54 68 69 73 20 6d 65 63 68 61 6e 69 73 6d 20   This mechanism 
2f60: 6d 65 61 6e 73 20 74 68 61 74 20 77 68 65 6e 20  means that when 
2f70: 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75  running in exclu
2f80: 73 69 76 65 20 6d 6f 64 65 2c 20 61 20 63 6f 6e  sive mode, a con
2f90: 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 6e 65  nection .**   ne
2fa0: 65 64 20 6f 6e 6c 79 20 75 70 64 61 74 65 20 74  ed only update t
2fb0: 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
2fc0: 72 20 6f 6e 63 65 2c 20 66 6f 72 20 74 68 65 20  r once, for the 
2fd0: 66 69 72 73 74 20 74 72 61 6e 73 61 63 74 69 6f  first transactio
2fe0: 6e 0a 2a 2a 20 20 20 63 6f 6d 6d 69 74 74 65 64  n.**   committed
2ff0: 2e 0a 2a 2a 0a 2a 2a 20 64 62 4d 6f 64 69 66 69  ..**.** dbModifi
3000: 65 64 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 64  ed.**.**   The d
3010: 62 4d 6f 64 69 66 69 65 64 20 66 6c 61 67 20 69  bModified flag i
3020: 73 20 73 65 74 20 77 68 65 6e 65 76 65 72 20 61  s set whenever a
3030: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 69   database page i
3040: 73 20 64 69 72 74 69 65 64 2e 0a 2a 2a 20 20 20  s dirtied..**   
3050: 49 74 20 69 73 20 63 6c 65 61 72 65 64 20 61 74  It is cleared at
3060: 20 74 68 65 20 65 6e 64 20 6f 66 20 65 61 63 68   the end of each
3070: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
3080: 0a 2a 2a 20 20 20 49 74 20 69 73 20 75 73 65 64  .**   It is used
3090: 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e 67   when committing
30a0: 20 6f 72 20 6f 74 68 65 72 77 69 73 65 20 65 6e   or otherwise en
30b0: 64 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69  ding a transacti
30c0: 6f 6e 2e 20 49 66 0a 2a 2a 20 20 20 74 68 65 20  on. If.**   the 
30d0: 64 62 4d 6f 64 69 66 69 65 64 20 66 6c 61 67 20  dbModified flag 
30e0: 69 73 20 63 6c 65 61 72 20 74 68 65 6e 20 6c 65  is clear then le
30f0: 73 73 20 77 6f 72 6b 20 68 61 73 20 74 6f 20 62  ss work has to b
3100: 65 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 6a 6f  e done..**.** jo
3110: 75 72 6e 61 6c 53 74 61 72 74 65 64 0a 2a 2a 0a  urnalStarted.**.
3120: 2a 2a 20 20 20 54 68 69 73 20 66 6c 61 67 20 69  **   This flag i
3130: 73 20 73 65 74 20 64 75 72 69 6e 67 20 61 20 77  s set during a w
3140: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
3150: 20 61 66 74 65 72 20 74 68 65 20 66 69 72 73 74   after the first
3160: 20 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 2d 68   .**   journal-h
3170: 65 61 64 65 72 20 69 73 20 77 72 69 74 74 65 6e  eader is written
3180: 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20 64   and synced to d
3190: 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 41 66 74  isk..**.**   Aft
31a0: 65 72 20 74 68 69 73 20 68 61 73 20 68 61 70 70  er this has happ
31b0: 65 6e 65 64 2c 20 6e 65 77 20 70 61 67 65 73 20  ened, new pages 
31c0: 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20  appended to the 
31d0: 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 20 20 64  database .**   d
31e0: 6f 20 6e 6f 74 20 6e 65 65 64 20 74 68 65 20 50  o not need the P
31f0: 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66  GHDR_NEED_SYNC f
3200: 6c 61 67 20 73 65 74 2c 20 61 73 20 74 68 65 79  lag set, as they
3210: 20 64 6f 20 6e 6f 74 20 6e 65 65 64 0a 2a 2a 20   do not need.** 
3220: 20 20 74 6f 20 77 61 69 74 20 66 6f 72 20 61 20    to wait for a 
3230: 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 20 62 65 66  journal sync bef
3240: 6f 72 65 20 74 68 65 79 20 63 61 6e 20 62 65 20  ore they can be 
3250: 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 0a 2a  written out to.*
3260: 2a 20 20 20 74 68 65 20 64 61 74 61 62 61 73 65  *   the database
3270: 20 66 69 6c 65 20 28 73 65 65 20 66 75 6e 63 74   file (see funct
3280: 69 6f 6e 20 70 61 67 65 72 5f 77 72 69 74 65 28  ion pager_write(
3290: 29 29 2e 0a 2a 2a 20 20 20 0a 2a 2a 20 73 65 74  ))..**   .** set
32a0: 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 20 20 57  Master.**.**   W
32b0: 68 65 6e 20 50 61 67 65 72 43 6f 6d 6d 69 74 50  hen PagerCommitP
32c0: 68 61 73 65 4f 6e 65 28 29 20 69 73 20 63 61 6c  haseOne() is cal
32d0: 6c 65 64 20 74 6f 20 63 6f 6d 6d 69 74 20 61 20  led to commit a 
32e0: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20  transaction, it 
32f0: 6d 61 79 0a 2a 2a 20 20 20 28 6f 72 20 6d 61 79  may.**   (or may
3300: 20 6e 6f 74 29 20 73 70 65 63 69 66 79 20 61 20   not) specify a 
3310: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e  master-journal n
3320: 61 6d 65 20 74 6f 20 62 65 20 77 72 69 74 74 65  ame to be writte
3330: 6e 20 69 6e 74 6f 20 74 68 65 20 0a 2a 2a 20 20  n into the .**  
3340: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 65   journal file be
3350: 66 6f 72 65 20 69 74 20 69 73 20 73 79 6e 63 65  fore it is synce
3360: 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a  d to disk..**.**
3370: 20 20 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f     Whether or no
3380: 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  t a journal file
3390: 20 63 6f 6e 74 61 69 6e 73 20 61 20 6d 61 73 74   contains a mast
33a0: 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74  er-journal point
33b0: 65 72 20 61 66 66 65 63 74 73 20 0a 2a 2a 20 20  er affects .**  
33c0: 20 74 68 65 20 77 61 79 20 69 6e 20 77 68 69 63   the way in whic
33d0: 68 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  h the journal fi
33e0: 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 20  le is finalized 
33f0: 61 66 74 65 72 20 74 68 65 20 74 72 61 6e 73 61  after the transa
3400: 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20 20 20 63  ction is .**   c
3410: 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c  ommitted or roll
3420: 65 64 20 62 61 63 6b 20 77 68 65 6e 20 72 75 6e  ed back when run
3430: 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e 61 6c  ning in "journal
3440: 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54 22 20 6d  _mode=PERSIST" m
3450: 6f 64 65 2e 0a 2a 2a 20 20 20 49 66 20 61 20 6a  ode..**   If a j
3460: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73  ournal file does
3470: 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 6d   not contain a m
3480: 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f  aster-journal po
3490: 69 6e 74 65 72 2c 20 69 74 20 69 73 0a 2a 2a 20  inter, it is.** 
34a0: 20 20 66 69 6e 61 6c 69 7a 65 64 20 62 79 20 6f    finalized by o
34b0: 76 65 72 77 72 69 74 69 6e 67 20 74 68 65 20 66  verwriting the f
34c0: 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  irst journal hea
34d0: 64 65 72 20 77 69 74 68 20 7a 65 72 6f 65 73 2e  der with zeroes.
34e0: 20 49 66 2c 0a 2a 2a 20 20 20 6f 6e 20 74 68 65   If,.**   on the
34f0: 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 74 20   other hand, it 
3500: 64 6f 65 73 20 63 6f 6e 74 61 69 6e 20 61 20 6d  does contain a m
3510: 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f  aster-journal po
3520: 69 6e 74 65 72 2c 20 74 68 65 0a 2a 2a 20 20 20  inter, the.**   
3530: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
3540: 66 69 6e 61 6c 69 7a 65 64 20 62 79 20 74 72 75  finalized by tru
3550: 6e 63 61 74 69 6e 67 20 69 74 20 74 6f 20 7a 65  ncating it to ze
3560: 72 6f 20 62 79 74 65 73 2c 20 6a 75 73 74 20 61  ro bytes, just a
3570: 73 20 69 66 0a 2a 2a 20 20 20 74 68 65 20 63 6f  s if.**   the co
3580: 6e 6e 65 63 74 69 6f 6e 20 77 65 72 65 20 72 75  nnection were ru
3590: 6e 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e 61  nning in "journa
35a0: 6c 5f 6d 6f 64 65 3d 74 72 75 6e 63 61 74 65 22  l_mode=truncate"
35b0: 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 4a   mode..**.**   J
35c0: 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 74 68 61  ournal files tha
35d0: 74 20 63 6f 6e 74 61 69 6e 20 6d 61 73 74 65 72  t contain master
35e0: 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72   journal pointer
35f0: 73 20 63 61 6e 6e 6f 74 20 62 65 20 66 69 6e 61  s cannot be fina
3600: 6c 69 7a 65 64 0a 2a 2a 20 20 20 73 69 6d 70 6c  lized.**   simpl
3610: 79 20 62 79 20 6f 76 65 72 77 72 69 74 69 6e 67  y by overwriting
3620: 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e   the first journ
3630: 61 6c 2d 68 65 61 64 65 72 20 77 69 74 68 20 7a  al-header with z
3640: 65 72 6f 65 73 2c 20 61 73 20 74 68 65 0a 2a 2a  eroes, as the.**
3650: 20 20 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61     master journa
3660: 6c 20 70 6f 69 6e 74 65 72 20 63 6f 75 6c 64 20  l pointer could 
3670: 69 6e 74 65 72 66 65 72 65 20 77 69 74 68 20 68  interfere with h
3680: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
3690: 61 63 6b 20 6f 66 20 61 6e 79 0a 2a 2a 20 20 20  ack of any.**   
36a0: 73 75 62 73 65 71 75 65 6e 74 6c 79 20 69 6e 74  subsequently int
36b0: 65 72 72 75 70 74 65 64 20 74 72 61 6e 73 61 63  errupted transac
36c0: 74 69 6f 6e 20 74 68 61 74 20 72 65 75 73 65 73  tion that reuses
36d0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
36e0: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 66  e..**.**   The f
36f0: 6c 61 67 20 69 73 20 63 6c 65 61 72 65 64 20 61  lag is cleared a
3700: 73 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 6a 6f  s soon as the jo
3710: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 66 69  urnal file is fi
3720: 6e 61 6c 69 7a 65 64 20 28 65 69 74 68 65 72 0a  nalized (either.
3730: 2a 2a 20 20 20 62 79 20 50 61 67 65 72 43 6f 6d  **   by PagerCom
3740: 6d 69 74 50 68 61 73 65 54 77 6f 20 6f 72 20 50  mitPhaseTwo or P
3750: 61 67 65 72 52 6f 6c 6c 62 61 63 6b 29 2e 20 49  agerRollback). I
3760: 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 70 72  f an IO error pr
3770: 65 76 65 6e 74 73 20 74 68 65 0a 2a 2a 20 20 20  events the.**   
3780: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 72 6f  journal file fro
3790: 6d 20 62 65 69 6e 67 20 73 75 63 63 65 73 73 66  m being successf
37a0: 75 6c 6c 79 20 66 69 6e 61 6c 69 7a 65 64 2c 20  ully finalized, 
37b0: 74 68 65 20 73 65 74 4d 61 73 74 65 72 20 66 6c  the setMaster fl
37c0: 61 67 0a 2a 2a 20 20 20 69 73 20 63 6c 65 61 72  ag.**   is clear
37d0: 65 64 20 61 6e 79 77 61 79 2e 0a 2a 2a 0a 2a 2a  ed anyway..**.**
37e0: 20 64 6f 4e 6f 74 53 70 69 6c 6c 2c 20 64 6f 4e   doNotSpill, doN
37f0: 6f 74 53 79 6e 63 53 70 69 6c 6c 0a 2a 2a 0a 2a  otSyncSpill.**.*
3800: 2a 20 20 20 57 68 65 6e 20 65 6e 61 62 6c 65 64  *   When enabled
3810: 2c 20 63 61 63 68 65 20 73 70 69 6c 6c 73 20 61  , cache spills a
3820: 72 65 20 70 72 6f 68 69 62 69 74 65 64 2e 20 20  re prohibited.  
3830: 54 68 65 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 76  The doNotSpill v
3840: 61 72 69 61 62 6c 65 0a 2a 2a 20 20 20 69 6e 68  ariable.**   inh
3850: 69 62 69 74 73 20 61 6c 6c 20 63 61 63 68 65 20  ibits all cache 
3860: 73 70 69 6c 6c 20 61 6e 64 20 64 6f 4e 6f 74 53  spill and doNotS
3870: 79 6e 63 53 70 69 6c 6c 20 69 6e 68 69 62 69 74  yncSpill inhibit
3880: 73 20 74 68 6f 73 65 20 73 70 69 6c 6c 73 20 74  s those spills t
3890: 68 61 74 0a 2a 2a 20 20 20 77 6f 75 6c 64 20 72  hat.**   would r
38a0: 65 71 75 69 72 65 20 61 20 6a 6f 75 72 6e 61 6c  equire a journal
38b0: 20 73 79 6e 63 2e 20 20 54 68 65 20 64 6f 4e 6f   sync.  The doNo
38c0: 74 53 79 6e 63 53 70 69 6c 6c 20 69 73 20 73 65  tSyncSpill is se
38d0: 74 20 61 6e 64 20 63 6c 65 61 72 65 64 20 0a 2a  t and cleared .*
38e0: 2a 20 20 20 62 79 20 73 71 6c 69 74 65 33 50 61  *   by sqlite3Pa
38f0: 67 65 72 57 72 69 74 65 28 29 20 69 6e 20 6f 72  gerWrite() in or
3900: 64 65 72 20 74 6f 20 70 72 65 76 65 6e 74 20 61  der to prevent a
3910: 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 20 66 72   journal sync fr
3920: 6f 6d 20 68 61 70 70 65 6e 69 6e 67 20 0a 2a 2a  om happening .**
3930: 20 20 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68     in between th
3940: 65 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 6f 66  e journalling of
3950: 20 74 77 6f 20 70 61 67 65 73 20 6f 6e 20 74 68   two pages on th
3960: 65 20 73 61 6d 65 20 73 65 63 74 6f 72 2e 20 20  e same sector.  
3970: 54 68 65 0a 2a 2a 20 20 20 64 6f 4e 6f 74 53 70  The.**   doNotSp
3980: 69 6c 6c 20 76 61 6c 75 65 20 73 65 74 20 74 6f  ill value set to
3990: 20 70 72 65 76 65 6e 74 20 70 61 67 65 72 53 74   prevent pagerSt
39a0: 72 65 73 73 28 29 20 66 72 6f 6d 20 74 72 79 69  ress() from tryi
39b0: 6e 67 20 74 6f 20 75 73 65 0a 2a 2a 20 20 20 74  ng to use.**   t
39c0: 68 65 20 6a 6f 75 72 6e 61 6c 20 64 75 72 69 6e  he journal durin
39d0: 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  g a rollback..**
39e0: 0a 2a 2a 20 6e 65 65 64 53 79 6e 63 0a 2a 2a 0a  .** needSync.**.
39f0: 2a 2a 20 20 20 54 4f 44 4f 3a 20 49 74 20 6d 69  **   TODO: It mi
3a00: 67 68 74 20 62 65 20 65 61 73 69 65 72 20 74 6f  ght be easier to
3a10: 20 73 65 74 20 74 68 69 73 20 76 61 72 69 61 62   set this variab
3a20: 6c 65 20 69 6e 20 77 72 69 74 65 4a 6f 75 72 6e  le in writeJourn
3a30: 61 6c 48 64 72 28 29 0a 2a 2a 20 20 20 61 6e 64  alHdr().**   and
3a40: 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72   writeMasterJour
3a50: 6e 61 6c 28 29 20 6f 6e 6c 79 2e 20 43 68 61 6e  nal() only. Chan
3a60: 67 65 20 69 74 73 20 6d 65 61 6e 69 6e 67 20 74  ge its meaning t
3a70: 6f 20 22 75 6e 73 79 6e 63 65 64 20 64 61 74 61  o "unsynced data
3a80: 0a 2a 2a 20 20 20 68 61 73 20 62 65 65 6e 20 77  .**   has been w
3a90: 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f  ritten to the jo
3aa0: 75 72 6e 61 6c 22 2e 0a 2a 2a 0a 2a 2a 20 73 75  urnal"..**.** su
3ab0: 62 6a 49 6e 4d 65 6d 6f 72 79 0a 2a 2a 0a 2a 2a  bjInMemory.**.**
3ac0: 20 20 20 54 68 69 73 20 69 73 20 61 20 62 6f 6f     This is a boo
3ad0: 6c 65 61 6e 20 76 61 72 69 61 62 6c 65 2e 20 49  lean variable. I
3ae0: 66 20 74 72 75 65 2c 20 74 68 65 6e 20 61 6e 79  f true, then any
3af0: 20 72 65 71 75 69 72 65 64 20 73 75 62 2d 6a 6f   required sub-jo
3b00: 75 72 6e 61 6c 0a 2a 2a 20 20 20 69 73 20 6f 70  urnal.**   is op
3b10: 65 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d 65  ened as an in-me
3b20: 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  mory journal fil
3b30: 65 2e 20 49 66 20 66 61 6c 73 65 2c 20 74 68 65  e. If false, the
3b40: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 20  n in-memory.**  
3b50: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 61 72   sub-journals ar
3b60: 65 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 20  e only used for 
3b70: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 20  in-memory pager 
3b80: 66 69 6c 65 73 2e 0a 2a 2f 0a 73 74 72 75 63 74  files..*/.struct
3b90: 20 50 61 67 65 72 20 7b 0a 20 20 73 71 6c 69 74   Pager {.  sqlit
3ba0: 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20  e3_vfs *pVfs;   
3bb0: 20 20 20 20 20 20 20 2f 2a 20 4f 53 20 66 75 6e         /* OS fun
3bc0: 63 74 69 6f 6e 73 20 74 6f 20 75 73 65 20 66 6f  ctions to use fo
3bd0: 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20 65 78 63  r IO */.  u8 exc
3be0: 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20 20 20  lusiveMode;     
3bf0: 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e        /* Boolean
3c00: 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b 69 6e  . True if lockin
3c10: 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53 49 56  g_mode==EXCLUSIV
3c20: 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61  E */.  u8 journa
3c30: 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  lMode;          
3c40: 20 20 20 2f 2a 20 4f 6e 20 6f 66 20 74 68 65 20     /* On of the 
3c50: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
3c60: 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20  E_* values */.  
3c70: 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 20 20  u8 useJournal;  
3c80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
3c90: 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f  se a rollback jo
3ca0: 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66 69  urnal on this fi
3cb0: 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 52 65 61  le */.  u8 noRea
3cc0: 64 6c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20  dlock;          
3cd0: 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f      /* Do not bo
3ce0: 74 68 65 72 20 74 6f 20 6f 62 74 61 69 6e 20 72  ther to obtain r
3cf0: 65 61 64 6c 6f 63 6b 73 20 2a 2f 0a 20 20 75 38  eadlocks */.  u8
3d00: 20 6e 6f 53 79 6e 63 3b 20 20 20 20 20 20 20 20   noSync;        
3d10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
3d20: 6e 6f 74 20 73 79 6e 63 20 74 68 65 20 6a 6f 75  not sync the jou
3d30: 72 6e 61 6c 20 69 66 20 74 72 75 65 20 2a 2f 0a  rnal if true */.
3d40: 20 20 75 38 20 66 75 6c 6c 53 79 6e 63 3b 20 20    u8 fullSync;  
3d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3d60: 20 44 6f 20 65 78 74 72 61 20 73 79 6e 63 73 20   Do extra syncs 
3d70: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
3d80: 6f 72 20 72 6f 62 75 73 74 6e 65 73 73 20 2a 2f  or robustness */
3d90: 0a 20 20 75 38 20 73 79 6e 63 5f 66 6c 61 67 73  .  u8 sync_flags
3da0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
3db0: 2a 20 4f 6e 65 20 6f 66 20 53 59 4e 43 5f 4e 4f  * One of SYNC_NO
3dc0: 52 4d 41 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c  RMAL or SYNC_FUL
3dd0: 4c 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46 69  L */.  u8 tempFi
3de0: 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  le;             
3df0: 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20     /* zFilename 
3e00: 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  is a temporary f
3e10: 69 6c 65 20 2a 2f 0a 20 20 75 38 20 72 65 61 64  ile */.  u8 read
3e20: 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20 20  Only;           
3e30: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
3e40: 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74   a read-only dat
3e50: 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 6d 65  abase */.  u8 me
3e60: 6d 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  mDb;            
3e70: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
3e80: 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c 20 66 69  o inhibit all fi
3e90: 6c 65 20 49 2f 4f 20 2a 2f 0a 0a 20 20 2f 2a 20  le I/O */..  /* 
3ea0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c  The following bl
3eb0: 6f 63 6b 20 63 6f 6e 74 61 69 6e 73 20 74 68 6f  ock contains tho
3ec0: 73 65 20 63 6c 61 73 73 20 6d 65 6d 62 65 72 73  se class members
3ed0: 20 74 68 61 74 20 61 72 65 20 64 79 6e 61 6d 69   that are dynami
3ee0: 63 61 6c 6c 79 0a 20 20 2a 2a 20 6d 6f 64 69 66  cally.  ** modif
3ef0: 69 65 64 20 64 75 72 69 6e 67 20 6e 6f 72 6d 61  ied during norma
3f00: 6c 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 54 68  l operations. Th
3f10: 65 20 6f 74 68 65 72 20 76 61 72 69 61 62 6c 65  e other variable
3f20: 73 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74  s in this struct
3f30: 75 72 65 0a 20 20 2a 2a 20 61 72 65 20 65 69 74  ure.  ** are eit
3f40: 68 65 72 20 63 6f 6e 73 74 61 6e 74 20 74 68 72  her constant thr
3f50: 6f 75 67 68 6f 75 74 20 74 68 65 20 6c 69 66 65  oughout the life
3f60: 74 69 6d 65 20 6f 66 20 74 68 65 20 70 61 67 65  time of the page
3f70: 72 2c 20 6f 72 20 65 6c 73 65 0a 20 20 2a 2a 20  r, or else.  ** 
3f80: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 63 6f  used to store co
3f90: 6e 66 69 67 75 72 61 74 69 6f 6e 20 70 61 72 61  nfiguration para
3fa0: 6d 65 74 65 72 73 20 74 68 61 74 20 61 66 66 65  meters that affe
3fb0: 63 74 20 74 68 65 20 77 61 79 20 74 68 65 20 70  ct the way the p
3fc0: 61 67 65 72 20 0a 20 20 2a 2a 20 6f 70 65 72 61  ager .  ** opera
3fd0: 74 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  tes..  **.  ** T
3fe0: 68 65 20 27 73 74 61 74 65 27 20 76 61 72 69 61  he 'state' varia
3ff0: 62 6c 65 20 69 73 20 64 65 73 63 72 69 62 65 64  ble is described
4000: 20 69 6e 20 6d 6f 72 65 20 64 65 74 61 69 6c 20   in more detail 
4010: 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 0a 20  along with the. 
4020: 20 2a 2a 20 64 65 73 63 72 69 70 74 69 6f 6e 73   ** descriptions
4030: 20 6f 66 20 74 68 65 20 76 61 6c 75 65 73 20 69   of the values i
4040: 74 20 6d 61 79 20 74 61 6b 65 20 2d 20 50 41 47  t may take - PAG
4050: 45 52 5f 55 4e 4c 4f 43 4b 20 65 74 63 2e 20 4d  ER_UNLOCK etc. M
4060: 61 6e 79 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  any of the.  ** 
4070: 6f 74 68 65 72 20 76 61 72 69 61 62 6c 65 73 20  other variables 
4080: 69 6e 20 74 68 69 73 20 62 6c 6f 63 6b 20 61 72  in this block ar
4090: 65 20 64 65 73 63 72 69 62 65 64 20 69 6e 20 74  e described in t
40a0: 68 65 20 63 6f 6d 6d 65 6e 74 20 64 69 72 65 63  he comment direc
40b0: 74 6c 79 20 0a 20 20 2a 2a 20 61 62 6f 76 65 20  tly .  ** above 
40c0: 74 68 69 73 20 63 6c 61 73 73 20 64 65 66 69 6e  this class defin
40d0: 69 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 75 38  ition..  */.  u8
40e0: 20 73 74 61 74 65 3b 20 20 20 20 20 20 20 20 20   state;         
40f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47            /* PAG
4100: 45 52 5f 55 4e 4c 4f 43 4b 2c 20 5f 53 48 41 52  ER_UNLOCK, _SHAR
4110: 45 44 2c 20 5f 52 45 53 45 52 56 45 44 2c 20 65  ED, _RESERVED, e
4120: 74 63 2e 20 2a 2f 0a 20 20 75 38 20 64 62 4d 6f  tc. */.  u8 dbMo
4130: 64 69 66 69 65 64 3b 20 20 20 20 20 20 20 20 20  dified;         
4140: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
4150: 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 63 68  there are any ch
4160: 61 6e 67 65 73 20 74 6f 20 74 68 65 20 44 62 20  anges to the Db 
4170: 2a 2f 0a 20 20 75 38 20 6e 65 65 64 53 79 6e 63  */.  u8 needSync
4180: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4190: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 20 66   /* True if an f
41a0: 73 79 6e 63 28 29 20 69 73 20 6e 65 65 64 65 64  sync() is needed
41b0: 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   on the journal 
41c0: 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c 53  */.  u8 journalS
41d0: 74 61 72 74 65 64 3b 20 20 20 20 20 20 20 20 20  tarted;         
41e0: 20 2f 2a 20 54 72 75 65 20 69 66 20 68 65 61 64   /* True if head
41f0: 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 69 73  er of journal is
4200: 20 73 79 6e 63 65 64 20 2a 2f 0a 20 20 75 38 20   synced */.  u8 
4210: 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 3b  changeCountDone;
4220: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20           /* Set 
4230: 61 66 74 65 72 20 69 6e 63 72 65 6d 65 6e 74 69  after incrementi
4240: 6e 67 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  ng the change-co
4250: 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 73 65  unter */.  u8 se
4260: 74 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20 20  tMaster;        
4270: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
4280: 66 20 61 20 6d 2d 6a 20 6e 61 6d 65 20 68 61 73  f a m-j name has
4290: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
42a0: 20 6a 72 6e 6c 20 2a 2f 0a 20 20 75 38 20 64 6f   jrnl */.  u8 do
42b0: 4e 6f 74 53 70 69 6c 6c 3b 20 20 20 20 20 20 20  NotSpill;       
42c0: 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
42d0: 20 73 70 69 6c 6c 20 74 68 65 20 63 61 63 68 65   spill the cache
42e0: 20 77 68 65 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 2a   when non-zero *
42f0: 2f 0a 20 20 75 38 20 64 6f 4e 6f 74 53 79 6e 63  /.  u8 doNotSync
4300: 53 70 69 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  Spill;          
4310: 2f 2a 20 44 6f 20 6e 6f 74 20 64 6f 20 61 20 73  /* Do not do a s
4320: 70 69 6c 6c 20 74 68 61 74 20 72 65 71 75 69 72  pill that requir
4330: 65 73 20 6a 72 6e 6c 20 73 79 6e 63 20 2a 2f 0a  es jrnl sync */.
4340: 20 20 75 38 20 64 62 53 69 7a 65 56 61 6c 69 64    u8 dbSizeValid
4350: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
4360: 20 53 65 74 20 77 68 65 6e 20 64 62 53 69 7a 65   Set when dbSize
4370: 20 69 73 20 63 6f 72 72 65 63 74 20 2a 2f 0a 20   is correct */. 
4380: 20 75 38 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79   u8 subjInMemory
4390: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
43a0: 54 72 75 65 20 74 6f 20 75 73 65 20 69 6e 2d 6d  True to use in-m
43b0: 65 6d 6f 72 79 20 73 75 62 2d 6a 6f 75 72 6e 61  emory sub-journa
43c0: 6c 73 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 53  ls */.  Pgno dbS
43d0: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
43e0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
43f0: 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
4400: 74 61 62 61 73 65 20 2a 2f 0a 20 20 50 67 6e 6f  tabase */.  Pgno
4410: 20 64 62 4f 72 69 67 53 69 7a 65 3b 20 20 20 20   dbOrigSize;    
4420: 20 20 20 20 20 20 20 20 2f 2a 20 64 62 53 69 7a          /* dbSiz
4430: 65 20 62 65 66 6f 72 65 20 74 68 65 20 63 75 72  e before the cur
4440: 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
4450: 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 46 69 6c   */.  Pgno dbFil
4460: 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  eSize;          
4470: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
4480: 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ages in the data
4490: 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69  base file */.  i
44a0: 6e 74 20 65 72 72 43 6f 64 65 3b 20 20 20 20 20  nt errCode;     
44b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
44c0: 65 20 6f 66 20 73 65 76 65 72 61 6c 20 6b 69 6e  e of several kin
44d0: 64 73 20 6f 66 20 65 72 72 6f 72 73 20 2a 2f 0a  ds of errors */.
44e0: 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20 20 20    int nRec;     
44f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4500: 20 50 61 67 65 73 20 6a 6f 75 72 6e 61 6c 6c 65   Pages journalle
4510: 64 20 73 69 6e 63 65 20 6c 61 73 74 20 6a 2d 68  d since last j-h
4520: 65 61 64 65 72 20 77 72 69 74 74 65 6e 20 2a 2f  eader written */
4530: 0a 20 20 75 33 32 20 63 6b 73 75 6d 49 6e 69 74  .  u32 cksumInit
4540: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
4550: 2a 20 51 75 61 73 69 2d 72 61 6e 64 6f 6d 20 76  * Quasi-random v
4560: 61 6c 75 65 20 61 64 64 65 64 20 74 6f 20 65 76  alue added to ev
4570: 65 72 79 20 63 68 65 63 6b 73 75 6d 20 2a 2f 0a  ery checksum */.
4580: 20 20 75 33 32 20 6e 53 75 62 52 65 63 3b 20 20    u32 nSubRec;  
4590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
45a0: 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72   Number of recor
45b0: 64 73 20 77 72 69 74 74 65 6e 20 74 6f 20 73 75  ds written to su
45c0: 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 42  b-journal */.  B
45d0: 69 74 76 65 63 20 2a 70 49 6e 4a 6f 75 72 6e 61  itvec *pInJourna
45e0: 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e  l;         /* On
45f0: 65 20 62 69 74 20 66 6f 72 20 65 61 63 68 20 70  e bit for each p
4600: 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62  age in the datab
4610: 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 73 71  ase file */.  sq
4620: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b 20  lite3_file *fd; 
4630: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
4640: 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72  e descriptor for
4650: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 73   database */.  s
4660: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 6a 66 64  qlite3_file *jfd
4670: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ;          /* Fi
4680: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f  le descriptor fo
4690: 72 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a  r main journal *
46a0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
46b0: 20 2a 73 6a 66 64 3b 20 20 20 20 20 20 20 20 20   *sjfd;         
46c0: 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74  /* File descript
46d0: 6f 72 20 66 6f 72 20 73 75 62 2d 6a 6f 75 72 6e  or for sub-journ
46e0: 61 6c 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72  al */.  i64 jour
46f0: 6e 61 6c 4f 66 66 3b 20 20 20 20 20 20 20 20 20  nalOff;         
4700: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 77      /* Current w
4710: 72 69 74 65 20 6f 66 66 73 65 74 20 69 6e 20 74  rite offset in t
4720: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
4730: 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c  */.  i64 journal
4740: 48 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Hdr;            
4750: 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65 74 20   /* Byte offset 
4760: 74 6f 20 70 72 65 76 69 6f 75 73 20 6a 6f 75 72  to previous jour
4770: 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  nal header */.  
4780: 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c  i64 journalSizeL
4790: 69 6d 69 74 3b 20 20 20 20 20 20 20 2f 2a 20 53  imit;       /* S
47a0: 69 7a 65 20 6c 69 6d 69 74 20 66 6f 72 20 70 65  ize limit for pe
47b0: 72 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c  rsistent journal
47c0: 20 66 69 6c 65 73 20 2a 2f 0a 20 20 50 61 67 65   files */.  Page
47d0: 72 53 61 76 65 70 6f 69 6e 74 20 2a 61 53 61 76  rSavepoint *aSav
47e0: 65 70 6f 69 6e 74 3b 20 2f 2a 20 41 72 72 61 79  epoint; /* Array
47f0: 20 6f 66 20 61 63 74 69 76 65 20 73 61 76 65 70   of active savep
4800: 6f 69 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  oints */.  int n
4810: 53 61 76 65 70 6f 69 6e 74 3b 20 20 20 20 20 20  Savepoint;      
4820: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
4830: 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20   of elements in 
4840: 61 53 61 76 65 70 6f 69 6e 74 5b 5d 20 2a 2f 0a  aSavepoint[] */.
4850: 20 20 63 68 61 72 20 64 62 46 69 6c 65 56 65 72    char dbFileVer
4860: 73 5b 31 36 5d 3b 20 20 20 20 20 20 20 20 2f 2a  s[16];        /*
4870: 20 43 68 61 6e 67 65 73 20 77 68 65 6e 65 76 65   Changes wheneve
4880: 72 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  r database file 
4890: 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 75 33 32  changes */.  u32
48a0: 20 73 65 63 74 6f 72 53 69 7a 65 3b 20 20 20 20   sectorSize;    
48b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 75           /* Assu
48c0: 6d 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20  med sector size 
48d0: 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20  during rollback 
48e0: 2a 2f 0a 0a 20 20 75 31 36 20 6e 45 78 74 72 61  */..  u16 nExtra
48f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4900: 20 20 2f 2a 20 41 64 64 20 74 68 69 73 20 6d 61    /* Add this ma
4910: 6e 79 20 62 79 74 65 73 20 74 6f 20 65 61 63 68  ny bytes to each
4920: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20   in-memory page 
4930: 2a 2f 0a 20 20 69 31 36 20 6e 52 65 73 65 72 76  */.  i16 nReserv
4940: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
4950: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e   /* Number of un
4960: 75 73 65 64 20 62 79 74 65 73 20 61 74 20 65 6e  used bytes at en
4970: 64 20 6f 66 20 65 61 63 68 20 70 61 67 65 20 2a  d of each page *
4980: 2f 0a 20 20 75 33 32 20 76 66 73 46 6c 61 67 73  /.  u32 vfsFlags
4990: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
49a0: 2f 2a 20 46 6c 61 67 73 20 66 6f 72 20 73 71 6c  /* Flags for sql
49b0: 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29  ite3_vfs.xOpen()
49c0: 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65 53 69   */.  int pageSi
49d0: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
49e0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
49f0: 79 74 65 73 20 69 6e 20 61 20 70 61 67 65 20 2a  ytes in a page *
4a00: 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 6e 6f 3b  /.  Pgno mxPgno;
4a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a20: 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77  /* Maximum allow
4a30: 65 64 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  ed size of the d
4a40: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63 68 61  atabase */.  cha
4a50: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20  r *zFilename;   
4a60: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
4a70: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
4a80: 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20   file */.  char 
4a90: 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20  *zJournal;      
4aa0: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
4ab0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
4ac0: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42  le */.  int (*xB
4ad0: 75 73 79 48 61 6e 64 6c 65 72 29 28 76 6f 69 64  usyHandler)(void
4ae0: 2a 29 3b 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20  *); /* Function 
4af0: 74 6f 20 63 61 6c 6c 20 77 68 65 6e 20 62 75 73  to call when bus
4b00: 79 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75  y */.  void *pBu
4b10: 73 79 48 61 6e 64 6c 65 72 41 72 67 3b 20 20 20  syHandlerArg;   
4b20: 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 61 72     /* Context ar
4b30: 67 75 6d 65 6e 74 20 66 6f 72 20 78 42 75 73 79  gument for xBusy
4b40: 48 61 6e 64 6c 65 72 20 2a 2f 0a 23 69 66 64 65  Handler */.#ifde
4b50: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
4b60: 69 6e 74 20 6e 48 69 74 2c 20 6e 4d 69 73 73 3b  int nHit, nMiss;
4b70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
4b80: 61 63 68 65 20 68 69 74 73 20 61 6e 64 20 6d 69  ache hits and mi
4b90: 73 73 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 6e  ssing */.  int n
4ba0: 52 65 61 64 2c 20 6e 57 72 69 74 65 3b 20 20 20  Read, nWrite;   
4bb0: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
4bc0: 73 65 20 70 61 67 65 73 20 72 65 61 64 2f 77 72  se pages read/wr
4bd0: 69 74 74 65 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a  itten */.#endif.
4be0: 20 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74    void (*xReinit
4bf0: 65 72 29 28 44 62 50 61 67 65 2a 29 3b 20 2f 2a  er)(DbPage*); /*
4c00: 20 43 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69   Call this routi
4c10: 6e 65 20 77 68 65 6e 20 72 65 6c 6f 61 64 69 6e  ne when reloadin
4c20: 67 20 70 61 67 65 73 20 2a 2f 0a 23 69 66 64 65  g pages */.#ifde
4c30: 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
4c40: 45 43 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43 6f  EC.  void *(*xCo
4c50: 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a  dec)(void*,void*
4c60: 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20 2f 2a 20 52  ,Pgno,int); /* R
4c70: 6f 75 74 69 6e 65 20 66 6f 72 20 65 6e 2f 64 65  outine for en/de
4c80: 63 6f 64 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20  coding data */. 
4c90: 20 76 6f 69 64 20 28 2a 78 43 6f 64 65 63 53 69   void (*xCodecSi
4ca0: 7a 65 43 68 6e 67 29 28 76 6f 69 64 2a 2c 69 6e  zeChng)(void*,in
4cb0: 74 2c 69 6e 74 29 3b 20 2f 2a 20 4e 6f 74 69 66  t,int); /* Notif
4cc0: 79 20 6f 66 20 70 61 67 65 20 73 69 7a 65 20 63  y of page size c
4cd0: 68 61 6e 67 65 73 20 2a 2f 0a 20 20 76 6f 69 64  hanges */.  void
4ce0: 20 28 2a 78 43 6f 64 65 63 46 72 65 65 29 28 76   (*xCodecFree)(v
4cf0: 6f 69 64 2a 29 3b 20 20 20 20 20 20 20 20 20 20  oid*);          
4d00: 20 20 20 2f 2a 20 44 65 73 74 72 75 63 74 6f 72     /* Destructor
4d10: 20 66 6f 72 20 74 68 65 20 63 6f 64 65 63 20 2a   for the codec *
4d20: 2f 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64 65 63  /.  void *pCodec
4d30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4d40: 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e  /* First argumen
4d50: 74 20 74 6f 20 78 43 6f 64 65 63 2e 2e 2e 20 6d  t to xCodec... m
4d60: 65 74 68 6f 64 73 20 2a 2f 0a 23 65 6e 64 69 66  ethods */.#endif
4d70: 0a 20 20 63 68 61 72 20 2a 70 54 6d 70 53 70 61  .  char *pTmpSpa
4d80: 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ce;            /
4d90: 2a 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65  * Pager.pageSize
4da0: 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
4db0: 66 6f 72 20 74 6d 70 20 75 73 65 20 2a 2f 0a 20  for tmp use */. 
4dc0: 20 50 43 61 63 68 65 20 2a 70 50 43 61 63 68 65   PCache *pPCache
4dd0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
4de0: 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20  Pointer to page 
4df0: 63 61 63 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a  cache object */.
4e00: 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70    sqlite3_backup
4e10: 20 2a 70 42 61 63 6b 75 70 3b 20 20 20 20 2f 2a   *pBackup;    /*
4e20: 20 50 6f 69 6e 74 65 72 20 74 6f 20 6c 69 73 74   Pointer to list
4e30: 20 6f 66 20 6f 6e 67 6f 69 6e 67 20 62 61 63 6b   of ongoing back
4e40: 75 70 20 70 72 6f 63 65 73 73 65 73 20 2a 2f 0a  up processes */.
4e50: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
4e60: 4d 49 54 5f 57 41 4c 0a 20 20 57 61 6c 20 2a 70  MIT_WAL.  Wal *p
4e70: 57 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Wal;            
4e80: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 2d 61        /* Write-a
4e90: 68 65 61 64 20 6c 6f 67 20 75 73 65 64 20 62 79  head log used by
4ea0: 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77   "journal_mode=w
4eb0: 61 6c 22 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  al" */.  char *z
4ec0: 57 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Wal;            
4ed0: 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 6e 61 6d       /* File nam
4ee0: 65 20 66 6f 72 20 77 72 69 74 65 2d 61 68 65 61  e for write-ahea
4ef0: 64 20 6c 6f 67 20 2a 2f 0a 23 65 6e 64 69 66 0a  d log */.#endif.
4f00: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  };../*.** The fo
4f10: 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76  llowing global v
4f20: 61 72 69 61 62 6c 65 73 20 68 6f 6c 64 20 63 6f  ariables hold co
4f30: 75 6e 74 65 72 73 20 75 73 65 64 20 66 6f 72 0a  unters used for.
4f40: 2a 2a 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f  ** testing purpo
4f50: 73 65 73 20 6f 6e 6c 79 2e 20 20 54 68 65 73 65  ses only.  These
4f60: 20 76 61 72 69 61 62 6c 65 73 20 64 6f 20 6e 6f   variables do no
4f70: 74 20 65 78 69 73 74 20 69 6e 0a 2a 2a 20 61 20  t exist in.** a 
4f80: 6e 6f 6e 2d 74 65 73 74 69 6e 67 20 62 75 69 6c  non-testing buil
4f90: 64 2e 20 20 54 68 65 73 65 20 76 61 72 69 61 62  d.  These variab
4fa0: 6c 65 73 20 61 72 65 20 6e 6f 74 20 74 68 72 65  les are not thre
4fb0: 61 64 2d 73 61 66 65 2e 0a 2a 2f 0a 23 69 66 64  ad-safe..*/.#ifd
4fc0: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69  ef SQLITE_TEST.i
4fd0: 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72  nt sqlite3_pager
4fe0: 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 20 3d 20  _readdb_count = 
4ff0: 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  0;    /* Number 
5000: 6f 66 20 66 75 6c 6c 20 70 61 67 65 73 20 72 65  of full pages re
5010: 61 64 20 66 72 6f 6d 20 44 42 20 2a 2f 0a 69 6e  ad from DB */.in
5020: 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  t sqlite3_pager_
5030: 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 20 3d 20  writedb_count = 
5040: 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  0;   /* Number o
5050: 66 20 66 75 6c 6c 20 70 61 67 65 73 20 77 72 69  f full pages wri
5060: 74 74 65 6e 20 74 6f 20 44 42 20 2a 2f 0a 69 6e  tten to DB */.in
5070: 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  t sqlite3_pager_
5080: 77 72 69 74 65 6a 5f 63 6f 75 6e 74 20 3d 20 30  writej_count = 0
5090: 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  ;    /* Number o
50a0: 66 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 20  f pages written 
50b0: 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 20  to journal */.# 
50c0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e 43  define PAGER_INC
50d0: 52 28 76 29 20 20 76 2b 2b 0a 23 65 6c 73 65 0a  R(v)  v++.#else.
50e0: 23 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49  # define PAGER_I
50f0: 4e 43 52 28 76 29 0a 23 65 6e 64 69 66 0a 0a 0a  NCR(v).#endif...
5100: 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20 66  ./*.** Journal f
5110: 69 6c 65 73 20 62 65 67 69 6e 20 77 69 74 68 20  iles begin with 
5120: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61  the following ma
5130: 67 69 63 20 73 74 72 69 6e 67 2e 20 20 54 68 65  gic string.  The
5140: 20 64 61 74 61 0a 2a 2a 20 77 61 73 20 6f 62 74   data.** was obt
5150: 61 69 6e 65 64 20 66 72 6f 6d 20 2f 64 65 76 2f  ained from /dev/
5160: 72 61 6e 64 6f 6d 2e 20 20 49 74 20 69 73 20 75  random.  It is u
5170: 73 65 64 20 6f 6e 6c 79 20 61 73 20 61 20 73 61  sed only as a sa
5180: 6e 69 74 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a 2a  nity check..**.*
5190: 2a 20 53 69 6e 63 65 20 76 65 72 73 69 6f 6e 20  * Since version 
51a0: 32 2e 38 2e 30 2c 20 74 68 65 20 6a 6f 75 72 6e  2.8.0, the journ
51b0: 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 74 61 69  al format contai
51c0: 6e 73 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 61  ns additional sa
51d0: 6e 69 74 79 0a 2a 2a 20 63 68 65 63 6b 69 6e 67  nity.** checking
51e0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 49   information.  I
51f0: 66 20 74 68 65 20 70 6f 77 65 72 20 66 61 69 6c  f the power fail
5200: 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72  s while the jour
5210: 6e 61 6c 20 69 73 20 62 65 69 6e 67 0a 2a 2a 20  nal is being.** 
5220: 77 72 69 74 74 65 6e 2c 20 73 65 6d 69 2d 72 61  written, semi-ra
5230: 6e 64 6f 6d 20 67 61 72 62 61 67 65 20 64 61 74  ndom garbage dat
5240: 61 20 6d 69 67 68 74 20 61 70 70 65 61 72 20 69  a might appear i
5250: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  n the journal.**
5260: 20 66 69 6c 65 20 61 66 74 65 72 20 70 6f 77 65   file after powe
5270: 72 20 69 73 20 72 65 73 74 6f 72 65 64 2e 20 20  r is restored.  
5280: 49 66 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73  If an attempt is
5290: 20 74 68 65 6e 20 6d 61 64 65 0a 2a 2a 20 74 6f   then made.** to
52a0: 20 72 6f 6c 6c 20 74 68 65 20 6a 6f 75 72 6e 61   roll the journa
52b0: 6c 20 62 61 63 6b 2c 20 74 68 65 20 64 61 74 61  l back, the data
52c0: 62 61 73 65 20 63 6f 75 6c 64 20 62 65 20 63 6f  base could be co
52d0: 72 72 75 70 74 65 64 2e 20 20 54 68 65 20 61 64  rrupted.  The ad
52e0: 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e 69  ditional.** sani
52f0: 74 79 20 63 68 65 63 6b 69 6e 67 20 64 61 74 61  ty checking data
5300: 20 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20 74   is an attempt t
5310: 6f 20 64 69 73 63 6f 76 65 72 20 74 68 65 20 67  o discover the g
5320: 61 72 62 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a  arbage in the.**
5330: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 67 6e   journal and ign
5340: 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  ore it..**.** Th
5350: 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  e sanity checkin
5360: 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  g information fo
5370: 72 20 74 68 65 20 6e 65 77 20 6a 6f 75 72 6e 61  r the new journa
5380: 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 73 69 73 74  l format consist
5390: 73 0a 2a 2a 20 6f 66 20 61 20 33 32 2d 62 69 74  s.** of a 32-bit
53a0: 20 63 68 65 63 6b 73 75 6d 20 6f 6e 20 65 61 63   checksum on eac
53b0: 68 20 70 61 67 65 20 6f 66 20 64 61 74 61 2e 20  h page of data. 
53c0: 20 54 68 65 20 63 68 65 63 6b 73 75 6d 20 63 6f   The checksum co
53d0: 76 65 72 73 20 62 6f 74 68 0a 2a 2a 20 74 68 65  vers both.** the
53e0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64   page number and
53f0: 20 74 68 65 20 70 50 61 67 65 72 2d 3e 70 61 67   the pPager->pag
5400: 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64  eSize bytes of d
5410: 61 74 61 20 66 6f 72 20 74 68 65 20 70 61 67 65  ata for the page
5420: 2e 0a 2a 2a 20 54 68 69 73 20 63 6b 73 75 6d 20  ..** This cksum 
5430: 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  is initialized t
5440: 6f 20 61 20 33 32 2d 62 69 74 20 72 61 6e 64 6f  o a 32-bit rando
5450: 6d 20 76 61 6c 75 65 20 74 68 61 74 20 61 70 70  m value that app
5460: 65 61 72 73 20 69 6e 20 74 68 65 0a 2a 2a 20 6a  ears in the.** j
5470: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 72 69 67 68  ournal file righ
5480: 74 20 61 66 74 65 72 20 74 68 65 20 68 65 61 64  t after the head
5490: 65 72 2e 20 20 54 68 65 20 72 61 6e 64 6f 6d 20  er.  The random 
54a0: 69 6e 69 74 69 61 6c 69 7a 65 72 20 69 73 20 69  initializer is i
54b0: 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20 62 65 63  mportant,.** bec
54c0: 61 75 73 65 20 67 61 72 62 61 67 65 20 64 61 74  ause garbage dat
54d0: 61 20 74 68 61 74 20 61 70 70 65 61 72 73 20 61  a that appears a
54e0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 6a  t the end of a j
54f0: 6f 75 72 6e 61 6c 20 69 73 20 6c 69 6b 65 6c 79  ournal is likely
5500: 0a 2a 2a 20 64 61 74 61 20 74 68 61 74 20 77 61  .** data that wa
5510: 73 20 6f 6e 63 65 20 69 6e 20 6f 74 68 65 72 20  s once in other 
5520: 66 69 6c 65 73 20 74 68 61 74 20 68 61 76 65 20  files that have 
5530: 6e 6f 77 20 62 65 65 6e 20 64 65 6c 65 74 65 64  now been deleted
5540: 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 67 61 72  .  If the.** gar
5550: 62 61 67 65 20 64 61 74 61 20 63 61 6d 65 20 66  bage data came f
5560: 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65 74 65 20  rom an obsolete 
5570: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68  journal file, th
5580: 65 20 63 68 65 63 6b 73 75 6d 73 20 6d 69 67 68  e checksums migh
5590: 74 0a 2a 2a 20 62 65 20 63 6f 72 72 65 63 74 2e  t.** be correct.
55a0: 20 20 42 75 74 20 62 79 20 69 6e 69 74 69 61 6c    But by initial
55b0: 69 7a 69 6e 67 20 74 68 65 20 63 68 65 63 6b 73  izing the checks
55c0: 75 6d 20 74 6f 20 72 61 6e 64 6f 6d 20 76 61 6c  um to random val
55d0: 75 65 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 64  ue which.** is d
55e0: 69 66 66 65 72 65 6e 74 20 66 6f 72 20 65 76 65  ifferent for eve
55f0: 72 79 20 6a 6f 75 72 6e 61 6c 2c 20 77 65 20 6d  ry journal, we m
5600: 69 6e 69 6d 69 7a 65 20 74 68 61 74 20 72 69 73  inimize that ris
5610: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  k..*/.static con
5620: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
5630: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d   aJournalMagic[]
5640: 20 3d 20 7b 0a 20 20 30 78 64 39 2c 20 30 78 64   = {.  0xd9, 0xd
5650: 35 2c 20 30 78 30 35 2c 20 30 78 66 39 2c 20 30  5, 0x05, 0xf9, 0
5660: 78 32 30 2c 20 30 78 61 31 2c 20 30 78 36 33 2c  x20, 0xa1, 0x63,
5670: 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a   0xd7,.};../*.**
5680: 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   The size of the
5690: 20 6f 66 20 65 61 63 68 20 70 61 67 65 20 72 65   of each page re
56a0: 63 6f 72 64 20 69 6e 20 74 68 65 20 6a 6f 75 72  cord in the jour
56b0: 6e 61 6c 20 69 73 20 67 69 76 65 6e 20 62 79 0a  nal is given by.
56c0: 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** the following
56d0: 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 64 65 66 69   macro..*/.#defi
56e0: 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a  ne JOURNAL_PG_SZ
56f0: 28 70 50 61 67 65 72 29 20 20 28 28 70 50 61 67  (pPager)  ((pPag
5700: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 2b 20  er->pageSize) + 
5710: 38 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f  8)../*.** The jo
5720: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 69 7a  urnal header siz
5730: 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72  e for this pager
5740: 2e 20 54 68 69 73 20 69 73 20 75 73 75 61 6c 6c  . This is usuall
5750: 79 20 74 68 65 20 73 61 6d 65 20 0a 2a 2a 20 73  y the same .** s
5760: 69 7a 65 20 61 73 20 61 20 73 69 6e 67 6c 65 20  ize as a single 
5770: 64 69 73 6b 20 73 65 63 74 6f 72 2e 20 53 65 65  disk sector. See
5780: 20 61 6c 73 6f 20 73 65 74 53 65 63 74 6f 72 53   also setSectorS
5790: 69 7a 65 28 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e  ize()..*/.#defin
57a0: 65 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  e JOURNAL_HDR_SZ
57b0: 28 70 50 61 67 65 72 29 20 28 70 50 61 67 65 72  (pPager) (pPager
57c0: 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 0a 0a 2f  ->sectorSize)../
57d0: 2a 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20 4d  *.** The macro M
57e0: 45 4d 44 42 20 69 73 20 74 72 75 65 20 69 66 20  EMDB is true if 
57f0: 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77  we are dealing w
5800: 69 74 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  ith an in-memory
5810: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 57 65   database..** We
5820: 20 64 6f 20 74 68 69 73 20 61 73 20 61 20 6d 61   do this as a ma
5830: 63 72 6f 20 73 6f 20 74 68 61 74 20 69 66 20 74  cro so that if t
5840: 68 65 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  he SQLITE_OMIT_M
5850: 45 4d 4f 52 59 44 42 20 6d 61 63 72 6f 20 69 73  EMORYDB macro is
5860: 20 73 65 74 2c 0a 2a 2a 20 74 68 65 20 76 61 6c   set,.** the val
5870: 75 65 20 6f 66 20 4d 45 4d 44 42 20 77 69 6c 6c  ue of MEMDB will
5880: 20 62 65 20 61 20 63 6f 6e 73 74 61 6e 74 20 61   be a constant a
5890: 6e 64 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20  nd the compiler 
58a0: 77 69 6c 6c 20 6f 70 74 69 6d 69 7a 65 0a 2a 2a  will optimize.**
58b0: 20 6f 75 74 20 63 6f 64 65 20 74 68 61 74 20 77   out code that w
58c0: 6f 75 6c 64 20 6e 65 76 65 72 20 65 78 65 63 75  ould never execu
58d0: 74 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  te..*/.#ifdef SQ
58e0: 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59  LITE_OMIT_MEMORY
58f0: 44 42 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44  DB.# define MEMD
5900: 42 20 30 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  B 0.#else.# defi
5910: 6e 65 20 4d 45 4d 44 42 20 70 50 61 67 65 72 2d  ne MEMDB pPager-
5920: 3e 6d 65 6d 44 62 0a 23 65 6e 64 69 66 0a 0a 2f  >memDb.#endif../
5930: 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d  *.** The maximum
5940: 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75 6d 62   legal page numb
5950: 65 72 20 69 73 20 28 32 5e 33 31 20 2d 20 31 29  er is (2^31 - 1)
5960: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47  ..*/.#define PAG
5970: 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 32 31 34 37  ER_MAX_PGNO 2147
5980: 34 38 33 36 34 37 0a 0a 23 69 66 6e 64 65 66 20  483647..#ifndef 
5990: 4e 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20 55 73  NDEBUG ./*.** Us
59a0: 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73  age:.**.**   ass
59b0: 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
59c0: 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
59d0: 29 3b 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  );.*/.static int
59e0: 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
59f0: 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ate(Pager *pPage
5a00: 72 29 7b 0a 0a 20 20 2f 2a 20 41 20 74 65 6d 70  r){..  /* A temp
5a10: 2d 66 69 6c 65 20 69 73 20 61 6c 77 61 79 73 20  -file is always 
5a20: 69 6e 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49  in PAGER_EXCLUSI
5a30: 56 45 20 6f 72 20 50 41 47 45 52 5f 53 59 4e 43  VE or PAGER_SYNC
5a40: 45 44 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 61  ED state. */.  a
5a50: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 74  ssert( pPager->t
5a60: 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20 70 50  empFile==0 || pP
5a70: 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
5a80: 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a  ER_EXCLUSIVE );.
5a90: 0a 20 20 2f 2a 20 54 68 65 20 63 68 61 6e 67 65  .  /* The change
5aa0: 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 69  CountDone flag i
5ab0: 73 20 61 6c 77 61 79 73 20 73 65 74 20 66 6f 72  s always set for
5ac0: 20 74 65 6d 70 2d 66 69 6c 65 73 20 2a 2f 0a 20   temp-files */. 
5ad0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
5ae0: 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20  >tempFile==0 || 
5af0: 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
5b00: 75 6e 74 44 6f 6e 65 20 29 3b 0a 0a 20 20 72 65  untDone );..  re
5b10: 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66  turn 1;.}.#endif
5b20: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
5b30: 72 75 65 20 69 66 20 69 74 20 69 73 20 6e 65 63  rue if it is nec
5b40: 65 73 73 61 72 79 20 74 6f 20 77 72 69 74 65 20  essary to write 
5b50: 70 61 67 65 20 2a 70 50 67 20 69 6e 74 6f 20 74  page *pPg into t
5b60: 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a  he sub-journal..
5b70: 2a 2a 20 41 20 70 61 67 65 20 6e 65 65 64 73 20  ** A page needs 
5b80: 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e  to be written in
5b90: 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  to the sub-journ
5ba0: 61 6c 20 69 66 20 74 68 65 72 65 20 65 78 69 73  al if there exis
5bb0: 74 73 20 6f 6e 65 0a 2a 2a 20 6f 72 20 6d 6f 72  ts one.** or mor
5bc0: 65 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74  e open savepoint
5bd0: 73 20 66 6f 72 20 77 68 69 63 68 3a 0a 2a 2a 0a  s for which:.**.
5be0: 2a 2a 20 20 20 2a 20 54 68 65 20 70 61 67 65 2d  **   * The page-
5bf0: 6e 75 6d 62 65 72 20 69 73 20 6c 65 73 73 20 74  number is less t
5c00: 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
5c10: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 6e  PagerSavepoint.n
5c20: 4f 72 69 67 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a  Orig, and.**   *
5c30: 20 54 68 65 20 62 69 74 20 63 6f 72 72 65 73 70   The bit corresp
5c40: 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 70 61  onding to the pa
5c50: 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 6e 6f 74  ge-number is not
5c60: 20 73 65 74 20 69 6e 0a 2a 2a 20 20 20 20 20 50   set in.**     P
5c70: 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49  agerSavepoint.pI
5c80: 6e 53 61 76 65 70 6f 69 6e 74 2e 0a 2a 2f 0a 73  nSavepoint..*/.s
5c90: 74 61 74 69 63 20 69 6e 74 20 73 75 62 6a 52 65  tatic int subjRe
5ca0: 71 75 69 72 65 73 50 61 67 65 28 50 67 48 64 72  quiresPage(PgHdr
5cb0: 20 2a 70 50 67 29 7b 0a 20 20 50 67 6e 6f 20 70   *pPg){.  Pgno p
5cc0: 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b  gno = pPg->pgno;
5cd0: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
5ce0: 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
5cf0: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
5d00: 3d 30 3b 20 69 3c 70 50 61 67 65 72 2d 3e 6e 53  =0; i<pPager->nS
5d10: 61 76 65 70 6f 69 6e 74 3b 20 69 2b 2b 29 7b 0a  avepoint; i++){.
5d20: 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69      PagerSavepoi
5d30: 6e 74 20 2a 70 20 3d 20 26 70 50 61 67 65 72 2d  nt *p = &pPager-
5d40: 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 5d 3b 0a  >aSavepoint[i];.
5d50: 20 20 20 20 69 66 28 20 70 2d 3e 6e 4f 72 69 67      if( p->nOrig
5d60: 3e 3d 70 67 6e 6f 20 26 26 20 30 3d 3d 73 71 6c  >=pgno && 0==sql
5d70: 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
5d80: 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2c 20  ->pInSavepoint, 
5d90: 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 72  pgno) ){.      r
5da0: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
5db0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
5dc0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
5dd0: 72 75 65 20 69 66 20 74 68 65 20 70 61 67 65 20  rue if the page 
5de0: 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  is already in th
5df0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  e journal file..
5e00: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
5e10: 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 50 67 48 64  geInJournal(PgHd
5e20: 72 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72  r *pPg){.  retur
5e30: 6e 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 54  n sqlite3BitvecT
5e40: 65 73 74 28 70 50 67 2d 3e 70 50 61 67 65 72 2d  est(pPg->pPager-
5e50: 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67  >pInJournal, pPg
5e60: 2d 3e 70 67 6e 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ->pgno);.}../*.*
5e70: 2a 20 52 65 61 64 20 61 20 33 32 2d 62 69 74 20  * Read a 32-bit 
5e80: 69 6e 74 65 67 65 72 20 66 72 6f 6d 20 74 68 65  integer from the
5e90: 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63   given file desc
5ea0: 72 69 70 74 6f 72 2e 20 20 53 74 6f 72 65 20 74  riptor.  Store t
5eb0: 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 74 68  he integer.** th
5ec0: 61 74 20 69 73 20 72 65 61 64 20 69 6e 20 2a 70  at is read in *p
5ed0: 52 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  Res.  Return SQL
5ee0: 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74  ITE_OK if everyt
5ef0: 68 69 6e 67 20 77 6f 72 6b 65 64 2c 20 6f 72 20  hing worked, or 
5f00: 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65  an.** error code
5f10: 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f   is something go
5f20: 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20  es wrong..**.** 
5f30: 41 6c 6c 20 76 61 6c 75 65 73 20 61 72 65 20 73  All values are s
5f40: 74 6f 72 65 64 20 6f 6e 20 64 69 73 6b 20 61 73  tored on disk as
5f50: 20 62 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f 0a   big-endian..*/.
5f60: 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 33  static int read3
5f70: 32 62 69 74 73 28 73 71 6c 69 74 65 33 5f 66 69  2bits(sqlite3_fi
5f80: 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f 66 66 73  le *fd, i64 offs
5f90: 65 74 2c 20 75 33 32 20 2a 70 52 65 73 29 7b 0a  et, u32 *pRes){.
5fa0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
5fb0: 61 63 5b 34 5d 3b 0a 20 20 69 6e 74 20 72 63 20  ac[4];.  int rc 
5fc0: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
5fd0: 66 64 2c 20 61 63 2c 20 73 69 7a 65 6f 66 28 61  fd, ac, sizeof(a
5fe0: 63 29 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 69  c), offset);.  i
5ff0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
6000: 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20   ){.    *pRes = 
6010: 73 71 6c 69 74 65 33 47 65 74 34 62 79 74 65 28  sqlite3Get4byte(
6020: 61 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ac);.  }.  retur
6030: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  n rc;.}../*.** W
6040: 72 69 74 65 20 61 20 33 32 2d 62 69 74 20 69 6e  rite a 32-bit in
6050: 74 65 67 65 72 20 69 6e 74 6f 20 61 20 73 74 72  teger into a str
6060: 69 6e 67 20 62 75 66 66 65 72 20 69 6e 20 62 69  ing buffer in bi
6070: 67 2d 65 6e 64 69 61 6e 20 62 79 74 65 20 6f 72  g-endian byte or
6080: 64 65 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  der..*/.#define 
6090: 70 75 74 33 32 62 69 74 73 28 41 2c 42 29 20 20  put32bits(A,B)  
60a0: 73 71 6c 69 74 65 33 50 75 74 34 62 79 74 65 28  sqlite3Put4byte(
60b0: 28 75 38 2a 29 41 2c 42 29 0a 0a 2f 2a 0a 2a 2a  (u8*)A,B)../*.**
60c0: 20 57 72 69 74 65 20 61 20 33 32 2d 62 69 74 20   Write a 32-bit 
60d0: 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 74 68 65  integer into the
60e0: 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63   given file desc
60f0: 72 69 70 74 6f 72 2e 20 20 52 65 74 75 72 6e 20  riptor.  Return 
6100: 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20  SQLITE_OK.** on 
6110: 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72  success or an er
6120: 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65  ror code is some
6130: 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
6140: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
6150: 77 72 69 74 65 33 32 62 69 74 73 28 73 71 6c 69  write32bits(sqli
6160: 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36  te3_file *fd, i6
6170: 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20 76 61  4 offset, u32 va
6180: 6c 29 7b 0a 20 20 63 68 61 72 20 61 63 5b 34 5d  l){.  char ac[4]
6190: 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 61 63  ;.  put32bits(ac
61a0: 2c 20 76 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e  , val);.  return
61b0: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
61c0: 66 64 2c 20 61 63 2c 20 34 2c 20 6f 66 66 73 65  fd, ac, 4, offse
61d0: 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  t);.}../*.** The
61e0: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
61f0: 73 20 6d 61 63 72 6f 20 69 73 20 61 20 66 69 6c  s macro is a fil
6200: 65 20 64 65 73 63 72 69 70 74 6f 72 20 28 74 79  e descriptor (ty
6210: 70 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  pe sqlite3_file*
6220: 29 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 69  )..** Return 0 i
6230: 66 20 69 74 20 69 73 20 6e 6f 74 20 6f 70 65 6e  f it is not open
6240: 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20 28 62  , or non-zero (b
6250: 75 74 20 6e 6f 74 20 31 29 20 69 66 20 69 74 20  ut not 1) if it 
6260: 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  is..**.** This i
6270: 73 20 73 6f 20 74 68 61 74 20 65 78 70 72 65 73  s so that expres
6280: 73 69 6f 6e 73 20 63 61 6e 20 62 65 20 77 72 69  sions can be wri
6290: 74 74 65 6e 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20  tten as:.**.**  
62a0: 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
62b0: 65 72 2d 3e 6a 66 64 29 20 29 7b 20 2e 2e 2e 0a  er->jfd) ){ ....
62c0: 2a 2a 0a 2a 2a 20 69 6e 73 74 65 61 64 20 6f 66  **.** instead of
62d0: 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 70 50 61  .**.**   if( pPa
62e0: 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65 74 68 6f  ger->jfd->pMetho
62f0: 64 73 20 29 7b 20 2e 2e 2e 0a 2a 2f 0a 23 64 65  ds ){ ....*/.#de
6300: 66 69 6e 65 20 69 73 4f 70 65 6e 28 70 46 64 29  fine isOpen(pFd)
6310: 20 28 28 70 46 64 29 2d 3e 70 4d 65 74 68 6f 64   ((pFd)->pMethod
6320: 73 29 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 66 69 6c  s)../*.** If fil
6330: 65 20 70 46 64 20 69 73 20 6f 70 65 6e 2c 20 63  e pFd is open, c
6340: 61 6c 6c 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c  all sqlite3OsUnl
6350: 6f 63 6b 28 29 20 6f 6e 20 69 74 2e 0a 2a 2f 0a  ock() on it..*/.
6360: 73 74 61 74 69 63 20 69 6e 74 20 6f 73 55 6e 6c  static int osUnl
6370: 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
6380: 20 2a 70 46 64 2c 20 69 6e 74 20 65 4c 6f 63 6b   *pFd, int eLock
6390: 29 7b 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e  ){.  if( !isOpen
63a0: 28 70 46 64 29 20 29 7b 0a 20 20 20 20 72 65 74  (pFd) ){.    ret
63b0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
63c0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69   }.  return sqli
63d0: 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 46 64 2c  te3OsUnlock(pFd,
63e0: 20 65 4c 6f 63 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   eLock);.}../*.*
63f0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
6400: 64 65 74 65 72 6d 69 6e 65 73 20 77 68 65 74 68  determines wheth
6410: 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 61 74  er or not the at
6420: 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d  omic-write optim
6430: 69 7a 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62  ization.** can b
6440: 65 20 75 73 65 64 20 77 69 74 68 20 74 68 69 73  e used with this
6450: 20 70 61 67 65 72 2e 20 54 68 65 20 6f 70 74 69   pager. The opti
6460: 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65 20  mization can be 
6470: 75 73 65 64 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20  used if:.**.**  
6480: 28 61 29 20 74 68 65 20 76 61 6c 75 65 20 72 65  (a) the value re
6490: 74 75 72 6e 65 64 20 62 79 20 4f 73 44 65 76 69  turned by OsDevi
64a0: 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
64b0: 73 28 29 20 69 6e 64 69 63 61 74 65 73 20 74 68  s() indicates th
64c0: 61 74 0a 2a 2a 20 20 20 20 20 20 61 20 64 61 74  at.**      a dat
64d0: 61 62 61 73 65 20 70 61 67 65 20 6d 61 79 20 62  abase page may b
64e0: 65 20 77 72 69 74 74 65 6e 20 61 74 6f 6d 69 63  e written atomic
64f0: 61 6c 6c 79 2c 20 61 6e 64 0a 2a 2a 20 20 28 62  ally, and.**  (b
6500: 29 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75  ) the value retu
6510: 72 6e 65 64 20 62 79 20 4f 73 53 65 63 74 6f 72  rned by OsSector
6520: 53 69 7a 65 28 29 20 69 73 20 6c 65 73 73 20 74  Size() is less t
6530: 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a 20  han or equal.** 
6540: 20 20 20 20 20 74 6f 20 74 68 65 20 70 61 67 65       to the page
6550: 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   size..**.** The
6560: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73   optimization is
6570: 20 61 6c 73 6f 20 61 6c 77 61 79 73 20 65 6e 61   also always ena
6580: 62 6c 65 64 20 66 6f 72 20 74 65 6d 70 6f 72 61  bled for tempora
6590: 72 79 20 66 69 6c 65 73 2e 20 49 74 20 69 73 0a  ry files. It is.
65a0: 2a 2a 20 61 6e 20 65 72 72 6f 72 20 74 6f 20 63  ** an error to c
65b0: 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  all this functio
65c0: 6e 20 69 66 20 70 50 61 67 65 72 20 69 73 20 6f  n if pPager is o
65d0: 70 65 6e 65 64 20 6f 6e 20 61 6e 20 69 6e 2d 6d  pened on an in-m
65e0: 65 6d 6f 72 79 0a 2a 2a 20 64 61 74 61 62 61 73  emory.** databas
65f0: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
6600: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e  optimization can
6610: 6e 6f 74 20 62 65 20 75 73 65 64 2c 20 30 20 69  not be used, 0 i
6620: 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 69  s returned. If i
6630: 74 20 63 61 6e 20 62 65 20 75 73 65 64 2c 0a 2a  t can be used,.*
6640: 2a 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65  * then the value
6650: 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65   returned is the
6660: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   size of the jou
6670: 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 69  rnal file when i
6680: 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 72 6f  t.** contains ro
6690: 6c 6c 62 61 63 6b 20 64 61 74 61 20 66 6f 72 20  llback data for 
66a0: 65 78 61 63 74 6c 79 20 6f 6e 65 20 70 61 67 65  exactly one page
66b0: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
66c0: 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43  TE_ENABLE_ATOMIC
66d0: 5f 57 52 49 54 45 0a 73 74 61 74 69 63 20 69 6e  _WRITE.static in
66e0: 74 20 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65  t jrnlBufferSize
66f0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
6700: 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44  .  assert( !MEMD
6710: 42 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67  B );.  if( !pPag
6720: 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a  er->tempFile ){.
6730: 20 20 20 20 69 6e 74 20 64 63 3b 20 20 20 20 20      int dc;     
6740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6750: 20 20 20 20 20 20 2f 2a 20 44 65 76 69 63 65 20        /* Device 
6760: 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  characteristics 
6770: 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65 63 74  */.    int nSect
6780: 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  or;             
6790: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63 74           /* Sect
67a0: 6f 72 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 69  or size */.    i
67b0: 6e 74 20 73 7a 50 61 67 65 3b 20 20 20 20 20 20  nt szPage;      
67c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
67d0: 20 2f 2a 20 50 61 67 65 20 73 69 7a 65 20 2a 2f   /* Page size */
67e0: 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73  ..    assert( is
67f0: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
6800: 20 29 3b 0a 20 20 20 20 64 63 20 3d 20 73 71 6c   );.    dc = sql
6810: 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
6820: 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67  acteristics(pPag
6830: 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 6e 53 65  er->fd);.    nSe
6840: 63 74 6f 72 20 3d 20 70 50 61 67 65 72 2d 3e 73  ctor = pPager->s
6850: 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20 73  ectorSize;.    s
6860: 7a 50 61 67 65 20 3d 20 70 50 61 67 65 72 2d 3e  zPage = pPager->
6870: 70 61 67 65 53 69 7a 65 3b 0a 0a 20 20 20 20 61  pageSize;..    a
6880: 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43  ssert(SQLITE_IOC
6890: 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35  AP_ATOMIC512==(5
68a0: 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20 61 73 73  12>>8));.    ass
68b0: 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50  ert(SQLITE_IOCAP
68c0: 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35  _ATOMIC64K==(655
68d0: 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20 69 66 28  36>>8));.    if(
68e0: 20 30 3d 3d 28 64 63 26 28 53 51 4c 49 54 45 5f   0==(dc&(SQLITE_
68f0: 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28 73 7a  IOCAP_ATOMIC|(sz
6900: 50 61 67 65 3e 3e 38 29 29 20 7c 7c 20 6e 53 65  Page>>8)) || nSe
6910: 63 74 6f 72 3e 73 7a 50 61 67 65 29 20 29 7b 0a  ctor>szPage) ){.
6920: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
6930: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
6940: 75 72 6e 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  urn JOURNAL_HDR_
6950: 53 5a 28 70 50 61 67 65 72 29 20 2b 20 4a 4f 55  SZ(pPager) + JOU
6960: 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65  RNAL_PG_SZ(pPage
6970: 72 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  r);.}.#endif../*
6980: 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 43 48  .** If SQLITE_CH
6990: 45 43 4b 5f 50 41 47 45 53 20 69 73 20 64 65 66  ECK_PAGES is def
69a0: 69 6e 65 64 20 74 68 65 6e 20 77 65 20 64 6f 20  ined then we do 
69b0: 73 6f 6d 65 20 73 61 6e 69 74 79 20 63 68 65 63  some sanity chec
69c0: 6b 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65 20 63  king.** on the c
69d0: 61 63 68 65 20 75 73 69 6e 67 20 61 20 68 61 73  ache using a has
69e0: 68 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69  h function.  Thi
69f0: 73 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65  s is used for te
6a00: 73 74 69 6e 67 0a 2a 2a 20 61 6e 64 20 64 65 62  sting.** and deb
6a10: 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a  ugging only..*/.
6a20: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48  #ifdef SQLITE_CH
6a30: 45 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a 2a 20  ECK_PAGES./*.** 
6a40: 52 65 74 75 72 6e 20 61 20 33 32 2d 62 69 74 20  Return a 32-bit 
6a50: 68 61 73 68 20 6f 66 20 74 68 65 20 70 61 67 65  hash of the page
6a60: 20 64 61 74 61 20 66 6f 72 20 70 50 61 67 65 2e   data for pPage.
6a70: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70  .*/.static u32 p
6a80: 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 69 6e  ager_datahash(in
6a90: 74 20 6e 42 79 74 65 2c 20 75 6e 73 69 67 6e 65  t nByte, unsigne
6aa0: 64 20 63 68 61 72 20 2a 70 44 61 74 61 29 7b 0a  d char *pData){.
6ab0: 20 20 75 33 32 20 68 61 73 68 20 3d 20 30 3b 0a    u32 hash = 0;.
6ac0: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
6ad0: 3d 30 3b 20 69 3c 6e 42 79 74 65 3b 20 69 2b 2b  =0; i<nByte; i++
6ae0: 29 7b 0a 20 20 20 20 68 61 73 68 20 3d 20 28 68  ){.    hash = (h
6af0: 61 73 68 2a 31 30 33 39 29 20 2b 20 70 44 61 74  ash*1039) + pDat
6b00: 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75  a[i];.  }.  retu
6b10: 72 6e 20 68 61 73 68 3b 0a 7d 0a 73 74 61 74 69  rn hash;.}.stati
6b20: 63 20 75 33 32 20 70 61 67 65 72 5f 70 61 67 65  c u32 pager_page
6b30: 68 61 73 68 28 50 67 48 64 72 20 2a 70 50 61 67  hash(PgHdr *pPag
6b40: 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 61 67  e){.  return pag
6b50: 65 72 5f 64 61 74 61 68 61 73 68 28 70 50 61 67  er_datahash(pPag
6b60: 65 2d 3e 70 50 61 67 65 72 2d 3e 70 61 67 65 53  e->pPager->pageS
6b70: 69 7a 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 63  ize, (unsigned c
6b80: 68 61 72 20 2a 29 70 50 61 67 65 2d 3e 70 44 61  har *)pPage->pDa
6b90: 74 61 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  ta);.}.static vo
6ba0: 69 64 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67  id pager_set_pag
6bb0: 65 68 61 73 68 28 50 67 48 64 72 20 2a 70 50 61  ehash(PgHdr *pPa
6bc0: 67 65 29 7b 0a 20 20 70 50 61 67 65 2d 3e 70 61  ge){.  pPage->pa
6bd0: 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70  geHash = pager_p
6be0: 61 67 65 68 61 73 68 28 70 50 61 67 65 29 3b 0a  agehash(pPage);.
6bf0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 48 45  }../*.** The CHE
6c00: 43 4b 5f 50 41 47 45 20 6d 61 63 72 6f 20 74 61  CK_PAGE macro ta
6c10: 6b 65 73 20 61 20 50 67 48 64 72 2a 20 61 73 20  kes a PgHdr* as 
6c20: 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20  an argument. If 
6c30: 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
6c40: 45 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65 64  ES.** is defined
6c50: 2c 20 61 6e 64 20 4e 44 45 42 55 47 20 69 73 20  , and NDEBUG is 
6c60: 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20 61 6e 20  not defined, an 
6c70: 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
6c80: 6e 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74 68 61  nt checks.** tha
6c90: 74 20 74 68 65 20 70 61 67 65 20 69 73 20 65 69  t the page is ei
6ca0: 74 68 65 72 20 64 69 72 74 79 20 6f 72 20 73 74  ther dirty or st
6cb0: 69 6c 6c 20 6d 61 74 63 68 65 73 20 74 68 65 20  ill matches the 
6cc0: 63 61 6c 63 75 6c 61 74 65 64 20 70 61 67 65 2d  calculated page-
6cd0: 68 61 73 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  hash..*/.#define
6ce0: 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29 20 63   CHECK_PAGE(x) c
6cf0: 68 65 63 6b 50 61 67 65 28 78 29 0a 73 74 61 74  heckPage(x).stat
6d00: 69 63 20 76 6f 69 64 20 63 68 65 63 6b 50 61 67  ic void checkPag
6d10: 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
6d20: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
6d30: 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
6d40: 61 73 73 65 72 74 28 20 21 70 50 67 2d 3e 70 61  assert( !pPg->pa
6d50: 67 65 48 61 73 68 20 7c 7c 20 70 50 61 67 65 72  geHash || pPager
6d60: 2d 3e 65 72 72 43 6f 64 65 0a 20 20 20 20 20 20  ->errCode.      
6d70: 7c 7c 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50  || (pPg->flags&P
6d80: 47 48 44 52 5f 44 49 52 54 59 29 20 7c 7c 20 70  GHDR_DIRTY) || p
6d90: 50 67 2d 3e 70 61 67 65 48 61 73 68 3d 3d 70 61  Pg->pageHash==pa
6da0: 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
6db0: 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64  ) );.}..#else.#d
6dc0: 65 66 69 6e 65 20 70 61 67 65 72 5f 64 61 74 61  efine pager_data
6dd0: 68 61 73 68 28 58 2c 59 29 20 20 30 0a 23 64 65  hash(X,Y)  0.#de
6de0: 66 69 6e 65 20 70 61 67 65 72 5f 70 61 67 65 68  fine pager_pageh
6df0: 61 73 68 28 58 29 20 20 30 0a 23 64 65 66 69 6e  ash(X)  0.#defin
6e00: 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29 0a  e CHECK_PAGE(x).
6e10: 23 65 6e 64 69 66 20 20 2f 2a 20 53 51 4c 49 54  #endif  /* SQLIT
6e20: 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 20 2a 2f  E_CHECK_PAGES */
6e30: 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ../*.** When thi
6e40: 73 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20  s is called the 
6e50: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
6e60: 20 70 61 67 65 72 20 70 50 61 67 65 72 20 6d 75   pager pPager mu
6e70: 73 74 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54  st be open..** T
6e80: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74  his function att
6e90: 65 6d 70 74 73 20 74 6f 20 72 65 61 64 20 61 20  empts to read a 
6ea0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
6eb0: 69 6c 65 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68  ile name from th
6ec0: 65 20 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65  e .** end of the
6ed0: 20 66 69 6c 65 20 61 6e 64 2c 20 69 66 20 73 75   file and, if su
6ee0: 63 63 65 73 73 66 75 6c 2c 20 63 6f 70 69 65 73  ccessful, copies
6ef0: 20 69 74 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20   it into memory 
6f00: 73 75 70 70 6c 69 65 64 20 0a 2a 2a 20 62 79 20  supplied .** by 
6f10: 74 68 65 20 63 61 6c 6c 65 72 2e 20 53 65 65 20  the caller. See 
6f20: 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20 77  comments above w
6f30: 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61  riteMasterJourna
6f40: 6c 28 29 20 66 6f 72 20 74 68 65 20 66 6f 72 6d  l() for the form
6f50: 61 74 0a 2a 2a 20 75 73 65 64 20 74 6f 20 73 74  at.** used to st
6f60: 6f 72 65 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  ore a master jou
6f70: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 61  rnal file name a
6f80: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 6a  t the end of a j
6f90: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a  ournal file..**.
6fa0: 2a 2a 20 7a 4d 61 73 74 65 72 20 6d 75 73 74 20  ** zMaster must 
6fb0: 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65  point to a buffe
6fc0: 72 20 6f 66 20 61 74 20 6c 65 61 73 74 20 6e 4d  r of at least nM
6fd0: 61 73 74 65 72 20 62 79 74 65 73 20 61 6c 6c 6f  aster bytes allo
6fe0: 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68 65 20  cated by.** the 
6ff0: 63 61 6c 6c 65 72 2e 20 54 68 69 73 20 73 68 6f  caller. This sho
7000: 75 6c 64 20 62 65 20 73 71 6c 69 74 65 33 5f 76  uld be sqlite3_v
7010: 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 20  fs.mxPathname+1 
7020: 28 74 6f 20 65 6e 73 75 72 65 20 74 68 65 72 65  (to ensure there
7030: 20 69 73 0a 2a 2a 20 65 6e 6f 75 67 68 20 73 70   is.** enough sp
7040: 61 63 65 20 74 6f 20 77 72 69 74 65 20 74 68 65  ace to write the
7050: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
7060: 6e 61 6d 65 29 2e 20 49 66 20 74 68 65 20 6d 61  name). If the ma
7070: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  ster journal.** 
7080: 6e 61 6d 65 20 69 6e 20 74 68 65 20 6a 6f 75 72  name in the jour
7090: 6e 61 6c 20 69 73 20 6c 6f 6e 67 65 72 20 74 68  nal is longer th
70a0: 61 6e 20 6e 4d 61 73 74 65 72 20 62 79 74 65 73  an nMaster bytes
70b0: 20 28 69 6e 63 6c 75 64 69 6e 67 20 61 0a 2a 2a   (including a.**
70c0: 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29   nul-terminator)
70d0: 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73 20 68  , then this is h
70e0: 61 6e 64 6c 65 64 20 61 73 20 69 66 20 6e 6f 20  andled as if no 
70f0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
7100: 61 6d 65 0a 2a 2a 20 77 65 72 65 20 70 72 65 73  ame.** were pres
7110: 65 6e 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ent in the journ
7120: 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d  al..**.** If a m
7130: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
7140: 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65  le name is prese
7150: 6e 74 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  nt at the end of
7160: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   the journal.** 
7170: 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 69 73  file, then it is
7180: 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65   copied into the
7190: 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20   buffer pointed 
71a0: 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 2e 20 41  to by zMaster. A
71b0: 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74  .** nul-terminat
71c0: 6f 72 20 62 79 74 65 20 69 73 20 61 70 70 65 6e  or byte is appen
71d0: 64 65 64 20 74 6f 20 74 68 65 20 62 75 66 66 65  ded to the buffe
71e0: 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  r following the 
71f0: 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61  master.** journa
7200: 6c 20 66 69 6c 65 20 6e 61 6d 65 2e 0a 2a 2a 0a  l file name..**.
7210: 2a 2a 20 49 66 20 69 74 20 69 73 20 64 65 74 65  ** If it is dete
7220: 72 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f 20 6d  rmined that no m
7230: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
7240: 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65  le name is prese
7250: 6e 74 20 0a 2a 2a 20 7a 4d 61 73 74 65 72 5b 30  nt .** zMaster[0
7260: 5d 20 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e  ] is set to 0 an
7270: 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
7280: 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  rned..**.** If a
7290: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  n error occurs w
72a0: 68 69 6c 65 20 72 65 61 64 69 6e 67 20 66 72 6f  hile reading fro
72b0: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  m the journal fi
72c0: 6c 65 2c 20 61 6e 20 53 51 4c 69 74 65 0a 2a 2a  le, an SQLite.**
72d0: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
72e0: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
72f0: 69 63 20 69 6e 74 20 72 65 61 64 4d 61 73 74 65  ic int readMaste
7300: 72 4a 6f 75 72 6e 61 6c 28 73 71 6c 69 74 65 33  rJournal(sqlite3
7310: 5f 66 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20 63 68  _file *pJrnl, ch
7320: 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20 75 33 32  ar *zMaster, u32
7330: 20 6e 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74   nMaster){.  int
7340: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
7350: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
7360: 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 33 32 20  n code */.  u32 
7370: 6c 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  len;            
7380: 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68         /* Length
7390: 20 69 6e 20 62 79 74 65 73 20 6f 66 20 6d 61 73   in bytes of mas
73a0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
73b0: 20 2a 2f 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20   */.  i64 szJ;  
73c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73d0: 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 69   /* Total size i
73e0: 6e 20 62 79 74 65 73 20 6f 66 20 6a 6f 75 72 6e  n bytes of journ
73f0: 61 6c 20 66 69 6c 65 20 70 4a 72 6e 6c 20 2a 2f  al file pJrnl */
7400: 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20  .  u32 cksum;   
7410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7420: 20 4d 4a 20 63 68 65 63 6b 73 75 6d 20 76 61 6c   MJ checksum val
7430: 75 65 20 72 65 61 64 20 66 72 6f 6d 20 6a 6f 75  ue read from jou
7440: 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 75 3b  rnal */.  u32 u;
7450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7460: 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64       /* Unsigned
7470: 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   loop counter */
7480: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
7490: 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20 20 2f 2a   aMagic[8];   /*
74a0: 20 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c   A buffer to hol
74b0: 64 20 74 68 65 20 6d 61 67 69 63 20 68 65 61 64  d the magic head
74c0: 65 72 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 5b  er */.  zMaster[
74d0: 30 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 69 66  0] = '\0';..  if
74e0: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  ( SQLITE_OK!=(rc
74f0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
7500: 53 69 7a 65 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a  Size(pJrnl, &szJ
7510: 29 29 0a 20 20 20 7c 7c 20 73 7a 4a 3c 31 36 0a  )).   || szJ<16.
7520: 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21     || SQLITE_OK!
7530: 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74  =(rc = read32bit
7540: 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2c  s(pJrnl, szJ-16,
7550: 20 26 6c 65 6e 29 29 0a 20 20 20 7c 7c 20 6c 65   &len)).   || le
7560: 6e 3e 3d 6e 4d 61 73 74 65 72 20 0a 20 20 20 7c  n>=nMaster .   |
7570: 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  | SQLITE_OK!=(rc
7580: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 4a   = read32bits(pJ
7590: 72 6e 6c 2c 20 73 7a 4a 2d 31 32 2c 20 26 63 6b  rnl, szJ-12, &ck
75a0: 73 75 6d 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49  sum)).   || SQLI
75b0: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c  TE_OK!=(rc = sql
75c0: 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c  ite3OsRead(pJrnl
75d0: 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 73 7a 4a  , aMagic, 8, szJ
75e0: 2d 38 29 29 0a 20 20 20 7c 7c 20 6d 65 6d 63 6d  -8)).   || memcm
75f0: 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e  p(aMagic, aJourn
7600: 61 6c 4d 61 67 69 63 2c 20 38 29 0a 20 20 20 7c  alMagic, 8).   |
7610: 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  | SQLITE_OK!=(rc
7620: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
7630: 28 70 4a 72 6e 6c 2c 20 7a 4d 61 73 74 65 72 2c  (pJrnl, zMaster,
7640: 20 6c 65 6e 2c 20 73 7a 4a 2d 31 36 2d 6c 65 6e   len, szJ-16-len
7650: 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  )).  ){.    retu
7660: 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rn rc;.  }..  /*
7670: 20 53 65 65 20 69 66 20 74 68 65 20 63 68 65 63   See if the chec
7680: 6b 73 75 6d 20 6d 61 74 63 68 65 73 20 74 68 65  ksum matches the
7690: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
76a0: 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f 72 28 75 3d  name */.  for(u=
76b0: 30 3b 20 75 3c 6c 65 6e 3b 20 75 2b 2b 29 7b 0a  0; u<len; u++){.
76c0: 20 20 20 20 63 6b 73 75 6d 20 2d 3d 20 7a 4d 61      cksum -= zMa
76d0: 73 74 65 72 5b 75 5d 3b 0a 20 20 7d 0a 20 20 69  ster[u];.  }.  i
76e0: 66 28 20 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20  f( cksum ){.    
76f0: 2f 2a 20 49 66 20 74 68 65 20 63 68 65 63 6b 73  /* If the checks
7700: 75 6d 20 64 6f 65 73 6e 27 74 20 61 64 64 20 75  um doesn't add u
7710: 70 2c 20 74 68 65 6e 20 6f 6e 65 20 6f 72 20 6d  p, then one or m
7720: 6f 72 65 20 6f 66 20 74 68 65 20 64 69 73 6b 20  ore of the disk 
7730: 73 65 63 74 6f 72 73 0a 20 20 20 20 2a 2a 20 63  sectors.    ** c
7740: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6d 61  ontaining the ma
7750: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
7760: 65 6e 61 6d 65 20 69 73 20 63 6f 72 72 75 70 74  ename is corrupt
7770: 65 64 2e 20 54 68 69 73 20 6d 65 61 6e 73 0a 20  ed. This means. 
7780: 20 20 20 2a 2a 20 64 65 66 69 6e 69 74 65 6c 79     ** definitely
7790: 20 72 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f 20 6a   roll back, so j
77a0: 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ust return SQLIT
77b0: 45 5f 4f 4b 20 61 6e 64 20 72 65 70 6f 72 74 20  E_OK and report 
77c0: 61 20 28 6e 75 6c 29 0a 20 20 20 20 2a 2a 20 6d  a (nul).    ** m
77d0: 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69  aster-journal fi
77e0: 6c 65 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20  lename..    */. 
77f0: 20 20 20 6c 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a     len = 0;.  }.
7800: 20 20 7a 4d 61 73 74 65 72 5b 6c 65 6e 5d 20 3d    zMaster[len] =
7810: 20 27 5c 30 27 3b 0a 20 20 20 0a 20 20 72 65 74   '\0';.   .  ret
7820: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
7830: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
7840: 68 65 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65  he offset of the
7850: 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79   sector boundary
7860: 20 61 74 20 6f 72 20 69 6d 6d 65 64 69 61 74 65   at or immediate
7870: 6c 79 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67  ly .** following
7880: 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 70 50   the value in pP
7890: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
78a0: 2c 20 61 73 73 75 6d 69 6e 67 20 61 20 73 65 63  , assuming a sec
78b0: 74 6f 72 20 0a 2a 2a 20 73 69 7a 65 20 6f 66 20  tor .** size of 
78c0: 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
78d0: 7a 65 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  ze bytes..**.** 
78e0: 69 2e 65 20 66 6f 72 20 61 20 73 65 63 74 6f 72  i.e for a sector
78f0: 20 73 69 7a 65 20 6f 66 20 35 31 32 3a 0a 2a 2a   size of 512:.**
7900: 0a 2a 2a 20 20 20 50 61 67 65 72 2e 6a 6f 75 72  .**   Pager.jour
7910: 6e 61 6c 4f 66 66 20 20 20 20 20 20 20 20 20 20  nalOff          
7920: 52 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20  Return value.** 
7930: 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
7940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 30  ---------.**   0
7960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7970: 20 20 20 20 20 20 20 20 20 30 0a 2a 2a 20 20 20           0.**   
7980: 35 31 32 20 20 20 20 20 20 20 20 20 20 20 20 20  512             
7990: 20 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a            512.**
79a0: 20 20 20 31 30 30 20 20 20 20 20 20 20 20 20 20     100          
79b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 35 31 32               512
79c0: 0a 2a 2a 20 20 20 32 30 30 30 20 20 20 20 20 20  .**   2000      
79d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
79e0: 32 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74  2048.** .*/.stat
79f0: 69 63 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64  ic i64 journalHd
7a00: 72 4f 66 66 73 65 74 28 50 61 67 65 72 20 2a 70  rOffset(Pager *p
7a10: 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20 6f 66  Pager){.  i64 of
7a20: 66 73 65 74 20 3d 20 30 3b 0a 20 20 69 36 34 20  fset = 0;.  i64 
7a30: 63 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  c = pPager->jour
7a40: 6e 61 6c 4f 66 66 3b 0a 20 20 69 66 28 20 63 20  nalOff;.  if( c 
7a50: 29 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20  ){.    offset = 
7a60: 28 28 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48  ((c-1)/JOURNAL_H
7a70: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20  DR_SZ(pPager) + 
7a80: 31 29 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  1) * JOURNAL_HDR
7a90: 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  _SZ(pPager);.  }
7aa0: 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65  .  assert( offse
7ab0: 74 25 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  t%JOURNAL_HDR_SZ
7ac0: 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20  (pPager)==0 );. 
7ad0: 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e   assert( offset>
7ae0: 3d 63 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =c );.  assert( 
7af0: 28 6f 66 66 73 65 74 2d 63 29 3c 4a 4f 55 52 4e  (offset-c)<JOURN
7b00: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
7b10: 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 6f 66  ) );.  return of
7b20: 66 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  fset;.}../*.** T
7b30: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
7b40: 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65  must be open whe
7b50: 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
7b60: 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  is called..**.**
7b70: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
7b80: 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65  s a no-op if the
7b90: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
7ba0: 73 20 6e 6f 74 20 62 65 65 6e 20 77 72 69 74 74  s not been writt
7bb0: 65 6e 20 74 6f 0a 2a 2a 20 77 69 74 68 69 6e 20  en to.** within 
7bc0: 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e  the current tran
7bd0: 73 61 63 74 69 6f 6e 20 28 69 2e 65 2e 20 69 66  saction (i.e. if
7be0: 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66   Pager.journalOf
7bf0: 66 3d 3d 30 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  f==0)..**.** If 
7c00: 64 6f 54 72 75 6e 63 61 74 65 20 69 73 20 6e 6f  doTruncate is no
7c10: 6e 2d 7a 65 72 6f 20 6f 72 20 74 68 65 20 50 61  n-zero or the Pa
7c20: 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c  ger.journalSizeL
7c30: 69 6d 69 74 20 76 61 72 69 61 62 6c 65 20 69 73  imit variable is
7c40: 0a 2a 2a 20 73 65 74 20 74 6f 20 30 2c 20 74 68  .** set to 0, th
7c50: 65 6e 20 74 72 75 6e 63 61 74 65 20 74 68 65 20  en truncate the 
7c60: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20  journal file to 
7c70: 7a 65 72 6f 20 62 79 74 65 73 20 69 6e 20 73 69  zero bytes in si
7c80: 7a 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a  ze. Otherwise,.*
7c90: 2a 20 7a 65 72 6f 20 74 68 65 20 32 38 2d 62 79  * zero the 28-by
7ca0: 74 65 20 68 65 61 64 65 72 20 61 74 20 74 68 65  te header at the
7cb0: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f   start of the jo
7cc0: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 6e 20 65  urnal file. In e
7cd0: 69 74 68 65 72 20 63 61 73 65 2c 20 0a 2a 2a 20  ither case, .** 
7ce0: 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  if the pager is 
7cf0: 6e 6f 74 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d  not in no-sync m
7d00: 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f  ode, sync the jo
7d10: 75 72 6e 61 6c 20 66 69 6c 65 20 69 6d 6d 65 64  urnal file immed
7d20: 69 61 74 65 6c 79 20 0a 2a 2a 20 61 66 74 65 72  iately .** after
7d30: 20 77 72 69 74 69 6e 67 20 6f 72 20 74 72 75 6e   writing or trun
7d40: 63 61 74 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a  cating it..**.**
7d50: 20 49 66 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61   If Pager.journa
7d60: 6c 53 69 7a 65 4c 69 6d 69 74 20 69 73 20 73 65  lSizeLimit is se
7d70: 74 20 74 6f 20 61 20 70 6f 73 69 74 69 76 65 2c  t to a positive,
7d80: 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c   non-zero value,
7d90: 20 61 6e 64 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e   and.** followin
7da0: 67 20 74 68 65 20 74 72 75 6e 63 61 74 69 6f 6e  g the truncation
7db0: 20 6f 72 20 7a 65 72 6f 69 6e 67 20 64 65 73 63   or zeroing desc
7dc0: 72 69 62 65 64 20 61 62 6f 76 65 20 74 68 65 20  ribed above the 
7dd0: 73 69 7a 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20  size of the .** 
7de0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20  journal file in 
7df0: 62 79 74 65 73 20 69 73 20 6c 61 72 67 65 72 20  bytes is larger 
7e00: 74 68 61 6e 20 74 68 69 73 20 76 61 6c 75 65 2c  than this value,
7e10: 20 74 68 65 6e 20 74 72 75 6e 63 61 74 65 20 74   then truncate t
7e20: 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  he.** journal fi
7e30: 6c 65 20 74 6f 20 50 61 67 65 72 2e 6a 6f 75 72  le to Pager.jour
7e40: 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 62 79 74  nalSizeLimit byt
7e50: 65 73 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  es. The journal 
7e60: 66 69 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74  file does.** not
7e70: 20 6e 65 65 64 20 74 6f 20 62 65 20 73 79 6e 63   need to be sync
7e80: 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69  ed following thi
7e90: 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a  s operation..**.
7ea0: 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  ** If an IO erro
7eb0: 72 20 6f 63 63 75 72 73 2c 20 61 62 61 6e 64 6f  r occurs, abando
7ec0: 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 64  n processing and
7ed0: 20 72 65 74 75 72 6e 20 74 68 65 20 49 4f 20 65   return the IO e
7ee0: 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 20 4f 74  rror code..** Ot
7ef0: 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20  herwise, return 
7f00: 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74  SQLITE_OK..*/.st
7f10: 61 74 69 63 20 69 6e 74 20 7a 65 72 6f 4a 6f 75  atic int zeroJou
7f20: 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70  rnalHdr(Pager *p
7f30: 50 61 67 65 72 2c 20 69 6e 74 20 64 6f 54 72 75  Pager, int doTru
7f40: 6e 63 61 74 65 29 7b 0a 20 20 69 6e 74 20 72 63  ncate){.  int rc
7f50: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
7f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
7f80: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
7f90: 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
7fa0: 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20  Pager->jfd) );. 
7fb0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
7fc0: 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20 63  rnalOff ){.    c
7fd0: 6f 6e 73 74 20 69 36 34 20 69 4c 69 6d 69 74 20  onst i64 iLimit 
7fe0: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
7ff0: 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20 20 20 2f  lSizeLimit;    /
8000: 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66  * Local cache of
8010: 20 6a 73 6c 20 2a 2f 0a 0a 20 20 20 20 49 4f 54   jsl */..    IOT
8020: 52 41 43 45 28 28 22 4a 5a 45 52 4f 48 44 52 20  RACE(("JZEROHDR 
8030: 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %p\n", pPager)).
8040: 20 20 20 20 69 66 28 20 64 6f 54 72 75 6e 63 61      if( doTrunca
8050: 74 65 20 7c 7c 20 69 4c 69 6d 69 74 3d 3d 30 20  te || iLimit==0 
8060: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
8070: 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
8080: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b  pPager->jfd, 0);
8090: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
80a0: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
80b0: 68 61 72 20 7a 65 72 6f 48 64 72 5b 32 38 5d 20  har zeroHdr[28] 
80c0: 3d 20 7b 30 7d 3b 0a 20 20 20 20 20 20 72 63 20  = {0};.      rc 
80d0: 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
80e0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 65  (pPager->jfd, ze
80f0: 72 6f 48 64 72 2c 20 73 69 7a 65 6f 66 28 7a 65  roHdr, sizeof(ze
8100: 72 6f 48 64 72 29 2c 20 30 29 3b 0a 20 20 20 20  roHdr), 0);.    
8110: 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
8120: 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70 50 61 67  LITE_OK && !pPag
8130: 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20  er->noSync ){.  
8140: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
8150: 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a  OsSync(pPager->j
8160: 66 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  fd, SQLITE_SYNC_
8170: 44 41 54 41 4f 4e 4c 59 7c 70 50 61 67 65 72 2d  DATAONLY|pPager-
8180: 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20  >sync_flags);.  
8190: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74    }..    /* At t
81a0: 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20 74 72  his point the tr
81b0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d  ansaction is com
81c0: 6d 69 74 74 65 64 20 62 75 74 20 74 68 65 20 77  mitted but the w
81d0: 72 69 74 65 20 6c 6f 63 6b 20 0a 20 20 20 20 2a  rite lock .    *
81e0: 2a 20 69 73 20 73 74 69 6c 6c 20 68 65 6c 64 20  * is still held 
81f0: 6f 6e 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20  on the file. If 
8200: 74 68 65 72 65 20 69 73 20 61 20 73 69 7a 65 20  there is a size 
8210: 6c 69 6d 69 74 20 63 6f 6e 66 69 67 75 72 65 64  limit configured
8220: 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20 74 68 65   for .    ** the
8230: 20 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75 72   persistent jour
8240: 6e 61 6c 20 61 6e 64 20 74 68 65 20 6a 6f 75 72  nal and the jour
8250: 6e 61 6c 20 66 69 6c 65 20 63 75 72 72 65 6e 74  nal file current
8260: 6c 79 20 63 6f 6e 73 75 6d 65 73 20 6d 6f 72 65  ly consumes more
8270: 0a 20 20 20 20 2a 2a 20 73 70 61 63 65 20 74 68  .    ** space th
8280: 61 6e 20 74 68 61 74 20 6c 69 6d 69 74 20 61 6c  an that limit al
8290: 6c 6f 77 73 20 66 6f 72 2c 20 74 72 75 6e 63 61  lows for, trunca
82a0: 74 65 20 69 74 20 6e 6f 77 2e 20 54 68 65 72 65  te it now. There
82b0: 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20   is no need.    
82c0: 2a 2a 20 74 6f 20 73 79 6e 63 20 74 68 65 20 66  ** to sync the f
82d0: 69 6c 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  ile following th
82e0: 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 20 20  is operation..  
82f0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d    */.    if( rc=
8300: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4c  =SQLITE_OK && iL
8310: 69 6d 69 74 3e 30 20 29 7b 0a 20 20 20 20 20 20  imit>0 ){.      
8320: 69 36 34 20 73 7a 3b 0a 20 20 20 20 20 20 72 63  i64 sz;.      rc
8330: 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
8340: 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  Size(pPager->jfd
8350: 2c 20 26 73 7a 29 3b 0a 20 20 20 20 20 20 69 66  , &sz);.      if
8360: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
8370: 26 26 20 73 7a 3e 69 4c 69 6d 69 74 20 29 7b 0a  && sz>iLimit ){.
8380: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
8390: 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70  ite3OsTruncate(p
83a0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4c 69 6d  Pager->jfd, iLim
83b0: 69 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  it);.      }.   
83c0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
83d0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  rc;.}../*.** The
83e0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75   journal file mu
83f0: 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20  st be open when 
8400: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
8410: 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61  called. A journa
8420: 6c 0a 2a 2a 20 68 65 61 64 65 72 20 28 4a 4f 55  l.** header (JOU
8430: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65  RNAL_HDR_SZ byte
8440: 73 29 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  s) is written in
8450: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
8460: 69 6c 65 20 61 74 20 74 68 65 0a 2a 2a 20 63 75  ile at the.** cu
8470: 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 0a  rrent location..
8480: 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74  **.** The format
8490: 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c   for the journal
84a0: 20 68 65 61 64 65 72 20 69 73 20 61 73 20 66 6f   header is as fo
84b0: 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20 62 79  llows:.** - 8 by
84c0: 74 65 73 3a 20 4d 61 67 69 63 20 69 64 65 6e 74  tes: Magic ident
84d0: 69 66 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66  ifying journal f
84e0: 6f 72 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20 62 79  ormat..** - 4 by
84f0: 74 65 73 3a 20 4e 75 6d 62 65 72 20 6f 66 20 72  tes: Number of r
8500: 65 63 6f 72 64 73 20 69 6e 20 6a 6f 75 72 6e 61  ecords in journa
8510: 6c 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e 63  l, or -1 no-sync
8520: 20 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a 20   mode is on..** 
8530: 2d 20 34 20 62 79 74 65 73 3a 20 52 61 6e 64 6f  - 4 bytes: Rando
8540: 6d 20 6e 75 6d 62 65 72 20 75 73 65 64 20 66 6f  m number used fo
8550: 72 20 70 61 67 65 20 68 61 73 68 2e 0a 2a 2a 20  r page hash..** 
8560: 2d 20 34 20 62 79 74 65 73 3a 20 49 6e 69 74 69  - 4 bytes: Initi
8570: 61 6c 20 64 61 74 61 62 61 73 65 20 70 61 67 65  al database page
8580: 20 63 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20 62   count..** - 4 b
8590: 79 74 65 73 3a 20 53 65 63 74 6f 72 20 73 69 7a  ytes: Sector siz
85a0: 65 20 75 73 65 64 20 62 79 20 74 68 65 20 70 72  e used by the pr
85b0: 6f 63 65 73 73 20 74 68 61 74 20 77 72 6f 74 65  ocess that wrote
85c0: 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a 2a   this journal..*
85d0: 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 44 61 74  * - 4 bytes: Dat
85e0: 61 62 61 73 65 20 70 61 67 65 20 73 69 7a 65 2e  abase page size.
85f0: 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65 64  .** .** Followed
8600: 20 62 79 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52   by (JOURNAL_HDR
8610: 5f 53 5a 20 2d 20 32 38 29 20 62 79 74 65 73 20  _SZ - 28) bytes 
8620: 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63 65 2e  of unused space.
8630: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
8640: 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 50  riteJournalHdr(P
8650: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
8660: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
8670: 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
8680: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
8690: 6f 64 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ode */.  char *z
86a0: 48 65 61 64 65 72 20 3d 20 70 50 61 67 65 72 2d  Header = pPager-
86b0: 3e 70 54 6d 70 53 70 61 63 65 3b 20 20 2f 2a 20  >pTmpSpace;  /* 
86c0: 54 65 6d 70 6f 72 61 72 79 20 73 70 61 63 65 20  Temporary space 
86d0: 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20 68 65  used to build he
86e0: 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e 48  ader */.  u32 nH
86f0: 65 61 64 65 72 20 3d 20 70 50 61 67 65 72 2d 3e  eader = pPager->
8700: 70 61 67 65 53 69 7a 65 3b 20 20 20 20 20 2f 2a  pageSize;     /*
8710: 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20   Size of buffer 
8720: 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 48  pointed to by zH
8730: 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e  eader */.  u32 n
8740: 57 72 69 74 65 3b 20 20 20 20 20 20 20 20 20 20  Write;          
8750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8760: 2a 20 42 79 74 65 73 20 6f 66 20 68 65 61 64 65  * Bytes of heade
8770: 72 20 73 65 63 74 6f 72 20 77 72 69 74 74 65 6e  r sector written
8780: 20 2a 2f 0a 20 20 69 6e 74 20 69 69 3b 20 20 20   */.  int ii;   
8790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
87a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
87b0: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20  p counter */..  
87c0: 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
87d0: 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20  Pager->jfd) );  
87e0: 20 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66      /* Journal f
87f0: 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ile must be open
8800: 2e 20 2a 2f 0a 0a 20 20 69 66 28 20 6e 48 65 61  . */..  if( nHea
8810: 64 65 72 3e 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  der>JOURNAL_HDR_
8820: 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  SZ(pPager) ){.  
8830: 20 20 6e 48 65 61 64 65 72 20 3d 20 4a 4f 55 52    nHeader = JOUR
8840: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
8850: 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  r);.  }..  /* If
8860: 20 74 68 65 72 65 20 61 72 65 20 61 63 74 69 76   there are activ
8870: 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 6e 64  e savepoints and
8880: 20 61 6e 79 20 6f 66 20 74 68 65 6d 20 77 65 72   any of them wer
8890: 65 20 63 72 65 61 74 65 64 20 0a 20 20 2a 2a 20  e created .  ** 
88a0: 73 69 6e 63 65 20 74 68 65 20 6d 6f 73 74 20 72  since the most r
88b0: 65 63 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 68 65  ecent journal he
88c0: 61 64 65 72 20 77 61 73 20 77 72 69 74 74 65 6e  ader was written
88d0: 2c 20 75 70 64 61 74 65 20 74 68 65 20 0a 20 20  , update the .  
88e0: 2a 2a 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  ** PagerSavepoin
88f0: 74 2e 69 48 64 72 4f 66 66 73 65 74 20 66 69 65  t.iHdrOffset fie
8900: 6c 64 73 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20  lds now..  */.  
8910: 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61  for(ii=0; ii<pPa
8920: 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b  ger->nSavepoint;
8930: 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20   ii++){.    if( 
8940: 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
8950: 6e 74 5b 69 69 5d 2e 69 48 64 72 4f 66 66 73 65  nt[ii].iHdrOffse
8960: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 50  t==0 ){.      pP
8970: 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
8980: 5b 69 69 5d 2e 69 48 64 72 4f 66 66 73 65 74 20  [ii].iHdrOffset 
8990: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
89a0: 6c 4f 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  lOff;.    }.  }.
89b0: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
89c0: 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d 3e  alHdr = pPager->
89d0: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75  journalOff = jou
89e0: 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50  rnalHdrOffset(pP
89f0: 61 67 65 72 29 3b 0a 0a 20 20 2f 2a 20 0a 20 20  ager);..  /* .  
8a00: 2a 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52 65  ** Write the nRe
8a10: 63 20 46 69 65 6c 64 20 2d 20 74 68 65 20 6e 75  c Field - the nu
8a20: 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72 65 63  mber of page rec
8a30: 6f 72 64 73 20 74 68 61 74 20 66 6f 6c 6c 6f 77  ords that follow
8a40: 20 74 68 69 73 0a 20 20 2a 2a 20 6a 6f 75 72 6e   this.  ** journ
8a50: 61 6c 20 68 65 61 64 65 72 2e 20 4e 6f 72 6d 61  al header. Norma
8a60: 6c 6c 79 2c 20 7a 65 72 6f 20 69 73 20 77 72 69  lly, zero is wri
8a70: 74 74 65 6e 20 74 6f 20 74 68 69 73 20 76 61 6c  tten to this val
8a80: 75 65 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e  ue at this time.
8a90: 0a 20 20 2a 2a 20 41 66 74 65 72 20 74 68 65 20  .  ** After the 
8aa0: 72 65 63 6f 72 64 73 20 61 72 65 20 61 64 64 65  records are adde
8ab0: 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d to the journal
8ac0: 20 28 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61   (and the journa
8ad0: 6c 20 73 79 6e 63 65 64 2c 20 0a 20 20 2a 2a 20  l synced, .  ** 
8ae0: 69 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20  if in full-sync 
8af0: 6d 6f 64 65 29 2c 20 74 68 65 20 7a 65 72 6f 20  mode), the zero 
8b00: 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77  is overwritten w
8b10: 69 74 68 20 74 68 65 20 74 72 75 65 20 6e 75 6d  ith the true num
8b20: 62 65 72 0a 20 20 2a 2a 20 6f 66 20 72 65 63 6f  ber.  ** of reco
8b30: 72 64 73 20 28 73 65 65 20 73 79 6e 63 4a 6f 75  rds (see syncJou
8b40: 72 6e 61 6c 28 29 29 2e 0a 20 20 2a 2a 0a 20 20  rnal())..  **.  
8b50: 2a 2a 20 41 20 66 61 73 74 65 72 20 61 6c 74 65  ** A faster alte
8b60: 72 6e 61 74 69 76 65 20 69 73 20 74 6f 20 77 72  rnative is to wr
8b70: 69 74 65 20 30 78 46 46 46 46 46 46 46 46 20 74  ite 0xFFFFFFFF t
8b80: 6f 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  o the nRec field
8b90: 2e 20 57 68 65 6e 0a 20 20 2a 2a 20 72 65 61 64  . When.  ** read
8ba0: 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ing the journal 
8bb0: 74 68 69 73 20 76 61 6c 75 65 20 74 65 6c 6c 73  this value tells
8bc0: 20 53 51 4c 69 74 65 20 74 6f 20 61 73 73 75 6d   SQLite to assum
8bd0: 65 20 74 68 61 74 20 74 68 65 0a 20 20 2a 2a 20  e that the.  ** 
8be0: 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  rest of the jour
8bf0: 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e  nal file contain
8c00: 73 20 76 61 6c 69 64 20 70 61 67 65 20 72 65 63  s valid page rec
8c10: 6f 72 64 73 2e 20 54 68 69 73 20 61 73 73 75 6d  ords. This assum
8c20: 70 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 64 61  ption.  ** is da
8c30: 6e 67 65 72 6f 75 73 2c 20 61 73 20 69 66 20 61  ngerous, as if a
8c40: 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65   failure occurre
8c50: 64 20 77 68 69 6c 73 74 20 77 72 69 74 69 6e 67  d whilst writing
8c60: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   to the journal.
8c70: 20 20 2a 2a 20 66 69 6c 65 20 69 74 20 6d 61 79    ** file it may
8c80: 20 63 6f 6e 74 61 69 6e 20 73 6f 6d 65 20 67 61   contain some ga
8c90: 72 62 61 67 65 20 64 61 74 61 2e 20 54 68 65 72  rbage data. Ther
8ca0: 65 20 61 72 65 20 74 77 6f 20 73 63 65 6e 61 72  e are two scenar
8cb0: 69 6f 73 0a 20 20 2a 2a 20 77 68 65 72 65 20 74  ios.  ** where t
8cc0: 68 69 73 20 72 69 73 6b 20 63 61 6e 20 62 65 20  his risk can be 
8cd0: 69 67 6e 6f 72 65 64 3a 0a 20 20 2a 2a 0a 20 20  ignored:.  **.  
8ce0: 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20  **   * When the 
8cf0: 70 61 67 65 72 20 69 73 20 69 6e 20 6e 6f 2d 73  pager is in no-s
8d00: 79 6e 63 20 6d 6f 64 65 2e 20 43 6f 72 72 75 70  ync mode. Corrup
8d10: 74 69 6f 6e 20 63 61 6e 20 66 6f 6c 6c 6f 77 20  tion can follow 
8d20: 61 0a 20 20 2a 2a 20 20 20 20 20 70 6f 77 65 72  a.  **     power
8d30: 20 66 61 69 6c 75 72 65 20 69 6e 20 74 68 69 73   failure in this
8d40: 20 63 61 73 65 20 61 6e 79 77 61 79 2e 0a 20 20   case anyway..  
8d50: 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e  **.  **   * When
8d60: 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 43 41   the SQLITE_IOCA
8d70: 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 66 6c  P_SAFE_APPEND fl
8d80: 61 67 20 69 73 20 73 65 74 2e 20 54 68 69 73 20  ag is set. This 
8d90: 67 75 61 72 61 6e 74 65 65 73 0a 20 20 2a 2a 20  guarantees.  ** 
8da0: 20 20 20 20 74 68 61 74 20 67 61 72 62 61 67 65      that garbage
8db0: 20 64 61 74 61 20 69 73 20 6e 65 76 65 72 20 61   data is never a
8dc0: 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 6a  ppended to the j
8dd0: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 2a  ournal file..  *
8de0: 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  /.  assert( isOp
8df0: 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c  en(pPager->fd) |
8e00: 7c 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  | pPager->noSync
8e10: 20 29 3b 0a 20 20 69 66 28 20 28 70 50 61 67 65   );.  if( (pPage
8e20: 72 2d 3e 6e 6f 53 79 6e 63 29 20 7c 7c 20 28 70  r->noSync) || (p
8e30: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
8e40: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
8e50: 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 29 0a 20 20  LMODE_MEMORY).  
8e60: 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73 44 65   || (sqlite3OsDe
8e70: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
8e80: 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 26  ics(pPager->fd)&
8e90: 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46  SQLITE_IOCAP_SAF
8ea0: 45 5f 41 50 50 45 4e 44 29 20 0a 20 20 29 7b 0a  E_APPEND) .  ){.
8eb0: 20 20 20 20 6d 65 6d 63 70 79 28 7a 48 65 61 64      memcpy(zHead
8ec0: 65 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  er, aJournalMagi
8ed0: 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  c, sizeof(aJourn
8ee0: 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 20 20 70  alMagic));.    p
8ef0: 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
8f00: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
8f10: 6c 4d 61 67 69 63 29 5d 2c 20 30 78 66 66 66 66  lMagic)], 0xffff
8f20: 66 66 66 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ffff);.  }else{.
8f30: 20 20 20 20 6d 65 6d 73 65 74 28 7a 48 65 61 64      memset(zHead
8f40: 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 4a  er, 0, sizeof(aJ
8f50: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 29 3b  ournalMagic)+4);
8f60: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72  .  }..  /* The r
8f70: 61 6e 64 6f 6d 20 63 68 65 63 6b 2d 68 61 73 68  andom check-hash
8f80: 20 69 6e 69 74 69 61 6c 69 73 65 72 20 2a 2f 20   initialiser */ 
8f90: 0a 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f  .  sqlite3_rando
8fa0: 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 70 50 61  mness(sizeof(pPa
8fb0: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 2c  ger->cksumInit),
8fc0: 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49   &pPager->cksumI
8fd0: 6e 69 74 29 3b 0a 20 20 70 75 74 33 32 62 69 74  nit);.  put32bit
8fe0: 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
8ff0: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
9000: 2b 34 5d 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73  +4], pPager->cks
9010: 75 6d 49 6e 69 74 29 3b 0a 20 20 2f 2a 20 54 68  umInit);.  /* Th
9020: 65 20 69 6e 69 74 69 61 6c 20 64 61 74 61 62 61  e initial databa
9030: 73 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74  se size */.  put
9040: 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
9050: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
9060: 61 67 69 63 29 2b 38 5d 2c 20 70 50 61 67 65 72  agic)+8], pPager
9070: 2d 3e 64 62 4f 72 69 67 53 69 7a 65 29 3b 0a 20  ->dbOrigSize);. 
9080: 20 2f 2a 20 54 68 65 20 61 73 73 75 6d 65 64 20   /* The assumed 
9090: 73 65 63 74 6f 72 20 73 69 7a 65 20 66 6f 72 20  sector size for 
90a0: 74 68 69 73 20 70 72 6f 63 65 73 73 20 2a 2f 0a  this process */.
90b0: 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65    put32bits(&zHe
90c0: 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
90d0: 72 6e 61 6c 4d 61 67 69 63 29 2b 31 32 5d 2c 20  rnalMagic)+12], 
90e0: 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
90f0: 7a 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 70  ze);..  /* The p
9100: 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75  age size */.  pu
9110: 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72  t32bits(&zHeader
9120: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
9130: 4d 61 67 69 63 29 2b 31 36 5d 2c 20 70 50 61 67  Magic)+16], pPag
9140: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a  er->pageSize);..
9150: 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 69 6e    /* Initializin
9160: 67 20 74 68 65 20 74 61 69 6c 20 6f 66 20 74 68  g the tail of th
9170: 65 20 62 75 66 66 65 72 20 69 73 20 6e 6f 74 20  e buffer is not 
9180: 6e 65 63 65 73 73 61 72 79 2e 20 20 45 76 65 72  necessary.  Ever
9190: 79 74 68 69 6e 67 0a 20 20 2a 2a 20 77 6f 72 6b  ything.  ** work
91a0: 73 20 66 69 6e 64 20 69 66 20 74 68 65 20 66 6f  s find if the fo
91b0: 6c 6c 6f 77 69 6e 67 20 6d 65 6d 73 65 74 28 29  llowing memset()
91c0: 20 69 73 20 6f 6d 69 74 74 65 64 2e 20 20 42 75   is omitted.  Bu
91d0: 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 0a 20  t initializing. 
91e0: 20 2a 2a 20 74 68 65 20 6d 65 6d 6f 72 79 20 70   ** the memory p
91f0: 72 65 76 65 6e 74 73 20 76 61 6c 67 72 69 6e 64  revents valgrind
9200: 20 66 72 6f 6d 20 63 6f 6d 70 6c 61 69 6e 69 6e   from complainin
9210: 67 2c 20 73 6f 20 77 65 20 61 72 65 20 77 69 6c  g, so we are wil
9220: 6c 69 6e 67 20 74 6f 0a 20 20 2a 2a 20 74 61 6b  ling to.  ** tak
9230: 65 20 74 68 65 20 70 65 72 66 6f 72 6d 61 6e 63  e the performanc
9240: 65 20 68 69 74 2e 0a 20 20 2a 2f 0a 20 20 6d 65  e hit..  */.  me
9250: 6d 73 65 74 28 26 7a 48 65 61 64 65 72 5b 73 69  mset(&zHeader[si
9260: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
9270: 69 63 29 2b 32 30 5d 2c 20 30 2c 0a 20 20 20 20  ic)+20], 0,.    
9280: 20 20 20 20 20 6e 48 65 61 64 65 72 2d 28 73 69       nHeader-(si
9290: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
92a0: 69 63 29 2b 32 30 29 29 3b 0a 0a 20 20 2f 2a 20  ic)+20));..  /* 
92b0: 49 6e 20 74 68 65 6f 72 79 2c 20 69 74 20 69 73  In theory, it is
92c0: 20 6f 6e 6c 79 20 6e 65 63 65 73 73 61 72 79 20   only necessary 
92d0: 74 6f 20 77 72 69 74 65 20 74 68 65 20 32 38 20  to write the 28 
92e0: 62 79 74 65 73 20 74 68 61 74 20 74 68 65 20 0a  bytes that the .
92f0: 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61    ** journal hea
9300: 64 65 72 20 63 6f 6e 73 75 6d 65 73 20 74 6f 20  der consumes to 
9310: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
9320: 20 68 65 72 65 2e 20 54 68 65 6e 20 69 6e 63 72   here. Then incr
9330: 65 6d 65 6e 74 20 74 68 65 20 0a 20 20 2a 2a 20  ement the .  ** 
9340: 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66  Pager.journalOff
9350: 20 76 61 72 69 61 62 6c 65 20 62 79 20 4a 4f 55   variable by JOU
9360: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 73 6f 20 74  RNAL_HDR_SZ so t
9370: 68 61 74 20 74 68 65 20 6e 65 78 74 20 0a 20 20  hat the next .  
9380: 2a 2a 20 72 65 63 6f 72 64 20 69 73 20 77 72 69  ** record is wri
9390: 74 74 65 6e 20 74 6f 20 74 68 65 20 66 6f 6c 6c  tten to the foll
93a0: 6f 77 69 6e 67 20 73 65 63 74 6f 72 20 28 6c 65  owing sector (le
93b0: 61 76 69 6e 67 20 61 20 67 61 70 20 69 6e 20 74  aving a gap in t
93c0: 68 65 20 66 69 6c 65 0a 20 20 2a 2a 20 74 68 61  he file.  ** tha
93d0: 74 20 77 69 6c 6c 20 62 65 20 69 6d 70 6c 69 63  t will be implic
93e0: 69 74 6c 79 20 66 69 6c 6c 65 64 20 69 6e 20 62  itly filled in b
93f0: 79 20 74 68 65 20 4f 53 29 2e 0a 20 20 2a 2a 0a  y the OS)..  **.
9400: 20 20 2a 2a 20 48 6f 77 65 76 65 72 20 69 74 20    ** However it 
9410: 68 61 73 20 62 65 65 6e 20 64 69 73 63 6f 76 65  has been discove
9420: 72 65 64 20 74 68 61 74 20 6f 6e 20 73 6f 6d 65  red that on some
9430: 20 73 79 73 74 65 6d 73 20 74 68 69 73 20 70 61   systems this pa
9440: 74 74 65 72 6e 20 63 61 6e 20 0a 20 20 2a 2a 20  ttern can .  ** 
9450: 62 65 20 73 69 67 6e 69 66 69 63 61 6e 74 6c 79  be significantly
9460: 20 73 6c 6f 77 65 72 20 74 68 61 6e 20 63 6f 6e   slower than con
9470: 74 69 67 75 6f 75 73 6c 79 20 77 72 69 74 69 6e  tiguously writin
9480: 67 20 64 61 74 61 20 74 6f 20 74 68 65 20 66 69  g data to the fi
9490: 6c 65 2c 0a 20 20 2a 2a 20 65 76 65 6e 20 69 66  le,.  ** even if
94a0: 20 74 68 61 74 20 6d 65 61 6e 73 20 65 78 70 6c   that means expl
94b0: 69 63 69 74 6c 79 20 77 72 69 74 69 6e 67 20 64  icitly writing d
94c0: 61 74 61 20 74 6f 20 74 68 65 20 62 6c 6f 63 6b  ata to the block
94d0: 20 6f 66 20 0a 20 20 2a 2a 20 28 4a 4f 55 52 4e   of .  ** (JOURN
94e0: 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38 29 20  AL_HDR_SZ - 28) 
94f0: 62 79 74 65 73 20 74 68 61 74 20 77 69 6c 6c 20  bytes that will 
9500: 6e 6f 74 20 62 65 20 75 73 65 64 2e 20 53 6f 20  not be used. So 
9510: 74 68 61 74 20 69 73 20 77 68 61 74 0a 20 20 2a  that is what.  *
9520: 2a 20 69 73 20 64 6f 6e 65 2e 20 0a 20 20 2a 2a  * is done. .  **
9530: 0a 20 20 2a 2a 20 54 68 65 20 6c 6f 6f 70 20 69  .  ** The loop i
9540: 73 20 72 65 71 75 69 72 65 64 20 68 65 72 65 20  s required here 
9550: 69 6e 20 63 61 73 65 20 74 68 65 20 73 65 63 74  in case the sect
9560: 6f 72 2d 73 69 7a 65 20 69 73 20 6c 61 72 67 65  or-size is large
9570: 72 20 74 68 61 6e 20 74 68 65 20 0a 20 20 2a 2a  r than the .  **
9580: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 73   database page s
9590: 69 7a 65 2e 20 53 69 6e 63 65 20 74 68 65 20 7a  ize. Since the z
95a0: 48 65 61 64 65 72 20 62 75 66 66 65 72 20 69 73  Header buffer is
95b0: 20 6f 6e 6c 79 20 50 61 67 65 72 2e 70 61 67 65   only Pager.page
95c0: 53 69 7a 65 0a 20 20 2a 2a 20 62 79 74 65 73 20  Size.  ** bytes 
95d0: 69 6e 20 73 69 7a 65 2c 20 6d 6f 72 65 20 74 68  in size, more th
95e0: 61 6e 20 6f 6e 65 20 63 61 6c 6c 20 74 6f 20 73  an one call to s
95f0: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 29 20  qlite3OsWrite() 
9600: 6d 61 79 20 62 65 20 72 65 71 75 69 72 65 64 0a  may be required.
9610: 20 20 2a 2a 20 74 6f 20 70 6f 70 75 6c 61 74 65    ** to populate
9620: 20 74 68 65 20 65 6e 74 69 72 65 20 6a 6f 75 72   the entire jour
9630: 6e 61 6c 20 68 65 61 64 65 72 20 73 65 63 74 6f  nal header secto
9640: 72 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f 72 28 6e  r..  */ .  for(n
9650: 57 72 69 74 65 3d 30 3b 20 72 63 3d 3d 53 51 4c  Write=0; rc==SQL
9660: 49 54 45 5f 4f 4b 26 26 6e 57 72 69 74 65 3c 4a  ITE_OK&&nWrite<J
9670: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
9680: 61 67 65 72 29 3b 20 6e 57 72 69 74 65 2b 3d 6e  ager); nWrite+=n
9690: 48 65 61 64 65 72 29 7b 0a 20 20 20 20 49 4f 54  Header){.    IOT
96a0: 52 41 43 45 28 28 22 4a 48 44 52 20 25 70 20 25  RACE(("JHDR %p %
96b0: 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65  lld %d\n", pPage
96c0: 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  r, pPager->journ
96d0: 61 6c 48 64 72 2c 20 6e 48 65 61 64 65 72 29 29  alHdr, nHeader))
96e0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
96f0: 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
9700: 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c 20 6e  >jfd, zHeader, n
9710: 48 65 61 64 65 72 2c 20 70 50 61 67 65 72 2d 3e  Header, pPager->
9720: 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 20  journalOff);.   
9730: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
9740: 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3c 3d 20 70  >journalHdr <= p
9750: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
9760: 66 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  f );.    pPager-
9770: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 6e  >journalOff += n
9780: 48 65 61 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 72  Header;.  }..  r
9790: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
97a0: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** The journal f
97b0: 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ile must be open
97c0: 20 77 68 65 6e 20 74 68 69 73 20 69 73 20 63 61   when this is ca
97d0: 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 20  lled. A journal 
97e0: 68 65 61 64 65 72 20 66 69 6c 65 0a 2a 2a 20 28  header file.** (
97f0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62  JOURNAL_HDR_SZ b
9800: 79 74 65 73 29 20 69 73 20 72 65 61 64 20 66 72  ytes) is read fr
9810: 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  om the current l
9820: 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a  ocation in the j
9830: 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20  ournal.** file. 
9840: 54 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  The current loca
9850: 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72  tion in the jour
9860: 6e 61 6c 20 66 69 6c 65 20 69 73 20 67 69 76 65  nal file is give
9870: 6e 20 62 79 0a 2a 2a 20 70 50 61 67 65 72 2d 3e  n by.** pPager->
9880: 6a 6f 75 72 6e 61 6c 4f 66 66 2e 20 53 65 65 20  journalOff. See 
9890: 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20 66  comments above f
98a0: 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 4a 6f 75  unction writeJou
98b0: 72 6e 61 6c 48 64 72 28 29 20 66 6f 72 0a 2a 2a  rnalHdr() for.**
98c0: 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f   a description o
98d0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
98e0: 61 64 65 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a  ader format..**.
98f0: 2a 2a 20 49 66 20 74 68 65 20 68 65 61 64 65 72  ** If the header
9900: 20 69 73 20 72 65 61 64 20 73 75 63 63 65 73 73   is read success
9910: 66 75 6c 6c 79 2c 20 2a 70 4e 52 65 63 20 69 73  fully, *pNRec is
9920: 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62   set to the numb
9930: 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65 20 72 65  er of.** page re
9940: 63 6f 72 64 73 20 66 6f 6c 6c 6f 77 69 6e 67 20  cords following 
9950: 74 68 69 73 20 68 65 61 64 65 72 20 61 6e 64 20  this header and 
9960: 2a 70 44 62 53 69 7a 65 20 69 73 20 73 65 74 20  *pDbSize is set 
9970: 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  to the size of t
9980: 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 62  he.** database b
9990: 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61  efore the transa
99a0: 63 74 69 6f 6e 20 62 65 67 61 6e 2c 20 69 6e 20  ction began, in 
99b0: 70 61 67 65 73 2e 20 41 6c 73 6f 2c 20 70 50 61  pages. Also, pPa
99c0: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 0a 2a  ger->cksumInit.*
99d0: 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  * is set to the 
99e0: 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20  value read from 
99f0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
9a00: 65 72 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  er. SQLITE_OK is
9a10: 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69 6e 20   returned.** in 
9a20: 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a  this case..**.**
9a30: 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
9a40: 68 65 61 64 65 72 20 66 69 6c 65 20 61 70 70 65  header file appe
9a50: 61 72 73 20 74 6f 20 62 65 20 63 6f 72 72 75 70  ars to be corrup
9a60: 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45  ted, SQLITE_DONE
9a70: 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20   is.** returned 
9a80: 61 6e 64 20 2a 70 4e 52 65 63 20 61 6e 64 20 2a  and *pNRec and *
9a90: 50 44 62 53 69 7a 65 20 61 72 65 20 75 6e 64 65  PDbSize are unde
9aa0: 66 69 6e 65 64 2e 20 20 49 66 20 4a 4f 55 52 4e  fined.  If JOURN
9ab0: 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 0a  AL_HDR_SZ bytes.
9ac0: 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 72 65 61  ** cannot be rea
9ad0: 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  d from the journ
9ae0: 61 6c 20 66 69 6c 65 20 61 6e 20 65 72 72 6f 72  al file an error
9af0: 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
9b00: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
9b10: 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28   readJournalHdr(
9b20: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
9b30: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
9b40: 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  /* Pager object 
9b50: 2a 2f 0a 20 20 69 6e 74 20 69 73 48 6f 74 2c 0a  */.  int isHot,.
9b60: 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a    i64 journalSiz
9b70: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e,             /
9b80: 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 70  * Size of the op
9b90: 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  en journal file 
9ba0: 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33  in bytes */.  u3
9bb0: 32 20 2a 70 4e 52 65 63 2c 20 20 20 20 20 20 20  2 *pNRec,       
9bc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
9bd0: 54 3a 20 56 61 6c 75 65 20 72 65 61 64 20 66 72  T: Value read fr
9be0: 6f 6d 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  om the nRec fiel
9bf0: 64 20 2a 2f 0a 20 20 75 33 32 20 2a 70 44 62 53  d */.  u32 *pDbS
9c00: 69 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ize             
9c10: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61 6c 75      /* OUT: Valu
9c20: 65 20 6f 66 20 6f 72 69 67 69 6e 61 6c 20 64 61  e of original da
9c30: 74 61 62 61 73 65 20 73 69 7a 65 20 66 69 65 6c  tabase size fiel
9c40: 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  d */.){.  int rc
9c50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9c60: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
9c70: 20 63 6f 64 65 20 2a 2f 0a 20 20 75 6e 73 69 67   code */.  unsig
9c80: 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b  ned char aMagic[
9c90: 38 5d 3b 20 20 20 20 20 2f 2a 20 41 20 62 75 66  8];     /* A buf
9ca0: 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  fer to hold the 
9cb0: 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a  magic header */.
9cc0: 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20    i64 iHdrOff;  
9cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9ce0: 2a 20 4f 66 66 73 65 74 20 6f 66 20 6a 6f 75 72  * Offset of jour
9cf0: 6e 61 6c 20 68 65 61 64 65 72 20 62 65 69 6e 67  nal header being
9d00: 20 72 65 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65   read */..  asse
9d10: 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
9d20: 72 2d 3e 6a 66 64 29 20 29 3b 20 20 20 20 20 20  r->jfd) );      
9d30: 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  /* Journal file 
9d40: 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 20 2a 2f  must be open. */
9d50: 0a 0a 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 50  ..  /* Advance P
9d60: 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ager.journalOff 
9d70: 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
9d80: 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72 2e  the next sector.
9d90: 20 49 66 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75   If the.  ** jou
9da0: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 74 6f 6f  rnal file is too
9db0: 20 73 6d 61 6c 6c 20 66 6f 72 20 74 68 65 72 65   small for there
9dc0: 20 74 6f 20 62 65 20 61 20 68 65 61 64 65 72 20   to be a header 
9dd0: 73 74 6f 72 65 64 20 61 74 20 74 68 69 73 0a 20  stored at this. 
9de0: 20 2a 2a 20 70 6f 69 6e 74 2c 20 72 65 74 75 72   ** point, retur
9df0: 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20  n SQLITE_DONE.. 
9e00: 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f   */.  pPager->jo
9e10: 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e  urnalOff = journ
9e20: 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61 67  alHdrOffset(pPag
9e30: 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  er);.  if( pPage
9e40: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b 4a 4f  r->journalOff+JO
9e50: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
9e60: 67 65 72 29 20 3e 20 6a 6f 75 72 6e 61 6c 53 69  ger) > journalSi
9e70: 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ze ){.    return
9e80: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
9e90: 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d 20 70 50  }.  iHdrOff = pP
9ea0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
9eb0: 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 69 6e 20  ;..  /* Read in 
9ec0: 74 68 65 20 66 69 72 73 74 20 38 20 62 79 74 65  the first 8 byte
9ed0: 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s of the journal
9ee0: 20 68 65 61 64 65 72 2e 20 49 66 20 74 68 65 79   header. If they
9ef0: 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 0a 20 20   do not match.  
9f00: 2a 2a 20 74 68 65 20 20 6d 61 67 69 63 20 73 74  ** the  magic st
9f10: 72 69 6e 67 20 66 6f 75 6e 64 20 61 74 20 74 68  ring found at th
9f20: 65 20 73 74 61 72 74 20 6f 66 20 65 61 63 68 20  e start of each 
9f30: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20  journal header, 
9f40: 72 65 74 75 72 6e 0a 20 20 2a 2a 20 53 51 4c 49  return.  ** SQLI
9f50: 54 45 5f 44 4f 4e 45 2e 20 49 66 20 61 6e 20 49  TE_DONE. If an I
9f60: 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  O error occurs, 
9f70: 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  return an error 
9f80: 63 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  code. Otherwise,
9f90: 0a 20 20 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 20  .  ** proceed.. 
9fa0: 20 2a 2f 0a 20 20 69 66 28 20 69 73 48 6f 74 20   */.  if( isHot 
9fb0: 7c 7c 20 69 48 64 72 4f 66 66 21 3d 70 50 61 67  || iHdrOff!=pPag
9fc0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 29  er->journalHdr )
9fd0: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
9fe0: 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
9ff0: 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20 73 69  >jfd, aMagic, si
a000: 7a 65 6f 66 28 61 4d 61 67 69 63 29 2c 20 69 48  zeof(aMagic), iH
a010: 64 72 4f 66 66 29 3b 0a 20 20 20 20 69 66 28 20  drOff);.    if( 
a020: 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  rc ){.      retu
a030: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
a040: 20 69 66 28 20 6d 65 6d 63 6d 70 28 61 4d 61 67   if( memcmp(aMag
a050: 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  ic, aJournalMagi
a060: 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63  c, sizeof(aMagic
a070: 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  ))!=0 ){.      r
a080: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
a090: 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  E;.    }.  }..  
a0a0: 2f 2a 20 52 65 61 64 20 74 68 65 20 66 69 72 73  /* Read the firs
a0b0: 74 20 74 68 72 65 65 20 33 32 2d 62 69 74 20 66  t three 32-bit f
a0c0: 69 65 6c 64 73 20 6f 66 20 74 68 65 20 6a 6f 75  ields of the jou
a0d0: 72 6e 61 6c 20 68 65 61 64 65 72 3a 20 54 68 65  rnal header: The
a0e0: 20 6e 52 65 63 0a 20 20 2a 2a 20 66 69 65 6c 64   nRec.  ** field
a0f0: 2c 20 74 68 65 20 63 68 65 63 6b 73 75 6d 2d 69  , the checksum-i
a100: 6e 69 74 69 61 6c 69 7a 65 72 20 61 6e 64 20 74  nitializer and t
a110: 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  he database size
a120: 20 61 74 20 74 68 65 20 73 74 61 72 74 0a 20 20   at the start.  
a130: 2a 2a 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  ** of the transa
a140: 63 74 69 6f 6e 2e 20 52 65 74 75 72 6e 20 61 6e  ction. Return an
a150: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61   error code if a
a160: 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  nything goes wro
a170: 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 53  ng..  */.  if( S
a180: 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
a190: 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65  read32bits(pPage
a1a0: 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b  r->jfd, iHdrOff+
a1b0: 38 2c 20 70 4e 52 65 63 29 29 0a 20 20 20 7c 7c  8, pNRec)).   ||
a1c0: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
a1d0: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61  = read32bits(pPa
a1e0: 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
a1f0: 66 2b 31 32 2c 20 26 70 50 61 67 65 72 2d 3e 63  f+12, &pPager->c
a200: 6b 73 75 6d 49 6e 69 74 29 29 0a 20 20 20 7c 7c  ksumInit)).   ||
a210: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
a220: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61  = read32bits(pPa
a230: 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
a240: 66 2b 31 36 2c 20 70 44 62 53 69 7a 65 29 29 0a  f+16, pDbSize)).
a250: 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
a260: 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  rc;.  }..  if( p
a270: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
a280: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 75 33 32 20  f==0 ){.    u32 
a290: 69 50 61 67 65 53 69 7a 65 3b 20 20 20 20 20 20  iPageSize;      
a2a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
a2b0: 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 6a  -size field of j
a2c0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f  ournal header */
a2d0: 0a 20 20 20 20 75 33 32 20 69 53 65 63 74 6f 72  .    u32 iSector
a2e0: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
a2f0: 20 20 2f 2a 20 53 65 63 74 6f 72 2d 73 69 7a 65    /* Sector-size
a300: 20 66 69 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61   field of journa
a310: 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 20  l header */.    
a320: 75 31 36 20 69 50 61 67 65 53 69 7a 65 31 36 3b  u16 iPageSize16;
a330: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a340: 43 6f 70 79 20 6f 66 20 69 50 61 67 65 53 69 7a  Copy of iPageSiz
a350: 65 20 69 6e 20 31 36 2d 62 69 74 20 76 61 72 69  e in 16-bit vari
a360: 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  able */..    /* 
a370: 52 65 61 64 20 74 68 65 20 70 61 67 65 2d 73 69  Read the page-si
a380: 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69  ze and sector-si
a390: 7a 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  ze journal heade
a3a0: 72 20 66 69 65 6c 64 73 2e 20 2a 2f 0a 20 20 20  r fields. */.   
a3b0: 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
a3c0: 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73  (rc = read32bits
a3d0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48  (pPager->jfd, iH
a3e0: 64 72 4f 66 66 2b 32 30 2c 20 26 69 53 65 63 74  drOff+20, &iSect
a3f0: 6f 72 53 69 7a 65 29 29 0a 20 20 20 20 20 7c 7c  orSize)).     ||
a400: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
a410: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61  = read32bits(pPa
a420: 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
a430: 66 2b 32 34 2c 20 26 69 50 61 67 65 53 69 7a 65  f+24, &iPageSize
a440: 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  )).    ){.      
a450: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
a460: 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74  ..    /* Check t
a470: 68 61 74 20 74 68 65 20 76 61 6c 75 65 73 20 72  hat the values r
a480: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67  ead from the pag
a490: 65 2d 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f  e-size and secto
a4a0: 72 2d 73 69 7a 65 20 66 69 65 6c 64 73 0a 20 20  r-size fields.  
a4b0: 20 20 2a 2a 20 61 72 65 20 77 69 74 68 69 6e 20    ** are within 
a4c0: 72 61 6e 67 65 2e 20 54 6f 20 62 65 20 27 69 6e  range. To be 'in
a4d0: 20 72 61 6e 67 65 27 2c 20 62 6f 74 68 20 76 61   range', both va
a4e0: 6c 75 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20  lues need to be 
a4f0: 61 20 70 6f 77 65 72 0a 20 20 20 20 2a 2a 20 6f  a power.    ** o
a500: 66 20 74 77 6f 20 67 72 65 61 74 65 72 20 74 68  f two greater th
a510: 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 35  an or equal to 5
a520: 31 32 20 6f 72 20 33 32 2c 20 61 6e 64 20 6e 6f  12 or 32, and no
a530: 74 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  t greater than t
a540: 68 65 69 72 20 0a 20 20 20 20 2a 2a 20 72 65 73  heir .    ** res
a550: 70 65 63 74 69 76 65 20 63 6f 6d 70 69 6c 65 20  pective compile 
a560: 74 69 6d 65 20 6d 61 78 69 6d 75 6d 20 6c 69 6d  time maximum lim
a570: 69 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  its..    */.    
a580: 69 66 28 20 69 50 61 67 65 53 69 7a 65 3c 35 31  if( iPageSize<51
a590: 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
a5a0: 20 20 20 7c 7c 20 69 53 65 63 74 6f 72 53 69 7a     || iSectorSiz
a5b0: 65 3c 33 32 0a 20 20 20 20 20 7c 7c 20 69 50 61  e<32.     || iPa
a5c0: 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41  geSize>SQLITE_MA
a5d0: 58 5f 50 41 47 45 5f 53 49 5a 45 20 7c 7c 20 69  X_PAGE_SIZE || i
a5e0: 53 65 63 74 6f 72 53 69 7a 65 3e 4d 41 58 5f 53  SectorSize>MAX_S
a5f0: 45 43 54 4f 52 5f 53 49 5a 45 0a 20 20 20 20 20  ECTOR_SIZE.     
a600: 7c 7c 20 28 28 69 50 61 67 65 53 69 7a 65 2d 31  || ((iPageSize-1
a610: 29 26 69 50 61 67 65 53 69 7a 65 29 21 3d 30 20  )&iPageSize)!=0 
a620: 20 20 7c 7c 20 28 28 69 53 65 63 74 6f 72 53 69    || ((iSectorSi
a630: 7a 65 2d 31 29 26 69 53 65 63 74 6f 72 53 69 7a  ze-1)&iSectorSiz
a640: 65 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20  e)!=0 .    ){.  
a650: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 65 69      /* If the ei
a660: 74 68 65 72 20 74 68 65 20 70 61 67 65 2d 73 69  ther the page-si
a670: 7a 65 20 6f 72 20 73 65 63 74 6f 72 2d 73 69 7a  ze or sector-siz
a680: 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e in the journal
a690: 2d 68 65 61 64 65 72 20 69 73 20 0a 20 20 20 20  -header is .    
a6a0: 20 20 2a 2a 20 69 6e 76 61 6c 69 64 2c 20 74 68    ** invalid, th
a6b0: 65 6e 20 74 68 65 20 70 72 6f 63 65 73 73 20 74  en the process t
a6c0: 68 61 74 20 77 72 6f 74 65 20 74 68 65 20 6a 6f  hat wrote the jo
a6d0: 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 6d 75 73  urnal-header mus
a6e0: 74 20 68 61 76 65 20 0a 20 20 20 20 20 20 2a 2a  t have .      **
a6f0: 20 63 72 61 73 68 65 64 20 62 65 66 6f 72 65 20   crashed before 
a700: 74 68 65 20 68 65 61 64 65 72 20 77 61 73 20 73  the header was s
a710: 79 6e 63 65 64 2e 20 49 6e 20 74 68 69 73 20 63  ynced. In this c
a720: 61 73 65 20 73 74 6f 70 20 72 65 61 64 69 6e 67  ase stop reading
a730: 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6a   .      ** the j
a740: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 72 65  ournal file here
a750: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
a760: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
a770: 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ONE;.    }..    
a780: 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 70 61  /* Update the pa
a790: 67 65 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63 68  ge-size to match
a7a0: 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20   the value read 
a7b0: 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
a7c0: 2e 20 0a 20 20 20 20 2a 2a 20 55 73 65 20 61 20  . .    ** Use a 
a7d0: 74 65 73 74 63 61 73 65 28 29 20 6d 61 63 72 6f  testcase() macro
a7e0: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
a7f0: 61 74 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72  at malloc failur
a800: 65 20 77 69 74 68 69 6e 20 0a 20 20 20 20 2a 2a  e within .    **
a810: 20 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a   PagerSetPagesiz
a820: 65 28 29 20 69 73 20 74 65 73 74 65 64 2e 0a 20  e() is tested.. 
a830: 20 20 20 2a 2f 0a 20 20 20 20 69 50 61 67 65 53     */.    iPageS
a840: 69 7a 65 31 36 20 3d 20 28 75 31 36 29 69 50 61  ize16 = (u16)iPa
a850: 67 65 53 69 7a 65 3b 0a 20 20 20 20 72 63 20 3d  geSize;.    rc =
a860: 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
a870: 50 61 67 65 73 69 7a 65 28 70 50 61 67 65 72 2c  Pagesize(pPager,
a880: 20 26 69 50 61 67 65 53 69 7a 65 31 36 2c 20 2d   &iPageSize16, -
a890: 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  1);.    testcase
a8a0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
a8b0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
a8c0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
a8d0: 69 50 61 67 65 53 69 7a 65 31 36 3d 3d 28 75 31  iPageSize16==(u1
a8e0: 36 29 69 50 61 67 65 53 69 7a 65 20 29 3b 0a 0a  6)iPageSize );..
a8f0: 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68      /* Update th
a900: 65 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72  e assumed sector
a910: 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63 68 20 74  -size to match t
a920: 68 65 20 76 61 6c 75 65 20 75 73 65 64 20 62 79  he value used by
a930: 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 72 6f   .    ** the pro
a940: 63 65 73 73 20 74 68 61 74 20 63 72 65 61 74 65  cess that create
a950: 64 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 20  d this journal. 
a960: 49 66 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20  If this journal 
a970: 77 61 73 0a 20 20 20 20 2a 2a 20 63 72 65 61 74  was.    ** creat
a980: 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 20  ed by a process 
a990: 6f 74 68 65 72 20 74 68 61 6e 20 74 68 69 73 20  other than this 
a9a0: 6f 6e 65 2c 20 74 68 65 6e 20 74 68 69 73 20 72  one, then this r
a9b0: 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20 69 73  outine.    ** is
a9c0: 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 66 72   being called fr
a9d0: 6f 6d 20 77 69 74 68 69 6e 20 70 61 67 65 72 5f  om within pager_
a9e0: 70 6c 61 79 62 61 63 6b 28 29 2e 20 54 68 65 20  playback(). The 
a9f0: 6c 6f 63 61 6c 20 76 61 6c 75 65 0a 20 20 20 20  local value.    
aa00: 2a 2a 20 6f 66 20 50 61 67 65 72 2e 73 65 63 74  ** of Pager.sect
aa10: 6f 72 53 69 7a 65 20 69 73 20 72 65 73 74 6f 72  orSize is restor
aa20: 65 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ed at the end of
aa30: 20 74 68 61 74 20 72 6f 75 74 69 6e 65 2e 0a 20   that routine.. 
aa40: 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72     */.    pPager
aa50: 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 69  ->sectorSize = i
aa60: 53 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 7d 0a  SectorSize;.  }.
aa70: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
aa80: 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c  alOff += JOURNAL
aa90: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b  _HDR_SZ(pPager);
aaa0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
aab0: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68  ../*.** Write th
aac0: 65 20 73 75 70 70 6c 69 65 64 20 6d 61 73 74 65  e supplied maste
aad0: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69  r journal name i
aae0: 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
aaf0: 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 0a 2a  file for pager.*
ab00: 2a 20 70 50 61 67 65 72 20 61 74 20 74 68 65 20  * pPager at the 
ab10: 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e  current location
ab20: 2e 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  . The master jou
ab30: 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74 20 62  rnal name must b
ab40: 65 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 74 68  e the last.** th
ab50: 69 6e 67 20 77 72 69 74 74 65 6e 20 74 6f 20 61  ing written to a
ab60: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
ab70: 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
ab80: 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65  n full-sync mode
ab90: 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  , the.** journal
aba0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
abb0: 20 69 73 20 61 64 76 61 6e 63 65 64 20 74 6f 20   is advanced to 
abc0: 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20  the next sector 
abd0: 62 6f 75 6e 64 61 72 79 20 62 65 66 6f 72 65 0a  boundary before.
abe0: 2a 2a 20 61 6e 79 74 68 69 6e 67 20 69 73 20 77  ** anything is w
abf0: 72 69 74 74 65 6e 2e 20 54 68 65 20 66 6f 72 6d  ritten. The form
ac00: 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2b  at is:.**.**   +
ac10: 20 34 20 62 79 74 65 73 3a 20 50 41 47 45 52 5f   4 bytes: PAGER_
ac20: 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 20 20 2b 20  MJ_PGNO..**   + 
ac30: 4e 20 62 79 74 65 73 3a 20 4d 61 73 74 65 72 20  N bytes: Master 
ac40: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65  journal filename
ac50: 20 69 6e 20 75 74 66 2d 38 2e 0a 2a 2a 20 20 20   in utf-8..**   
ac60: 2b 20 34 20 62 79 74 65 73 3a 20 4e 20 28 6c 65  + 4 bytes: N (le
ac70: 6e 67 74 68 20 6f 66 20 6d 61 73 74 65 72 20 6a  ngth of master j
ac80: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 20 62  ournal name in b
ac90: 79 74 65 73 2c 20 6e 6f 20 6e 75 6c 2d 74 65 72  ytes, no nul-ter
aca0: 6d 69 6e 61 74 6f 72 29 2e 0a 2a 2a 20 20 20 2b  minator)..**   +
acb0: 20 34 20 62 79 74 65 73 3a 20 4d 61 73 74 65 72   4 bytes: Master
acc0: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 63 68   journal name ch
acd0: 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 20 2b 20 38  ecksum..**   + 8
ace0: 20 62 79 74 65 73 3a 20 61 4a 6f 75 72 6e 61 6c   bytes: aJournal
acf0: 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54  Magic[]..**.** T
ad00: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
ad10: 6c 20 70 61 67 65 20 63 68 65 63 6b 73 75 6d 20  l page checksum 
ad20: 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68  is the sum of th
ad30: 65 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d  e bytes in the m
ad40: 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  aster.** journal
ad50: 20 6e 61 6d 65 2c 20 77 68 65 72 65 20 65 61 63   name, where eac
ad60: 68 20 62 79 74 65 20 69 73 20 69 6e 74 65 72 70  h byte is interp
ad70: 72 65 74 65 64 20 61 73 20 61 20 73 69 67 6e 65  reted as a signe
ad80: 64 20 38 2d 62 69 74 20 69 6e 74 65 67 65 72 2e  d 8-bit integer.
ad90: 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73 74 65  .**.** If zMaste
ada0: 72 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e  r is a NULL poin
adb0: 74 65 72 20 28 6f 63 63 75 72 73 20 66 6f 72 20  ter (occurs for 
adc0: 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73  a single databas
add0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20  e transaction), 
ade0: 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 69 73  .** this call is
adf0: 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
ae00: 74 69 63 20 69 6e 74 20 77 72 69 74 65 4d 61 73  tic int writeMas
ae10: 74 65 72 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72  terJournal(Pager
ae20: 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20   *pPager, const 
ae30: 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a  char *zMaster){.
ae40: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
ae50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae60: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
ae70: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 73 74  e */.  int nMast
ae80: 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  er;             
ae90: 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74          /* Lengt
aea0: 68 20 6f 66 20 73 74 72 69 6e 67 20 7a 4d 61 73  h of string zMas
aeb0: 74 65 72 20 2a 2f 0a 20 20 69 36 34 20 69 48 64  ter */.  i64 iHd
aec0: 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  rOff;           
aed0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
aee0: 73 65 74 20 6f 66 20 68 65 61 64 65 72 20 69 6e  set of header in
aef0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
af00: 0a 20 20 69 36 34 20 6a 72 6e 6c 53 69 7a 65 3b  .  i64 jrnlSize;
af10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af20: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6a      /* Size of j
af30: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 6e 20 64  ournal file on d
af40: 69 73 6b 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73  isk */.  u32 cks
af50: 75 6d 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  um = 0;         
af60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65            /* Che
af70: 63 6b 73 75 6d 20 6f 66 20 73 74 72 69 6e 67 20  cksum of string 
af80: 7a 4d 61 73 74 65 72 20 2a 2f 0a 0a 20 20 61 73  zMaster */..  as
af90: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 65  sert( pPager->se
afa0: 74 4d 61 73 74 65 72 3d 3d 30 20 29 3b 0a 20 20  tMaster==0 );.  
afb0: 69 66 28 20 21 7a 4d 61 73 74 65 72 20 0a 20 20  if( !zMaster .  
afc0: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   || pPager->jour
afd0: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
afe0: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
aff0: 59 20 0a 20 20 20 7c 7c 20 70 50 61 67 65 72 2d  Y .   || pPager-
b000: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
b010: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
b020: 4f 46 46 20 0a 20 20 29 7b 0a 20 20 20 20 72 65  OFF .  ){.    re
b030: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
b040: 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 65    }.  pPager->se
b050: 74 4d 61 73 74 65 72 20 3d 20 31 3b 0a 20 20 61  tMaster = 1;.  a
b060: 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
b070: 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20  ager->jfd) );.  
b080: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
b090: 6a 6f 75 72 6e 61 6c 48 64 72 20 3c 3d 20 70 50  journalHdr <= pP
b0a0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
b0b0: 20 29 3b 0a 0a 20 20 2f 2a 20 43 61 6c 63 75 6c   );..  /* Calcul
b0c0: 61 74 65 20 74 68 65 20 6c 65 6e 67 74 68 20 69  ate the length i
b0d0: 6e 20 62 79 74 65 73 20 61 6e 64 20 74 68 65 20  n bytes and the 
b0e0: 63 68 65 63 6b 73 75 6d 20 6f 66 20 7a 4d 61 73  checksum of zMas
b0f0: 74 65 72 20 2a 2f 0a 20 20 66 6f 72 28 6e 4d 61  ter */.  for(nMa
b100: 73 74 65 72 3d 30 3b 20 7a 4d 61 73 74 65 72 5b  ster=0; zMaster[
b110: 6e 4d 61 73 74 65 72 5d 3b 20 6e 4d 61 73 74 65  nMaster]; nMaste
b120: 72 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20  r++){.    cksum 
b130: 2b 3d 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73 74  += zMaster[nMast
b140: 65 72 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  er];.  }..  /* I
b150: 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d  f in full-sync m
b160: 6f 64 65 2c 20 61 64 76 61 6e 63 65 20 74 6f 20  ode, advance to 
b170: 74 68 65 20 6e 65 78 74 20 64 69 73 6b 20 73 65  the next disk se
b180: 63 74 6f 72 20 62 65 66 6f 72 65 20 77 72 69 74  ctor before writ
b190: 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61 73  ing.  ** the mas
b1a0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
b1b0: 2e 20 54 68 69 73 20 69 73 20 69 6e 20 63 61 73  . This is in cas
b1c0: 65 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 70  e the previous p
b1d0: 61 67 65 20 77 72 69 74 74 65 6e 20 74 6f 0a 20  age written to. 
b1e0: 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   ** the journal 
b1f0: 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
b200: 20 73 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20 20   synced..  */.  
b210: 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  if( pPager->full
b220: 53 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67  Sync ){.    pPag
b230: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
b240: 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65   journalHdrOffse
b250: 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  t(pPager);.  }. 
b260: 20 69 48 64 72 4f 66 66 20 3d 20 70 50 61 67 65   iHdrOff = pPage
b270: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a  r->journalOff;..
b280: 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6d    /* Write the m
b290: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 64 61  aster journal da
b2a0: 74 61 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  ta to the end of
b2b0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
b2c0: 65 2e 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 72  e. If.  ** an er
b2d0: 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75  ror occurs, retu
b2e0: 72 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  rn the error cod
b2f0: 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  e to the caller.
b300: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 30 20 21  .  */.  if( (0 !
b310: 3d 20 28 72 63 20 3d 20 77 72 69 74 65 33 32 62  = (rc = write32b
b320: 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
b330: 20 69 48 64 72 4f 66 66 2c 20 50 41 47 45 52 5f   iHdrOff, PAGER_
b340: 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 29  MJ_PGNO(pPager))
b350: 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28  )).   || (0 != (
b360: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
b370: 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
b380: 20 7a 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74 65   zMaster, nMaste
b390: 72 2c 20 69 48 64 72 4f 66 66 2b 34 29 29 29 0a  r, iHdrOff+4))).
b3a0: 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20     || (0 != (rc 
b3b0: 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
b3c0: 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f  ager->jfd, iHdrO
b3d0: 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2c 20 6e 4d  ff+4+nMaster, nM
b3e0: 61 73 74 65 72 29 29 29 0a 20 20 20 7c 7c 20 28  aster))).   || (
b3f0: 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65  0 != (rc = write
b400: 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
b410: 66 64 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d  fd, iHdrOff+4+nM
b420: 61 73 74 65 72 2b 34 2c 20 63 6b 73 75 6d 29 29  aster+4, cksum))
b430: 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72  ).   || (0 != (r
b440: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
b450: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
b460: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38  aJournalMagic, 8
b470: 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73  , iHdrOff+4+nMas
b480: 74 65 72 2b 38 29 29 29 0a 20 20 29 7b 0a 20 20  ter+8))).  ){.  
b490: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
b4a0: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
b4b0: 61 6c 4f 66 66 20 2b 3d 20 28 6e 4d 61 73 74 65  alOff += (nMaste
b4c0: 72 2b 32 30 29 3b 0a 20 20 70 50 61 67 65 72 2d  r+20);.  pPager-
b4d0: 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21 70 50 61  >needSync = !pPa
b4e0: 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 0a 20 20  ger->noSync;..  
b4f0: 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  /* If the pager 
b500: 69 73 20 69 6e 20 70 65 72 69 73 74 65 6e 74 2d  is in peristent-
b510: 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2c 20 74 68  journal mode, th
b520: 65 6e 20 74 68 65 20 70 68 79 73 69 63 61 6c 20  en the physical 
b530: 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2d 66 69  .  ** journal-fi
b540: 6c 65 20 6d 61 79 20 65 78 74 65 6e 64 20 70 61  le may extend pa
b550: 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
b560: 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  e master-journal
b570: 20 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e 64 20 38   name.  ** and 8
b580: 20 62 79 74 65 73 20 6f 66 20 6d 61 67 69 63 20   bytes of magic 
b590: 64 61 74 61 20 6a 75 73 74 20 77 72 69 74 74 65  data just writte
b5a0: 6e 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 54  n to the file. T
b5b0: 68 69 73 20 69 73 20 0a 20 20 2a 2a 20 64 61 6e  his is .  ** dan
b5c0: 67 65 72 6f 75 73 20 62 65 63 61 75 73 65 20 74  gerous because t
b5d0: 68 65 20 63 6f 64 65 20 74 6f 20 72 6f 6c 6c 62  he code to rollb
b5e0: 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  ack a hot-journa
b5f0: 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 77 69 6c 6c  l file.  ** will
b600: 20 6e 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20   not be able to 
b610: 66 69 6e 64 20 74 68 65 20 6d 61 73 74 65 72 2d  find the master-
b620: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 74 6f 20  journal name to 
b630: 64 65 74 65 72 6d 69 6e 65 20 0a 20 20 2a 2a 20  determine .  ** 
b640: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
b650: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68 6f  he journal is ho
b660: 74 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 61  t. .  **.  ** Ea
b670: 73 69 65 73 74 20 74 68 69 6e 67 20 74 6f 20 64  siest thing to d
b680: 6f 20 69 6e 20 74 68 69 73 20 73 63 65 6e 61 72  o in this scenar
b690: 69 6f 20 69 73 20 74 6f 20 74 72 75 6e 63 61 74  io is to truncat
b6a0: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20  e the journal . 
b6b0: 20 2a 2a 20 66 69 6c 65 20 74 6f 20 74 68 65 20   ** file to the 
b6c0: 72 65 71 75 69 72 65 64 20 73 69 7a 65 2e 0a 20  required size.. 
b6d0: 20 2a 2f 20 0a 20 20 69 66 28 20 53 51 4c 49 54   */ .  if( SQLIT
b6e0: 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73 71 6c 69  E_OK==(rc = sqli
b6f0: 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
b700: 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6a 72 6e 6c  ager->jfd, &jrnl
b710: 53 69 7a 65 29 29 0a 20 20 20 26 26 20 6a 72 6e  Size)).   && jrn
b720: 6c 53 69 7a 65 3e 70 50 61 67 65 72 2d 3e 6a 6f  lSize>pPager->jo
b730: 75 72 6e 61 6c 4f 66 66 0a 20 20 29 7b 0a 20 20  urnalOff.  ){.  
b740: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
b750: 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
b760: 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  >jfd, pPager->jo
b770: 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 7d 0a 20  urnalOff);.  }. 
b780: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
b790: 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 70 61 67 65  *.** Find a page
b7a0: 20 69 6e 20 74 68 65 20 68 61 73 68 20 74 61 62   in the hash tab
b7b0: 6c 65 20 67 69 76 65 6e 20 69 74 73 20 70 61 67  le given its pag
b7c0: 65 20 6e 75 6d 62 65 72 2e 20 52 65 74 75 72 6e  e number. Return
b7d0: 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  .** a pointer to
b7e0: 20 74 68 65 20 70 61 67 65 20 6f 72 20 4e 55 4c   the page or NUL
b7f0: 4c 20 69 66 20 74 68 65 20 72 65 71 75 65 73 74  L if the request
b800: 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74 20 0a  ed page is not .
b810: 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 6d 65  ** already in me
b820: 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mory..*/.static 
b830: 50 67 48 64 72 20 2a 70 61 67 65 72 5f 6c 6f 6f  PgHdr *pager_loo
b840: 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65  kup(Pager *pPage
b850: 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  r, Pgno pgno){. 
b860: 20 50 67 48 64 72 20 2a 70 3b 20 20 20 20 20 20   PgHdr *p;      
b870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b880: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c     /* Return val
b890: 75 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49 74 20 69  ue */..  /* It i
b8a0: 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66  s not possible f
b8b0: 6f 72 20 61 20 63 61 6c 6c 20 74 6f 20 50 63 61  or a call to Pca
b8c0: 63 68 65 46 65 74 63 68 28 29 20 77 69 74 68 20  cheFetch() with 
b8d0: 63 72 65 61 74 65 46 6c 61 67 3d 3d 30 20 74 6f  createFlag==0 to
b8e0: 0a 20 20 2a 2a 20 66 61 69 6c 2c 20 73 69 6e 63  .  ** fail, sinc
b8f0: 65 20 6e 6f 20 61 74 74 65 6d 70 74 20 74 6f 20  e no attempt to 
b900: 61 6c 6c 6f 63 61 74 65 20 64 79 6e 61 6d 69 63  allocate dynamic
b910: 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20   memory will be 
b920: 6d 61 64 65 2e 0a 20 20 2a 2f 0a 20 20 28 76 6f  made..  */.  (vo
b930: 69 64 29 73 71 6c 69 74 65 33 50 63 61 63 68 65  id)sqlite3Pcache
b940: 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50  Fetch(pPager->pP
b950: 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 30 2c 20  Cache, pgno, 0, 
b960: 26 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b  &p);.  return p;
b970: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73  .}../*.** Unless
b980: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
b990: 20 65 72 72 6f 72 2d 73 74 61 74 65 2c 20 64 69   error-state, di
b9a0: 73 63 61 72 64 20 61 6c 6c 20 69 6e 2d 6d 65 6d  scard all in-mem
b9b0: 6f 72 79 20 70 61 67 65 73 2e 20 49 66 0a 2a 2a  ory pages. If.**
b9c0: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
b9d0: 20 65 72 72 6f 72 2d 73 74 61 74 65 2c 20 74 68   error-state, th
b9e0: 65 6e 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20  en this call is 
b9f0: 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54  a no-op..**.** T
ba00: 4f 44 4f 3a 20 57 68 79 20 63 61 6e 20 77 65 20  ODO: Why can we 
ba10: 6e 6f 74 20 72 65 73 65 74 20 74 68 65 20 70 61  not reset the pa
ba20: 67 65 72 20 77 68 69 6c 65 20 69 6e 20 65 72 72  ger while in err
ba30: 6f 72 20 73 74 61 74 65 3f 0a 2a 2f 0a 73 74 61  or state?.*/.sta
ba40: 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72  tic void pager_r
ba50: 65 73 65 74 28 50 61 67 65 72 20 2a 70 50 61 67  eset(Pager *pPag
ba60: 65 72 29 7b 0a 20 20 69 66 28 20 53 51 4c 49 54  er){.  if( SQLIT
ba70: 45 5f 4f 4b 3d 3d 70 50 61 67 65 72 2d 3e 65 72  E_OK==pPager->er
ba80: 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 73 71 6c  rCode ){.    sql
ba90: 69 74 65 33 42 61 63 6b 75 70 52 65 73 74 61 72  ite3BackupRestar
baa0: 74 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75  t(pPager->pBacku
bab0: 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  p);.    sqlite3P
bac0: 63 61 63 68 65 43 6c 65 61 72 28 70 50 61 67 65  cacheClear(pPage
bad0: 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 20  r->pPCache);.   
bae0: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56   pPager->dbSizeV
baf0: 61 6c 69 64 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  alid = 0;.  }.}.
bb00: 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20  ./*.** Free all 
bb10: 73 74 72 75 63 74 75 72 65 73 20 69 6e 20 74 68  structures in th
bb20: 65 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69  e Pager.aSavepoi
bb30: 6e 74 5b 5d 20 61 72 72 61 79 20 61 6e 64 20 73  nt[] array and s
bb40: 65 74 20 62 6f 74 68 0a 2a 2a 20 50 61 67 65 72  et both.** Pager
bb50: 2e 61 53 61 76 65 70 6f 69 6e 74 20 61 6e 64 20  .aSavepoint and 
bb60: 50 61 67 65 72 2e 6e 53 61 76 65 70 6f 69 6e 74  Pager.nSavepoint
bb70: 20 74 6f 20 7a 65 72 6f 2e 20 43 6c 6f 73 65 20   to zero. Close 
bb80: 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a  the sub-journal.
bb90: 2a 2a 20 69 66 20 69 74 20 69 73 20 6f 70 65 6e  ** if it is open
bba0: 20 61 6e 64 20 74 68 65 20 70 61 67 65 72 20 69   and the pager i
bbb0: 73 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69  s not in exclusi
bbc0: 76 65 20 6d 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  ve mode..*/.stat
bbd0: 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 41  ic void releaseA
bbe0: 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28 50 61 67  llSavepoints(Pag
bbf0: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
bc00: 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  nt ii;          
bc10: 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
bc20: 20 66 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72   for looping thr
bc30: 6f 75 67 68 20 50 61 67 65 72 2e 61 53 61 76 65  ough Pager.aSave
bc40: 70 6f 69 6e 74 20 2a 2f 0a 20 20 66 6f 72 28 69  point */.  for(i
bc50: 69 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e  i=0; ii<pPager->
bc60: 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b  nSavepoint; ii++
bc70: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69  ){.    sqlite3Bi
bc80: 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67  tvecDestroy(pPag
bc90: 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69  er->aSavepoint[i
bca0: 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 29  i].pInSavepoint)
bcb0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61  ;.  }.  if( !pPa
bcc0: 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
bcd0: 64 65 20 7c 7c 20 73 71 6c 69 74 65 33 49 73 4d  de || sqlite3IsM
bce0: 65 6d 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  emJournal(pPager
bcf0: 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 73  ->sjfd) ){.    s
bd00: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
bd10: 61 67 65 72 2d 3e 73 6a 66 64 29 3b 0a 20 20 7d  ager->sjfd);.  }
bd20: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
bd30: 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
bd40: 6e 74 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61  nt);.  pPager->a
bd50: 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20  Savepoint = 0;. 
bd60: 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f   pPager->nSavepo
bd70: 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  int = 0;.  pPage
bd80: 72 2d 3e 6e 53 75 62 52 65 63 20 3d 20 30 3b 0a  r->nSubRec = 0;.
bd90: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
bda0: 20 62 69 74 20 6e 75 6d 62 65 72 20 70 67 6e 6f   bit number pgno
bdb0: 20 69 6e 20 74 68 65 20 50 61 67 65 72 53 61 76   in the PagerSav
bdc0: 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f  epoint.pInSavepo
bdd0: 69 6e 74 20 0a 2a 2a 20 62 69 74 76 65 63 73 20  int .** bitvecs 
bde0: 6f 66 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65  of all open save
bdf0: 70 6f 69 6e 74 73 2e 20 52 65 74 75 72 6e 20 53  points. Return S
be00: 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63  QLITE_OK if succ
be10: 65 73 73 66 75 6c 0a 2a 2a 20 6f 72 20 53 51 4c  essful.** or SQL
be20: 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d  ITE_NOMEM if a m
be30: 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f 63  alloc failure oc
be40: 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  curs..*/.static 
be50: 69 6e 74 20 61 64 64 54 6f 53 61 76 65 70 6f 69  int addToSavepoi
be60: 6e 74 42 69 74 76 65 63 73 28 50 61 67 65 72 20  ntBitvecs(Pager 
be70: 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67  *pPager, Pgno pg
be80: 6e 6f 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20  no){.  int ii;  
be90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bea0: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
beb0: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
bec0: 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
bed0: 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a  /* Result code *
bee0: 2f 0a 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  /..  for(ii=0; i
bef0: 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70  i<pPager->nSavep
bf00: 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  oint; ii++){.   
bf10: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
bf20: 2a 70 20 3d 20 26 70 50 61 67 65 72 2d 3e 61 53  *p = &pPager->aS
bf30: 61 76 65 70 6f 69 6e 74 5b 69 69 5d 3b 0a 20 20  avepoint[ii];.  
bf40: 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 2d 3e 6e    if( pgno<=p->n
bf50: 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20 72 63  Orig ){.      rc
bf60: 20 7c 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65   |= sqlite3Bitve
bf70: 63 53 65 74 28 70 2d 3e 70 49 6e 53 61 76 65 70  cSet(p->pInSavep
bf80: 6f 69 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 20  oint, pgno);.   
bf90: 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 3d     testcase( rc=
bfa0: 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b  =SQLITE_NOMEM );
bfb0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72  .      assert( r
bfc0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
bfd0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
bfe0: 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   );.    }.  }.  
bff0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
c000: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
c010: 69 66 20 74 68 69 73 20 70 61 67 65 72 20 75 73  if this pager us
c020: 65 73 20 61 20 77 72 69 74 65 2d 61 68 65 61 64  es a write-ahead
c030: 20 6c 6f 67 20 69 6e 73 74 65 61 64 20 6f 66 20   log instead of 
c040: 74 68 65 20 75 73 75 61 6c 0a 2a 2a 20 72 6f 6c  the usual.** rol
c050: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 4f  lback journal. O
c060: 74 68 65 72 77 69 73 65 20 66 61 6c 73 65 2e 0a  therwise false..
c070: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
c080: 45 5f 4f 4d 49 54 5f 57 41 4c 0a 73 74 61 74 69  E_OMIT_WAL.stati
c090: 63 20 69 6e 74 20 70 61 67 65 72 55 73 65 57 61  c int pagerUseWa
c0a0: 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  l(Pager *pPager)
c0b0: 7b 0a 20 20 72 65 74 75 72 6e 20 28 70 50 61 67  {.  return (pPag
c0c0: 65 72 2d 3e 70 57 61 6c 21 3d 30 29 3b 0a 7d 0a  er->pWal!=0);.}.
c0d0: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70  #else.# define p
c0e0: 61 67 65 72 55 73 65 57 61 6c 28 78 29 20 30 0a  agerUseWal(x) 0.
c0f0: 23 20 64 65 66 69 6e 65 20 70 61 67 65 72 52 6f  # define pagerRo
c100: 6c 6c 62 61 63 6b 57 61 6c 28 78 29 20 30 0a 23  llbackWal(x) 0.#
c110: 20 64 65 66 69 6e 65 20 70 61 67 65 72 57 61 6c   define pagerWal
c120: 46 72 61 6d 65 73 28 76 2c 77 2c 78 2c 79 2c 7a  Frames(v,w,x,y,z
c130: 29 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67  ) 0.# define pag
c140: 65 72 4f 70 65 6e 57 61 6c 49 66 50 72 65 73 65  erOpenWalIfPrese
c150: 6e 74 28 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a  nt(z) SQLITE_OK.
c160: 23 20 64 65 66 69 6e 65 20 70 61 67 65 72 42 65  # define pagerBe
c170: 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69  ginReadTransacti
c180: 6f 6e 28 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a  on(z) SQLITE_OK.
c190: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 55 6e  #endif../*.** Un
c1a0: 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73  lock the databas
c1b0: 65 20 66 69 6c 65 2e 20 54 68 69 73 20 66 75 6e  e file. This fun
c1c0: 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
c1d0: 20 69 66 20 74 68 65 20 70 61 67 65 72 0a 2a 2a   if the pager.**
c1e0: 20 69 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65   is in exclusive
c1f0: 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   mode..**.** If 
c200: 74 68 65 20 70 61 67 65 72 20 69 73 20 63 75 72  the pager is cur
c210: 72 65 6e 74 6c 79 20 69 6e 20 65 72 72 6f 72 20  rently in error 
c220: 73 74 61 74 65 2c 20 64 69 73 63 61 72 64 20 74  state, discard t
c230: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 0a  he contents of .
c240: 2a 2a 20 74 68 65 20 63 61 63 68 65 20 61 6e 64  ** the cache and
c250: 20 72 65 73 65 74 20 74 68 65 20 50 61 67 65 72   reset the Pager
c260: 20 73 74 72 75 63 74 75 72 65 20 69 6e 74 65 72   structure inter
c270: 6e 61 6c 20 73 74 61 74 65 2e 20 49 66 20 74 68  nal state. If th
c280: 65 72 65 20 69 73 0a 2a 2a 20 61 6e 20 6f 70 65  ere is.** an ope
c290: 6e 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 2c 20  n journal-file, 
c2a0: 74 68 65 6e 20 74 68 65 20 6e 65 78 74 20 74 69  then the next ti
c2b0: 6d 65 20 61 20 73 68 61 72 65 64 2d 6c 6f 63 6b  me a shared-lock
c2c0: 20 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20   is obtained.** 
c2d0: 6f 6e 20 74 68 65 20 70 61 67 65 72 20 66 69 6c  on the pager fil
c2e0: 65 20 28 62 79 20 74 68 69 73 20 6f 72 20 61 6e  e (by this or an
c2f0: 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 29  y other process)
c300: 2c 20 69 74 20 77 69 6c 6c 20 62 65 0a 2a 2a 20  , it will be.** 
c310: 74 72 65 61 74 65 64 20 61 73 20 61 20 68 6f 74  treated as a hot
c320: 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 72 6f 6c  -journal and rol
c330: 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61  led back..*/.sta
c340: 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 75  tic void pager_u
c350: 6e 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61  nlock(Pager *pPa
c360: 67 65 72 29 7b 0a 20 20 69 66 28 20 21 70 50 61  ger){.  if( !pPa
c370: 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
c380: 64 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  de ){.    int rc
c390: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
c3a0: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
c3b0: 20 63 6f 64 65 20 2a 2f 0a 20 20 20 20 69 6e 74   code */.    int
c3c0: 20 69 44 63 20 3d 20 69 73 4f 70 65 6e 28 70 50   iDc = isOpen(pP
c3d0: 61 67 65 72 2d 3e 66 64 29 3f 73 71 6c 69 74 65  ager->fd)?sqlite
c3e0: 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
c3f0: 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
c400: 3e 66 64 29 3a 30 3b 0a 0a 20 20 20 20 2f 2a 20  >fd):0;..    /* 
c410: 49 66 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67  If the operating
c420: 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20   system support 
c430: 64 65 6c 65 74 69 6f 6e 20 6f 66 20 6f 70 65 6e  deletion of open
c440: 20 66 69 6c 65 73 2c 20 74 68 65 6e 0a 20 20 20   files, then.   
c450: 20 2a 2a 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f   ** close the jo
c460: 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20  urnal file when 
c470: 64 72 6f 70 70 69 6e 67 20 74 68 65 20 64 61 74  dropping the dat
c480: 61 62 61 73 65 20 6c 6f 63 6b 2e 20 20 4f 74 68  abase lock.  Oth
c490: 65 72 77 69 73 65 0a 20 20 20 20 2a 2a 20 61 6e  erwise.    ** an
c4a0: 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
c4b0: 20 77 69 74 68 20 6a 6f 75 72 6e 61 6c 5f 6d 6f   with journal_mo
c4c0: 64 65 3d 64 65 6c 65 74 65 20 6d 69 67 68 74 20  de=delete might 
c4d0: 64 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65 0a  delete the file.
c4e0: 20 20 20 20 2a 2a 20 6f 75 74 20 66 72 6f 6d 20      ** out from 
c4f0: 75 6e 64 65 72 20 75 73 2e 0a 20 20 20 20 2a 2f  under us..    */
c500: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41  .    assert( (PA
c510: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
c520: 4d 45 4d 4f 52 59 20 20 20 26 20 35 29 21 3d 31  MEMORY   & 5)!=1
c530: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
c540: 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  (PAGER_JOURNALMO
c550: 44 45 5f 4f 46 46 20 20 20 20 20 20 26 20 35 29  DE_OFF      & 5)
c560: 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=1 );.    asser
c570: 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41  t( (PAGER_JOURNA
c580: 4c 4d 4f 44 45 5f 57 41 4c 20 20 20 20 20 20 26  LMODE_WAL      &
c590: 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73   5)!=1 );.    as
c5a0: 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55  sert( (PAGER_JOU
c5b0: 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20  RNALMODE_DELETE 
c5c0: 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20    & 5)!=1 );.   
c5d0: 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f   assert( (PAGER_
c5e0: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e  JOURNALMODE_TRUN
c5f0: 43 41 54 45 20 26 20 35 29 3d 3d 31 20 29 3b 0a  CATE & 5)==1 );.
c600: 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47      assert( (PAG
c610: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50  ER_JOURNALMODE_P
c620: 45 52 53 49 53 54 20 20 26 20 35 29 3d 3d 31 20  ERSIST  & 5)==1 
c630: 29 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 69  );.    if( 0==(i
c640: 44 63 20 26 20 53 51 4c 49 54 45 5f 49 4f 43 41  Dc & SQLITE_IOCA
c650: 50 5f 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48  P_UNDELETABLE_WH
c660: 45 4e 5f 4f 50 45 4e 29 0a 20 20 20 20 20 7c 7c  EN_OPEN).     ||
c670: 20 31 21 3d 28 70 50 61 67 65 72 2d 3e 6a 6f 75   1!=(pPager->jou
c680: 72 6e 61 6c 4d 6f 64 65 20 26 20 35 29 0a 20 20  rnalMode & 5).  
c690: 20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74    ){.      sqlit
c6a0: 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
c6b0: 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 0a 0a 20  ->jfd);.    }.. 
c6c0: 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63     sqlite3Bitvec
c6d0: 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e  Destroy(pPager->
c6e0: 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  pInJournal);.   
c6f0: 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
c700: 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 72 65 6c  nal = 0;.    rel
c710: 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74  easeAllSavepoint
c720: 73 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 20 20  s(pPager);..    
c730: 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 69  /* If the file i
c740: 73 20 75 6e 6c 6f 63 6b 65 64 2c 20 73 6f 6d 65  s unlocked, some
c750: 62 6f 64 79 20 65 6c 73 65 20 6d 69 67 68 74 20  body else might 
c760: 63 68 61 6e 67 65 20 69 74 2e 20 54 68 65 0a 20  change it. The. 
c770: 20 20 20 2a 2a 20 76 61 6c 75 65 73 20 73 74 6f     ** values sto
c780: 72 65 64 20 69 6e 20 50 61 67 65 72 2e 64 62 53  red in Pager.dbS
c790: 69 7a 65 20 65 74 63 2e 20 6d 69 67 68 74 20 62  ize etc. might b
c7a0: 65 63 6f 6d 65 20 69 6e 76 61 6c 69 64 20 69 66  ecome invalid if
c7b0: 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 68 61 70  .    ** this hap
c7c0: 70 65 6e 73 2e 20 20 4f 6e 65 20 63 61 6e 20 61  pens.  One can a
c7d0: 72 67 75 65 20 74 68 61 74 20 74 68 69 73 20 64  rgue that this d
c7e0: 6f 65 73 6e 27 74 20 6e 65 65 64 20 74 6f 20 62  oesn't need to b
c7f0: 65 20 63 6c 65 61 72 65 64 0a 20 20 20 20 2a 2a  e cleared.    **
c800: 20 75 6e 74 69 6c 20 74 68 65 20 63 68 61 6e 67   until the chang
c810: 65 2d 63 6f 75 6e 74 65 72 20 63 68 65 63 6b 20  e-counter check 
c820: 66 61 69 6c 73 20 69 6e 20 50 61 67 65 72 53 68  fails in PagerSh
c830: 61 72 65 64 4c 6f 63 6b 28 29 2e 0a 20 20 20 20  aredLock()..    
c840: 2a 2a 20 43 6c 65 61 72 69 6e 67 20 74 68 65 20  ** Clearing the 
c850: 70 61 67 65 20 73 69 7a 65 20 63 61 63 68 65 20  page size cache 
c860: 68 65 72 65 20 69 73 20 62 65 69 6e 67 20 63 6f  here is being co
c870: 6e 73 65 72 76 61 74 69 76 65 2e 0a 20 20 20 20  nservative..    
c880: 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  */.    pPager->d
c890: 62 53 69 7a 65 56 61 6c 69 64 20 3d 20 30 3b 0a  bSizeValid = 0;.
c8a0: 0a 20 20 20 20 69 66 28 20 70 61 67 65 72 55 73  .    if( pagerUs
c8b0: 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
c8c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c        sqlite3Wal
c8d0: 45 6e 64 52 65 61 64 54 72 61 6e 73 61 63 74 69  EndReadTransacti
c8e0: 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29  on(pPager->pWal)
c8f0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
c900: 20 20 20 72 63 20 3d 20 6f 73 55 6e 6c 6f 63 6b     rc = osUnlock
c910: 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f  (pPager->fd, NO_
c920: 4c 4f 43 4b 29 3b 0a 20 20 20 20 7d 0a 20 20 20  LOCK);.    }.   
c930: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
c940: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
c950: 20 3d 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20   = rc;.    }.   
c960: 20 49 4f 54 52 41 43 45 28 28 22 55 4e 4c 4f 43   IOTRACE(("UNLOC
c970: 4b 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29  K %p\n", pPager)
c980: 29 0a 0a 20 20 20 20 2f 2a 20 49 66 20 50 61 67  )..    /* If Pag
c990: 65 72 2e 65 72 72 43 6f 64 65 20 69 73 20 73 65  er.errCode is se
c9a0: 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  t, the contents 
c9b0: 6f 66 20 74 68 65 20 70 61 67 65 72 20 63 61 63  of the pager cac
c9c0: 68 65 20 63 61 6e 6e 6f 74 20 62 65 0a 20 20 20  he cannot be.   
c9d0: 20 2a 2a 20 74 72 75 73 74 65 64 2e 20 4e 6f 77   ** trusted. Now
c9e0: 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20   that the pager 
c9f0: 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64  file is unlocked
ca00: 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  , the contents o
ca10: 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 61 63  f the.    ** cac
ca20: 68 65 20 63 61 6e 20 62 65 20 64 69 73 63 61 72  he can be discar
ca30: 64 65 64 20 61 6e 64 20 74 68 65 20 65 72 72 6f  ded and the erro
ca40: 72 20 63 6f 64 65 20 73 61 66 65 6c 79 20 63 6c  r code safely cl
ca50: 65 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  eared..    */.  
ca60: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
ca70: 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 69  rCode ){.      i
ca80: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
ca90: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67   ){.        pPag
caa0: 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 53 51  er->errCode = SQ
cab0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
cac0: 0a 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73  .      pager_res
cad0: 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  et(pPager);.    
cae0: 7d 0a 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63  }..    pPager->c
caf0: 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
cb00: 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
cb10: 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e  state = PAGER_UN
cb20: 4c 4f 43 4b 3b 0a 20 20 20 20 70 50 61 67 65 72  LOCK;.    pPager
cb30: 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d 20 30  ->dbModified = 0
cb40: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
cb50: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f  his function sho
cb60: 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 77 68  uld be called wh
cb70: 65 6e 20 61 6e 20 49 4f 45 52 52 2c 20 43 4f 52  en an IOERR, COR
cb80: 52 55 50 54 20 6f 72 20 46 55 4c 4c 20 65 72 72  RUPT or FULL err
cb90: 6f 72 0a 2a 2a 20 6d 61 79 20 68 61 76 65 20 6f  or.** may have o
cba0: 63 63 75 72 72 65 64 2e 20 54 68 65 20 66 69 72  ccurred. The fir
cbb0: 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  st argument is a
cbc0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
cbd0: 70 61 67 65 72 20 0a 2a 2a 20 73 74 72 75 63 74  pager .** struct
cbe0: 75 72 65 2c 20 74 68 65 20 73 65 63 6f 6e 64 20  ure, the second 
cbf0: 74 68 65 20 65 72 72 6f 72 2d 63 6f 64 65 20 61  the error-code a
cc00: 62 6f 75 74 20 74 6f 20 62 65 20 72 65 74 75 72  bout to be retur
cc10: 6e 65 64 20 62 79 20 61 20 70 61 67 65 72 20 0a  ned by a pager .
cc20: 2a 2a 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e  ** API function.
cc30: 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
cc40: 6e 65 64 20 69 73 20 61 20 63 6f 70 79 20 6f 66  ned is a copy of
cc50: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
cc60: 6d 65 6e 74 20 0a 2a 2a 20 74 6f 20 74 68 69 73  ment .** to this
cc70: 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a   function. .**.*
cc80: 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20  * If the second 
cc90: 61 72 67 75 6d 65 6e 74 20 69 73 20 53 51 4c 49  argument is SQLI
cca0: 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54 45  TE_IOERR, SQLITE
ccb0: 5f 43 4f 52 52 55 50 54 2c 20 6f 72 20 53 51 4c  _CORRUPT, or SQL
ccc0: 49 54 45 5f 46 55 4c 4c 0a 2a 2a 20 74 68 65 20  ITE_FULL.** the 
ccd0: 65 72 72 6f 72 20 62 65 63 6f 6d 65 73 20 70 65  error becomes pe
cce0: 72 73 69 73 74 65 6e 74 2e 20 55 6e 74 69 6c 20  rsistent. Until 
ccf0: 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 65  the persistent e
cd00: 72 72 6f 72 20 69 73 20 63 6c 65 61 72 65 64 2c  rror is cleared,
cd10: 0a 2a 2a 20 73 75 62 73 65 71 75 65 6e 74 20 41  .** subsequent A
cd20: 50 49 20 63 61 6c 6c 73 20 6f 6e 20 74 68 69 73  PI calls on this
cd30: 20 50 61 67 65 72 20 77 69 6c 6c 20 69 6d 6d 65   Pager will imme
cd40: 64 69 61 74 65 6c 79 20 72 65 74 75 72 6e 20 74  diately return t
cd50: 68 65 20 73 61 6d 65 20 0a 2a 2a 20 65 72 72 6f  he same .** erro
cd60: 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 20  r code..**.** A 
cd70: 70 65 72 73 69 73 74 65 6e 74 20 65 72 72 6f 72  persistent error
cd80: 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
cd90: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
cda0: 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20  the pager-cache 
cdb0: 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 74 72  .** cannot be tr
cdc0: 75 73 74 65 64 2e 20 54 68 69 73 20 73 74 61 74  usted. This stat
cdd0: 65 20 63 61 6e 20 62 65 20 63 6c 65 61 72 65 64  e can be cleared
cde0: 20 62 79 20 63 6f 6d 70 6c 65 74 65 6c 79 20 64   by completely d
cdf0: 69 73 63 61 72 64 69 6e 67 20 0a 2a 2a 20 74 68  iscarding .** th
ce00: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
ce10: 65 20 70 61 67 65 72 2d 63 61 63 68 65 2e 20 49  e pager-cache. I
ce20: 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
ce30: 77 61 73 20 61 63 74 69 76 65 20 77 68 65 6e 0a  was active when.
ce40: 2a 2a 20 74 68 65 20 70 65 72 73 69 73 74 65 6e  ** the persisten
ce50: 74 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  t error occurred
ce60: 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c 62  , then the rollb
ce70: 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20  ack journal may 
ce80: 6e 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 72 65  need.** to be re
ce90: 70 6c 61 79 65 64 20 74 6f 20 72 65 73 74 6f 72  played to restor
cea0: 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  e the contents o
ceb0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
cec0: 69 6c 65 20 28 61 73 20 69 66 0a 2a 2a 20 69 74  ile (as if.** it
ced0: 20 77 65 72 65 20 61 20 68 6f 74 2d 6a 6f 75 72   were a hot-jour
cee0: 6e 61 6c 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nal)..*/.static 
cef0: 69 6e 74 20 70 61 67 65 72 5f 65 72 72 6f 72 28  int pager_error(
cf00: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
cf10: 6e 74 20 72 63 29 7b 0a 20 20 69 6e 74 20 72 63  nt rc){.  int rc
cf20: 32 20 3d 20 72 63 20 26 20 30 78 66 66 3b 0a 20  2 = rc & 0xff;. 
cf30: 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
cf40: 49 54 45 5f 4f 4b 20 7c 7c 20 21 4d 45 4d 44 42  ITE_OK || !MEMDB
cf50: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 0a 20 20   );.  assert(.  
cf60: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72       pPager->err
cf70: 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46 55 4c  Code==SQLITE_FUL
cf80: 4c 20 7c 7c 0a 20 20 20 20 20 20 20 70 50 61 67  L ||.       pPag
cf90: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
cfa0: 49 54 45 5f 4f 4b 20 7c 7c 0a 20 20 20 20 20 20  ITE_OK ||.      
cfb0: 20 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64   (pPager->errCod
cfc0: 65 20 26 20 30 78 66 66 29 3d 3d 53 51 4c 49 54  e & 0xff)==SQLIT
cfd0: 45 5f 49 4f 45 52 52 0a 20 20 29 3b 0a 20 20 69  E_IOERR.  );.  i
cfe0: 66 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 46  f( rc2==SQLITE_F
cff0: 55 4c 4c 20 7c 7c 20 72 63 32 3d 3d 53 51 4c 49  ULL || rc2==SQLI
d000: 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20  TE_IOERR ){.    
d010: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
d020: 3d 20 72 63 3b 0a 20 20 7d 0a 20 20 72 65 74 75  = rc;.  }.  retu
d030: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
d040: 45 78 65 63 75 74 65 20 61 20 72 6f 6c 6c 62 61  Execute a rollba
d050: 63 6b 20 69 66 20 61 20 74 72 61 6e 73 61 63 74  ck if a transact
d060: 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e  ion is active an
d070: 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 2a 2a  d unlock the .**
d080: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
d090: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
d0a0: 67 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20  ger has already 
d0b0: 65 6e 74 65 72 65 64 20 74 68 65 20 65 72 72 6f  entered the erro
d0c0: 72 20 73 74 61 74 65 2c 20 64 6f 20 6e 6f 74 20  r state, do not 
d0d0: 61 74 74 65 6d 70 74 20 0a 2a 2a 20 74 68 65 20  attempt .** the 
d0e0: 72 6f 6c 6c 62 61 63 6b 20 61 74 20 74 68 69 73  rollback at this
d0f0: 20 74 69 6d 65 2e 20 49 6e 73 74 65 61 64 2c 20   time. Instead, 
d100: 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 69  pager_unlock() i
d110: 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 0a 2a 2a  s called. The.**
d120: 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75   call to pager_u
d130: 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c 20 64 69 73  nlock() will dis
d140: 63 61 72 64 20 61 6c 6c 20 69 6e 2d 6d 65 6d 6f  card all in-memo
d150: 72 79 20 70 61 67 65 73 2c 20 75 6e 6c 6f 63 6b  ry pages, unlock
d160: 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
d170: 20 66 69 6c 65 20 61 6e 64 20 63 6c 65 61 72 20   file and clear 
d180: 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2e  the error state.
d190: 20 49 66 20 74 68 69 73 20 6d 65 61 6e 73 20 74   If this means t
d1a0: 68 61 74 0a 2a 2a 20 74 68 65 72 65 20 69 73 20  hat.** there is 
d1b0: 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 6c 65  a hot-journal le
d1c0: 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73  ft in the file-s
d1d0: 79 73 74 65 6d 2c 20 74 68 65 20 6e 65 78 74 20  ystem, the next 
d1e0: 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 74 6f  connection.** to
d1f0: 20 6f 62 74 61 69 6e 20 61 20 73 68 61 72 65 64   obtain a shared
d200: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 70 61 67   lock on the pag
d210: 65 72 20 28 77 68 69 63 68 20 6d 61 79 20 62 65  er (which may be
d220: 20 74 68 69 73 20 6f 6e 65 29 20 77 69 6c 6c 0a   this one) will.
d230: 2a 2a 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e  ** roll it back.
d240: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
d250: 67 65 72 20 68 61 73 20 6e 6f 74 20 61 6c 72 65  ger has not alre
d260: 61 64 79 20 65 6e 74 65 72 65 64 20 74 68 65 20  ady entered the 
d270: 65 72 72 6f 72 20 73 74 61 74 65 2c 20 62 75 74  error state, but
d280: 20 61 6e 20 49 4f 20 6f 72 0a 2a 2a 20 6d 61 6c   an IO or.** mal
d290: 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63 75 72 73  loc error occurs
d2a0: 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61   during a rollba
d2b0: 63 6b 2c 20 74 68 65 6e 20 74 68 69 73 20 77 69  ck, then this wi
d2c0: 6c 6c 20 69 74 73 65 6c 66 20 63 61 75 73 65 20  ll itself cause 
d2d0: 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20 74 6f  .** the pager to
d2e0: 20 65 6e 74 65 72 20 74 68 65 20 65 72 72 6f 72   enter the error
d2f0: 20 73 74 61 74 65 2e 20 57 68 69 63 68 20 77 69   state. Which wi
d300: 6c 6c 20 62 65 20 63 6c 65 61 72 65 64 20 62 79  ll be cleared by
d310: 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20   the.** call to 
d320: 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 2c 20  pager_unlock(), 
d330: 61 73 20 64 65 73 63 72 69 62 65 64 20 61 62 6f  as described abo
d340: 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ve..*/.static vo
d350: 69 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e  id pagerUnlockAn
d360: 64 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20  dRollback(Pager 
d370: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20  *pPager){.  if( 
d380: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d  pPager->errCode=
d390: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50  =SQLITE_OK && pP
d3a0: 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
d3b0: 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20  ER_RESERVED ){. 
d3c0: 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42     sqlite3BeginB
d3d0: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
d3e0: 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52     sqlite3PagerR
d3f0: 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
d400: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42  .    sqlite3EndB
d410: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
d420: 20 7d 0a 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63   }.  pager_unloc
d430: 6b 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a  k(pPager);.}../*
d440: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
d450: 20 65 6e 64 73 20 61 20 74 72 61 6e 73 61 63 74   ends a transact
d460: 69 6f 6e 2e 20 41 20 74 72 61 6e 73 61 63 74 69  ion. A transacti
d470: 6f 6e 20 69 73 20 75 73 75 61 6c 6c 79 20 65 6e  on is usually en
d480: 64 65 64 20 62 79 20 0a 2a 2a 20 65 69 74 68 65  ded by .** eithe
d490: 72 20 61 20 43 4f 4d 4d 49 54 20 6f 72 20 61 20  r a COMMIT or a 
d4a0: 52 4f 4c 4c 42 41 43 4b 20 6f 70 65 72 61 74 69  ROLLBACK operati
d4b0: 6f 6e 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65  on. This routine
d4c0: 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 0a   may be called .
d4d0: 2a 2a 20 61 66 74 65 72 20 72 6f 6c 6c 62 61 63  ** after rollbac
d4e0: 6b 20 6f 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  k of a hot-journ
d4f0: 61 6c 2c 20 6f 72 20 69 66 20 61 6e 20 65 72 72  al, or if an err
d500: 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
d510: 6f 70 65 6e 69 6e 67 0a 2a 2a 20 74 68 65 20 6a  opening.** the j
d520: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 77  ournal file or w
d530: 72 69 74 69 6e 67 20 74 68 65 20 76 65 72 79 20  riting the very 
d540: 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65  first journal-he
d550: 61 64 65 72 20 6f 66 20 61 0a 2a 2a 20 64 61 74  ader of a.** dat
d560: 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f  abase transactio
d570: 6e 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65  n..** .** If the
d580: 20 70 61 67 65 72 20 69 73 20 69 6e 20 50 41 47   pager is in PAG
d590: 45 52 5f 53 48 41 52 45 44 20 6f 72 20 50 41 47  ER_SHARED or PAG
d5a0: 45 52 5f 55 4e 4c 4f 43 4b 20 73 74 61 74 65 20  ER_UNLOCK state 
d5b0: 77 68 65 6e 20 74 68 69 73 0a 2a 2a 20 72 6f 75  when this.** rou
d5c0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
d5d0: 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 20 28 72  it is a no-op (r
d5e0: 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b  eturns SQLITE_OK
d5f0: 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  )..**.** Otherwi
d600: 73 65 2c 20 61 6e 79 20 61 63 74 69 76 65 20 73  se, any active s
d610: 61 76 65 70 6f 69 6e 74 73 20 61 72 65 20 72 65  avepoints are re
d620: 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  leased..**.** If
d630: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
d640: 65 20 69 73 20 6f 70 65 6e 2c 20 74 68 65 6e 20  e is open, then 
d650: 69 74 20 69 73 20 22 66 69 6e 61 6c 69 7a 65 64  it is "finalized
d660: 22 2e 20 4f 6e 63 65 20 61 20 6a 6f 75 72 6e 61  ". Once a journa
d670: 6c 20 0a 2a 2a 20 66 69 6c 65 20 68 61 73 20 62  l .** file has b
d680: 65 65 6e 20 66 69 6e 61 6c 69 7a 65 64 20 69 74  een finalized it
d690: 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
d6a0: 20 74 6f 20 75 73 65 20 69 74 20 74 6f 20 72 6f   to use it to ro
d6b0: 6c 6c 20 62 61 63 6b 20 61 20 0a 2a 2a 20 74 72  ll back a .** tr
d6c0: 61 6e 73 61 63 74 69 6f 6e 2e 20 4e 6f 72 20 77  ansaction. Nor w
d6d0: 69 6c 6c 20 69 74 20 62 65 20 63 6f 6e 73 69 64  ill it be consid
d6e0: 65 72 65 64 20 74 6f 20 62 65 20 61 20 68 6f 74  ered to be a hot
d6f0: 2d 6a 6f 75 72 6e 61 6c 20 62 79 20 74 68 69 73  -journal by this
d700: 0a 2a 2a 20 6f 72 20 61 6e 79 20 6f 74 68 65 72  .** or any other
d710: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
d720: 74 69 6f 6e 2e 20 45 78 61 63 74 6c 79 20 68 6f  tion. Exactly ho
d730: 77 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 66  w a journal is f
d740: 69 6e 61 6c 69 7a 65 64 0a 2a 2a 20 64 65 70 65  inalized.** depe
d750: 6e 64 73 20 6f 6e 20 77 68 65 74 68 65 72 20 6f  nds on whether o
d760: 72 20 6e 6f 74 20 74 68 65 20 70 61 67 65 72 20  r not the pager 
d770: 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78  is running in ex
d780: 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 61 6e 64  clusive mode and
d790: 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20  .** the current 
d7a0: 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 28 50 61  journal-mode (Pa
d7b0: 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20  ger.journalMode 
d7c0: 76 61 6c 75 65 29 2c 20 61 73 20 66 6f 6c 6c 6f  value), as follo
d7d0: 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72  ws:.**.**   jour
d7e0: 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59 0a  nalMode==MEMORY.
d7f0: 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66  **     Journal f
d800: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
d810: 73 20 73 69 6d 70 6c 79 20 63 6c 6f 73 65 64 2e  s simply closed.
d820: 20 54 68 69 73 20 64 65 73 74 72 6f 79 73 20 61   This destroys a
d830: 6e 20 0a 2a 2a 20 20 20 20 20 69 6e 2d 6d 65 6d  n .**     in-mem
d840: 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  ory journal..**.
d850: 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65  **   journalMode
d860: 3d 3d 54 52 55 4e 43 41 54 45 0a 2a 2a 20 20 20  ==TRUNCATE.**   
d870: 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69    Journal file i
d880: 73 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a  s truncated to z
d890: 65 72 6f 20 62 79 74 65 73 20 69 6e 20 73 69 7a  ero bytes in siz
d8a0: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e  e..**.**   journ
d8b0: 61 6c 4d 6f 64 65 3d 3d 50 45 52 53 49 53 54 0a  alMode==PERSIST.
d8c0: 2a 2a 20 20 20 20 20 54 68 65 20 66 69 72 73 74  **     The first
d8d0: 20 32 38 20 62 79 74 65 73 20 6f 66 20 74 68 65   28 bytes of the
d8e0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 72   journal file ar
d8f0: 65 20 7a 65 72 6f 65 64 2e 20 54 68 69 73 20 69  e zeroed. This i
d900: 6e 76 61 6c 69 64 61 74 65 73 0a 2a 2a 20 20 20  nvalidates.**   
d910: 20 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72    the first jour
d920: 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 20 74 68  nal header in th
d930: 65 20 66 69 6c 65 2c 20 61 6e 64 20 68 65 6e 63  e file, and henc
d940: 65 20 74 68 65 20 65 6e 74 69 72 65 20 6a 6f 75  e the entire jou
d950: 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65  rnal.**     file
d960: 2e 20 41 6e 20 69 6e 76 61 6c 69 64 20 6a 6f 75  . An invalid jou
d970: 72 6e 61 6c 20 66 69 6c 65 20 63 61 6e 6e 6f 74  rnal file cannot
d980: 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   be rolled back.
d990: 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c  .**.**   journal
d9a0: 4d 6f 64 65 3d 3d 44 45 4c 45 54 45 0a 2a 2a 20  Mode==DELETE.** 
d9b0: 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20      The journal 
d9c0: 66 69 6c 65 20 69 73 20 63 6c 6f 73 65 64 20 61  file is closed a
d9d0: 6e 64 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67  nd deleted using
d9e0: 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
d9f0: 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 49 66  ()..**.**     If
da00: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 72 75   the pager is ru
da10: 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69  nning in exclusi
da20: 76 65 20 6d 6f 64 65 2c 20 74 68 69 73 20 6d 65  ve mode, this me
da30: 74 68 6f 64 20 6f 66 20 66 69 6e 61 6c 69 7a 69  thod of finalizi
da40: 6e 67 0a 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f  ng.**     the jo
da50: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 65  urnal file is ne
da60: 76 65 72 20 75 73 65 64 2e 20 49 6e 73 74 65 61  ver used. Instea
da70: 64 2c 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61  d, if the journa
da80: 6c 4d 6f 64 65 20 69 73 0a 2a 2a 20 20 20 20 20  lMode is.**     
da90: 44 45 4c 45 54 45 20 61 6e 64 20 74 68 65 20 70  DELETE and the p
daa0: 61 67 65 72 20 69 73 20 69 6e 20 65 78 63 6c 75  ager is in exclu
dab0: 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 65 20 6d  sive mode, the m
dac0: 65 74 68 6f 64 20 64 65 73 63 72 69 62 65 64 20  ethod described 
dad0: 75 6e 64 65 72 0a 2a 2a 20 20 20 20 20 6a 6f 75  under.**     jou
dae0: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52 53 49 53  rnalMode==PERSIS
daf0: 54 20 69 73 20 75 73 65 64 20 69 6e 73 74 65 61  T is used instea
db00: 64 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74  d..**.** After t
db10: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 66 69  he journal is fi
db20: 6e 61 6c 69 7a 65 64 2c 20 69 66 20 72 75 6e 6e  nalized, if runn
db30: 69 6e 67 20 69 6e 20 6e 6f 6e 2d 65 78 63 6c 75  ing in non-exclu
db40: 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 65 0a 2a  sive mode, the.*
db50: 2a 20 70 61 67 65 72 20 6d 6f 76 65 73 20 74 6f  * pager moves to
db60: 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 73 74   PAGER_SHARED st
db70: 61 74 65 20 28 61 6e 64 20 64 6f 77 6e 67 72 61  ate (and downgra
db80: 64 65 73 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20  des the lock on 
db90: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
dba0: 66 69 6c 65 20 61 63 63 6f 72 64 69 6e 67 6c 79  file accordingly
dbb0: 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  )..**.** If the 
dbc0: 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67  pager is running
dbd0: 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
dbe0: 64 65 20 61 6e 64 20 69 73 20 69 6e 20 50 41 47  de and is in PAG
dbf0: 45 52 5f 53 59 4e 43 45 44 20 73 74 61 74 65 2c  ER_SYNCED state,
dc00: 0a 2a 2a 20 69 74 20 6d 6f 76 65 73 20 74 6f 20  .** it moves to 
dc10: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 2e  PAGER_EXCLUSIVE.
dc20: 20 4e 6f 20 6c 6f 63 6b 73 20 61 72 65 20 64 6f   No locks are do
dc30: 77 6e 67 72 61 64 65 64 20 77 68 65 6e 20 72 75  wngraded when ru
dc40: 6e 6e 69 6e 67 20 69 6e 0a 2a 2a 20 65 78 63 6c  nning in.** excl
dc50: 75 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a  usive mode..**.*
dc60: 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
dc70: 65 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72  eturned if no er
dc80: 72 6f 72 20 6f 63 63 75 72 73 2e 20 49 66 20 61  ror occurs. If a
dc90: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  n error occurs d
dca0: 75 72 69 6e 67 0a 2a 2a 20 61 6e 79 20 6f 66 20  uring.** any of 
dcb0: 74 68 65 20 49 4f 20 6f 70 65 72 61 74 69 6f 6e  the IO operation
dcc0: 73 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68  s to finalize th
dcd0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  e journal file o
dce0: 72 20 75 6e 6c 6f 63 6b 20 74 68 65 0a 2a 2a 20  r unlock the.** 
dcf0: 64 61 74 61 62 61 73 65 20 74 68 65 6e 20 74 68  database then th
dd00: 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  e IO error code 
dd10: 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74  is returned to t
dd20: 68 65 20 75 73 65 72 2e 20 49 66 20 74 68 65 20  he user. If the 
dd30: 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f  .** operation to
dd40: 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f   finalize the jo
dd50: 75 72 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c 73  urnal file fails
dd60: 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 64 65 20  , then the code 
dd70: 73 74 69 6c 6c 0a 2a 2a 20 74 72 69 65 73 20 74  still.** tries t
dd80: 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  o unlock the dat
dd90: 61 62 61 73 65 20 66 69 6c 65 20 69 66 20 6e 6f  abase file if no
dda0: 74 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  t in exclusive m
ddb0: 6f 64 65 2e 20 49 66 20 74 68 65 0a 2a 2a 20 75  ode. If the.** u
ddc0: 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20  nlock operation 
ddd0: 66 61 69 6c 73 20 61 73 20 77 65 6c 6c 2c 20 74  fails as well, t
dde0: 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 65 72  hen the first er
ddf0: 72 6f 72 20 63 6f 64 65 20 72 65 6c 61 74 65 64  ror code related
de00: 0a 2a 2a 20 74 6f 20 74 68 65 20 66 69 72 73 74  .** to the first
de10: 20 65 72 72 6f 72 20 65 6e 63 6f 75 6e 74 65 72   error encounter
de20: 65 64 20 28 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ed (the journal 
de30: 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 6e 65  finalization one
de40: 29 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64  ) is.** returned
de50: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
de60: 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61  pager_end_transa
de70: 63 74 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61  ction(Pager *pPa
de80: 67 65 72 2c 20 69 6e 74 20 68 61 73 4d 61 73 74  ger, int hasMast
de90: 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
dea0: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
deb0: 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 66 72  /* Error code fr
dec0: 6f 6d 20 6a 6f 75 72 6e 61 6c 20 66 69 6e 61 6c  om journal final
ded0: 69 7a 61 74 69 6f 6e 20 6f 70 65 72 61 74 69 6f  ization operatio
dee0: 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 32 20 3d  n */.  int rc2 =
def0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
df00: 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 66 72  /* Error code fr
df10: 6f 6d 20 64 62 20 66 69 6c 65 20 75 6e 6c 6f 63  om db file unloc
df20: 6b 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a  k operation */..
df30: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
df40: 61 74 65 3c 50 41 47 45 52 5f 52 45 53 45 52 56  ate<PAGER_RESERV
df50: 45 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ED ){.    return
df60: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
df70: 20 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65    releaseAllSave
df80: 70 6f 69 6e 74 73 28 70 50 61 67 65 72 29 3b 0a  points(pPager);.
df90: 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
dfa0: 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c  n(pPager->jfd) |
dfb0: 7c 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  | pPager->pInJou
dfc0: 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28  rnal==0 );.  if(
dfd0: 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
dfe0: 6a 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73 65  jfd) ){.    asse
dff0: 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  rt( !pagerUseWal
e000: 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 20  (pPager) );..   
e010: 20 2f 2a 20 46 69 6e 61 6c 69 7a 65 20 74 68 65   /* Finalize the
e020: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a   journal file. *
e030: 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  /.    if( sqlite
e040: 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70 50  3IsMemJournal(pP
e050: 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20  ager->jfd) ){.  
e060: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
e070: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
e080: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
e090: 44 45 5f 4d 45 4d 4f 52 59 20 29 3b 0a 20 20 20  DE_MEMORY );.   
e0a0: 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
e0b0: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
e0c0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50      }else if( pP
e0d0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
e0e0: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
e0f0: 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 29 7b  MODE_TRUNCATE ){
e100: 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
e110: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30  r->journalOff==0
e120: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
e130: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
e140: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
e150: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54   rc = sqlite3OsT
e160: 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e  runcate(pPager->
e170: 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  jfd, 0);.      }
e180: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
e190: 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
e1a0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
e1b0: 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b  rnalStarted = 0;
e1c0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
e1d0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
e1e0: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
e1f0: 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a 20 20  LMODE_PERSIST.  
e200: 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e      || (pPager->
e210: 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26  exclusiveMode &&
e220: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
e230: 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode!=PAGER_JOUR
e240: 4e 41 4c 4d 4f 44 45 5f 57 41 4c 29 0a 20 20 20  NALMODE_WAL).   
e250: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 7a   ){.      rc = z
e260: 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  eroJournalHdr(pP
e270: 61 67 65 72 2c 20 68 61 73 4d 61 73 74 65 72 29  ager, hasMaster)
e280: 3b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65 72  ;.      pager_er
e290: 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
e2a0: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
e2b0: 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
e2c0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
e2d0: 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b  rnalStarted = 0;
e2e0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
e2f0: 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68    /* This branch
e300: 20 6d 61 79 20 62 65 20 65 78 65 63 75 74 65 64   may be executed
e310: 20 77 69 74 68 20 50 61 67 65 72 2e 6a 6f 75 72   with Pager.jour
e320: 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59 20  nalMode==MEMORY 
e330: 69 66 0a 20 20 20 20 20 20 2a 2a 20 61 20 68 6f  if.      ** a ho
e340: 74 2d 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6a 75  t-journal was ju
e350: 73 74 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  st rolled back. 
e360: 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
e370: 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a   journal.      *
e380: 2a 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65  * file should be
e390: 20 63 6c 6f 73 65 64 20 61 6e 64 20 64 65 6c 65   closed and dele
e3a0: 74 65 64 2e 20 49 66 20 74 68 69 73 20 63 6f 6e  ted. If this con
e3b0: 6e 65 63 74 69 6f 6e 20 77 72 69 74 65 73 20 74  nection writes t
e3c0: 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64  o.      ** the d
e3d0: 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 74  atabase file, it
e3e0: 20 77 69 6c 6c 20 64 6f 20 73 6f 20 75 73 69 6e   will do so usin
e3f0: 67 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a  g an in-memory j
e400: 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 20 20 2a  ournal. .      *
e410: 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
e420: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
e430: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
e440: 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 0a 20  ALMODE_DELETE . 
e450: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61            || pPa
e460: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
e470: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
e480: 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 20  ODE_MEMORY .    
e490: 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72         || pPager
e4a0: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
e4b0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
e4c0: 5f 57 41 4c 20 0a 20 20 20 20 20 20 29 3b 0a 20  _WAL .      );. 
e4d0: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
e4e0: 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ose(pPager->jfd)
e4f0: 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61  ;.      if( !pPa
e500: 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b  ger->tempFile ){
e510: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
e520: 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50  lite3OsDelete(pP
e530: 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67  ager->pVfs, pPag
e540: 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29  er->zJournal, 0)
e550: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
e560: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
e570: 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 73  HECK_PAGES.    s
e580: 71 6c 69 74 65 33 50 63 61 63 68 65 49 74 65 72  qlite3PcacheIter
e590: 61 74 65 44 69 72 74 79 28 70 50 61 67 65 72 2d  ateDirty(pPager-
e5a0: 3e 70 50 43 61 63 68 65 2c 20 70 61 67 65 72 5f  >pPCache, pager_
e5b0: 73 65 74 5f 70 61 67 65 68 61 73 68 29 3b 0a 23  set_pagehash);.#
e5c0: 65 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71 6c 69  endif.  }.  sqli
e5d0: 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79  te3BitvecDestroy
e5e0: 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
e5f0: 6e 61 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  nal);.  pPager->
e600: 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a  pInJournal = 0;.
e610: 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d    pPager->nRec =
e620: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61   0;.  sqlite3Pca
e630: 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61 67  cheCleanAll(pPag
e640: 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 0a 20  er->pPCache);.. 
e650: 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c   if( pagerUseWal
e660: 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
e670: 72 63 32 20 3d 20 73 71 6c 69 74 65 33 57 61 6c  rc2 = sqlite3Wal
e680: 45 6e 64 57 72 69 74 65 54 72 61 6e 73 61 63 74  EndWriteTransact
e690: 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ion(pPager->pWal
e6a0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
e6b0: 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  c2==SQLITE_OK );
e6c0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61  .    pPager->sta
e6d0: 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45  te = PAGER_SHARE
e6e0: 44 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  D;..    /* If th
e6f0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 61 73  e connection was
e700: 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65   in locking_mode
e710: 3d 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20  =exclusive mode 
e720: 62 75 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72  but is no longer
e730: 2c 0a 20 20 20 20 2a 2a 20 64 72 6f 70 20 74 68  ,.    ** drop th
e740: 65 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  e EXCLUSIVE lock
e750: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
e760: 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
e770: 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  */.    if( !pPag
e780: 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
e790: 65 20 26 26 20 73 71 6c 69 74 65 33 57 61 6c 45  e && sqlite3WalE
e7a0: 78 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50 61  xclusiveMode(pPa
e7b0: 67 65 72 2d 3e 70 57 61 6c 2c 20 30 29 20 29 7b  ger->pWal, 0) ){
e7c0: 0a 20 20 20 20 20 20 72 63 32 20 3d 20 6f 73 55  .      rc2 = osU
e7d0: 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  nlock(pPager->fd
e7e0: 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a  , SHARED_LOCK);.
e7f0: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
e800: 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  ( !pPager->exclu
e810: 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20  siveMode ){.    
e820: 72 63 32 20 3d 20 6f 73 55 6e 6c 6f 63 6b 28 70  rc2 = osUnlock(p
e830: 50 61 67 65 72 2d 3e 66 64 2c 20 53 48 41 52 45  Pager->fd, SHARE
e840: 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 70 50 61  D_LOCK);.    pPa
e850: 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
e860: 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 70  ER_SHARED;.    p
e870: 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
e880: 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d 65  ntDone = 0;.  }e
e890: 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e  lse if( pPager->
e8a0: 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 59 4e  state==PAGER_SYN
e8b0: 43 45 44 20 29 7b 0a 20 20 20 20 70 50 61 67 65  CED ){.    pPage
e8c0: 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
e8d0: 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 7d 0a  _EXCLUSIVE;.  }.
e8e0: 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73    pPager->setMas
e8f0: 74 65 72 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ter = 0;.  pPage
e900: 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  r->needSync = 0;
e910: 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64  .  pPager->dbMod
e920: 69 66 69 65 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a  ified = 0;..  /*
e930: 20 54 4f 44 4f 3a 20 49 73 20 74 68 69 73 20 6f   TODO: Is this o
e940: 70 74 69 6d 61 6c 3f 20 57 68 79 20 69 73 20 74  ptimal? Why is t
e950: 68 65 20 64 62 20 73 69 7a 65 20 69 6e 76 61 6c  he db size inval
e960: 69 64 61 74 65 64 20 68 65 72 65 20 0a 20 20 2a  idated here .  *
e970: 2a 20 77 68 65 6e 20 74 68 65 20 64 61 74 61 62  * when the datab
e980: 61 73 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  ase file is not 
e990: 75 6e 6c 6f 63 6b 65 64 3f 20 2a 2f 0a 20 20 70  unlocked? */.  p
e9a0: 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
e9b0: 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  e = 0;.  sqlite3
e9c0: 50 63 61 63 68 65 54 72 75 6e 63 61 74 65 28 70  PcacheTruncate(p
e9d0: 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
e9e0: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b  pPager->dbSize);
e9f0: 0a 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b  .  if( !MEMDB ){
ea00: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53  .    pPager->dbS
ea10: 69 7a 65 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20  izeValid = 0;.  
ea20: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d  }..  return (rc=
ea30: 3d 53 51 4c 49 54 45 5f 4f 4b 3f 72 63 32 3a 72  =SQLITE_OK?rc2:r
ea40: 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72  c);.}../*.** Par
ea50: 61 6d 65 74 65 72 20 61 44 61 74 61 20 6d 75 73  ameter aData mus
ea60: 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66  t point to a buf
ea70: 66 65 72 20 6f 66 20 70 50 61 67 65 72 2d 3e 70  fer of pPager->p
ea80: 61 67 65 53 69 7a 65 20 62 79 74 65 73 0a 2a 2a  ageSize bytes.**
ea90: 20 6f 66 20 64 61 74 61 2e 20 43 6f 6d 70 75 74   of data. Comput
eaa0: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 63  e and return a c
eab0: 68 65 63 6b 73 75 6d 20 62 61 73 65 64 20 6f 6e  hecksum based on
eac0: 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  t the contents o
ead0: 66 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 20 6f  f the .** page o
eae0: 66 20 64 61 74 61 20 61 6e 64 20 74 68 65 20 63  f data and the c
eaf0: 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20  urrent value of 
eb00: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
eb10: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  t..**.** This is
eb20: 20 6e 6f 74 20 61 20 72 65 61 6c 20 63 68 65 63   not a real chec
eb30: 6b 73 75 6d 2e 20 49 74 20 69 73 20 72 65 61 6c  ksum. It is real
eb40: 6c 79 20 6a 75 73 74 20 74 68 65 20 73 75 6d 20  ly just the sum 
eb50: 6f 66 20 74 68 65 20 0a 2a 2a 20 72 61 6e 64 6f  of the .** rando
eb60: 6d 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20  m initial value 
eb70: 28 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e  (pPager->cksumIn
eb80: 69 74 29 20 61 6e 64 20 65 76 65 72 79 20 32 30  it) and every 20
eb90: 30 74 68 20 62 79 74 65 0a 2a 2a 20 6f 66 20 74  0th byte.** of t
eba0: 68 65 20 70 61 67 65 20 64 61 74 61 2c 20 73 74  he page data, st
ebb0: 61 72 74 69 6e 67 20 77 69 74 68 20 62 79 74 65  arting with byte
ebc0: 20 6f 66 66 73 65 74 20 28 70 50 61 67 65 72 2d   offset (pPager-
ebd0: 3e 70 61 67 65 53 69 7a 65 25 32 30 30 29 2e 0a  >pageSize%200)..
ebe0: 2a 2a 20 45 61 63 68 20 62 79 74 65 20 69 73 20  ** Each byte is 
ebf0: 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 61  interpreted as a
ec00: 6e 20 38 2d 62 69 74 20 75 6e 73 69 67 6e 65 64  n 8-bit unsigned
ec10: 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20   integer..**.** 
ec20: 43 68 61 6e 67 69 6e 67 20 74 68 65 20 66 6f 72  Changing the for
ec30: 6d 75 6c 61 20 75 73 65 64 20 74 6f 20 63 6f 6d  mula used to com
ec40: 70 75 74 65 20 74 68 69 73 20 63 68 65 63 6b 73  pute this checks
ec50: 75 6d 20 72 65 73 75 6c 74 73 20 69 6e 20 61 6e  um results in an
ec60: 0a 2a 2a 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65  .** incompatible
ec70: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
ec80: 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6a  rmat..**.** If j
ec90: 6f 75 72 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f  ournal corruptio
eca0: 6e 20 6f 63 63 75 72 73 20 64 75 65 20 74 6f 20  n occurs due to 
ecb0: 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c  a power failure,
ecc0: 20 74 68 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79   the most likely
ecd0: 20 0a 2a 2a 20 73 63 65 6e 61 72 69 6f 20 69 73   .** scenario is
ece0: 20 74 68 61 74 20 6f 6e 65 20 65 6e 64 20 6f 72   that one end or
ecf0: 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68   the other of th
ed00: 65 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65  e record will be
ed10: 20 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49 74   changed. .** It
ed20: 20 69 73 20 6d 75 63 68 20 6c 65 73 73 20 6c 69   is much less li
ed30: 6b 65 6c 79 20 74 68 61 74 20 74 68 65 20 74 77  kely that the tw
ed40: 6f 20 65 6e 64 73 20 6f 66 20 74 68 65 20 6a 6f  o ends of the jo
ed50: 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77 69 6c  urnal record wil
ed60: 6c 20 62 65 0a 2a 2a 20 63 6f 72 72 65 63 74 20  l be.** correct 
ed70: 61 6e 64 20 74 68 65 20 6d 69 64 64 6c 65 20 62  and the middle b
ed80: 65 20 63 6f 72 72 75 70 74 2e 20 20 54 68 75 73  e corrupt.  Thus
ed90: 2c 20 74 68 69 73 20 22 63 68 65 63 6b 73 75 6d  , this "checksum
eda0: 22 20 73 63 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f  " scheme,.** tho
edb0: 75 67 68 20 66 61 73 74 20 61 6e 64 20 73 69 6d  ugh fast and sim
edc0: 70 6c 65 2c 20 63 61 74 63 68 65 73 20 74 68 65  ple, catches the
edd0: 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c 79 20 6b   mostly likely k
ede0: 69 6e 64 20 6f 66 20 63 6f 72 72 75 70 74 69 6f  ind of corruptio
edf0: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32  n..*/.static u32
ee00: 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 50 61 67   pager_cksum(Pag
ee10: 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73  er *pPager, cons
ee20: 74 20 75 38 20 2a 61 44 61 74 61 29 7b 0a 20 20  t u8 *aData){.  
ee30: 75 33 32 20 63 6b 73 75 6d 20 3d 20 70 50 61 67  u32 cksum = pPag
ee40: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 20 20  er->cksumInit;  
ee50: 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73         /* Checks
ee60: 75 6d 20 76 61 6c 75 65 20 74 6f 20 72 65 74 75  um value to retu
ee70: 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20  rn */.  int i = 
ee80: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
ee90: 2d 32 30 30 3b 20 20 20 20 20 20 20 20 20 20 2f  -200;          /
eea0: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
eeb0: 2f 0a 20 20 77 68 69 6c 65 28 20 69 3e 30 20 29  /.  while( i>0 )
eec0: 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 61  {.    cksum += a
eed0: 44 61 74 61 5b 69 5d 3b 0a 20 20 20 20 69 20 2d  Data[i];.    i -
eee0: 3d 20 32 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74  = 200;.  }.  ret
eef0: 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a  urn cksum;.}../*
ef00: 0a 2a 2a 20 52 65 70 6f 72 74 20 74 68 65 20 63  .** Report the c
ef10: 75 72 72 65 6e 74 20 70 61 67 65 20 73 69 7a 65  urrent page size
ef20: 20 61 6e 64 20 6e 75 6d 62 65 72 20 6f 66 20 72   and number of r
ef30: 65 73 65 72 76 65 64 20 62 79 74 65 73 20 62 61  eserved bytes ba
ef40: 63 6b 0a 2a 2a 20 74 6f 20 74 68 65 20 63 6f 64  ck.** to the cod
ef50: 65 63 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ec..*/.#ifdef SQ
ef60: 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 73  LITE_HAS_CODEC.s
ef70: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
ef80: 52 65 70 6f 72 74 53 69 7a 65 28 50 61 67 65 72  ReportSize(Pager
ef90: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28   *pPager){.  if(
efa0: 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 53   pPager->xCodecS
efb0: 69 7a 65 43 68 6e 67 20 29 7b 0a 20 20 20 20 70  izeChng ){.    p
efc0: 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a  Pager->xCodecSiz
efd0: 65 43 68 6e 67 28 70 50 61 67 65 72 2d 3e 70 43  eChng(pPager->pC
efe0: 6f 64 65 63 2c 20 70 50 61 67 65 72 2d 3e 70 61  odec, pPager->pa
eff0: 67 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20  geSize,.        
f000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f010: 20 20 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e     (int)pPager->
f020: 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 7d 0a 7d  nReserve);.  }.}
f030: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
f040: 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28  pagerReportSize(
f050: 58 29 20 20 20 20 20 2f 2a 20 4e 6f 2d 6f 70 20  X)     /* No-op 
f060: 69 66 20 77 65 20 64 6f 20 6e 6f 74 20 73 75 70  if we do not sup
f070: 70 6f 72 74 20 61 20 63 6f 64 65 63 20 2a 2f 0a  port a codec */.
f080: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
f090: 61 64 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  ad a single page
f0a0: 20 66 72 6f 6d 20 65 69 74 68 65 72 20 74 68 65   from either the
f0b0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 69   journal file (i
f0c0: 66 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 31 29  f isMainJrnl==1)
f0d0: 20 6f 72 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20   or.** from the 
f0e0: 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 28 69 66 20  sub-journal (if 
f0f0: 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 30 29 20 61  isMainJrnl==0) a
f100: 6e 64 20 70 6c 61 79 62 61 63 6b 20 74 68 61 74  nd playback that
f110: 20 70 61 67 65 2e 0a 2a 2a 20 54 68 65 20 70 61   page..** The pa
f120: 67 65 20 62 65 67 69 6e 73 20 61 74 20 6f 66 66  ge begins at off
f130: 73 65 74 20 2a 70 4f 66 66 73 65 74 20 69 6e 74  set *pOffset int
f140: 6f 20 74 68 65 20 66 69 6c 65 2e 20 54 68 65 20  o the file. The 
f150: 2a 70 4f 66 66 73 65 74 0a 2a 2a 20 76 61 6c 75  *pOffset.** valu
f160: 65 20 69 73 20 69 6e 63 72 65 61 73 65 64 20 74  e is increased t
f170: 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  o the start of t
f180: 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20  he next page in 
f190: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  the journal..**.
f1a0: 2a 2a 20 54 68 65 20 69 73 4d 61 69 6e 4a 72 6e  ** The isMainJrn
f1b0: 6c 20 66 6c 61 67 20 69 73 20 74 72 75 65 20 69  l flag is true i
f1c0: 66 20 74 68 69 73 20 69 73 20 74 68 65 20 6d 61  f this is the ma
f1d0: 69 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  in rollback jour
f1e0: 6e 61 6c 20 61 6e 64 0a 2a 2a 20 66 61 6c 73 65  nal and.** false
f1f0: 20 66 6f 72 20 74 68 65 20 73 74 61 74 65 6d 65   for the stateme
f200: 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65  nt journal.  The
f210: 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a   main rollback j
f220: 6f 75 72 6e 61 6c 20 75 73 65 73 0a 2a 2a 20 63  ournal uses.** c
f230: 68 65 63 6b 73 75 6d 73 20 2d 20 74 68 65 20 73  hecksums - the s
f240: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
f250: 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a   does not..**.**
f260: 20 49 66 20 74 68 65 20 70 61 67 65 20 6e 75 6d   If the page num
f270: 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20  ber of the page 
f280: 72 65 63 6f 72 64 20 72 65 61 64 20 66 72 6f 6d  record read from
f290: 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e   the (sub-)journ
f2a0: 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 67 72  al file.** is gr
f2b0: 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 63  eater than the c
f2c0: 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20  urrent value of 
f2d0: 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 74 68  Pager.dbSize, th
f2e0: 65 6e 20 70 6c 61 79 62 61 63 6b 20 69 73 0a 2a  en playback is.*
f2f0: 2a 20 73 6b 69 70 70 65 64 20 61 6e 64 20 53 51  * skipped and SQ
f300: 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
f310: 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44  ned..**.** If pD
f320: 6f 6e 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  one is not NULL,
f330: 20 74 68 65 6e 20 69 74 20 69 73 20 61 20 72 65   then it is a re
f340: 63 6f 72 64 20 6f 66 20 70 61 67 65 73 20 74 68  cord of pages th
f350: 61 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a  at have already.
f360: 2a 2a 20 62 65 65 6e 20 70 6c 61 79 65 64 20 62  ** been played b
f370: 61 63 6b 2e 20 20 49 66 20 74 68 65 20 70 61 67  ack.  If the pag
f380: 65 20 61 74 20 2a 70 4f 66 66 73 65 74 20 68 61  e at *pOffset ha
f390: 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70  s already been p
f3a0: 6c 61 79 65 64 20 62 61 63 6b 0a 2a 2a 20 28 69  layed back.** (i
f3b0: 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  f the correspond
f3c0: 69 6e 67 20 70 44 6f 6e 65 20 62 69 74 20 69 73  ing pDone bit is
f3d0: 20 73 65 74 29 20 74 68 65 6e 20 73 6b 69 70 20   set) then skip 
f3e0: 74 68 65 20 70 6c 61 79 62 61 63 6b 2e 0a 2a 2a  the playback..**
f3f0: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 70   Make sure the p
f400: 44 6f 6e 65 20 62 69 74 20 63 6f 72 72 65 73 70  Done bit corresp
f410: 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 2a 70  onding to the *p
f420: 4f 66 66 73 65 74 20 70 61 67 65 20 69 73 20 73  Offset page is s
f430: 65 74 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 72  et.** prior to r
f440: 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  eturning..**.** 
f450: 49 66 20 74 68 65 20 70 61 67 65 20 72 65 63 6f  If the page reco
f460: 72 64 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  rd is successful
f470: 6c 79 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ly read from the
f480: 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66   (sub-)journal f
f490: 69 6c 65 0a 2a 2a 20 61 6e 64 20 70 6c 61 79 65  ile.** and playe
f4a0: 64 20 62 61 63 6b 2c 20 74 68 65 6e 20 53 51 4c  d back, then SQL
f4b0: 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
f4c0: 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72  ed. If an IO err
f4d0: 6f 72 20 6f 63 63 75 72 73 0a 2a 2a 20 77 68 69  or occurs.** whi
f4e0: 6c 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 72  le reading the r
f4f0: 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 28  ecord from the (
f500: 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c  sub-)journal fil
f510: 65 20 6f 72 20 77 68 69 6c 65 20 77 72 69 74 69  e or while writi
f520: 6e 67 0a 2a 2a 20 74 6f 20 74 68 65 20 64 61 74  ng.** to the dat
f530: 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e  abase file, then
f540: 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f   the IO error co
f550: 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  de is returned. 
f560: 49 66 20 64 61 74 61 0a 2a 2a 20 69 73 20 73 75  If data.** is su
f570: 63 63 65 73 73 66 75 6c 6c 79 20 72 65 61 64 20  ccessfully read 
f580: 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a  from the (sub-)j
f590: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 75 74 20  ournal file but 
f5a0: 61 70 70 65 61 72 73 20 74 6f 20 62 65 0a 2a 2a  appears to be.**
f5b0: 20 63 6f 72 72 75 70 74 65 64 2c 20 53 51 4c 49   corrupted, SQLI
f5c0: 54 45 5f 44 4f 4e 45 20 69 73 20 72 65 74 75 72  TE_DONE is retur
f5d0: 6e 65 64 2e 20 44 61 74 61 20 69 73 20 63 6f 6e  ned. Data is con
f5e0: 73 69 64 65 72 65 64 20 63 6f 72 72 75 70 74 65  sidered corrupte
f5f0: 64 20 69 6e 0a 2a 2a 20 74 77 6f 20 63 69 72 63  d in.** two circ
f600: 75 6d 73 74 61 6e 63 65 73 3a 0a 2a 2a 20 0a 2a  umstances:.** .*
f610: 2a 20 20 20 2a 20 49 66 20 74 68 65 20 72 65 63  *   * If the rec
f620: 6f 72 64 20 70 61 67 65 2d 6e 75 6d 62 65 72 20  ord page-number 
f630: 69 73 20 69 6c 6c 65 67 61 6c 20 28 30 20 6f 72  is illegal (0 or
f640: 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 29 2c   PAGER_MJ_PGNO),
f650: 20 6f 72 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68   or.**   * If th
f660: 65 20 72 65 63 6f 72 64 20 69 73 20 62 65 69 6e  e record is bein
f670: 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 66 72  g rolled back fr
f680: 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  om the main jour
f690: 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20  nal file.**     
f6a0: 61 6e 64 20 74 68 65 20 63 68 65 63 6b 73 75 6d  and the checksum
f6b0: 20 66 69 65 6c 64 20 64 6f 65 73 20 6e 6f 74 20   field does not 
f6c0: 6d 61 74 63 68 20 74 68 65 20 72 65 63 6f 72 64  match the record
f6d0: 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20   content..**.** 
f6e0: 4e 65 69 74 68 65 72 20 6f 66 20 74 68 65 73 65  Neither of these
f6f0: 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 20 61   two scenarios a
f700: 72 65 20 70 6f 73 73 69 62 6c 65 20 64 75 72 69  re possible duri
f710: 6e 67 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72  ng a savepoint r
f720: 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49  ollback..**.** I
f730: 66 20 74 68 69 73 20 69 73 20 61 20 73 61 76 65  f this is a save
f740: 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 2c 20  point rollback, 
f750: 74 68 65 6e 20 6d 65 6d 6f 72 79 20 6d 61 79 20  then memory may 
f760: 68 61 76 65 20 74 6f 20 62 65 20 64 79 6e 61 6d  have to be dynam
f770: 69 63 61 6c 6c 79 0a 2a 2a 20 61 6c 6c 6f 63 61  ically.** alloca
f780: 74 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ted by this func
f790: 74 69 6f 6e 2e 20 49 66 20 74 68 69 73 20 69 73  tion. If this is
f7a0: 20 74 68 65 20 63 61 73 65 20 61 6e 64 20 61 6e   the case and an
f7b0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c   allocation fail
f7c0: 73 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d  s,.** SQLITE_NOM
f7d0: 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  EM is returned..
f7e0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
f7f0: 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
f800: 5f 70 61 67 65 28 0a 20 20 50 61 67 65 72 20 2a  _page(.  Pager *
f810: 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20  pPager,         
f820: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
f830: 67 65 72 20 62 65 69 6e 67 20 70 6c 61 79 65 64  ger being played
f840: 20 62 61 63 6b 20 2a 2f 0a 20 20 69 36 34 20 2a   back */.  i64 *
f850: 70 4f 66 66 73 65 74 2c 20 20 20 20 20 20 20 20  pOffset,        
f860: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
f870: 65 74 20 6f 66 20 72 65 63 6f 72 64 20 74 6f 20  et of record to 
f880: 70 6c 61 79 62 61 63 6b 20 2a 2f 0a 20 20 42 69  playback */.  Bi
f890: 74 76 65 63 20 2a 70 44 6f 6e 65 2c 20 20 20 20  tvec *pDone,    
f8a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
f8b0: 69 74 76 65 63 20 6f 66 20 70 61 67 65 73 20 61  itvec of pages a
f8c0: 6c 72 65 61 64 79 20 70 6c 61 79 65 64 20 62 61  lready played ba
f8d0: 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4d 61  ck */.  int isMa
f8e0: 69 6e 4a 72 6e 6c 2c 20 20 20 20 20 20 20 20 20  inJrnl,         
f8f0: 20 20 20 20 20 20 2f 2a 20 31 20 2d 3e 20 6d 61        /* 1 -> ma
f900: 69 6e 20 6a 6f 75 72 6e 61 6c 2e 20 30 20 2d 3e  in journal. 0 ->
f910: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 2a 2f   sub-journal. */
f920: 0a 20 20 69 6e 74 20 69 73 53 61 76 65 70 6e 74  .  int isSavepnt
f930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f940: 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20 73   /* True for a s
f950: 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63  avepoint rollbac
f960: 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  k */.){.  int rc
f970: 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 20  ;.  PgHdr *pPg; 
f980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f990: 20 20 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67    /* An existing
f9a0: 20 70 61 67 65 20 69 6e 20 74 68 65 20 63 61 63   page in the cac
f9b0: 68 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  he */.  Pgno pgn
f9c0: 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
f9d0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
f9e0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 70 61  e number of a pa
f9f0: 67 65 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f  ge in journal */
fa00: 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20  .  u32 cksum;   
fa10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa20: 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 75 73 65   /* Checksum use
fa30: 64 20 66 6f 72 20 73 61 6e 69 74 79 20 63 68 65  d for sanity che
fa40: 63 6b 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20  cking */.  char 
fa50: 2a 61 44 61 74 61 3b 20 20 20 20 20 20 20 20 20  *aData;         
fa60: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70           /* Temp
fa70: 6f 72 61 72 79 20 73 74 6f 72 61 67 65 20 66 6f  orary storage fo
fa80: 72 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20  r the page */.  
fa90: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 6a 66  sqlite3_file *jf
faa0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  d;            /*
fab0: 20 54 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   The file descri
fac0: 70 74 6f 72 20 66 6f 72 20 74 68 65 20 6a 6f 75  ptor for the jou
fad0: 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69  rnal file */.  i
fae0: 6e 74 20 69 73 53 79 6e 63 65 64 3b 20 20 20 20  nt isSynced;    
faf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fb00: 54 72 75 65 20 69 66 20 6a 6f 75 72 6e 61 6c 20  True if journal 
fb10: 70 61 67 65 20 69 73 20 73 79 6e 63 65 64 20 2a  page is synced *
fb20: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 28 69 73  /..  assert( (is
fb30: 4d 61 69 6e 4a 72 6e 6c 26 7e 31 29 3d 3d 30 20  MainJrnl&~1)==0 
fb40: 29 3b 20 20 20 20 20 20 2f 2a 20 69 73 4d 61 69  );      /* isMai
fb50: 6e 4a 72 6e 6c 20 69 73 20 30 20 6f 72 20 31 20  nJrnl is 0 or 1 
fb60: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 69 73  */.  assert( (is
fb70: 53 61 76 65 70 6e 74 26 7e 31 29 3d 3d 30 20 29  Savepnt&~1)==0 )
fb80: 3b 20 20 20 20 20 20 20 2f 2a 20 69 73 53 61 76  ;       /* isSav
fb90: 65 70 6e 74 20 69 73 20 30 20 6f 72 20 31 20 2a  epnt is 0 or 1 *
fba0: 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4d 61  /.  assert( isMa
fbb0: 69 6e 4a 72 6e 6c 20 7c 7c 20 70 44 6f 6e 65 20  inJrnl || pDone 
fbc0: 29 3b 20 20 20 20 20 2f 2a 20 70 44 6f 6e 65 20  );     /* pDone 
fbd0: 61 6c 77 61 79 73 20 75 73 65 64 20 6f 6e 20 73  always used on s
fbe0: 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f 0a 20  ub-journals */. 
fbf0: 20 61 73 73 65 72 74 28 20 69 73 53 61 76 65 70   assert( isSavep
fc00: 6e 74 20 7c 7c 20 70 44 6f 6e 65 3d 3d 30 20 29  nt || pDone==0 )
fc10: 3b 20 20 20 2f 2a 20 70 44 6f 6e 65 20 6e 65 76  ;   /* pDone nev
fc20: 65 72 20 75 73 65 64 20 6f 6e 20 6e 6f 6e 2d 73  er used on non-s
fc30: 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 0a 20 20 61  avepoint */..  a
fc40: 44 61 74 61 20 3d 20 70 50 61 67 65 72 2d 3e 70  Data = pPager->p
fc50: 54 6d 70 53 70 61 63 65 3b 0a 20 20 61 73 73 65  TmpSpace;.  asse
fc60: 72 74 28 20 61 44 61 74 61 20 29 3b 20 20 20 20  rt( aData );    
fc70: 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f       /* Temp sto
fc80: 72 61 67 65 20 6d 75 73 74 20 68 61 76 65 20 61  rage must have a
fc90: 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f  lready been allo
fca0: 63 61 74 65 64 20 2a 2f 0a 20 20 61 73 73 65 72  cated */.  asser
fcb0: 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  t( pagerUseWal(p
fcc0: 50 61 67 65 72 29 3d 3d 30 20 7c 7c 20 28 21 69  Pager)==0 || (!i
fcd0: 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 69 73 53  sMainJrnl && isS
fce0: 61 76 65 70 6e 74 29 20 29 3b 0a 0a 20 20 2f 2a  avepnt) );..  /*
fcf0: 20 52 65 61 64 20 74 68 65 20 70 61 67 65 20 6e   Read the page n
fd00: 75 6d 62 65 72 20 61 6e 64 20 70 61 67 65 20 64  umber and page d
fd10: 61 74 61 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ata from the jou
fd20: 72 6e 61 6c 20 6f 72 20 73 75 62 2d 6a 6f 75 72  rnal or sub-jour
fd30: 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 2e 20 52  nal.  ** file. R
fd40: 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
fd50: 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ode to the calle
fd60: 72 20 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  r if an IO error
fd70: 20 6f 63 63 75 72 73 2e 0a 20 20 2a 2f 0a 20 20   occurs..  */.  
fd80: 6a 66 64 20 3d 20 69 73 4d 61 69 6e 4a 72 6e 6c  jfd = isMainJrnl
fd90: 20 3f 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3a   ? pPager->jfd :
fda0: 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 3b 0a 20   pPager->sjfd;. 
fdb0: 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
fdc0: 28 6a 66 64 2c 20 2a 70 4f 66 66 73 65 74 2c 20  (jfd, *pOffset, 
fdd0: 26 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 72 63  &pgno);.  if( rc
fde0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
fdf0: 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20  turn rc;.  rc = 
fe00: 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 6a 66  sqlite3OsRead(jf
fe10: 64 2c 20 28 75 38 2a 29 61 44 61 74 61 2c 20 70  d, (u8*)aData, p
fe20: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
fe30: 20 28 2a 70 4f 66 66 73 65 74 29 2b 34 29 3b 0a   (*pOffset)+4);.
fe40: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
fe50: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
fe60: 0a 20 20 2a 70 4f 66 66 73 65 74 20 2b 3d 20 70  .  *pOffset += p
fe70: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
fe80: 2b 20 34 20 2b 20 69 73 4d 61 69 6e 4a 72 6e 6c  + 4 + isMainJrnl
fe90: 2a 34 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79  *4;..  /* Sanity
fea0: 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65   checking on the
feb0: 20 70 61 67 65 2e 20 20 54 68 69 73 20 69 73 20   page.  This is 
fec0: 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74 20 74  more important t
fed0: 68 61 74 20 49 20 6f 72 69 67 69 6e 61 6c 6c 79  hat I originally
fee0: 0a 20 20 2a 2a 20 74 68 6f 75 67 68 74 2e 20 20  .  ** thought.  
fef0: 49 66 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  If a power failu
ff00: 72 65 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  re occurs while 
ff10: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62  the journal is b
ff20: 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 0a 20 20  eing written,.  
ff30: 2a 2a 20 69 74 20 63 6f 75 6c 64 20 63 61 75 73  ** it could caus
ff40: 65 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20 74  e invalid data t
ff50: 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  o be written int
ff60: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  o the journal.  
ff70: 57 65 20 6e 65 65 64 20 74 6f 0a 20 20 2a 2a 20  We need to.  ** 
ff80: 64 65 74 65 63 74 20 74 68 69 73 20 69 6e 76 61  detect this inva
ff90: 6c 69 64 20 64 61 74 61 20 28 77 69 74 68 20 68  lid data (with h
ffa0: 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79 29  igh probability)
ffb0: 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a   and ignore it..
ffc0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d    */.  if( pgno=
ffd0: 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45  =0 || pgno==PAGE
ffe0: 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
fff0: 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
10000 20 21 69 73 53 61 76 65 70 6e 74 20 29 3b 0a 20   !isSavepnt );. 
10010 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
10020 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 66 28  _DONE;.  }.  if(
10030 20 70 67 6e 6f 3e 28 50 67 6e 6f 29 70 50 61 67   pgno>(Pgno)pPag
10040 65 72 2d 3e 64 62 53 69 7a 65 20 7c 7c 20 73 71  er->dbSize || sq
10050 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28  lite3BitvecTest(
10060 70 44 6f 6e 65 2c 20 70 67 6e 6f 29 20 29 7b 0a  pDone, pgno) ){.
10070 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
10080 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  E_OK;.  }.  if( 
10090 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20  isMainJrnl ){.  
100a0 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
100b0 73 28 6a 66 64 2c 20 28 2a 70 4f 66 66 73 65 74  s(jfd, (*pOffset
100c0 29 2d 34 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20  )-4, &cksum);.  
100d0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
100e0 6e 20 72 63 3b 0a 20 20 20 20 69 66 28 20 21 69  n rc;.    if( !i
100f0 73 53 61 76 65 70 6e 74 20 26 26 20 70 61 67 65  sSavepnt && page
10100 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20  r_cksum(pPager, 
10110 28 75 38 2a 29 61 44 61 74 61 29 21 3d 63 6b 73  (u8*)aData)!=cks
10120 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  um ){.      retu
10130 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
10140 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
10150 49 66 20 74 68 69 73 20 70 61 67 65 20 68 61 73  If this page has
10160 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70 6c   already been pl
10170 61 79 65 64 20 62 79 20 62 65 66 6f 72 65 20 64  ayed by before d
10180 75 72 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e  uring the curren
10190 74 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2c  t.  ** rollback,
101a0 20 74 68 65 6e 20 64 6f 6e 27 74 20 62 6f 74 68   then don't both
101b0 65 72 20 74 6f 20 70 6c 61 79 20 69 74 20 62 61  er to play it ba
101c0 63 6b 20 61 67 61 69 6e 2e 0a 20 20 2a 2f 0a 20  ck again..  */. 
101d0 20 69 66 28 20 70 44 6f 6e 65 20 26 26 20 28 72   if( pDone && (r
101e0 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65  c = sqlite3Bitve
101f0 63 53 65 74 28 70 44 6f 6e 65 2c 20 70 67 6e 6f  cSet(pDone, pgno
10200 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  ))!=SQLITE_OK ){
10210 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
10220 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50    }.  assert( pP
10230 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
10240 45 52 5f 52 45 53 45 52 56 45 44 20 7c 7c 20 70  ER_RESERVED || p
10250 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
10260 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 3b  GER_EXCLUSIVE );
10270 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 70 6c 61 79  ..  /* When play
10280 69 6e 67 20 62 61 63 6b 20 70 61 67 65 20 31 2c  ing back page 1,
10290 20 72 65 73 74 6f 72 65 20 74 68 65 20 6e 52 65   restore the nRe
102a0 73 65 72 76 65 20 73 65 74 74 69 6e 67 0a 20 20  serve setting.  
102b0 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31  */.  if( pgno==1
102c0 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 52 65 73   && pPager->nRes
102d0 65 72 76 65 21 3d 28 28 75 38 2a 29 61 44 61 74  erve!=((u8*)aDat
102e0 61 29 5b 32 30 5d 20 29 7b 0a 20 20 20 20 70 50  a)[20] ){.    pP
102f0 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 20 3d  ager->nReserve =
10300 20 28 28 75 38 2a 29 61 44 61 74 61 29 5b 32 30   ((u8*)aData)[20
10310 5d 3b 0a 20 20 20 20 70 61 67 65 72 52 65 70 6f  ];.    pagerRepo
10320 72 74 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a  rtSize(pPager);.
10330 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
10340 20 70 61 67 65 72 20 69 73 20 69 6e 20 52 45 53   pager is in RES
10350 45 52 56 45 44 20 73 74 61 74 65 2c 20 74 68 65  ERVED state, the
10360 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20  n there must be 
10370 61 20 63 6f 70 79 20 6f 66 20 74 68 69 73 0a 20  a copy of this. 
10380 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20   ** page in the 
10390 70 61 67 65 72 20 63 61 63 68 65 2e 20 49 6e 20  pager cache. In 
103a0 74 68 69 73 20 63 61 73 65 20 6a 75 73 74 20 75  this case just u
103b0 70 64 61 74 65 20 74 68 65 20 70 61 67 65 72 20  pdate the pager 
103c0 63 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20  cache,.  ** not 
103d0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
103e0 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 6c  e. The page is l
103f0 65 66 74 20 6d 61 72 6b 65 64 20 64 69 72 74 79  eft marked dirty
10400 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20   in this case.. 
10410 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 65 78 63 65   **.  ** An exce
10420 70 74 69 6f 6e 20 74 6f 20 74 68 65 20 61 62 6f  ption to the abo
10430 76 65 20 72 75 6c 65 3a 20 49 66 20 74 68 65 20  ve rule: If the 
10440 64 61 74 61 62 61 73 65 20 69 73 20 69 6e 20 6e  database is in n
10450 6f 2d 73 79 6e 63 20 6d 6f 64 65 0a 20 20 2a 2a  o-sync mode.  **
10460 20 61 6e 64 20 61 20 70 61 67 65 20 69 73 20 6d   and a page is m
10470 6f 76 65 64 20 64 75 72 69 6e 67 20 61 6e 20 69  oved during an i
10480 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75  ncremental vacuu
10490 6d 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20  m then the page 
104a0 6d 61 79 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20  may.  ** not be 
104b0 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63  in the pager cac
104c0 68 65 2e 20 4c 61 74 65 72 3a 20 69 66 20 61 20  he. Later: if a 
104d0 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20 65  malloc() or IO e
104e0 72 72 6f 72 20 6f 63 63 75 72 73 0a 20 20 2a 2a  rror occurs.  **
104f0 20 64 75 72 69 6e 67 20 61 20 4d 6f 76 65 70 61   during a Movepa
10500 67 65 28 29 20 63 61 6c 6c 2c 20 74 68 65 6e 20  ge() call, then 
10510 74 68 65 20 70 61 67 65 20 6d 61 79 20 6e 6f 74  the page may not
10520 20 62 65 20 69 6e 20 74 68 65 20 63 61 63 68 65   be in the cache
10530 0a 20 20 2a 2a 20 65 69 74 68 65 72 2e 20 53 6f  .  ** either. So
10540 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64   the condition d
10550 65 73 63 72 69 62 65 64 20 69 6e 20 74 68 65 20  escribed in the 
10560 61 62 6f 76 65 20 70 61 72 61 67 72 61 70 68 20  above paragraph 
10570 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 73 73 65  is not.  ** asse
10580 72 74 28 29 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20  rt()able..  **. 
10590 20 2a 2a 20 49 66 20 69 6e 20 45 58 43 4c 55 53   ** If in EXCLUS
105a0 49 56 45 20 73 74 61 74 65 2c 20 74 68 65 6e 20  IVE state, then 
105b0 77 65 20 75 70 64 61 74 65 20 74 68 65 20 70 61  we update the pa
105c0 67 65 72 20 63 61 63 68 65 20 69 66 20 69 74 20  ger cache if it 
105d0 65 78 69 73 74 73 0a 20 20 2a 2a 20 61 6e 64 20  exists.  ** and 
105e0 74 68 65 20 6d 61 69 6e 20 66 69 6c 65 2e 20 54  the main file. T
105f0 68 65 20 70 61 67 65 20 69 73 20 74 68 65 6e 20  he page is then 
10600 6d 61 72 6b 65 64 20 6e 6f 74 20 64 69 72 74 79  marked not dirty
10610 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 69 63 6b  ..  **.  ** Tick
10620 65 74 20 23 31 31 37 31 3a 20 20 54 68 65 20 73  et #1171:  The s
10630 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
10640 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 70   might contain p
10650 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 68 61 74  age content that
10660 20 69 73 0a 20 20 2a 2a 20 64 69 66 66 65 72 65   is.  ** differe
10670 6e 74 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  nt from the page
10680 20 63 6f 6e 74 65 6e 74 20 61 74 20 74 68 65 20   content at the 
10690 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61  start of the tra
106a0 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54  nsaction..  ** T
106b0 68 69 73 20 6f 63 63 75 72 73 20 77 68 65 6e 20  his occurs when 
106c0 61 20 70 61 67 65 20 69 73 20 63 68 61 6e 67 65  a page is change
106d0 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73  d prior to the s
106e0 74 61 72 74 20 6f 66 20 61 20 73 74 61 74 65 6d  tart of a statem
106f0 65 6e 74 0a 20 20 2a 2a 20 74 68 65 6e 20 63 68  ent.  ** then ch
10700 61 6e 67 65 64 20 61 67 61 69 6e 20 77 69 74 68  anged again with
10710 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  in the statement
10720 2e 20 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20  .  When rolling 
10730 62 61 63 6b 20 73 75 63 68 20 61 0a 20 20 2a 2a  back such a.  **
10740 20 73 74 61 74 65 6d 65 6e 74 20 77 65 20 6d 75   statement we mu
10750 73 74 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20  st not write to 
10760 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
10770 61 62 61 73 65 20 75 6e 6c 65 73 73 20 77 65 20  abase unless we 
10780 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72 20 63 65  know.  ** for ce
10790 72 74 61 69 6e 20 74 68 61 74 20 6f 72 69 67 69  rtain that origi
107a0 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  nal page content
107b0 73 20 61 72 65 20 73 79 6e 63 65 64 20 69 6e 74  s are synced int
107c0 6f 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62  o the main rollb
107d0 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  ack.  ** journal
107e0 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20  .  Otherwise, a 
107f0 70 6f 77 65 72 20 6c 6f 73 73 20 6d 69 67 68 74  power loss might
10800 20 6c 65 61 76 65 20 6d 6f 64 69 66 69 65 64 20   leave modified 
10810 64 61 74 61 20 69 6e 20 74 68 65 0a 20 20 2a 2a  data in the.  **
10820 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
10830 69 74 68 6f 75 74 20 61 6e 20 65 6e 74 72 79 20  ithout an entry 
10840 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  in the rollback 
10850 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20 63 61 6e  journal that can
10860 0a 20 20 2a 2a 20 72 65 73 74 6f 72 65 20 74 68  .  ** restore th
10870 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 69 74  e database to it
10880 73 20 6f 72 69 67 69 6e 61 6c 20 66 6f 72 6d 2e  s original form.
10890 20 20 54 77 6f 20 63 6f 6e 64 69 74 69 6f 6e 73    Two conditions
108a0 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6d 65   must be.  ** me
108b0 74 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67  t before writing
108c0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
108d0 20 66 69 6c 65 73 2e 20 28 31 29 20 74 68 65 20   files. (1) the 
108e0 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65  database must be
108f0 0a 20 20 2a 2a 20 6c 6f 63 6b 65 64 2e 20 20 28  .  ** locked.  (
10900 32 29 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20  2) we know that 
10910 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  the original pag
10920 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 66 75 6c  e content is ful
10930 6c 79 20 73 79 6e 63 65 64 0a 20 20 2a 2a 20 69  ly synced.  ** i
10940 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  n the main journ
10950 61 6c 20 65 69 74 68 65 72 20 62 65 63 61 75 73  al either becaus
10960 65 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  e the page is no
10970 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20 65 6c  t in cache or el
10980 73 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65  se.  ** the page
10990 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 6e 65   is marked as ne
109a0 65 64 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2a 0a  edSync==0..  **.
109b0 20 20 2a 2a 20 32 30 30 38 2d 30 34 2d 31 34 3a    ** 2008-04-14:
109c0 20 20 57 68 65 6e 20 61 74 74 65 6d 70 74 69 6e    When attemptin
109d0 67 20 74 6f 20 76 61 63 75 75 6d 20 61 20 63 6f  g to vacuum a co
109e0 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66  rrupt database f
109f0 69 6c 65 2c 20 69 74 0a 20 20 2a 2a 20 69 73 20  ile, it.  ** is 
10a00 70 6f 73 73 69 62 6c 65 20 74 6f 20 66 61 69 6c  possible to fail
10a10 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20   a statement on 
10a20 61 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20  a database that 
10a30 64 6f 65 73 20 6e 6f 74 20 79 65 74 20 65 78 69  does not yet exi
10a40 73 74 2e 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74 20  st..  ** Do not 
10a50 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65  attempt to write
10a60 20 69 66 20 64 61 74 61 62 61 73 65 20 66 69 6c   if database fil
10a70 65 20 68 61 73 20 6e 65 76 65 72 20 62 65 65 6e  e has never been
10a80 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20   opened..  */.  
10a90 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  if( pagerUseWal(
10aa0 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 70  pPager) ){.    p
10ab0 50 67 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  Pg = 0;.  }else{
10ac0 0a 20 20 20 20 70 50 67 20 3d 20 70 61 67 65 72  .    pPg = pager
10ad0 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  _lookup(pPager, 
10ae0 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 61 73 73  pgno);.  }.  ass
10af0 65 72 74 28 20 70 50 67 20 7c 7c 20 21 4d 45 4d  ert( pPg || !MEM
10b00 44 42 20 29 3b 0a 20 20 50 41 47 45 52 54 52 41  DB );.  PAGERTRA
10b10 43 45 28 28 22 50 4c 41 59 42 41 43 4b 20 25 64  CE(("PLAYBACK %d
10b20 20 70 61 67 65 20 25 64 20 68 61 73 68 28 25 30   page %d hash(%0
10b30 38 78 29 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20  8x) %s\n",.     
10b40 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50        PAGERID(pP
10b50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67  ager), pgno, pag
10b60 65 72 5f 64 61 74 61 68 61 73 68 28 70 50 61 67  er_datahash(pPag
10b70 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 75  er->pageSize, (u
10b80 38 2a 29 61 44 61 74 61 29 2c 0a 20 20 20 20 20  8*)aData),.     
10b90 20 20 20 20 20 20 28 69 73 4d 61 69 6e 4a 72 6e        (isMainJrn
10ba0 6c 3f 22 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 22  l?"main-journal"
10bb0 3a 22 73 75 62 2d 6a 6f 75 72 6e 61 6c 22 29 0a  :"sub-journal").
10bc0 20 20 29 29 3b 0a 20 20 69 66 28 20 69 73 4d 61    ));.  if( isMa
10bd0 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 69 73  inJrnl ){.    is
10be0 53 79 6e 63 65 64 20 3d 20 70 50 61 67 65 72 2d  Synced = pPager-
10bf0 3e 6e 6f 53 79 6e 63 20 7c 7c 20 28 2a 70 4f 66  >noSync || (*pOf
10c00 66 73 65 74 20 3c 3d 20 70 50 61 67 65 72 2d 3e  fset <= pPager->
10c10 6a 6f 75 72 6e 61 6c 48 64 72 29 3b 0a 20 20 7d  journalHdr);.  }
10c20 65 6c 73 65 7b 0a 20 20 20 20 69 73 53 79 6e 63  else{.    isSync
10c30 65 64 20 3d 20 28 70 50 67 3d 3d 30 20 7c 7c 20  ed = (pPg==0 || 
10c40 30 3d 3d 28 70 50 67 2d 3e 66 6c 61 67 73 20 26  0==(pPg->flags &
10c50 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
10c60 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70  ));.  }.  if( (p
10c70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
10c80 47 45 52 5f 45 58 43 4c 55 53 49 56 45 29 0a 20  GER_EXCLUSIVE). 
10c90 20 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67    && isOpen(pPag
10ca0 65 72 2d 3e 66 64 29 0a 20 20 20 26 26 20 69 73  er->fd).   && is
10cb0 53 79 6e 63 65 64 0a 20 20 29 7b 0a 20 20 20 20  Synced.  ){.    
10cc0 69 36 34 20 6f 66 73 74 20 3d 20 28 70 67 6e 6f  i64 ofst = (pgno
10cd0 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d  -1)*(i64)pPager-
10ce0 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 74  >pageSize;.    t
10cf0 65 73 74 63 61 73 65 28 20 21 69 73 53 61 76 65  estcase( !isSave
10d00 70 6e 74 20 26 26 20 70 50 67 21 3d 30 20 26 26  pnt && pPg!=0 &&
10d10 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48   (pPg->flags&PGH
10d20 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 21 3d 30  DR_NEED_SYNC)!=0
10d30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
10d40 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
10d50 67 65 72 29 20 29 3b 0a 20 20 20 20 72 63 20 3d  ger) );.    rc =
10d60 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
10d70 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 75 38 2a  pPager->fd, (u8*
10d80 29 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e  )aData, pPager->
10d90 70 61 67 65 53 69 7a 65 2c 20 6f 66 73 74 29 3b  pageSize, ofst);
10da0 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50  .    if( pgno>pP
10db0 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
10dc0 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
10dd0 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 70  ->dbFileSize = p
10de0 67 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  gno;.    }.    i
10df0 66 28 20 70 50 61 67 65 72 2d 3e 70 42 61 63 6b  f( pPager->pBack
10e00 75 70 20 29 7b 0a 20 20 20 20 20 20 43 4f 44 45  up ){.      CODE
10e10 43 31 28 70 50 61 67 65 72 2c 20 61 44 61 74 61  C1(pPager, aData
10e20 2c 20 70 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51  , pgno, 3, rc=SQ
10e30 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 20  LITE_NOMEM);.   
10e40 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70     sqlite3Backup
10e50 55 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70  Update(pPager->p
10e60 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75  Backup, pgno, (u
10e70 38 2a 29 61 44 61 74 61 29 3b 0a 20 20 20 20 20  8*)aData);.     
10e80 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20   CODEC2(pPager, 
10e90 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20 37 2c 20  aData, pgno, 7, 
10ea0 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  rc=SQLITE_NOMEM,
10eb0 20 61 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20   aData);.    }. 
10ec0 20 7d 65 6c 73 65 20 69 66 28 20 21 69 73 4d 61   }else if( !isMa
10ed0 69 6e 4a 72 6e 6c 20 26 26 20 70 50 67 3d 3d 30  inJrnl && pPg==0
10ee0 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
10ef0 69 73 20 69 73 20 61 20 72 6f 6c 6c 62 61 63 6b  is is a rollback
10f00 20 6f 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20   of a savepoint 
10f10 61 6e 64 20 64 61 74 61 20 77 61 73 20 6e 6f 74  and data was not
10f20 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 20 20   written to.    
10f30 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
10f40 61 6e 64 20 74 68 65 20 70 61 67 65 20 69 73 20  and the page is 
10f50 6e 6f 74 20 69 6e 2d 6d 65 6d 6f 72 79 2c 20 74  not in-memory, t
10f60 68 65 72 65 20 69 73 20 61 20 70 6f 74 65 6e 74  here is a potent
10f70 69 61 6c 0a 20 20 20 20 2a 2a 20 70 72 6f 62 6c  ial.    ** probl
10f80 65 6d 2e 20 57 68 65 6e 20 74 68 65 20 70 61 67  em. When the pag
10f90 65 20 69 73 20 6e 65 78 74 20 66 65 74 63 68 65  e is next fetche
10fa0 64 20 62 79 20 74 68 65 20 62 2d 74 72 65 65 20  d by the b-tree 
10fb0 6c 61 79 65 72 2c 20 69 74 20 0a 20 20 20 20 2a  layer, it .    *
10fc0 2a 20 77 69 6c 6c 20 62 65 20 72 65 61 64 20 66  * will be read f
10fd0 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
10fe0 20 66 69 6c 65 2c 20 77 68 69 63 68 20 6d 61 79   file, which may
10ff0 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 0a   or may not be .
11000 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 2e 20      ** current. 
11010 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
11020 68 65 72 65 20 61 72 65 20 61 20 63 6f 75 70 6c  here are a coupl
11030 65 20 6f 66 20 64 69 66 66 65 72 65 6e 74 20 77  e of different w
11040 61 79 73 20 74 68 69 73 20 63 61 6e 20 68 61 70  ays this can hap
11050 70 65 6e 2e 20 41 6c 6c 20 61 72 65 20 71 75 69  pen. All are qui
11060 74 65 0a 20 20 20 20 2a 2a 20 6f 62 73 63 75 72  te.    ** obscur
11070 65 2e 20 57 68 65 6e 20 72 75 6e 6e 69 6e 67 20  e. When running 
11080 69 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d  in synchronous m
11090 6f 64 65 2c 20 74 68 69 73 20 63 61 6e 20 6f 6e  ode, this can on
110a0 6c 79 20 68 61 70 70 65 6e 20 0a 20 20 20 20 2a  ly happen .    *
110b0 2a 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  * if the page is
110c0 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   on the free-lis
110d0 74 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  t at the start o
110e0 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
110f0 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 70  n, then.    ** p
11100 6f 70 75 6c 61 74 65 64 2c 20 74 68 65 6e 20 6d  opulated, then m
11110 6f 76 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74  oved using sqlit
11120 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28  e3PagerMovepage(
11130 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  )..    **.    **
11140 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73   The solution is
11150 20 74 6f 20 61 64 64 20 61 6e 20 69 6e 2d 6d 65   to add an in-me
11160 6d 6f 72 79 20 70 61 67 65 20 74 6f 20 74 68 65  mory page to the
11170 20 63 61 63 68 65 20 63 6f 6e 74 61 69 6e 69 6e   cache containin
11180 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74  g.    ** the dat
11190 61 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f 6d  a just read from
111a0 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
111b0 2e 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20  . Mark the page 
111c0 61 73 20 64 69 72 74 79 20 0a 20 20 20 20 2a 2a  as dirty .    **
111d0 20 61 6e 64 20 69 66 20 74 68 65 20 70 61 67 65   and if the page
111e0 72 20 72 65 71 75 69 72 65 73 20 61 20 6a 6f 75  r requires a jou
111f0 72 6e 61 6c 2d 73 79 6e 63 2c 20 74 68 65 6e 20  rnal-sync, then 
11200 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73  mark the page as
11210 20 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72 69   .    ** requiri
11220 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e  ng a journal-syn
11230 63 20 62 65 66 6f 72 65 20 69 74 20 69 73 20 77  c before it is w
11240 72 69 74 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20  ritten..    */. 
11250 20 20 20 61 73 73 65 72 74 28 20 69 73 53 61 76     assert( isSav
11260 65 70 6e 74 20 29 3b 0a 20 20 20 20 61 73 73 65  epnt );.    asse
11270 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  rt( pPager->doNo
11280 74 53 70 69 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  tSpill==0 );.   
11290 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70   pPager->doNotSp
112a0 69 6c 6c 2b 2b 3b 0a 20 20 20 20 72 63 20 3d 20  ill++;.    rc = 
112b0 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75  sqlite3PagerAcqu
112c0 69 72 65 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  ire(pPager, pgno
112d0 2c 20 26 70 50 67 2c 20 31 29 3b 0a 20 20 20 20  , &pPg, 1);.    
112e0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
112f0 64 6f 4e 6f 74 53 70 69 6c 6c 3d 3d 31 20 29 3b  doNotSpill==1 );
11300 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e  .    pPager->doN
11310 6f 74 53 70 69 6c 6c 2d 2d 3b 0a 20 20 20 20 69  otSpill--;.    i
11320 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
11330 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
11340 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 26 3d 20    pPg->flags &= 
11350 7e 50 47 48 44 52 5f 4e 45 45 44 5f 52 45 41 44  ~PGHDR_NEED_READ
11360 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  ;.    sqlite3Pca
11370 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67  cheMakeDirty(pPg
11380 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67  );.  }.  if( pPg
11390 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 70 61   ){.    /* No pa
113a0 67 65 20 73 68 6f 75 6c 64 20 65 76 65 72 20 62  ge should ever b
113b0 65 20 65 78 70 6c 69 63 69 74 6c 79 20 72 6f 6c  e explicitly rol
113c0 6c 65 64 20 62 61 63 6b 20 74 68 61 74 20 69 73  led back that is
113d0 20 69 6e 20 75 73 65 2c 20 65 78 63 65 70 74 0a   in use, except.
113e0 20 20 20 20 2a 2a 20 66 6f 72 20 70 61 67 65 20      ** for page 
113f0 31 20 77 68 69 63 68 20 69 73 20 68 65 6c 64 20  1 which is held 
11400 69 6e 20 75 73 65 20 69 6e 20 6f 72 64 65 72 20  in use in order 
11410 74 6f 20 6b 65 65 70 20 74 68 65 20 6c 6f 63 6b  to keep the lock
11420 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64   on the.    ** d
11430 61 74 61 62 61 73 65 20 61 63 74 69 76 65 2e 20  atabase active. 
11440 48 6f 77 65 76 65 72 20 73 75 63 68 20 61 20 70  However such a p
11450 61 67 65 20 6d 61 79 20 62 65 20 72 6f 6c 6c 65  age may be rolle
11460 64 20 62 61 63 6b 20 61 73 20 61 20 72 65 73 75  d back as a resu
11470 6c 74 0a 20 20 20 20 2a 2a 20 6f 66 20 61 6e 20  lt.    ** of an 
11480 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72 20 72  internal error r
11490 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 6e 20 61  esulting in an a
114a0 75 74 6f 6d 61 74 69 63 20 63 61 6c 6c 20 74 6f  utomatic call to
114b0 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 50  .    ** sqlite3P
114c0 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a  agerRollback()..
114d0 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20      */.    void 
114e0 2a 70 44 61 74 61 3b 0a 20 20 20 20 70 44 61 74  *pData;.    pDat
114f0 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a  a = pPg->pData;.
11500 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74 61      memcpy(pData
11510 2c 20 28 75 38 2a 29 61 44 61 74 61 2c 20 70 50  , (u8*)aData, pP
11520 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
11530 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65  .    pPager->xRe
11540 69 6e 69 74 65 72 28 70 50 67 29 3b 0a 20 20 20  initer(pPg);.   
11550 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20   if( isMainJrnl 
11560 26 26 20 28 21 69 73 53 61 76 65 70 6e 74 20 7c  && (!isSavepnt |
11570 7c 20 2a 70 4f 66 66 73 65 74 3c 3d 70 50 61 67  | *pOffset<=pPag
11580 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 20  er->journalHdr) 
11590 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
115a0 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
115b0 68 69 73 20 70 61 67 65 20 77 65 72 65 20 6a 75  his page were ju
115c0 73 74 20 72 65 73 74 6f 72 65 64 20 66 72 6f 6d  st restored from
115d0 20 74 68 65 20 6d 61 69 6e 20 0a 20 20 20 20 20   the main .     
115e0 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   ** journal file
115f0 2c 20 74 68 65 6e 20 69 74 73 20 63 6f 6e 74 65  , then its conte
11600 6e 74 20 6d 75 73 74 20 62 65 20 61 73 20 74 68  nt must be as th
11610 65 79 20 77 65 72 65 20 77 68 65 6e 20 74 68 65  ey were when the
11620 20 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73   .      ** trans
11630 61 63 74 69 6f 6e 20 77 61 73 20 66 69 72 73 74  action was first
11640 20 6f 70 65 6e 65 64 2e 20 49 6e 20 74 68 69 73   opened. In this
11650 20 63 61 73 65 20 77 65 20 63 61 6e 20 6d 61 72   case we can mar
11660 6b 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20  k the page.     
11670 20 2a 2a 20 61 73 20 63 6c 65 61 6e 2c 20 73 69   ** as clean, si
11680 6e 63 65 20 74 68 65 72 65 20 77 69 6c 6c 20 62  nce there will b
11690 65 20 6e 6f 20 6e 65 65 64 20 74 6f 20 77 72 69  e no need to wri
116a0 74 65 20 69 74 20 6f 75 74 20 74 6f 20 74 68 65  te it out to the
116b0 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61  .      ** databa
116c0 73 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  se..      **.   
116d0 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20 6f     ** There is o
116e0 6e 65 20 65 78 63 65 70 74 69 6f 6e 20 74 6f 20  ne exception to 
116f0 74 68 69 73 20 72 75 6c 65 2e 20 49 66 20 74 68  this rule. If th
11700 65 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20  e page is being 
11710 72 6f 6c 6c 65 64 0a 20 20 20 20 20 20 2a 2a 20  rolled.      ** 
11720 62 61 63 6b 20 61 73 20 70 61 72 74 20 6f 66 20  back as part of 
11730 61 20 73 61 76 65 70 6f 69 6e 74 20 28 6f 72 20  a savepoint (or 
11740 73 74 61 74 65 6d 65 6e 74 29 20 72 6f 6c 6c 62  statement) rollb
11750 61 63 6b 20 66 72 6f 6d 20 61 6e 20 0a 20 20 20  ack from an .   
11760 20 20 20 2a 2a 20 75 6e 73 79 6e 63 65 64 20 70     ** unsynced p
11770 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 61  ortion of the ma
11780 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  in journal file,
11790 20 74 68 65 6e 20 69 74 20 69 73 20 6e 6f 74 20   then it is not 
117a0 73 61 66 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f  safe.      ** to
117b0 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61   mark the page a
117c0 73 20 63 6c 65 61 6e 2e 20 54 68 69 73 20 69 73  s clean. This is
117d0 20 62 65 63 61 75 73 65 20 6d 61 72 6b 69 6e 67   because marking
117e0 20 74 68 65 20 70 61 67 65 20 61 73 0a 20 20 20   the page as.   
117f0 20 20 20 2a 2a 20 63 6c 65 61 6e 20 77 69 6c 6c     ** clean will
11800 20 63 6c 65 61 72 20 74 68 65 20 50 47 48 44 52   clear the PGHDR
11810 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 2e  _NEED_SYNC flag.
11820 20 53 69 6e 63 65 20 74 68 65 20 70 61 67 65 20   Since the page 
11830 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 6c 72 65  is.      ** alre
11840 61 64 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ady in the journ
11850 61 6c 20 66 69 6c 65 20 28 72 65 63 6f 72 64 65  al file (recorde
11860 64 20 69 6e 20 50 61 67 65 72 2e 70 49 6e 4a 6f  d in Pager.pInJo
11870 75 72 6e 61 6c 29 20 61 6e 64 0a 20 20 20 20 20  urnal) and.     
11880 20 2a 2a 20 74 68 65 20 50 47 48 44 52 5f 4e 45   ** the PGHDR_NE
11890 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 69 73 20  ED_SYNC flag is 
118a0 63 6c 65 61 72 65 64 2c 20 69 66 20 74 68 65 20  cleared, if the 
118b0 70 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20  page is written 
118c0 74 6f 0a 20 20 20 20 20 20 2a 2a 20 61 67 61 69  to.      ** agai
118d0 6e 20 77 69 74 68 69 6e 20 74 68 69 73 20 74 72  n within this tr
118e0 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20 77 69  ansaction, it wi
118f0 6c 6c 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20  ll be marked as 
11900 64 69 72 74 79 20 62 75 74 0a 20 20 20 20 20 20  dirty but.      
11910 2a 2a 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45  ** the PGHDR_NEE
11920 44 5f 53 59 4e 43 20 66 6c 61 67 20 77 69 6c 6c  D_SYNC flag will
11930 20 6e 6f 74 20 62 65 20 73 65 74 2e 20 49 74 20   not be set. It 
11940 63 6f 75 6c 64 20 74 68 65 6e 20 70 6f 74 65 6e  could then poten
11950 74 69 61 6c 6c 79 0a 20 20 20 20 20 20 2a 2a 20  tially.      ** 
11960 62 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20 69  be written out i
11970 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
11980 20 66 69 6c 65 20 62 65 66 6f 72 65 20 69 74 73   file before its
11990 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20   journal file.  
119a0 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74 20 69      ** segment i
119b0 73 20 73 79 6e 63 65 64 2e 20 49 66 20 61 20 63  s synced. If a c
119c0 72 61 73 68 20 6f 63 63 75 72 73 20 64 75 72 69  rash occurs duri
119d0 6e 67 20 6f 72 20 66 6f 6c 6c 6f 77 69 6e 67 20  ng or following 
119e0 74 68 69 73 2c 0a 20 20 20 20 20 20 2a 2a 20 64  this,.      ** d
119f0 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
11a00 6f 6e 20 6d 61 79 20 65 6e 73 75 65 2e 0a 20 20  on may ensue..  
11a10 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73      */.      ass
11a20 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
11a30 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  l(pPager) );.   
11a40 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
11a50 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a  MakeClean(pPg);.
11a60 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
11a70 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
11a80 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73      pPg->pageHas
11a90 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61  h = pager_pageha
11aa0 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a  sh(pPg);.#endif.
11ab0 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77      /* If this w
11ac0 61 73 20 70 61 67 65 20 31 2c 20 74 68 65 6e 20  as page 1, then 
11ad0 72 65 73 74 6f 72 65 20 74 68 65 20 76 61 6c 75  restore the valu
11ae0 65 20 6f 66 20 50 61 67 65 72 2e 64 62 46 69 6c  e of Pager.dbFil
11af0 65 56 65 72 73 2e 0a 20 20 20 20 2a 2a 20 44 6f  eVers..    ** Do
11b00 20 74 68 69 73 20 62 65 66 6f 72 65 20 61 6e 79   this before any
11b10 20 64 65 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20   decoding. */.  
11b20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b    if( pgno==1 ){
11b30 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70  .      memcpy(&p
11b40 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
11b50 73 2c 20 26 28 28 75 38 2a 29 70 44 61 74 61 29  s, &((u8*)pData)
11b60 5b 32 34 5d 2c 73 69 7a 65 6f 66 28 70 50 61 67  [24],sizeof(pPag
11b70 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29  er->dbFileVers))
11b80 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
11b90 44 65 63 6f 64 65 20 74 68 65 20 70 61 67 65 20  Decode the page 
11ba0 6a 75 73 74 20 72 65 61 64 20 66 72 6f 6d 20 64  just read from d
11bb0 69 73 6b 20 2a 2f 0a 20 20 20 20 43 4f 44 45 43  isk */.    CODEC
11bc0 31 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c  1(pPager, pData,
11bd0 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 2c 20 72   pPg->pgno, 3, r
11be0 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b  c=SQLITE_NOMEM);
11bf0 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
11c00 68 65 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a  heRelease(pPg);.
11c10 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
11c20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65  .}../*.** Parame
11c30 74 65 72 20 7a 4d 61 73 74 65 72 20 69 73 20 74  ter zMaster is t
11c40 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73  he name of a mas
11c50 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
11c60 2e 20 41 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e  . A single journ
11c70 61 6c 0a 2a 2a 20 66 69 6c 65 20 74 68 61 74 20  al.** file that 
11c80 72 65 66 65 72 72 65 64 20 74 6f 20 74 68 65 20  referred to the 
11c90 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
11ca0 69 6c 65 20 68 61 73 20 6a 75 73 74 20 62 65 65  ile has just bee
11cb0 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  n rolled back..*
11cc0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
11cd0 68 65 63 6b 73 20 69 66 20 69 74 20 69 73 20 70  hecks if it is p
11ce0 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74  ossible to delet
11cf0 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
11d00 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e  rnal file,.** an
11d10 64 20 64 6f 65 73 20 73 6f 20 69 66 20 69 74 20  d does so if it 
11d20 69 73 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65  is..**.** Argume
11d30 6e 74 20 7a 4d 61 73 74 65 72 20 6d 61 79 20 70  nt zMaster may p
11d40 6f 69 6e 74 20 74 6f 20 50 61 67 65 72 2e 70 54  oint to Pager.pT
11d50 6d 70 53 70 61 63 65 2e 20 53 6f 20 74 68 61 74  mpSpace. So that
11d60 20 62 75 66 66 65 72 20 69 73 20 6e 6f 74 20 0a   buffer is not .
11d70 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  ** available for
11d80 20 75 73 65 20 77 69 74 68 69 6e 20 74 68 69 73   use within this
11d90 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
11da0 20 57 68 65 6e 20 61 20 6d 61 73 74 65 72 20 6a   When a master j
11db0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 63  ournal file is c
11dc0 72 65 61 74 65 64 2c 20 69 74 20 69 73 20 70 6f  reated, it is po
11dd0 70 75 6c 61 74 65 64 20 77 69 74 68 20 74 68 65  pulated with the
11de0 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 61 6c   names .** of al
11df0 6c 20 6f 66 20 69 74 73 20 63 68 69 6c 64 20 6a  l of its child j
11e00 6f 75 72 6e 61 6c 73 2c 20 6f 6e 65 20 61 66 74  ournals, one aft
11e10 65 72 20 61 6e 6f 74 68 65 72 2c 20 66 6f 72 6d  er another, form
11e20 61 74 74 65 64 20 61 73 20 75 74 66 2d 38 20 0a  atted as utf-8 .
11e30 2a 2a 20 65 6e 63 6f 64 65 64 20 74 65 78 74 2e  ** encoded text.
11e40 20 54 68 65 20 65 6e 64 20 6f 66 20 65 61 63 68   The end of each
11e50 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 66   child journal f
11e60 69 6c 65 20 69 73 20 6d 61 72 6b 65 64 20 77 69  ile is marked wi
11e70 74 68 20 61 20 0a 2a 2a 20 6e 75 6c 2d 74 65 72  th a .** nul-ter
11e80 6d 69 6e 61 74 6f 72 20 62 79 74 65 20 28 30 78  minator byte (0x
11e90 30 30 29 2e 20 69 2e 65 2e 20 74 68 65 20 65 6e  00). i.e. the en
11ea0 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66  tire contents of
11eb0 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
11ec0 6c 0a 2a 2a 20 66 69 6c 65 20 66 6f 72 20 61 20  l.** file for a 
11ed0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 76 6f  transaction invo
11ee0 6c 76 69 6e 67 20 74 77 6f 20 64 61 74 61 62 61  lving two databa
11ef0 73 65 73 20 6d 69 67 68 74 20 62 65 3a 0a 2a 2a  ses might be:.**
11f00 0a 2a 2a 20 20 20 22 2f 68 6f 6d 65 2f 62 69 6c  .**   "/home/bil
11f10 6c 2f 61 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78  l/a.db-journal\x
11f20 30 30 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 62 2e 64  00/home/bill/b.d
11f30 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30 22 0a 2a  b-journal\x00".*
11f40 2a 0a 2a 2a 20 41 20 6d 61 73 74 65 72 20 6a 6f  *.** A master jo
11f50 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f  urnal file may o
11f60 6e 6c 79 20 62 65 20 64 65 6c 65 74 65 64 20 6f  nly be deleted o
11f70 6e 63 65 20 61 6c 6c 20 6f 66 20 69 74 73 20 63  nce all of its c
11f80 68 69 6c 64 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  hild .** journal
11f90 73 20 68 61 76 65 20 62 65 65 6e 20 72 6f 6c 6c  s have been roll
11fa0 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54  ed back..**.** T
11fb0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 61  his function rea
11fc0 64 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ds the contents 
11fd0 6f 66 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f  of the master-jo
11fe0 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20  urnal file into 
11ff0 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20 6c  .** memory and l
12000 6f 6f 70 73 20 74 68 72 6f 75 67 68 20 65 61 63  oops through eac
12010 68 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 6a  h of the child j
12020 6f 75 72 6e 61 6c 20 6e 61 6d 65 73 2e 20 46 6f  ournal names. Fo
12030 72 0a 2a 2a 20 65 61 63 68 20 63 68 69 6c 64 20  r.** each child 
12040 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 63 68 65 63  journal, it chec
12050 6b 73 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  ks if:.**.**   *
12060 20 69 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f   if the child jo
12070 75 72 6e 61 6c 20 65 78 69 73 74 73 2c 20 61 6e  urnal exists, an
12080 64 20 69 66 20 73 6f 0a 2a 2a 20 20 20 2a 20 69  d if so.**   * i
12090 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72  f the child jour
120a0 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 20 61 20 72  nal contains a r
120b0 65 66 65 72 65 6e 63 65 20 74 6f 20 6d 61 73 74  eference to mast
120c0 65 72 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20  er journal .**  
120d0 20 20 20 66 69 6c 65 20 7a 4d 61 73 74 65 72 0a     file zMaster.
120e0 2a 2a 0a 2a 2a 20 49 66 20 61 20 63 68 69 6c 64  **.** If a child
120f0 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20   journal can be 
12100 66 6f 75 6e 64 20 74 68 61 74 20 6d 61 74 63 68  found that match
12110 65 73 20 62 6f 74 68 20 6f 66 20 74 68 65 20 63  es both of the c
12120 72 69 74 65 72 69 61 0a 2a 2a 20 61 62 6f 76 65  riteria.** above
12130 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
12140 72 65 74 75 72 6e 73 20 77 69 74 68 6f 75 74 20  returns without 
12150 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 20  doing anything. 
12160 4f 74 68 65 72 77 69 73 65 2c 20 69 66 0a 2a 2a  Otherwise, if.**
12170 20 6e 6f 20 73 75 63 68 20 63 68 69 6c 64 20 6a   no such child j
12180 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f  ournal can be fo
12190 75 6e 64 2c 20 66 69 6c 65 20 7a 4d 61 73 74 65  und, file zMaste
121a0 72 20 69 73 20 64 65 6c 65 74 65 64 20 66 72 6f  r is deleted fro
121b0 6d 0a 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73 79  m.** the file-sy
121c0 73 74 65 6d 20 75 73 69 6e 67 20 73 71 6c 69 74  stem using sqlit
121d0 65 33 4f 73 44 65 6c 65 74 65 28 29 2e 0a 2a 2a  e3OsDelete()..**
121e0 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72  .** If an IO err
121f0 6f 72 20 77 69 74 68 69 6e 20 74 68 69 73 20 66  or within this f
12200 75 6e 63 74 69 6f 6e 2c 20 61 6e 20 65 72 72 6f  unction, an erro
12210 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
12220 65 64 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63  ed. This.** func
12230 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 6d  tion allocates m
12240 65 6d 6f 72 79 20 62 79 20 63 61 6c 6c 69 6e 67  emory by calling
12250 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29   sqlite3Malloc()
12260 2e 20 49 66 20 61 6e 20 61 6c 6c 6f 63 61 74 69  . If an allocati
12270 6f 6e 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c  on.** fails, SQL
12280 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74  ITE_NOMEM is ret
12290 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
122a0 2c 20 69 66 20 6e 6f 20 49 4f 20 6f 72 20 6d 61  , if no IO or ma
122b0 6c 6c 6f 63 20 65 72 72 6f 72 73 20 0a 2a 2a 20  lloc errors .** 
122c0 6f 63 63 75 72 2c 20 53 51 4c 49 54 45 5f 4f 4b  occur, SQLITE_OK
122d0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
122e0 0a 2a 2a 20 54 4f 44 4f 3a 20 54 68 69 73 20 66  .** TODO: This f
122f0 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65  unction allocate
12300 73 20 61 20 73 69 6e 67 6c 65 20 62 6c 6f 63 6b  s a single block
12310 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20 6c 6f   of memory to lo
12320 61 64 0a 2a 2a 20 74 68 65 20 65 6e 74 69 72 65  ad.** the entire
12330 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
12340 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
12350 66 69 6c 65 2e 20 54 68 69 73 20 63 6f 75 6c 64  file. This could
12360 20 62 65 0a 2a 2a 20 61 20 63 6f 75 70 6c 65 20   be.** a couple 
12370 6f 66 20 6b 69 6c 6f 62 79 74 65 73 20 6f 72 20  of kilobytes or 
12380 73 6f 20 2d 20 70 6f 74 65 6e 74 69 61 6c 6c 79  so - potentially
12390 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
123a0 20 70 61 67 65 20 0a 2a 2a 20 73 69 7a 65 2e 0a   page .** size..
123b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
123c0 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 50 61  ger_delmaster(Pa
123d0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e  ger *pPager, con
123e0 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  st char *zMaster
123f0 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ){.  sqlite3_vfs
12400 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d   *pVfs = pPager-
12410 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b  >pVfs;.  int rc;
12420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12430 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
12440 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  e */.  sqlite3_f
12450 69 6c 65 20 2a 70 4d 61 73 74 65 72 3b 20 20 20  ile *pMaster;   
12460 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20 6d 61 73   /* Malloc'd mas
12470 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter-journal file
12480 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20   descriptor */. 
12490 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
124a0 4a 6f 75 72 6e 61 6c 3b 20 20 20 2f 2a 20 4d 61  Journal;   /* Ma
124b0 6c 6c 6f 63 27 64 20 63 68 69 6c 64 2d 6a 6f 75  lloc'd child-jou
124c0 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69  rnal file descri
124d0 70 74 6f 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ptor */.  char *
124e0 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d  zMasterJournal =
124f0 20 30 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74 73 20   0; /* Contents 
12500 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  of master journa
12510 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20  l file */.  i64 
12520 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 20  nMasterJournal; 
12530 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
12540 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
12550 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  file */.  char *
12560 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20  zJournal;       
12570 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
12580 6f 20 6f 6e 65 20 6a 6f 75 72 6e 61 6c 20 77 69  o one journal wi
12590 74 68 69 6e 20 4d 4a 20 66 69 6c 65 20 2a 2f 0a  thin MJ file */.
125a0 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 50    char *zMasterP
125b0 74 72 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53  tr;         /* S
125c0 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 4d 4a 20  pace to hold MJ 
125d0 66 69 6c 65 6e 61 6d 65 20 66 72 6f 6d 20 61 20  filename from a 
125e0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
125f0 20 20 69 6e 74 20 6e 4d 61 73 74 65 72 50 74 72    int nMasterPtr
12600 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  ;           /* A
12610 6d 6f 75 6e 74 20 6f 66 20 73 70 61 63 65 20 61  mount of space a
12620 6c 6c 6f 63 61 74 65 64 20 74 6f 20 7a 4d 61 73  llocated to zMas
12630 74 65 72 50 74 72 5b 5d 20 2a 2f 0a 0a 20 20 2f  terPtr[] */..  /
12640 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * Allocate space
12650 20 66 6f 72 20 62 6f 74 68 20 74 68 65 20 70 4a   for both the pJ
12660 6f 75 72 6e 61 6c 20 61 6e 64 20 70 4d 61 73 74  ournal and pMast
12670 65 72 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  er file descript
12680 6f 72 73 2e 0a 20 20 2a 2a 20 49 66 20 73 75 63  ors..  ** If suc
12690 63 65 73 73 66 75 6c 2c 20 6f 70 65 6e 20 74 68  cessful, open th
126a0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
126b0 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64 69 6e   file for readin
126c0 67 2e 0a 20 20 2a 2f 0a 20 20 70 4d 61 73 74 65  g..  */.  pMaste
126d0 72 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c  r = (sqlite3_fil
126e0 65 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  e *)sqlite3Mallo
126f0 63 5a 65 72 6f 28 70 56 66 73 2d 3e 73 7a 4f 73  cZero(pVfs->szOs
12700 46 69 6c 65 20 2a 20 32 29 3b 0a 20 20 70 4a 6f  File * 2);.  pJo
12710 75 72 6e 61 6c 20 3d 20 28 73 71 6c 69 74 65 33  urnal = (sqlite3
12720 5f 66 69 6c 65 20 2a 29 28 28 28 75 38 20 2a 29  _file *)(((u8 *)
12730 70 4d 61 73 74 65 72 29 20 2b 20 70 56 66 73 2d  pMaster) + pVfs-
12740 3e 73 7a 4f 73 46 69 6c 65 29 3b 0a 20 20 69 66  >szOsFile);.  if
12750 28 20 21 70 4d 61 73 74 65 72 20 29 7b 0a 20 20  ( !pMaster ){.  
12760 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
12770 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  MEM;.  }else{.  
12780 20 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67    const int flag
12790 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e  s = (SQLITE_OPEN
127a0 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45  _READONLY|SQLITE
127b0 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55  _OPEN_MASTER_JOU
127c0 52 4e 41 4c 29 3b 0a 20 20 20 20 72 63 20 3d 20  RNAL);.    rc = 
127d0 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56  sqlite3OsOpen(pV
127e0 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 70 4d 61  fs, zMaster, pMa
127f0 73 74 65 72 2c 20 66 6c 61 67 73 2c 20 30 29 3b  ster, flags, 0);
12800 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53  .  }.  if( rc!=S
12810 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
12820 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a  delmaster_out;..
12830 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 65 6e    /* Load the en
12840 74 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72  tire master jour
12850 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 73 70  nal file into sp
12860 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ace obtained fro
12870 6d 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 6d  m.  ** sqlite3_m
12880 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70 6f 69 6e  alloc() and poin
12890 74 65 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65  ted to by zMaste
128a0 72 4a 6f 75 72 6e 61 6c 2e 20 20 20 41 6c 73 6f  rJournal.   Also
128b0 20 6f 62 74 61 69 6e 0a 20 20 2a 2a 20 73 75 66   obtain.  ** suf
128c0 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 28 69  ficient space (i
128d0 6e 20 7a 4d 61 73 74 65 72 50 74 72 29 20 74 6f  n zMasterPtr) to
128e0 20 68 6f 6c 64 20 74 68 65 20 6e 61 6d 65 73 20   hold the names 
128f0 6f 66 20 6d 61 73 74 65 72 0a 20 20 2a 2a 20 6a  of master.  ** j
12900 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 65 78 74  ournal files ext
12910 72 61 63 74 65 64 20 66 72 6f 6d 20 72 65 67 75  racted from regu
12920 6c 61 72 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75  lar rollback-jou
12930 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a 20 20 72 63  rnals..  */.  rc
12940 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
12950 53 69 7a 65 28 70 4d 61 73 74 65 72 2c 20 26 6e  Size(pMaster, &n
12960 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a  MasterJournal);.
12970 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
12980 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61  _OK ) goto delma
12990 73 74 65 72 5f 6f 75 74 3b 0a 20 20 6e 4d 61 73  ster_out;.  nMas
129a0 74 65 72 50 74 72 20 3d 20 70 56 66 73 2d 3e 6d  terPtr = pVfs->m
129b0 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 7a  xPathname+1;.  z
129c0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20  MasterJournal = 
129d0 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 28 69  sqlite3Malloc((i
129e0 6e 74 29 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  nt)nMasterJourna
129f0 6c 20 2b 20 6e 4d 61 73 74 65 72 50 74 72 20 2b  l + nMasterPtr +
12a00 20 31 29 3b 0a 20 20 69 66 28 20 21 7a 4d 61 73   1);.  if( !zMas
12a10 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  terJournal ){.  
12a20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
12a30 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 64 65  MEM;.    goto de
12a40 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 7d  lmaster_out;.  }
12a50 0a 20 20 7a 4d 61 73 74 65 72 50 74 72 20 3d 20  .  zMasterPtr = 
12a60 26 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5b  &zMasterJournal[
12a70 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2b 31  nMasterJournal+1
12a80 5d 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ];.  rc = sqlite
12a90 33 4f 73 52 65 61 64 28 70 4d 61 73 74 65 72 2c  3OsRead(pMaster,
12aa0 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c   zMasterJournal,
12ab0 20 28 69 6e 74 29 6e 4d 61 73 74 65 72 4a 6f 75   (int)nMasterJou
12ac0 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 69 66 28 20  rnal, 0);.  if( 
12ad0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
12ae0 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
12af0 75 74 3b 0a 20 20 7a 4d 61 73 74 65 72 4a 6f 75  ut;.  zMasterJou
12b00 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72  rnal[nMasterJour
12b10 6e 61 6c 5d 20 3d 20 30 3b 0a 0a 20 20 7a 4a 6f  nal] = 0;..  zJo
12b20 75 72 6e 61 6c 20 3d 20 7a 4d 61 73 74 65 72 4a  urnal = zMasterJ
12b30 6f 75 72 6e 61 6c 3b 0a 20 20 77 68 69 6c 65 28  ournal;.  while(
12b40 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d 61 73 74   (zJournal-zMast
12b50 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d 61 73 74  erJournal)<nMast
12b60 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  erJournal ){.   
12b70 20 69 6e 74 20 65 78 69 73 74 73 3b 0a 20 20 20   int exists;.   
12b80 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41   rc = sqlite3OsA
12b90 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4a 6f 75  ccess(pVfs, zJou
12ba0 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43  rnal, SQLITE_ACC
12bb0 45 53 53 5f 45 58 49 53 54 53 2c 20 26 65 78 69  ESS_EXISTS, &exi
12bc0 73 74 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63  sts);.    if( rc
12bd0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
12be0 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
12bf0 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  ter_out;.    }. 
12c00 20 20 20 69 66 28 20 65 78 69 73 74 73 20 29 7b     if( exists ){
12c10 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66  .      /* One of
12c20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 20 70 6f   the journals po
12c30 69 6e 74 65 64 20 74 6f 20 62 79 20 74 68 65 20  inted to by the 
12c40 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 65  master journal e
12c50 78 69 73 74 73 2e 0a 20 20 20 20 20 20 2a 2a 20  xists..      ** 
12c60 4f 70 65 6e 20 69 74 20 61 6e 64 20 63 68 65 63  Open it and chec
12c70 6b 20 69 66 20 69 74 20 70 6f 69 6e 74 73 20 61  k if it points a
12c80 74 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  t the master jou
12c90 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 20 20 2a  rnal. If.      *
12ca0 2a 20 73 6f 2c 20 72 65 74 75 72 6e 20 77 69 74  * so, return wit
12cb0 68 6f 75 74 20 64 65 6c 65 74 69 6e 67 20 74 68  hout deleting th
12cc0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
12cd0 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a   file..      */.
12ce0 20 20 20 20 20 20 69 6e 74 20 63 3b 0a 20 20 20        int c;.   
12cf0 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28     int flags = (
12d00 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
12d10 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  ONLY|SQLITE_OPEN
12d20 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a  _MAIN_JOURNAL);.
12d30 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
12d40 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a  e3OsOpen(pVfs, z
12d50 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f 75 72 6e 61  Journal, pJourna
12d60 6c 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20  l, flags, 0);.  
12d70 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
12d80 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
12d90 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
12da0 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  out;.      }..  
12db0 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73      rc = readMas
12dc0 74 65 72 4a 6f 75 72 6e 61 6c 28 70 4a 6f 75 72  terJournal(pJour
12dd0 6e 61 6c 2c 20 7a 4d 61 73 74 65 72 50 74 72 2c  nal, zMasterPtr,
12de0 20 6e 4d 61 73 74 65 72 50 74 72 29 3b 0a 20 20   nMasterPtr);.  
12df0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
12e00 73 65 28 70 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  se(pJournal);.  
12e10 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
12e20 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
12e30 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
12e40 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  out;.      }..  
12e50 20 20 20 20 63 20 3d 20 7a 4d 61 73 74 65 72 50      c = zMasterP
12e60 74 72 5b 30 5d 21 3d 30 20 26 26 20 73 74 72 63  tr[0]!=0 && strc
12e70 6d 70 28 7a 4d 61 73 74 65 72 50 74 72 2c 20 7a  mp(zMasterPtr, z
12e80 4d 61 73 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20  Master)==0;.    
12e90 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20 20    if( c ){.     
12ea0 20 20 20 2f 2a 20 57 65 20 68 61 76 65 20 61 20     /* We have a 
12eb0 6d 61 74 63 68 2e 20 44 6f 20 6e 6f 74 20 64 65  match. Do not de
12ec0 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
12ed0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f  journal file. */
12ee0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65  .        goto de
12ef0 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
12f00 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a     }.    }.    z
12f10 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28 73 71 6c 69  Journal += (sqli
12f20 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4a 6f 75  te3Strlen30(zJou
12f30 72 6e 61 6c 29 2b 31 29 3b 0a 20 20 7d 0a 20 0a  rnal)+1);.  }. .
12f40 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
12f50 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72 63 20  (pMaster);.  rc 
12f60 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74  = sqlite3OsDelet
12f70 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  e(pVfs, zMaster,
12f80 20 30 29 3b 0a 0a 64 65 6c 6d 61 73 74 65 72 5f   0);..delmaster_
12f90 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66  out:.  sqlite3_f
12fa0 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  ree(zMasterJourn
12fb0 61 6c 29 3b 0a 20 20 69 66 28 20 70 4d 61 73 74  al);.  if( pMast
12fc0 65 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  er ){.    sqlite
12fd0 33 4f 73 43 6c 6f 73 65 28 70 4d 61 73 74 65 72  3OsClose(pMaster
12fe0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
12ff0 69 73 4f 70 65 6e 28 70 4a 6f 75 72 6e 61 6c 29  isOpen(pJournal)
13000 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   );.    sqlite3_
13010 66 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  free(pMaster);. 
13020 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
13030 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  }.../*.** This f
13040 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
13050 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 61 63  to change the ac
13060 74 75 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65  tual size of the
13070 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 66 69   database .** fi
13080 6c 65 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73  le in the file-s
13090 79 73 74 65 6d 2e 20 54 68 69 73 20 6f 6e 6c 79  ystem. This only
130a0 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 63 6f   happens when co
130b0 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73  mmitting a trans
130c0 61 63 74 69 6f 6e 2c 0a 2a 2a 20 6f 72 20 72 6f  action,.** or ro
130d0 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 74 72 61  lling back a tra
130e0 6e 73 61 63 74 69 6f 6e 20 28 69 6e 63 6c 75 64  nsaction (includ
130f0 69 6e 67 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  ing rolling back
13100 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 29 2e   a hot-journal).
13110 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6d 61  .**.** If the ma
13120 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
13130 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72   is not open, or
13140 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
13150 63 6b 20 69 73 20 6e 6f 74 0a 2a 2a 20 68 65 6c  ck is not.** hel
13160 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  d, this function
13170 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68   is a no-op. Oth
13180 65 72 77 69 73 65 2c 20 74 68 65 20 73 69 7a 65  erwise, the size
13190 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73 0a   of the file is.
131a0 2a 2a 20 63 68 61 6e 67 65 64 20 74 6f 20 6e 50  ** changed to nP
131b0 61 67 65 20 70 61 67 65 73 20 28 6e 50 61 67 65  age pages (nPage
131c0 2a 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  *pPager->pageSiz
131d0 65 20 62 79 74 65 73 29 2e 20 49 66 20 74 68 65  e bytes). If the
131e0 20 66 69 6c 65 0a 2a 2a 20 6f 6e 20 64 69 73 6b   file.** on disk
131f0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6c 61   is currently la
13200 72 67 65 72 20 74 68 61 6e 20 6e 50 61 67 65 20  rger than nPage 
13210 70 61 67 65 73 2c 20 74 68 65 6e 20 75 73 65 20  pages, then use 
13220 74 68 65 20 56 46 53 0a 2a 2a 20 78 54 72 75 6e  the VFS.** xTrun
13230 63 61 74 65 28 29 20 6d 65 74 68 6f 64 20 74 6f  cate() method to
13240 20 74 72 75 6e 63 61 74 65 20 69 74 2e 0a 2a 2a   truncate it..**
13250 0a 2a 2a 20 4f 72 2c 20 69 74 20 6d 69 67 68 74  .** Or, it might
13260 20 6d 69 67 68 74 20 62 65 20 74 68 65 20 63 61   might be the ca
13270 73 65 20 74 68 61 74 20 74 68 65 20 66 69 6c 65  se that the file
13280 20 6f 6e 20 64 69 73 6b 20 69 73 20 73 6d 61 6c   on disk is smal
13290 6c 65 72 20 74 68 61 6e 20 0a 2a 2a 20 6e 50 61  ler than .** nPa
132a0 67 65 20 70 61 67 65 73 2e 20 53 6f 6d 65 20 6f  ge pages. Some o
132b0 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
132c0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20  implementations 
132d0 63 61 6e 20 67 65 74 20 63 6f 6e 66 75 73 65 64  can get confused
132e0 20 69 66 20 0a 2a 2a 20 79 6f 75 20 74 72 79 20   if .** you try 
132f0 74 6f 20 74 72 75 6e 63 61 74 65 20 61 20 66 69  to truncate a fi
13300 6c 65 20 74 6f 20 73 6f 6d 65 20 73 69 7a 65 20  le to some size 
13310 74 68 61 74 20 69 73 20 6c 61 72 67 65 72 20 74  that is larger t
13320 68 61 6e 20 69 74 20 0a 2a 2a 20 63 75 72 72 65  han it .** curre
13330 6e 74 6c 79 20 69 73 2c 20 73 6f 20 64 65 74 65  ntly is, so dete
13340 63 74 20 74 68 69 73 20 63 61 73 65 20 61 6e 64  ct this case and
13350 20 77 72 69 74 65 20 61 20 73 69 6e 67 6c 65 20   write a single 
13360 7a 65 72 6f 20 62 79 74 65 20 74 6f 20 0a 2a 2a  zero byte to .**
13370 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
13380 6e 65 77 20 66 69 6c 65 20 69 6e 73 74 65 61 64  new file instead
13390 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65  ..**.** If succe
133a0 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 20 53 51  ssful, return SQ
133b0 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 49  LITE_OK. If an I
133c0 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  O error occurs w
133d0 68 69 6c 65 20 6d 6f 64 69 66 79 69 6e 67 0a 2a  hile modifying.*
133e0 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
133f0 69 6c 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20  ile, return the 
13400 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68  error code to th
13410 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61  e caller..*/.sta
13420 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 74 72  tic int pager_tr
13430 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70 50  uncate(Pager *pP
13440 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65  ager, Pgno nPage
13450 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
13460 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70  LITE_OK;.  if( p
13470 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
13480 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 26 26  GER_EXCLUSIVE &&
13490 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
134a0 66 64 29 20 29 7b 0a 20 20 20 20 69 36 34 20 63  fd) ){.    i64 c
134b0 75 72 72 65 6e 74 53 69 7a 65 2c 20 6e 65 77 53  urrentSize, newS
134c0 69 7a 65 3b 0a 20 20 20 20 2f 2a 20 54 4f 44 4f  ize;.    /* TODO
134d0 3a 20 49 73 20 69 74 20 73 61 66 65 20 74 6f 20  : Is it safe to 
134e0 75 73 65 20 50 61 67 65 72 2e 64 62 46 69 6c 65  use Pager.dbFile
134f0 53 69 7a 65 20 68 65 72 65 3f 20 2a 2f 0a 20 20  Size here? */.  
13500 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
13510 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
13520 3e 66 64 2c 20 26 63 75 72 72 65 6e 74 53 69 7a  >fd, &currentSiz
13530 65 29 3b 0a 20 20 20 20 6e 65 77 53 69 7a 65 20  e);.    newSize 
13540 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
13550 7a 65 2a 28 69 36 34 29 6e 50 61 67 65 3b 0a 20  ze*(i64)nPage;. 
13560 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
13570 45 5f 4f 4b 20 26 26 20 63 75 72 72 65 6e 74 53  E_OK && currentS
13580 69 7a 65 21 3d 6e 65 77 53 69 7a 65 20 29 7b 0a  ize!=newSize ){.
13590 20 20 20 20 20 20 69 66 28 20 63 75 72 72 65 6e        if( curren
135a0 74 53 69 7a 65 3e 6e 65 77 53 69 7a 65 20 29 7b  tSize>newSize ){
135b0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
135c0 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
135d0 70 50 61 67 65 72 2d 3e 66 64 2c 20 6e 65 77 53  pPager->fd, newS
135e0 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ize);.      }els
135f0 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
13600 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
13610 50 61 67 65 72 2d 3e 66 64 2c 20 22 22 2c 20 31  Pager->fd, "", 1
13620 2c 20 6e 65 77 53 69 7a 65 2d 31 29 3b 0a 20 20  , newSize-1);.  
13630 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
13640 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
13650 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
13660 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 6e 50  >dbFileSize = nP
13670 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  age;.      }.   
13680 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
13690 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  rc;.}../*.** Set
136a0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
136b0 65 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69  e Pager.sectorSi
136c0 7a 65 20 76 61 72 69 61 62 6c 65 20 66 6f 72 20  ze variable for 
136d0 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 70 61 67  the given.** pag
136e0 65 72 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  er based on the 
136f0 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
13700 79 20 74 68 65 20 78 53 65 63 74 6f 72 53 69 7a  y the xSectorSiz
13710 65 20 6d 65 74 68 6f 64 0a 2a 2a 20 6f 66 20 74  e method.** of t
13720 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  he open database
13730 20 66 69 6c 65 2e 20 54 68 65 20 73 65 63 74 6f   file. The secto
13740 72 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 20 75  r size will be u
13750 73 65 64 20 75 73 65 64 20 0a 2a 2a 20 74 6f 20  sed used .** to 
13760 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 73 69  determine the si
13770 7a 65 20 61 6e 64 20 61 6c 69 67 6e 6d 65 6e 74  ze and alignment
13780 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64   of journal head
13790 65 72 20 61 6e 64 20 0a 2a 2a 20 6d 61 73 74 65  er and .** maste
137a0 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65  r journal pointe
137b0 72 73 20 77 69 74 68 69 6e 20 63 72 65 61 74 65  rs within create
137c0 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e  d journal files.
137d0 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d 70 6f  .**.** For tempo
137e0 72 61 72 79 20 66 69 6c 65 73 20 74 68 65 20 65  rary files the e
137f0 66 66 65 63 74 69 76 65 20 73 65 63 74 6f 72 20  ffective sector 
13800 73 69 7a 65 20 69 73 20 61 6c 77 61 79 73 20 35  size is always 5
13810 31 32 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  12 bytes..**.** 
13820 4f 74 68 65 72 77 69 73 65 2c 20 66 6f 72 20 6e  Otherwise, for n
13830 6f 6e 2d 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  on-temporary fil
13840 65 73 2c 20 74 68 65 20 65 66 66 65 63 74 69 76  es, the effectiv
13850 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73  e sector size is
13860 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 72 65  .** the value re
13870 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 78 53  turned by the xS
13880 65 63 74 6f 72 53 69 7a 65 28 29 20 6d 65 74 68  ectorSize() meth
13890 6f 64 20 72 6f 75 6e 64 65 64 20 75 70 20 74 6f  od rounded up to
138a0 20 33 32 20 69 66 0a 2a 2a 20 69 74 20 69 73 20   32 if.** it is 
138b0 6c 65 73 73 20 74 68 61 6e 20 33 32 2c 20 6f 72  less than 32, or
138c0 20 72 6f 75 6e 64 65 64 20 64 6f 77 6e 20 74 6f   rounded down to
138d0 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45   MAX_SECTOR_SIZE
138e0 20 69 66 20 69 74 0a 2a 2a 20 69 73 20 67 72 65   if it.** is gre
138f0 61 74 65 72 20 74 68 61 6e 20 4d 41 58 5f 53 45  ater than MAX_SE
13900 43 54 4f 52 5f 53 49 5a 45 2e 0a 2a 2f 0a 73 74  CTOR_SIZE..*/.st
13910 61 74 69 63 20 76 6f 69 64 20 73 65 74 53 65 63  atic void setSec
13920 74 6f 72 53 69 7a 65 28 50 61 67 65 72 20 2a 70  torSize(Pager *p
13930 50 61 67 65 72 29 7b 0a 20 20 61 73 73 65 72 74  Pager){.  assert
13940 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
13950 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e  >fd) || pPager->
13960 74 65 6d 70 46 69 6c 65 20 29 3b 0a 0a 20 20 69  tempFile );..  i
13970 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  f( !pPager->temp
13980 46 69 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20 53  File ){.    /* S
13990 65 63 74 6f 72 20 73 69 7a 65 20 64 6f 65 73 6e  ector size doesn
139a0 27 74 20 6d 61 74 74 65 72 20 66 6f 72 20 74 65  't matter for te
139b0 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 41  mporary files. A
139c0 6c 73 6f 2c 20 74 68 65 20 66 69 6c 65 0a 20 20  lso, the file.  
139d0 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 68 61 76    ** may not hav
139e0 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 79 65  e been opened ye
139f0 74 2c 20 69 6e 20 77 68 69 63 68 20 63 61 73 65  t, in which case
13a00 20 74 68 65 20 4f 73 53 65 63 74 6f 72 53 69 7a   the OsSectorSiz
13a10 65 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20  e().    ** call 
13a20 77 69 6c 6c 20 73 65 67 66 61 75 6c 74 2e 0a 20  will segfault.. 
13a30 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72     */.    pPager
13a40 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 73  ->sectorSize = s
13a50 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69  qlite3OsSectorSi
13a60 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  ze(pPager->fd);.
13a70 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
13a80 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3c 33 32 20  ->sectorSize<32 
13a90 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  ){.    pPager->s
13aa0 65 63 74 6f 72 53 69 7a 65 20 3d 20 35 31 32 3b  ectorSize = 512;
13ab0 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
13ac0 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3e 4d 41  r->sectorSize>MA
13ad0 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 29 7b  X_SECTOR_SIZE ){
13ae0 0a 20 20 20 20 61 73 73 65 72 74 28 20 4d 41 58  .    assert( MAX
13af0 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3e 3d 35 31  _SECTOR_SIZE>=51
13b00 32 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  2 );.    pPager-
13b10 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 4d 41  >sectorSize = MA
13b20 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20  X_SECTOR_SIZE;. 
13b30 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79   }.}../*.** Play
13b40 62 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c  back the journal
13b50 20 61 6e 64 20 74 68 75 73 20 72 65 73 74 6f 72   and thus restor
13b60 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  e the database f
13b70 69 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 73 74  ile to.** the st
13b80 61 74 65 20 69 74 20 77 61 73 20 69 6e 20 62 65  ate it was in be
13b90 66 6f 72 65 20 77 65 20 73 74 61 72 74 65 64 20  fore we started 
13ba0 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 2e 20  making changes. 
13bb0 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72   .**.** The jour
13bc0 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20  nal file format 
13bd0 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a  is as follows: .
13be0 2a 2a 0a 2a 2a 20 20 28 31 29 20 20 38 20 62 79  **.**  (1)  8 by
13bf0 74 65 20 70 72 65 66 69 78 2e 20 20 41 20 63 6f  te prefix.  A co
13c00 70 79 20 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d 61  py of aJournalMa
13c10 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20 20  gic[]..**  (2)  
13c20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4 byte big-endia
13c30 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
13c40 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
13c50 20 76 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f   valid page reco
13c60 72 64 73 0a 2a 2a 20 20 20 20 20 20 20 69 6e 20  rds.**       in 
13c70 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 66  the journal.  If
13c80 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 20 30   this value is 0
13c90 78 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20  xffffffff, then 
13ca0 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 20  compute the.**  
13cb0 20 20 20 20 20 6e 75 6d 62 65 72 20 6f 66 20 70       number of p
13cc0 61 67 65 20 72 65 63 6f 72 64 73 20 66 72 6f 6d  age records from
13cd0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 69 7a   the journal siz
13ce0 65 2e 0a 2a 2a 20 20 28 33 29 20 20 34 20 62 79  e..**  (3)  4 by
13cf0 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
13d00 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
13d10 68 65 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65  he initial value
13d20 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 20 20 20   for the .**    
13d30 20 20 20 73 61 6e 69 74 79 20 63 68 65 63 6b 73     sanity checks
13d40 75 6d 2e 0a 2a 2a 20 20 28 34 29 20 20 34 20 62  um..**  (4)  4 b
13d50 79 74 65 20 69 6e 74 65 67 65 72 20 77 68 69 63  yte integer whic
13d60 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  h is the number 
13d70 6f 66 20 70 61 67 65 73 20 74 6f 20 74 72 75 6e  of pages to trun
13d80 63 61 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20  cate the.**     
13d90 20 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 75    database to du
13da0 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e  ring a rollback.
13db0 0a 2a 2a 20 20 28 35 29 20 20 34 20 62 79 74 65  .**  (5)  4 byte
13dc0 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
13dd0 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
13de0 20 73 65 63 74 6f 72 20 73 69 7a 65 2e 20 20 54   sector size.  T
13df0 68 65 20 68 65 61 64 65 72 0a 2a 2a 20 20 20 20  he header.**    
13e00 20 20 20 69 73 20 74 68 69 73 20 6d 61 6e 79 20     is this many 
13e10 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a  bytes in size..*
13e20 2a 20 20 28 36 29 20 20 34 20 62 79 74 65 20 62  *  (6)  4 byte b
13e30 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
13e40 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 70  r which is the p
13e50 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 37  age size..**  (7
13e60 29 20 20 7a 65 72 6f 20 70 61 64 64 69 6e 67 20  )  zero padding 
13e70 6f 75 74 20 74 6f 20 74 68 65 20 6e 65 78 74 20  out to the next 
13e80 73 65 63 74 6f 72 20 73 69 7a 65 2e 0a 2a 2a 20  sector size..** 
13e90 20 28 38 29 20 20 5a 65 72 6f 20 6f 72 20 6d 6f   (8)  Zero or mo
13ea0 72 65 20 70 61 67 65 73 20 69 6e 73 74 61 6e 63  re pages instanc
13eb0 65 73 2c 20 65 61 63 68 20 61 73 20 66 6f 6c 6c  es, each as foll
13ec0 6f 77 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20 2b  ows:.**        +
13ed0 20 20 34 20 62 79 74 65 20 70 61 67 65 20 6e 75    4 byte page nu
13ee0 6d 62 65 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20  mber..**        
13ef0 2b 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  +  pPager->pageS
13f00 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61 74  ize bytes of dat
13f10 61 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20  a..**        +  
13f20 34 20 62 79 74 65 20 63 68 65 63 6b 73 75 6d 0a  4 byte checksum.
13f30 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 65 20 73 70  **.** When we sp
13f40 65 61 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  eak of the journ
13f50 61 6c 20 68 65 61 64 65 72 2c 20 77 65 20 6d 65  al header, we me
13f60 61 6e 20 74 68 65 20 66 69 72 73 74 20 37 20 69  an the first 7 i
13f70 74 65 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a 20 45  tems above..** E
13f80 61 63 68 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ach entry in the
13f90 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6e 20 69   journal is an i
13fa0 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 38  nstance of the 8
13fb0 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43  th item..**.** C
13fc0 61 6c 6c 20 74 68 65 20 76 61 6c 75 65 20 66 72  all the value fr
13fd0 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64 20 62 75  om the second bu
13fe0 6c 6c 65 74 20 22 6e 52 65 63 22 2e 20 20 6e 52  llet "nRec".  nR
13ff0 65 63 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ec is the number
14000 20 6f 66 0a 2a 2a 20 76 61 6c 69 64 20 70 61 67   of.** valid pag
14010 65 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  e entries in the
14020 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f   journal.  In mo
14030 73 74 20 63 61 73 65 73 2c 20 79 6f 75 20 63 61  st cases, you ca
14040 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a  n compute the.**
14050 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 66   value of nRec f
14060 72 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f 66 20  rom the size of 
14070 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
14080 2e 20 20 42 75 74 20 69 66 20 61 20 70 6f 77 65  .  But if a powe
14090 72 0a 2a 2a 20 66 61 69 6c 75 72 65 20 6f 63 63  r.** failure occ
140a0 75 72 72 65 64 20 77 68 69 6c 65 20 74 68 65 20  urred while the 
140b0 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e  journal was bein
140c0 67 20 77 72 69 74 74 65 6e 2c 20 69 74 20 63 6f  g written, it co
140d0 75 6c 64 20 62 65 20 74 68 65 0a 2a 2a 20 63 61  uld be the.** ca
140e0 73 65 20 74 68 61 74 20 74 68 65 20 73 69 7a 65  se that the size
140f0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
14100 66 69 6c 65 20 68 61 64 20 61 6c 72 65 61 64 79  file had already
14110 20 62 65 65 6e 20 69 6e 63 72 65 61 73 65 64 20   been increased 
14120 62 75 74 0a 2a 2a 20 74 68 65 20 65 78 74 72 61  but.** the extra
14130 20 65 6e 74 72 69 65 73 20 68 61 64 20 6e 6f 74   entries had not
14140 20 79 65 74 20 6d 61 64 65 20 69 74 20 73 61 66   yet made it saf
14150 65 6c 79 20 74 6f 20 64 69 73 6b 2e 20 20 49 6e  ely to disk.  In
14160 20 73 75 63 68 20 61 20 63 61 73 65 2c 0a 2a 2a   such a case,.**
14170 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52   the value of nR
14180 65 63 20 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d  ec computed from
14190 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 77   the file size w
141a0 6f 75 6c 64 20 62 65 20 74 6f 6f 20 6c 61 72 67  ould be too larg
141b0 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 61 74 20  e.  For.** that 
141c0 72 65 61 73 6f 6e 2c 20 77 65 20 61 6c 77 61 79  reason, we alway
141d0 73 20 75 73 65 20 74 68 65 20 6e 52 65 63 20 76  s use the nRec v
141e0 61 6c 75 65 20 69 6e 20 74 68 65 20 68 65 61 64  alue in the head
141f0 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  er..**.** If the
14200 20 6e 52 65 63 20 76 61 6c 75 65 20 69 73 20 30   nRec value is 0
14210 78 66 66 66 66 66 66 66 66 20 69 74 20 6d 65 61  xffffffff it mea
14220 6e 73 20 74 68 61 74 20 6e 52 65 63 20 73 68 6f  ns that nRec sho
14230 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64 0a  uld be computed.
14240 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65  ** from the file
14250 20 73 69 7a 65 2e 20 20 54 68 69 73 20 76 61 6c   size.  This val
14260 75 65 20 69 73 20 75 73 65 64 20 77 68 65 6e 20  ue is used when 
14270 74 68 65 20 75 73 65 72 20 73 65 6c 65 63 74 73  the user selects
14280 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20   the.** no-sync 
14290 6f 70 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6a  option for the j
142a0 6f 75 72 6e 61 6c 2e 20 20 41 20 70 6f 77 65 72  ournal.  A power
142b0 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c   failure could l
142c0 65 61 64 20 74 6f 20 63 6f 72 72 75 70 74 69 6f  ead to corruptio
142d0 6e 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73  n.** in this cas
142e0 65 2e 20 20 42 75 74 20 66 6f 72 20 74 68 69 6e  e.  But for thin
142f0 67 73 20 6c 69 6b 65 20 74 65 6d 70 6f 72 61 72  gs like temporar
14300 79 20 74 61 62 6c 65 20 28 77 68 69 63 68 20 77  y table (which w
14310 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c 65 74 65  ill be.** delete
14320 64 20 77 68 65 6e 20 74 68 65 20 70 6f 77 65 72  d when the power
14330 20 69 73 20 72 65 73 74 6f 72 65 64 29 20 77 65   is restored) we
14340 20 64 6f 6e 27 74 20 63 61 72 65 2e 20 20 0a 2a   don't care.  .*
14350 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65  *.** If the file
14360 20 6f 70 65 6e 65 64 20 61 73 20 74 68 65 20 6a   opened as the j
14370 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e  ournal file is n
14380 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  ot a well-formed
14390 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
143a0 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 20   then all pages 
143b0 75 70 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  up to the first 
143c0 63 6f 72 72 75 70 74 65 64 20 70 61 67 65 20 61  corrupted page a
143d0 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63  re rolled.** bac
143e0 6b 20 28 6f 72 20 6e 6f 20 70 61 67 65 73 20 69  k (or no pages i
143f0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
14400 61 64 65 72 20 69 73 20 63 6f 72 72 75 70 74 65  ader is corrupte
14410 64 29 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  d). The journal 
14420 66 69 6c 65 0a 2a 2a 20 69 73 20 74 68 65 6e 20  file.** is then 
14430 64 65 6c 65 74 65 64 20 61 6e 64 20 53 51 4c 49  deleted and SQLI
14440 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2c 20  TE_OK returned, 
14450 6a 75 73 74 20 61 73 20 69 66 20 6e 6f 20 63 6f  just as if no co
14460 72 72 75 70 74 69 6f 6e 20 68 61 64 0a 2a 2a 20  rruption had.** 
14470 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64  been encountered
14480 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 2f  ..**.** If an I/
14490 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72  O or malloc() er
144a0 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20  ror occurs, the 
144b0 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 69 73 20  journal-file is 
144c0 6e 6f 74 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61  not deleted.** a
144d0 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  nd an error code
144e0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
144f0 0a 2a 2a 20 54 68 65 20 69 73 48 6f 74 20 70 61  .** The isHot pa
14500 72 61 6d 65 74 65 72 20 69 6e 64 69 63 61 74 65  rameter indicate
14510 73 20 74 68 61 74 20 77 65 20 61 72 65 20 74 72  s that we are tr
14520 79 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  ying to rollback
14530 20 61 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 74 68   a journal.** th
14540 61 74 20 6d 69 67 68 74 20 62 65 20 61 20 68 6f  at might be a ho
14550 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 72 2c 20  t journal.  Or, 
14560 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68 61 74  it could be that
14570 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
14580 0a 2a 2a 20 70 72 65 73 65 72 76 65 64 20 62 65  .** preserved be
14590 63 61 75 73 65 20 6f 66 20 4a 4f 55 52 4e 41 4c  cause of JOURNAL
145a0 4d 4f 44 45 5f 50 45 52 53 49 53 54 20 6f 72 20  MODE_PERSIST or 
145b0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e  JOURNALMODE_TRUN
145c0 43 41 54 45 2e 0a 2a 2a 20 49 66 20 74 68 65 20  CATE..** If the 
145d0 6a 6f 75 72 6e 61 6c 20 72 65 61 6c 6c 79 20 69  journal really i
145e0 73 20 68 6f 74 2c 20 72 65 73 65 74 20 74 68 65  s hot, reset the
145f0 20 70 61 67 65 72 20 63 61 63 68 65 20 70 72 69   pager cache pri
14600 6f 72 20 72 6f 6c 6c 69 6e 67 0a 2a 2a 20 62 61  or rolling.** ba
14610 63 6b 20 61 6e 79 20 63 6f 6e 74 65 6e 74 2e 20  ck any content. 
14620 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
14630 69 73 20 6d 65 72 65 6c 79 20 70 65 72 73 69 73  is merely persis
14640 74 65 6e 74 2c 20 6e 6f 20 72 65 73 65 74 20 69  tent, no reset i
14650 73 0a 2a 2a 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a  s.** needed..*/.
14660 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
14670 5f 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20  _playback(Pager 
14680 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 69 73 48  *pPager, int isH
14690 6f 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  ot){.  sqlite3_v
146a0 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65  fs *pVfs = pPage
146b0 72 2d 3e 70 56 66 73 3b 0a 20 20 69 36 34 20 73  r->pVfs;.  i64 s
146c0 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  zJ;             
146d0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
146e0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
146f0 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33  in bytes */.  u3
14700 32 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20  2 nRec;         
14710 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
14720 20 6f 66 20 52 65 63 6f 72 64 73 20 69 6e 20 74   of Records in t
14730 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  he journal */.  
14740 75 33 32 20 75 3b 20 20 20 20 20 20 20 20 20 20  u32 u;          
14750 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69           /* Unsi
14760 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65  gned loop counte
14770 72 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67  r */.  Pgno mxPg
14780 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
14790 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6f  /* Size of the o
147a0 72 69 67 69 6e 61 6c 20 66 69 6c 65 20 69 6e 20  riginal file in 
147b0 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72  pages */.  int r
147c0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
147d0 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
147e0 64 65 20 6f 66 20 61 20 73 75 62 72 6f 75 74 69  de of a subrouti
147f0 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 20  ne */.  int res 
14800 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 1;            
14810 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e   /* Value return
14820 65 64 20 62 79 20 73 71 6c 69 74 65 33 4f 73 41  ed by sqlite3OsA
14830 63 63 65 73 73 28 29 20 2a 2f 0a 20 20 63 68 61  ccess() */.  cha
14840 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20  r *zMaster = 0; 
14850 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
14860 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
14870 66 69 6c 65 20 69 66 20 61 6e 79 20 2a 2f 0a 20  file if any */. 
14880 20 69 6e 74 20 6e 65 65 64 50 61 67 65 72 52 65   int needPagerRe
14890 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 54 72 75  set;      /* Tru
148a0 65 20 74 6f 20 72 65 73 65 74 20 70 61 67 65 20  e to reset page 
148b0 70 72 69 6f 72 20 74 6f 20 66 69 72 73 74 20 70  prior to first p
148c0 61 67 65 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a  age rollback */.
148d0 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  .  /* Figure out
148e0 20 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64   how many record
148f0 73 20 61 72 65 20 69 6e 20 74 68 65 20 6a 6f 75  s are in the jou
14900 72 6e 61 6c 2e 20 20 41 62 6f 72 74 20 65 61 72  rnal.  Abort ear
14910 6c 79 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 6a  ly if.  ** the j
14920 6f 75 72 6e 61 6c 20 69 73 20 65 6d 70 74 79 2e  ournal is empty.
14930 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
14940 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
14950 66 64 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  fd) );.  rc = sq
14960 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
14970 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a  pPager->jfd, &sz
14980 4a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  J);.  if( rc!=SQ
14990 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 7a 4a 3d 3d  LITE_OK || szJ==
149a0 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  0 ){.    goto en
149b0 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a  d_playback;.  }.
149c0 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6d  .  /* Read the m
149d0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
149e0 6d 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  me from the jour
149f0 6e 61 6c 2c 20 69 66 20 69 74 20 69 73 20 70 72  nal, if it is pr
14a00 65 73 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 61  esent..  ** If a
14a10 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
14a20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 73 70 65  file name is spe
14a30 63 69 66 69 65 64 2c 20 62 75 74 20 74 68 65 20  cified, but the 
14a40 66 69 6c 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a  file is not.  **
14a50 20 70 72 65 73 65 6e 74 20 6f 6e 20 64 69 73 6b   present on disk
14a60 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  , then the journ
14a70 61 6c 20 69 73 20 6e 6f 74 20 68 6f 74 20 61 6e  al is not hot an
14a80 64 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  d does not need 
14a90 74 6f 20 62 65 0a 20 20 2a 2a 20 70 6c 61 79 65  to be.  ** playe
14aa0 64 20 62 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a  d back..  **.  *
14ab0 2a 20 54 4f 44 4f 3a 20 54 65 63 68 6e 69 63 61  * TODO: Technica
14ac0 6c 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  lly the followin
14ad0 67 20 69 73 20 61 6e 20 65 72 72 6f 72 20 62 65  g is an error be
14ae0 63 61 75 73 65 20 69 74 20 61 73 73 75 6d 65 73  cause it assumes
14af0 20 74 68 61 74 0a 20 20 2a 2a 20 62 75 66 66 65   that.  ** buffe
14b00 72 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63  r Pager.pTmpSpac
14b10 65 20 69 73 20 28 6d 78 50 61 74 68 6e 61 6d 65  e is (mxPathname
14b20 2b 31 29 20 62 79 74 65 73 20 6f 72 20 6c 61 72  +1) bytes or lar
14b30 67 65 72 2e 20 69 2e 65 2e 20 74 68 61 74 0a 20  ger. i.e. that. 
14b40 20 2a 2a 20 28 70 50 61 67 65 72 2d 3e 70 61 67   ** (pPager->pag
14b50 65 53 69 7a 65 20 3e 3d 20 70 50 61 67 65 72 2d  eSize >= pPager-
14b60 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d  >pVfs->mxPathnam
14b70 65 2b 31 29 2e 20 55 73 69 6e 67 20 6f 73 5f 75  e+1). Using os_u
14b80 6e 69 78 2e 63 2c 0a 20 20 2a 2a 20 20 6d 78 50  nix.c,.  **  mxP
14b90 61 74 68 6e 61 6d 65 20 69 73 20 35 31 32 2c 20  athname is 512, 
14ba0 77 68 69 63 68 20 69 73 20 74 68 65 20 73 61 6d  which is the sam
14bb0 65 20 61 73 20 74 68 65 20 6d 69 6e 69 6d 75 6d  e as the minimum
14bc0 20 61 6c 6c 6f 77 61 62 6c 65 20 76 61 6c 75 65   allowable value
14bd0 0a 20 20 2a 2a 20 66 6f 72 20 70 61 67 65 53 69  .  ** for pageSi
14be0 7a 65 2e 0a 20 20 2a 2f 0a 20 20 7a 4d 61 73 74  ze..  */.  zMast
14bf0 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d  er = pPager->pTm
14c00 70 53 70 61 63 65 3b 0a 20 20 72 63 20 3d 20 72  pSpace;.  rc = r
14c10 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  eadMasterJournal
14c20 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d  (pPager->jfd, zM
14c30 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 70  aster, pPager->p
14c40 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
14c50 31 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  1);.  if( rc==SQ
14c60 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74  LITE_OK && zMast
14c70 65 72 5b 30 5d 20 29 7b 0a 20 20 20 20 72 63 20  er[0] ){.    rc 
14c80 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  = sqlite3OsAcces
14c90 73 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  s(pVfs, zMaster,
14ca0 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
14cb0 58 49 53 54 53 2c 20 26 72 65 73 29 3b 0a 20 20  XISTS, &res);.  
14cc0 7d 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b  }.  zMaster = 0;
14cd0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
14ce0 45 5f 4f 4b 20 7c 7c 20 21 72 65 73 20 29 7b 0a  E_OK || !res ){.
14cf0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
14d00 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 70 50 61  yback;.  }.  pPa
14d10 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
14d20 3d 20 30 3b 0a 20 20 6e 65 65 64 50 61 67 65 72  = 0;.  needPager
14d30 52 65 73 65 74 20 3d 20 69 73 48 6f 74 3b 0a 0a  Reset = isHot;..
14d40 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 74    /* This loop t
14d50 65 72 6d 69 6e 61 74 65 73 20 65 69 74 68 65 72  erminates either
14d60 20 77 68 65 6e 20 61 20 72 65 61 64 4a 6f 75 72   when a readJour
14d70 6e 61 6c 48 64 72 28 29 20 6f 72 20 0a 20 20 2a  nalHdr() or .  *
14d80 2a 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  * pager_playback
14d90 5f 6f 6e 65 5f 70 61 67 65 28 29 20 63 61 6c 6c  _one_page() call
14da0 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
14db0 44 4f 4e 45 20 6f 72 20 61 6e 20 49 4f 20 65 72  DONE or an IO er
14dc0 72 6f 72 20 0a 20 20 2a 2a 20 6f 63 63 75 72 73  ror .  ** occurs
14dd0 2e 20 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28  . .  */.  while(
14de0 20 31 20 29 7b 0a 20 20 20 20 2f 2a 20 52 65 61   1 ){.    /* Rea
14df0 64 20 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e  d the next journ
14e00 61 6c 20 68 65 61 64 65 72 20 66 72 6f 6d 20 74  al header from t
14e10 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
14e20 20 20 49 66 20 74 68 65 72 65 20 61 72 65 0a 20    If there are. 
14e30 20 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67 68     ** not enough
14e40 20 62 79 74 65 73 20 6c 65 66 74 20 69 6e 20 74   bytes left in t
14e50 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
14e60 66 6f 72 20 61 20 63 6f 6d 70 6c 65 74 65 20 68  for a complete h
14e70 65 61 64 65 72 2c 20 6f 72 0a 20 20 20 20 2a 2a  eader, or.    **
14e80 20 69 74 20 69 73 20 63 6f 72 72 75 70 74 65 64   it is corrupted
14e90 2c 20 74 68 65 6e 20 61 20 70 72 6f 63 65 73 73  , then a process
14ea0 20 6d 75 73 74 20 6f 66 20 66 61 69 6c 65 64 20   must of failed 
14eb0 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20 69 74  while writing it
14ec0 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 6e  ..    ** This in
14ed0 64 69 63 61 74 65 73 20 6e 6f 74 68 69 6e 67 20  dicates nothing 
14ee0 6d 6f 72 65 20 6e 65 65 64 73 20 74 6f 20 62 65  more needs to be
14ef0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20   rolled back..  
14f00 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72 65    */.    rc = re
14f10 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  adJournalHdr(pPa
14f20 67 65 72 2c 20 69 73 48 6f 74 2c 20 73 7a 4a 2c  ger, isHot, szJ,
14f30 20 26 6e 52 65 63 2c 20 26 6d 78 50 67 29 3b 0a   &nRec, &mxPg);.
14f40 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
14f50 54 45 5f 4f 4b 20 29 7b 20 0a 20 20 20 20 20 20  TE_OK ){ .      
14f60 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44  if( rc==SQLITE_D
14f70 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ONE ){.        r
14f80 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
14f90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74       }.      got
14fa0 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
14fb0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
14fc0 20 6e 52 65 63 20 69 73 20 30 78 66 66 66 66 66   nRec is 0xfffff
14fd0 66 66 66 2c 20 74 68 65 6e 20 74 68 69 73 20 6a  fff, then this j
14fe0 6f 75 72 6e 61 6c 20 77 61 73 20 63 72 65 61 74  ournal was creat
14ff0 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 0a  ed by a process.
15000 20 20 20 20 2a 2a 20 77 6f 72 6b 69 6e 67 20 69      ** working i
15010 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20  n no-sync mode. 
15020 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20  This means that 
15030 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 20  the rest of the 
15040 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66  journal.    ** f
15050 69 6c 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  ile consists of 
15060 70 61 67 65 73 2c 20 74 68 65 72 65 20 61 72 65  pages, there are
15070 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c   no more journal
15080 20 68 65 61 64 65 72 73 2e 20 43 6f 6d 70 75 74   headers. Comput
15090 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c  e.    ** the val
150a0 75 65 20 6f 66 20 6e 52 65 63 20 62 61 73 65 64  ue of nRec based
150b0 20 6f 6e 20 74 68 69 73 20 61 73 73 75 6d 70 74   on this assumpt
150c0 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
150d0 69 66 28 20 6e 52 65 63 3d 3d 30 78 66 66 66 66  if( nRec==0xffff
150e0 66 66 66 66 20 29 7b 0a 20 20 20 20 20 20 61 73  ffff ){.      as
150f0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
15100 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41  urnalOff==JOURNA
15110 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
15120 20 29 3b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d   );.      nRec =
15130 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d 20 4a 4f   (int)((szJ - JO
15140 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
15150 67 65 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47  ger))/JOURNAL_PG
15160 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20  _SZ(pPager));.  
15170 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e    }..    /* If n
15180 52 65 63 20 69 73 20 30 20 61 6e 64 20 74 68 69  Rec is 0 and thi
15190 73 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6f 66  s rollback is of
151a0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63   a transaction c
151b0 72 65 61 74 65 64 20 62 79 20 74 68 69 73 0a 20  reated by this. 
151c0 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 61 6e     ** process an
151d0 64 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65  d if this is the
151e0 20 66 69 6e 61 6c 20 68 65 61 64 65 72 20 69 6e   final header in
151f0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68   the journal, th
15200 65 6e 20 69 74 20 6d 65 61 6e 73 0a 20 20 20 20  en it means.    
15210 2a 2a 20 74 68 61 74 20 74 68 69 73 20 70 61 72  ** that this par
15220 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
15230 20 77 61 73 20 62 65 69 6e 67 20 66 69 6c 6c 65   was being fille
15240 64 20 62 75 74 20 68 61 73 20 6e 6f 74 20 79 65  d but has not ye
15250 74 20 62 65 65 6e 0a 20 20 20 20 2a 2a 20 73 79  t been.    ** sy
15260 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 20 20 43  nced to disk.  C
15270 6f 6d 70 75 74 65 20 74 68 65 20 6e 75 6d 62 65  ompute the numbe
15280 72 20 6f 66 20 70 61 67 65 73 20 62 61 73 65 64  r of pages based
15290 20 6f 6e 20 74 68 65 20 72 65 6d 61 69 6e 69 6e   on the remainin
152a0 67 0a 20 20 20 20 2a 2a 20 73 69 7a 65 20 6f 66  g.    ** size of
152b0 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a   the file..    *
152c0 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 74 68 69  *.    ** The thi
152d0 72 64 20 74 65 72 6d 20 6f 66 20 74 68 65 20 74  rd term of the t
152e0 65 73 74 20 77 61 73 20 61 64 64 65 64 20 74 6f  est was added to
152f0 20 66 69 78 20 74 69 63 6b 65 74 20 23 32 35 36   fix ticket #256
15300 35 2e 0a 20 20 20 20 2a 2a 20 57 68 65 6e 20 72  5..    ** When r
15310 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 68 6f  olling back a ho
15320 74 20 6a 6f 75 72 6e 61 6c 2c 20 6e 52 65 63 3d  t journal, nRec=
15330 3d 30 20 61 6c 77 61 79 73 20 6d 65 61 6e 73 20  =0 always means 
15340 74 68 61 74 20 74 68 65 20 6e 65 78 74 0a 20 20  that the next.  
15350 20 20 2a 2a 20 63 68 75 6e 6b 20 6f 66 20 74 68    ** chunk of th
15360 65 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69  e journal contai
15370 6e 73 20 7a 65 72 6f 20 70 61 67 65 73 20 74 6f  ns zero pages to
15380 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   be rolled back.
15390 20 20 42 75 74 0a 20 20 20 20 2a 2a 20 77 68 65    But.    ** whe
153a0 6e 20 64 6f 69 6e 67 20 61 20 52 4f 4c 4c 42 41  n doing a ROLLBA
153b0 43 4b 20 61 6e 64 20 74 68 65 20 6e 52 65 63 3d  CK and the nRec=
153c0 3d 30 20 63 68 75 6e 6b 20 69 73 20 74 68 65 20  =0 chunk is the 
153d0 6c 61 73 74 20 63 68 75 6e 6b 20 69 6e 0a 20 20  last chunk in.  
153e0 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
153f0 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
15400 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68  the journal migh
15410 74 20 63 6f 6e 74 61 69 6e 20 61 64 64 69 74 69  t contain additi
15420 6f 6e 61 6c 0a 20 20 20 20 2a 2a 20 70 61 67 65  onal.    ** page
15430 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62  s that need to b
15440 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e  e rolled back an
15450 64 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65  d that the numbe
15460 72 20 6f 66 20 70 61 67 65 73 20 0a 20 20 20 20  r of pages .    
15470 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d  ** should be com
15480 70 75 74 65 64 20 62 61 73 65 64 20 6f 6e 20 74  puted based on t
15490 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
154a0 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  size..    */.   
154b0 20 69 66 28 20 6e 52 65 63 3d 3d 30 20 26 26 20   if( nRec==0 && 
154c0 21 69 73 48 6f 74 20 26 26 0a 20 20 20 20 20 20  !isHot &&.      
154d0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
154e0 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52  lHdr+JOURNAL_HDR
154f0 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61  _SZ(pPager)==pPa
15500 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
15510 29 7b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20  ){.      nRec = 
15520 28 69 6e 74 29 28 28 73 7a 4a 20 2d 20 70 50 61  (int)((szJ - pPa
15530 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  ger->journalOff)
15540 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a   / JOURNAL_PG_SZ
15550 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d  (pPager));.    }
15560 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
15570 20 69 73 20 74 68 65 20 66 69 72 73 74 20 68 65   is the first he
15580 61 64 65 72 20 72 65 61 64 20 66 72 6f 6d 20 74  ader read from t
15590 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 72 75 6e  he journal, trun
155a0 63 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20  cate the.    ** 
155b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 61  database file ba
155c0 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ck to its origin
155d0 61 6c 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a  al size..    */.
155e0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
155f0 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52  journalOff==JOUR
15600 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
15610 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  r) ){.      rc =
15620 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28   pager_truncate(
15630 70 50 61 67 65 72 2c 20 6d 78 50 67 29 3b 0a 20  pPager, mxPg);. 
15640 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
15650 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
15660 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
15670 61 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ack;.      }.   
15680 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
15690 65 20 3d 20 6d 78 50 67 3b 0a 20 20 20 20 7d 0a  e = mxPg;.    }.
156a0 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69  .    /* Copy ori
156b0 67 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74 20  ginal pages out 
156c0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61  of the journal a
156d0 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  nd back into the
156e0 20 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73   .    ** databas
156f0 65 20 66 69 6c 65 20 61 6e 64 2f 6f 72 20 70 61  e file and/or pa
15700 67 65 20 63 61 63 68 65 2e 0a 20 20 20 20 2a 2f  ge cache..    */
15710 0a 20 20 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c  .    for(u=0; u<
15720 6e 52 65 63 3b 20 75 2b 2b 29 7b 0a 20 20 20 20  nRec; u++){.    
15730 20 20 69 66 28 20 6e 65 65 64 50 61 67 65 72 52    if( needPagerR
15740 65 73 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20  eset ){.        
15750 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
15760 65 72 29 3b 0a 20 20 20 20 20 20 20 20 6e 65 65  er);.        nee
15770 64 50 61 67 65 72 52 65 73 65 74 20 3d 20 30 3b  dPagerReset = 0;
15780 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
15790 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
157a0 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67  ck_one_page(pPag
157b0 65 72 2c 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72  er,&pPager->jour
157c0 6e 61 6c 4f 66 66 2c 30 2c 31 2c 30 29 3b 0a 20  nalOff,0,1,0);. 
157d0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
157e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
157f0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
15800 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20  _DONE ){.       
15810 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
15820 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  K;.          pPa
15830 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
15840 3d 20 73 7a 4a 3b 0a 20 20 20 20 20 20 20 20 20  = szJ;.         
15850 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
15860 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51  }else if( rc==SQ
15870 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
15880 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20  _READ ){.       
15890 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75     /* If the jou
158a0 72 6e 61 6c 20 68 61 73 20 62 65 65 6e 20 74 72  rnal has been tr
158b0 75 6e 63 61 74 65 64 2c 20 73 69 6d 70 6c 79 20  uncated, simply 
158c0 73 74 6f 70 20 72 65 61 64 69 6e 67 20 61 6e 64  stop reading and
158d0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72  .          ** pr
158e0 6f 63 65 73 73 69 6e 67 20 74 68 65 20 6a 6f 75  ocessing the jou
158f0 72 6e 61 6c 2e 20 54 68 69 73 20 6d 69 67 68 74  rnal. This might
15900 20 68 61 70 70 65 6e 20 69 66 20 74 68 65 20 6a   happen if the j
15910 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20 20 20 20  ournal was.     
15920 20 20 20 20 20 2a 2a 20 6e 6f 74 20 63 6f 6d 70       ** not comp
15930 6c 65 74 65 6c 79 20 77 72 69 74 74 65 6e 20 61  letely written a
15940 6e 64 20 73 79 6e 63 65 64 20 70 72 69 6f 72 20  nd synced prior 
15950 74 6f 20 61 20 63 72 61 73 68 2e 20 20 49 6e 20  to a crash.  In 
15960 74 68 61 74 0a 20 20 20 20 20 20 20 20 20 20 2a  that.          *
15970 2a 20 63 61 73 65 2c 20 74 68 65 20 64 61 74 61  * case, the data
15980 62 61 73 65 20 73 68 6f 75 6c 64 20 68 61 76 65  base should have
15990 20 6e 65 76 65 72 20 62 65 65 6e 20 77 72 69 74   never been writ
159a0 74 65 6e 20 69 6e 20 74 68 65 0a 20 20 20 20 20  ten in the.     
159b0 20 20 20 20 20 2a 2a 20 66 69 72 73 74 20 70 6c       ** first pl
159c0 61 63 65 20 73 6f 20 69 74 20 69 73 20 4f 4b 20  ace so it is OK 
159d0 74 6f 20 73 69 6d 70 6c 79 20 61 62 61 6e 64 6f  to simply abando
159e0 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20  n the rollback. 
159f0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  */.          rc 
15a00 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
15a10 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
15a20 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20  playback;.      
15a30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
15a40 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20     /* If we are 
15a50 75 6e 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61  unable to rollba
15a60 63 6b 2c 20 71 75 69 74 20 61 6e 64 20 72 65 74  ck, quit and ret
15a70 75 72 6e 20 74 68 65 20 65 72 72 6f 72 0a 20 20  urn the error.  
15a80 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 64 65 2e          ** code.
15a90 20 20 54 68 69 73 20 77 69 6c 6c 20 63 61 75 73    This will caus
15aa0 65 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 65  e the pager to e
15ab0 6e 74 65 72 20 74 68 65 20 65 72 72 6f 72 20 73  nter the error s
15ac0 74 61 74 65 0a 20 20 20 20 20 20 20 20 20 20 2a  tate.          *
15ad0 2a 20 73 6f 20 74 68 61 74 20 6e 6f 20 66 75 72  * so that no fur
15ae0 74 68 65 72 20 68 61 72 6d 20 77 69 6c 6c 20 62  ther harm will b
15af0 65 20 64 6f 6e 65 2e 20 20 50 65 72 68 61 70 73  e done.  Perhaps
15b00 20 74 68 65 20 6e 65 78 74 0a 20 20 20 20 20 20   the next.      
15b10 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 74      ** process t
15b20 6f 20 63 6f 6d 65 20 61 6c 6f 6e 67 20 77 69 6c  o come along wil
15b30 6c 20 62 65 20 61 62 6c 65 20 74 6f 20 72 6f 6c  l be able to rol
15b40 6c 62 61 63 6b 20 74 68 65 20 64 61 74 61 62 61  lback the databa
15b50 73 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  se..          */
15b60 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
15b70 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
15b80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
15b90 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f      }.  }.  /*NO
15ba0 54 52 45 41 43 48 45 44 2a 2f 0a 20 20 61 73 73  TREACHED*/.  ass
15bb0 65 72 74 28 20 30 20 29 3b 0a 0a 65 6e 64 5f 70  ert( 0 );..end_p
15bc0 6c 61 79 62 61 63 6b 3a 0a 20 20 2f 2a 20 46 6f  layback:.  /* Fo
15bd0 6c 6c 6f 77 69 6e 67 20 61 20 72 6f 6c 6c 62 61  llowing a rollba
15be0 63 6b 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  ck, the database
15bf0 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20   file should be 
15c00 62 61 63 6b 20 69 6e 20 69 74 73 20 6f 72 69 67  back in its orig
15c10 69 6e 61 6c 0a 20 20 2a 2a 20 73 74 61 74 65 20  inal.  ** state 
15c20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61  prior to the sta
15c30 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  rt of the transa
15c40 63 74 69 6f 6e 2c 20 73 6f 20 69 6e 76 6f 6b 65  ction, so invoke
15c50 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45   the.  ** SQLITE
15c60 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e  _FCNTL_DB_UNCHAN
15c70 47 45 44 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c  GED file-control
15c80 20 6d 65 74 68 6f 64 20 74 6f 20 64 69 73 61 62   method to disab
15c90 6c 65 20 74 68 65 0a 20 20 2a 2a 20 61 73 73 65  le the.  ** asse
15ca0 72 74 69 6f 6e 20 74 68 61 74 20 74 68 65 20 74  rtion that the t
15cb0 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74  ransaction count
15cc0 65 72 20 77 61 73 20 6d 6f 64 69 66 69 65 64 2e  er was modified.
15cd0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 0a  .  */.  assert(.
15ce0 20 20 20 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e      pPager->fd->
15cf0 70 4d 65 74 68 6f 64 73 3d 3d 30 20 7c 7c 0a 20  pMethods==0 ||. 
15d00 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65     sqlite3OsFile
15d10 43 6f 6e 74 72 6f 6c 28 70 50 61 67 65 72 2d 3e  Control(pPager->
15d20 66 64 2c 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  fd,SQLITE_FCNTL_
15d30 44 42 5f 55 4e 43 48 41 4e 47 45 44 2c 30 29 3e  DB_UNCHANGED,0)>
15d40 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 29 3b 0a  =SQLITE_OK.  );.
15d50 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70 6c  .  /* If this pl
15d60 61 79 62 61 63 6b 20 69 73 20 68 61 70 70 65 6e  ayback is happen
15d70 69 6e 67 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ing automaticall
15d80 79 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66  y as a result of
15d90 20 61 6e 20 49 4f 20 6f 72 20 0a 20 20 2a 2a 20   an IO or .  ** 
15da0 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 74 68 61  malloc error tha
15db0 74 20 6f 63 63 75 72 72 65 64 20 61 66 74 65 72  t occurred after
15dc0 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
15dd0 74 65 72 20 77 61 73 20 75 70 64 61 74 65 64 20  ter was updated 
15de0 62 75 74 20 0a 20 20 2a 2a 20 62 65 66 6f 72 65  but .  ** before
15df0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
15e00 20 77 61 73 20 63 6f 6d 6d 69 74 74 65 64 2c 20   was committed, 
15e10 74 68 65 6e 20 74 68 65 20 63 68 61 6e 67 65 2d  then the change-
15e20 63 6f 75 6e 74 65 72 20 0a 20 20 2a 2a 20 6d 6f  counter .  ** mo
15e30 64 69 66 69 63 61 74 69 6f 6e 20 6d 61 79 20 6a  dification may j
15e40 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 72 65  ust have been re
15e50 76 65 72 74 65 64 2e 20 49 66 20 74 68 69 73 20  verted. If this 
15e60 68 61 70 70 65 6e 73 20 69 6e 20 65 78 63 6c 75  happens in exclu
15e70 73 69 76 65 20 0a 20 20 2a 2a 20 6d 6f 64 65 2c  sive .  ** mode,
15e80 20 74 68 65 6e 20 73 75 62 73 65 71 75 65 6e 74   then subsequent
15e90 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 70 65   transactions pe
15ea0 72 66 6f 72 6d 65 64 20 62 79 20 74 68 65 20 63  rformed by the c
15eb0 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 6c 6c 20 6e  onnection will n
15ec0 6f 74 0a 20 20 2a 2a 20 75 70 64 61 74 65 20 74  ot.  ** update t
15ed0 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
15ee0 72 20 61 74 20 61 6c 6c 2e 20 54 68 69 73 20 6d  r at all. This m
15ef0 61 79 20 6c 65 61 64 20 74 6f 20 63 61 63 68 65  ay lead to cache
15f00 20 69 6e 63 6f 6e 73 69 73 74 65 6e 63 79 0a 20   inconsistency. 
15f10 20 2a 2a 20 70 72 6f 62 6c 65 6d 73 20 66 6f 72   ** problems for
15f20 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73   other processes
15f30 20 61 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69   at some point i
15f40 6e 20 74 68 65 20 66 75 74 75 72 65 2e 20 53 6f  n the future. So
15f50 2c 20 6a 75 73 74 0a 20 20 2a 2a 20 69 6e 20 63  , just.  ** in c
15f60 61 73 65 20 74 68 69 73 20 68 61 73 20 68 61 70  ase this has hap
15f70 70 65 6e 65 64 2c 20 63 6c 65 61 72 20 74 68 65  pened, clear the
15f80 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65   changeCountDone
15f90 20 66 6c 61 67 20 6e 6f 77 2e 0a 20 20 2a 2f 0a   flag now..  */.
15fa0 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65    pPager->change
15fb0 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67  CountDone = pPag
15fc0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 0a 20  er->tempFile;.. 
15fd0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
15fe0 4f 4b 20 29 7b 0a 20 20 20 20 7a 4d 61 73 74 65  OK ){.    zMaste
15ff0 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70  r = pPager->pTmp
16000 53 70 61 63 65 3b 0a 20 20 20 20 72 63 20 3d 20  Space;.    rc = 
16010 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61  readMasterJourna
16020 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a  l(pPager->jfd, z
16030 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e  Master, pPager->
16040 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
16050 2b 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  +1);.    testcas
16060 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc!=SQLITE_OK
16070 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63   );.  }.  if( rc
16080 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
16090 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3d 3d 30  Pager->noSync==0
160a0 20 26 26 20 70 50 61 67 65 72 2d 3e 73 74 61 74   && pPager->stat
160b0 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49  e>=PAGER_EXCLUSI
160c0 56 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  VE ){.    rc = s
160d0 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
160e0 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d  ger->fd, pPager-
160f0 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20  >sync_flags);.  
16100 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
16110 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d  TE_OK && pPager-
16120 3e 6e 6f 53 79 6e 63 3d 3d 30 20 26 26 20 70 50  >noSync==0 && pP
16130 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
16140 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 7b 0a  ER_EXCLUSIVE ){.
16150 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
16160 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 66  OsSync(pPager->f
16170 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f  d, pPager->sync_
16180 66 6c 61 67 73 29 3b 0a 20 20 7d 0a 20 20 69 66  flags);.  }.  if
16190 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
161a0 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
161b0 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  r_end_transactio
161c0 6e 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65  n(pPager, zMaste
161d0 72 5b 30 5d 21 3d 27 5c 30 27 29 3b 0a 20 20 20  r[0]!='\0');.   
161e0 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53   testcase( rc!=S
161f0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a  QLITE_OK );.  }.
16200 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
16210 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b 30  _OK && zMaster[0
16220 5d 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20  ] && res ){.    
16230 2f 2a 20 49 66 20 74 68 65 72 65 20 77 61 73 20  /* If there was 
16240 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
16250 20 61 6e 64 20 74 68 69 73 20 72 6f 75 74 69 6e   and this routin
16260 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 73 75  e will return su
16270 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20 73 65  ccess,.    ** se
16280 65 20 69 66 20 69 74 20 69 73 20 70 6f 73 73 69  e if it is possi
16290 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68  ble to delete th
162a0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
162b0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
162c0 3d 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65  = pager_delmaste
162d0 72 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65  r(pPager, zMaste
162e0 72 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  r);.    testcase
162f0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
16300 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  );.  }..  /* The
16310 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a   Pager.sectorSiz
16320 65 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 68  e variable may h
16330 61 76 65 20 62 65 65 6e 20 75 70 64 61 74 65 64  ave been updated
16340 20 77 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20   while rolling. 
16350 20 2a 2a 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e   ** back a journ
16360 61 6c 20 63 72 65 61 74 65 64 20 62 79 20 61 20  al created by a 
16370 70 72 6f 63 65 73 73 20 77 69 74 68 20 61 20 64  process with a d
16380 69 66 66 65 72 65 6e 74 20 73 65 63 74 6f 72 20  ifferent sector 
16390 73 69 7a 65 0a 20 20 2a 2a 20 76 61 6c 75 65 2e  size.  ** value.
163a0 20 52 65 73 65 74 20 69 74 20 74 6f 20 74 68 65   Reset it to the
163b0 20 63 6f 72 72 65 63 74 20 76 61 6c 75 65 20 66   correct value f
163c0 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e  or this process.
163d0 0a 20 20 2a 2f 0a 20 20 73 65 74 53 65 63 74 6f  .  */.  setSecto
163e0 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20  rSize(pPager);. 
163f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
16400 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 63  /*.** Read the c
16410 6f 6e 74 65 6e 74 20 66 6f 72 20 70 61 67 65 20  ontent for page 
16420 70 50 67 20 6f 75 74 20 6f 66 20 74 68 65 20 64  pPg out of the d
16430 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
16440 20 69 6e 74 6f 20 0a 2a 2a 20 70 50 67 2d 3e 70   into .** pPg->p
16450 44 61 74 61 2e 20 41 20 73 68 61 72 65 64 20 6c  Data. A shared l
16460 6f 63 6b 20 6f 72 20 67 72 65 61 74 65 72 20 6d  ock or greater m
16470 75 73 74 20 62 65 20 68 65 6c 64 20 6f 6e 20 74  ust be held on t
16480 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66  he database.** f
16490 69 6c 65 20 62 65 66 6f 72 65 20 74 68 69 73 20  ile before this 
164a0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
164b0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 67  ed..**.** If pag
164c0 65 20 31 20 69 73 20 72 65 61 64 2c 20 74 68 65  e 1 is read, the
164d0 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50  n the value of P
164e0 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73 5b  ager.dbFileVers[
164f0 5d 20 69 73 20 73 65 74 20 74 6f 0a 2a 2a 20 74  ] is set to.** t
16500 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72  he value read fr
16510 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
16520 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  file..**.** If a
16530 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
16540 73 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65  s, then the IO e
16550 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  rror is returned
16560 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   to the caller..
16570 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51  ** Otherwise, SQ
16580 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
16590 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
165a0 6e 74 20 72 65 61 64 44 62 50 61 67 65 28 50 67  nt readDbPage(Pg
165b0 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  Hdr *pPg){.  Pag
165c0 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
165d0 2d 3e 70 50 61 67 65 72 3b 20 2f 2a 20 50 61 67  ->pPager; /* Pag
165e0 65 72 20 6f 62 6a 65 63 74 20 61 73 73 6f 63 69  er object associ
165f0 61 74 65 64 20 77 69 74 68 20 70 61 67 65 20 70  ated with page p
16600 50 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  Pg */.  Pgno pgn
16610 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 20 20  o = pPg->pgno;  
16620 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
16630 62 65 72 20 74 6f 20 72 65 61 64 20 2a 2f 0a 20  ber to read */. 
16640 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
16650 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  _OK;          /*
16660 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
16670 20 20 69 6e 74 20 69 73 49 6e 57 61 6c 20 3d 20    int isInWal = 
16680 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
16690 2a 20 54 72 75 65 20 69 66 20 70 61 67 65 20 69  * True if page i
166a0 73 20 69 6e 20 6c 6f 67 20 66 69 6c 65 20 2a 2f  s in log file */
166b0 0a 20 20 69 6e 74 20 70 67 73 7a 20 3d 20 70 50  .  int pgsz = pP
166c0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20  ager->pageSize; 
166d0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
166e0 65 73 20 74 6f 20 72 65 61 64 20 2a 2f 0a 0a 20  es to read */.. 
166f0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
16700 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48  >state>=PAGER_SH
16710 41 52 45 44 20 26 26 20 21 4d 45 4d 44 42 20 29  ARED && !MEMDB )
16720 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ;.  assert( isOp
16730 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
16740 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45 52 28 21  ;..  if( NEVER(!
16750 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
16760 64 29 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  d)) ){.    asser
16770 74 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  t( pPager->tempF
16780 69 6c 65 20 29 3b 0a 20 20 20 20 6d 65 6d 73 65  ile );.    memse
16790 74 28 70 50 67 2d 3e 70 44 61 74 61 2c 20 30 2c  t(pPg->pData, 0,
167a0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
167b0 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  e);.    return S
167c0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
167d0 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c   if( pagerUseWal
167e0 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
167f0 2f 2a 20 54 72 79 20 74 6f 20 70 75 6c 6c 20 74  /* Try to pull t
16800 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65  he page from the
16810 20 77 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67   write-ahead log
16820 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71  . */.    rc = sq
16830 6c 69 74 65 33 57 61 6c 52 65 61 64 28 70 50 61  lite3WalRead(pPa
16840 67 65 72 2d 3e 70 57 61 6c 2c 20 70 67 6e 6f 2c  ger->pWal, pgno,
16850 20 26 69 73 49 6e 57 61 6c 2c 20 70 67 73 7a 2c   &isInWal, pgsz,
16860 20 70 50 67 2d 3e 70 44 61 74 61 29 3b 0a 20 20   pPg->pData);.  
16870 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
16880 54 45 5f 4f 4b 20 26 26 20 21 69 73 49 6e 57 61  TE_OK && !isInWa
16890 6c 20 29 7b 0a 20 20 20 20 69 36 34 20 69 4f 66  l ){.    i64 iOf
168a0 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a  fset = (pgno-1)*
168b0 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67  (i64)pPager->pag
168c0 65 53 69 7a 65 3b 0a 20 20 20 20 72 63 20 3d 20  eSize;.    rc = 
168d0 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
168e0 61 67 65 72 2d 3e 66 64 2c 20 70 50 67 2d 3e 70  ager->fd, pPg->p
168f0 44 61 74 61 2c 20 70 67 73 7a 2c 20 69 4f 66 66  Data, pgsz, iOff
16900 73 65 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63  set);.    if( rc
16910 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  ==SQLITE_IOERR_S
16920 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20  HORT_READ ){.   
16930 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
16940 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  K;.    }.  }..  
16950 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20  if( pgno==1 ){. 
16960 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
16970 20 20 20 2f 2a 20 49 66 20 74 68 65 20 72 65 61     /* If the rea
16980 64 20 69 73 20 75 6e 73 75 63 63 65 73 73 66 75  d is unsuccessfu
16990 6c 2c 20 73 65 74 20 74 68 65 20 64 62 46 69 6c  l, set the dbFil
169a0 65 56 65 72 73 5b 5d 20 74 6f 20 73 6f 6d 65 74  eVers[] to somet
169b0 68 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74 68  hing.      ** th
169c0 61 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65  at will never be
169d0 20 61 20 76 61 6c 69 64 20 66 69 6c 65 20 76 65   a valid file ve
169e0 72 73 69 6f 6e 2e 20 20 64 62 46 69 6c 65 56 65  rsion.  dbFileVe
169f0 72 73 5b 5d 20 69 73 20 61 20 63 6f 70 79 0a 20  rs[] is a copy. 
16a00 20 20 20 20 20 2a 2a 20 6f 66 20 62 79 74 65 73       ** of bytes
16a10 20 32 34 2e 2e 33 39 20 6f 66 20 74 68 65 20 64   24..39 of the d
16a20 61 74 61 62 61 73 65 2e 20 20 42 79 74 65 73 20  atabase.  Bytes 
16a30 32 38 2e 2e 33 31 20 73 68 6f 75 6c 64 20 61 6c  28..31 should al
16a40 77 61 79 73 20 62 65 0a 20 20 20 20 20 20 2a 2a  ways be.      **
16a50 20 7a 65 72 6f 20 6f 72 20 74 68 65 20 73 69 7a   zero or the siz
16a60 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
16a70 65 20 69 6e 20 70 61 67 65 2e 20 42 79 74 65 73  e in page. Bytes
16a80 20 33 32 2e 2e 33 35 20 61 6e 64 20 33 35 2e 2e   32..35 and 35..
16a90 33 39 0a 20 20 20 20 20 20 2a 2a 20 73 68 6f 75  39.      ** shou
16aa0 6c 64 20 62 65 20 70 61 67 65 20 6e 75 6d 62 65  ld be page numbe
16ab0 72 73 20 77 68 69 63 68 20 61 72 65 20 6e 65 76  rs which are nev
16ac0 65 72 20 30 78 66 66 66 66 66 66 66 66 2e 20 20  er 0xffffffff.  
16ad0 53 6f 20 66 69 6c 6c 69 6e 67 0a 20 20 20 20 20  So filling.     
16ae0 20 2a 2a 20 70 50 61 67 65 72 2d 3e 64 62 46 69   ** pPager->dbFi
16af0 6c 65 56 65 72 73 5b 5d 20 77 69 74 68 20 61 6c  leVers[] with al
16b00 6c 20 30 78 66 66 20 62 79 74 65 73 20 73 68 6f  l 0xff bytes sho
16b10 75 6c 64 20 73 75 66 66 69 63 65 2e 0a 20 20 20  uld suffice..   
16b20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46     **.      ** F
16b30 6f 72 20 61 6e 20 65 6e 63 72 79 70 74 65 64 20  or an encrypted 
16b40 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 73 69  database, the si
16b50 74 75 61 74 69 6f 6e 20 69 73 20 6d 6f 72 65 20  tuation is more 
16b60 63 6f 6d 70 6c 65 78 3a 20 20 62 79 74 65 73 0a  complex:  bytes.
16b70 20 20 20 20 20 20 2a 2a 20 32 34 2e 2e 33 39 20        ** 24..39 
16b80 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
16b90 61 72 65 20 77 68 69 74 65 20 6e 6f 69 73 65 2e  are white noise.
16ba0 20 20 42 75 74 20 74 68 65 20 70 72 6f 62 61 62    But the probab
16bb0 69 6c 69 74 79 20 6f 66 0a 20 20 20 20 20 20 2a  ility of.      *
16bc0 2a 20 77 68 69 74 65 20 6e 6f 69 73 69 6e 67 20  * white noising 
16bd0 65 71 75 61 6c 69 6e 67 20 31 36 20 62 79 74 65  equaling 16 byte
16be0 73 20 6f 66 20 30 78 66 66 20 69 73 20 76 61 6e  s of 0xff is van
16bf0 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20 73  ishingly small s
16c00 6f 0a 20 20 20 20 20 20 2a 2a 20 77 65 20 73 68  o.      ** we sh
16c10 6f 75 6c 64 20 73 74 69 6c 6c 20 62 65 20 6f 6b  ould still be ok
16c20 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
16c30 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e   memset(pPager->
16c40 64 62 46 69 6c 65 56 65 72 73 2c 20 30 78 66 66  dbFileVers, 0xff
16c50 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  , sizeof(pPager-
16c60 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20  >dbFileVers));. 
16c70 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
16c80 75 38 20 2a 64 62 46 69 6c 65 56 65 72 73 20 3d  u8 *dbFileVers =
16c90 20 26 28 28 75 38 2a 29 70 50 67 2d 3e 70 44 61   &((u8*)pPg->pDa
16ca0 74 61 29 5b 32 34 5d 3b 0a 20 20 20 20 20 20 6d  ta)[24];.      m
16cb0 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64  emcpy(&pPager->d
16cc0 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c  bFileVers, dbFil
16cd0 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 70 50  eVers, sizeof(pP
16ce0 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
16cf0 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ));.    }.  }.  
16d00 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 70  CODEC1(pPager, p
16d10 50 67 2d 3e 70 44 61 74 61 2c 20 70 67 6e 6f 2c  Pg->pData, pgno,
16d20 20 33 2c 20 72 63 20 3d 20 53 51 4c 49 54 45 5f   3, rc = SQLITE_
16d30 4e 4f 4d 45 4d 29 3b 0a 0a 20 20 50 41 47 45 52  NOMEM);..  PAGER
16d40 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61  _INCR(sqlite3_pa
16d50 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74  ger_readdb_count
16d60 29 3b 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28  );.  PAGER_INCR(
16d70 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 29 3b 0a  pPager->nRead);.
16d80 20 20 49 4f 54 52 41 43 45 28 28 22 50 47 49 4e    IOTRACE(("PGIN
16d90 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
16da0 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 50 41 47  r, pgno));.  PAG
16db0 45 52 54 52 41 43 45 28 28 22 46 45 54 43 48 20  ERTRACE(("FETCH 
16dc0 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28  %d page %d hash(
16dd0 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20  %08x)\n",.      
16de0 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44           PAGERID
16df0 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20  (pPager), pgno, 
16e00 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
16e10 50 67 29 29 29 3b 0a 0a 20 20 72 65 74 75 72 6e  Pg)));..  return
16e20 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20   rc;.}..#ifndef 
16e30 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
16e40 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
16e50 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f  ion is invoked o
16e60 6e 63 65 20 66 6f 72 20 65 61 63 68 20 70 61 67  nce for each pag
16e70 65 20 74 68 61 74 20 68 61 73 20 61 6c 72 65 61  e that has alrea
16e80 64 79 20 62 65 65 6e 20 0a 2a 2a 20 77 72 69 74  dy been .** writ
16e90 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6c 6f 67  ten into the log
16ea0 20 66 69 6c 65 20 77 68 65 6e 20 61 20 57 41 4c   file when a WAL
16eb0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
16ec0 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20  rolled back..** 
16ed0 50 61 72 61 6d 65 74 65 72 20 69 50 67 20 69 73  Parameter iPg is
16ee0 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
16ef0 20 6f 66 20 73 61 69 64 20 70 61 67 65 2e 20 54   of said page. T
16f00 68 65 20 70 43 74 78 20 61 72 67 75 6d 65 6e 74  he pCtx argument
16f10 20 0a 2a 2a 20 69 73 20 61 63 74 75 61 6c 6c 79   .** is actually
16f20 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
16f30 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72  e Pager structur
16f40 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 67 65  e..**.** If page
16f50 20 69 50 67 20 69 73 20 70 72 65 73 65 6e 74 20   iPg is present 
16f60 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20 61 6e  in the cache, an
16f70 64 20 68 61 73 20 6e 6f 20 6f 75 74 73 74 61 6e  d has no outstan
16f80 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2c  ding references,
16f90 0a 2a 2a 20 69 74 20 69 73 20 64 69 73 63 61 72  .** it is discar
16fa0 64 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ded. Otherwise, 
16fb0 69 66 20 74 68 65 72 65 20 61 72 65 20 6f 6e 65  if there are one
16fc0 20 6f 72 20 6d 6f 72 65 20 6f 75 74 73 74 61 6e   or more outstan
16fd0 64 69 6e 67 0a 2a 2a 20 72 65 66 65 72 65 6e 63  ding.** referenc
16fe0 65 73 2c 20 74 68 65 20 70 61 67 65 20 63 6f 6e  es, the page con
16ff0 74 65 6e 74 20 69 73 20 72 65 6c 6f 61 64 65 64  tent is reloaded
17000 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
17010 73 65 2e 20 49 66 20 74 68 65 0a 2a 2a 20 61 74  se. If the.** at
17020 74 65 6d 70 74 20 74 6f 20 72 65 6c 6f 61 64 20  tempt to reload 
17030 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65  content from the
17040 20 64 61 74 61 62 61 73 65 20 69 73 20 72 65 71   database is req
17050 75 69 72 65 64 20 61 6e 64 20 66 61 69 6c 73 2c  uired and fails,
17060 20 0a 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20 53   .** return an S
17070 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
17080 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c  . Otherwise, SQL
17090 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69  ITE_OK..*/.stati
170a0 63 20 69 6e 74 20 70 61 67 65 72 55 6e 64 6f 43  c int pagerUndoC
170b0 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70 43  allback(void *pC
170c0 74 78 2c 20 50 67 6e 6f 20 69 50 67 29 7b 0a 20  tx, Pgno iPg){. 
170d0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
170e0 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  _OK;.  Pager *pP
170f0 61 67 65 72 20 3d 20 28 50 61 67 65 72 20 2a 29  ager = (Pager *)
17100 70 43 74 78 3b 0a 20 20 50 67 48 64 72 20 2a 70  pCtx;.  PgHdr *p
17110 50 67 3b 0a 0a 20 20 70 50 67 20 3d 20 73 71 6c  Pg;..  pPg = sql
17120 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28  ite3PagerLookup(
17130 70 50 61 67 65 72 2c 20 69 50 67 29 3b 0a 20 20  pPager, iPg);.  
17140 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 69  if( pPg ){.    i
17150 66 28 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  f( sqlite3Pcache
17160 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 50 67  PageRefcount(pPg
17170 29 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71  )==1 ){.      sq
17180 6c 69 74 65 33 50 63 61 63 68 65 44 72 6f 70 28  lite3PcacheDrop(
17190 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  pPg);.    }else{
171a0 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64  .      rc = read
171b0 44 62 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20  DbPage(pPg);.   
171c0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
171d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
171e0 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65  pPager->xReinite
171f0 72 28 70 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a  r(pPg);.      }.
17200 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
17210 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20  erUnref(pPg);.  
17220 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f    }.  }..  /* No
17230 72 6d 61 6c 6c 79 2c 20 69 66 20 61 20 74 72 61  rmally, if a tra
17240 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
17250 65 64 20 62 61 63 6b 2c 20 61 6e 79 20 62 61 63  ed back, any bac
17260 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20 61 72  kup processes ar
17270 65 0a 20 20 2a 2a 20 75 70 64 61 74 65 64 20 61  e.  ** updated a
17280 73 20 64 61 74 61 20 69 73 20 63 6f 70 69 65 64  s data is copied
17290 20 6f 75 74 20 6f 66 20 74 68 65 20 72 6f 6c 6c   out of the roll
172a0 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  back journal and
172b0 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64   into the.  ** d
172c0 61 74 61 62 61 73 65 2e 20 54 68 69 73 20 69 73  atabase. This is
172d0 20 6e 6f 74 20 67 65 6e 65 72 61 6c 6c 79 20 70   not generally p
172e0 6f 73 73 69 62 6c 65 20 77 69 74 68 20 61 20 57  ossible with a W
172f0 41 4c 20 64 61 74 61 62 61 73 65 2c 20 61 73 0a  AL database, as.
17300 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 69 6e    ** rollback in
17310 76 6f 6c 76 65 73 20 73 69 6d 70 6c 79 20 74 72  volves simply tr
17320 75 6e 63 61 74 69 6e 67 20 74 68 65 20 6c 6f 67  uncating the log
17330 20 66 69 6c 65 2e 20 54 68 65 72 65 66 6f 72 65   file. Therefore
17340 2c 20 69 66 20 6f 6e 65 0a 20 20 2a 2a 20 6f 72  , if one.  ** or
17350 20 6d 6f 72 65 20 66 72 61 6d 65 73 20 68 61 76   more frames hav
17360 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77  e already been w
17370 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6c 6f  ritten to the lo
17380 67 20 28 61 6e 64 20 74 68 65 72 65 66 6f 72 65  g (and therefore
17390 20 0a 20 20 2a 2a 20 61 6c 73 6f 20 63 6f 70 69   .  ** also copi
173a0 65 64 20 69 6e 74 6f 20 74 68 65 20 62 61 63 6b  ed into the back
173b0 75 70 20 64 61 74 61 62 61 73 65 73 29 20 61 73  up databases) as
173c0 20 70 61 72 74 20 6f 66 20 74 68 69 73 20 74 72   part of this tr
173d0 61 6e 73 61 63 74 69 6f 6e 2c 0a 20 20 2a 2a 20  ansaction,.  ** 
173e0 74 68 65 20 62 61 63 6b 75 70 73 20 6d 75 73 74  the backups must
173f0 20 62 65 20 72 65 73 74 61 72 74 65 64 2e 0a 20   be restarted.. 
17400 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 61 63   */.  sqlite3Bac
17410 6b 75 70 52 65 73 74 61 72 74 28 70 50 61 67 65  kupRestart(pPage
17420 72 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 0a 20 20  r->pBackup);..  
17430 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
17440 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
17450 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72  n is called to r
17460 6f 6c 6c 62 61 63 6b 20 61 20 74 72 61 6e 73 61  ollback a transa
17470 63 74 69 6f 6e 20 6f 6e 20 61 20 57 41 4c 20 64  ction on a WAL d
17480 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74  atabase..*/.stat
17490 69 63 20 69 6e 74 20 70 61 67 65 72 52 6f 6c 6c  ic int pagerRoll
174a0 62 61 63 6b 57 61 6c 28 50 61 67 65 72 20 2a 70  backWal(Pager *p
174b0 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
174c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
174d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
174e0 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 50 67  urn Code */.  Pg
174f0 48 64 72 20 2a 70 4c 69 73 74 3b 20 20 20 20 20  Hdr *pList;     
17500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17510 20 4c 69 73 74 20 6f 66 20 64 69 72 74 79 20 70   List of dirty p
17520 61 67 65 73 20 74 6f 20 72 65 76 65 72 74 20 2a  ages to revert *
17530 2f 0a 0a 20 20 2f 2a 20 46 6f 72 20 61 6c 6c 20  /..  /* For all 
17540 70 61 67 65 73 20 69 6e 20 74 68 65 20 63 61 63  pages in the cac
17550 68 65 20 74 68 61 74 20 61 72 65 20 63 75 72 72  he that are curr
17560 65 6e 74 6c 79 20 64 69 72 74 79 20 6f 72 20 68  ently dirty or h
17570 61 76 65 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a  ave already.  **
17580 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 28 62   been written (b
17590 75 74 20 6e 6f 74 20 63 6f 6d 6d 69 74 74 65 64  ut not committed
175a0 29 20 74 6f 20 74 68 65 20 6c 6f 67 20 66 69 6c  ) to the log fil
175b0 65 2c 20 64 6f 20 6f 6e 65 20 6f 66 20 74 68 65  e, do one of the
175c0 20 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67   .  ** following
175d0 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2b 20  :.  **.  **   + 
175e0 44 69 73 63 61 72 64 20 74 68 65 20 63 61 63 68  Discard the cach
175f0 65 64 20 70 61 67 65 20 28 69 66 20 72 65 66 63  ed page (if refc
17600 6f 75 6e 74 3d 3d 30 29 2c 20 6f 72 0a 20 20 2a  ount==0), or.  *
17610 2a 20 20 20 2b 20 52 65 6c 6f 61 64 20 70 61 67  *   + Reload pag
17620 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74  e content from t
17630 68 65 20 64 61 74 61 62 61 73 65 20 28 69 66 20  he database (if 
17640 72 65 66 63 6f 75 6e 74 3e 30 29 2e 0a 20 20 2a  refcount>0)..  *
17650 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69  /.  pPager->dbSi
17660 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 4f  ze = pPager->dbO
17670 72 69 67 53 69 7a 65 3b 0a 20 20 72 63 20 3d 20  rigSize;.  rc = 
17680 73 71 6c 69 74 65 33 57 61 6c 55 6e 64 6f 28 70  sqlite3WalUndo(p
17690 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 61 67  Pager->pWal, pag
176a0 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 2c 20  erUndoCallback, 
176b0 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72 29 3b  (void *)pPager);
176c0 0a 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74  .  pList = sqlit
176d0 65 33 50 63 61 63 68 65 44 69 72 74 79 4c 69 73  e3PcacheDirtyLis
176e0 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
176f0 65 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 4c 69  e);.  while( pLi
17700 73 74 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  st && rc==SQLITE
17710 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 67 48 64 72  _OK ){.    PgHdr
17720 20 2a 70 4e 65 78 74 20 3d 20 70 4c 69 73 74 2d   *pNext = pList-
17730 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 72 63 20  >pDirty;.    rc 
17740 3d 20 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62  = pagerUndoCallb
17750 61 63 6b 28 28 76 6f 69 64 20 2a 29 70 50 61 67  ack((void *)pPag
17760 65 72 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29  er, pList->pgno)
17770 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4e  ;.    pList = pN
17780 65 78 74 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ext;.  }..  retu
17790 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
177a0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
177b0 20 61 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e   a wrapper aroun
177c0 64 20 73 71 6c 69 74 65 33 57 61 6c 46 72 61 6d  d sqlite3WalFram
177d0 65 73 28 29 2e 20 41 73 20 77 65 6c 6c 20 61 73  es(). As well as
177e0 20 6c 6f 67 67 69 6e 67 0a 2a 2a 20 74 68 65 20   logging.** the 
177f0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
17800 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20 68 65  list of pages he
17810 61 64 65 64 20 62 79 20 70 4c 69 73 74 20 28 63  aded by pList (c
17820 6f 6e 6e 65 63 74 65 64 20 62 79 20 70 44 69 72  onnected by pDir
17830 74 79 29 2c 0a 2a 2a 20 74 68 69 73 20 66 75 6e  ty),.** this fun
17840 63 74 69 6f 6e 20 6e 6f 74 69 66 69 65 73 20 61  ction notifies a
17850 6e 79 20 61 63 74 69 76 65 20 62 61 63 6b 75 70  ny active backup
17860 20 70 72 6f 63 65 73 73 65 73 20 74 68 61 74 20   processes that 
17870 74 68 65 20 70 61 67 65 73 20 68 61 76 65 0a 2a  the pages have.*
17880 2a 20 63 68 61 6e 67 65 64 2e 20 0a 2a 2f 20 0a  * changed. .*/ .
17890 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
178a0 57 61 6c 46 72 61 6d 65 73 28 0a 20 20 50 61 67  WalFrames(.  Pag
178b0 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
178c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
178d0 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  Pager object */.
178e0 20 20 50 67 48 64 72 20 2a 70 4c 69 73 74 2c 20    PgHdr *pList, 
178f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17900 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72 61    /* List of fra
17910 6d 65 73 20 74 6f 20 6c 6f 67 20 2a 2f 0a 20 20  mes to log */.  
17920 50 67 6e 6f 20 6e 54 72 75 6e 63 61 74 65 2c 20  Pgno nTruncate, 
17930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17940 2f 2a 20 44 61 74 61 62 61 73 65 20 73 69 7a 65  /* Database size
17950 20 61 66 74 65 72 20 74 68 69 73 20 63 6f 6d 6d   after this comm
17960 69 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f  it */.  int isCo
17970 6d 6d 69 74 2c 20 20 20 20 20 20 20 20 20 20 20  mmit,           
17980 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
17990 69 66 20 74 68 69 73 20 69 73 20 61 20 63 6f 6d  if this is a com
179a0 6d 69 74 20 2a 2f 0a 20 20 69 6e 74 20 73 79 6e  mit */.  int syn
179b0 63 5f 66 6c 61 67 73 20 20 20 20 20 20 20 20 20  c_flags         
179c0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
179d0 73 20 74 6f 20 70 61 73 73 20 74 6f 20 4f 73 53  s to pass to OsS
179e0 79 6e 63 28 29 20 28 6f 72 20 30 29 20 2a 2f 0a  ync() (or 0) */.
179f0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
17a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a10 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
17a20 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ode */..  assert
17a30 28 20 70 50 61 67 65 72 2d 3e 70 57 61 6c 20 29  ( pPager->pWal )
17a40 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
17a50 57 61 6c 46 72 61 6d 65 73 28 70 50 61 67 65 72  WalFrames(pPager
17a60 2d 3e 70 57 61 6c 2c 20 0a 20 20 20 20 20 20 70  ->pWal, .      p
17a70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
17a80 20 70 4c 69 73 74 2c 20 6e 54 72 75 6e 63 61 74   pList, nTruncat
17a90 65 2c 20 69 73 43 6f 6d 6d 69 74 2c 20 73 79 6e  e, isCommit, syn
17aa0 63 5f 66 6c 61 67 73 0a 20 20 29 3b 0a 20 20 69  c_flags.  );.  i
17ab0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
17ac0 20 26 26 20 70 50 61 67 65 72 2d 3e 70 42 61 63   && pPager->pBac
17ad0 6b 75 70 20 29 7b 0a 20 20 20 20 50 67 48 64 72  kup ){.    PgHdr
17ae0 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70   *p;.    for(p=p
17af0 4c 69 73 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 44  List; p; p=p->pD
17b00 69 72 74 79 29 7b 0a 20 20 20 20 20 20 73 71 6c  irty){.      sql
17b10 69 74 65 33 42 61 63 6b 75 70 55 70 64 61 74 65  ite3BackupUpdate
17b20 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70  (pPager->pBackup
17b30 2c 20 70 2d 3e 70 67 6e 6f 2c 20 28 75 38 20 2a  , p->pgno, (u8 *
17b40 29 70 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20 20  )p->pData);.    
17b50 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
17b60 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69  c;.}../*.** Begi
17b70 6e 20 61 20 72 65 61 64 20 74 72 61 6e 73 61 63  n a read transac
17b80 74 69 6f 6e 20 6f 6e 20 74 68 65 20 57 41 4c 2e  tion on the WAL.
17b90 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
17ba0 69 6e 65 20 75 73 65 64 20 74 6f 20 62 65 20 63  ine used to be c
17bb0 61 6c 6c 65 64 20 22 70 61 67 65 72 4f 70 65 6e  alled "pagerOpen
17bc0 53 6e 61 70 73 68 6f 74 28 29 22 20 62 65 63 61  Snapshot()" beca
17bd0 75 73 65 20 69 74 20 65 73 73 65 6e 74 69 61 6c  use it essential
17be0 6c 79 0a 2a 2a 20 6d 61 6b 65 73 20 61 20 73 6e  ly.** makes a sn
17bf0 61 70 73 68 6f 74 20 6f 66 20 74 68 65 20 64 61  apshot of the da
17c00 74 61 62 61 73 65 20 61 74 20 74 68 65 20 63 75  tabase at the cu
17c10 72 72 65 6e 74 20 70 6f 69 6e 74 20 69 6e 20 74  rrent point in t
17c20 69 6d 65 20 61 6e 64 20 70 72 65 73 65 72 76 65  ime and preserve
17c30 73 0a 2a 2a 20 74 68 61 74 20 73 6e 61 70 73 68  s.** that snapsh
17c40 6f 74 20 66 6f 72 20 75 73 65 20 62 79 20 74 68  ot for use by th
17c50 65 20 72 65 61 64 65 72 20 69 6e 20 73 70 69 74  e reader in spit
17c60 65 20 6f 66 20 63 6f 6e 63 75 72 72 65 6e 74 6c  e of concurrentl
17c70 79 20 63 68 61 6e 67 65 73 20 62 79 0a 2a 2a 20  y changes by.** 
17c80 6f 74 68 65 72 20 77 72 69 74 65 72 73 20 6f 72  other writers or
17c90 20 63 68 65 63 6b 70 6f 69 6e 74 65 72 73 2e 0a   checkpointers..
17ca0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
17cb0 67 65 72 42 65 67 69 6e 52 65 61 64 54 72 61 6e  gerBeginReadTran
17cc0 73 61 63 74 69 6f 6e 28 50 61 67 65 72 20 2a 70  saction(Pager *p
17cd0 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
17ce0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
17cf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
17d00 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
17d10 74 20 63 68 61 6e 67 65 64 20 3d 20 30 3b 20 20  t changed = 0;  
17d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17d30 20 54 72 75 65 20 69 66 20 63 61 63 68 65 20 6d   True if cache m
17d40 75 73 74 20 62 65 20 72 65 73 65 74 20 2a 2f 0a  ust be reset */.
17d50 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72  .  assert( pager
17d60 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
17d70 3b 0a 0a 20 20 2f 2a 20 73 71 6c 69 74 65 33 57  ;..  /* sqlite3W
17d80 61 6c 45 6e 64 52 65 61 64 54 72 61 6e 73 61 63  alEndReadTransac
17d90 74 69 6f 6e 28 29 20 77 61 73 20 6e 6f 74 20 63  tion() was not c
17da0 61 6c 6c 65 64 20 66 6f 72 20 74 68 65 20 70 72  alled for the pr
17db0 65 76 69 6f 75 73 0a 20 20 2a 2a 20 74 72 61 6e  evious.  ** tran
17dc0 73 61 63 74 69 6f 6e 20 69 6e 20 6c 6f 63 6b 69  saction in locki
17dd0 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56  ng_mode=EXCLUSIV
17de0 45 2e 20 20 53 6f 20 63 61 6c 6c 20 69 74 20 6e  E.  So call it n
17df0 6f 77 2e 20 20 49 66 20 77 65 0a 20 20 2a 2a 20  ow.  If we.  ** 
17e00 61 72 65 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d  are in locking_m
17e10 6f 64 65 3d 4e 4f 52 4d 41 4c 20 61 6e 64 20 45  ode=NORMAL and E
17e20 6e 64 52 65 61 64 28 29 20 77 61 73 20 70 72 65  ndRead() was pre
17e30 76 69 6f 75 73 6c 79 20 63 61 6c 6c 65 64 2c 0a  viously called,.
17e40 20 20 2a 2a 20 74 68 65 20 64 75 70 6c 69 63 61    ** the duplica
17e50 74 65 20 63 61 6c 6c 20 69 73 20 68 61 72 6d 6c  te call is harml
17e60 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ess..  */.  sqli
17e70 74 65 33 57 61 6c 45 6e 64 52 65 61 64 54 72 61  te3WalEndReadTra
17e80 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d  nsaction(pPager-
17e90 3e 70 57 61 6c 29 3b 0a 0a 20 20 72 63 20 3d 20  >pWal);..  rc = 
17ea0 73 71 6c 69 74 65 33 57 61 6c 42 65 67 69 6e 52  sqlite3WalBeginR
17eb0 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70  eadTransaction(p
17ec0 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 26 63 68  Pager->pWal, &ch
17ed0 61 6e 67 65 64 29 3b 0a 20 20 69 66 28 20 72 63  anged);.  if( rc
17ee0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
17ef0 20 20 20 69 6e 74 20 64 75 6d 6d 79 3b 0a 20 20     int dummy;.  
17f00 20 20 69 66 28 20 63 68 61 6e 67 65 64 20 29 7b    if( changed ){
17f10 0a 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73  .      pager_res
17f20 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  et(pPager);.    
17f30 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
17f40 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 70 50 61  ->errCode || pPa
17f50 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64  ger->dbSizeValid
17f60 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ==0 );.    }.   
17f70 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
17f80 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
17f90 65 72 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 7d  er, &dummy);.  }
17fa0 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  .  pPager->state
17fb0 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b   = PAGER_SHARED;
17fc0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
17fd0 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 69 66  ../*.** Check if
17fe0 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20   the *-wal file 
17ff0 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 73  that corresponds
18000 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
18010 20 6f 70 65 6e 65 64 20 62 79 20 70 50 61 67 65   opened by pPage
18020 72 0a 2a 2a 20 65 78 69 73 74 73 20 69 66 20 74  r.** exists if t
18030 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6e  he database is n
18040 6f 74 20 65 6d 70 79 2c 20 6f 72 20 76 65 72 69  ot empy, or veri
18050 66 79 20 74 68 61 74 20 74 68 65 20 2a 2d 77 61  fy that the *-wa
18060 6c 20 66 69 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e  l file does.** n
18070 6f 74 20 65 78 69 73 74 20 28 62 79 20 64 65 6c  ot exist (by del
18080 65 74 69 6e 67 20 69 74 29 20 69 66 20 74 68 65  eting it) if the
18090 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
180a0 73 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 49  s empty..**.** I
180b0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
180c0 73 20 6e 6f 74 20 65 6d 70 74 79 20 61 6e 64 20  s not empty and 
180d0 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 65  the *-wal file e
180e0 78 69 73 74 73 2c 20 6f 70 65 6e 20 74 68 65 20  xists, open the 
180f0 70 61 67 65 72 0a 2a 2a 20 69 6e 20 57 41 4c 20  pager.** in WAL 
18100 6d 6f 64 65 2e 20 20 49 66 20 74 68 65 20 64 61  mode.  If the da
18110 74 61 62 61 73 65 20 69 73 20 65 6d 70 74 79 20  tabase is empty 
18120 6f 72 20 69 66 20 6e 6f 20 2a 2d 77 61 6c 20 66  or if no *-wal f
18130 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64 0a 2a  ile exists and.*
18140 2a 20 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63  * if no error oc
18150 63 75 72 73 2c 20 6d 61 6b 65 20 73 75 72 65 20  curs, make sure 
18160 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64  Pager.journalMod
18170 65 20 69 73 20 6e 6f 74 20 73 65 74 20 74 6f 0a  e is not set to.
18180 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  ** PAGER_JOURNAL
18190 4d 4f 44 45 5f 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20  MODE_WAL..**.** 
181a0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
181b0 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
181c0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
181d0 57 41 4c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e  WAL file is open
181e0 65 64 2c 20 61 6c 73 6f 20 6f 70 65 6e 20 61 20  ed, also open a 
181f0 73 6e 61 70 73 68 6f 74 20 28 72 65 61 64 20 74  snapshot (read t
18200 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a  ransaction)..**.
18210 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  ** The caller mu
18220 73 74 20 68 6f 6c 64 20 61 20 53 48 41 52 45 44  st hold a SHARED
18230 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
18240 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63 61  abase file to ca
18250 6c 6c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  ll this.** funct
18260 69 6f 6e 2e 20 42 65 63 61 75 73 65 20 61 6e 20  ion. Because an 
18270 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
18280 6e 20 74 68 65 20 64 62 20 66 69 6c 65 20 69 73  n the db file is
18290 20 72 65 71 75 69 72 65 64 20 74 6f 20 64 65 6c   required to del
182a0 65 74 65 20 0a 2a 2a 20 61 20 57 41 4c 20 6f 6e  ete .** a WAL on
182b0 20 61 20 6e 6f 6e 65 2d 65 6d 70 74 79 20 64 61   a none-empty da
182c0 74 61 62 61 73 65 2c 20 74 68 69 73 20 65 6e 73  tabase, this ens
182d0 75 72 65 73 20 74 68 65 72 65 20 69 73 20 6e 6f  ures there is no
182e0 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20   race condition 
182f0 0a 2a 2a 20 62 65 74 77 65 65 6e 20 74 68 65 20  .** between the 
18300 78 41 63 63 65 73 73 28 29 20 62 65 6c 6f 77 20  xAccess() below 
18310 61 6e 64 20 61 6e 20 78 44 65 6c 65 74 65 28 29  and an xDelete()
18320 20 62 65 69 6e 67 20 65 78 65 63 75 74 65 64 20   being executed 
18330 62 79 20 73 6f 6d 65 20 0a 2a 2a 20 6f 74 68 65  by some .** othe
18340 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f  r connection..*/
18350 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
18360 72 4f 70 65 6e 57 61 6c 49 66 50 72 65 73 65 6e  rOpenWalIfPresen
18370 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
18380 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
18390 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 70  ITE_OK;.  if( !p
183a0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
183b0 29 7b 0a 20 20 20 20 69 6e 74 20 69 73 57 61 6c  ){.    int isWal
183c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
183d0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
183e0 57 41 4c 20 66 69 6c 65 20 65 78 69 73 74 73 20  WAL file exists 
183f0 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 50 61 67 65  */.    int nPage
18400 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18410 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
18420 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
18430 65 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  e */.    assert(
18440 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
18450 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
18460 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
18470 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
18480 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20  ager, &nPage);. 
18490 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
184a0 72 6e 20 72 63 3b 0a 20 20 20 20 69 66 28 20 6e  rn rc;.    if( n
184b0 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Page==0 ){.     
184c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44   rc = sqlite3OsD
184d0 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 70 56  elete(pPager->pV
184e0 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c  fs, pPager->zWal
184f0 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 73 57 61  , 0);.      isWa
18500 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  l = 0;.    }else
18510 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
18520 69 74 65 33 4f 73 41 63 63 65 73 73 28 0a 20 20  ite3OsAccess(.  
18530 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
18540 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 57  pVfs, pPager->zW
18550 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53  al, SQLITE_ACCES
18560 53 5f 45 58 49 53 54 53 2c 20 26 69 73 57 61 6c  S_EXISTS, &isWal
18570 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
18580 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
18590 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
185a0 66 28 20 69 73 57 61 6c 20 29 7b 0a 20 20 20 20  f( isWal ){.    
185b0 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
185c0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
185d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
185e0 65 72 4f 70 65 6e 57 61 6c 28 70 50 61 67 65 72  erOpenWal(pPager
185f0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
18600 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
18610 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
18620 3d 20 70 61 67 65 72 42 65 67 69 6e 52 65 61 64  = pagerBeginRead
18630 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  Transaction(pPag
18640 65 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  er);.        }. 
18650 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
18660 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
18670 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
18680 4c 4d 4f 44 45 5f 57 41 4c 20 29 7b 0a 20 20 20  LMODE_WAL ){.   
18690 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
186a0 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52  rnalMode = PAGER
186b0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c  _JOURNALMODE_DEL
186c0 45 54 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ETE;.      }.   
186d0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
186e0 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  rc;.}.#endif../*
186f0 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 73 61 76  .** Playback sav
18700 65 70 6f 69 6e 74 20 70 53 61 76 65 70 6f 69 6e  epoint pSavepoin
18710 74 2e 20 4f 72 2c 20 69 66 20 70 53 61 76 65 70  t. Or, if pSavep
18720 6f 69 6e 74 3d 3d 4e 55 4c 4c 2c 20 74 68 65 6e  oint==NULL, then
18730 20 70 6c 61 79 62 61 63 6b 0a 2a 2a 20 74 68 65   playback.** the
18740 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72 20 6a   entire master j
18750 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65  ournal file. The
18760 20 63 61 73 65 20 70 53 61 76 65 70 6f 69 6e 74   case pSavepoint
18770 3d 3d 4e 55 4c 4c 20 6f 63 63 75 72 73 20 77 68  ==NULL occurs wh
18780 65 6e 20 0a 2a 2a 20 61 20 52 4f 4c 4c 42 41 43  en .** a ROLLBAC
18790 4b 20 54 4f 20 63 6f 6d 6d 61 6e 64 20 69 73 20  K TO command is 
187a0 69 6e 76 6f 6b 65 64 20 6f 6e 20 61 20 53 41 56  invoked on a SAV
187b0 45 50 4f 49 4e 54 20 74 68 61 74 20 69 73 20 61  EPOINT that is a
187c0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a   transaction .**
187d0 20 73 61 76 65 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a   savepoint..**.*
187e0 2a 20 57 68 65 6e 20 70 53 61 76 65 70 6f 69 6e  * When pSavepoin
187f0 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 28 6d  t is not NULL (m
18800 65 61 6e 69 6e 67 20 61 20 6e 6f 6e 2d 74 72 61  eaning a non-tra
18810 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f 69  nsaction savepoi
18820 6e 74 20 69 73 20 0a 2a 2a 20 62 65 69 6e 67 20  nt is .** being 
18830 72 6f 6c 6c 65 64 20 62 61 63 6b 29 2c 20 74 68  rolled back), th
18840 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
18850 63 6f 6e 73 69 73 74 73 20 6f 66 20 75 70 20 74  consists of up t
18860 6f 20 74 68 72 65 65 20 73 74 61 67 65 73 2c 0a  o three stages,.
18870 2a 2a 20 70 65 72 66 6f 72 6d 65 64 20 69 6e 20  ** performed in 
18880 74 68 65 20 6f 72 64 65 72 20 73 70 65 63 69 66  the order specif
18890 69 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50  ied:.**.**   * P
188a0 61 67 65 73 20 61 72 65 20 70 6c 61 79 65 64 20  ages are played 
188b0 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61  back from the ma
188c0 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74  in journal start
188d0 69 6e 67 20 61 74 20 62 79 74 65 0a 2a 2a 20 20  ing at byte.**  
188e0 20 20 20 6f 66 66 73 65 74 20 50 61 67 65 72 53     offset PagerS
188f0 61 76 65 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74  avepoint.iOffset
18900 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20   and continuing 
18910 74 6f 20 0a 2a 2a 20 20 20 20 20 50 61 67 65 72  to .**     Pager
18920 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66  Savepoint.iHdrOf
18930 66 73 65 74 2c 20 6f 72 20 74 6f 20 74 68 65 20  fset, or to the 
18940 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  end of the main 
18950 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 66  journal.**     f
18960 69 6c 65 20 69 66 20 50 61 67 65 72 53 61 76 65  ile if PagerSave
18970 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74  point.iHdrOffset
18980 20 69 73 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20   is zero..**.** 
18990 20 20 2a 20 49 66 20 50 61 67 65 72 53 61 76 65    * If PagerSave
189a0 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74  point.iHdrOffset
189b0 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68   is not zero, th
189c0 65 6e 20 70 61 67 65 73 20 61 72 65 20 70 6c 61  en pages are pla
189d0 79 65 64 0a 2a 2a 20 20 20 20 20 62 61 63 6b 20  yed.**     back 
189e0 73 74 61 72 74 69 6e 67 20 66 72 6f 6d 20 74 68  starting from th
189f0 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
18a00 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c   immediately fol
18a10 6c 6f 77 69 6e 67 20 0a 2a 2a 20 20 20 20 20 50  lowing .**     P
18a20 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48  agerSavepoint.iH
18a30 64 72 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20  drOffset to the 
18a40 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  end of the main 
18a50 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a  journal file..**
18a60 0a 2a 2a 20 20 20 2a 20 50 61 67 65 73 20 61 72  .**   * Pages ar
18a70 65 20 74 68 65 6e 20 70 6c 61 79 65 64 20 62 61  e then played ba
18a80 63 6b 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d  ck from the sub-
18a90 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 73 74  journal file, st
18aa0 61 72 74 69 6e 67 0a 2a 2a 20 20 20 20 20 77 69  arting.**     wi
18ab0 74 68 20 74 68 65 20 50 61 67 65 72 53 61 76 65  th the PagerSave
18ac0 70 6f 69 6e 74 2e 69 53 75 62 52 65 63 20 61 6e  point.iSubRec an
18ad0 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20  d continuing to 
18ae0 74 68 65 20 65 6e 64 20 6f 66 0a 2a 2a 20 20 20  the end of.**   
18af0 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69    the journal fi
18b00 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 72 6f 75 67  le..**.** Throug
18b10 68 6f 75 74 20 74 68 65 20 72 6f 6c 6c 62 61 63  hout the rollbac
18b20 6b 20 70 72 6f 63 65 73 73 2c 20 65 61 63 68 20  k process, each 
18b30 74 69 6d 65 20 61 20 70 61 67 65 20 69 73 20 72  time a page is r
18b40 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 0a  olled back, the.
18b50 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ** corresponding
18b60 20 62 69 74 20 69 73 20 73 65 74 20 69 6e 20 61   bit is set in a
18b70 20 62 69 74 76 65 63 20 73 74 72 75 63 74 75 72   bitvec structur
18b80 65 20 28 76 61 72 69 61 62 6c 65 20 70 44 6f 6e  e (variable pDon
18b90 65 20 69 6e 20 74 68 65 0a 2a 2a 20 69 6d 70 6c  e in the.** impl
18ba0 65 6d 65 6e 74 61 74 69 6f 6e 20 62 65 6c 6f 77  ementation below
18bb0 29 2e 20 54 68 69 73 20 69 73 20 75 73 65 64 20  ). This is used 
18bc0 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 61  to ensure that a
18bd0 20 70 61 67 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a   page is only.**
18be0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 65   rolled back the
18bf0 20 66 69 72 73 74 20 74 69 6d 65 20 69 74 20 69   first time it i
18c00 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 6e  s encountered in
18c10 20 65 69 74 68 65 72 20 6a 6f 75 72 6e 61 6c 2e   either journal.
18c20 0a 2a 2a 0a 2a 2a 20 49 66 20 70 53 61 76 65 70  .**.** If pSavep
18c30 6f 69 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68  oint is NULL, th
18c40 65 6e 20 70 61 67 65 73 20 61 72 65 20 6f 6e 6c  en pages are onl
18c50 79 20 70 6c 61 79 65 64 20 62 61 63 6b 20 66 72  y played back fr
18c60 6f 6d 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a  om the main.** j
18c70 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65  ournal file. The
18c80 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f  re is no need fo
18c90 72 20 61 20 62 69 74 76 65 63 20 69 6e 20 74 68  r a bitvec in th
18ca0 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  is case..**.** I
18cb0 6e 20 65 69 74 68 65 72 20 63 61 73 65 2c 20 62  n either case, b
18cc0 65 66 6f 72 65 20 70 6c 61 79 62 61 63 6b 20 63  efore playback c
18cd0 6f 6d 6d 65 6e 63 65 73 20 74 68 65 20 50 61 67  ommences the Pag
18ce0 65 72 2e 64 62 53 69 7a 65 20 76 61 72 69 61 62  er.dbSize variab
18cf0 6c 65 0a 2a 2a 20 69 73 20 72 65 73 65 74 20 74  le.** is reset t
18d00 6f 20 74 68 65 20 76 61 6c 75 65 20 74 68 61 74  o the value that
18d10 20 69 74 20 68 65 6c 64 20 61 74 20 74 68 65 20   it held at the 
18d20 73 74 61 72 74 20 6f 66 20 74 68 65 20 73 61 76  start of the sav
18d30 65 70 6f 69 6e 74 20 0a 2a 2a 20 28 6f 72 20 74  epoint .** (or t
18d40 72 61 6e 73 61 63 74 69 6f 6e 29 2e 20 4e 6f 20  ransaction). No 
18d50 70 61 67 65 20 77 69 74 68 20 61 20 70 61 67 65  page with a page
18d60 2d 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72 20  -number greater 
18d70 74 68 61 6e 20 74 68 69 73 20 76 61 6c 75 65 0a  than this value.
18d80 2a 2a 20 69 73 20 70 6c 61 79 65 64 20 62 61 63  ** is played bac
18d90 6b 2e 20 49 66 20 6f 6e 65 20 69 73 20 65 6e 63  k. If one is enc
18da0 6f 75 6e 74 65 72 65 64 20 69 74 20 69 73 20 73  ountered it is s
18db0 69 6d 70 6c 79 20 73 6b 69 70 70 65 64 2e 0a 2a  imply skipped..*
18dc0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
18dd0 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65 70 6f  erPlaybackSavepo
18de0 69 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  int(Pager *pPage
18df0 72 2c 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  r, PagerSavepoin
18e00 74 20 2a 70 53 61 76 65 70 6f 69 6e 74 29 7b 0a  t *pSavepoint){.
18e10 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20    i64 szJ;      
18e20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 66             /* Ef
18e30 66 65 63 74 69 76 65 20 73 69 7a 65 20 6f 66 20  fective size of 
18e40 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
18e50 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66   */.  i64 iHdrOf
18e60 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  f;             /
18e70 2a 20 45 6e 64 20 6f 66 20 66 69 72 73 74 20 73  * End of first s
18e80 65 67 6d 65 6e 74 20 6f 66 20 6d 61 69 6e 2d 6a  egment of main-j
18e90 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 73 20 2a  ournal records *
18ea0 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
18eb0 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20  ITE_OK;      /* 
18ec0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
18ed0 20 42 69 74 76 65 63 20 2a 70 44 6f 6e 65 20 3d   Bitvec *pDone =
18ee0 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 42 69 74   0;       /* Bit
18ef0 76 65 63 20 74 6f 20 65 6e 73 75 72 65 20 70 61  vec to ensure pa
18f00 67 65 73 20 70 6c 61 79 65 64 20 62 61 63 6b 20  ges played back 
18f10 6f 6e 6c 79 20 6f 6e 63 65 20 2a 2f 0a 0a 20 20  only once */..  
18f20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
18f30 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41  state>=PAGER_SHA
18f40 52 45 44 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  RED );..  /* All
18f50 6f 63 61 74 65 20 61 20 62 69 74 76 65 63 20 74  ocate a bitvec t
18f60 6f 20 75 73 65 20 74 6f 20 73 74 6f 72 65 20 74  o use to store t
18f70 68 65 20 73 65 74 20 6f 66 20 70 61 67 65 73 20  he set of pages 
18f80 72 6f 6c 6c 65 64 20 62 61 63 6b 20 2a 2f 0a 20  rolled back */. 
18f90 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e 74 20   if( pSavepoint 
18fa0 29 7b 0a 20 20 20 20 70 44 6f 6e 65 20 3d 20 73  ){.    pDone = s
18fb0 71 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61  qlite3BitvecCrea
18fc0 74 65 28 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e  te(pSavepoint->n
18fd0 4f 72 69 67 29 3b 0a 20 20 20 20 69 66 28 20 21  Orig);.    if( !
18fe0 70 44 6f 6e 65 20 29 7b 0a 20 20 20 20 20 20 72  pDone ){.      r
18ff0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
19000 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  EM;.    }.  }.. 
19010 20 2f 2a 20 53 65 74 20 74 68 65 20 64 61 74 61   /* Set the data
19020 62 61 73 65 20 73 69 7a 65 20 62 61 63 6b 20 74  base size back t
19030 6f 20 74 68 65 20 76 61 6c 75 65 20 69 74 20 77  o the value it w
19040 61 73 20 62 65 66 6f 72 65 20 74 68 65 20 73 61  as before the sa
19050 76 65 70 6f 69 6e 74 20 0a 20 20 2a 2a 20 62 65  vepoint .  ** be
19060 69 6e 67 20 72 65 76 65 72 74 65 64 20 77 61 73  ing reverted was
19070 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20   opened..  */.  
19080 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
19090 20 70 53 61 76 65 70 6f 69 6e 74 20 3f 20 70 53   pSavepoint ? pS
190a0 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67 20  avepoint->nOrig 
190b0 3a 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  : pPager->dbOrig
190c0 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e  Size;.  pPager->
190d0 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
190e0 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  = pPager->tempFi
190f0 6c 65 3b 0a 0a 20 20 69 66 28 20 21 70 53 61 76  le;..  if( !pSav
19100 65 70 6f 69 6e 74 20 26 26 20 70 61 67 65 72 55  epoint && pagerU
19110 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
19120 0a 20 20 20 20 72 65 74 75 72 6e 20 70 61 67 65  .    return page
19130 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 70 50 61  rRollbackWal(pPa
19140 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ger);.  }..  /* 
19150 55 73 65 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  Use pPager->jour
19160 6e 61 6c 4f 66 66 20 61 73 20 74 68 65 20 65 66  nalOff as the ef
19170 66 65 63 74 69 76 65 20 73 69 7a 65 20 6f 66 20  fective size of 
19180 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63  the main rollbac
19190 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20  k.  ** journal. 
191a0 20 54 68 65 20 61 63 74 75 61 6c 20 66 69 6c 65   The actual file
191b0 20 6d 69 67 68 74 20 62 65 20 6c 61 72 67 65 72   might be larger
191c0 20 74 68 61 6e 20 74 68 69 73 20 69 6e 0a 20 20   than this in.  
191d0 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  ** PAGER_JOURNAL
191e0 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 6f 72  MODE_TRUNCATE or
191f0 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
19200 44 45 5f 50 45 52 53 49 53 54 2e 20 20 42 75 74  DE_PERSIST.  But
19210 20 61 6e 79 74 68 69 6e 67 0a 20 20 2a 2a 20 70   anything.  ** p
19220 61 73 74 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ast pPager->jour
19230 6e 61 6c 4f 66 66 20 69 73 20 6f 66 66 2d 6c 69  nalOff is off-li
19240 6d 69 74 73 20 74 6f 20 75 73 2e 0a 20 20 2a 2f  mits to us..  */
19250 0a 20 20 73 7a 4a 20 3d 20 70 50 61 67 65 72 2d  .  szJ = pPager-
19260 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 61  >journalOff;.  a
19270 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57  ssert( pagerUseW
19280 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 7c 7c  al(pPager)==0 ||
19290 20 73 7a 4a 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a   szJ==0 );..  /*
192a0 20 42 65 67 69 6e 20 62 79 20 72 6f 6c 6c 69 6e   Begin by rollin
192b0 67 20 62 61 63 6b 20 72 65 63 6f 72 64 73 20 66  g back records f
192c0 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75  rom the main jou
192d0 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74  rnal starting at
192e0 0a 20 20 2a 2a 20 50 61 67 65 72 53 61 76 65 70  .  ** PagerSavep
192f0 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e 64  oint.iOffset and
19300 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74   continuing to t
19310 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20  he next journal 
19320 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20 54 68 65  header..  ** The
19330 72 65 20 6d 69 67 68 74 20 62 65 20 72 65 63 6f  re might be reco
19340 72 64 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20  rds in the main 
19350 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20 68 61 76  journal that hav
19360 65 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72 0a  e a page number.
19370 20 20 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61    ** greater tha
19380 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 64 61  n the current da
19390 74 61 62 61 73 65 20 73 69 7a 65 20 28 70 50 61  tabase size (pPa
193a0 67 65 72 2d 3e 64 62 53 69 7a 65 29 20 62 75 74  ger->dbSize) but
193b0 20 74 68 6f 73 65 0a 20 20 2a 2a 20 77 69 6c 6c   those.  ** will
193c0 20 62 65 20 73 6b 69 70 70 65 64 20 61 75 74 6f   be skipped auto
193d0 6d 61 74 69 63 61 6c 6c 79 2e 20 20 50 61 67 65  matically.  Page
193e0 73 20 61 72 65 20 61 64 64 65 64 20 74 6f 20 70  s are added to p
193f0 44 6f 6e 65 20 61 73 20 74 68 65 79 0a 20 20 2a  Done as they.  *
19400 2a 20 61 72 65 20 70 6c 61 79 65 64 20 62 61 63  * are played bac
19410 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53  k..  */.  if( pS
19420 61 76 65 70 6f 69 6e 74 20 26 26 20 21 70 61 67  avepoint && !pag
19430 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
19440 20 29 7b 0a 20 20 20 20 69 48 64 72 4f 66 66 20   ){.    iHdrOff 
19450 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 48  = pSavepoint->iH
19460 64 72 4f 66 66 73 65 74 20 3f 20 70 53 61 76 65  drOffset ? pSave
19470 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65  point->iHdrOffse
19480 74 20 3a 20 73 7a 4a 3b 0a 20 20 20 20 70 50 61  t : szJ;.    pPa
19490 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
194a0 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 4f  = pSavepoint->iO
194b0 66 66 73 65 74 3b 0a 20 20 20 20 77 68 69 6c 65  ffset;.    while
194c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
194d0 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
194e0 61 6c 4f 66 66 3c 69 48 64 72 4f 66 66 20 29 7b  alOff<iHdrOff ){
194f0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
19500 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
19510 61 67 65 28 70 50 61 67 65 72 2c 20 26 70 50 61  age(pPager, &pPa
19520 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ger->journalOff,
19530 20 70 44 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a 20   pDone, 1, 1);. 
19540 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
19550 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc!=SQLITE_DONE
19560 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
19570 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
19580 4f 66 66 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  Off = 0;.  }..  
19590 2f 2a 20 43 6f 6e 74 69 6e 75 65 20 72 6f 6c 6c  /* Continue roll
195a0 69 6e 67 20 62 61 63 6b 20 72 65 63 6f 72 64 73  ing back records
195b0 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 69 6e   out of the main
195c0 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e   journal startin
195d0 67 20 61 74 0a 20 20 2a 2a 20 74 68 65 20 66 69  g at.  ** the fi
195e0 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  rst journal head
195f0 65 72 20 73 65 65 6e 20 61 6e 64 20 63 6f 6e 74  er seen and cont
19600 69 6e 75 69 6e 67 20 75 6e 74 69 6c 20 74 68 65  inuing until the
19610 20 65 66 66 65 63 74 69 76 65 20 65 6e 64 0a 20   effective end. 
19620 20 2a 2a 20 6f 66 20 74 68 65 20 6d 61 69 6e 20   ** of the main 
19630 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 43  journal file.  C
19640 6f 6e 74 69 6e 75 65 20 74 6f 20 73 6b 69 70 20  ontinue to skip 
19650 6f 75 74 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67  out-of-range pag
19660 65 73 20 61 6e 64 0a 20 20 2a 2a 20 63 6f 6e 74  es and.  ** cont
19670 69 6e 75 65 20 61 64 64 69 6e 67 20 70 61 67 65  inue adding page
19680 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 6f  s rolled back to
19690 20 70 44 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 77   pDone..  */.  w
196a0 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
196b0 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  _OK && pPager->j
196c0 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 20 29 7b  ournalOff<szJ ){
196d0 0a 20 20 20 20 75 33 32 20 69 69 3b 20 20 20 20  .    u32 ii;    
196e0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
196f0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 75  counter */.    u
19700 33 32 20 6e 4a 52 65 63 20 3d 20 30 3b 20 20 20  32 nJRec = 0;   
19710 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4a    /* Number of J
19720 6f 75 72 6e 61 6c 20 52 65 63 6f 72 64 73 20 2a  ournal Records *
19730 2f 0a 20 20 20 20 75 33 32 20 64 75 6d 6d 79 3b  /.    u32 dummy;
19740 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f  .    rc = readJo
19750 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c  urnalHdr(pPager,
19760 20 30 2c 20 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c   0, szJ, &nJRec,
19770 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 61 73   &dummy);.    as
19780 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
19790 5f 44 4f 4e 45 20 29 3b 0a 0a 20 20 20 20 2f 2a  _DONE );..    /*
197a0 0a 20 20 20 20 2a 2a 20 54 68 65 20 22 70 50 61  .    ** The "pPa
197b0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b  ger->journalHdr+
197c0 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
197d0 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e  Pager)==pPager->
197e0 6a 6f 75 72 6e 61 6c 4f 66 66 22 0a 20 20 20 20  journalOff".    
197f0 2a 2a 20 74 65 73 74 20 69 73 20 72 65 6c 61 74  ** test is relat
19800 65 64 20 74 6f 20 74 69 63 6b 65 74 20 23 32 35  ed to ticket #25
19810 36 35 2e 20 20 53 65 65 20 74 68 65 20 64 69 73  65.  See the dis
19820 63 75 73 73 69 6f 6e 20 69 6e 20 74 68 65 0a 20  cussion in the. 
19830 20 20 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79     ** pager_play
19840 62 61 63 6b 28 29 20 66 75 6e 63 74 69 6f 6e 20  back() function 
19850 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
19860 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 20 20  nformation..    
19870 2a 2f 0a 20 20 20 20 69 66 28 20 6e 4a 52 65 63  */.    if( nJRec
19880 3d 3d 30 20 0a 20 20 20 20 20 26 26 20 70 50 61  ==0 .     && pPa
19890 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b  ger->journalHdr+
198a0 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
198b0 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e  Pager)==pPager->
198c0 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20 20 20 29  journalOff.    )
198d0 7b 0a 20 20 20 20 20 20 6e 4a 52 65 63 20 3d 20  {.      nJRec = 
198e0 28 75 33 32 29 28 28 73 7a 4a 20 2d 20 70 50 61  (u32)((szJ - pPa
198f0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  ger->journalOff)
19900 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70  /JOURNAL_PG_SZ(p
19910 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 20  Pager));.    }. 
19920 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 72 63 3d     for(ii=0; rc=
19930 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69  =SQLITE_OK && ii
19940 3c 6e 4a 52 65 63 20 26 26 20 70 50 61 67 65 72  <nJRec && pPager
19950 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a  ->journalOff<szJ
19960 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72  ; ii++){.      r
19970 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
19980 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67  ck_one_page(pPag
19990 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75  er, &pPager->jou
199a0 72 6e 61 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c 20  rnalOff, pDone, 
199b0 31 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  1, 1);.    }.   
199c0 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
199d0 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a  ITE_DONE );.  }.
199e0 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
199f0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65  LITE_OK || pPage
19a00 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 3d 73  r->journalOff>=s
19a10 7a 4a 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e 61  zJ );..  /* Fina
19a20 6c 6c 79 2c 20 20 72 6f 6c 6c 62 61 63 6b 20 70  lly,  rollback p
19a30 61 67 65 73 20 66 72 6f 6d 20 74 68 65 20 73 75  ages from the su
19a40 62 2d 6a 6f 75 72 6e 61 6c 2e 20 20 50 61 67 65  b-journal.  Page
19a50 20 74 68 61 74 20 77 65 72 65 0a 20 20 2a 2a 20   that were.  ** 
19a60 70 72 65 76 69 6f 75 73 6c 79 20 72 6f 6c 6c 65  previously rolle
19a70 64 20 62 61 63 6b 20 6f 75 74 20 6f 66 20 74 68  d back out of th
19a80 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 28  e main journal (
19a90 61 6e 64 20 61 72 65 20 68 65 6e 63 65 20 69 6e  and are hence in
19aa0 20 70 44 6f 6e 65 29 0a 20 20 2a 2a 20 77 69 6c   pDone).  ** wil
19ab0 6c 20 62 65 20 73 6b 69 70 70 65 64 2e 20 20 4f  l be skipped.  O
19ac0 75 74 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67 65  ut-of-range page
19ad0 73 20 61 72 65 20 61 6c 73 6f 20 73 6b 69 70 70  s are also skipp
19ae0 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
19af0 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20  Savepoint ){.   
19b00 20 75 33 32 20 69 69 3b 20 20 20 20 20 20 20 20   u32 ii;        
19b10 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
19b20 74 65 72 20 2a 2f 0a 20 20 20 20 69 36 34 20 6f  ter */.    i64 o
19b30 66 66 73 65 74 20 3d 20 70 53 61 76 65 70 6f 69  ffset = pSavepoi
19b40 6e 74 2d 3e 69 53 75 62 52 65 63 2a 28 34 2b 70  nt->iSubRec*(4+p
19b50 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
19b60 3b 0a 0a 20 20 20 20 69 66 28 20 70 61 67 65 72  ;..    if( pager
19b70 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
19b80 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
19b90 69 74 65 33 57 61 6c 53 61 76 65 70 6f 69 6e 74  ite3WalSavepoint
19ba0 55 6e 64 6f 28 70 50 61 67 65 72 2d 3e 70 57 61  Undo(pPager->pWa
19bb0 6c 2c 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 61  l, pSavepoint->a
19bc0 57 61 6c 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a  WalData);.    }.
19bd0 20 20 20 20 66 6f 72 28 69 69 3d 70 53 61 76 65      for(ii=pSave
19be0 70 6f 69 6e 74 2d 3e 69 53 75 62 52 65 63 3b 20  point->iSubRec; 
19bf0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
19c00 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 75 62   ii<pPager->nSub
19c10 52 65 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  Rec; ii++){.    
19c20 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74    assert( offset
19c30 3d 3d 69 69 2a 28 34 2b 70 50 61 67 65 72 2d 3e  ==ii*(4+pPager->
19c40 70 61 67 65 53 69 7a 65 29 20 29 3b 0a 20 20 20  pageSize) );.   
19c50 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
19c60 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
19c70 70 50 61 67 65 72 2c 20 26 6f 66 66 73 65 74 2c  pPager, &offset,
19c80 20 70 44 6f 6e 65 2c 20 30 2c 20 31 29 3b 0a 20   pDone, 0, 1);. 
19c90 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
19ca0 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc!=SQLITE_DONE
19cb0 20 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74   );.  }..  sqlit
19cc0 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28  e3BitvecDestroy(
19cd0 70 44 6f 6e 65 29 3b 0a 20 20 69 66 28 20 72 63  pDone);.  if( rc
19ce0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
19cf0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
19d00 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d  alOff = szJ;.  }
19d10 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
19d20 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
19d30 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  he maximum numbe
19d40 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  r of in-memory p
19d50 61 67 65 73 20 74 68 61 74 20 61 72 65 20 61 6c  ages that are al
19d60 6c 6f 77 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  lowed..*/.void s
19d70 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 61  qlite3PagerSetCa
19d80 63 68 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70  chesize(Pager *p
19d90 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67  Pager, int mxPag
19da0 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61  e){.  sqlite3Pca
19db0 63 68 65 53 65 74 43 61 63 68 65 73 69 7a 65 28  cheSetCachesize(
19dc0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
19dd0 20 6d 78 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a   mxPage);.}../*.
19de0 2a 2a 20 41 64 6a 75 73 74 20 74 68 65 20 72 6f  ** Adjust the ro
19df0 62 75 73 74 6e 65 73 73 20 6f 66 20 74 68 65 20  bustness of the 
19e00 64 61 74 61 62 61 73 65 20 74 6f 20 64 61 6d 61  database to dama
19e10 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61  ge due to OS cra
19e20 73 68 65 73 0a 2a 2a 20 6f 72 20 70 6f 77 65 72  shes.** or power
19e30 20 66 61 69 6c 75 72 65 73 20 62 79 20 63 68 61   failures by cha
19e40 6e 67 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72  nging the number
19e50 20 6f 66 20 73 79 6e 63 73 28 29 73 20 77 68 65   of syncs()s whe
19e60 6e 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65  n writing.** the
19e70 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
19e80 6c 2e 20 20 54 68 65 72 65 20 61 72 65 20 74 68  l.  There are th
19e90 72 65 65 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a  ree levels:.**.*
19ea0 2a 20 20 20 20 4f 46 46 20 20 20 20 20 20 20 73  *    OFF       s
19eb0 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 29 20 69  qlite3OsSync() i
19ec0 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20  s never called. 
19ed0 20 54 68 69 73 20 69 73 20 74 68 65 20 64 65 66   This is the def
19ee0 61 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  ault.**         
19ef0 20 20 20 20 20 66 6f 72 20 74 65 6d 70 6f 72 61       for tempora
19f00 72 79 20 61 6e 64 20 74 72 61 6e 73 69 65 6e 74  ry and transient
19f10 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20   files..**.**   
19f20 20 4e 4f 52 4d 41 4c 20 20 20 20 54 68 65 20 6a   NORMAL    The j
19f30 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
19f40 20 6f 6e 63 65 20 62 65 66 6f 72 65 20 77 72 69   once before wri
19f50 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65  tes begin on the
19f60 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
19f70 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73   database.  This
19f80 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 61 64 65   is normally ade
19f90 71 75 61 74 65 20 70 72 6f 74 65 63 74 69 6f 6e  quate protection
19fa0 2c 20 62 75 74 0a 2a 2a 20 20 20 20 20 20 20 20  , but.**        
19fb0 20 20 20 20 20 20 69 74 20 69 73 20 74 68 65 6f        it is theo
19fc0 72 65 74 69 63 61 6c 6c 79 20 70 6f 73 73 69 62  retically possib
19fd0 6c 65 2c 20 74 68 6f 75 67 68 20 76 65 72 79 20  le, though very 
19fe0 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20  unlikely,.**    
19ff0 20 20 20 20 20 20 20 20 20 20 74 68 61 74 20 61            that a
1a000 6e 20 69 6e 6f 70 65 72 74 75 6e 65 20 70 6f 77  n inopertune pow
1a010 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64  er failure could
1a020 20 6c 65 61 76 65 20 74 68 65 20 6a 6f 75 72 6e   leave the journ
1a030 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  al.**           
1a040 20 20 20 69 6e 20 61 20 73 74 61 74 65 20 77 68     in a state wh
1a050 69 63 68 20 77 6f 75 6c 64 20 63 61 75 73 65 20  ich would cause 
1a060 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61  damage to the da
1a070 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20  tabase.**       
1a080 20 20 20 20 20 20 20 77 68 65 6e 20 69 74 20 69         when it i
1a090 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  s rolled back..*
1a0a0 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c 20 20 20 20  *.**    FULL    
1a0b0 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73    The journal is
1a0c0 20 73 79 6e 63 65 64 20 74 77 69 63 65 20 62 65   synced twice be
1a0d0 66 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69  fore writes begi
1a0e0 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20  n on the.**     
1a0f0 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
1a100 65 20 28 77 69 74 68 20 73 6f 6d 65 20 61 64 64  e (with some add
1a110 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
1a120 69 6f 6e 20 2d 20 74 68 65 20 6e 52 65 63 20 66  ion - the nRec f
1a130 69 65 6c 64 0a 2a 2a 20 20 20 20 20 20 20 20 20  ield.**         
1a140 20 20 20 20 20 6f 66 20 74 68 65 20 6a 6f 75 72       of the jour
1a150 6e 61 6c 20 68 65 61 64 65 72 20 2d 20 62 65 69  nal header - bei
1a160 6e 67 20 77 72 69 74 74 65 6e 20 69 6e 20 62 65  ng written in be
1a170 74 77 65 65 6e 20 74 68 65 20 74 77 6f 0a 2a 2a  tween the two.**
1a180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 79                sy
1a190 6e 63 73 29 2e 20 20 49 66 20 77 65 20 61 73 73  ncs).  If we ass
1a1a0 75 6d 65 20 74 68 61 74 20 77 72 69 74 69 6e 67  ume that writing
1a1b0 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   a.**           
1a1c0 20 20 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73     single disk s
1a1d0 65 63 74 6f 72 20 69 73 20 61 74 6f 6d 69 63 2c  ector is atomic,
1a1e0 20 74 68 65 6e 20 74 68 69 73 20 6d 6f 64 65 20   then this mode 
1a1f0 70 72 6f 76 69 64 65 73 0a 2a 2a 20 20 20 20 20  provides.**     
1a200 20 20 20 20 20 20 20 20 20 61 73 73 75 72 61 6e           assuran
1a210 63 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72  ce that the jour
1a220 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  nal will not be 
1a230 63 6f 72 72 75 70 74 65 64 20 74 6f 20 74 68 65  corrupted to the
1a240 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1a250 20 70 6f 69 6e 74 20 6f 66 20 63 61 75 73 69 6e   point of causin
1a260 67 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20  g damage to the 
1a270 64 61 74 61 62 61 73 65 20 64 75 72 69 6e 67 20  database during 
1a280 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  rollback..**.** 
1a290 4e 75 6d 65 72 69 63 20 76 61 6c 75 65 73 20 61  Numeric values a
1a2a0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
1a2b0 68 65 73 65 20 73 74 61 74 65 73 20 61 72 65 20  hese states are 
1a2c0 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32  OFF==1, NORMAL=2
1a2d0 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d 33 2e  ,.** and FULL=3.
1a2e0 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
1a2f0 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
1a300 41 47 4d 41 53 0a 76 6f 69 64 20 73 71 6c 69 74  AGMAS.void sqlit
1a310 65 33 50 61 67 65 72 53 65 74 53 61 66 65 74 79  e3PagerSetSafety
1a320 4c 65 76 65 6c 28 50 61 67 65 72 20 2a 70 50 61  Level(Pager *pPa
1a330 67 65 72 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20  ger, int level, 
1a340 69 6e 74 20 62 46 75 6c 6c 46 73 79 6e 63 29 7b  int bFullFsync){
1a350 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  .  pPager->noSyn
1a360 63 20 3d 20 20 28 6c 65 76 65 6c 3d 3d 31 20 7c  c =  (level==1 |
1a370 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  | pPager->tempFi
1a380 6c 65 29 20 3f 31 3a 30 3b 0a 20 20 70 50 61 67  le) ?1:0;.  pPag
1a390 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 28  er->fullSync = (
1a3a0 6c 65 76 65 6c 3d 3d 33 20 26 26 20 21 70 50 61  level==3 && !pPa
1a3b0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 20 3f  ger->tempFile) ?
1a3c0 31 3a 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  1:0;.  pPager->s
1a3d0 79 6e 63 5f 66 6c 61 67 73 20 3d 20 28 62 46 75  ync_flags = (bFu
1a3e0 6c 6c 46 73 79 6e 63 3f 53 51 4c 49 54 45 5f 53  llFsync?SQLITE_S
1a3f0 59 4e 43 5f 46 55 4c 4c 3a 53 51 4c 49 54 45 5f  YNC_FULL:SQLITE_
1a400 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20  SYNC_NORMAL);.  
1a410 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  if( pPager->noSy
1a420 6e 63 20 29 20 70 50 61 67 65 72 2d 3e 6e 65 65  nc ) pPager->nee
1a430 64 53 79 6e 63 20 3d 20 30 3b 0a 7d 0a 23 65 6e  dSync = 0;.}.#en
1a440 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  dif../*.** The f
1a450 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20  ollowing global 
1a460 76 61 72 69 61 62 6c 65 20 69 73 20 69 6e 63 72  variable is incr
1a470 65 6d 65 6e 74 65 64 20 77 68 65 6e 65 76 65 72  emented whenever
1a480 20 74 68 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20   the library.** 
1a490 61 74 74 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e  attempts to open
1a4a0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
1a4b0 65 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61  e.  This informa
1a4c0 74 69 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72  tion is used for
1a4d0 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20  .** testing and 
1a4e0 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 20 20  analysis only.  
1a4f0 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
1a500 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74  E_TEST.int sqlit
1a510 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e  e3_opentemp_coun
1a520 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f  t = 0;.#endif../
1a530 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70  *.** Open a temp
1a540 6f 72 61 72 79 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  orary file..**.*
1a550 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 6c 65  * Write the file
1a560 20 64 65 73 63 72 69 70 74 6f 72 20 69 6e 74 6f   descriptor into
1a570 20 2a 70 46 69 6c 65 2e 20 52 65 74 75 72 6e 20   *pFile. Return 
1a580 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
1a590 63 65 73 73 20 0a 2a 2a 20 6f 72 20 73 6f 6d 65  cess .** or some
1a5a0 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64   other error cod
1a5b0 65 20 69 66 20 77 65 20 66 61 69 6c 2e 20 54 68  e if we fail. Th
1a5c0 65 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61  e OS will automa
1a5d0 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 64 65 6c 65  tically .** dele
1a5e0 74 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  te the temporary
1a5f0 20 66 69 6c 65 20 77 68 65 6e 20 69 74 20 69 73   file when it is
1a600 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54   closed..**.** T
1a610 68 65 20 66 6c 61 67 73 20 70 61 73 73 65 64 20  he flags passed 
1a620 74 6f 20 74 68 65 20 56 46 53 20 6c 61 79 65 72  to the VFS layer
1a630 20 78 4f 70 65 6e 28 29 20 63 61 6c 6c 20 61 72   xOpen() call ar
1a640 65 20 74 68 6f 73 65 20 73 70 65 63 69 66 69 65  e those specifie
1a650 64 0a 2a 2a 20 62 79 20 70 61 72 61 6d 65 74 65  d.** by paramete
1a660 72 20 76 66 73 46 6c 61 67 73 20 4f 52 65 64 20  r vfsFlags ORed 
1a670 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69  with the followi
1a680 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51  ng:.**.**     SQ
1a690 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
1a6a0 49 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54  ITE.**     SQLIT
1a6b0 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 0a 2a 2a  E_OPEN_CREATE.**
1a6c0 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
1a6d0 5f 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20  _EXCLUSIVE.**   
1a6e0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45    SQLITE_OPEN_DE
1a6f0 4c 45 54 45 4f 4e 43 4c 4f 53 45 0a 2a 2f 0a 73  LETEONCLOSE.*/.s
1a700 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 4f  tatic int pagerO
1a710 70 65 6e 74 65 6d 70 28 0a 20 20 50 61 67 65 72  pentemp(.  Pager
1a720 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20   *pPager,       
1a730 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f 62   /* The pager ob
1a740 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ject */.  sqlite
1a750 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20  3_file *pFile,  
1a760 2f 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 6c  /* Write the fil
1a770 65 20 64 65 73 63 72 69 70 74 6f 72 20 68 65 72  e descriptor her
1a780 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c  e */.  int vfsFl
1a790 61 67 73 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ags          /* 
1a7a0 46 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72  Flags passed thr
1a7b0 6f 75 67 68 20 74 6f 20 74 68 65 20 56 46 53 20  ough to the VFS 
1a7c0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  */.){.  int rc; 
1a7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a7e0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
1a7f0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
1a800 45 53 54 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70  EST.  sqlite3_op
1a810 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20  entemp_count++; 
1a820 20 2f 2a 20 55 73 65 64 20 66 6f 72 20 74 65 73   /* Used for tes
1a830 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69  ting and analysi
1a840 73 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69 66  s only */.#endif
1a850 0a 0a 20 20 76 66 73 46 6c 61 67 73 20 7c 3d 20  ..  vfsFlags |= 
1a860 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
1a870 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f  DWRITE | SQLITE_
1a880 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20  OPEN_CREATE |.  
1a890 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
1a8a0 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20  _OPEN_EXCLUSIVE 
1a8b0 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45  | SQLITE_OPEN_DE
1a8c0 4c 45 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20 72  LETEONCLOSE;.  r
1a8d0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
1a8e0 6e 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20  n(pPager->pVfs, 
1a8f0 30 2c 20 70 46 69 6c 65 2c 20 76 66 73 46 6c 61  0, pFile, vfsFla
1a900 67 73 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74  gs, 0);.  assert
1a910 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1a920 7c 7c 20 69 73 4f 70 65 6e 28 70 46 69 6c 65 29  || isOpen(pFile)
1a930 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
1a940 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
1a950 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66  e busy handler f
1a960 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  unction..**.** T
1a970 68 65 20 70 61 67 65 72 20 69 6e 76 6f 6b 65 73  he pager invokes
1a980 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65   the busy-handle
1a990 72 20 69 66 20 73 71 6c 69 74 65 33 4f 73 4c 6f  r if sqlite3OsLo
1a9a0 63 6b 28 29 20 72 65 74 75 72 6e 73 20 0a 2a 2a  ck() returns .**
1a9b0 20 53 51 4c 49 54 45 5f 42 55 53 59 20 77 68 65   SQLITE_BUSY whe
1a9c0 6e 20 74 72 79 69 6e 67 20 74 6f 20 75 70 67 72  n trying to upgr
1a9d0 61 64 65 20 66 72 6f 6d 20 6e 6f 2d 6c 6f 63 6b  ade from no-lock
1a9e0 20 74 6f 20 61 20 53 48 41 52 45 44 20 6c 6f 63   to a SHARED loc
1a9f0 6b 2c 0a 2a 2a 20 6f 72 20 77 68 65 6e 20 74 72  k,.** or when tr
1aa00 79 69 6e 67 20 74 6f 20 75 70 67 72 61 64 65 20  ying to upgrade 
1aa10 66 72 6f 6d 20 61 20 52 45 53 45 52 56 45 44 20  from a RESERVED 
1aa20 6c 6f 63 6b 20 74 6f 20 61 6e 20 45 58 43 4c 55  lock to an EXCLU
1aa30 53 49 56 45 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49  SIVE .** lock. I
1aa40 74 20 64 6f 65 73 20 2a 6e 6f 74 2a 20 69 6e 76  t does *not* inv
1aa50 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e  oke the busy han
1aa60 64 6c 65 72 20 77 68 65 6e 20 75 70 67 72 61 64  dler when upgrad
1aa70 69 6e 67 20 66 72 6f 6d 0a 2a 2a 20 53 48 41 52  ing from.** SHAR
1aa80 45 44 20 74 6f 20 52 45 53 45 52 56 45 44 2c 20  ED to RESERVED, 
1aa90 6f 72 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e  or when upgradin
1aaa0 67 20 66 72 6f 6d 20 53 48 41 52 45 44 20 74 6f  g from SHARED to
1aab0 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 28 77   EXCLUSIVE.** (w
1aac0 68 69 63 68 20 6f 63 63 75 72 73 20 64 75 72 69  hich occurs duri
1aad0 6e 67 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72  ng hot-journal r
1aae0 6f 6c 6c 62 61 63 6b 29 2e 20 53 75 6d 6d 61 72  ollback). Summar
1aaf0 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 54 72 61 6e 73  y:.**.**   Trans
1ab00 69 74 69 6f 6e 20 20 20 20 20 20 20 20 20 20 20  ition           
1ab10 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 49               | I
1ab20 6e 76 6f 6b 65 73 20 78 42 75 73 79 48 61 6e 64  nvokes xBusyHand
1ab30 6c 65 72 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d  ler.**   -------
1ab40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ab50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ab60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ab70 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b 20 20  -.**   NO_LOCK  
1ab80 20 20 20 20 20 2d 3e 20 53 48 41 52 45 44 5f 4c       -> SHARED_L
1ab90 4f 43 4b 20 20 20 20 20 20 7c 20 59 65 73 0a 2a  OCK      | Yes.*
1aba0 2a 20 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20  *   SHARED_LOCK 
1abb0 20 20 2d 3e 20 52 45 53 45 52 56 45 44 5f 4c 4f    -> RESERVED_LO
1abc0 43 4b 20 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20  CK    | No.**   
1abd0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e  SHARED_LOCK   ->
1abe0 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20   EXCLUSIVE_LOCK 
1abf0 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 52 45 53 45    | No.**   RESE
1ac00 52 56 45 44 5f 4c 4f 43 4b 20 2d 3e 20 45 58 43  RVED_LOCK -> EXC
1ac10 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20  LUSIVE_LOCK   | 
1ac20 59 65 73 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  Yes.**.** If the
1ac30 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61   busy-handler ca
1ac40 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20 6e  llback returns n
1ac50 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63  on-zero, the loc
1ac60 6b 20 69 73 20 0a 2a 2a 20 72 65 74 72 69 65 64  k is .** retried
1ac70 2e 20 49 66 20 69 74 20 72 65 74 75 72 6e 73 20  . If it returns 
1ac80 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 53  zero, then the S
1ac90 51 4c 49 54 45 5f 42 55 53 59 20 65 72 72 6f 72  QLITE_BUSY error
1aca0 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20   is.** returned 
1acb0 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 6f 66  to the caller of
1acc0 20 74 68 65 20 70 61 67 65 72 20 41 50 49 20 66   the pager API f
1acd0 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  unction..*/.void
1ace0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
1acf0 42 75 73 79 68 61 6e 64 6c 65 72 28 0a 20 20 50  Busyhandler(.  P
1ad00 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20  ager *pPager,   
1ad10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a      /* Pager obj
1ad30 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78  ect */.  int (*x
1ad40 42 75 73 79 48 61 6e 64 6c 65 72 29 28 76 6f 69  BusyHandler)(voi
1ad50 64 20 2a 29 2c 20 20 20 20 20 20 20 20 20 2f 2a  d *),         /*
1ad60 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 73 79   Pointer to busy
1ad70 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f  -handler functio
1ad80 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75  n */.  void *pBu
1ad90 73 79 48 61 6e 64 6c 65 72 41 72 67 20 20 20 20  syHandlerArg    
1ada0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
1adb0 72 67 75 6d 65 6e 74 20 74 6f 20 70 61 73 73 20  rgument to pass 
1adc0 74 6f 20 78 42 75 73 79 48 61 6e 64 6c 65 72 20  to xBusyHandler 
1add0 2a 2f 0a 29 7b 20 20 0a 20 20 70 50 61 67 65 72  */.){  .  pPager
1ade0 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 20 3d  ->xBusyHandler =
1adf0 20 78 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20   xBusyHandler;. 
1ae00 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61   pPager->pBusyHa
1ae10 6e 64 6c 65 72 41 72 67 20 3d 20 70 42 75 73 79  ndlerArg = pBusy
1ae20 48 61 6e 64 6c 65 72 41 72 67 3b 0a 7d 0a 0a 2f  HandlerArg;.}../
1ae30 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
1ae40 70 61 67 65 20 73 69 7a 65 20 75 73 65 64 20 62  page size used b
1ae50 79 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65  y the Pager obje
1ae60 63 74 2e 20 54 68 65 20 6e 65 77 20 70 61 67 65  ct. The new page
1ae70 20 73 69 7a 65 20 0a 2a 2a 20 69 73 20 70 61 73   size .** is pas
1ae80 73 65 64 20 69 6e 20 2a 70 50 61 67 65 53 69 7a  sed in *pPageSiz
1ae90 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
1aea0 70 61 67 65 72 20 69 73 20 69 6e 20 74 68 65 20  pager is in the 
1aeb0 65 72 72 6f 72 20 73 74 61 74 65 20 77 68 65 6e  error state when
1aec0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
1aed0 73 20 63 61 6c 6c 65 64 2c 20 69 74 0a 2a 2a 20  s called, it.** 
1aee0 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 54 68 65 20  is a no-op. The 
1aef0 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69  value returned i
1af00 73 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  s the error stat
1af10 65 20 65 72 72 6f 72 20 63 6f 64 65 20 28 69 2e  e error code (i.
1af20 65 2e 20 0a 2a 2a 20 6f 6e 65 20 6f 66 20 53 51  e. .** one of SQ
1af30 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49  LITE_IOERR, SQLI
1af40 54 45 5f 43 4f 52 52 55 50 54 20 6f 72 20 53 51  TE_CORRUPT or SQ
1af50 4c 49 54 45 5f 46 55 4c 4c 29 2e 0a 2a 2a 0a 2a  LITE_FULL)..**.*
1af60 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  * Otherwise, if 
1af70 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  all of the follo
1af80 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a  wing are true:.*
1af90 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 20 6e 65 77  *.**   * the new
1afa0 20 70 61 67 65 20 73 69 7a 65 20 28 76 61 6c 75   page size (valu
1afb0 65 20 6f 66 20 2a 70 50 61 67 65 53 69 7a 65 29  e of *pPageSize)
1afc0 20 69 73 20 76 61 6c 69 64 20 28 61 20 70 6f 77   is valid (a pow
1afd0 65 72 20 0a 2a 2a 20 20 20 20 20 6f 66 20 74 77  er .**     of tw
1afe0 6f 20 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e  o between 512 an
1aff0 64 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  d SQLITE_MAX_PAG
1b000 45 5f 53 49 5a 45 2c 20 69 6e 63 6c 75 73 69 76  E_SIZE, inclusiv
1b010 65 29 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20  e), and.**.**   
1b020 2a 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f  * there are no o
1b030 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20  utstanding page 
1b040 72 65 66 65 72 65 6e 63 65 73 2c 20 61 6e 64 0a  references, and.
1b050 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 20 64 61  **.**   * the da
1b060 74 61 62 61 73 65 20 69 73 20 65 69 74 68 65 72  tabase is either
1b070 20 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72   not an in-memor
1b080 79 20 64 61 74 61 62 61 73 65 20 6f 72 20 69 74  y database or it
1b090 20 69 73 0a 2a 2a 20 20 20 20 20 61 6e 20 69 6e   is.**     an in
1b0a0 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
1b0b0 20 74 68 61 74 20 63 75 72 72 65 6e 74 6c 79 20   that currently 
1b0c0 63 6f 6e 73 69 73 74 73 20 6f 66 20 7a 65 72 6f  consists of zero
1b0d0 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 74 68   pages..**.** th
1b0e0 65 6e 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a  en the pager obj
1b0f0 65 63 74 20 70 61 67 65 20 73 69 7a 65 20 69 73  ect page size is
1b100 20 73 65 74 20 74 6f 20 2a 70 50 61 67 65 53 69   set to *pPageSi
1b110 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ze..**.** If the
1b120 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 63 68   page size is ch
1b130 61 6e 67 65 64 2c 20 74 68 65 6e 20 74 68 69 73  anged, then this
1b140 20 66 75 6e 63 74 69 6f 6e 20 75 73 65 73 20 73   function uses s
1b150 71 6c 69 74 65 33 50 61 67 65 72 4d 61 6c 6c 6f  qlite3PagerMallo
1b160 63 28 29 20 0a 2a 2a 20 74 6f 20 6f 62 74 61 69  c() .** to obtai
1b170 6e 20 61 20 6e 65 77 20 50 61 67 65 72 2e 70 54  n a new Pager.pT
1b180 6d 70 53 70 61 63 65 20 62 75 66 66 65 72 2e 20  mpSpace buffer. 
1b190 49 66 20 74 68 69 73 20 61 6c 6c 6f 63 61 74 69  If this allocati
1b1a0 6f 6e 20 61 74 74 65 6d 70 74 20 0a 2a 2a 20 66  on attempt .** f
1b1b0 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d  ails, SQLITE_NOM
1b1c0 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  EM is returned a
1b1d0 6e 64 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  nd the page size
1b1e0 20 72 65 6d 61 69 6e 73 20 75 6e 63 68 61 6e 67   remains unchang
1b1f0 65 64 2e 20 0a 2a 2a 20 49 6e 20 61 6c 6c 20 6f  ed. .** In all o
1b200 74 68 65 72 20 63 61 73 65 73 2c 20 53 51 4c 49  ther cases, SQLI
1b210 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
1b220 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
1b230 70 61 67 65 20 73 69 7a 65 20 69 73 20 6e 6f 74  page size is not
1b240 20 63 68 61 6e 67 65 64 2c 20 65 69 74 68 65 72   changed, either
1b250 20 62 65 63 61 75 73 65 20 6f 6e 65 20 6f 66 20   because one of 
1b260 74 68 65 20 65 6e 75 6d 65 72 61 74 65 64 0a 2a  the enumerated.*
1b270 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 62 6f  * conditions abo
1b280 76 65 20 69 73 20 6e 6f 74 20 74 72 75 65 2c 20  ve is not true, 
1b290 74 68 65 20 70 61 67 65 72 20 77 61 73 20 69 6e  the pager was in
1b2a0 20 65 72 72 6f 72 20 73 74 61 74 65 20 77 68 65   error state whe
1b2b0 6e 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  n this.** functi
1b2c0 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 6f  on was called, o
1b2d0 72 20 62 65 63 61 75 73 65 20 74 68 65 20 6d 65  r because the me
1b2e0 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
1b2f0 61 74 74 65 6d 70 74 20 66 61 69 6c 65 64 2c 20  attempt failed, 
1b300 0a 2a 2a 20 74 68 65 6e 20 2a 70 50 61 67 65 53  .** then *pPageS
1b310 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  ize is set to th
1b320 65 20 6f 6c 64 2c 20 72 65 74 61 69 6e 65 64 20  e old, retained 
1b330 70 61 67 65 20 73 69 7a 65 20 62 65 66 6f 72 65  page size before
1b340 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69   returning..*/.i
1b350 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  nt sqlite3PagerS
1b360 65 74 50 61 67 65 73 69 7a 65 28 50 61 67 65 72  etPagesize(Pager
1b370 20 2a 70 50 61 67 65 72 2c 20 75 31 36 20 2a 70   *pPager, u16 *p
1b380 50 61 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52  PageSize, int nR
1b390 65 73 65 72 76 65 29 7b 0a 20 20 69 6e 74 20 72  eserve){.  int r
1b3a0 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43  c = pPager->errC
1b3b0 6f 64 65 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d  ode;..  if( rc==
1b3c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1b3d0 20 75 31 36 20 70 61 67 65 53 69 7a 65 20 3d 20   u16 pageSize = 
1b3e0 2a 70 50 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  *pPageSize;.    
1b3f0 61 73 73 65 72 74 28 20 70 61 67 65 53 69 7a 65  assert( pageSize
1b400 3d 3d 30 20 7c 7c 20 28 70 61 67 65 53 69 7a 65  ==0 || (pageSize
1b410 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53 69 7a  >=512 && pageSiz
1b420 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  e<=SQLITE_MAX_PA
1b430 47 45 5f 53 49 5a 45 29 20 29 3b 0a 20 20 20 20  GE_SIZE) );.    
1b440 69 66 28 20 28 70 50 61 67 65 72 2d 3e 6d 65 6d  if( (pPager->mem
1b450 44 62 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d  Db==0 || pPager-
1b460 3e 64 62 53 69 7a 65 3d 3d 30 29 0a 20 20 20 20  >dbSize==0).    
1b470 20 26 26 20 73 71 6c 69 74 65 33 50 63 61 63 68   && sqlite3Pcach
1b480 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72  eRefCount(pPager
1b490 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 0a 20  ->pPCache)==0 . 
1b4a0 20 20 20 20 26 26 20 70 61 67 65 53 69 7a 65 20      && pageSize 
1b4b0 26 26 20 70 61 67 65 53 69 7a 65 21 3d 70 50 61  && pageSize!=pPa
1b4c0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 0a 20  ger->pageSize . 
1b4d0 20 20 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72     ){.      char
1b4e0 20 2a 70 4e 65 77 20 3d 20 28 63 68 61 72 20 2a   *pNew = (char *
1b4f0 29 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c  )sqlite3PageMall
1b500 6f 63 28 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  oc(pageSize);.  
1b510 20 20 20 20 69 66 28 20 21 70 4e 65 77 20 29 7b      if( !pNew ){
1b520 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
1b530 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
1b540 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1b550 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61   pager_reset(pPa
1b560 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 70 50  ger);.        pP
1b570 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d  ager->pageSize =
1b580 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20   pageSize;.     
1b590 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72     sqlite3PageFr
1b5a0 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d 70 53  ee(pPager->pTmpS
1b5b0 70 61 63 65 29 3b 0a 20 20 20 20 20 20 20 20 70  pace);.        p
1b5c0 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
1b5d0 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 20   = pNew;.       
1b5e0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 65   sqlite3PcacheSe
1b5f0 74 50 61 67 65 53 69 7a 65 28 70 50 61 67 65 72  tPageSize(pPager
1b600 2d 3e 70 50 43 61 63 68 65 2c 20 70 61 67 65 53  ->pPCache, pageS
1b610 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ize);.      }.  
1b620 20 20 7d 0a 20 20 20 20 2a 70 50 61 67 65 53 69    }.    *pPageSi
1b630 7a 65 20 3d 20 28 75 31 36 29 70 50 61 67 65 72  ze = (u16)pPager
1b640 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  ->pageSize;.    
1b650 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30 20 29  if( nReserve<0 )
1b660 20 6e 52 65 73 65 72 76 65 20 3d 20 70 50 61 67   nReserve = pPag
1b670 65 72 2d 3e 6e 52 65 73 65 72 76 65 3b 0a 20 20  er->nReserve;.  
1b680 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 65 72    assert( nReser
1b690 76 65 3e 3d 30 20 26 26 20 6e 52 65 73 65 72 76  ve>=0 && nReserv
1b6a0 65 3c 31 30 30 30 20 29 3b 0a 20 20 20 20 70 50  e<1000 );.    pP
1b6b0 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 20 3d  ager->nReserve =
1b6c0 20 28 69 31 36 29 6e 52 65 73 65 72 76 65 3b 0a   (i16)nReserve;.
1b6d0 20 20 20 20 70 61 67 65 72 52 65 70 6f 72 74 53      pagerReportS
1b6e0 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ize(pPager);.  }
1b6f0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1b700 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
1b710 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 22  pointer to the "
1b720 74 65 6d 70 6f 72 61 72 79 20 70 61 67 65 22 20  temporary page" 
1b730 62 75 66 66 65 72 20 68 65 6c 64 20 69 6e 74 65  buffer held inte
1b740 72 6e 61 6c 6c 79 0a 2a 2a 20 62 79 20 74 68 65  rnally.** by the
1b750 20 70 61 67 65 72 2e 20 20 54 68 69 73 20 69 73   pager.  This is
1b760 20 61 20 62 75 66 66 65 72 20 74 68 61 74 20 69   a buffer that i
1b770 73 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20  s big enough to 
1b780 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 65 6e 74 69  hold the.** enti
1b790 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20  re content of a 
1b7a0 64 61 74 61 62 61 73 65 20 70 61 67 65 2e 20 20  database page.  
1b7b0 54 68 69 73 20 62 75 66 66 65 72 20 69 73 20 75  This buffer is u
1b7c0 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a  sed internally.*
1b7d0 2a 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63  * during rollbac
1b7e0 6b 20 61 6e 64 20 77 69 6c 6c 20 62 65 20 6f 76  k and will be ov
1b7f0 65 72 77 72 69 74 74 65 6e 20 77 68 65 6e 65 76  erwritten whenev
1b800 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a  er a rollback.**
1b810 20 6f 63 63 75 72 73 2e 20 20 42 75 74 20 6f 74   occurs.  But ot
1b820 68 65 72 20 6d 6f 64 75 6c 65 73 20 61 72 65 20  her modules are 
1b830 66 72 65 65 20 74 6f 20 75 73 65 20 69 74 20 74  free to use it t
1b840 6f 6f 2c 20 61 73 20 6c 6f 6e 67 20 61 73 0a 2a  oo, as long as.*
1b850 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 73 20 61  * no rollbacks a
1b860 72 65 20 68 61 70 70 65 6e 69 6e 67 2e 0a 2a 2f  re happening..*/
1b870 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61  .void *sqlite3Pa
1b880 67 65 72 54 65 6d 70 53 70 61 63 65 28 50 61 67  gerTempSpace(Pag
1b890 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
1b8a0 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 54  eturn pPager->pT
1b8b0 6d 70 53 70 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  mpSpace;.}../*.*
1b8c0 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 65 74  * Attempt to set
1b8d0 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 64 61 74   the maximum dat
1b8e0 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74  abase page count
1b8f0 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f   if mxPage is po
1b900 73 69 74 69 76 65 2e 20 0a 2a 2a 20 4d 61 6b 65  sitive. .** Make
1b910 20 6e 6f 20 63 68 61 6e 67 65 73 20 69 66 20 6d   no changes if m
1b920 78 50 61 67 65 20 69 73 20 7a 65 72 6f 20 6f 72  xPage is zero or
1b930 20 6e 65 67 61 74 69 76 65 2e 20 20 41 6e 64 20   negative.  And 
1b940 6e 65 76 65 72 20 72 65 64 75 63 65 20 74 68 65  never reduce the
1b950 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  .** maximum page
1b960 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20 74 68 65   count below the
1b970 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   current size of
1b980 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
1b990 2a 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20  *.** Regardless 
1b9a0 6f 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72  of mxPage, retur
1b9b0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d 61  n the current ma
1b9c0 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74  ximum page count
1b9d0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1b9e0 50 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e  PagerMaxPageCoun
1b9f0 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  t(Pager *pPager,
1ba00 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20   int mxPage){.  
1ba10 69 6e 74 20 6e 50 61 67 65 3b 0a 20 20 69 66 28  int nPage;.  if(
1ba20 20 6d 78 50 61 67 65 3e 30 20 29 7b 0a 20 20 20   mxPage>0 ){.   
1ba30 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20   pPager->mxPgno 
1ba40 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d 0a 20 20  = mxPage;.  }.  
1ba50 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
1ba60 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e!=PAGER_UNLOCK 
1ba70 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  ){.    sqlite3Pa
1ba80 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61  gerPagecount(pPa
1ba90 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20  ger, &nPage);.  
1baa0 20 20 61 73 73 65 72 74 28 20 28 69 6e 74 29 70    assert( (int)p
1bab0 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 3e 3d 6e  Pager->mxPgno>=n
1bac0 50 61 67 65 20 29 3b 0a 20 20 7d 0a 20 20 72 65  Page );.  }.  re
1bad0 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6d 78 50  turn pPager->mxP
1bae0 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  gno;.}../*.** Th
1baf0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 74 20  e following set 
1bb00 6f 66 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  of routines are 
1bb10 75 73 65 64 20 74 6f 20 64 69 73 61 62 6c 65 20  used to disable 
1bb20 74 68 65 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a  the simulated.**
1bb30 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65 63 68 61   I/O error mecha
1bb40 6e 69 73 6d 2e 20 20 54 68 65 73 65 20 72 6f 75  nism.  These rou
1bb50 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74  tines are used t
1bb60 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c 61 74 65  o avoid simulate
1bb70 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69 6e 20 70  d.** errors in p
1bb80 6c 61 63 65 73 20 77 68 65 72 65 20 77 65 20 64  laces where we d
1bb90 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74  o not care about
1bba0 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55   errors..**.** U
1bbb0 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54 45 5f 54  nless -DSQLITE_T
1bbc0 45 53 54 3d 31 20 69 73 20 75 73 65 64 2c 20 74  EST=1 is used, t
1bbd0 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72  hese routines ar
1bbe0 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20  e all no-ops.** 
1bbf0 61 6e 64 20 67 65 6e 65 72 61 74 65 20 6e 6f 20  and generate no 
1bc00 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  code..*/.#ifdef 
1bc10 53 51 4c 49 54 45 5f 54 45 53 54 0a 65 78 74 65  SQLITE_TEST.exte
1bc20 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69  rn int sqlite3_i
1bc30 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b  o_error_pending;
1bc40 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69  .extern int sqli
1bc50 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74  te3_io_error_hit
1bc60 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76  ;.static int sav
1bc70 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20 64 69 73  ed_cnt;.void dis
1bc80 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
1bc90 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a  o_errors(void){.
1bca0 20 20 73 61 76 65 64 5f 63 6e 74 20 3d 20 73 71    saved_cnt = sq
1bcb0 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70  lite3_io_error_p
1bcc0 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c 69 74 65  ending;.  sqlite
1bcd0 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
1bce0 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20  ng = -1;.}.void 
1bcf0 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  enable_simulated
1bd00 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29  _io_errors(void)
1bd10 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  {.  sqlite3_io_e
1bd20 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 73  rror_pending = s
1bd30 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73  aved_cnt;.}.#els
1bd40 65 0a 23 20 64 65 66 69 6e 65 20 64 69 73 61 62  e.# define disab
1bd50 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
1bd60 65 72 72 6f 72 73 28 29 0a 23 20 64 65 66 69 6e  errors().# defin
1bd70 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74  e enable_simulat
1bd80 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23  ed_io_errors().#
1bd90 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  endif../*.** Rea
1bda0 64 20 74 68 65 20 66 69 72 73 74 20 4e 20 62 79  d the first N by
1bdb0 74 65 73 20 66 72 6f 6d 20 74 68 65 20 62 65 67  tes from the beg
1bdc0 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 66 69  inning of the fi
1bdd0 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a  le into memory.*
1bde0 2a 20 74 68 61 74 20 70 44 65 73 74 20 70 6f 69  * that pDest poi
1bdf0 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49  nts to. .**.** I
1be00 66 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20  f the pager was 
1be10 6f 70 65 6e 65 64 20 6f 6e 20 61 20 74 72 61 6e  opened on a tran
1be20 73 69 65 6e 74 20 66 69 6c 65 20 28 7a 46 69 6c  sient file (zFil
1be30 65 6e 61 6d 65 3d 3d 22 22 29 2c 20 6f 72 0a 2a  ename==""), or.*
1be40 2a 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 66 69  * opened on a fi
1be50 6c 65 20 6c 65 73 73 20 74 68 61 6e 20 4e 20 62  le less than N b
1be60 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 74 68  ytes in size, th
1be70 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20  e output buffer 
1be80 69 73 0a 2a 2a 20 7a 65 72 6f 65 64 20 61 6e 64  is.** zeroed and
1be90 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
1bea0 6e 65 64 2e 20 54 68 65 20 72 61 74 69 6f 6e 61  ned. The rationa
1beb0 6c 65 20 66 6f 72 20 74 68 69 73 20 69 73 20 74  le for this is t
1bec0 68 61 74 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e  hat this .** fun
1bed0 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
1bee0 20 72 65 61 64 20 64 61 74 61 62 61 73 65 20 68   read database h
1bef0 65 61 64 65 72 73 2c 20 61 6e 64 20 61 20 6e 65  eaders, and a ne
1bf00 77 20 74 72 61 6e 73 69 65 6e 74 20 6f 72 0a 2a  w transient or.*
1bf10 2a 20 7a 65 72 6f 20 73 69 7a 65 64 20 64 61 74  * zero sized dat
1bf20 61 62 61 73 65 20 68 61 73 20 61 20 68 65 61 64  abase has a head
1bf30 65 72 20 74 68 61 6e 20 63 6f 6e 73 69 73 74 73  er than consists
1bf40 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 7a 65 72   entirely of zer
1bf50 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  oes..**.** If an
1bf60 79 20 49 4f 20 65 72 72 6f 72 20 61 70 61 72 74  y IO error apart
1bf70 20 66 72 6f 6d 20 53 51 4c 49 54 45 5f 49 4f 45   from SQLITE_IOE
1bf80 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 69 73  RR_SHORT_READ is
1bf90 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 0a 2a 2a   encountered,.**
1bfa0 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
1bfb0 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74  is returned to t
1bfc0 68 65 20 63 61 6c 6c 65 72 20 61 6e 64 20 74 68  he caller and th
1bfd0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
1bfe0 65 0a 2a 2a 20 6f 75 74 70 75 74 20 62 75 66 66  e.** output buff
1bff0 65 72 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f  er undefined..*/
1c000 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
1c010 72 52 65 61 64 46 69 6c 65 68 65 61 64 65 72 28  rReadFileheader(
1c020 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
1c030 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65 64 20 63  nt N, unsigned c
1c040 68 61 72 20 2a 70 44 65 73 74 29 7b 0a 20 20 69  har *pDest){.  i
1c050 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1c060 4b 3b 0a 20 20 6d 65 6d 73 65 74 28 70 44 65 73  K;.  memset(pDes
1c070 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 61 73 73 65  t, 0, N);.  asse
1c080 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
1c090 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72  r->fd) || pPager
1c0a0 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 0a 20  ->tempFile );.. 
1c0b0 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65   /* This routine
1c0c0 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20   is only called 
1c0d0 62 79 20 62 74 72 65 65 20 69 6d 6d 65 64 69 61  by btree immedia
1c0e0 74 65 6c 79 20 61 66 74 65 72 20 63 72 65 61 74  tely after creat
1c0f0 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 50 61 67  ing.  ** the Pag
1c100 65 72 20 6f 62 6a 65 63 74 2e 20 20 54 68 65 72  er object.  Ther
1c110 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61  e has not been a
1c120 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f  n opportunity to
1c130 20 74 72 61 6e 73 69 74 69 6f 6e 0a 20 20 2a 2a   transition.  **
1c140 20 74 6f 20 57 41 4c 20 6d 6f 64 65 20 79 65 74   to WAL mode yet
1c150 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
1c160 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
1c170 61 67 65 72 29 20 29 3b 0a 0a 20 20 69 66 28 20  ager) );..  if( 
1c180 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
1c190 64 29 20 29 7b 0a 20 20 20 20 49 4f 54 52 41 43  d) ){.    IOTRAC
1c1a0 45 28 28 22 44 42 48 44 52 20 25 70 20 30 20 25  E(("DBHDR %p 0 %
1c1b0 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 4e 29  d\n", pPager, N)
1c1c0 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ).    rc = sqlit
1c1d0 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
1c1e0 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e 2c 20 30  >fd, pDest, N, 0
1c1f0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
1c200 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
1c210 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20  T_READ ){.      
1c220 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1c230 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1c240 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1c250 52 65 74 75 72 6e 20 74 68 65 20 74 6f 74 61 6c  Return the total
1c260 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
1c270 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
1c280 20 66 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64   file associated
1c290 20 0a 2a 2a 20 77 69 74 68 20 70 50 61 67 65 72   .** with pPager
1c2a0 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74 68 69 73  . Normally, this
1c2b0 20 69 73 20 63 61 6c 63 75 6c 61 74 65 64 20 61   is calculated a
1c2c0 73 20 28 3c 64 62 20 66 69 6c 65 20 73 69 7a 65  s (<db file size
1c2d0 3e 2f 3c 70 61 67 65 2d 73 69 7a 65 3e 29 2e 0a  >/<page-size>)..
1c2e0 2a 2a 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74  ** However, if t
1c2f0 68 65 20 66 69 6c 65 20 69 73 20 62 65 74 77 65  he file is betwe
1c300 65 6e 20 31 20 61 6e 64 20 3c 70 61 67 65 2d 73  en 1 and <page-s
1c310 69 7a 65 3e 20 62 79 74 65 73 20 69 6e 20 73 69  ize> bytes in si
1c320 7a 65 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68 69  ze, then .** thi
1c330 73 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20  s is considered 
1c340 61 20 31 20 70 61 67 65 20 66 69 6c 65 2e 0a 2a  a 1 page file..*
1c350 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
1c360 72 20 69 73 20 69 6e 20 65 72 72 6f 72 20 73 74  r is in error st
1c370 61 74 65 20 77 68 65 6e 20 74 68 69 73 20 66 75  ate when this fu
1c380 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
1c390 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 65 72  , then the.** er
1c3a0 72 6f 72 20 73 74 61 74 65 20 65 72 72 6f 72 20  ror state error 
1c3b0 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
1c3c0 20 61 6e 64 20 2a 70 6e 50 61 67 65 20 6c 65 66   and *pnPage lef
1c3d0 74 20 75 6e 63 68 61 6e 67 65 64 2e 20 4f 72 2c  t unchanged. Or,
1c3e0 0a 2a 2a 20 69 66 20 74 68 65 20 66 69 6c 65 20  .** if the file 
1c3f0 73 79 73 74 65 6d 20 68 61 73 20 74 6f 20 62 65  system has to be
1c400 20 71 75 65 72 69 65 64 20 66 6f 72 20 74 68 65   queried for the
1c410 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c   size of the fil
1c420 65 20 61 6e 64 0a 2a 2a 20 74 68 65 20 71 75 65  e and.** the que
1c430 72 79 20 61 74 74 65 6d 70 74 20 72 65 74 75 72  ry attempt retur
1c440 6e 73 20 61 6e 20 49 4f 20 65 72 72 6f 72 2c 20  ns an IO error, 
1c450 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64  the IO error cod
1c460 65 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a  e is returned.**
1c470 20 61 6e 64 20 2a 70 6e 50 61 67 65 20 69 73 20   and *pnPage is 
1c480 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a  left unchanged..
1c490 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
1c4a0 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 69   if everything i
1c4b0 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68  s successful, th
1c4c0 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  en SQLITE_OK is 
1c4d0 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 6e 64 20  returned.** and 
1c4e0 2a 70 6e 50 61 67 65 20 69 73 20 73 65 74 20 74  *pnPage is set t
1c4f0 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
1c500 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  pages in the dat
1c510 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  abase..*/.int sq
1c520 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
1c530 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  unt(Pager *pPage
1c540 72 2c 20 69 6e 74 20 2a 70 6e 50 61 67 65 29 7b  r, int *pnPage){
1c550 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65 20 3d 20  .  Pgno nPage = 
1c560 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
1c570 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20  Value to return 
1c580 76 69 61 20 2a 70 6e 50 61 67 65 20 2a 2f 0a 0a  via *pnPage */..
1c590 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 74    /* Determine t
1c5a0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
1c5b0 65 73 20 69 6e 20 74 68 65 20 66 69 6c 65 2e 20  es in the file. 
1c5c0 53 74 6f 72 65 20 74 68 69 73 20 69 6e 20 6e 50  Store this in nP
1c5d0 61 67 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50  age. */.  if( pP
1c5e0 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69  ager->dbSizeVali
1c5f0 64 20 29 7b 0a 20 20 20 20 6e 50 61 67 65 20 3d  d ){.    nPage =
1c600 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
1c610 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
1c620 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
1c630 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 72        /* Error r
1c640 65 74 75 72 6e 65 64 20 62 79 20 4f 73 46 69 6c  eturned by OsFil
1c650 65 53 69 7a 65 28 29 20 2a 2f 0a 20 20 20 20 69  eSize() */.    i
1c660 36 34 20 6e 20 3d 20 30 3b 20 20 20 20 20 20 20  64 n = 0;       
1c670 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 73         /* File s
1c680 69 7a 65 20 69 6e 20 62 79 74 65 73 20 72 65 74  ize in bytes ret
1c690 75 72 6e 65 64 20 62 79 20 4f 73 46 69 6c 65 53  urned by OsFileS
1c6a0 69 7a 65 28 29 20 2a 2f 0a 0a 20 20 20 20 69 66  ize() */..    if
1c6b0 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
1c6c0 61 67 65 72 29 20 26 26 20 70 50 61 67 65 72 2d  ager) && pPager-
1c6d0 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e  >state!=PAGER_UN
1c6e0 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  LOCK ){.      sq
1c6f0 6c 69 74 65 33 57 61 6c 44 62 73 69 7a 65 28 70  lite3WalDbsize(p
1c700 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 26 6e 50  Pager->pWal, &nP
1c710 61 67 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  age);.    }..   
1c720 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 7b   if( nPage==0 ){
1c730 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
1c740 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
1c750 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d  ) || pPager->tem
1c760 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20 69  pFile );.      i
1c770 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
1c780 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20  ->fd) ){.       
1c790 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
1c7a0 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46  (rc = sqlite3OsF
1c7b0 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
1c7c0 66 64 2c 20 26 6e 29 29 20 29 7b 0a 20 20 20 20  fd, &n)) ){.    
1c7d0 20 20 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f        pager_erro
1c7e0 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20  r(pPager, rc);. 
1c7f0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1c800 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
1c810 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1c820 6e 3e 30 20 26 26 20 6e 3c 70 50 61 67 65 72 2d  n>0 && n<pPager-
1c830 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20  >pageSize ){.   
1c840 20 20 20 20 20 6e 50 61 67 65 20 3d 20 31 3b 0a       nPage = 1;.
1c850 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1c860 20 20 20 20 20 6e 50 61 67 65 20 3d 20 28 50 67       nPage = (Pg
1c870 6e 6f 29 28 6e 20 2f 20 70 50 61 67 65 72 2d 3e  no)(n / pPager->
1c880 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
1c890 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
1c8a0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d   pPager->state!=
1c8b0 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a  PAGER_UNLOCK ){.
1c8c0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
1c8d0 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20  Size = nPage;.  
1c8e0 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69      pPager->dbFi
1c8f0 6c 65 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a  leSize = nPage;.
1c900 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
1c910 53 69 7a 65 56 61 6c 69 64 20 3d 20 31 3b 0a 20  SizeValid = 1;. 
1c920 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
1c930 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 6e 75  f the current nu
1c940 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
1c950 20 74 68 65 20 66 69 6c 65 20 69 73 20 67 72 65   the file is gre
1c960 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 0a 20  ater than the . 
1c970 20 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64 20 6d   ** configured m
1c980 61 78 69 6d 75 6d 20 70 61 67 65 72 20 6e 75 6d  aximum pager num
1c990 62 65 72 2c 20 69 6e 63 72 65 61 73 65 20 74 68  ber, increase th
1c9a0 65 20 61 6c 6c 6f 77 65 64 20 6c 69 6d 69 74 20  e allowed limit 
1c9b0 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65  so.  ** that the
1c9c0 20 66 69 6c 65 20 63 61 6e 20 62 65 20 72 65 61   file can be rea
1c9d0 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50  d..  */.  if( nP
1c9e0 61 67 65 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67  age>pPager->mxPg
1c9f0 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  no ){.    pPager
1ca00 2d 3e 6d 78 50 67 6e 6f 20 3d 20 28 50 67 6e 6f  ->mxPgno = (Pgno
1ca10 29 6e 50 61 67 65 3b 0a 20 20 7d 0a 0a 20 20 2f  )nPage;.  }..  /
1ca20 2a 20 53 65 74 20 74 68 65 20 6f 75 74 70 75 74  * Set the output
1ca30 20 76 61 72 69 61 62 6c 65 20 61 6e 64 20 72 65   variable and re
1ca40 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 2a  turn SQLITE_OK *
1ca50 2f 0a 20 20 2a 70 6e 50 61 67 65 20 3d 20 6e 50  /.  *pnPage = nP
1ca60 61 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  age;.  return SQ
1ca70 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a  LITE_OK;.}.../*.
1ca80 2a 2a 20 54 72 79 20 74 6f 20 6f 62 74 61 69 6e  ** Try to obtain
1ca90 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70 65 20   a lock of type 
1caa0 6c 6f 63 6b 74 79 70 65 20 6f 6e 20 74 68 65 20  locktype on the 
1cab0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
1cac0 66 0a 2a 2a 20 61 20 73 69 6d 69 6c 61 72 20 6f  f.** a similar o
1cad0 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 69  r greater lock i
1cae0 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20  s already held, 
1caf0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
1cb00 20 61 20 6e 6f 2d 6f 70 0a 2a 2a 20 28 72 65 74   a no-op.** (ret
1cb10 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b  urning SQLITE_OK
1cb20 20 69 6d 6d 65 64 69 61 74 65 6c 79 29 2e 0a 2a   immediately)..*
1cb30 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
1cb40 61 74 74 65 6d 70 74 20 74 6f 20 6f 62 74 61 69  attempt to obtai
1cb50 6e 20 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67  n the lock using
1cb60 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29   sqlite3OsLock()
1cb70 2e 20 49 6e 76 6f 6b 65 20 0a 2a 2a 20 74 68 65  . Invoke .** the
1cb80 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 69   busy callback i
1cb90 66 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 63 75  f the lock is cu
1cba0 72 72 65 6e 74 6c 79 20 6e 6f 74 20 61 76 61 69  rrently not avai
1cbb0 6c 61 62 6c 65 2e 20 52 65 70 65 61 74 20 0a 2a  lable. Repeat .*
1cbc0 2a 20 75 6e 74 69 6c 20 74 68 65 20 62 75 73 79  * until the busy
1cbd0 20 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e   callback return
1cbe0 73 20 66 61 6c 73 65 20 6f 72 20 75 6e 74 69 6c  s false or until
1cbf0 20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20   the attempt to 
1cc00 0a 2a 2a 20 6f 62 74 61 69 6e 20 74 68 65 20 6c  .** obtain the l
1cc10 6f 63 6b 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a  ock succeeds..**
1cc20 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
1cc30 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20  E_OK on success 
1cc40 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  and an error cod
1cc50 65 20 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f  e if we cannot o
1cc60 62 74 61 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63  btain.** the loc
1cc70 6b 2e 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 69  k. If the lock i
1cc80 73 20 6f 62 74 61 69 6e 65 64 20 73 75 63 63 65  s obtained succe
1cc90 73 73 66 75 6c 6c 79 2c 20 73 65 74 20 74 68 65  ssfully, set the
1cca0 20 50 61 67 65 72 2e 73 74 61 74 65 20 0a 2a 2a   Pager.state .**
1ccb0 20 76 61 72 69 61 62 6c 65 20 74 6f 20 6c 6f 63   variable to loc
1ccc0 6b 74 79 70 65 20 62 65 66 6f 72 65 20 72 65 74  ktype before ret
1ccd0 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  urning..*/.stati
1cce0 63 20 69 6e 74 20 70 61 67 65 72 5f 77 61 69 74  c int pager_wait
1ccf0 5f 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65 72 20 2a  _on_lock(Pager *
1cd00 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 6f 63 6b  pPager, int lock
1cd10 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b  type){.  int rc;
1cd20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1cd40 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
1cd50 0a 20 20 2f 2a 20 54 68 65 20 4f 53 20 6c 6f 63  .  /* The OS loc
1cd60 6b 20 76 61 6c 75 65 73 20 6d 75 73 74 20 62 65  k values must be
1cd70 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65   the same as the
1cd80 20 50 61 67 65 72 20 6c 6f 63 6b 20 76 61 6c 75   Pager lock valu
1cd90 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  es */.  assert( 
1cda0 50 41 47 45 52 5f 53 48 41 52 45 44 3d 3d 53 48  PAGER_SHARED==SH
1cdb0 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  ARED_LOCK );.  a
1cdc0 73 73 65 72 74 28 20 50 41 47 45 52 5f 52 45 53  ssert( PAGER_RES
1cdd0 45 52 56 45 44 3d 3d 52 45 53 45 52 56 45 44 5f  ERVED==RESERVED_
1cde0 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
1cdf0 28 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  ( PAGER_EXCLUSIV
1ce00 45 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  E==EXCLUSIVE_LOC
1ce10 4b 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  K );..  /* If th
1ce20 65 20 66 69 6c 65 20 69 73 20 63 75 72 72 65 6e  e file is curren
1ce30 74 6c 79 20 75 6e 6c 6f 63 6b 65 64 20 74 68 65  tly unlocked the
1ce40 6e 20 74 68 65 20 73 69 7a 65 20 6d 75 73 74 20  n the size must 
1ce50 62 65 20 75 6e 6b 6e 6f 77 6e 2e 20 49 74 0a 20  be unknown. It. 
1ce60 20 2a 2a 20 6d 75 73 74 20 6e 6f 74 20 68 61 76   ** must not hav
1ce70 65 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20  e been modified 
1ce80 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a 20  at this point.. 
1ce90 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
1cea0 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
1ceb0 45 52 5f 53 48 41 52 45 44 20 7c 7c 20 70 50 61  ER_SHARED || pPa
1cec0 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64  ger->dbSizeValid
1ced0 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
1cee0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
1cef0 50 41 47 45 52 5f 53 48 41 52 45 44 20 7c 7c 20  PAGER_SHARED || 
1cf00 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69  pPager->dbModifi
1cf10 65 64 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 43  ed==0 );..  /* C
1cf20 68 65 63 6b 20 74 68 61 74 20 74 68 69 73 20 69  heck that this i
1cf30 73 20 65 69 74 68 65 72 20 61 20 6e 6f 2d 6f 70  s either a no-op
1cf40 20 28 62 65 63 61 75 73 65 20 74 68 65 20 72 65   (because the re
1cf50 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 69 73 20  quested lock is 
1cf60 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 68 65  .  ** already he
1cf70 6c 64 2c 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68  ld, or one of th
1cf80 65 20 74 72 61 6e 73 69 73 74 69 6f 6e 73 20 74  e transistions t
1cf90 68 61 74 20 74 68 65 20 62 75 73 79 2d 68 61 6e  hat the busy-han
1cfa0 64 6c 65 72 0a 20 20 2a 2a 20 6d 61 79 20 62 65  dler.  ** may be
1cfb0 20 69 6e 76 6f 6b 65 64 20 64 75 72 69 6e 67 2c   invoked during,
1cfc0 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68   according to th
1cfd0 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 0a  e comment above.
1cfe0 20 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65    ** sqlite3Page
1cff0 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28  rSetBusyhandler(
1d000 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  )..  */.  assert
1d010 28 20 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65  ( (pPager->state
1d020 3e 3d 6c 6f 63 6b 74 79 70 65 29 0a 20 20 20 20  >=locktype).    
1d030 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 73     || (pPager->s
1d040 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate==PAGER_UNLO
1d050 43 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d  CK && locktype==
1d060 50 41 47 45 52 5f 53 48 41 52 45 44 29 0a 20 20  PAGER_SHARED).  
1d070 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d       || (pPager-
1d080 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  >state==PAGER_RE
1d090 53 45 52 56 45 44 20 26 26 20 6c 6f 63 6b 74 79  SERVED && lockty
1d0a0 70 65 3d 3d 50 41 47 45 52 5f 45 58 43 4c 55 53  pe==PAGER_EXCLUS
1d0b0 49 56 45 29 0a 20 20 29 3b 0a 0a 20 20 69 66 28  IVE).  );..  if(
1d0c0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
1d0d0 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20  locktype ){.    
1d0e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1d0f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 6f 20    }else{.    do 
1d100 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
1d110 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65  ite3OsLock(pPage
1d120 72 2d 3e 66 64 2c 20 6c 6f 63 6b 74 79 70 65 29  r->fd, locktype)
1d130 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63  ;.    }while( rc
1d140 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26  ==SQLITE_BUSY &&
1d150 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61   pPager->xBusyHa
1d160 6e 64 6c 65 72 28 70 50 61 67 65 72 2d 3e 70 42  ndler(pPager->pB
1d170 75 73 79 48 61 6e 64 6c 65 72 41 72 67 29 20 29  usyHandlerArg) )
1d180 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
1d190 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1d1a0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
1d1b0 20 28 75 38 29 6c 6f 63 6b 74 79 70 65 3b 0a 20   (u8)locktype;. 
1d1c0 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4c       IOTRACE(("L
1d1d0 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  OCK %p %d\n", pP
1d1e0 61 67 65 72 2c 20 6c 6f 63 6b 74 79 70 65 29 29  ager, locktype))
1d1f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1d200 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1d210 20 46 75 6e 63 74 69 6f 6e 20 61 73 73 65 72 74   Function assert
1d220 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69  TruncateConstrai
1d230 6e 74 28 70 50 61 67 65 72 29 20 63 68 65 63 6b  nt(pPager) check
1d240 73 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 74 68  s that one of th
1d250 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20  e .** following 
1d260 69 73 20 74 72 75 65 20 66 6f 72 20 61 6c 6c 20  is true for all 
1d270 64 69 72 74 79 20 70 61 67 65 73 20 63 75 72 72  dirty pages curr
1d280 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 70 61 67  ently in the pag
1d290 65 2d 63 61 63 68 65 3a 0a 2a 2a 0a 2a 2a 20 20  e-cache:.**.**  
1d2a0 20 61 29 20 54 68 65 20 70 61 67 65 20 6e 75 6d   a) The page num
1d2b0 62 65 72 20 69 73 20 6c 65 73 73 20 74 68 61 6e  ber is less than
1d2c0 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65   or equal to the
1d2d0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 0a 2a 2a   size of the .**
1d2e0 20 20 20 20 20 20 63 75 72 72 65 6e 74 20 64 61        current da
1d2f0 74 61 62 61 73 65 20 69 6d 61 67 65 2c 20 69 6e  tabase image, in
1d300 20 70 61 67 65 73 2c 20 4f 52 0a 2a 2a 0a 2a 2a   pages, OR.**.**
1d310 20 20 20 62 29 20 69 66 20 74 68 65 20 70 61 67     b) if the pag
1d320 65 20 63 6f 6e 74 65 6e 74 20 77 65 72 65 20 77  e content were w
1d330 72 69 74 74 65 6e 20 61 74 20 74 68 69 73 20 74  ritten at this t
1d340 69 6d 65 2c 20 69 74 20 77 6f 75 6c 64 20 6e 6f  ime, it would no
1d350 74 0a 2a 2a 20 20 20 20 20 20 62 65 20 6e 65 63  t.**      be nec
1d360 65 73 73 61 72 79 20 74 6f 20 77 72 69 74 65 20  essary to write 
1d370 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74  the current cont
1d380 65 6e 74 20 6f 75 74 20 74 6f 20 74 68 65 20 73  ent out to the s
1d390 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20  ub-journal.**   
1d3a0 20 20 20 28 61 73 20 64 65 74 65 72 6d 69 6e 65     (as determine
1d3b0 64 20 62 79 20 66 75 6e 63 74 69 6f 6e 20 73 75  d by function su
1d3c0 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 29  bjRequiresPage()
1d3d0 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  )..**.** If the 
1d3e0 63 6f 6e 64 69 74 69 6f 6e 20 61 73 73 65 72 74  condition assert
1d3f0 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
1d400 69 6f 6e 20 77 65 72 65 20 6e 6f 74 20 74 72 75  ion were not tru
1d410 65 2c 20 61 6e 64 20 74 68 65 0a 2a 2a 20 64 69  e, and the.** di
1d420 72 74 79 20 70 61 67 65 20 77 65 72 65 20 74 6f  rty page were to
1d430 20 62 65 20 64 69 73 63 61 72 64 65 64 20 66 72   be discarded fr
1d440 6f 6d 20 74 68 65 20 63 61 63 68 65 20 76 69 61  om the cache via
1d450 20 74 68 65 20 70 61 67 65 72 53 74 72 65 73 73   the pagerStress
1d460 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 2c 20 70  ().** routine, p
1d470 61 67 65 72 53 74 72 65 73 73 28 29 20 77 6f 75  agerStress() wou
1d480 6c 64 20 6e 6f 74 20 77 72 69 74 65 20 74 68 65  ld not write the
1d490 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 63 6f   current page co
1d4a0 6e 74 65 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20  ntent to.** the 
1d4b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
1d4c0 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20 74 72  f a savepoint tr
1d4d0 61 6e 73 61 63 74 69 6f 6e 20 77 65 72 65 20 72  ansaction were r
1d4e0 6f 6c 6c 65 64 20 62 61 63 6b 20 61 66 74 65 72  olled back after
1d4f0 0a 2a 2a 20 74 68 69 73 20 68 61 70 70 65 6e 65  .** this happene
1d500 64 2c 20 74 68 65 20 63 6f 72 72 65 63 74 20 62  d, the correct b
1d510 65 68 61 76 69 6f 75 72 20 77 6f 75 6c 64 20 62  ehaviour would b
1d520 65 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65  e to restore the
1d530 20 63 75 72 72 65 6e 74 0a 2a 2a 20 63 6f 6e 74   current.** cont
1d540 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e  ent of the page.
1d550 20 48 6f 77 65 76 65 72 2c 20 73 69 6e 63 65 20   However, since 
1d560 74 68 69 73 20 63 6f 6e 74 65 6e 74 20 69 73 20  this content is 
1d570 6e 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20 65  not present in e
1d580 69 74 68 65 72 0a 2a 2a 20 74 68 65 20 64 61 74  ither.** the dat
1d590 61 62 61 73 65 20 66 69 6c 65 20 6f 72 20 74 68  abase file or th
1d5a0 65 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65  e portion of the
1d5b0 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
1d5c0 6c 20 61 6e 64 20 0a 2a 2a 20 73 75 62 2d 6a 6f  l and .** sub-jo
1d5d0 75 72 6e 61 6c 20 72 6f 6c 6c 65 64 20 62 61 63  urnal rolled bac
1d5e0 6b 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 63 6f  k the content co
1d5f0 75 6c 64 20 6e 6f 74 20 62 65 20 72 65 73 74 6f  uld not be resto
1d600 72 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 64  red and the.** d
1d610 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 77 6f  atabase image wo
1d620 75 6c 64 20 62 65 63 6f 6d 65 20 63 6f 72 72 75  uld become corru
1d630 70 74 2e 20 49 74 20 69 73 20 74 68 65 72 65 66  pt. It is theref
1d640 6f 72 65 20 66 6f 72 74 75 6e 61 74 65 20 74 68  ore fortunate th
1d650 61 74 20 0a 2a 2a 20 74 68 69 73 20 63 69 72 63  at .** this circ
1d660 75 6d 73 74 61 6e 63 65 20 63 61 6e 6e 6f 74 20  umstance cannot 
1d670 61 72 69 73 65 2e 0a 2a 2f 0a 23 69 66 20 64 65  arise..*/.#if de
1d680 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
1d690 55 47 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20  UG).static void 
1d6a0 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f  assertTruncateCo
1d6b0 6e 73 74 72 61 69 6e 74 43 62 28 50 67 48 64 72  nstraintCb(PgHdr
1d6c0 20 2a 70 50 67 29 7b 0a 20 20 61 73 73 65 72 74   *pPg){.  assert
1d6d0 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48  ( pPg->flags&PGH
1d6e0 44 52 5f 44 49 52 54 59 20 29 3b 0a 20 20 61 73  DR_DIRTY );.  as
1d6f0 73 65 72 74 28 20 21 73 75 62 6a 52 65 71 75 69  sert( !subjRequi
1d700 72 65 73 50 61 67 65 28 70 50 67 29 20 7c 7c 20  resPage(pPg) || 
1d710 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 67 2d 3e  pPg->pgno<=pPg->
1d720 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29  pPager->dbSize )
1d730 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
1d740 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f  assertTruncateCo
1d750 6e 73 74 72 61 69 6e 74 28 50 61 67 65 72 20 2a  nstraint(Pager *
1d760 70 50 61 67 65 72 29 7b 0a 20 20 73 71 6c 69 74  pPager){.  sqlit
1d770 65 33 50 63 61 63 68 65 49 74 65 72 61 74 65 44  e3PcacheIterateD
1d780 69 72 74 79 28 70 50 61 67 65 72 2d 3e 70 50 43  irty(pPager->pPC
1d790 61 63 68 65 2c 20 61 73 73 65 72 74 54 72 75 6e  ache, assertTrun
1d7a0 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 62  cateConstraintCb
1d7b0 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  );.}.#else.# def
1d7c0 69 6e 65 20 61 73 73 65 72 74 54 72 75 6e 63 61  ine assertTrunca
1d7d0 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61  teConstraint(pPa
1d7e0 67 65 72 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ger).#endif../*.
1d7f0 2a 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65 20  ** Truncate the 
1d800 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
1d810 73 65 20 66 69 6c 65 20 69 6d 61 67 65 20 74 6f  se file image to
1d820 20 6e 50 61 67 65 20 70 61 67 65 73 2e 20 54 68   nPage pages. Th
1d830 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  is .** function 
1d840 64 6f 65 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c  does not actuall
1d850 79 20 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74  y modify the dat
1d860 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69  abase file on di
1d870 73 6b 2e 20 49 74 20 0a 2a 2a 20 6a 75 73 74 20  sk. It .** just 
1d880 73 65 74 73 20 74 68 65 20 69 6e 74 65 72 6e 61  sets the interna
1d890 6c 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 70  l state of the p
1d8a0 61 67 65 72 20 6f 62 6a 65 63 74 20 73 6f 20 74  ager object so t
1d8b0 68 61 74 20 74 68 65 20 0a 2a 2a 20 74 72 75 6e  hat the .** trun
1d8c0 63 61 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 64  cation will be d
1d8d0 6f 6e 65 20 77 68 65 6e 20 74 68 65 20 63 75 72  one when the cur
1d8e0 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
1d8f0 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a   is committed..*
1d900 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
1d910 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65  gerTruncateImage
1d920 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
1d930 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 61  Pgno nPage){.  a
1d940 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
1d950 62 53 69 7a 65 56 61 6c 69 64 20 29 3b 0a 20 20  bSizeValid );.  
1d960 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1d970 64 62 53 69 7a 65 3e 3d 6e 50 61 67 65 20 29 3b  dbSize>=nPage );
1d980 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1d990 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
1d9a0 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20 70 50  RESERVED );.  pP
1d9b0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e  ager->dbSize = n
1d9c0 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 54 72  Page;.  assertTr
1d9d0 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74  uncateConstraint
1d9e0 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 0a 2f 2a  (pPager);.}.../*
1d9f0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1da00 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 65 66 6f  n is called befo
1da10 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 61 20  re attempting a 
1da20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
1da30 62 61 63 6b 2e 20 49 74 0a 2a 2a 20 73 79 6e 63  back. It.** sync
1da40 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  s the journal fi
1da50 6c 65 20 74 6f 20 64 69 73 6b 2c 20 74 68 65 6e  le to disk, then
1da60 20 73 65 74 73 20 70 50 61 67 65 72 2d 3e 6a 6f   sets pPager->jo
1da70 75 72 6e 61 6c 48 64 72 20 74 6f 20 74 68 65 0a  urnalHdr to the.
1da80 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a  ** size of the j
1da90 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 6f 20 74  ournal file so t
1daa0 68 61 74 20 74 68 65 20 70 61 67 65 72 5f 70 6c  hat the pager_pl
1dab0 61 79 62 61 63 6b 28 29 20 72 6f 75 74 69 6e 65  ayback() routine
1dac0 20 6b 6e 6f 77 73 0a 2a 2a 20 74 68 61 74 20 74   knows.** that t
1dad0 68 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61  he entire journa
1dae0 6c 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20  l file has been 
1daf0 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 79  synced..**.** Sy
1db00 6e 63 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72  ncing a hot-jour
1db10 6e 61 6c 20 74 6f 20 64 69 73 6b 20 62 65 66 6f  nal to disk befo
1db20 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  re attempting to
1db30 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20 65 6e   roll it back en
1db40 73 75 72 65 73 20 0a 2a 2a 20 74 68 61 74 20 69  sures .** that i
1db50 66 20 61 20 70 6f 77 65 72 2d 66 61 69 6c 75 72  f a power-failur
1db60 65 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  e occurs during 
1db70 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68  the rollback, th
1db80 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 0a 2a  e process that.*
1db90 2a 20 61 74 74 65 6d 70 74 73 20 72 6f 6c 6c 62  * attempts rollb
1dba0 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 79  ack following sy
1dbb0 73 74 65 6d 20 72 65 63 6f 76 65 72 79 20 73 65  stem recovery se
1dbc0 65 73 20 74 68 65 20 73 61 6d 65 20 6a 6f 75 72  es the same jour
1dbd0 6e 61 6c 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 61  nal.** content a
1dbe0 73 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e 0a  s this process..
1dbf0 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79 74 68  **.** If everyth
1dc00 69 6e 67 20 67 6f 65 73 20 61 73 20 70 6c 61 6e  ing goes as plan
1dc10 6e 65 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ned, SQLITE_OK i
1dc20 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
1dc30 72 77 69 73 65 2c 20 0a 2a 2a 20 61 6e 20 53 51  rwise, .** an SQ
1dc40 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  Lite error code.
1dc50 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
1dc60 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e  agerSyncHotJourn
1dc70 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
1dc80 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
1dc90 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21  LITE_OK;.  if( !
1dca0 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
1dcb0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
1dcc0 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
1dcd0 3e 6a 66 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e  >jfd, SQLITE_SYN
1dce0 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20 7d 0a 20  C_NORMAL);.  }. 
1dcf0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1dd00 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
1dd10 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
1dd20 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70  (pPager->jfd, &p
1dd30 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
1dd40 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  r);.  }.  return
1dd50 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68   rc;.}../*.** Sh
1dd60 75 74 64 6f 77 6e 20 74 68 65 20 70 61 67 65 20  utdown the page 
1dd70 63 61 63 68 65 2e 20 20 46 72 65 65 20 61 6c 6c  cache.  Free all
1dd80 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73   memory and clos
1dd90 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a  e all files..**.
1dda0 2a 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63 74  ** If a transact
1ddb0 69 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f 67 72  ion was in progr
1ddc0 65 73 73 20 77 68 65 6e 20 74 68 69 73 20 72 6f  ess when this ro
1ddd0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
1dde0 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63   that.** transac
1ddf0 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
1de00 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61  ack.  All outsta
1de10 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72 65 20  nding pages are 
1de20 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61  invalidated.** a
1de30 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 20  nd their memory 
1de40 69 73 20 66 72 65 65 64 2e 20 20 41 6e 79 20 61  is freed.  Any a
1de50 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20  ttempt to use a 
1de60 70 61 67 65 20 61 73 73 6f 63 69 61 74 65 64 0a  page associated.
1de70 2a 2a 20 77 69 74 68 20 74 68 69 73 20 70 61 67  ** with this pag
1de80 65 20 63 61 63 68 65 20 61 66 74 65 72 20 74 68  e cache after th
1de90 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
1dea0 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a  rns will likely.
1deb0 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63  ** result in a c
1dec0 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54  oredump..**.** T
1ded0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77  his function alw
1dee0 61 79 73 20 73 75 63 63 65 65 64 73 2e 20 49 66  ays succeeds. If
1def0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
1df00 73 20 61 63 74 69 76 65 20 61 6e 20 61 74 74 65  s active an atte
1df10 6d 70 74 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74  mpt.** is made t
1df20 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20  o roll it back. 
1df30 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
1df40 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f  rs during the ro
1df50 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61 20 68 6f 74  llback .** a hot
1df60 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 62 65 20   journal may be 
1df70 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65  left in the file
1df80 73 79 73 74 65 6d 20 62 75 74 20 6e 6f 20 65 72  system but no er
1df90 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 0a  ror is returned.
1dfa0 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  ** to the caller
1dfb0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1dfc0 50 61 67 65 72 43 6c 6f 73 65 28 50 61 67 65 72  PagerClose(Pager
1dfd0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 75 38 20   *pPager){.  u8 
1dfe0 2a 70 54 6d 70 20 3d 20 28 75 38 20 2a 29 70 50  *pTmp = (u8 *)pP
1dff0 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
1e000 0a 0a 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75  ..  disable_simu
1e010 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
1e020 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69  );.  sqlite3Begi
1e030 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
1e040 0a 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  .  pPager->errCo
1e050 64 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  de = 0;.  pPager
1e060 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
1e070 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 0;.#ifndef SQL
1e080 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 73  ITE_OMIT_WAL.  s
1e090 71 6c 69 74 65 33 57 61 6c 43 6c 6f 73 65 28 70  qlite3WalClose(p
1e0a0 50 61 67 65 72 2d 3e 70 57 61 6c 2c 0a 20 20 20  Pager->pWal,.   
1e0b0 20 28 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   (pPager->noSync
1e0c0 20 3f 20 30 20 3a 20 70 50 61 67 65 72 2d 3e 73   ? 0 : pPager->s
1e0d0 79 6e 63 5f 66 6c 61 67 73 29 2c 20 0a 20 20 20  ync_flags), .   
1e0e0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
1e0f0 65 2c 20 70 54 6d 70 0a 20 20 29 3b 0a 20 20 70  e, pTmp.  );.  p
1e100 50 61 67 65 72 2d 3e 70 57 61 6c 20 3d 20 30 3b  Pager->pWal = 0;
1e110 0a 23 65 6e 64 69 66 0a 20 20 70 61 67 65 72 5f  .#endif.  pager_
1e120 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
1e130 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
1e140 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70    pager_unlock(p
1e150 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b  Pager);.  }else{
1e160 0a 20 20 20 20 2f 2a 20 53 65 74 20 50 61 67 65  .    /* Set Page
1e170 72 2e 6a 6f 75 72 6e 61 6c 48 64 72 20 74 6f 20  r.journalHdr to 
1e180 2d 31 20 66 6f 72 20 74 68 65 20 62 65 6e 65 66  -1 for the benef
1e190 69 74 20 6f 66 20 74 68 65 20 70 61 67 65 72 5f  it of the pager_
1e1a0 70 6c 61 79 62 61 63 6b 28 29 20 0a 20 20 20 20  playback() .    
1e1b0 2a 2a 20 63 61 6c 6c 20 77 68 69 63 68 20 6d 61  ** call which ma
1e1c0 79 20 62 65 20 6d 61 64 65 20 66 72 6f 6d 20 77  y be made from w
1e1d0 69 74 68 69 6e 20 70 61 67 65 72 55 6e 6c 6f 63  ithin pagerUnloc
1e1e0 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 29 2e 20  kAndRollback(). 
1e1f0 49 66 20 69 74 0a 20 20 20 20 2a 2a 20 69 73 20  If it.    ** is 
1e200 6e 6f 74 20 2d 31 2c 20 74 68 65 6e 20 74 68 65  not -1, then the
1e210 20 75 6e 73 79 6e 63 65 64 20 70 6f 72 74 69 6f   unsynced portio
1e220 6e 20 6f 66 20 61 6e 20 6f 70 65 6e 20 6a 6f 75  n of an open jou
1e230 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 0a 20 20  rnal file may.  
1e240 20 20 2a 2a 20 62 65 20 70 6c 61 79 65 64 20 62    ** be played b
1e250 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74  ack into the dat
1e260 61 62 61 73 65 2e 20 49 66 20 61 20 70 6f 77 65  abase. If a powe
1e270 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73  r failure occurs
1e280 20 77 68 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68   while.    ** th
1e290 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67 2c  is is happening,
1e2a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 61   the database ma
1e2b0 79 20 62 65 63 6f 6d 65 20 63 6f 72 72 75 70 74  y become corrupt
1e2c0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1e2d0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
1e2e0 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 70 50  jfd) ){.      pP
1e2f0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20  ager->errCode = 
1e300 70 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72  pagerSyncHotJour
1e310 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20  nal(pPager);.   
1e320 20 7d 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f   }.    pagerUnlo
1e330 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50  ckAndRollback(pP
1e340 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  ager);.  }.  sql
1e350 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
1e360 6c 6f 63 28 29 3b 0a 20 20 65 6e 61 62 6c 65 5f  loc();.  enable_
1e370 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
1e380 6f 72 73 28 29 3b 0a 20 20 50 41 47 45 52 54 52  ors();.  PAGERTR
1e390 41 43 45 28 28 22 43 4c 4f 53 45 20 25 64 5c 6e  ACE(("CLOSE %d\n
1e3a0 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
1e3b0 72 29 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28  r)));.  IOTRACE(
1e3c0 28 22 43 4c 4f 53 45 20 25 70 5c 6e 22 2c 20 70  ("CLOSE %p\n", p
1e3d0 50 61 67 65 72 29 29 0a 20 20 73 71 6c 69 74 65  Pager)).  sqlite
1e3e0 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
1e3f0 3e 6a 66 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  >jfd);.  sqlite3
1e400 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
1e410 66 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  fd);.  sqlite3Pa
1e420 67 65 46 72 65 65 28 70 54 6d 70 29 3b 0a 20 20  geFree(pTmp);.  
1e430 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 6f  sqlite3PcacheClo
1e440 73 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  se(pPager->pPCac
1e450 68 65 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  he);..#ifdef SQL
1e460 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20  ITE_HAS_CODEC.  
1e470 69 66 28 20 70 50 61 67 65 72 2d 3e 78 43 6f 64  if( pPager->xCod
1e480 65 63 46 72 65 65 20 29 20 70 50 61 67 65 72 2d  ecFree ) pPager-
1e490 3e 78 43 6f 64 65 63 46 72 65 65 28 70 50 61 67  >xCodecFree(pPag
1e4a0 65 72 2d 3e 70 43 6f 64 65 63 29 3b 0a 23 65 6e  er->pCodec);.#en
1e4b0 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 21  dif..  assert( !
1e4c0 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
1e4d0 6e 74 20 26 26 20 21 70 50 61 67 65 72 2d 3e 70  nt && !pPager->p
1e4e0 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61  InJournal );.  a
1e4f0 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70  ssert( !isOpen(p
1e500 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 21  Pager->jfd) && !
1e510 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73  isOpen(pPager->s
1e520 6a 66 64 29 20 29 3b 0a 0a 20 20 73 71 6c 69 74  jfd) );..  sqlit
1e530 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b  e3_free(pPager);
1e540 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1e550 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66  _OK;.}..#if !def
1e560 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20  ined(NDEBUG) || 
1e570 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
1e580 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  EST)./*.** Retur
1e590 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  n the page numbe
1e5a0 72 20 66 6f 72 20 70 61 67 65 20 70 50 67 2e 0a  r for page pPg..
1e5b0 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33 50  */.Pgno sqlite3P
1e5c0 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 44  agerPagenumber(D
1e5d0 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72  bPage *pPg){.  r
1e5e0 65 74 75 72 6e 20 70 50 67 2d 3e 70 67 6e 6f 3b  eturn pPg->pgno;
1e5f0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
1e600 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72   Increment the r
1e610 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66  eference count f
1e620 6f 72 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a  or page pPg..*/.
1e630 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
1e640 72 52 65 66 28 44 62 50 61 67 65 20 2a 70 50 67  rRef(DbPage *pPg
1e650 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  ){.  sqlite3Pcac
1e660 68 65 52 65 66 28 70 50 67 29 3b 0a 7d 0a 0a 2f  heRef(pPg);.}../
1e670 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f  *.** Sync the jo
1e680 75 72 6e 61 6c 2e 20 49 6e 20 6f 74 68 65 72 20  urnal. In other 
1e690 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73 75 72 65  words, make sure
1e6a0 20 61 6c 6c 20 74 68 65 20 70 61 67 65 73 20 74   all the pages t
1e6b0 68 61 74 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e  hat have.** been
1e6c0 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
1e6d0 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20 61 63 74  journal have act
1e6e0 75 61 6c 6c 79 20 72 65 61 63 68 65 64 20 74 68  ually reached th
1e6f0 65 20 73 75 72 66 61 63 65 20 6f 66 20 74 68 65  e surface of the
1e700 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 63 61 6e  .** disk and can
1e710 20 62 65 20 72 65 73 74 6f 72 65 64 20 69 6e 20   be restored in 
1e720 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20 68  the event of a h
1e730 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
1e740 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ack..**.** If th
1e750 65 20 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63  e Pager.needSync
1e760 20 66 6c 61 67 20 69 73 20 6e 6f 74 20 73 65 74   flag is not set
1e770 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63  , then this func
1e780 74 69 6f 6e 20 69 73 20 61 0a 2a 2a 20 6e 6f 2d  tion is a.** no-
1e790 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74  op. Otherwise, t
1e7a0 68 65 20 61 63 74 69 6f 6e 73 20 72 65 71 75 69  he actions requi
1e7b0 72 65 64 20 64 65 70 65 6e 64 20 6f 6e 20 74 68  red depend on th
1e7c0 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 0a 2a  e journal-mode.*
1e7d0 2a 20 61 6e 64 20 74 68 65 20 64 65 76 69 63 65  * and the device
1e7e0 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73   characteristics
1e7f0 20 6f 66 20 74 68 65 20 74 68 65 20 66 69 6c 65   of the the file
1e800 2d 73 79 73 74 65 6d 2c 20 61 73 20 66 6f 6c 6c  -system, as foll
1e810 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49  ows:.**.**   * I
1e820 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
1e830 6c 65 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f  le is an in-memo
1e840 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  ry journal file,
1e850 20 6e 6f 20 61 63 74 69 6f 6e 20 6e 65 65 64 0a   no action need.
1e860 2a 2a 20 20 20 20 20 62 65 20 74 61 6b 65 6e 2e  **     be taken.
1e870 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 4f 74 68 65 72  .**.**   * Other
1e880 77 69 73 65 2c 20 69 66 20 74 68 65 20 64 65 76  wise, if the dev
1e890 69 63 65 20 64 6f 65 73 20 6e 6f 74 20 73 75 70  ice does not sup
1e8a0 70 6f 72 74 20 74 68 65 20 53 41 46 45 5f 41 50  port the SAFE_AP
1e8b0 50 45 4e 44 20 70 72 6f 70 65 72 74 79 2c 0a 2a  PEND property,.*
1e8c0 2a 20 20 20 20 20 74 68 65 6e 20 74 68 65 20 6e  *     then the n
1e8d0 52 65 63 20 66 69 65 6c 64 20 6f 66 20 74 68 65  Rec field of the
1e8e0 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 77   most recently w
1e8f0 72 69 74 74 65 6e 20 6a 6f 75 72 6e 61 6c 20 68  ritten journal h
1e900 65 61 64 65 72 0a 2a 2a 20 20 20 20 20 69 73 20  eader.**     is 
1e910 75 70 64 61 74 65 64 20 74 6f 20 63 6f 6e 74 61  updated to conta
1e920 69 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  in the number of
1e930 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 73   journal records
1e940 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 20 20   that have.**   
1e950 20 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 66    been written f
1e960 6f 6c 6c 6f 77 69 6e 67 20 69 74 2e 20 49 66 20  ollowing it. If 
1e970 74 68 65 20 70 61 67 65 72 20 69 73 20 6f 70 65  the pager is ope
1e980 72 61 74 69 6e 67 20 69 6e 20 66 75 6c 6c 2d 73  rating in full-s
1e990 79 6e 63 0a 2a 2a 20 20 20 20 20 6d 6f 64 65 2c  ync.**     mode,
1e9a0 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   then the journa
1e9b0 6c 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64  l file is synced
1e9c0 20 62 65 66 6f 72 65 20 74 68 69 73 20 66 69 65   before this fie
1e9d0 6c 64 20 69 73 20 75 70 64 61 74 65 64 2e 0a 2a  ld is updated..*
1e9e0 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20  *.**   * If the 
1e9f0 64 65 76 69 63 65 20 64 6f 65 73 20 6e 6f 74 20  device does not 
1ea00 73 75 70 70 6f 72 74 20 74 68 65 20 53 45 51 55  support the SEQU
1ea10 45 4e 54 49 41 4c 20 70 72 6f 70 65 72 74 79 2c  ENTIAL property,
1ea20 20 74 68 65 6e 20 0a 2a 2a 20 20 20 20 20 6a 6f   then .**     jo
1ea30 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 73 79  urnal file is sy
1ea40 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20  nced..**.** Or, 
1ea50 69 6e 20 70 73 65 75 64 6f 2d 63 6f 64 65 3a 0a  in pseudo-code:.
1ea60 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 4e 4f 54 20  **.**   if( NOT 
1ea70 3c 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e  <in-memory journ
1ea80 61 6c 3e 20 29 7b 0a 2a 2a 20 20 20 20 20 69 66  al> ){.**     if
1ea90 28 20 4e 4f 54 20 53 41 46 45 5f 41 50 50 45 4e  ( NOT SAFE_APPEN
1eaa0 44 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 69 66  D ){.**       if
1eab0 28 20 3c 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64  ( <full-sync mod
1eac0 65 3e 20 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72  e> ) xSync(<jour
1ead0 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20  nal file>);.**  
1eae0 20 20 20 20 20 3c 75 70 64 61 74 65 20 6e 52 65       <update nRe
1eaf0 63 20 66 69 65 6c 64 3e 0a 2a 2a 20 20 20 20 20  c field>.**     
1eb00 7d 20 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f  } .**     if( NO
1eb10 54 20 53 45 51 55 45 4e 54 49 41 4c 20 29 20 78  T SEQUENTIAL ) x
1eb20 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69  Sync(<journal fi
1eb30 6c 65 3e 29 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a  le>);.**   }.**.
1eb40 2a 2a 20 54 68 65 20 50 61 67 65 72 2e 6e 65 65  ** The Pager.nee
1eb50 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20 6e 65  dSync flag is ne
1eb60 76 65 72 20 62 65 20 73 65 74 20 66 6f 72 20 74  ver be set for t
1eb70 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2c 20  emporary files, 
1eb80 6f 72 20 61 6e 79 0a 2a 2a 20 66 69 6c 65 20 6f  or any.** file o
1eb90 70 65 72 61 74 69 6e 67 20 69 6e 20 6e 6f 2d 73  perating in no-s
1eba0 79 6e 63 20 6d 6f 64 65 20 28 50 61 67 65 72 2e  ync mode (Pager.
1ebb0 6e 6f 53 79 6e 63 20 73 65 74 20 74 6f 20 6e 6f  noSync set to no
1ebc0 6e 2d 7a 65 72 6f 29 2e 0a 2a 2a 0a 2a 2a 20 49  n-zero)..**.** I
1ebd0 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68  f successful, th
1ebe0 69 73 20 72 6f 75 74 69 6e 65 20 63 6c 65 61 72  is routine clear
1ebf0 73 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44  s the PGHDR_NEED
1ec00 5f 53 59 4e 43 20 66 6c 61 67 20 6f 66 20 65 76  _SYNC flag of ev
1ec10 65 72 79 20 0a 2a 2a 20 70 61 67 65 20 63 75 72  ery .** page cur
1ec20 72 65 6e 74 6c 79 20 68 65 6c 64 20 69 6e 20 6d  rently held in m
1ec30 65 6d 6f 72 79 20 62 65 66 6f 72 65 20 72 65 74  emory before ret
1ec40 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b  urning SQLITE_OK
1ec50 2e 20 49 66 20 61 6e 20 49 4f 0a 2a 2a 20 65 72  . If an IO.** er
1ec60 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ror is encounter
1ec70 65 64 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20  ed, then the IO 
1ec80 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
1ec90 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61  turned to the ca
1eca0 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ller..*/.static 
1ecb0 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  int syncJournal(
1ecc0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
1ecd0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 65    if( pPager->ne
1ece0 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 61 73  edSync ){.    as
1ecf0 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74  sert( !pPager->t
1ed00 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 69  empFile );.    i
1ed10 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
1ed20 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f  alMode!=PAGER_JO
1ed30 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
1ed40 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63   ){.      int rc
1ed50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1ed60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ed70 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
1ed80 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  .      const int
1ed90 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73   iDc = sqlite3Os
1eda0 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
1edb0 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64  stics(pPager->fd
1edc0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1edd0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
1ede0 6a 66 64 29 20 29 3b 0a 0a 20 20 20 20 20 20 69  jfd) );..      i
1edf0 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54  f( 0==(iDc&SQLIT
1ee00 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50  E_IOCAP_SAFE_APP
1ee10 45 4e 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20  END) ){.        
1ee20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 64 65  /* This block de
1ee30 61 6c 73 20 77 69 74 68 20 61 6e 20 6f 62 73 63  als with an obsc
1ee40 75 72 65 20 70 72 6f 62 6c 65 6d 2e 20 49 66 20  ure problem. If 
1ee50 74 68 65 20 6c 61 73 74 20 63 6f 6e 6e 65 63 74  the last connect
1ee60 69 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ion.        ** t
1ee70 68 61 74 20 77 72 6f 74 65 20 74 6f 20 74 68 69  hat wrote to thi
1ee80 73 20 64 61 74 61 62 61 73 65 20 77 61 73 20 6f  s database was o
1ee90 70 65 72 61 74 69 6e 67 20 69 6e 20 70 65 72 73  perating in pers
1eea0 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 0a 20  istent-journal. 
1eeb0 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65 2c 20         ** mode, 
1eec0 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  then the journal
1eed0 20 66 69 6c 65 20 6d 61 79 20 61 74 20 74 68 69   file may at thi
1eee0 73 20 70 6f 69 6e 74 20 61 63 74 75 61 6c 6c 79  s point actually
1eef0 20 62 65 20 6c 61 72 67 65 72 0a 20 20 20 20 20   be larger.     
1ef00 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72     ** than Pager
1ef10 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 62 79 74 65  .journalOff byte
1ef20 73 2e 20 49 66 20 74 68 65 20 6e 65 78 74 20 74  s. If the next t
1ef30 68 69 6e 67 20 69 6e 20 74 68 65 20 6a 6f 75 72  hing in the jour
1ef40 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  nal.        ** f
1ef50 69 6c 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62  ile happens to b
1ef60 65 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64  e a journal-head
1ef70 65 72 20 28 77 72 69 74 74 65 6e 20 61 73 20 70  er (written as p
1ef80 61 72 74 20 6f 66 20 74 68 65 0a 20 20 20 20 20  art of the.     
1ef90 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 20 63     ** previous c
1efa0 6f 6e 6e 65 63 74 69 6f 6e 27 73 20 74 72 61 6e  onnection's tran
1efb0 73 61 63 74 69 6f 6e 29 2c 20 61 6e 64 20 61 20  saction), and a 
1efc0 63 72 61 73 68 20 6f 72 20 70 6f 77 65 72 2d 66  crash or power-f
1efd0 61 69 6c 75 72 65 20 0a 20 20 20 20 20 20 20 20  ailure .        
1efe0 2a 2a 20 6f 63 63 75 72 73 20 61 66 74 65 72 20  ** occurs after 
1eff0 6e 52 65 63 20 69 73 20 75 70 64 61 74 65 64 20  nRec is updated 
1f000 62 75 74 20 62 65 66 6f 72 65 20 74 68 69 73 20  but before this 
1f010 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74 65  connection write
1f020 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e  s .        ** an
1f030 79 74 68 69 6e 67 20 65 6c 73 65 20 74 6f 20 74  ything else to t
1f040 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1f050 28 6f 72 20 63 6f 6d 6d 69 74 73 2f 72 6f 6c 6c  (or commits/roll
1f060 73 20 62 61 63 6b 20 69 74 73 20 0a 20 20 20 20  s back its .    
1f070 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
1f080 6f 6e 29 2c 20 74 68 65 6e 20 53 51 4c 69 74 65  on), then SQLite
1f090 20 6d 61 79 20 62 65 63 6f 6d 65 20 63 6f 6e 66   may become conf
1f0a0 75 73 65 64 20 77 68 65 6e 20 64 6f 69 6e 67 20  used when doing 
1f0b0 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  the .        ** 
1f0c0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
1f0d0 62 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 72  back following r
1f0e0 65 63 6f 76 65 72 79 2e 20 49 74 20 6d 61 79 20  ecovery. It may 
1f0f0 72 6f 6c 6c 20 62 61 63 6b 20 61 6c 6c 0a 20 20  roll back all.  
1f100 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 69 73        ** of this
1f110 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 64 61 74   connections dat
1f120 61 2c 20 74 68 65 6e 20 70 72 6f 63 65 65 64 20  a, then proceed 
1f130 74 6f 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  to rolling back 
1f140 74 68 65 20 6f 6c 64 2c 0a 20 20 20 20 20 20 20  the old,.       
1f150 20 2a 2a 20 6f 75 74 2d 6f 66 2d 64 61 74 65 20   ** out-of-date 
1f160 64 61 74 61 20 74 68 61 74 20 66 6f 6c 6c 6f 77  data that follow
1f170 73 20 69 74 2e 20 44 61 74 61 62 61 73 65 20 63  s it. Database c
1f180 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20  orruption..     
1f190 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
1f1a0 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20   To work around 
1f1b0 74 68 69 73 2c 20 69 66 20 74 68 65 20 6a 6f 75  this, if the jou
1f1c0 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 61  rnal file does a
1f1d0 70 70 65 61 72 20 74 6f 20 63 6f 6e 74 61 69 6e  ppear to contain
1f1e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 76 61  .        ** a va
1f1f0 6c 69 64 20 68 65 61 64 65 72 20 66 6f 6c 6c 6f  lid header follo
1f200 77 69 6e 67 20 50 61 67 65 72 2e 6a 6f 75 72 6e  wing Pager.journ
1f210 61 6c 4f 66 66 2c 20 74 68 65 6e 20 77 72 69 74  alOff, then writ
1f220 65 20 61 20 30 78 30 30 0a 20 20 20 20 20 20 20  e a 0x00.       
1f230 20 2a 2a 20 62 79 74 65 20 74 6f 20 74 68 65 20   ** byte to the 
1f240 73 74 61 72 74 20 6f 66 20 69 74 20 74 6f 20 70  start of it to p
1f250 72 65 76 65 6e 74 20 69 74 20 66 72 6f 6d 20 62  revent it from b
1f260 65 69 6e 67 20 72 65 63 6f 67 6e 69 7a 65 64 2e  eing recognized.
1f270 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
1f280 20 20 20 20 2a 2a 20 56 61 72 69 61 62 6c 65 20      ** Variable 
1f290 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 20 69  iNextHdrOffset i
1f2a0 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f 66 66  s set to the off
1f2b0 73 65 74 20 61 74 20 77 68 69 63 68 20 74 68 69  set at which thi
1f2c0 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f  s.        ** pro
1f2d0 62 6c 65 6d 61 74 69 63 20 68 65 61 64 65 72 20  blematic header 
1f2e0 77 69 6c 6c 20 6f 63 63 75 72 2c 20 69 66 20 69  will occur, if i
1f2f0 74 20 65 78 69 73 74 73 2e 20 61 4d 61 67 69 63  t exists. aMagic
1f300 20 69 73 20 75 73 65 64 20 0a 20 20 20 20 20 20   is used .      
1f310 20 20 2a 2a 20 61 73 20 61 20 74 65 6d 70 6f 72    ** as a tempor
1f320 61 72 79 20 62 75 66 66 65 72 20 74 6f 20 69 6e  ary buffer to in
1f330 73 70 65 63 74 20 74 68 65 20 66 69 72 73 74 20  spect the first 
1f340 63 6f 75 70 6c 65 20 6f 66 20 62 79 74 65 73 20  couple of bytes 
1f350 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  of.        ** th
1f360 65 20 70 6f 74 65 6e 74 69 61 6c 20 6a 6f 75 72  e potential jour
1f370 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20 20 20 20  nal header..    
1f380 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
1f390 36 34 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65  64 iNextHdrOffse
1f3a0 74 3b 0a 20 20 20 20 20 20 20 20 75 38 20 61 4d  t;.        u8 aM
1f3b0 61 67 69 63 5b 38 5d 3b 0a 20 20 20 20 20 20 20  agic[8];.       
1f3c0 20 75 38 20 7a 48 65 61 64 65 72 5b 73 69 7a 65   u8 zHeader[size
1f3d0 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
1f3e0 29 2b 34 5d 3b 0a 0a 20 20 20 20 20 20 20 20 6d  )+4];..        m
1f3f0 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61  emcpy(zHeader, a
1f400 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69  JournalMagic, si
1f410 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
1f420 69 63 29 29 3b 0a 20 20 20 20 20 20 20 20 70 75  ic));.        pu
1f430 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72  t32bits(&zHeader
1f440 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
1f450 4d 61 67 69 63 29 5d 2c 20 70 50 61 67 65 72 2d  Magic)], pPager-
1f460 3e 6e 52 65 63 29 3b 0a 0a 20 20 20 20 20 20 20  >nRec);..       
1f470 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 20   iNextHdrOffset 
1f480 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73  = journalHdrOffs
1f490 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  et(pPager);.    
1f4a0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1f4b0 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a  OsRead(pPager->j
1f4c0 66 64 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 69  fd, aMagic, 8, i
1f4d0 4e 65 78 74 48 64 72 4f 66 66 73 65 74 29 3b 0a  NextHdrOffset);.
1f4e0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
1f4f0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d  SQLITE_OK && 0==
1f500 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61  memcmp(aMagic, a
1f510 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29  JournalMagic, 8)
1f520 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74   ){.          st
1f530 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 7a 65  atic const u8 ze
1f540 72 6f 62 79 74 65 20 3d 20 30 3b 0a 20 20 20 20  robyte = 0;.    
1f550 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1f560 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
1f570 2d 3e 6a 66 64 2c 20 26 7a 65 72 6f 62 79 74 65  ->jfd, &zerobyte
1f580 2c 20 31 2c 20 69 4e 65 78 74 48 64 72 4f 66 66  , 1, iNextHdrOff
1f590 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  set);.        }.
1f5a0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
1f5b0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21  SQLITE_OK && rc!
1f5c0 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  =SQLITE_IOERR_SH
1f5d0 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20  ORT_READ ){.    
1f5e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1f5f0 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
1f600 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
1f610 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 74 6f   nRec value into
1f620 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1f630 65 20 68 65 61 64 65 72 2e 20 49 66 20 69 6e 0a  e header. If in.
1f640 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c 2d          ** full-
1f650 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65  synchronous mode
1f660 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  , sync the journ
1f670 61 6c 20 66 69 72 73 74 2e 20 54 68 69 73 20 65  al first. This e
1f680 6e 73 75 72 65 73 20 74 68 61 74 0a 20 20 20 20  nsures that.    
1f690 20 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61 20      ** all data 
1f6a0 68 61 73 20 72 65 61 6c 6c 79 20 68 69 74 20 74  has really hit t
1f6b0 68 65 20 64 69 73 6b 20 62 65 66 6f 72 65 20 6e  he disk before n
1f6c0 52 65 63 20 69 73 20 75 70 64 61 74 65 64 20 74  Rec is updated t
1f6d0 6f 20 6d 61 72 6b 0a 20 20 20 20 20 20 20 20 2a  o mark.        *
1f6e0 2a 20 69 74 20 61 73 20 61 20 63 61 6e 64 69 64  * it as a candid
1f6f0 61 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b  ate for rollback
1f700 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
1f710 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20       ** This is 
1f720 6e 6f 74 20 72 65 71 75 69 72 65 64 20 69 66 20  not required if 
1f730 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 6d  the persistent m
1f740 65 64 69 61 20 73 75 70 70 6f 72 74 73 20 74 68  edia supports th
1f750 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 41 46  e.        ** SAF
1f760 45 5f 41 50 50 45 4e 44 20 70 72 6f 70 65 72 74  E_APPEND propert
1f770 79 2e 20 42 65 63 61 75 73 65 20 69 6e 20 74 68  y. Because in th
1f780 69 73 20 63 61 73 65 20 69 74 20 69 73 20 6e 6f  is case it is no
1f790 74 20 70 6f 73 73 69 62 6c 65 20 0a 20 20 20 20  t possible .    
1f7a0 20 20 20 20 2a 2a 20 66 6f 72 20 67 61 72 62 61      ** for garba
1f7b0 67 65 20 64 61 74 61 20 74 6f 20 62 65 20 61 70  ge data to be ap
1f7c0 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 66 69  pended to the fi
1f7d0 6c 65 2c 20 74 68 65 20 6e 52 65 63 20 66 69 65  le, the nRec fie
1f7e0 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73  ld.        ** is
1f7f0 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
1f800 30 78 46 46 46 46 46 46 46 46 20 77 68 65 6e 20  0xFFFFFFFF when 
1f810 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
1f820 65 72 20 69 73 20 77 72 69 74 74 65 6e 0a 20 20  er is written.  
1f830 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 6e 65 76        ** and nev
1f840 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75  er needs to be u
1f850 70 64 61 74 65 64 2e 0a 20 20 20 20 20 20 20 20  pdated..        
1f860 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  */.        if( p
1f870 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
1f880 26 26 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54  && 0==(iDc&SQLIT
1f890 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49  E_IOCAP_SEQUENTI
1f8a0 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  AL) ){.         
1f8b0 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53 59   PAGERTRACE(("SY
1f8c0 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64  NC journal of %d
1f8d0 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
1f8e0 67 65 72 29 29 29 3b 0a 20 20 20 20 20 20 20 20  ger)));.        
1f8f0 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e    IOTRACE(("JSYN
1f900 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29  C %p\n", pPager)
1f910 29 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ).          rc =
1f920 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
1f930 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
1f940 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b  er->sync_flags);
1f950 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
1f960 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
1f970 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1f980 20 20 7d 0a 20 20 20 20 20 20 20 20 49 4f 54 52    }.        IOTR
1f990 41 43 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c  ACE(("JHDR %p %l
1f9a0 6c 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  ld\n", pPager, p
1f9b0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
1f9c0 72 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  r));.        rc 
1f9d0 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
1f9e0 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50  (.            pP
1f9f0 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64  ager->jfd, zHead
1fa00 65 72 2c 20 73 69 7a 65 6f 66 28 7a 48 65 61 64  er, sizeof(zHead
1fa10 65 72 29 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  er), pPager->jou
1fa20 72 6e 61 6c 48 64 72 0a 20 20 20 20 20 20 20 20  rnalHdr.        
1fa30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
1fa40 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
1fa50 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1fa60 7d 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28  }.      if( 0==(
1fa70 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  iDc&SQLITE_IOCAP
1fa80 5f 53 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a  _SEQUENTIAL) ){.
1fa90 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41          PAGERTRA
1faa0 43 45 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61  CE(("SYNC journa
1fab0 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45  l of %d\n", PAGE
1fac0 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20  RID(pPager)));. 
1fad0 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28         IOTRACE((
1fae0 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50  "JSYNC %p\n", pP
1faf0 61 67 65 72 29 29 0a 20 20 20 20 20 20 20 20 72  ager)).        r
1fb00 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
1fb10 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  c(pPager->jfd, p
1fb20 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67  Pager->sync_flag
1fb30 73 7c 20 0a 20 20 20 20 20 20 20 20 20 20 28 70  s| .          (p
1fb40 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67  Pager->sync_flag
1fb50 73 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46  s==SQLITE_SYNC_F
1fb60 55 4c 4c 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f  ULL?SQLITE_SYNC_
1fb70 44 41 54 41 4f 4e 4c 59 3a 30 29 0a 20 20 20 20  DATAONLY:0).    
1fb80 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69      );.        i
1fb90 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1fba0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1fbb0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
1fbc0 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20   /* The journal 
1fbd0 66 69 6c 65 20 77 61 73 20 6a 75 73 74 20 73 75  file was just su
1fbe0 63 63 65 73 73 66 75 6c 6c 79 20 73 79 6e 63 65  ccessfully synce
1fbf0 64 2e 20 53 65 74 20 50 61 67 65 72 2e 6e 65 65  d. Set Pager.nee
1fc00 64 53 79 6e 63 20 0a 20 20 20 20 2a 2a 20 74 6f  dSync .    ** to
1fc10 20 7a 65 72 6f 20 61 6e 64 20 63 6c 65 61 72 20   zero and clear 
1fc20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53  the PGHDR_NEED_S
1fc30 59 4e 43 20 66 6c 61 67 20 6f 6e 20 61 6c 6c 20  YNC flag on all 
1fc40 70 61 67 65 73 73 2e 0a 20 20 20 20 2a 2f 0a 20  pagess..    */. 
1fc50 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53     pPager->needS
1fc60 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  ync = 0;.    pPa
1fc70 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72  ger->journalStar
1fc80 74 65 64 20 3d 20 31 3b 0a 20 20 20 20 70 50 61  ted = 1;.    pPa
1fc90 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
1fca0 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
1fcb0 6c 4f 66 66 3b 0a 20 20 20 20 73 71 6c 69 74 65  lOff;.    sqlite
1fcc0 33 50 63 61 63 68 65 43 6c 65 61 72 53 79 6e 63  3PcacheClearSync
1fcd0 46 6c 61 67 73 28 70 50 61 67 65 72 2d 3e 70 50  Flags(pPager->pP
1fce0 43 61 63 68 65 29 3b 0a 20 20 7d 0a 0a 20 20 72  Cache);.  }..  r
1fcf0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1fd00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72  .}../*.** The ar
1fd10 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 66 69  gument is the fi
1fd20 72 73 74 20 69 6e 20 61 20 6c 69 6e 6b 65 64 20  rst in a linked 
1fd30 6c 69 73 74 20 6f 66 20 64 69 72 74 79 20 70 61  list of dirty pa
1fd40 67 65 73 20 63 6f 6e 6e 65 63 74 65 64 0a 2a 2a  ges connected.**
1fd50 20 62 79 20 74 68 65 20 50 67 48 64 72 2e 70 44   by the PgHdr.pD
1fd60 69 72 74 79 20 70 6f 69 6e 74 65 72 2e 20 54 68  irty pointer. Th
1fd70 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74  is function writ
1fd80 65 73 20 65 61 63 68 20 6f 6e 65 20 6f 66 20 74  es each one of t
1fd90 68 65 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20  he.** in-memory 
1fda0 70 61 67 65 73 20 69 6e 20 74 68 65 20 6c 69 73  pages in the lis
1fdb0 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  t to the databas
1fdc0 65 20 66 69 6c 65 2e 20 54 68 65 20 61 72 67 75  e file. The argu
1fdd0 6d 65 6e 74 20 6d 61 79 0a 2a 2a 20 62 65 20 4e  ment may.** be N
1fde0 55 4c 4c 2c 20 72 65 70 72 65 73 65 6e 74 69 6e  ULL, representin
1fdf0 67 20 61 6e 20 65 6d 70 74 79 20 6c 69 73 74 2e  g an empty list.
1fe00 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
1fe10 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a  is function is.*
1fe20 2a 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  * a no-op..**.**
1fe30 20 54 68 65 20 70 61 67 65 72 20 6d 75 73 74 20   The pager must 
1fe40 68 6f 6c 64 20 61 74 20 6c 65 61 73 74 20 61 20  hold at least a 
1fe50 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 77 68  RESERVED lock wh
1fe60 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
1fe70 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2e 20 42  .** is called. B
1fe80 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 61 6e  efore writing an
1fe90 79 74 68 69 6e 67 20 74 6f 20 74 68 65 20 64 61  ything to the da
1fea0 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 69  tabase file, thi
1feb0 73 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 75 70 67  s lock.** is upg
1fec0 72 61 64 65 64 20 74 6f 20 61 6e 20 45 58 43 4c  raded to an EXCL
1fed0 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 74  USIVE lock. If t
1fee0 68 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62  he lock cannot b
1fef0 65 20 6f 62 74 61 69 6e 65 64 2c 0a 2a 2a 20 53  e obtained,.** S
1ff00 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65  QLITE_BUSY is re
1ff10 74 75 72 6e 65 64 20 61 6e 64 20 6e 6f 20 64 61  turned and no da
1ff20 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  ta is written to
1ff30 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1ff40 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68  le..** .** If th
1ff50 65 20 70 61 67 65 72 20 69 73 20 61 20 74 65 6d  e pager is a tem
1ff60 70 2d 66 69 6c 65 20 70 61 67 65 72 20 61 6e 64  p-file pager and
1ff70 20 74 68 65 20 61 63 74 75 61 6c 20 66 69 6c 65   the actual file
1ff80 2d 73 79 73 74 65 6d 20 66 69 6c 65 0a 2a 2a 20  -system file.** 
1ff90 69 73 20 6e 6f 74 20 79 65 74 20 6f 70 65 6e 2c  is not yet open,
1ffa0 20 69 74 20 69 73 20 63 72 65 61 74 65 64 20 61   it is created a
1ffb0 6e 64 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65  nd opened before
1ffc0 20 61 6e 79 20 64 61 74 61 20 69 73 20 0a 2a 2a   any data is .**
1ffd0 20 77 72 69 74 74 65 6e 20 6f 75 74 2e 0a 2a 2a   written out..**
1ffe0 0a 2a 2a 20 4f 6e 63 65 20 74 68 65 20 6c 6f 63  .** Once the loc
1fff0 6b 20 68 61 73 20 62 65 65 6e 20 75 70 67 72 61  k has been upgra
20000 64 65 64 20 61 6e 64 2c 20 69 66 20 6e 65 63 65  ded and, if nece
20010 73 73 61 72 79 2c 20 74 68 65 20 66 69 6c 65 20  ssary, the file 
20020 6f 70 65 6e 65 64 2c 0a 2a 2a 20 74 68 65 20 70  opened,.** the p
20030 61 67 65 73 20 61 72 65 20 77 72 69 74 74 65 6e  ages are written
20040 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61   out to the data
20050 62 61 73 65 20 66 69 6c 65 20 69 6e 20 6c 69 73  base file in lis
20060 74 20 6f 72 64 65 72 2e 20 57 72 69 74 69 6e 67  t order. Writing
20070 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20 73 6b  .** a page is sk
20080 69 70 70 65 64 20 69 66 20 69 74 20 6d 65 65 74  ipped if it meet
20090 73 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20  s either of the 
200a0 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65 72  following criter
200b0 69 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68  ia:.**.**   * Th
200c0 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
200d0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 50 61   greater than Pa
200e0 67 65 72 2e 64 62 53 69 7a 65 2c 20 6f 72 0a 2a  ger.dbSize, or.*
200f0 2a 20 20 20 2a 20 54 68 65 20 50 47 48 44 52 5f  *   * The PGHDR_
20100 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61 67 20  DONT_WRITE flag 
20110 69 73 20 73 65 74 20 6f 6e 20 74 68 65 20 70 61  is set on the pa
20120 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 69  ge..**.** If wri
20130 74 69 6e 67 20 6f 75 74 20 61 20 70 61 67 65 20  ting out a page 
20140 63 61 75 73 65 73 20 74 68 65 20 64 61 74 61 62  causes the datab
20150 61 73 65 20 66 69 6c 65 20 74 6f 20 67 72 6f 77  ase file to grow
20160 2c 20 50 61 67 65 72 2e 64 62 46 69 6c 65 53 69  , Pager.dbFileSi
20170 7a 65 0a 2a 2a 20 69 73 20 75 70 64 61 74 65 64  ze.** is updated
20180 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20 49 66   accordingly. If
20190 20 70 61 67 65 20 31 20 69 73 20 77 72 69 74 74   page 1 is writt
201a0 65 6e 20 6f 75 74 2c 20 74 68 65 6e 20 74 68 65  en out, then the
201b0 20 76 61 6c 75 65 20 63 61 63 68 65 64 0a 2a 2a   value cached.**
201c0 20 69 6e 20 50 61 67 65 72 2e 64 62 46 69 6c 65   in Pager.dbFile
201d0 56 65 72 73 5b 5d 20 69 73 20 75 70 64 61 74 65  Vers[] is update
201e0 64 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 6e  d to match the n
201f0 65 77 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20  ew value stored 
20200 69 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  in.** the databa
20210 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  se file..**.** I
20220 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20  f everything is 
20230 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49  successful, SQLI
20240 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
20250 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  d. If an IO erro
20260 72 20 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 61 6e  r .** occurs, an
20270 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
20280 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 72 2c 20  s returned. Or, 
20290 69 66 20 74 68 65 20 45 58 43 4c 55 53 49 56 45  if the EXCLUSIVE
202a0 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 0a 2a 2a 20   lock cannot.** 
202b0 62 65 20 6f 62 74 61 69 6e 65 64 2c 20 53 51 4c  be obtained, SQL
202c0 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75  ITE_BUSY is retu
202d0 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
202e0 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65 5f  int pager_write_
202f0 70 61 67 65 6c 69 73 74 28 50 61 67 65 72 20 2a  pagelist(Pager *
20300 70 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a 70  pPager, PgHdr *p
20310 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b  List){.  int rc;
20320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20340 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
20350 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f  .  /* At this po
20360 69 6e 74 20 74 68 65 72 65 20 6d 61 79 20 62 65  int there may be
20370 20 65 69 74 68 65 72 20 61 20 52 45 53 45 52 56   either a RESERV
20380 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20  ED or EXCLUSIVE 
20390 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  lock on the.  **
203a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
203b0 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72 65  If there is alre
203c0 61 64 79 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ady an EXCLUSIVE
203d0 20 6c 6f 63 6b 2c 20 74 68 65 20 66 6f 6c 6c 6f   lock, the follo
203e0 77 69 6e 67 0a 20 20 2a 2a 20 63 61 6c 6c 20 69  wing.  ** call i
203f0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2a 0a  s a no-op..  **.
20400 20 20 2a 2a 20 4d 6f 76 69 6e 67 20 74 68 65 20    ** Moving the 
20410 6c 6f 63 6b 20 66 72 6f 6d 20 52 45 53 45 52 56  lock from RESERV
20420 45 44 20 74 6f 20 45 58 43 4c 55 53 49 56 45 20  ED to EXCLUSIVE 
20430 61 63 74 75 61 6c 6c 79 20 69 6e 76 6f 6c 76 65  actually involve
20440 73 20 67 6f 69 6e 67 0a 20 20 2a 2a 20 74 68 72  s going.  ** thr
20450 6f 75 67 68 20 61 6e 20 69 6e 74 65 72 6d 65 64  ough an intermed
20460 69 61 74 65 20 73 74 61 74 65 20 50 45 4e 44 49  iate state PENDI
20470 4e 47 2e 20 20 20 41 20 50 45 4e 44 49 4e 47 20  NG.   A PENDING 
20480 6c 6f 63 6b 20 70 72 65 76 65 6e 74 73 20 6e 65  lock prevents ne
20490 77 0a 20 20 2a 2a 20 72 65 61 64 65 72 73 20 66  w.  ** readers f
204a0 72 6f 6d 20 61 74 74 61 63 68 69 6e 67 20 74 6f  rom attaching to
204b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 75   the database bu
204c0 74 20 69 73 20 75 6e 73 75 66 66 69 63 69 65 6e  t is unsufficien
204d0 74 20 66 6f 72 20 75 73 20 74 6f 0a 20 20 2a 2a  t for us to.  **
204e0 20 77 72 69 74 65 2e 20 20 54 68 65 20 69 64 65   write.  The ide
204f0 61 20 6f 66 20 61 20 50 45 4e 44 49 4e 47 20 6c  a of a PENDING l
20500 6f 63 6b 20 69 73 20 74 6f 20 70 72 65 76 65 6e  ock is to preven
20510 74 20 6e 65 77 20 72 65 61 64 65 72 73 20 66 72  t new readers fr
20520 6f 6d 0a 20 20 2a 2a 20 63 6f 6d 69 6e 67 20 69  om.  ** coming i
20530 6e 20 77 68 69 6c 65 20 77 65 20 77 61 69 74 20  n while we wait 
20540 66 6f 72 20 65 78 69 73 74 69 6e 67 20 72 65 61  for existing rea
20550 64 65 72 73 20 74 6f 20 63 6c 65 61 72 2e 0a 20  ders to clear.. 
20560 20 2a 2a 0a 20 20 2a 2a 20 57 68 69 6c 65 20 74   **.  ** While t
20570 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 74  he pager is in t
20580 68 65 20 52 45 53 45 52 56 45 44 20 73 74 61 74  he RESERVED stat
20590 65 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  e, the original 
205a0 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20  database file.  
205b0 2a 2a 20 69 73 20 75 6e 63 68 61 6e 67 65 64 20  ** is unchanged 
205c0 61 6e 64 20 77 65 20 63 61 6e 20 72 6f 6c 6c 62  and we can rollb
205d0 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69  ack without havi
205e0 6e 67 20 74 6f 20 70 6c 61 79 62 61 63 6b 20 74  ng to playback t
205f0 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  he.  ** journal 
20600 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61  into the origina
20610 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  l database file.
20620 20 20 4f 6e 63 65 20 77 65 20 74 72 61 6e 73 69    Once we transi
20630 74 69 6f 6e 20 74 6f 0a 20 20 2a 2a 20 45 58 43  tion to.  ** EXC
20640 4c 55 53 49 56 45 2c 20 69 74 20 6d 65 61 6e 73  LUSIVE, it means
20650 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
20660 6c 65 20 68 61 73 20 62 65 65 6e 20 63 68 61 6e  le has been chan
20670 67 65 64 20 61 6e 64 20 61 6e 79 20 72 6f 6c 6c  ged and any roll
20680 62 61 63 6b 0a 20 20 2a 2a 20 77 69 6c 6c 20 72  back.  ** will r
20690 65 71 75 69 72 65 20 61 20 6a 6f 75 72 6e 61 6c  equire a journal
206a0 20 70 6c 61 79 62 61 63 6b 2e 0a 20 20 2a 2f 0a   playback..  */.
206b0 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72    assert( !pager
206c0 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
206d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
206e0 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
206f0 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20 72  _RESERVED );.  r
20700 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  c = pager_wait_o
20710 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45  n_lock(pPager, E
20720 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a  XCLUSIVE_LOCK);.
20730 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c  .  /* If the fil
20740 65 20 69 73 20 61 20 74 65 6d 70 2d 66 69 6c 65  e is a temp-file
20750 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65   has not yet bee
20760 6e 20 6f 70 65 6e 65 64 2c 20 6f 70 65 6e 20 69  n opened, open i
20770 74 20 6e 6f 77 2e 20 49 74 0a 20 20 2a 2a 20 69  t now. It.  ** i
20780 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66  s not possible f
20790 6f 72 20 72 63 20 74 6f 20 62 65 20 6f 74 68 65  or rc to be othe
207a0 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b  r than SQLITE_OK
207b0 20 69 66 20 74 68 69 73 20 62 72 61 6e 63 68 0a   if this branch.
207c0 20 20 2a 2a 20 69 73 20 74 61 6b 65 6e 2c 20 61    ** is taken, a
207d0 73 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f  s pager_wait_on_
207e0 6c 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f  lock() is a no-o
207f0 70 20 66 6f 72 20 74 65 6d 70 2d 66 69 6c 65 73  p for temp-files
20800 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 69 73  ..  */.  if( !is
20810 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
20820 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
20830 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
20840 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
20850 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61  K );.    rc = pa
20860 67 65 72 4f 70 65 6e 74 65 6d 70 28 70 50 61 67  gerOpentemp(pPag
20870 65 72 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 20  er, pPager->fd, 
20880 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73  pPager->vfsFlags
20890 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 66  );.  }..  /* Bef
208a0 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 77 72  ore the first wr
208b0 69 74 65 2c 20 67 69 76 65 20 74 68 65 20 56 46  ite, give the VF
208c0 53 20 61 20 68 69 6e 74 20 6f 66 20 77 68 61 74  S a hint of what
208d0 20 74 68 65 20 66 69 6e 61 6c 0a 20 20 2a 2a 20   the final.  ** 
208e0 66 69 6c 65 20 73 69 7a 65 20 77 69 6c 6c 20 62  file size will b
208f0 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
20900 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
20910 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  || isOpen(pPager
20920 2d 3e 66 64 29 20 29 3b 0a 20 20 69 66 28 20 72  ->fd) );.  if( r
20930 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
20940 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 28  pPager->dbSize>(
20950 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
20960 7a 65 2b 31 29 20 29 7b 0a 20 20 20 20 73 71 6c  ze+1) ){.    sql
20970 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 46 69 6c  ite3_int64 szFil
20980 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65  e = pPager->page
20990 53 69 7a 65 20 2a 20 28 73 71 6c 69 74 65 33 5f  Size * (sqlite3_
209a0 69 6e 74 36 34 29 70 50 61 67 65 72 2d 3e 64 62  int64)pPager->db
209b0 53 69 7a 65 3b 0a 20 20 20 20 73 71 6c 69 74 65  Size;.    sqlite
209c0 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70  3OsFileControl(p
209d0 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54  Pager->fd, SQLIT
209e0 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e  E_FCNTL_SIZE_HIN
209f0 54 2c 20 26 73 7a 46 69 6c 65 29 3b 0a 20 20 7d  T, &szFile);.  }
20a00 0a 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53  ..  while( rc==S
20a10 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 4c 69 73  QLITE_OK && pLis
20a20 74 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67  t ){.    Pgno pg
20a30 6e 6f 20 3d 20 70 4c 69 73 74 2d 3e 70 67 6e 6f  no = pList->pgno
20a40 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
20a50 72 65 20 61 72 65 20 64 69 72 74 79 20 70 61 67  re are dirty pag
20a60 65 73 20 69 6e 20 74 68 65 20 70 61 67 65 20 63  es in the page c
20a70 61 63 68 65 20 77 69 74 68 20 70 61 67 65 20 6e  ache with page n
20a80 75 6d 62 65 72 73 20 67 72 65 61 74 65 72 0a 20  umbers greater. 
20a90 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72     ** than Pager
20aa0 2e 64 62 53 69 7a 65 2c 20 74 68 69 73 20 6d 65  .dbSize, this me
20ab0 61 6e 73 20 73 71 6c 69 74 65 33 50 61 67 65 72  ans sqlite3Pager
20ac0 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 29 20  TruncateImage() 
20ad0 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 0a 20 20  was called to.  
20ae0 20 20 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66 69    ** make the fi
20af0 6c 65 20 73 6d 61 6c 6c 65 72 20 28 70 72 65 73  le smaller (pres
20b00 75 6d 61 62 6c 79 20 62 79 20 61 75 74 6f 2d 76  umably by auto-v
20b10 61 63 75 75 6d 20 63 6f 64 65 29 2e 20 44 6f 20  acuum code). Do 
20b20 6e 6f 74 20 77 72 69 74 65 0a 20 20 20 20 2a 2a  not write.    **
20b30 20 61 6e 79 20 73 75 63 68 20 70 61 67 65 73 20   any such pages 
20b40 74 6f 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20  to the file..   
20b50 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 2c   **.    ** Also,
20b60 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 6f 75   do not write ou
20b70 74 20 61 6e 79 20 70 61 67 65 20 74 68 61 74 20  t any page that 
20b80 68 61 73 20 74 68 65 20 50 47 48 44 52 5f 44 4f  has the PGHDR_DO
20b90 4e 54 5f 57 52 49 54 45 20 66 6c 61 67 0a 20 20  NT_WRITE flag.  
20ba0 20 20 2a 2a 20 73 65 74 20 28 73 65 74 20 62 79    ** set (set by
20bb0 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e   sqlite3PagerDon
20bc0 74 57 72 69 74 65 28 29 29 2e 0a 20 20 20 20 2a  tWrite())..    *
20bd0 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d  /.    if( pgno<=
20be0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 26  pPager->dbSize &
20bf0 26 20 30 3d 3d 28 70 4c 69 73 74 2d 3e 66 6c 61  & 0==(pList->fla
20c00 67 73 26 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52  gs&PGHDR_DONT_WR
20c10 49 54 45 29 20 29 7b 0a 20 20 20 20 20 20 69 36  ITE) ){.      i6
20c20 34 20 6f 66 66 73 65 74 20 3d 20 28 70 67 6e 6f  4 offset = (pgno
20c30 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d  -1)*(i64)pPager-
20c40 3e 70 61 67 65 53 69 7a 65 3b 20 20 20 2f 2a 20  >pageSize;   /* 
20c50 4f 66 66 73 65 74 20 74 6f 20 77 72 69 74 65 20  Offset to write 
20c60 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70  */.      char *p
20c70 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20  Data;           
20c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c90 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20          /* Data 
20ca0 74 6f 20 77 72 69 74 65 20 2a 2f 20 20 20 20 0a  to write */    .
20cb0 0a 20 20 20 20 20 20 2f 2a 20 45 6e 63 6f 64 65  .      /* Encode
20cc0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   the database */
20cd0 0a 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50  .      CODEC2(pP
20ce0 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70 44 61  ager, pList->pDa
20cf0 74 61 2c 20 70 67 6e 6f 2c 20 36 2c 20 72 65 74  ta, pgno, 6, ret
20d00 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
20d10 2c 20 70 44 61 74 61 29 3b 0a 0a 20 20 20 20 20  , pData);..     
20d20 20 2f 2a 20 57 72 69 74 65 20 6f 75 74 20 74 68   /* Write out th
20d30 65 20 70 61 67 65 20 64 61 74 61 2e 20 2a 2f 0a  e page data. */.
20d40 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
20d50 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
20d60 2d 3e 66 64 2c 20 70 44 61 74 61 2c 20 70 50 61  ->fd, pData, pPa
20d70 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f  ger->pageSize, o
20d80 66 66 73 65 74 29 3b 0a 0a 20 20 20 20 20 20 2f  ffset);..      /
20d90 2a 20 49 66 20 70 61 67 65 20 31 20 77 61 73 20  * If page 1 was 
20da0 6a 75 73 74 20 77 72 69 74 74 65 6e 2c 20 75 70  just written, up
20db0 64 61 74 65 20 50 61 67 65 72 2e 64 62 46 69 6c  date Pager.dbFil
20dc0 65 56 65 72 73 20 74 6f 20 6d 61 74 63 68 0a 20  eVers to match. 
20dd0 20 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75       ** the valu
20de0 65 20 6e 6f 77 20 73 74 6f 72 65 64 20 69 6e 20  e now stored in 
20df0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
20e00 65 2e 20 49 66 20 77 72 69 74 69 6e 67 20 74 68  e. If writing th
20e10 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 70 61 67  is .      ** pag
20e20 65 20 63 61 75 73 65 64 20 74 68 65 20 64 61 74  e caused the dat
20e30 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 67 72  abase file to gr
20e40 6f 77 2c 20 75 70 64 61 74 65 20 64 62 46 69 6c  ow, update dbFil
20e50 65 53 69 7a 65 2e 20 0a 20 20 20 20 20 20 2a 2f  eSize. .      */
20e60 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3d  .      if( pgno=
20e70 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65  =1 ){.        me
20e80 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62  mcpy(&pPager->db
20e90 46 69 6c 65 56 65 72 73 2c 20 26 70 44 61 74 61  FileVers, &pData
20ea0 5b 32 34 5d 2c 20 73 69 7a 65 6f 66 28 70 50 61  [24], sizeof(pPa
20eb0 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29  ger->dbFileVers)
20ec0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
20ed0 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72   if( pgno>pPager
20ee0 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a  ->dbFileSize ){.
20ef0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
20f00 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 70 67 6e  dbFileSize = pgn
20f10 6f 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  o;.      }..    
20f20 20 20 2f 2a 20 55 70 64 61 74 65 20 61 6e 79 20    /* Update any 
20f30 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 20 63  backup objects c
20f40 6f 70 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65  opying the conte
20f50 6e 74 73 20 6f 66 20 74 68 69 73 20 70 61 67 65  nts of this page
20f60 72 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  r. */.      sqli
20f70 74 65 33 42 61 63 6b 75 70 55 70 64 61 74 65 28  te3BackupUpdate(
20f80 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c  pPager->pBackup,
20f90 20 70 67 6e 6f 2c 20 28 75 38 2a 29 70 4c 69 73   pgno, (u8*)pLis
20fa0 74 2d 3e 70 44 61 74 61 29 3b 0a 0a 20 20 20 20  t->pData);..    
20fb0 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53    PAGERTRACE(("S
20fc0 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64 20  TORE %d page %d 
20fd0 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20  hash(%08x)\n",. 
20fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ff0 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
21000 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70  ), pgno, pager_p
21010 61 67 65 68 61 73 68 28 70 4c 69 73 74 29 29 29  agehash(pList)))
21020 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28  ;.      IOTRACE(
21030 28 22 50 47 4f 55 54 20 25 70 20 25 64 5c 6e 22  ("PGOUT %p %d\n"
21040 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29  , pPager, pgno))
21050 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e  ;.      PAGER_IN
21060 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72  CR(sqlite3_pager
21070 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 29 3b  _writedb_count);
21080 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43  .      PAGER_INC
21090 52 28 70 50 61 67 65 72 2d 3e 6e 57 72 69 74 65  R(pPager->nWrite
210a0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
210b0 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28      PAGERTRACE((
210c0 22 4e 4f 53 54 4f 52 45 20 25 64 20 70 61 67 65  "NOSTORE %d page
210d0 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
210e0 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 29 29 3b  pPager), pgno));
210f0 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51  .    }.#ifdef SQ
21100 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
21110 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70 61 67 65  .    pList->page
21120 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67  Hash = pager_pag
21130 65 68 61 73 68 28 70 4c 69 73 74 29 3b 0a 23 65  ehash(pList);.#e
21140 6e 64 69 66 0a 20 20 20 20 70 4c 69 73 74 20 3d  ndif.    pList =
21150 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a   pList->pDirty;.
21160 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
21170 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 73 75 72  ;.}../*.** Ensur
21180 65 20 74 68 61 74 20 74 68 65 20 73 75 62 2d 6a  e that the sub-j
21190 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f  ournal file is o
211a0 70 65 6e 2e 20 49 66 20 69 74 20 69 73 20 61 6c  pen. If it is al
211b0 72 65 61 64 79 20 6f 70 65 6e 2c 20 74 68 69 73  ready open, this
211c0 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73   .** function is
211d0 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
211e0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
211f0 75 72 6e 65 64 20 69 66 20 65 76 65 72 79 74 68  urned if everyth
21200 69 6e 67 20 67 6f 65 73 20 61 63 63 6f 72 64 69  ing goes accordi
21210 6e 67 20 74 6f 20 70 6c 61 6e 2e 20 41 6e 20 0a  ng to plan. An .
21220 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  ** SQLITE_IOERR_
21230 58 58 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69  XXX error code i
21240 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 61 20  s returned if a 
21250 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f  call to sqlite3O
21260 73 4f 70 65 6e 28 29 20 0a 2a 2a 20 66 61 69 6c  sOpen() .** fail
21270 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
21280 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28   openSubJournal(
21290 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
212a0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
212b0 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 69 73 4f  E_OK;.  if( !isO
212c0 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  pen(pPager->sjfd
212d0 29 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  ) ){.    if( pPa
212e0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
212f0 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
21300 4f 44 45 5f 4d 45 4d 4f 52 59 20 7c 7c 20 70 50  ODE_MEMORY || pP
21310 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f  ager->subjInMemo
21320 72 79 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ry ){.      sqli
21330 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65  te3MemJournalOpe
21340 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 3b  n(pPager->sjfd);
21350 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
21360 20 20 72 63 20 3d 20 70 61 67 65 72 4f 70 65 6e    rc = pagerOpen
21370 74 65 6d 70 28 70 50 61 67 65 72 2c 20 70 50 61  temp(pPager, pPa
21380 67 65 72 2d 3e 73 6a 66 64 2c 20 53 51 4c 49 54  ger->sjfd, SQLIT
21390 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41  E_OPEN_SUBJOURNA
213a0 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  L);.    }.  }.  
213b0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
213c0 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 72 65 63  .** Append a rec
213d0 6f 72 64 20 6f 66 20 74 68 65 20 63 75 72 72 65  ord of the curre
213e0 6e 74 20 73 74 61 74 65 20 6f 66 20 70 61 67 65  nt state of page
213f0 20 70 50 67 20 74 6f 20 74 68 65 20 73 75 62 2d   pPg to the sub-
21400 6a 6f 75 72 6e 61 6c 2e 20 0a 2a 2a 20 49 74 20  journal. .** It 
21410 69 73 20 74 68 65 20 63 61 6c 6c 65 72 73 20 72  is the callers r
21420 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 74 6f  esponsibility to
21430 20 75 73 65 20 73 75 62 6a 52 65 71 75 69 72 65   use subjRequire
21440 73 50 61 67 65 28 29 20 74 6f 20 63 68 65 63 6b  sPage() to check
21450 20 0a 2a 2a 20 74 68 61 74 20 69 74 20 69 73 20   .** that it is 
21460 72 65 61 6c 6c 79 20 72 65 71 75 69 72 65 64 20  really required 
21470 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74  before calling t
21480 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
21490 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
214a0 6c 2c 20 73 65 74 20 74 68 65 20 62 69 74 20 63  l, set the bit c
214b0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
214c0 70 50 67 2d 3e 70 67 6e 6f 20 69 6e 20 74 68 65  pPg->pgno in the
214d0 20 62 69 74 76 65 63 73 0a 2a 2a 20 66 6f 72 20   bitvecs.** for 
214e0 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f 69  all open savepoi
214f0 6e 74 73 20 62 65 66 6f 72 65 20 72 65 74 75 72  nts before retur
21500 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ning..**.** This
21510 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
21520 73 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65  s SQLITE_OK if e
21530 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75 63  verything is suc
21540 63 65 73 73 66 75 6c 2c 20 61 6e 20 49 4f 0a 2a  cessful, an IO.*
21550 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  * error code if 
21560 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 77  the attempt to w
21570 72 69 74 65 20 74 6f 20 74 68 65 20 73 75 62 2d  rite to the sub-
21580 6a 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c 20 6f  journal fails, o
21590 72 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d  r .** SQLITE_NOM
215a0 45 4d 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66  EM if a malloc f
215b0 61 69 6c 73 20 77 68 69 6c 65 20 73 65 74 74 69  ails while setti
215c0 6e 67 20 61 20 62 69 74 20 69 6e 20 61 20 73 61  ng a bit in a sa
215d0 76 65 70 6f 69 6e 74 0a 2a 2a 20 62 69 74 76 65  vepoint.** bitve
215e0 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  c..*/.static int
215f0 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28   subjournalPage(
21600 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69  PgHdr *pPg){.  i
21610 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
21620 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  K;.  Pager *pPag
21630 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
21640 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
21650 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47  journalMode!=PAG
21660 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
21670 46 46 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 4f 70  FF ){..    /* Op
21680 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  en the sub-journ
21690 61 6c 2c 20 69 66 20 69 74 20 68 61 73 20 6e 6f  al, if it has no
216a0 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f  t already been o
216b0 70 65 6e 65 64 20 2a 2f 0a 20 20 20 20 61 73 73  pened */.    ass
216c0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65  ert( pPager->use
216d0 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 61  Journal );.    a
216e0 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
216f0 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 61  ager->jfd) || pa
21700 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
21710 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
21720 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
21730 73 6a 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d  sjfd) || pPager-
21740 3e 6e 53 75 62 52 65 63 3d 3d 30 20 29 3b 0a 20  >nSubRec==0 );. 
21750 20 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72     assert( pager
21760 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 0a  UseWal(pPager) .
21770 20 20 20 20 20 20 20 20 20 7c 7c 20 70 61 67 65           || page
21780 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 0a  InJournal(pPg) .
21790 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 67 2d           || pPg-
217a0 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62  >pgno>pPager->db
217b0 4f 72 69 67 53 69 7a 65 20 0a 20 20 20 20 29 3b  OrigSize .    );
217c0 0a 20 20 20 20 72 63 20 3d 20 6f 70 65 6e 53 75  .    rc = openSu
217d0 62 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  bJournal(pPager)
217e0 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
217f0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 77 61 73   sub-journal was
21800 20 6f 70 65 6e 65 64 20 73 75 63 63 65 73 73 66   opened successf
21810 75 6c 6c 79 20 28 6f 72 20 77 61 73 20 61 6c 72  ully (or was alr
21820 65 61 64 79 20 6f 70 65 6e 29 2c 0a 20 20 20 20  eady open),.    
21830 2a 2a 20 77 72 69 74 65 20 74 68 65 20 6a 6f 75  ** write the jou
21840 72 6e 61 6c 20 72 65 63 6f 72 64 20 69 6e 74 6f  rnal record into
21850 20 74 68 65 20 66 69 6c 65 2e 20 20 2a 2f 0a 20   the file.  */. 
21860 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
21870 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 76 6f  E_OK ){.      vo
21880 69 64 20 2a 70 44 61 74 61 20 3d 20 70 50 67 2d  id *pData = pPg-
21890 3e 70 44 61 74 61 3b 0a 20 20 20 20 20 20 69 36  >pData;.      i6
218a0 34 20 6f 66 66 73 65 74 20 3d 20 70 50 61 67 65  4 offset = pPage
218b0 72 2d 3e 6e 53 75 62 52 65 63 2a 28 34 2b 70 50  r->nSubRec*(4+pP
218c0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
218d0 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70 44 61  .      char *pDa
218e0 74 61 32 3b 0a 20 20 0a 20 20 20 20 20 20 43 4f  ta2;.  .      CO
218f0 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 44 61  DEC2(pPager, pDa
21900 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37  ta, pPg->pgno, 7
21910 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
21920 4e 4f 4d 45 4d 2c 20 70 44 61 74 61 32 29 3b 0a  NOMEM, pData2);.
21930 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
21940 28 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20  (("STMT-JOURNAL 
21950 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50  %d page %d\n", P
21960 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
21970 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20  pPg->pgno));.   
21980 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62     rc = write32b
21990 69 74 73 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  its(pPager->sjfd
219a0 2c 20 6f 66 66 73 65 74 2c 20 70 50 67 2d 3e 70  , offset, pPg->p
219b0 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  gno);.      if( 
219c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
219d0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
219e0 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
219f0 67 65 72 2d 3e 73 6a 66 64 2c 20 70 44 61 74 61  ger->sjfd, pData
21a00 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  2, pPager->pageS
21a10 69 7a 65 2c 20 6f 66 66 73 65 74 2b 34 29 3b 0a  ize, offset+4);.
21a20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
21a30 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
21a40 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61  TE_OK ){.    pPa
21a50 67 65 72 2d 3e 6e 53 75 62 52 65 63 2b 2b 3b 0a  ger->nSubRec++;.
21a60 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
21a70 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3e 30  er->nSavepoint>0
21a80 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 64 64   );.    rc = add
21a90 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65  ToSavepointBitve
21aa0 63 73 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  cs(pPager, pPg->
21ab0 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74  pgno);.  }.  ret
21ac0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
21ad0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
21ae0 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
21af0 70 63 61 63 68 65 20 6c 61 79 65 72 20 77 68 65  pcache layer whe
21b00 6e 20 69 74 20 68 61 73 20 72 65 61 63 68 65 64  n it has reached
21b10 20 73 6f 6d 65 0a 2a 2a 20 73 6f 66 74 20 6d 65   some.** soft me
21b20 6d 6f 72 79 20 6c 69 6d 69 74 2e 20 54 68 65 20  mory limit. The 
21b30 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69  first argument i
21b40 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
21b50 20 50 61 67 65 72 20 6f 62 6a 65 63 74 0a 2a 2a   Pager object.**
21b60 20 28 63 61 73 74 20 61 73 20 61 20 76 6f 69 64   (cast as a void
21b70 2a 29 2e 20 54 68 65 20 70 61 67 65 72 20 69 73  *). The pager is
21b80 20 61 6c 77 61 79 73 20 27 70 75 72 67 65 61 62   always 'purgeab
21b90 6c 65 27 20 28 6e 6f 74 20 61 6e 20 69 6e 2d 6d  le' (not an in-m
21ba0 65 6d 6f 72 79 0a 2a 2a 20 64 61 74 61 62 61 73  emory.** databas
21bb0 65 29 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 61  e). The second a
21bc0 72 67 75 6d 65 6e 74 20 69 73 20 61 20 72 65 66  rgument is a ref
21bd0 65 72 65 6e 63 65 20 74 6f 20 61 20 70 61 67 65  erence to a page
21be0 20 74 68 61 74 20 69 73 20 0a 2a 2a 20 63 75 72   that is .** cur
21bf0 72 65 6e 74 6c 79 20 64 69 72 74 79 20 62 75 74  rently dirty but
21c00 20 68 61 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64   has no outstand
21c10 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2e 20  ing references. 
21c20 54 68 65 20 70 61 67 65 0a 2a 2a 20 69 73 20 61  The page.** is a
21c30 6c 77 61 79 73 20 61 73 73 6f 63 69 61 74 65 64  lways associated
21c40 20 77 69 74 68 20 74 68 65 20 50 61 67 65 72 20   with the Pager 
21c50 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73  object passed as
21c60 20 74 68 65 20 66 69 72 73 74 20 0a 2a 2a 20 61   the first .** a
21c70 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  rgument..**.** T
21c80 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20 66  he job of this f
21c90 75 6e 63 74 69 6f 6e 20 69 73 20 74 6f 20 6d 61  unction is to ma
21ca0 6b 65 20 70 50 67 20 63 6c 65 61 6e 20 62 79 20  ke pPg clean by 
21cb0 77 72 69 74 69 6e 67 20 69 74 73 20 63 6f 6e 74  writing its cont
21cc0 65 6e 74 73 0a 2a 2a 20 6f 75 74 20 74 6f 20 74  ents.** out to t
21cd0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
21ce0 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2e 20 54  , if possible. T
21cf0 68 69 73 20 6d 61 79 20 69 6e 76 6f 6c 76 65 20  his may involve 
21d00 73 79 6e 63 69 6e 67 20 74 68 65 0a 2a 2a 20 6a  syncing the.** j
21d10 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 0a 2a 2a  ournal file. .**
21d20 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
21d30 6c 2c 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  l, sqlite3Pcache
21d40 4d 61 6b 65 43 6c 65 61 6e 28 29 20 69 73 20 63  MakeClean() is c
21d50 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 70 61 67  alled on the pag
21d60 65 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f  e and.** SQLITE_
21d70 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  OK returned. If 
21d80 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
21d90 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20  rs while trying 
21da0 74 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20 70  to make the.** p
21db0 61 67 65 20 63 6c 65 61 6e 2c 20 74 68 65 20 49  age clean, the I
21dc0 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  O error code is 
21dd0 72 65 74 75 72 6e 65 64 2e 20 49 66 20 74 68 65  returned. If the
21de0 20 70 61 67 65 20 63 61 6e 6e 6f 74 20 62 65 0a   page cannot be.
21df0 2a 2a 20 6d 61 64 65 20 63 6c 65 61 6e 20 66 6f  ** made clean fo
21e00 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 72 65 61  r some other rea
21e10 73 6f 6e 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f  son, but no erro
21e20 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 53  r occurs, then S
21e30 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72  QLITE_OK.** is r
21e40 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74  eturned by sqlit
21e50 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61  e3PcacheMakeClea
21e60 6e 28 29 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65  n() is not calle
21e70 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
21e80 20 70 61 67 65 72 53 74 72 65 73 73 28 76 6f 69   pagerStress(voi
21e90 64 20 2a 70 2c 20 50 67 48 64 72 20 2a 70 50 67  d *p, PgHdr *pPg
21ea0 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
21eb0 65 72 20 3d 20 28 50 61 67 65 72 20 2a 29 70 3b  er = (Pager *)p;
21ec0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
21ed0 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
21ee0 28 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70  ( pPg->pPager==p
21ef0 50 61 67 65 72 20 29 3b 0a 20 20 61 73 73 65 72  Pager );.  asser
21f00 74 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  t( pPg->flags&PG
21f10 48 44 52 5f 44 49 52 54 59 20 29 3b 0a 0a 20 20  HDR_DIRTY );..  
21f20 2f 2a 20 54 68 65 20 64 6f 4e 6f 74 53 79 6e 63  /* The doNotSync
21f30 53 70 69 6c 6c 20 66 6c 61 67 20 69 73 20 73 65  Spill flag is se
21f40 74 20 64 75 72 69 6e 67 20 74 69 6d 65 73 20 77  t during times w
21f50 68 65 6e 20 64 6f 69 6e 67 20 61 20 73 79 6e 63  hen doing a sync
21f60 20 6f 66 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c   of.  ** journal
21f70 20 28 61 6e 64 20 61 64 64 69 6e 67 20 61 20 6e   (and adding a n
21f80 65 77 20 68 65 61 64 65 72 29 20 69 73 20 6e 6f  ew header) is no
21f90 74 20 61 6c 6c 6f 77 65 64 2e 20 20 54 68 69 73  t allowed.  This
21fa0 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64 75 72   occurs.  ** dur
21fb0 69 6e 67 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c  ing calls to sql
21fc0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
21fd0 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f   while trying to
21fe0 20 6a 6f 75 72 6e 61 6c 20 6d 75 6c 74 69 70 6c   journal multipl
21ff0 65 0a 20 20 2a 2a 20 70 61 67 65 73 20 62 65 6c  e.  ** pages bel
22000 6f 6e 67 69 6e 67 20 74 6f 20 74 68 65 20 73 61  onging to the sa
22010 6d 65 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2a 0a  me sector..  **.
22020 20 20 2a 2a 20 54 68 65 20 64 6f 4e 6f 74 53 70    ** The doNotSp
22030 69 6c 6c 20 66 6c 61 67 20 69 6e 68 69 62 69 74  ill flag inhibit
22040 73 20 61 6c 6c 20 63 61 63 68 65 20 73 70 69 6c  s all cache spil
22050 6c 69 6e 67 20 72 65 67 61 72 64 6c 65 73 73 20  ling regardless 
22060 6f 66 20 77 68 65 74 68 65 72 0a 20 20 2a 2a 20  of whether.  ** 
22070 6f 72 20 6e 6f 74 20 61 20 73 79 6e 63 20 69 73  or not a sync is
22080 20 72 65 71 75 69 72 65 64 2e 20 20 54 68 69 73   required.  This
22090 20 69 73 20 73 65 74 20 64 75 72 69 6e 67 20 61   is set during a
220a0 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 2a 2a 0a   rollback..  **.
220b0 20 20 2a 2a 20 53 70 69 6c 6c 69 6e 67 20 69 73    ** Spilling is
220c0 20 61 6c 73 6f 20 69 6e 68 69 62 69 74 65 64 20   also inhibited 
220d0 77 68 65 6e 20 69 6e 20 61 6e 20 65 72 72 6f 72  when in an error
220e0 20 73 74 61 74 65 2e 0a 20 20 2a 2f 0a 20 20 69   state..  */.  i
220f0 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
22100 64 65 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  de ) return SQLI
22110 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61  TE_OK;.  if( pPa
22120 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20  ger->doNotSpill 
22130 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
22140 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  OK;.  if( pPager
22150 2d 3e 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c  ->doNotSyncSpill
22160 20 26 26 20 28 70 50 67 2d 3e 66 6c 61 67 73 20   && (pPg->flags 
22170 26 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  & PGHDR_NEED_SYN
22180 43 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  C)!=0 ){.    ret
22190 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
221a0 20 7d 0a 0a 20 20 70 50 67 2d 3e 70 44 69 72 74   }..  pPg->pDirt
221b0 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 61 67  y = 0;.  if( pag
221c0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
221d0 20 29 7b 0a 20 20 20 20 2f 2a 20 57 72 69 74 65   ){.    /* Write
221e0 20 61 20 73 69 6e 67 6c 65 20 66 72 61 6d 65 20   a single frame 
221f0 66 6f 72 20 74 68 69 73 20 70 61 67 65 20 74 6f  for this page to
22200 20 74 68 65 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20   the log. */.   
22210 20 69 66 28 20 73 75 62 6a 52 65 71 75 69 72 65   if( subjRequire
22220 73 50 61 67 65 28 70 50 67 29 20 29 7b 20 0a 20  sPage(pPg) ){ . 
22230 20 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f 75       rc = subjou
22240 72 6e 61 6c 50 61 67 65 28 70 50 67 29 3b 20 0a  rnalPage(pPg); .
22250 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
22260 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
22270 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 57       rc = pagerW
22280 61 6c 46 72 61 6d 65 73 28 70 50 61 67 65 72 2c  alFrames(pPager,
22290 20 70 50 67 2c 20 30 2c 20 30 2c 20 30 29 3b 0a   pPg, 0, 0, 0);.
222a0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
222b0 20 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68   .    /* Sync th
222c0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
222d0 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20  f required. */. 
222e0 20 20 20 69 66 28 20 70 50 67 2d 3e 66 6c 61 67     if( pPg->flag
222f0 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
22300 43 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  C ){.      asser
22310 74 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79  t( !pPager->noSy
22320 6e 63 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  nc );.      rc =
22330 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61   syncJournal(pPa
22340 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ger);.      if( 
22350 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
22360 20 0a 20 20 20 20 20 20 20 20 21 28 70 50 61 67   .        !(pPag
22370 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
22380 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
22390 44 45 5f 4d 45 4d 4f 52 59 29 20 26 26 0a 20 20  DE_MEMORY) &&.  
223a0 20 20 20 20 20 20 21 28 73 71 6c 69 74 65 33 4f        !(sqlite3O
223b0 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
223c0 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66  istics(pPager->f
223d0 64 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  d)&SQLITE_IOCAP_
223e0 53 41 46 45 5f 41 50 50 45 4e 44 29 0a 20 20 20  SAFE_APPEND).   
223f0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50     ){.        pP
22400 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a  ager->nRec = 0;.
22410 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69          rc = wri
22420 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  teJournalHdr(pPa
22430 67 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ger);.      }.  
22440 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66    }.  .    /* If
22450 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
22460 20 6f 66 20 74 68 69 73 20 70 61 67 65 20 69 73   of this page is
22470 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
22480 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   current size of
22490 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61  .    ** the data
224a0 62 61 73 65 20 69 6d 61 67 65 2c 20 69 74 20 6d  base image, it m
224b0 61 79 20 6e 65 65 64 20 74 6f 20 62 65 20 77 72  ay need to be wr
224c0 69 74 74 65 6e 20 74 6f 20 74 68 65 20 73 75 62  itten to the sub
224d0 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2a  -journal..    **
224e0 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65   This is because
224f0 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 70 61 67   the call to pag
22500 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73  er_write_pagelis
22510 74 28 29 20 62 65 6c 6f 77 20 77 69 6c 6c 20 6e  t() below will n
22520 6f 74 0a 20 20 20 20 2a 2a 20 61 63 74 75 61 6c  ot.    ** actual
22530 6c 79 20 77 72 69 74 65 20 64 61 74 61 20 74 6f  ly write data to
22540 20 74 68 65 20 66 69 6c 65 20 69 6e 20 74 68 69   the file in thi
22550 73 20 63 61 73 65 2e 0a 20 20 20 20 2a 2a 0a 20  s case..    **. 
22560 20 20 20 2a 2a 20 43 6f 6e 73 69 64 65 72 20 74     ** Consider t
22570 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 71  he following seq
22580 75 65 6e 63 65 20 6f 66 20 65 76 65 6e 74 73 3a  uence of events:
22590 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
225a0 20 42 45 47 49 4e 3b 0a 20 20 20 20 2a 2a 20 20   BEGIN;.    **  
225b0 20 20 20 3c 6a 6f 75 72 6e 61 6c 20 70 61 67 65     <journal page
225c0 20 58 3e 0a 20 20 20 20 2a 2a 20 20 20 20 20 3c   X>.    **     <
225d0 6d 6f 64 69 66 79 20 70 61 67 65 20 58 3e 0a 20  modify page X>. 
225e0 20 20 20 2a 2a 20 20 20 20 20 53 41 56 45 50 4f     **     SAVEPO
225f0 49 4e 54 20 73 70 3b 0a 20 20 20 20 2a 2a 20 20  INT sp;.    **  
22600 20 20 20 20 20 3c 73 68 72 69 6e 6b 20 64 61 74       <shrink dat
22610 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 59 20  abase file to Y 
22620 70 61 67 65 73 3e 0a 20 20 20 20 2a 2a 20 20 20  pages>.    **   
22630 20 20 20 20 70 61 67 65 72 53 74 72 65 73 73 28      pagerStress(
22640 70 61 67 65 20 58 29 0a 20 20 20 20 2a 2a 20 20  page X).    **  
22650 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73     ROLLBACK TO s
22660 70 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  p;.    **.    **
22670 20 49 66 20 28 58 3e 59 29 2c 20 74 68 65 6e 20   If (X>Y), then 
22680 77 68 65 6e 20 70 61 67 65 72 53 74 72 65 73 73  when pagerStress
22690 20 69 73 20 63 61 6c 6c 65 64 20 70 61 67 65 20   is called page 
226a0 58 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 77 72  X will not be wr
226b0 69 74 74 65 6e 0a 20 20 20 20 2a 2a 20 6f 75 74  itten.    ** out
226c0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
226d0 20 66 69 6c 65 2c 20 62 75 74 20 77 69 6c 6c 20   file, but will 
226e0 62 65 20 64 72 6f 70 70 65 64 20 66 72 6f 6d 20  be dropped from 
226f0 74 68 65 20 63 61 63 68 65 2e 20 54 68 65 6e 2c  the cache. Then,
22700 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e  .    ** followin
22710 67 20 74 68 65 20 22 52 4f 4c 4c 42 41 43 4b 20  g the "ROLLBACK 
22720 54 4f 20 73 70 22 20 73 74 61 74 65 6d 65 6e 74  TO sp" statement
22730 2c 20 72 65 61 64 69 6e 67 20 70 61 67 65 20 58  , reading page X
22740 20 77 69 6c 6c 20 72 65 61 64 0a 20 20 20 20 2a   will read.    *
22750 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20  * data from the 
22760 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54  database file. T
22770 68 69 73 20 77 69 6c 6c 20 62 65 20 74 68 65 20  his will be the 
22780 63 6f 70 79 20 6f 66 20 70 61 67 65 20 58 20 61  copy of page X a
22790 73 20 69 74 0a 20 20 20 20 2a 2a 20 77 61 73 20  s it.    ** was 
227a0 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63  when the transac
227b0 74 69 6f 6e 20 73 74 61 72 74 65 64 2c 20 6e 6f  tion started, no
227c0 74 20 61 73 20 69 74 20 77 61 73 20 77 68 65 6e  t as it was when
227d0 20 22 53 41 56 45 50 4f 49 4e 54 20 73 70 22 0a   "SAVEPOINT sp".
227e0 20 20 20 20 2a 2a 20 77 61 73 20 65 78 65 63 75      ** was execu
227f0 74 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ted..    **.    
22800 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20  ** The solution 
22810 69 73 20 74 6f 20 77 72 69 74 65 20 74 68 65 20  is to write the 
22820 63 75 72 72 65 6e 74 20 64 61 74 61 20 66 6f 72  current data for
22830 20 70 61 67 65 20 58 20 69 6e 74 6f 20 74 68 65   page X into the
22840 20 0a 20 20 20 20 2a 2a 20 73 75 62 2d 6a 6f 75   .    ** sub-jou
22850 72 6e 61 6c 20 66 69 6c 65 20 6e 6f 77 20 28 69  rnal file now (i
22860 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65  f it is not alre
22870 61 64 79 20 74 68 65 72 65 29 2c 20 73 6f 20 74  ady there), so t
22880 68 61 74 20 69 74 20 77 69 6c 6c 0a 20 20 20 20  hat it will.    
22890 2a 2a 20 62 65 20 72 65 73 74 6f 72 65 64 20 74  ** be restored t
228a0 6f 20 69 74 73 20 63 75 72 72 65 6e 74 20 76 61  o its current va
228b0 6c 75 65 20 77 68 65 6e 20 74 68 65 20 22 52 4f  lue when the "RO
228c0 4c 4c 42 41 43 4b 20 54 4f 20 73 70 22 20 69 73  LLBACK TO sp" is
228d0 20 0a 20 20 20 20 2a 2a 20 65 78 65 63 75 74 65   .    ** execute
228e0 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  d..    */.    if
228f0 28 20 4e 45 56 45 52 28 0a 20 20 20 20 20 20 20  ( NEVER(.       
22900 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
22910 26 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67  & pPg->pgno>pPag
22920 65 72 2d 3e 64 62 53 69 7a 65 20 26 26 20 73 75  er->dbSize && su
22930 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 70  bjRequiresPage(p
22940 50 67 29 0a 20 20 20 20 29 20 29 7b 0a 20 20 20  Pg).    ) ){.   
22950 20 20 20 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e     rc = subjourn
22960 61 6c 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20  alPage(pPg);.   
22970 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 57 72 69   }.  .    /* Wri
22980 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  te the contents 
22990 6f 66 20 74 68 65 20 70 61 67 65 20 6f 75 74 20  of the page out 
229a0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
229b0 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28  file. */.    if(
229c0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
229d0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
229e0 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73  er_write_pagelis
229f0 74 28 70 50 61 67 65 72 2c 20 70 50 67 29 3b 0a  t(pPager, pPg);.
22a00 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
22a10 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73  Mark the page as
22a20 20 63 6c 65 61 6e 2e 20 2a 2f 0a 20 20 69 66 28   clean. */.  if(
22a30 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
22a40 7b 0a 20 20 20 20 50 41 47 45 52 54 52 41 43 45  {.    PAGERTRACE
22a50 28 28 22 53 54 52 45 53 53 20 25 64 20 70 61 67  (("STRESS %d pag
22a60 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  e %d\n", PAGERID
22a70 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
22a80 67 6e 6f 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  gno));.    sqlit
22a90 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61  e3PcacheMakeClea
22aa0 6e 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 72  n(pPg);.  }..  r
22ab0 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f  eturn pager_erro
22ac0 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 7d  r(pPager, rc);.}
22ad0 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  .../*.** Allocat
22ae0 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  e and initialize
22af0 20 61 20 6e 65 77 20 50 61 67 65 72 20 6f 62 6a   a new Pager obj
22b00 65 63 74 20 61 6e 64 20 70 75 74 20 61 20 70 6f  ect and put a po
22b10 69 6e 74 65 72 20 74 6f 20 69 74 0a 2a 2a 20 69  inter to it.** i
22b20 6e 20 2a 70 70 50 61 67 65 72 2e 20 54 68 65 20  n *ppPager. The 
22b30 70 61 67 65 72 20 73 68 6f 75 6c 64 20 65 76 65  pager should eve
22b40 6e 74 75 61 6c 6c 79 20 62 65 20 66 72 65 65 64  ntually be freed
22b50 20 62 79 20 70 61 73 73 69 6e 67 20 69 74 0a 2a   by passing it.*
22b60 2a 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65  * to sqlite3Page
22b70 72 43 6c 6f 73 65 28 29 2e 0a 2a 2a 0a 2a 2a 20  rClose()..**.** 
22b80 54 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20 61 72  The zFilename ar
22b90 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 70 61  gument is the pa
22ba0 74 68 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  th to the databa
22bb0 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 2e  se file to open.
22bc0 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65  .** If zFilename
22bd0 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61 20   is NULL then a 
22be0 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74  randomly-named t
22bf0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73  emporary file is
22c00 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20   created.** and 
22c10 75 73 65 64 20 61 73 20 74 68 65 20 66 69 6c 65  used as the file
22c20 20 74 6f 20 62 65 20 63 61 63 68 65 64 2e 20 54   to be cached. T
22c30 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20 61  emporary files a
22c40 72 65 20 62 65 20 64 65 6c 65 74 65 64 0a 2a 2a  re be deleted.**
22c50 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77   automatically w
22c60 68 65 6e 20 74 68 65 79 20 61 72 65 20 63 6c 6f  hen they are clo
22c70 73 65 64 2e 20 49 66 20 7a 46 69 6c 65 6e 61 6d  sed. If zFilenam
22c80 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20  e is ":memory:" 
22c90 74 68 65 6e 20 0a 2a 2a 20 61 6c 6c 20 69 6e 66  then .** all inf
22ca0 6f 72 6d 61 74 69 6f 6e 20 69 73 20 68 65 6c 64  ormation is held
22cb0 20 69 6e 20 63 61 63 68 65 2e 20 49 74 20 69 73   in cache. It is
22cc0 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20 74   never written t
22cd0 6f 20 64 69 73 6b 2e 20 0a 2a 2a 20 54 68 69 73  o disk. .** This
22ce0 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20   can be used to 
22cf0 69 6d 70 6c 65 6d 65 6e 74 20 61 6e 20 69 6e 2d  implement an in-
22d00 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e  memory database.
22d10 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 45 78 74 72  .**.** The nExtr
22d20 61 20 70 61 72 61 6d 65 74 65 72 20 73 70 65 63  a parameter spec
22d30 69 66 69 65 73 20 74 68 65 20 6e 75 6d 62 65 72  ifies the number
22d40 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61   of bytes of spa
22d50 63 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20  ce allocated.** 
22d60 61 6c 6f 6e 67 20 77 69 74 68 20 65 61 63 68 20  along with each 
22d70 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e 20  page reference. 
22d80 54 68 69 73 20 73 70 61 63 65 20 69 73 20 61 76  This space is av
22d90 61 69 6c 61 62 6c 65 20 74 6f 20 74 68 65 20 75  ailable to the u
22da0 73 65 72 0a 2a 2a 20 76 69 61 20 74 68 65 20 73  ser.** via the s
22db0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
22dc0 74 72 61 28 29 20 41 50 49 2e 0a 2a 2a 0a 2a 2a  tra() API..**.**
22dd0 20 54 68 65 20 66 6c 61 67 73 20 61 72 67 75 6d   The flags argum
22de0 65 6e 74 20 69 73 20 75 73 65 64 20 74 6f 20 73  ent is used to s
22df0 70 65 63 69 66 79 20 70 72 6f 70 65 72 74 69 65  pecify propertie
22e00 73 20 74 68 61 74 20 61 66 66 65 63 74 20 74 68  s that affect th
22e10 65 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 6f  e.** operation o
22e20 66 20 74 68 65 20 70 61 67 65 72 2e 20 49 74 20  f the pager. It 
22e30 73 68 6f 75 6c 64 20 62 65 20 70 61 73 73 65 64  should be passed
22e40 20 73 6f 6d 65 20 62 69 74 77 69 73 65 20 63 6f   some bitwise co
22e50 6d 62 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20  mbination.** of 
22e60 74 68 65 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a  the PAGER_OMIT_J
22e70 4f 55 52 4e 41 4c 20 61 6e 64 20 50 41 47 45 52  OURNAL and PAGER
22e80 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 20 66 6c 61  _NO_READLOCK fla
22e90 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 66  gs..**.** The vf
22ea0 73 46 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72  sFlags parameter
22eb0 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20 74 6f   is a bitmask to
22ec0 20 70 61 73 73 20 74 6f 20 74 68 65 20 66 6c 61   pass to the fla
22ed0 67 73 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20  gs parameter.** 
22ee0 6f 66 20 74 68 65 20 78 4f 70 65 6e 28 29 20 6d  of the xOpen() m
22ef0 65 74 68 6f 64 20 6f 66 20 74 68 65 20 73 75 70  ethod of the sup
22f00 70 6c 69 65 64 20 56 46 53 20 77 68 65 6e 20 6f  plied VFS when o
22f10 70 65 6e 69 6e 67 20 66 69 6c 65 73 2e 20 0a 2a  pening files. .*
22f20 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
22f30 72 20 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f  r object is allo
22f40 63 61 74 65 64 20 61 6e 64 20 74 68 65 20 73 70  cated and the sp
22f50 65 63 69 66 69 65 64 20 66 69 6c 65 20 6f 70 65  ecified file ope
22f60 6e 65 64 20 0a 2a 2a 20 73 75 63 63 65 73 73 66  ned .** successf
22f70 75 6c 6c 79 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  ully, SQLITE_OK 
22f80 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
22f90 2a 70 70 50 61 67 65 72 20 73 65 74 20 74 6f 20  *ppPager set to 
22fa0 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20  point to.** the 
22fb0 6e 65 77 20 70 61 67 65 72 20 6f 62 6a 65 63 74  new pager object
22fc0 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
22fd0 63 75 72 73 2c 20 2a 70 70 50 61 67 65 72 20 69  curs, *ppPager i
22fe0 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a 2a  s set to NULL.**
22ff0 20 61 6e 64 20 65 72 72 6f 72 20 63 6f 64 65 20   and error code 
23000 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73 20 66  returned. This f
23010 75 6e 63 74 69 6f 6e 20 6d 61 79 20 72 65 74 75  unction may retu
23020 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a  rn SQLITE_NOMEM.
23030 2a 2a 20 28 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  ** (sqlite3Mallo
23040 63 28 29 20 69 73 20 75 73 65 64 20 74 6f 20 61  c() is used to a
23050 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 29 2c  llocate memory),
23060 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
23070 20 6f 72 20 0a 2a 2a 20 76 61 72 69 6f 75 73 20   or .** various 
23080 53 51 4c 49 54 45 5f 49 4f 5f 58 58 58 20 65 72  SQLITE_IO_XXX er
23090 72 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rors..*/.int sql
230a0 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28 0a 20  ite3PagerOpen(. 
230b0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
230c0 66 73 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  fs,       /* The
230d0 20 76 69 72 74 75 61 6c 20 66 69 6c 65 20 73 79   virtual file sy
230e0 73 74 65 6d 20 74 6f 20 75 73 65 20 2a 2f 0a 20  stem to use */. 
230f0 20 50 61 67 65 72 20 2a 2a 70 70 50 61 67 65 72   Pager **ppPager
23100 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54  ,         /* OUT
23110 3a 20 52 65 74 75 72 6e 20 74 68 65 20 50 61 67  : Return the Pag
23120 65 72 20 73 74 72 75 63 74 75 72 65 20 68 65 72  er structure her
23130 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
23140 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20  r *zFilename,   
23150 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
23160 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
23170 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  open */.  int nE
23180 78 74 72 61 2c 20 20 20 20 20 20 20 20 20 20 20  xtra,           
23190 20 20 20 2f 2a 20 45 78 74 72 61 20 62 79 74 65     /* Extra byte
231a0 73 20 61 70 70 65 6e 64 20 74 6f 20 65 61 63 68  s append to each
231b0 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20   in-memory page 
231c0 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
231d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
231e0 20 66 6c 61 67 73 20 63 6f 6e 74 72 6f 6c 6c 69   flags controlli
231f0 6e 67 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a  ng this file */.
23200 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73 2c 20    int vfsFlags, 
23210 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c             /* fl
23220 61 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75  ags passed throu
23230 67 68 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 66  gh to sqlite3_vf
23240 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 76  s.xOpen() */.  v
23250 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 29 28 44  oid (*xReinit)(D
23260 62 50 61 67 65 2a 29 20 2f 2a 20 46 75 6e 63 74  bPage*) /* Funct
23270 69 6f 6e 20 74 6f 20 72 65 69 6e 69 74 69 61 6c  ion to reinitial
23280 69 7a 65 20 70 61 67 65 73 20 2a 2f 0a 29 7b 0a  ize pages */.){.
23290 20 20 75 38 20 2a 70 50 74 72 3b 0a 20 20 50 61    u8 *pPtr;.  Pa
232a0 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 30 3b  ger *pPager = 0;
232b0 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20         /* Pager 
232c0 6f 62 6a 65 63 74 20 74 6f 20 61 6c 6c 6f 63 61  object to alloca
232d0 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f  te and return */
232e0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
232f0 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52  TE_OK;      /* R
23300 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
23310 69 6e 74 20 74 65 6d 70 46 69 6c 65 20 3d 20 30  int tempFile = 0
23320 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ;        /* True
23330 20 66 6f 72 20 74 65 6d 70 20 66 69 6c 65 73 20   for temp files 
23340 28 69 6e 63 6c 2e 20 69 6e 2d 6d 65 6d 6f 72 79  (incl. in-memory
23350 20 66 69 6c 65 73 29 20 2a 2f 0a 20 20 69 6e 74   files) */.  int
23360 20 6d 65 6d 44 62 20 3d 20 30 3b 20 20 20 20 20   memDb = 0;     
23370 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
23380 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d   this is an in-m
23390 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20  emory file */.  
233a0 69 6e 74 20 72 65 61 64 4f 6e 6c 79 20 3d 20 30  int readOnly = 0
233b0 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ;        /* True
233c0 20 69 66 20 74 68 69 73 20 69 73 20 61 20 72 65   if this is a re
233d0 61 64 2d 6f 6e 6c 79 20 66 69 6c 65 20 2a 2f 0a  ad-only file */.
233e0 20 20 69 6e 74 20 6a 6f 75 72 6e 61 6c 46 69 6c    int journalFil
233f0 65 53 69 7a 65 3b 20 20 20 20 20 2f 2a 20 42 79  eSize;     /* By
23400 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  tes to allocate 
23410 66 6f 72 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c  for each journal
23420 20 66 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a   fd */.  char *z
23430 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 20 20 20  Pathname = 0;   
23440 20 20 2f 2a 20 46 75 6c 6c 20 70 61 74 68 20 74    /* Full path t
23450 6f 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  o database file 
23460 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 74 68 6e 61  */.  int nPathna
23470 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  me = 0;       /*
23480 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
23490 20 69 6e 20 7a 50 61 74 68 6e 61 6d 65 20 2a 2f   in zPathname */
234a0 0a 20 20 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61  .  int useJourna
234b0 6c 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47  l = (flags & PAG
234c0 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29  ER_OMIT_JOURNAL)
234d0 3d 3d 30 3b 20 2f 2a 20 46 61 6c 73 65 20 74 6f  ==0; /* False to
234e0 20 6f 6d 69 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f   omit journal */
234f0 0a 20 20 69 6e 74 20 6e 6f 52 65 61 64 6c 6f 63  .  int noReadloc
23500 6b 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47  k = (flags & PAG
23510 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 29 21  ER_NO_READLOCK)!
23520 3d 30 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20  =0;  /* True to 
23530 6f 6d 69 74 20 72 65 61 64 2d 6c 6f 63 6b 20 2a  omit read-lock *
23540 2f 0a 20 20 69 6e 74 20 70 63 61 63 68 65 53 69  /.  int pcacheSi
23550 7a 65 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  ze = sqlite3Pcac
23560 68 65 53 69 7a 65 28 29 3b 20 20 20 20 20 20 20  heSize();       
23570 2f 2a 20 42 79 74 65 73 20 74 6f 20 61 6c 6c 6f  /* Bytes to allo
23580 63 61 74 65 20 66 6f 72 20 50 43 61 63 68 65 20  cate for PCache 
23590 2a 2f 0a 20 20 75 31 36 20 73 7a 50 61 67 65 44  */.  u16 szPageD
235a0 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f 44 45 46  flt = SQLITE_DEF
235b0 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20  AULT_PAGE_SIZE; 
235c0 20 2f 2a 20 44 65 66 61 75 6c 74 20 70 61 67 65   /* Default page
235d0 20 73 69 7a 65 20 2a 2f 0a 0a 20 20 2f 2a 20 46   size */..  /* F
235e0 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 75  igure out how mu
235f0 63 68 20 73 70 61 63 65 20 69 73 20 72 65 71 75  ch space is requ
23600 69 72 65 64 20 66 6f 72 20 65 61 63 68 20 6a 6f  ired for each jo
23610 75 72 6e 61 6c 20 66 69 6c 65 2d 68 61 6e 64 6c  urnal file-handl
23620 65 0a 20 20 2a 2a 20 28 74 68 65 72 65 20 61 72  e.  ** (there ar
23630 65 20 74 77 6f 20 6f 66 20 74 68 65 6d 2c 20 74  e two of them, t
23640 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
23650 61 6e 64 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  and the sub-jour
23660 6e 61 6c 29 2e 20 54 68 69 73 0a 20 20 2a 2a 20  nal). This.  ** 
23670 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 73  is the maximum s
23680 70 61 63 65 20 72 65 71 75 69 72 65 64 20 66 6f  pace required fo
23690 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a  r an in-memory j
236a0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64  ournal file hand
236b0 6c 65 20 0a 20 20 2a 2a 20 61 6e 64 20 61 20 72  le .  ** and a r
236c0 65 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 20 66  egular journal f
236d0 69 6c 65 2d 68 61 6e 64 6c 65 2e 20 4e 6f 74 65  ile-handle. Note
236e0 20 74 68 61 74 20 61 20 22 72 65 67 75 6c 61 72   that a "regular
236f0 20 6a 6f 75 72 6e 61 6c 2d 68 61 6e 64 6c 65 22   journal-handle"
23700 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20 61 20 77  .  ** may be a w
23710 72 61 70 70 65 72 20 63 61 70 61 62 6c 65 20 6f  rapper capable o
23720 66 20 63 61 63 68 69 6e 67 20 74 68 65 20 66 69  f caching the fi
23730 72 73 74 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74  rst portion of t
23740 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20  he journal.  ** 
23750 66 69 6c 65 20 69 6e 20 6d 65 6d 6f 72 79 20 74  file in memory t
23760 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  o implement the 
23770 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74  atomic-write opt
23780 69 6d 69 7a 61 74 69 6f 6e 20 28 73 65 65 20 0a  imization (see .
23790 20 20 2a 2a 20 73 6f 75 72 63 65 20 66 69 6c 65    ** source file
237a0 20 6a 6f 75 72 6e 61 6c 2e 63 29 2e 0a 20 20 2a   journal.c)..  *
237b0 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4a  /.  if( sqlite3J
237c0 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73 29  ournalSize(pVfs)
237d0 3e 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e  >sqlite3MemJourn
237e0 61 6c 53 69 7a 65 28 29 20 29 7b 0a 20 20 20 20  alSize() ){.    
237f0 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20  journalFileSize 
23800 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69 74 65 33  = ROUND8(sqlite3
23810 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73  JournalSize(pVfs
23820 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ));.  }else{.   
23830 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65   journalFileSize
23840 20 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69 74 65   = ROUND8(sqlite
23850 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a 65 28  3MemJournalSize(
23860 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  ));.  }..  /* Se
23870 74 20 74 68 65 20 6f 75 74 70 75 74 20 76 61 72  t the output var
23880 69 61 62 6c 65 20 74 6f 20 4e 55 4c 4c 20 69 6e  iable to NULL in
23890 20 63 61 73 65 20 61 6e 20 65 72 72 6f 72 20 6f   case an error o
238a0 63 63 75 72 73 2e 20 2a 2f 0a 20 20 2a 70 70 50  ccurs. */.  *ppP
238b0 61 67 65 72 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  ager = 0;..  /* 
238c0 43 6f 6d 70 75 74 65 20 61 6e 64 20 73 74 6f 72  Compute and stor
238d0 65 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e  e the full pathn
238e0 61 6d 65 20 69 6e 20 61 6e 20 61 6c 6c 6f 63 61  ame in an alloca
238f0 74 65 64 20 62 75 66 66 65 72 20 70 6f 69 6e 74  ted buffer point
23900 65 64 0a 20 20 2a 2a 20 74 6f 20 62 79 20 7a 50  ed.  ** to by zP
23910 61 74 68 6e 61 6d 65 2c 20 6c 65 6e 67 74 68 20  athname, length 
23920 6e 50 61 74 68 6e 61 6d 65 2e 20 4f 72 2c 20 69  nPathname. Or, i
23930 66 20 74 68 69 73 20 69 73 20 61 20 74 65 6d 70  f this is a temp
23940 6f 72 61 72 79 20 66 69 6c 65 2c 0a 20 20 2a 2a  orary file,.  **
23950 20 6c 65 61 76 65 20 62 6f 74 68 20 6e 50 61 74   leave both nPat
23960 68 6e 61 6d 65 20 61 6e 64 20 7a 50 61 74 68 6e  hname and zPathn
23970 61 6d 65 20 73 65 74 20 74 6f 20 30 2e 0a 20 20  ame set to 0..  
23980 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61  */.  if( zFilena
23990 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b  me && zFilename[
239a0 30 5d 20 29 7b 0a 20 20 20 20 6e 50 61 74 68 6e  0] ){.    nPathn
239b0 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61  ame = pVfs->mxPa
239c0 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 7a 50  thname+1;.    zP
239d0 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  athname = sqlite
239e0 33 4d 61 6c 6c 6f 63 28 6e 50 61 74 68 6e 61 6d  3Malloc(nPathnam
239f0 65 2a 32 29 3b 0a 20 20 20 20 69 66 28 20 7a 50  e*2);.    if( zP
23a00 61 74 68 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  athname==0 ){.  
23a10 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
23a20 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 23  E_NOMEM;.    }.#
23a30 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
23a40 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 20 20  IT_MEMORYDB.    
23a50 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69 6c 65  if( strcmp(zFile
23a60 6e 61 6d 65 2c 22 3a 6d 65 6d 6f 72 79 3a 22 29  name,":memory:")
23a70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  ==0 ){.      mem
23a80 44 62 20 3d 20 31 3b 0a 20 20 20 20 20 20 7a 50  Db = 1;.      zP
23a90 61 74 68 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b 0a  athname[0] = 0;.
23aa0 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
23ab0 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 7a 50 61  .    {.      zPa
23ac0 74 68 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b 20 2f  thname[0] = 0; /
23ad0 2a 20 4d 61 6b 65 20 73 75 72 65 20 69 6e 69 74  * Make sure init
23ae0 69 61 6c 69 7a 65 64 20 65 76 65 6e 20 69 66 20  ialized even if 
23af0 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 29 20 66  FullPathname() f
23b00 61 69 6c 73 20 2a 2f 0a 20 20 20 20 20 20 72 63  ails */.      rc
23b10 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c   = sqlite3OsFull
23b20 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a  Pathname(pVfs, z
23b30 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68 6e  Filename, nPathn
23b40 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b  ame, zPathname);
23b50 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 50 61 74  .    }..    nPat
23b60 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  hname = sqlite3S
23b70 74 72 6c 65 6e 33 30 28 7a 50 61 74 68 6e 61 6d  trlen30(zPathnam
23b80 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  e);.    if( rc==
23b90 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 50 61  SQLITE_OK && nPa
23ba0 74 68 6e 61 6d 65 2b 38 3e 70 56 66 73 2d 3e 6d  thname+8>pVfs->m
23bb0 78 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20  xPathname ){.   
23bc0 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63     /* This branc
23bd0 68 20 69 73 20 74 61 6b 65 6e 20 77 68 65 6e 20  h is taken when 
23be0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61 74 68  the journal path
23bf0 20 72 65 71 75 69 72 65 64 20 62 79 0a 20 20 20   required by.   
23c00 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61     ** the databa
23c10 73 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20  se being opened 
23c20 77 69 6c 6c 20 62 65 20 6d 6f 72 65 20 74 68 61  will be more tha
23c30 6e 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  n pVfs->mxPathna
23c40 6d 65 0a 20 20 20 20 20 20 2a 2a 20 62 79 74 65  me.      ** byte
23c50 73 20 69 6e 20 6c 65 6e 67 74 68 2e 20 54 68 69  s in length. Thi
23c60 73 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61  s means the data
23c70 62 61 73 65 20 63 61 6e 6e 6f 74 20 62 65 20 6f  base cannot be o
23c80 70 65 6e 65 64 2c 0a 20 20 20 20 20 20 2a 2a 20  pened,.      ** 
23c90 61 73 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62  as it will not b
23ca0 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6f 70  e possible to op
23cb0 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
23cc0 69 6c 65 20 6f 72 20 65 76 65 6e 0a 20 20 20 20  ile or even.    
23cd0 20 20 2a 2a 20 63 68 65 63 6b 20 66 6f 72 20 61    ** check for a
23ce0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 65 66   hot-journal bef
23cf0 6f 72 65 20 72 65 61 64 69 6e 67 2e 0a 20 20 20  ore reading..   
23d00 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
23d10 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
23d20 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
23d30 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
23d40 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
23d50 74 65 33 5f 66 72 65 65 28 7a 50 61 74 68 6e 61  te3_free(zPathna
23d60 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  me);.      retur
23d70 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  n rc;.    }.  }.
23d80 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d  .  /* Allocate m
23d90 65 6d 6f 72 79 20 66 6f 72 20 74 68 65 20 50 61  emory for the Pa
23da0 67 65 72 20 73 74 72 75 63 74 75 72 65 2c 20 50  ger structure, P
23db0 43 61 63 68 65 20 6f 62 6a 65 63 74 2c 20 74 68  Cache object, th
23dc0 65 0a 20 20 2a 2a 20 74 68 72 65 65 20 66 69 6c  e.  ** three fil
23dd0 65 20 64 65 73 63 72 69 70 74 6f 72 73 2c 20 74  e descriptors, t
23de0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
23df0 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 6a 6f   name and the jo
23e00 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65  urnal .  ** file
23e10 20 6e 61 6d 65 2e 20 54 68 65 20 6c 61 79 6f 75   name. The layou
23e20 74 20 69 6e 20 6d 65 6d 6f 72 79 20 69 73 20 61  t in memory is a
23e30 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a  s follows:.  **.
23e40 20 20 2a 2a 20 20 20 20 20 50 61 67 65 72 20 6f    **     Pager o
23e50 62 6a 65 63 74 20 20 20 20 20 20 20 20 20 20 20  bject           
23e60 20 20 20 20 20 20 20 20 20 28 73 69 7a 65 6f 66           (sizeof
23e70 28 50 61 67 65 72 29 20 62 79 74 65 73 29 0a 20  (Pager) bytes). 
23e80 20 2a 2a 20 20 20 20 20 50 43 61 63 68 65 20 6f   **     PCache o
23e90 62 6a 65 63 74 20 20 20 20 20 20 20 20 20 20 20  bject           
23ea0 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33          (sqlite3
23eb0 50 63 61 63 68 65 53 69 7a 65 28 29 20 62 79 74  PcacheSize() byt
23ec0 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 44 61 74  es).  **     Dat
23ed0 61 62 61 73 65 20 66 69 6c 65 20 68 61 6e 64 6c  abase file handl
23ee0 65 20 20 20 20 20 20 20 20 20 20 20 20 28 70 56  e            (pV
23ef0 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 62 79 74  fs->szOsFile byt
23f00 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 53 75 62  es).  **     Sub
23f10 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61  -journal file ha
23f20 6e 64 6c 65 20 20 20 20 20 20 20 20 20 28 6a 6f  ndle         (jo
23f30 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 62 79  urnalFileSize by
23f40 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 4d 61  tes).  **     Ma
23f50 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  in journal file 
23f60 68 61 6e 64 6c 65 20 20 20 20 20 20 20 20 28 6a  handle        (j
23f70 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 62  ournalFileSize b
23f80 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 44  ytes).  **     D
23f90 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d  atabase file nam
23fa0 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  e              (
23fb0 6e 50 61 74 68 6e 61 6d 65 2b 31 20 62 79 74 65  nPathname+1 byte
23fc0 73 29 0a 20 20 2a 2a 20 20 20 20 20 4a 6f 75 72  s).  **     Jour
23fd0 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 20 20  nal file name   
23fe0 20 20 20 20 20 20 20 20 20 20 20 20 28 6e 50 61              (nPa
23ff0 74 68 6e 61 6d 65 2b 38 2b 31 20 62 79 74 65 73  thname+8+1 bytes
24000 29 0a 20 20 2a 2f 0a 20 20 70 50 74 72 20 3d 20  ).  */.  pPtr = 
24010 28 75 38 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c  (u8 *)sqlite3Mal
24020 6c 6f 63 5a 65 72 6f 28 0a 20 20 20 20 52 4f 55  locZero(.    ROU
24030 4e 44 38 28 73 69 7a 65 6f 66 28 2a 70 50 61 67  ND8(sizeof(*pPag
24040 65 72 29 29 20 2b 20 20 20 20 20 20 2f 2a 20 50  er)) +      /* P
24050 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20 2a  ager structure *
24060 2f 0a 20 20 20 20 52 4f 55 4e 44 38 28 70 63 61  /.    ROUND8(pca
24070 63 68 65 53 69 7a 65 29 20 2b 20 20 20 20 20 20  cheSize) +      
24080 20 20 20 20 20 2f 2a 20 50 43 61 63 68 65 20 6f       /* PCache o
24090 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 52 4f 55  bject */.    ROU
240a0 4e 44 38 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69  ND8(pVfs->szOsFi
240b0 6c 65 29 20 2b 20 20 20 20 20 20 20 2f 2a 20 54  le) +       /* T
240c0 68 65 20 6d 61 69 6e 20 64 62 20 66 69 6c 65 20  he main db file 
240d0 2a 2f 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69  */.    journalFi
240e0 6c 65 53 69 7a 65 20 2a 20 32 20 2b 20 20 20 20  leSize * 2 +    
240f0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 77 6f        /* The two
24100 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a   journal files *
24110 2f 20 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65  / .    nPathname
24120 20 2b 20 31 20 2b 20 20 20 20 20 20 20 20 20 20   + 1 +          
24130 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61        /* zFilena
24140 6d 65 20 2a 2f 0a 20 20 20 20 6e 50 61 74 68 6e  me */.    nPathn
24150 61 6d 65 20 2b 20 38 20 2b 20 31 20 20 20 20 20  ame + 8 + 1     
24160 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4a 6f 75           /* zJou
24170 72 6e 61 6c 20 2a 2f 0a 23 69 66 6e 64 65 66 20  rnal */.#ifndef 
24180 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
24190 20 20 20 20 2b 20 6e 50 61 74 68 6e 61 6d 65 20      + nPathname 
241a0 2b 20 34 20 2b 20 31 20 20 20 20 20 20 20 20 20  + 4 + 1         
241b0 20 20 20 20 20 2f 2a 20 7a 57 61 6c 20 2a 2f 0a       /* zWal */.
241c0 23 65 6e 64 69 66 0a 20 20 29 3b 0a 20 20 61 73  #endif.  );.  as
241d0 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45  sert( EIGHT_BYTE
241e0 5f 41 4c 49 47 4e 4d 45 4e 54 28 53 51 4c 49 54  _ALIGNMENT(SQLIT
241f0 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6a 6f 75  E_INT_TO_PTR(jou
24200 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 29 20 29  rnalFileSize)) )
24210 3b 0a 20 20 69 66 28 20 21 70 50 74 72 20 29 7b  ;.  if( !pPtr ){
24220 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
24230 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  e(zPathname);.  
24240 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
24250 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 50 61  NOMEM;.  }.  pPa
24260 67 65 72 20 3d 20 20 20 20 20 20 20 20 20 20 20  ger =           
24270 20 20 20 28 50 61 67 65 72 2a 29 28 70 50 74 72     (Pager*)(pPtr
24280 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 50 43  );.  pPager->pPC
24290 61 63 68 65 20 3d 20 20 20 20 28 50 43 61 63 68  ache =    (PCach
242a0 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e  e*)(pPtr += ROUN
242b0 44 38 28 73 69 7a 65 6f 66 28 2a 70 50 61 67 65  D8(sizeof(*pPage
242c0 72 29 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  r)));.  pPager->
242d0 66 64 20 3d 20 20 20 28 73 71 6c 69 74 65 33 5f  fd =   (sqlite3_
242e0 66 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 52  file*)(pPtr += R
242f0 4f 55 4e 44 38 28 70 63 61 63 68 65 53 69 7a 65  OUND8(pcacheSize
24300 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 6a  ));.  pPager->sj
24310 66 64 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69  fd = (sqlite3_fi
24320 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55  le*)(pPtr += ROU
24330 4e 44 38 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69  ND8(pVfs->szOsFi
24340 6c 65 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  le));.  pPager->
24350 6a 66 64 20 3d 20 20 28 73 71 6c 69 74 65 33 5f  jfd =  (sqlite3_
24360 66 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 6a  file*)(pPtr += j
24370 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 3b  ournalFileSize);
24380 0a 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  .  pPager->zFile
24390 6e 61 6d 65 20 3d 20 20 20 20 28 63 68 61 72 2a  name =    (char*
243a0 29 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61  )(pPtr += journa
243b0 6c 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20 61 73  lFileSize);.  as
243c0 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45  sert( EIGHT_BYTE
243d0 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 50 61 67 65  _ALIGNMENT(pPage
243e0 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 2f 2a  r->jfd) );..  /*
243f0 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 50 61 67   Fill in the Pag
24400 65 72 2e 7a 46 69 6c 65 6e 61 6d 65 20 61 6e 64  er.zFilename and
24410 20 50 61 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c 20   Pager.zJournal 
24420 62 75 66 66 65 72 73 2c 20 69 66 20 72 65 71 75  buffers, if requ
24430 69 72 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 7a  ired. */.  if( z
24440 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20  Pathname ){.    
24450 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
24460 20 3d 20 20 20 28 63 68 61 72 2a 29 28 70 50 74   =   (char*)(pPt
24470 72 20 2b 3d 20 6e 50 61 74 68 6e 61 6d 65 20 2b  r += nPathname +
24480 20 31 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28   1);.    memcpy(
24490 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
244a0 65 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50  e, zPathname, nP
244b0 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65  athname);.    me
244c0 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f  mcpy(pPager->zJo
244d0 75 72 6e 61 6c 2c 20 7a 50 61 74 68 6e 61 6d 65  urnal, zPathname
244e0 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  , nPathname);.  
244f0 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72    memcpy(&pPager
24500 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68  ->zJournal[nPath
24510 6e 61 6d 65 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c  name], "-journal
24520 22 2c 20 38 29 3b 0a 20 20 20 20 69 66 28 20 70  ", 8);.    if( p
24530 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
24540 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  [0]==0 ){.      
24550 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
24560 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 23  [0] = 0;.    }.#
24570 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
24580 49 54 5f 57 41 4c 0a 20 20 20 20 65 6c 73 65 7b  IT_WAL.    else{
24590 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 7a  .      pPager->z
245a0 57 61 6c 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a  Wal = &pPager->z
245b0 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d  Journal[nPathnam
245c0 65 2b 38 2b 31 5d 3b 0a 20 20 20 20 20 20 6d 65  e+8+1];.      me
245d0 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 57 61  mcpy(pPager->zWa
245e0 6c 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50  l, zPathname, nP
245f0 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  athname);.      
24600 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
24610 7a 57 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c  zWal[nPathname],
24620 20 22 2d 77 61 6c 22 2c 20 34 29 3b 0a 20 20 20   "-wal", 4);.   
24630 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71   }.#endif.    sq
24640 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61 74 68  lite3_free(zPath
24650 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61  name);.  }.  pPa
24660 67 65 72 2d 3e 70 56 66 73 20 3d 20 70 56 66 73  ger->pVfs = pVfs
24670 3b 0a 20 20 70 50 61 67 65 72 2d 3e 76 66 73 46  ;.  pPager->vfsF
24680 6c 61 67 73 20 3d 20 76 66 73 46 6c 61 67 73 3b  lags = vfsFlags;
24690 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20  ..  /* Open the 
246a0 70 61 67 65 72 20 66 69 6c 65 2e 0a 20 20 2a 2f  pager file..  */
246b0 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65  .  if( zFilename
246c0 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d   && zFilename[0]
246d0 20 26 26 20 21 6d 65 6d 44 62 20 29 7b 0a 20 20   && !memDb ){.  
246e0 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b 20    int fout = 0; 
246f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24700 20 20 20 2f 2a 20 56 46 53 20 66 6c 61 67 73 20     /* VFS flags 
24710 72 65 74 75 72 6e 65 64 20 62 79 20 78 4f 70 65  returned by xOpe
24720 6e 28 29 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  n() */.    rc = 
24730 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56  sqlite3OsOpen(pV
24740 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  fs, pPager->zFil
24750 65 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e 66  ename, pPager->f
24760 64 2c 20 76 66 73 46 6c 61 67 73 2c 20 26 66 6f  d, vfsFlags, &fo
24770 75 74 29 3b 0a 20 20 20 20 72 65 61 64 4f 6e 6c  ut);.    readOnl
24780 79 20 3d 20 28 66 6f 75 74 26 53 51 4c 49 54 45  y = (fout&SQLITE
24790 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b  _OPEN_READONLY);
247a0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
247b0 66 69 6c 65 20 77 61 73 20 73 75 63 63 65 73 73  file was success
247c0 66 75 6c 6c 79 20 6f 70 65 6e 65 64 20 66 6f 72  fully opened for
247d0 20 72 65 61 64 2f 77 72 69 74 65 20 61 63 63 65   read/write acce
247e0 73 73 2c 0a 20 20 20 20 2a 2a 20 63 68 6f 6f 73  ss,.    ** choos
247f0 65 20 61 20 64 65 66 61 75 6c 74 20 70 61 67 65  e a default page
24800 20 73 69 7a 65 20 69 6e 20 63 61 73 65 20 77 65   size in case we
24810 20 68 61 76 65 20 74 6f 20 63 72 65 61 74 65 20   have to create 
24820 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  the.    ** datab
24830 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 64 65  ase file. The de
24840 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20  fault page size 
24850 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f  is the maximum o
24860 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  f:.    **.    **
24870 20 20 20 20 2b 20 53 51 4c 49 54 45 5f 44 45 46      + SQLITE_DEF
24880 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 2c 0a  AULT_PAGE_SIZE,.
24890 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 65 20      **    + The 
248a0 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
248b0 79 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f  y sqlite3OsSecto
248c0 72 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20 20  rSize().    **  
248d0 20 20 2b 20 54 68 65 20 6c 61 72 67 65 73 74 20    + The largest 
248e0 70 61 67 65 20 73 69 7a 65 20 74 68 61 74 20 63  page size that c
248f0 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61 74  an be written at
24900 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20 20 20 2a 2f  omically..    */
24910 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
24920 49 54 45 5f 4f 4b 20 26 26 20 21 72 65 61 64 4f  ITE_OK && !readO
24930 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 73 65 74  nly ){.      set
24940 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65  SectorSize(pPage
24950 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  r);.      assert
24960 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f  (SQLITE_DEFAULT_
24970 50 41 47 45 5f 53 49 5a 45 3c 3d 53 51 4c 49 54  PAGE_SIZE<=SQLIT
24980 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41  E_MAX_DEFAULT_PA
24990 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20  GE_SIZE);.      
249a0 69 66 28 20 73 7a 50 61 67 65 44 66 6c 74 3c 70  if( szPageDflt<p
249b0 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
249c0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  e ){.        if(
249d0 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
249e0 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 44  ize>SQLITE_MAX_D
249f0 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
24a00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 7a   ){.          sz
24a10 50 61 67 65 44 66 6c 74 20 3d 20 53 51 4c 49 54  PageDflt = SQLIT
24a20 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41  E_MAX_DEFAULT_PA
24a30 47 45 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 20  GE_SIZE;.       
24a40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
24a50 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 28    szPageDflt = (
24a60 75 31 36 29 70 50 61 67 65 72 2d 3e 73 65 63 74  u16)pPager->sect
24a70 6f 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  orSize;.        
24a80 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66 64 65 66  }.      }.#ifdef
24a90 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
24aa0 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20  TOMIC_WRITE.    
24ab0 20 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20    {.        int 
24ac0 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44  iDc = sqlite3OsD
24ad0 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
24ae0 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29  tics(pPager->fd)
24af0 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 69  ;.        int ii
24b00 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
24b10 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54  (SQLITE_IOCAP_AT
24b20 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38  OMIC512==(512>>8
24b30 29 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ));.        asse
24b40 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  rt(SQLITE_IOCAP_
24b50 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33  ATOMIC64K==(6553
24b60 36 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20 20 20  6>>8));.        
24b70 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 4d 41  assert(SQLITE_MA
24b80 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  X_DEFAULT_PAGE_S
24b90 49 5a 45 3c 3d 36 35 35 33 36 29 3b 0a 20 20 20  IZE<=65536);.   
24ba0 20 20 20 20 20 66 6f 72 28 69 69 3d 73 7a 50 61       for(ii=szPa
24bb0 67 65 44 66 6c 74 3b 20 69 69 3c 3d 53 51 4c 49  geDflt; ii<=SQLI
24bc0 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50  TE_MAX_DEFAULT_P
24bd0 41 47 45 5f 53 49 5a 45 3b 20 69 69 3d 69 69 2a  AGE_SIZE; ii=ii*
24be0 32 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  2){.          if
24bf0 28 20 69 44 63 26 28 53 51 4c 49 54 45 5f 49 4f  ( iDc&(SQLITE_IO
24c00 43 41 50 5f 41 54 4f 4d 49 43 7c 28 69 69 3e 3e  CAP_ATOMIC|(ii>>
24c10 38 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  8)) ){.         
24c20 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20     szPageDflt = 
24c30 69 69 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ii;.          }.
24c40 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
24c50 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  }.#endif.    }. 
24c60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
24c70 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  f a temporary fi
24c80 6c 65 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  le is requested,
24c90 20 69 74 20 69 73 20 6e 6f 74 20 6f 70 65 6e 65   it is not opene
24ca0 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20  d immediately.. 
24cb0 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61     ** In this ca
24cc0 73 65 20 77 65 20 61 63 63 65 70 74 20 74 68 65  se we accept the
24cd0 20 64 65 66 61 75 6c 74 20 70 61 67 65 20 73 69   default page si
24ce0 7a 65 20 61 6e 64 20 64 65 6c 61 79 20 61 63 74  ze and delay act
24cf0 75 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 6f 70 65  ually.    ** ope
24d00 6e 69 6e 67 20 74 68 65 20 66 69 6c 65 20 75 6e  ning the file un
24d10 74 69 6c 20 74 68 65 20 66 69 72 73 74 20 63 61  til the first ca
24d20 6c 6c 20 74 6f 20 4f 73 57 72 69 74 65 28 29 2e  ll to OsWrite().
24d30 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
24d40 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 61 6c  his branch is al
24d50 73 6f 20 72 75 6e 20 66 6f 72 20 61 6e 20 69 6e  so run for an in
24d60 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
24d70 2e 20 41 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 20  . An in-memory. 
24d80 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69     ** database i
24d90 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 61 20  s the same as a 
24da0 74 65 6d 70 2d 66 69 6c 65 20 74 68 61 74 20 69  temp-file that i
24db0 73 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20  s never written 
24dc0 6f 75 74 20 74 6f 0a 20 20 20 20 2a 2a 20 64 69  out to.    ** di
24dd0 73 6b 20 61 6e 64 20 75 73 65 73 20 61 6e 20 69  sk and uses an i
24de0 6e 2d 6d 65 6d 6f 72 79 20 72 6f 6c 6c 62 61 63  n-memory rollbac
24df0 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a  k journal..    *
24e00 2f 20 0a 20 20 20 20 74 65 6d 70 46 69 6c 65 20  / .    tempFile 
24e10 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 1;.    pPager-
24e20 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45  >state = PAGER_E
24e30 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20 72 65  XCLUSIVE;.    re
24e40 61 64 4f 6e 6c 79 20 3d 20 28 76 66 73 46 6c 61  adOnly = (vfsFla
24e50 67 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  gs&SQLITE_OPEN_R
24e60 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 7d 0a 0a 20  EADONLY);.  }.. 
24e70 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
24e80 67 20 63 61 6c 6c 20 74 6f 20 50 61 67 65 72 53  g call to PagerS
24e90 65 74 50 61 67 65 73 69 7a 65 28 29 20 73 65 72  etPagesize() ser
24ea0 76 65 73 20 74 6f 20 73 65 74 20 74 68 65 20 76  ves to set the v
24eb0 61 6c 75 65 20 6f 66 20 0a 20 20 2a 2a 20 50 61  alue of .  ** Pa
24ec0 67 65 72 2e 70 61 67 65 53 69 7a 65 20 61 6e 64  ger.pageSize and
24ed0 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 74 68 65   to allocate the
24ee0 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65   Pager.pTmpSpace
24ef0 20 62 75 66 66 65 72 2e 0a 20 20 2a 2f 0a 20 20   buffer..  */.  
24f00 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
24f10 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
24f20 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d   pPager->memDb==
24f30 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  0 );.    rc = sq
24f40 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67  lite3PagerSetPag
24f50 65 73 69 7a 65 28 70 50 61 67 65 72 2c 20 26 73  esize(pPager, &s
24f60 7a 50 61 67 65 44 66 6c 74 2c 20 2d 31 29 3b 0a  zPageDflt, -1);.
24f70 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
24f80 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
24f90 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65   }..  /* If an e
24fa0 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 69 6e  rror occurred in
24fb0 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 62   either of the b
24fc0 6c 6f 63 6b 73 20 61 62 6f 76 65 2c 20 66 72 65  locks above, fre
24fd0 65 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67 65  e the .  ** Page
24fe0 72 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  r structure and 
24ff0 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 2e 0a  close the file..
25000 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 21 3d 53    */.  if( rc!=S
25010 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
25020 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
25030 3e 70 54 6d 70 53 70 61 63 65 20 29 3b 0a 20 20  >pTmpSpace );.  
25040 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
25050 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  (pPager->fd);.  
25060 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
25070 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75  Pager);.    retu
25080 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rn rc;.  }..  /*
25090 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
250a0 50 43 61 63 68 65 20 6f 62 6a 65 63 74 2e 20 2a  PCache object. *
250b0 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 45 78 74  /.  assert( nExt
250c0 72 61 3c 31 30 30 30 20 29 3b 0a 20 20 6e 45 78  ra<1000 );.  nEx
250d0 74 72 61 20 3d 20 52 4f 55 4e 44 38 28 6e 45 78  tra = ROUND8(nEx
250e0 74 72 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  tra);.  sqlite3P
250f0 63 61 63 68 65 4f 70 65 6e 28 73 7a 50 61 67 65  cacheOpen(szPage
25100 44 66 6c 74 2c 20 6e 45 78 74 72 61 2c 20 21 6d  Dflt, nExtra, !m
25110 65 6d 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20  emDb,.          
25120 20 20 20 20 20 20 20 20 20 20 21 6d 65 6d 44 62            !memDb
25130 3f 70 61 67 65 72 53 74 72 65 73 73 3a 30 2c 20  ?pagerStress:0, 
25140 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72 2c 20  (void *)pPager, 
25150 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
25160 3b 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 28  ;..  PAGERTRACE(
25170 28 22 4f 50 45 4e 20 25 64 20 25 73 5c 6e 22 2c  ("OPEN %d %s\n",
25180 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 70 50   FILEHANDLEID(pP
25190 61 67 65 72 2d 3e 66 64 29 2c 20 70 50 61 67 65  ager->fd), pPage
251a0 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a  r->zFilename));.
251b0 20 20 49 4f 54 52 41 43 45 28 28 22 4f 50 45 4e    IOTRACE(("OPEN
251c0 20 25 70 20 25 73 5c 6e 22 2c 20 70 50 61 67 65   %p %s\n", pPage
251d0 72 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  r, pPager->zFile
251e0 6e 61 6d 65 29 29 0a 0a 20 20 70 50 61 67 65 72  name))..  pPager
251f0 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28  ->useJournal = (
25200 75 38 29 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20  u8)useJournal;. 
25210 20 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c   pPager->noReadl
25220 6f 63 6b 20 3d 20 28 6e 6f 52 65 61 64 6c 6f 63  ock = (noReadloc
25230 6b 20 26 26 20 72 65 61 64 4f 6e 6c 79 29 20 3f  k && readOnly) ?
25240 31 3a 30 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72  1:0;.  /* pPager
25250 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 20  ->stmtOpen = 0; 
25260 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
25270 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 20 2a  stmtInUse = 0; *
25280 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e  /.  /* pPager->n
25290 52 65 66 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50  Ref = 0; */.  pP
252a0 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69  ager->dbSizeVali
252b0 64 20 3d 20 28 75 38 29 6d 65 6d 44 62 3b 0a 20  d = (u8)memDb;. 
252c0 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74   /* pPager->stmt
252d0 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  Size = 0; */.  /
252e0 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53  * pPager->stmtJS
252f0 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  ize = 0; */.  /*
25300 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d   pPager->nPage =
25310 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
25320 3e 6d 78 50 67 6e 6f 20 3d 20 53 51 4c 49 54 45  >mxPgno = SQLITE
25330 5f 4d 41 58 5f 50 41 47 45 5f 43 4f 55 4e 54 3b  _MAX_PAGE_COUNT;
25340 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74  .  /* pPager->st
25350 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f  ate = PAGER_UNLO
25360 43 4b 3b 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  CK; */.  assert(
25370 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
25380 3d 20 28 74 65 6d 70 46 69 6c 65 20 3f 20 50 41  = (tempFile ? PA
25390 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 3a 20  GER_EXCLUSIVE : 
253a0 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 29 20 29 3b  PAGER_UNLOCK) );
253b0 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72  .  /* pPager->er
253c0 72 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f 0a 20 20  rMask = 0; */.  
253d0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
253e0 20 3d 20 28 75 38 29 74 65 6d 70 46 69 6c 65 3b   = (u8)tempFile;
253f0 0a 20 20 61 73 73 65 72 74 28 20 74 65 6d 70 46  .  assert( tempF
25400 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49  ile==PAGER_LOCKI
25410 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 0a 20  NGMODE_NORMAL . 
25420 20 20 20 20 20 20 20 20 20 7c 7c 20 74 65 6d 70           || temp
25430 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b  File==PAGER_LOCK
25440 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56  INGMODE_EXCLUSIV
25450 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50  E );.  assert( P
25460 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
25470 5f 45 58 43 4c 55 53 49 56 45 3d 3d 31 20 29 3b  _EXCLUSIVE==1 );
25480 0a 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  .  pPager->exclu
25490 73 69 76 65 4d 6f 64 65 20 3d 20 28 75 38 29 74  siveMode = (u8)t
254a0 65 6d 70 46 69 6c 65 3b 20 0a 20 20 70 50 61 67  empFile; .  pPag
254b0 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
254c0 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65  one = pPager->te
254d0 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72  mpFile;.  pPager
254e0 2d 3e 6d 65 6d 44 62 20 3d 20 28 75 38 29 6d 65  ->memDb = (u8)me
254f0 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e 72  mDb;.  pPager->r
25500 65 61 64 4f 6e 6c 79 20 3d 20 28 75 38 29 72 65  eadOnly = (u8)re
25510 61 64 4f 6e 6c 79 3b 0a 20 20 2f 2a 20 70 50 61  adOnly;.  /* pPa
25520 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
25530 30 3b 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  0; */.  assert( 
25540 75 73 65 4a 6f 75 72 6e 61 6c 20 7c 7c 20 70 50  useJournal || pP
25550 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
25560 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  ;.  pPager->noSy
25570 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d  nc = pPager->tem
25580 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d  pFile;.  pPager-
25590 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 70 50 61 67  >fullSync = pPag
255a0 65 72 2d 3e 6e 6f 53 79 6e 63 20 3f 30 3a 31 3b  er->noSync ?0:1;
255b0 0a 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f  .  pPager->sync_
255c0 66 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53  flags = SQLITE_S
255d0 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 2f 2a  YNC_NORMAL;.  /*
255e0 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20   pPager->pFirst 
255f0 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
25600 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
25610 64 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  d = 0; */.  /* p
25620 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30  Pager->pLast = 0
25630 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e  ; */.  pPager->n
25640 45 78 74 72 61 20 3d 20 28 75 31 36 29 6e 45 78  Extra = (u16)nEx
25650 74 72 61 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a  tra;.  pPager->j
25660 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20  ournalSizeLimit 
25670 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  = SQLITE_DEFAULT
25680 5f 4a 4f 55 52 4e 41 4c 5f 53 49 5a 45 5f 4c 49  _JOURNAL_SIZE_LI
25690 4d 49 54 3b 0a 20 20 61 73 73 65 72 74 28 20 69  MIT;.  assert( i
256a0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
256b0 29 20 7c 7c 20 74 65 6d 70 46 69 6c 65 20 29 3b  ) || tempFile );
256c0 0a 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65  .  setSectorSize
256d0 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
256e0 21 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  !useJournal ){. 
256f0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
25700 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a  alMode = PAGER_J
25710 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 3b 0a  OURNALMODE_OFF;.
25720 20 20 7d 65 6c 73 65 20 69 66 28 20 6d 65 6d 44    }else if( memD
25730 62 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  b ){.    pPager-
25740 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50  >journalMode = P
25750 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
25760 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20 2f  _MEMORY;.  }.  /
25770 2a 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48  * pPager->xBusyH
25780 61 6e 64 6c 65 72 20 3d 20 30 3b 20 2a 2f 0a 20  andler = 0; */. 
25790 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 42 75 73   /* pPager->pBus
257a0 79 48 61 6e 64 6c 65 72 41 72 67 20 3d 20 30 3b  yHandlerArg = 0;
257b0 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 78 52   */.  pPager->xR
257c0 65 69 6e 69 74 65 72 20 3d 20 78 52 65 69 6e 69  einiter = xReini
257d0 74 3b 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70  t;.  /* memset(p
257e0 50 61 67 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c  Pager->aHash, 0,
257f0 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e   sizeof(pPager->
25800 61 48 61 73 68 29 29 3b 20 2a 2f 0a 0a 20 20 2a  aHash)); */..  *
25810 70 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72  ppPager = pPager
25820 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
25830 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a  E_OK;.}..../*.**
25840 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
25850 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 74  s called after t
25860 72 61 6e 73 69 74 69 6f 6e 69 6e 67 20 66 72 6f  ransitioning fro
25870 6d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 74  m PAGER_UNLOCK t
25880 6f 0a 2a 2a 20 50 41 47 45 52 5f 53 48 41 52 45  o.** PAGER_SHARE
25890 44 20 73 74 61 74 65 2e 20 49 74 20 74 65 73 74  D state. It test
258a0 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  s if there is a 
258b0 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 70 72 65 73  hot journal pres
258c0 65 6e 74 20 69 6e 0a 2a 2a 20 74 68 65 20 66 69  ent in.** the fi
258d0 6c 65 2d 73 79 73 74 65 6d 20 66 6f 72 20 74 68  le-system for th
258e0 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e 20 41  e given pager. A
258f0 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20   hot journal is 
25900 6f 6e 65 20 74 68 61 74 20 0a 2a 2a 20 6e 65 65  one that .** nee
25910 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20  ds to be played 
25920 62 61 63 6b 2e 20 41 63 63 6f 72 64 69 6e 67 20  back. According 
25930 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
25940 2c 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a  , a hot-journal.
25950 2a 2a 20 66 69 6c 65 20 65 78 69 73 74 73 20 69  ** file exists i
25960 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
25970 63 72 69 74 65 72 69 61 20 61 72 65 20 6d 65 74  criteria are met
25980 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20  :.**.**   * The 
25990 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69  journal file exi
259a0 73 74 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20  sts in the file 
259b0 73 79 73 74 65 6d 2c 20 61 6e 64 0a 2a 2a 20 20  system, and.**  
259c0 20 2a 20 4e 6f 20 70 72 6f 63 65 73 73 20 68 6f   * No process ho
259d0 6c 64 73 20 61 20 52 45 53 45 52 56 45 44 20 6f  lds a RESERVED o
259e0 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f  r greater lock o
259f0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
25a00 69 6c 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20  ile, and.**   * 
25a10 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  The database fil
25a20 65 20 69 74 73 65 6c 66 20 69 73 20 67 72 65 61  e itself is grea
25a30 74 65 72 20 74 68 61 6e 20 30 20 62 79 74 65 73  ter than 0 bytes
25a40 20 69 6e 20 73 69 7a 65 2c 20 61 6e 64 0a 2a 2a   in size, and.**
25a50 20 20 20 2a 20 54 68 65 20 66 69 72 73 74 20 62     * The first b
25a60 79 74 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  yte of the journ
25a70 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 61  al file exists a
25a80 6e 64 20 69 73 20 6e 6f 74 20 30 78 30 30 2e 0a  nd is not 0x00..
25a90 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72  **.** If the cur
25aa0 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65  rent size of the
25ab0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
25ac0 73 20 30 20 62 75 74 20 61 20 6a 6f 75 72 6e 61  s 0 but a journa
25ad0 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69 73 74 73  l file.** exists
25ae0 2c 20 74 68 61 74 20 69 73 20 70 72 6f 62 61 62  , that is probab
25af0 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61  ly an old journa
25b00 6c 20 6c 65 66 74 20 6f 76 65 72 20 66 72 6f 6d  l left over from
25b10 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64 61 74 61   a prior.** data
25b20 62 61 73 65 20 77 69 74 68 20 74 68 65 20 73 61  base with the sa
25b30 6d 65 20 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73  me name. In this
25b40 20 63 61 73 65 20 74 68 65 20 6a 6f 75 72 6e 61   case the journa
25b50 6c 20 66 69 6c 65 20 69 73 0a 2a 2a 20 6a 75 73  l file is.** jus
25b60 74 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20  t deleted using 
25b70 4f 73 44 65 6c 65 74 65 2c 20 2a 70 45 78 69 73  OsDelete, *pExis
25b80 74 73 20 69 73 20 73 65 74 20 74 6f 20 30 20 61  ts is set to 0 a
25b90 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  nd SQLITE_OK.** 
25ba0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
25bb0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
25bc0 64 6f 65 73 20 6e 6f 74 20 63 68 65 63 6b 20 69  does not check i
25bd0 66 20 74 68 65 72 65 20 69 73 20 61 20 6d 61 73  f there is a mas
25be0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
25bf0 6e 61 6d 65 0a 2a 2a 20 61 74 20 74 68 65 20 65  name.** at the e
25c00 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 20  nd of the file. 
25c10 49 66 20 74 68 65 72 65 20 69 73 2c 20 61 6e 64  If there is, and
25c20 20 74 68 61 74 20 6d 61 73 74 65 72 20 6a 6f 75   that master jou
25c30 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 64 6f 65  rnal file.** doe
25c40 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68 65  s not exist, the
25c50 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
25c60 6c 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79  le is not really
25c70 20 68 6f 74 2e 20 49 6e 20 74 68 69 73 0a 2a 2a   hot. In this.**
25c80 20 63 61 73 65 20 74 68 69 73 20 72 6f 75 74 69   case this routi
25c90 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 61  ne will return a
25ca0 20 66 61 6c 73 65 2d 70 6f 73 69 74 69 76 65 2e   false-positive.
25cb0 20 54 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62   The pager_playb
25cc0 61 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  ack().** routine
25cd0 20 77 69 6c 6c 20 64 69 73 63 6f 76 65 72 20 74   will discover t
25ce0 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
25cf0 66 69 6c 65 20 69 73 20 6e 6f 74 20 72 65 61 6c  file is not real
25d00 6c 79 20 68 6f 74 20 61 6e 64 20 0a 2a 2a 20 77  ly hot and .** w
25d10 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20 69 74 20  ill not roll it 
25d20 62 61 63 6b 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  back. .**.** If 
25d30 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69  a hot-journal fi
25d40 6c 65 20 69 73 20 66 6f 75 6e 64 20 74 6f 20 65  le is found to e
25d50 78 69 73 74 2c 20 2a 70 45 78 69 73 74 73 20 69  xist, *pExists i
25d60 73 20 73 65 74 20 74 6f 20 31 20 61 6e 64 20 0a  s set to 1 and .
25d70 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  ** SQLITE_OK ret
25d80 75 72 6e 65 64 2e 20 49 66 20 6e 6f 20 68 6f 74  urned. If no hot
25d90 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73  -journal file is
25da0 20 70 72 65 73 65 6e 74 2c 20 2a 70 45 78 69 73   present, *pExis
25db0 74 73 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20  ts is.** set to 
25dc0 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  0 and SQLITE_OK 
25dd0 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20  returned. If an 
25de0 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  IO error occurs 
25df0 77 68 69 6c 65 20 74 72 79 69 6e 67 0a 2a 2a 20  while trying.** 
25e00 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65  to determine whe
25e10 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 68 6f  ther or not a ho
25e20 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  t-journal file e
25e30 78 69 73 74 73 2c 20 74 68 65 20 49 4f 20 65 72  xists, the IO er
25e40 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 69 73 20 72  ror.** code is r
25e50 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20  eturned and the 
25e60 76 61 6c 75 65 20 6f 66 20 2a 70 45 78 69 73 74  value of *pExist
25e70 73 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a  s is undefined..
25e80 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61  */.static int ha
25e90 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65  sHotJournal(Page
25ea0 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 2a  r *pPager, int *
25eb0 70 45 78 69 73 74 73 29 7b 0a 20 20 73 71 6c 69  pExists){.  sqli
25ec0 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20  te3_vfs * const 
25ed0 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
25ee0 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  Vfs;.  int rc = 
25ef0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
25f00 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
25f10 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 65 78 69  ode */.  int exi
25f20 73 74 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20  sts = 1;        
25f30 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
25f40 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  f a journal file
25f50 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20   is present */. 
25f60 20 69 6e 74 20 6a 72 6e 6c 4f 70 65 6e 20 3d 20   int jrnlOpen = 
25f70 21 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  !!isOpen(pPager-
25f80 3e 6a 66 64 29 3b 0a 0a 20 20 61 73 73 65 72 74  >jfd);..  assert
25f90 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20  ( pPager!=0 );. 
25fa0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
25fb0 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20  >useJournal );. 
25fc0 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
25fd0 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20  pPager->fd) );. 
25fe0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
25ff0 3e 73 74 61 74 65 20 3c 3d 20 50 41 47 45 52 5f  >state <= PAGER_
26000 53 48 41 52 45 44 20 29 3b 0a 20 20 61 73 73 65  SHARED );.  asse
26010 72 74 28 20 6a 72 6e 6c 4f 70 65 6e 3d 3d 30 20  rt( jrnlOpen==0 
26020 7c 7c 20 28 20 73 71 6c 69 74 65 33 4f 73 44 65  || ( sqlite3OsDe
26030 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
26040 69 63 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ics(pPager->jfd)
26050 20 26 0a 20 20 20 20 53 51 4c 49 54 45 5f 49 4f   &.    SQLITE_IO
26060 43 41 50 5f 55 4e 44 45 4c 45 54 41 42 4c 45 5f  CAP_UNDELETABLE_
26070 57 48 45 4e 5f 4f 50 45 4e 0a 20 20 29 29 3b 0a  WHEN_OPEN.  ));.
26080 0a 20 20 2a 70 45 78 69 73 74 73 20 3d 20 30 3b  .  *pExists = 0;
26090 0a 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e  .  if( !jrnlOpen
260a0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
260b0 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66  ite3OsAccess(pVf
260c0 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
260d0 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45  nal, SQLITE_ACCE
260e0 53 53 5f 45 58 49 53 54 53 2c 20 26 65 78 69 73  SS_EXISTS, &exis
260f0 74 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  ts);.  }.  if( r
26100 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
26110 65 78 69 73 74 73 20 29 7b 0a 20 20 20 20 69 6e  exists ){.    in
26120 74 20 6c 6f 63 6b 65 64 3b 20 20 20 20 20 20 20  t locked;       
26130 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
26140 65 20 69 66 20 73 6f 6d 65 20 70 72 6f 63 65 73  e if some proces
26150 73 20 68 6f 6c 64 73 20 61 20 52 45 53 45 52 56  s holds a RESERV
26160 45 44 20 6c 6f 63 6b 20 2a 2f 0a 0a 20 20 20 20  ED lock */..    
26170 2f 2a 20 52 61 63 65 20 63 6f 6e 64 69 74 69 6f  /* Race conditio
26180 6e 20 68 65 72 65 3a 20 20 41 6e 6f 74 68 65 72  n here:  Another
26190 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20 68   process might h
261a0 61 76 65 20 62 65 65 6e 20 68 6f 6c 64 69 6e 67  ave been holding
261b0 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 68 65 20   the.    ** the 
261c0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 61 6e  RESERVED lock an
261d0 64 20 68 61 76 65 20 61 20 6a 6f 75 72 6e 61 6c  d have a journal
261e0 20 6f 70 65 6e 20 61 74 20 74 68 65 20 73 71 6c   open at the sql
261f0 69 74 65 33 4f 73 41 63 63 65 73 73 28 29 20 0a  ite3OsAccess() .
26200 20 20 20 20 2a 2a 20 63 61 6c 6c 20 61 62 6f 76      ** call abov
26210 65 2c 20 62 75 74 20 74 68 65 6e 20 64 65 6c 65  e, but then dele
26220 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61  te the journal a
26230 6e 64 20 64 72 6f 70 20 74 68 65 20 6c 6f 63 6b  nd drop the lock
26240 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 77   before.    ** w
26250 65 20 67 65 74 20 74 6f 20 74 68 65 20 66 6f 6c  e get to the fol
26260 6c 6f 77 69 6e 67 20 73 71 6c 69 74 65 33 4f 73  lowing sqlite3Os
26270 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
26280 6b 28 29 20 63 61 6c 6c 2e 20 20 49 66 20 74 68  k() call.  If th
26290 61 74 0a 20 20 20 20 2a 2a 20 69 73 20 74 68 65  at.    ** is the
262a0 20 63 61 73 65 2c 20 74 68 69 73 20 72 6f 75 74   case, this rout
262b0 69 6e 65 20 6d 69 67 68 74 20 74 68 69 6e 6b 20  ine might think 
262c0 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a  there is a hot j
262d0 6f 75 72 6e 61 6c 20 77 68 65 6e 0a 20 20 20 20  ournal when.    
262e0 2a 2a 20 69 6e 20 66 61 63 74 20 74 68 65 72 65  ** in fact there
262f0 20 69 73 20 6e 6f 6e 65 2e 20 20 54 68 69 73 20   is none.  This 
26300 72 65 73 75 6c 74 73 20 69 6e 20 61 20 66 61 6c  results in a fal
26310 73 65 2d 70 6f 73 69 74 69 76 65 20 77 68 69 63  se-positive whic
26320 68 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65  h will.    ** be
26330 20 64 65 61 6c 74 20 77 69 74 68 20 62 79 20 74   dealt with by t
26340 68 65 20 70 6c 61 79 62 61 63 6b 20 72 6f 75 74  he playback rout
26350 69 6e 65 2e 20 20 54 69 63 6b 65 74 20 23 33 38  ine.  Ticket #38
26360 38 33 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  83..    */.    r
26370 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 43 68 65  c = sqlite3OsChe
26380 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 70  ckReservedLock(p
26390 50 61 67 65 72 2d 3e 66 64 2c 20 26 6c 6f 63 6b  Pager->fd, &lock
263a0 65 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ed);.    if( rc=
263b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 6c  =SQLITE_OK && !l
263c0 6f 63 6b 65 64 20 29 7b 0a 20 20 20 20 20 20 69  ocked ){.      i
263d0 6e 74 20 6e 50 61 67 65 3b 0a 0a 20 20 20 20 20  nt nPage;..     
263e0 20 2f 2a 20 43 68 65 63 6b 20 74 68 65 20 73 69   /* Check the si
263f0 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
26400 73 65 20 66 69 6c 65 2e 20 49 66 20 69 74 20 63  se file. If it c
26410 6f 6e 73 69 73 74 73 20 6f 66 20 30 20 70 61 67  onsists of 0 pag
26420 65 73 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  es,.      ** the
26430 6e 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  n delete the jou
26440 72 6e 61 6c 20 66 69 6c 65 2e 20 53 65 65 20 74  rnal file. See t
26450 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e  he header commen
26460 74 20 61 62 6f 76 65 20 66 6f 72 20 0a 20 20 20  t above for .   
26470 20 20 20 2a 2a 20 74 68 65 20 72 65 61 73 6f 6e     ** the reason
26480 69 6e 67 20 68 65 72 65 2e 20 20 44 65 6c 65 74  ing here.  Delet
26490 65 20 74 68 65 20 6f 62 73 6f 6c 65 74 65 20 6a  e the obsolete j
264a0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 75 6e 64 65  ournal file unde
264b0 72 0a 20 20 20 20 20 20 2a 2a 20 61 20 52 45 53  r.      ** a RES
264c0 45 52 56 45 44 20 6c 6f 63 6b 20 74 6f 20 61 76  ERVED lock to av
264d0 6f 69 64 20 72 61 63 65 20 63 6f 6e 64 69 74 69  oid race conditi
264e0 6f 6e 73 20 61 6e 64 20 74 6f 20 61 76 6f 69 64  ons and to avoid
264f0 20 76 69 6f 6c 61 74 69 6e 67 0a 20 20 20 20 20   violating.     
26500 20 2a 2a 20 5b 48 33 33 30 32 30 5d 2e 0a 20 20   ** [H33020]..  
26510 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
26520 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  = sqlite3PagerPa
26530 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20  gecount(pPager, 
26540 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69  &nPage);.      i
26550 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
26560 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
26570 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nPage==0 ){.    
26580 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67        sqlite3Beg
26590 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
265a0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
265b0 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50  sqlite3OsLock(pP
265c0 61 67 65 72 2d 3e 66 64 2c 20 52 45 53 45 52 56  ager->fd, RESERV
265d0 45 44 5f 4c 4f 43 4b 29 3d 3d 53 51 4c 49 54 45  ED_LOCK)==SQLITE
265e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
265f0 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65     sqlite3OsDele
26600 74 65 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d  te(pVfs, pPager-
26610 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20  >zJournal, 0);. 
26620 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
26630 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65  e3OsUnlock(pPage
26640 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f  r->fd, SHARED_LO
26650 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  CK);.          }
26660 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
26670 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
26680 63 28 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  c();.        }el
26690 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
266a0 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
266b0 65 20 65 78 69 73 74 73 20 61 6e 64 20 6e 6f 20  e exists and no 
266c0 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
266d0 20 68 61 73 20 61 20 72 65 73 65 72 76 65 64 0a   has a reserved.
266e0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20            ** or 
266f0 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20  greater lock on 
26700 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
26710 65 2e 20 4e 6f 77 20 63 68 65 63 6b 20 74 68 61  e. Now check tha
26720 74 20 74 68 65 72 65 20 69 73 0a 20 20 20 20 20  t there is.     
26730 20 20 20 20 20 2a 2a 20 61 74 20 6c 65 61 73 74       ** at least
26740 20 6f 6e 65 20 6e 6f 6e 2d 7a 65 72 6f 20 62 79   one non-zero by
26750 74 65 73 20 61 74 20 74 68 65 20 73 74 61 72 74  tes at the start
26760 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
26770 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 20 20  file..          
26780 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 2c 20  ** If there is, 
26790 74 68 65 6e 20 77 65 20 63 6f 6e 73 69 64 65 72  then we consider
267a0 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 74 6f   this journal to
267b0 20 62 65 20 68 6f 74 2e 20 49 66 20 6e 6f 74 2c   be hot. If not,
267c0 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69   .          ** i
267d0 74 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65 64  t can be ignored
267e0 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
267f0 20 20 20 20 20 20 20 20 20 69 66 28 20 21 6a 72           if( !jr
26800 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20  nlOpen ){.      
26810 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20 53 51        int f = SQ
26820 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
26830 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  LY|SQLITE_OPEN_M
26840 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20  AIN_JOURNAL;.   
26850 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
26860 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73  lite3OsOpen(pVfs
26870 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
26880 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c  al, pPager->jfd,
26890 20 66 2c 20 26 66 29 3b 0a 20 20 20 20 20 20 20   f, &f);.       
268a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
268b0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
268c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
268d0 75 38 20 66 69 72 73 74 20 3d 20 30 3b 0a 20 20  u8 first = 0;.  
268e0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
268f0 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61  qlite3OsRead(pPa
26900 67 65 72 2d 3e 6a 66 64 2c 20 28 76 6f 69 64 20  ger->jfd, (void 
26910 2a 29 26 66 69 72 73 74 2c 20 31 2c 20 30 29 3b  *)&first, 1, 0);
26920 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
26930 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc==SQLITE_IOER
26940 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a  R_SHORT_READ ){.
26950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 63                rc
26960 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
26970 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
26980 20 20 20 20 20 20 20 20 69 66 28 20 21 6a 72 6e          if( !jrn
26990 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 20  lOpen ){.       
269a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
269b0 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66  Close(pPager->jf
269c0 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d);.            
269d0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70  }.            *p
269e0 45 78 69 73 74 73 20 3d 20 28 66 69 72 73 74 21  Exists = (first!
269f0 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  =0);.          }
26a00 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c  else if( rc==SQL
26a10 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 29 7b 0a  ITE_CANTOPEN ){.
26a20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
26a30 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 70 65 6e  f we cannot open
26a40 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
26a50 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 6f 72  urnal file in or
26a60 64 65 72 20 74 6f 20 73 65 65 20 69 66 0a 20 20  der to see if.  
26a70 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74 73            ** its
26a80 20 68 61 73 20 61 20 7a 65 72 6f 20 68 65 61 64   has a zero head
26a90 65 72 2c 20 74 68 61 74 20 6d 69 67 68 74 20 62  er, that might b
26aa0 65 20 64 75 65 20 74 6f 20 61 6e 20 49 2f 4f 20  e due to an I/O 
26ab0 65 72 72 6f 72 2c 20 6f 72 0a 20 20 20 20 20 20  error, or.      
26ac0 20 20 20 20 20 20 2a 2a 20 69 74 20 6d 69 67 68        ** it migh
26ad0 74 20 62 65 20 64 75 65 20 74 6f 20 74 68 65 20  t be due to the 
26ae0 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64  race condition d
26af0 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 20 61  escribed above a
26b00 6e 64 20 69 6e 0a 20 20 20 20 20 20 20 20 20 20  nd in.          
26b10 20 20 2a 2a 20 74 69 63 6b 65 74 20 23 33 38 38    ** ticket #388
26b20 33 2e 20 20 45 69 74 68 65 72 20 77 61 79 2c 20  3.  Either way, 
26b30 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20  assume that the 
26b40 6a 6f 75 72 6e 61 6c 20 69 73 20 68 6f 74 2e 0a  journal is hot..
26b50 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 54              ** T
26b60 68 69 73 20 6d 69 67 68 74 20 62 65 20 61 20 66  his might be a f
26b70 61 6c 73 65 20 70 6f 73 69 74 69 76 65 2e 20 20  alse positive.  
26b80 42 75 74 20 69 66 20 69 74 20 69 73 2c 20 74 68  But if it is, th
26b90 65 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  en the.         
26ba0 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 20     ** automatic 
26bb0 6a 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b  journal playback
26bc0 20 61 6e 64 20 72 65 63 6f 76 65 72 79 20 6d 65   and recovery me
26bd0 63 68 61 6e 69 73 6d 20 77 69 6c 6c 20 64 65 61  chanism will dea
26be0 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  l.            **
26bf0 20 77 69 74 68 20 69 74 20 75 6e 64 65 72 20 61   with it under a
26c00 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
26c10 20 77 68 65 72 65 20 77 65 20 64 6f 20 6e 6f 74   where we do not
26c20 20 6e 65 65 64 20 74 6f 0a 20 20 20 20 20 20 20   need to.       
26c30 20 20 20 20 20 2a 2a 20 77 6f 72 72 79 20 73 6f       ** worry so
26c40 20 6d 75 63 68 20 77 69 74 68 20 72 61 63 65 20   much with race 
26c50 63 6f 6e 64 69 74 69 6f 6e 73 2e 0a 20 20 20 20  conditions..    
26c60 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
26c70 20 20 20 20 20 20 20 2a 70 45 78 69 73 74 73 20         *pExists 
26c80 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 1;.           
26c90 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
26ca0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
26cb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
26cc0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
26cd0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
26ce0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
26cf0 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69   called to obtai
26d00 6e 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  n a shared lock 
26d10 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
26d20 66 69 6c 65 2e 0a 2a 2a 20 49 74 20 69 73 20 69  file..** It is i
26d30 6c 6c 65 67 61 6c 20 74 6f 20 63 61 6c 6c 20 73  llegal to call s
26d40 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75 69  qlite3PagerAcqui
26d50 72 65 28 29 20 75 6e 74 69 6c 20 61 66 74 65 72  re() until after
26d60 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
26d70 2a 20 68 61 73 20 62 65 65 6e 20 73 75 63 63 65  * has been succe
26d80 73 73 66 75 6c 6c 79 20 63 61 6c 6c 65 64 2e 20  ssfully called. 
26d90 49 66 20 61 20 73 68 61 72 65 64 2d 6c 6f 63 6b  If a shared-lock
26da0 20 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64   is already held
26db0 20 77 68 65 6e 0a 2a 2a 20 74 68 69 73 20 66 75   when.** this fu
26dc0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
26dd0 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  , it is a no-op.
26de0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  .**.** The follo
26df0 77 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 20  wing operations 
26e00 61 72 65 20 61 6c 73 6f 20 70 65 72 66 6f 72 6d  are also perform
26e10 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
26e20 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20  ion..**.**   1) 
26e30 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
26e40 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 50 41 47  currently in PAG
26e50 45 52 5f 55 4e 4c 4f 43 4b 20 73 74 61 74 65 20  ER_UNLOCK state 
26e60 28 6e 6f 20 6c 6f 63 6b 20 68 65 6c 64 0a 2a 2a  (no lock held.**
26e70 20 20 20 20 20 20 6f 6e 20 74 68 65 20 64 61 74        on the dat
26e80 61 62 61 73 65 20 66 69 6c 65 29 2c 20 74 68 65  abase file), the
26e90 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20  n an attempt is 
26ea0 6d 61 64 65 20 74 6f 20 6f 62 74 61 69 6e 20 61  made to obtain a
26eb0 0a 2a 2a 20 20 20 20 20 20 53 48 41 52 45 44 20  .**      SHARED 
26ec0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
26ed0 62 61 73 65 20 66 69 6c 65 2e 20 49 6d 6d 65 64  base file. Immed
26ee0 69 61 74 65 6c 79 20 61 66 74 65 72 20 6f 62 74  iately after obt
26ef0 61 69 6e 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74  aining.**      t
26f00 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20  he SHARED lock, 
26f10 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  the file-system 
26f20 69 73 20 63 68 65 63 6b 65 64 20 66 6f 72 20 61  is checked for a
26f30 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 0a 2a 2a   hot-journal,.**
26f40 20 20 20 20 20 20 77 68 69 63 68 20 69 73 20 70        which is p
26f50 6c 61 79 65 64 20 62 61 63 6b 20 69 66 20 70 72  layed back if pr
26f60 65 73 65 6e 74 2e 20 46 6f 6c 6c 6f 77 69 6e 67  esent. Following
26f70 20 61 6e 79 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c   any hot-journal
26f80 20 0a 2a 2a 20 20 20 20 20 20 72 6f 6c 6c 62 61   .**      rollba
26f90 63 6b 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ck, the contents
26fa0 20 6f 66 20 74 68 65 20 63 61 63 68 65 20 61 72   of the cache ar
26fb0 65 20 76 61 6c 69 64 61 74 65 64 20 62 79 20 63  e validated by c
26fc0 68 65 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20  hecking.**      
26fd0 74 68 65 20 27 63 68 61 6e 67 65 2d 63 6f 75 6e  the 'change-coun
26fe0 74 65 72 27 20 66 69 65 6c 64 20 6f 66 20 74 68  ter' field of th
26ff0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
27000 68 65 61 64 65 72 20 61 6e 64 0a 2a 2a 20 20 20  header and.**   
27010 20 20 20 64 69 73 63 61 72 64 65 64 20 69 66 20     discarded if 
27020 74 68 65 79 20 61 72 65 20 66 6f 75 6e 64 20 74  they are found t
27030 6f 20 62 65 20 69 6e 76 61 6c 69 64 2e 0a 2a 2a  o be invalid..**
27040 0a 2a 2a 20 20 20 32 29 20 49 66 20 74 68 65 20  .**   2) If the 
27050 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67  pager is running
27060 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f   in exclusive-mo
27070 64 65 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72  de, and there ar
27080 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 20  e currently.**  
27090 20 20 20 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69      no outstandi
270a0 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ng references to
270b0 20 61 6e 79 20 70 61 67 65 73 2c 20 61 6e 64 20   any pages, and 
270c0 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20  is in the error 
270d0 73 74 61 74 65 2c 0a 2a 2a 20 20 20 20 20 20 74  state,.**      t
270e0 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69  hen an attempt i
270f0 73 20 6d 61 64 65 20 74 6f 20 63 6c 65 61 72 20  s made to clear 
27100 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20  the error state 
27110 62 79 20 64 69 73 63 61 72 64 69 6e 67 0a 2a 2a  by discarding.**
27120 20 20 20 20 20 20 74 68 65 20 63 6f 6e 74 65 6e        the conten
27130 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 63  ts of the page c
27140 61 63 68 65 20 61 6e 64 20 72 6f 6c 6c 69 6e 67  ache and rolling
27150 20 62 61 63 6b 20 61 6e 79 20 6f 70 65 6e 20 6a   back any open j
27160 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 66  ournal.**      f
27170 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ile..**.** If th
27180 65 20 6f 70 65 72 61 74 69 6f 6e 20 64 65 73 63  e operation desc
27190 72 69 62 65 64 20 62 79 20 28 32 29 20 61 62 6f  ribed by (2) abo
271a0 76 65 20 69 73 20 6e 6f 74 20 61 74 74 65 6d 70  ve is not attemp
271b0 74 65 64 2c 20 61 6e 64 20 69 66 20 74 68 65 0a  ted, and if the.
271c0 2a 2a 20 70 61 67 65 72 20 69 73 20 69 6e 20 61  ** pager is in a
271d0 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20 6f 74  n error state ot
271e0 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f  her than SQLITE_
271f0 46 55 4c 4c 20 77 68 65 6e 20 74 68 69 73 20 69  FULL when this i
27200 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 74 68 65  s called,.** the
27210 20 65 72 72 6f 72 20 73 74 61 74 65 20 65 72 72   error state err
27220 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
27230 6e 65 64 2e 20 49 74 20 69 73 20 70 65 72 6d 69  ned. It is permi
27240 74 74 65 64 20 74 6f 20 72 65 61 64 20 74 68 65  tted to read the
27250 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 77 68 65  .** database whe
27260 6e 20 69 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  n in SQLITE_FULL
27270 20 65 72 72 6f 72 20 73 74 61 74 65 2e 0a 2a 2a   error state..**
27280 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
27290 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20  f everything is 
272a0 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49  successful, SQLI
272b0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
272c0 64 2e 20 49 66 20 61 6e 0a 2a 2a 20 49 4f 20 65  d. If an.** IO e
272d0 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
272e0 65 20 6c 6f 63 6b 69 6e 67 20 74 68 65 20 64 61  e locking the da
272f0 74 61 62 61 73 65 2c 20 63 68 65 63 6b 69 6e 67  tabase, checking
27300 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e   for a hot-journ
27310 61 6c 0a 2a 2a 20 66 69 6c 65 20 6f 72 20 72 6f  al.** file or ro
27320 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75  lling back a jou
27330 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20 49  rnal file, the I
27340 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  O error code is 
27350 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74  returned..*/.int
27360 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 68 61   sqlite3PagerSha
27370 72 65 64 4c 6f 63 6b 28 50 61 67 65 72 20 2a 70  redLock(Pager *p
27380 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
27390 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
273a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
273b0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
273c0 20 69 6e 74 20 69 73 45 72 72 6f 72 52 65 73 65   int isErrorRese
273d0 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
273e0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72      /* True if r
273f0 65 63 6f 76 65 72 69 6e 67 20 66 72 6f 6d 20 65  ecovering from e
27400 72 72 6f 72 20 73 74 61 74 65 20 2a 2f 0a 0a 20  rror state */.. 
27410 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65   /* This routine
27420 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20   is only called 
27430 66 72 6f 6d 20 62 2d 74 72 65 65 20 61 6e 64 20  from b-tree and 
27440 6f 6e 6c 79 20 77 68 65 6e 20 74 68 65 72 65 20  only when there 
27450 61 72 65 20 6e 6f 0a 20 20 2a 2a 20 6f 75 74 73  are no.  ** outs
27460 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20 2a 2f  tanding pages */
27470 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
27480 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74  e3PcacheRefCount
27490 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
274a0 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 4e 45  )==0 );.  if( NE
274b0 56 45 52 28 4d 45 4d 44 42 20 26 26 20 70 50 61  VER(MEMDB && pPa
274c0 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 7b  ger->errCode) ){
274d0 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
274e0 65 72 72 43 6f 64 65 3b 20 7d 0a 0a 20 20 2f 2a  errCode; }..  /*
274f0 20 49 66 20 74 68 69 73 20 64 61 74 61 62 61 73   If this databas
27500 65 20 69 73 20 69 6e 20 61 6e 20 65 72 72 6f 72  e is in an error
27510 2d 73 74 61 74 65 2c 20 6e 6f 77 20 69 73 20 61  -state, now is a
27520 20 63 68 61 6e 63 65 20 74 6f 20 63 6c 65 61 72   chance to clear
27530 0a 20 20 2a 2a 20 74 68 65 20 65 72 72 6f 72 2e  .  ** the error.
27540 20 44 69 73 63 61 72 64 20 74 68 65 20 63 6f 6e   Discard the con
27550 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
27560 65 72 2d 63 61 63 68 65 20 61 6e 64 20 72 6f 6c  er-cache and rol
27570 6c 62 61 63 6b 0a 20 20 2a 2a 20 61 6e 79 20 68  lback.  ** any h
27580 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 6e 20 74 68  ot journal in th
27590 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 0a 20  e file-system.. 
275a0 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
275b0 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20  ->errCode ){.   
275c0 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
275d0 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 50 61 67  er->jfd) || pPag
275e0 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 29 7b 0a  er->zJournal ){.
275f0 20 20 20 20 20 20 69 73 45 72 72 6f 72 52 65 73        isErrorRes
27600 65 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  et = 1;.    }.  
27610 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
27620 65 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  e = SQLITE_OK;. 
27630 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70     pager_reset(p
27640 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 69  Pager);.  }..  i
27650 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  f( pagerUseWal(p
27660 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72 63  Pager) ){.    rc
27670 20 3d 20 70 61 67 65 72 42 65 67 69 6e 52 65 61   = pagerBeginRea
27680 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  dTransaction(pPa
27690 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ger);.  }else if
276a0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
276b0 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 7c 7c  =PAGER_UNLOCK ||
276c0 20 69 73 45 72 72 6f 72 52 65 73 65 74 20 29 7b   isErrorReset ){
276d0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73  .    sqlite3_vfs
276e0 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20   * const pVfs = 
276f0 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20  pPager->pVfs;.  
27700 20 20 69 6e 74 20 69 73 48 6f 74 4a 6f 75 72 6e    int isHotJourn
27710 61 6c 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65  al = 0;.    asse
27720 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20  rt( !MEMDB );.  
27730 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
27740 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28  3PcacheRefCount(
27750 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
27760 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ==0 );.    if( p
27770 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63  Pager->noReadloc
27780 6b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  k ){.      asser
27790 74 28 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f  t( pPager->readO
277a0 6e 6c 79 20 29 3b 0a 20 20 20 20 20 20 70 50 61  nly );.      pPa
277b0 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
277c0 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 7d  ER_SHARED;.    }
277d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
277e0 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c   pager_wait_on_l
277f0 6f 63 6b 28 70 50 61 67 65 72 2c 20 53 48 41 52  ock(pPager, SHAR
27800 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  ED_LOCK);.      
27810 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
27820 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  K ){.        ass
27830 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
27840 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te==PAGER_UNLOCK
27850 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   );.        retu
27860 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70  rn pager_error(p
27870 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20  Pager, rc);.    
27880 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73    }.    }.    as
27890 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
278a0 61 74 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ate>=SHARED_LOCK
278b0 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61   );..    /* If a
278c0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78   journal file ex
278d0 69 73 74 73 2c 20 61 6e 64 20 74 68 65 72 65 20  ists, and there 
278e0 69 73 20 6e 6f 20 52 45 53 45 52 56 45 44 20 6c  is no RESERVED l
278f0 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a  ock on the.    *
27900 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  * database file,
27910 20 74 68 65 6e 20 69 74 20 65 69 74 68 65 72 20   then it either 
27920 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79  needs to be play
27930 65 64 20 62 61 63 6b 20 6f 72 20 64 65 6c 65 74  ed back or delet
27940 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
27950 66 28 20 21 69 73 45 72 72 6f 72 52 65 73 65 74  f( !isErrorReset
27960 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
27970 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20  ( pPager->state 
27980 3c 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 20  <= PAGER_SHARED 
27990 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 68 61  );.      rc = ha
279a0 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67  sHotJournal(pPag
279b0 65 72 2c 20 26 69 73 48 6f 74 4a 6f 75 72 6e 61  er, &isHotJourna
279c0 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  l);.      if( rc
279d0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
279e0 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c         goto fail
279f0 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ed;.      }.    
27a00 7d 0a 20 20 20 20 69 66 28 20 69 73 45 72 72 6f  }.    if( isErro
27a10 72 52 65 73 65 74 20 7c 7c 20 69 73 48 6f 74 4a  rReset || isHotJ
27a20 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20  ournal ){.      
27a30 2f 2a 20 47 65 74 20 61 6e 20 45 58 43 4c 55 53  /* Get an EXCLUS
27a40 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
27a50 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41  database file. A
27a60 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20  t this point it 
27a70 69 73 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6f  is.      ** impo
27a80 72 74 61 6e 74 20 74 68 61 74 20 61 20 52 45 53  rtant that a RES
27a90 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f  ERVED lock is no
27aa0 74 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68  t obtained on th
27ab0 65 20 77 61 79 20 74 6f 20 74 68 65 0a 20 20 20  e way to the.   
27ac0 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20     ** EXCLUSIVE 
27ad0 6c 6f 63 6b 2e 20 49 66 20 69 74 20 77 65 72 65  lock. If it were
27ae0 2c 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73  , another proces
27af0 73 20 6d 69 67 68 74 20 6f 70 65 6e 20 74 68 65  s might open the
27b00 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61  .      ** databa
27b10 73 65 20 66 69 6c 65 2c 20 64 65 74 65 63 74 20  se file, detect 
27b20 74 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63  the RESERVED loc
27b30 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75 64 65 20  k, and conclude 
27b40 74 68 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a  that the.      *
27b50 2a 20 64 61 74 61 62 61 73 65 20 69 73 20 73 61  * database is sa
27b60 66 65 20 74 6f 20 72 65 61 64 20 77 68 69 6c 65  fe to read while
27b70 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 69 73   this process is
27b80 20 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20 74   still rolling t
27b90 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 68 6f 74  he .      ** hot
27ba0 2d 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2e 0a 20  -journal back.. 
27bb0 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a       ** .      *
27bc0 2a 20 42 65 63 61 75 73 65 20 74 68 65 20 69 6e  * Because the in
27bd0 74 65 72 6d 65 64 69 61 74 65 20 52 45 53 45 52  termediate RESER
27be0 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20  VED lock is not 
27bf0 72 65 71 75 65 73 74 65 64 2c 20 61 6e 79 0a 20  requested, any. 
27c00 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 70 72       ** other pr
27c10 6f 63 65 73 73 20 61 74 74 65 6d 70 74 69 6e 67  ocess attempting
27c20 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64   to access the d
27c30 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69 6c  atabase file wil
27c40 6c 20 67 65 74 20 74 6f 20 0a 20 20 20 20 20 20  l get to .      
27c50 2a 2a 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e  ** this point in
27c60 20 74 68 65 20 63 6f 64 65 20 61 6e 64 20 66 61   the code and fa
27c70 69 6c 20 74 6f 20 6f 62 74 61 69 6e 20 69 74 73  il to obtain its
27c80 20 6f 77 6e 20 45 58 43 4c 55 53 49 56 45 20 6c   own EXCLUSIVE l
27c90 6f 63 6b 20 0a 20 20 20 20 20 20 2a 2a 20 6f 6e  ock .      ** on
27ca0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
27cb0 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  le..      */.   
27cc0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73     if( pPager->s
27cd0 74 61 74 65 3c 45 58 43 4c 55 53 49 56 45 5f 4c  tate<EXCLUSIVE_L
27ce0 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  OCK ){.        r
27cf0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63  c = sqlite3OsLoc
27d00 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 45 58  k(pPager->fd, EX
27d10 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20  CLUSIVE_LOCK);. 
27d20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
27d30 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
27d40 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
27d50 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72  _error(pPager, r
27d60 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  c);.          go
27d70 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20  to failed;.     
27d80 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61     }.        pPa
27d90 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
27da0 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20  ER_EXCLUSIVE;.  
27db0 20 20 20 20 7d 0a 20 0a 20 20 20 20 20 20 2f 2a      }. .      /*
27dc0 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   Open the journa
27dd0 6c 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65  l for read/write
27de0 20 61 63 63 65 73 73 2e 20 54 68 69 73 20 69 73   access. This is
27df0 20 62 65 63 61 75 73 65 20 69 6e 20 0a 20 20 20   because in .   
27e00 20 20 20 2a 2a 20 65 78 63 6c 75 73 69 76 65 2d     ** exclusive-
27e10 61 63 63 65 73 73 20 6d 6f 64 65 20 74 68 65 20  access mode the 
27e20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
27e30 77 69 6c 6c 20 62 65 20 6b 65 70 74 20 6f 70 65  will be kept ope
27e40 6e 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 70  n and.      ** p
27e50 6f 73 73 69 62 6c 79 20 75 73 65 64 20 66 6f 72  ossibly used for
27e60 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6c   a transaction l
27e70 61 74 65 72 20 6f 6e 2e 20 4f 6e 20 73 6f 6d 65  ater on. On some
27e80 20 73 79 73 74 65 6d 73 2c 20 74 68 65 0a 20 20   systems, the.  
27e90 20 20 20 20 2a 2a 20 4f 73 54 72 75 6e 63 61 74      ** OsTruncat
27ea0 65 28 29 20 63 61 6c 6c 20 75 73 65 64 20 69 6e  e() call used in
27eb0 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73   exclusive-acces
27ec0 73 20 6d 6f 64 65 20 61 6c 73 6f 20 72 65 71 75  s mode also requ
27ed0 69 72 65 73 0a 20 20 20 20 20 20 2a 2a 20 61 20  ires.      ** a 
27ee0 72 65 61 64 2f 77 72 69 74 65 20 66 69 6c 65 20  read/write file 
27ef0 68 61 6e 64 6c 65 2e 0a 20 20 20 20 20 20 2a 2f  handle..      */
27f00 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 4f 70  .      if( !isOp
27f10 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
27f20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  ){.        int r
27f30 65 73 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  es;.        rc =
27f40 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
27f50 28 70 56 66 73 2c 70 50 61 67 65 72 2d 3e 7a 4a  (pVfs,pPager->zJ
27f60 6f 75 72 6e 61 6c 2c 53 51 4c 49 54 45 5f 41 43  ournal,SQLITE_AC
27f70 43 45 53 53 5f 45 58 49 53 54 53 2c 26 72 65 73  CESS_EXISTS,&res
27f80 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
27f90 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
27fa0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 65            if( re
27fb0 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  s ){.           
27fc0 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b 0a 20   int fout = 0;. 
27fd0 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 66             int f
27fe0 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   = SQLITE_OPEN_R
27ff0 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f  EADWRITE|SQLITE_
28000 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
28010 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  L;.            a
28020 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
28030 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20  tempFile );.    
28040 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
28050 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c  ite3OsOpen(pVfs,
28060 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
28070 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  l, pPager->jfd, 
28080 66 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 20  f, &fout);.     
28090 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72         assert( r
280a0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
280b0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
280c0 66 64 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  fd) );.         
280d0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
280e0 45 5f 4f 4b 20 26 26 20 66 6f 75 74 26 53 51 4c  E_OK && fout&SQL
280f0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
28100 59 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  Y ){.           
28110 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
28120 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20  ANTOPEN_BKPT;.  
28130 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
28140 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
28150 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20  r->jfd);.       
28160 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
28170 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
28180 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f      /* If the jo
28190 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20 65  urnal does not e
281a0 78 69 73 74 2c 20 69 74 20 75 73 75 61 6c 6c 79  xist, it usually
281b0 20 6d 65 61 6e 73 20 74 68 61 74 20 73 6f 6d 65   means that some
281c0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a   .            **
281d0 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
281e0 6e 20 6d 61 6e 61 67 65 64 20 74 6f 20 67 65 74  n managed to get
281f0 20 69 6e 20 61 6e 64 20 72 6f 6c 6c 20 69 74 20   in and roll it 
28200 62 61 63 6b 20 62 65 66 6f 72 65 20 0a 20 20 20  back before .   
28210 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73           ** this
28220 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 62 74 61   connection obta
28230 69 6e 65 64 20 74 68 65 20 65 78 63 6c 75 73 69  ined the exclusi
28240 76 65 20 6c 6f 63 6b 20 61 62 6f 76 65 2e 20 4f  ve lock above. O
28250 72 2c 20 69 74 20 0a 20 20 20 20 20 20 20 20 20  r, it .         
28260 20 20 20 2a 2a 20 6d 61 79 20 6d 65 61 6e 20 74     ** may mean t
28270 68 61 74 20 74 68 65 20 70 61 67 65 72 20 77 61  hat the pager wa
28280 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 2d 73  s in the error-s
28290 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a 20  tate when this. 
282a0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 75             ** fu
282b0 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65  nction was calle
282c0 64 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61  d and the journa
282d0 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20  l file does not 
282e0 65 78 69 73 74 2e 20 20 2a 2f 0a 20 20 20 20 20  exist.  */.     
282f0 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
28300 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  r_end_transactio
28310 6e 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20  n(pPager, 0);.  
28320 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
28330 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
28340 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
28350 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
28360 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  oto failed;.    
28370 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 52 65    }..      /* Re
28380 73 65 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  set the journal 
28390 73 74 61 74 75 73 20 66 69 65 6c 64 73 20 74 6f  status fields to
283a0 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
283b0 77 65 20 68 61 76 65 20 6e 6f 0a 20 20 20 20 20  we have no.     
283c0 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75   ** rollback jou
283d0 72 6e 61 6c 20 61 74 20 74 68 69 73 20 74 69 6d  rnal at this tim
283e0 65 2e 20 2a 2f 0a 20 20 20 20 20 20 70 50 61 67  e. */.      pPag
283f0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74  er->journalStart
28400 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  ed = 0;.      pP
28410 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
28420 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67   = 0;.      pPag
28430 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20  er->setMaster = 
28440 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  0;.      pPager-
28450 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b  >journalHdr = 0;
28460 0a 20 0a 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65  . .      /* Make
28470 20 73 75 72 65 20 74 68 65 20 6a 6f 75 72 6e 61   sure the journa
28480 6c 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20  l file has been 
28490 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 20  synced to disk. 
284a0 2a 2f 0a 20 0a 20 20 20 20 20 20 2f 2a 20 50 6c  */. .      /* Pl
284b0 61 79 62 61 63 6b 20 61 6e 64 20 64 65 6c 65 74  ayback and delet
284c0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  e the journal.  
284d0 44 72 6f 70 20 74 68 65 20 64 61 74 61 62 61 73  Drop the databas
284e0 65 20 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a  e write.      **
284f0 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61 63 71 75   lock and reacqu
28500 69 72 65 20 74 68 65 20 72 65 61 64 20 6c 6f 63  ire the read loc
28510 6b 2e 20 50 75 72 67 65 20 74 68 65 20 63 61 63  k. Purge the cac
28520 68 65 20 62 65 66 6f 72 65 0a 20 20 20 20 20 20  he before.      
28530 2a 2a 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20  ** playing back 
28540 74 68 65 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  the hot-journal 
28550 73 6f 20 74 68 61 74 20 77 65 20 64 6f 6e 27 74  so that we don't
28560 20 65 6e 64 20 75 70 20 77 69 74 68 0a 20 20 20   end up with.   
28570 20 20 20 2a 2a 20 61 6e 20 69 6e 63 6f 6e 73 69     ** an inconsi
28580 73 74 65 6e 74 20 63 61 63 68 65 2e 20 20 53 79  stent cache.  Sy
28590 6e 63 20 74 68 65 20 68 6f 74 20 6a 6f 75 72 6e  nc the hot journ
285a0 61 6c 20 62 65 66 6f 72 65 20 70 6c 61 79 69 6e  al before playin
285b0 67 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 62 61  g.      ** it ba
285c0 63 6b 20 73 69 6e 63 65 20 74 68 65 20 70 72 6f  ck since the pro
285d0 63 65 73 73 20 74 68 61 74 20 63 72 61 73 68 65  cess that crashe
285e0 64 20 61 6e 64 20 6c 65 66 74 20 74 68 65 20 68  d and left the h
285f0 6f 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20  ot journal.     
28600 20 2a 2a 20 70 72 6f 62 61 62 6c 79 20 64 69 64   ** probably did
28610 20 6e 6f 74 20 73 79 6e 63 20 69 74 20 61 6e 64   not sync it and
28620 20 77 65 20 61 72 65 20 72 65 71 75 69 72 65 64   we are required
28630 20 74 6f 20 61 6c 77 61 79 73 20 73 79 6e 63 0a   to always sync.
28640 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75        ** the jou
28650 72 6e 61 6c 20 62 65 66 6f 72 65 20 70 6c 61 79  rnal before play
28660 69 6e 67 20 69 74 20 62 61 63 6b 2e 0a 20 20 20  ing it back..   
28670 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
28680 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
28690 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  fd) ){.        r
286a0 63 20 3d 20 70 61 67 65 72 53 79 6e 63 48 6f 74  c = pagerSyncHot
286b0 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b  Journal(pPager);
286c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
286d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
286e0 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
286f0 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67  er_playback(pPag
28700 65 72 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  er, 1);.        
28710 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  }.        if( rc
28720 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
28730 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61           rc = pa
28740 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
28750 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20 20  , rc);.         
28760 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20   goto failed;.  
28770 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
28780 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
28790 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
287a0 47 45 52 5f 53 48 41 52 45 44 29 0a 20 20 20 20  GER_SHARED).    
287b0 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65         || (pPage
287c0 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
287d0 20 26 26 20 70 50 61 67 65 72 2d 3e 73 74 61 74   && pPager->stat
287e0 65 3e 50 41 47 45 52 5f 53 48 41 52 45 44 29 0a  e>PAGER_SHARED).
287f0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a        );.    }..
28800 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
28810 70 42 61 63 6b 75 70 20 7c 7c 20 73 71 6c 69 74  pBackup || sqlit
28820 65 33 50 63 61 63 68 65 50 61 67 65 63 6f 75 6e  e3PcachePagecoun
28830 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
28840 65 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  e)>0 ){.      /*
28850 20 54 68 65 20 73 68 61 72 65 64 2d 6c 6f 63 6b   The shared-lock
28860 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 61   has just been a
28870 63 71 75 69 72 65 64 20 6f 6e 20 74 68 65 20 64  cquired on the d
28880 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20 20  atabase file.   
28890 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 72 65 20     ** and there 
288a0 61 72 65 20 61 6c 72 65 61 64 79 20 70 61 67 65  are already page
288b0 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 28  s in the cache (
288c0 66 72 6f 6d 20 61 20 70 72 65 76 69 6f 75 73 0a  from a previous.
288d0 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20 6f 72        ** read or
288e0 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
288f0 6f 6e 29 2e 20 20 43 68 65 63 6b 20 74 6f 20 73  on).  Check to s
28900 65 65 20 69 66 20 74 68 65 20 64 61 74 61 62 61  ee if the databa
28910 73 65 0a 20 20 20 20 20 20 2a 2a 20 68 61 73 20  se.      ** has 
28920 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20  been modified.  
28930 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
28940 68 61 73 20 63 68 61 6e 67 65 64 2c 20 66 6c 75  has changed, flu
28950 73 68 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  sh the.      ** 
28960 63 61 63 68 65 2e 0a 20 20 20 20 20 20 2a 2a 0a  cache..      **.
28970 20 20 20 20 20 20 2a 2a 20 44 61 74 61 62 61 73        ** Databas
28980 65 20 63 68 61 6e 67 65 73 20 69 73 20 64 65 74  e changes is det
28990 65 63 74 65 64 20 62 79 20 6c 6f 6f 6b 69 6e 67  ected by looking
289a0 20 61 74 20 31 35 20 62 79 74 65 73 20 62 65 67   at 15 bytes beg
289b0 69 6e 6e 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  inning.      ** 
289c0 61 74 20 6f 66 66 73 65 74 20 32 34 20 69 6e 74  at offset 24 int
289d0 6f 20 74 68 65 20 66 69 6c 65 2e 20 20 54 68 65  o the file.  The
289e0 20 66 69 72 73 74 20 34 20 6f 66 20 74 68 65 73   first 4 of thes
289f0 65 20 31 36 20 62 79 74 65 73 20 61 72 65 0a 20  e 16 bytes are. 
28a00 20 20 20 20 20 2a 2a 20 61 20 33 32 2d 62 69 74       ** a 32-bit
28a10 20 63 6f 75 6e 74 65 72 20 74 68 61 74 20 69 73   counter that is
28a20 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 69 74   incremented wit
28a30 68 20 65 61 63 68 20 63 68 61 6e 67 65 2e 20 20  h each change.  
28a40 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68  The.      ** oth
28a50 65 72 20 62 79 74 65 73 20 63 68 61 6e 67 65 20  er bytes change 
28a60 72 61 6e 64 6f 6d 6c 79 20 77 69 74 68 20 65 61  randomly with ea
28a70 63 68 20 66 69 6c 65 20 63 68 61 6e 67 65 20 77  ch file change w
28a80 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 61 20 63  hen.      ** a c
28a90 6f 64 65 63 20 69 73 20 69 6e 20 75 73 65 2e 0a  odec is in use..
28aa0 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20        ** .      
28ab0 2a 2a 20 54 68 65 72 65 20 69 73 20 61 20 76 61  ** There is a va
28ac0 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20  nishingly small 
28ad0 63 68 61 6e 63 65 20 74 68 61 74 20 61 20 63 68  chance that a ch
28ae0 61 6e 67 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65  ange will not be
28af0 20 0a 20 20 20 20 20 20 2a 2a 20 64 65 74 65 63   .      ** detec
28b00 74 65 64 2e 20 20 54 68 65 20 63 68 61 6e 63 65  ted.  The chance
28b10 20 6f 66 20 61 6e 20 75 6e 64 65 74 65 63 74 65   of an undetecte
28b20 64 20 63 68 61 6e 67 65 20 69 73 20 73 6f 20 73  d change is so s
28b30 6d 61 6c 6c 20 74 68 61 74 0a 20 20 20 20 20 20  mall that.      
28b40 2a 2a 20 69 74 20 63 61 6e 20 62 65 20 6e 65 67  ** it can be neg
28b50 6c 65 63 74 65 64 2e 0a 20 20 20 20 20 20 2a 2f  lected..      */
28b60 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 61 67 65  .      int nPage
28b70 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 68 61 72   = 0;.      char
28b80 20 64 62 46 69 6c 65 56 65 72 73 5b 73 69 7a 65   dbFileVers[size
28b90 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  of(pPager->dbFil
28ba0 65 56 65 72 73 29 5d 3b 0a 20 20 20 20 20 20 73  eVers)];.      s
28bb0 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
28bc0 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50  ount(pPager, &nP
28bd0 61 67 65 29 3b 0a 0a 20 20 20 20 20 20 69 66 28  age);..      if(
28be0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
28bf0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
28c00 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
28c10 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66  ;.        goto f
28c20 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 0a  ailed;.      }..
28c30 20 20 20 20 20 20 69 66 28 20 6e 50 61 67 65 3e        if( nPage>
28c40 30 20 29 7b 0a 20 20 20 20 20 20 20 20 49 4f 54  0 ){.        IOT
28c50 52 41 43 45 28 28 22 43 4b 56 45 52 53 20 25 70  RACE(("CKVERS %p
28c60 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
28c70 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72  sizeof(dbFileVer
28c80 73 29 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63  s)));.        rc
28c90 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
28ca0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 64 62  (pPager->fd, &db
28cb0 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66  FileVers, sizeof
28cc0 28 64 62 46 69 6c 65 56 65 72 73 29 2c 20 32 34  (dbFileVers), 24
28cd0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
28ce0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
28cf0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66            goto f
28d00 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 20 20 7d  ailed;.        }
28d10 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
28d20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 64 62 46        memset(dbF
28d30 69 6c 65 56 65 72 73 2c 20 30 2c 20 73 69 7a 65  ileVers, 0, size
28d40 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 29 3b  of(dbFileVers));
28d50 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
28d60 69 66 28 20 6d 65 6d 63 6d 70 28 70 50 61 67 65  if( memcmp(pPage
28d70 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 64  r->dbFileVers, d
28d80 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f  bFileVers, sizeo
28d90 66 28 64 62 46 69 6c 65 56 65 72 73 29 29 21 3d  f(dbFileVers))!=
28da0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67  0 ){.        pag
28db0 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
28dc0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
28dd0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
28de0 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
28df0 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 61  e || pPager->sta
28e00 74 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44  te==PAGER_SHARED
28e10 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74   );..    /* If t
28e20 68 65 72 65 20 69 73 20 61 20 57 41 4c 20 66 69  here is a WAL fi
28e30 6c 65 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73  le in the file-s
28e40 79 73 74 65 6d 2c 20 6f 70 65 6e 20 74 68 69 73  ystem, open this
28e50 20 64 61 74 61 62 61 73 65 20 69 6e 20 57 41 4c   database in WAL
28e60 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 2e 20 4f 74  .    ** mode. Ot
28e70 68 65 72 77 69 73 65 2c 20 74 68 65 20 66 6f 6c  herwise, the fol
28e80 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  lowing function 
28e90 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  call is a no-op.
28ea0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
28eb0 20 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50   pagerOpenWalIfP
28ec0 72 65 73 65 6e 74 28 70 50 61 67 65 72 29 3b 0a  resent(pPager);.
28ed0 20 20 7d 0a 0a 20 66 61 69 6c 65 64 3a 0a 20 20    }.. failed:.  
28ee0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
28ef0 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 70 61 67 65  K ){.    /* page
28f00 72 5f 75 6e 6c 6f 63 6b 28 29 20 69 73 20 61 20  r_unlock() is a 
28f10 6e 6f 2d 6f 70 20 66 6f 72 20 65 78 63 6c 75 73  no-op for exclus
28f20 69 76 65 20 6d 6f 64 65 20 61 6e 64 20 69 6e 2d  ive mode and in-
28f30 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 73  memory databases
28f40 2e 20 2a 2f 0a 20 20 20 20 70 61 67 65 72 5f 75  . */.    pager_u
28f50 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  nlock(pPager);. 
28f60 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
28f70 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
28f80 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
28f90 68 61 73 20 72 65 61 63 68 65 64 20 7a 65 72 6f  has reached zero
28fa0 2c 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61  , rollback any a
28fb0 63 74 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63  ctive.** transac
28fc0 74 69 6f 6e 20 61 6e 64 20 75 6e 6c 6f 63 6b 20  tion and unlock 
28fd0 74 68 65 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a  the pager..**.**
28fe0 20 45 78 63 65 70 74 2c 20 69 6e 20 6c 6f 63 6b   Except, in lock
28ff0 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49  ing_mode=EXCLUSI
29000 56 45 20 77 68 65 6e 20 74 68 65 72 65 20 69 73  VE when there is
29010 20 6e 6f 74 68 69 6e 67 20 74 6f 20 69 6e 0a 2a   nothing to in.*
29020 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  * the rollback j
29030 6f 75 72 6e 61 6c 2c 20 74 68 65 20 75 6e 6c 6f  ournal, the unlo
29040 63 6b 20 69 73 20 6e 6f 74 20 70 65 72 66 6f 72  ck is not perfor
29050 6d 65 64 20 61 6e 64 20 74 68 65 72 65 20 69 73  med and there is
29060 0a 2a 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20 72  .** nothing to r
29070 6f 6c 6c 62 61 63 6b 2c 20 73 6f 20 74 68 69 73  ollback, so this
29080 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
29090 2d 6f 70 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20  -op..*/ .static 
290a0 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b  void pagerUnlock
290b0 49 66 55 6e 75 73 65 64 28 50 61 67 65 72 20 2a  IfUnused(Pager *
290c0 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 28  pPager){.  if( (
290d0 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66  sqlite3PcacheRef
290e0 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  Count(pPager->pP
290f0 43 61 63 68 65 29 3d 3d 30 29 0a 20 20 20 26 26  Cache)==0).   &&
29100 20 28 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75   (!pPager->exclu
29110 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67  siveMode || pPag
29120 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30  er->journalOff>0
29130 29 20 0a 20 20 29 7b 0a 20 20 20 20 70 61 67 65  ) .  ){.    page
29140 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61  rUnlockAndRollba
29150 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  ck(pPager);.  }.
29160 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65  }../*.** Acquire
29170 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
29180 70 61 67 65 20 6e 75 6d 62 65 72 20 70 67 6e 6f  page number pgno
29190 20 69 6e 20 70 61 67 65 72 20 70 50 61 67 65 72   in pager pPager
291a0 20 28 61 20 70 61 67 65 0a 2a 2a 20 72 65 66 65   (a page.** refe
291b0 72 65 6e 63 65 20 68 61 73 20 74 79 70 65 20 44  rence has type D
291c0 62 50 61 67 65 2a 29 2e 20 49 66 20 74 68 65 20  bPage*). If the 
291d0 72 65 71 75 65 73 74 65 64 20 72 65 66 65 72 65  requested refere
291e0 6e 63 65 20 69 73 20 0a 2a 2a 20 73 75 63 63 65  nce is .** succe
291f0 73 73 66 75 6c 6c 79 20 6f 62 74 61 69 6e 65 64  ssfully obtained
29200 2c 20 69 74 20 69 73 20 63 6f 70 69 65 64 20 74  , it is copied t
29210 6f 20 2a 70 70 50 61 67 65 20 61 6e 64 20 53 51  o *ppPage and SQ
29220 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
29230 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72  ..**.** If the r
29240 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73  equested page is
29250 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
29260 63 61 63 68 65 2c 20 69 74 20 69 73 20 72 65 74  cache, it is ret
29270 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68 65 72  urned. .** Other
29280 77 69 73 65 2c 20 61 20 6e 65 77 20 70 61 67 65  wise, a new page
29290 20 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63   object is alloc
292a0 61 74 65 64 20 61 6e 64 20 70 6f 70 75 6c 61 74  ated and populat
292b0 65 64 20 77 69 74 68 20 64 61 74 61 0a 2a 2a 20  ed with data.** 
292c0 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61  read from the da
292d0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6e 20  tabase file. In 
292e0 73 6f 6d 65 20 63 61 73 65 73 2c 20 74 68 65 20  some cases, the 
292f0 70 63 61 63 68 65 20 6d 6f 64 75 6c 65 20 6d 61  pcache module ma
29300 79 0a 2a 2a 20 63 68 6f 6f 73 65 20 6e 6f 74 20  y.** choose not 
29310 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65  to allocate a ne
29320 77 20 70 61 67 65 20 6f 62 6a 65 63 74 20 61 6e  w page object an
29330 64 20 6d 61 79 20 72 65 75 73 65 20 61 6e 20 65  d may reuse an e
29340 78 69 73 74 69 6e 67 0a 2a 2a 20 6f 62 6a 65 63  xisting.** objec
29350 74 20 77 69 74 68 20 6e 6f 20 6f 75 74 73 74 61  t with no outsta
29360 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73  nding references
29370 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 74 72  ..**.** The extr
29380 61 20 64 61 74 61 20 61 70 70 65 6e 64 65 64 20  a data appended 
29390 74 6f 20 61 20 70 61 67 65 20 69 73 20 61 6c 77  to a page is alw
293a0 61 79 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  ays initialized 
293b0 74 6f 20 7a 65 72 6f 73 20 74 68 65 20 0a 2a 2a  to zeros the .**
293c0 20 66 69 72 73 74 20 74 69 6d 65 20 61 20 70 61   first time a pa
293d0 67 65 20 69 73 20 6c 6f 61 64 65 64 20 69 6e 74  ge is loaded int
293e0 6f 20 6d 65 6d 6f 72 79 2e 20 49 66 20 74 68 65  o memory. If the
293f0 20 70 61 67 65 20 72 65 71 75 65 73 74 65 64 20   page requested 
29400 69 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69  is .** already i
29410 6e 20 74 68 65 20 63 61 63 68 65 20 77 68 65 6e  n the cache when
29420 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
29430 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 74  s called, then t
29440 68 65 20 65 78 74 72 61 0a 2a 2a 20 64 61 74 61  he extra.** data
29450 20 69 73 20 6c 65 66 74 20 61 73 20 69 74 20 77   is left as it w
29460 61 73 20 77 68 65 6e 20 74 68 65 20 70 61 67 65  as when the page
29470 20 6f 62 6a 65 63 74 20 77 61 73 20 6c 61 73 74   object was last
29480 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   used..**.** If 
29490 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61  the database ima
294a0 67 65 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68  ge is smaller th
294b0 61 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64  an the requested
294c0 20 70 61 67 65 20 6f 72 20 69 66 20 61 20 0a 2a   page or if a .*
294d0 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  * non-zero value
294e0 20 69 73 20 70 61 73 73 65 64 20 61 73 20 74 68   is passed as th
294f0 65 20 6e 6f 43 6f 6e 74 65 6e 74 20 70 61 72 61  e noContent para
29500 6d 65 74 65 72 20 61 6e 64 20 74 68 65 20 0a 2a  meter and the .*
29510 2a 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65  * requested page
29520 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
29530 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 63 61  stored in the ca
29540 63 68 65 2c 20 74 68 65 6e 20 6e 6f 20 0a 2a 2a  che, then no .**
29550 20 61 63 74 75 61 6c 20 64 69 73 6b 20 72 65 61   actual disk rea
29560 64 20 6f 63 63 75 72 73 2e 20 49 6e 20 74 68 69  d occurs. In thi
29570 73 20 63 61 73 65 20 74 68 65 20 6d 65 6d 6f 72  s case the memor
29580 79 20 69 6d 61 67 65 20 6f 66 20 74 68 65 20 0a  y image of the .
29590 2a 2a 20 70 61 67 65 20 69 73 20 69 6e 69 74 69  ** page is initi
295a0 61 6c 69 7a 65 64 20 74 6f 20 61 6c 6c 20 7a 65  alized to all ze
295b0 72 6f 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  ros. .**.** If n
295c0 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74 72 75 65  oContent is true
295d0 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
295e0 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61  we do not care a
295f0 62 6f 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74  bout the content
29600 73 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65  s.** of the page
29610 2e 20 54 68 69 73 20 6f 63 63 75 72 73 20 69 6e  . This occurs in
29620 20 74 77 6f 20 73 65 70 65 72 61 74 65 20 73 63   two seperate sc
29630 65 6e 61 72 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20  enarios:.**.**  
29640 20 61 29 20 57 68 65 6e 20 72 65 61 64 69 6e 67   a) When reading
29650 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61   a free-list lea
29660 66 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  f page from the 
29670 64 61 74 61 62 61 73 65 2c 20 61 6e 64 0a 2a 2a  database, and.**
29680 0a 2a 2a 20 20 20 62 29 20 57 68 65 6e 20 61 20  .**   b) When a 
29690 73 61 76 65 70 6f 69 6e 74 20 69 73 20 62 65 69  savepoint is bei
296a0 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61  ng rolled back a
296b0 6e 64 20 77 65 20 6e 65 65 64 20 74 6f 20 6c 6f  nd we need to lo
296c0 61 64 0a 2a 2a 20 20 20 20 20 20 61 20 6e 65 77  ad.**      a new
296d0 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 63   page into the c
296e0 61 63 68 65 20 74 6f 20 62 65 20 66 69 6c 6c 65  ache to be fille
296f0 64 20 77 69 74 68 20 74 68 65 20 64 61 74 61 20  d with the data 
29700 72 65 61 64 0a 2a 2a 20 20 20 20 20 20 66 72 6f  read.**      fro
29710 6d 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20  m the savepoint 
29720 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49  journal..**.** I
29730 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74  f noContent is t
29740 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 64 61  rue, then the da
29750 74 61 20 72 65 74 75 72 6e 65 64 20 69 73 20 7a  ta returned is z
29760 65 72 6f 65 64 20 69 6e 73 74 65 61 64 20 6f 66  eroed instead of
29770 0a 2a 2a 20 62 65 69 6e 67 20 72 65 61 64 20 66  .** being read f
29780 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
29790 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20  . Additionally, 
297a0 74 68 65 20 62 69 74 73 20 63 6f 72 72 65 73 70  the bits corresp
297b0 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 67 6e  onding.** to pgn
297c0 6f 20 69 6e 20 50 61 67 65 72 2e 70 49 6e 4a 6f  o in Pager.pInJo
297d0 75 72 6e 61 6c 20 28 62 69 74 76 65 63 20 6f 66  urnal (bitvec of
297e0 20 70 61 67 65 73 20 61 6c 72 65 61 64 79 20 77   pages already w
297f0 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a  ritten to the.**
29800 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 61   journal file) a
29810 6e 64 20 74 68 65 20 50 61 67 65 72 53 61 76 65  nd the PagerSave
29820 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69  point.pInSavepoi
29830 6e 74 20 62 69 74 76 65 63 73 20 6f 66 20 61 6e  nt bitvecs of an
29840 79 20 6f 70 65 6e 0a 2a 2a 20 73 61 76 65 70 6f  y open.** savepo
29850 69 6e 74 73 20 61 72 65 20 73 65 74 2e 20 54 68  ints are set. Th
29860 69 73 20 6d 65 61 6e 73 20 69 66 20 74 68 65 20  is means if the 
29870 70 61 67 65 20 69 73 20 6d 61 64 65 20 77 72 69  page is made wri
29880 74 61 62 6c 65 20 61 74 20 61 6e 79 0a 2a 2a 20  table at any.** 
29890 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74  point in the fut
298a0 75 72 65 2c 20 75 73 69 6e 67 20 61 20 63 61 6c  ure, using a cal
298b0 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65  l to sqlite3Page
298c0 72 57 72 69 74 65 28 29 2c 20 69 74 73 20 63 6f  rWrite(), its co
298d0 6e 74 65 6e 74 73 0a 2a 2a 20 77 69 6c 6c 20 6e  ntents.** will n
298e0 6f 74 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64 2e  ot be journaled.
298f0 20 54 68 69 73 20 73 61 76 65 73 20 49 4f 2e 0a   This saves IO..
29900 2a 2a 0a 2a 2a 20 54 68 65 20 61 63 71 75 69 73  **.** The acquis
29910 69 74 69 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c  ition might fail
29920 20 66 6f 72 20 73 65 76 65 72 61 6c 20 72 65 61   for several rea
29930 73 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61  sons.  In all ca
29940 73 65 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f  ses,.** an appro
29950 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64  priate error cod
29960 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  e is returned an
29970 64 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74  d *ppPage is set
29980 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20   to NULL..**.** 
29990 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33  See also sqlite3
299a0 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29 2e 20 20  PagerLookup().  
299b0 42 6f 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e  Both this routin
299c0 65 20 61 6e 64 20 4c 6f 6f 6b 75 70 28 29 20 61  e and Lookup() a
299d0 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e  ttempt.** to fin
299e0 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20  d a page in the 
299f0 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20  in-memory cache 
29a00 66 69 72 73 74 2e 20 20 49 66 20 74 68 65 20 70  first.  If the p
29a10 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  age is not alrea
29a20 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c  dy.** in memory,
29a30 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 67 6f   this routine go
29a40 65 73 20 74 6f 20 64 69 73 6b 20 74 6f 20 72 65  es to disk to re
29a50 61 64 20 69 74 20 69 6e 20 77 68 65 72 65 61 73  ad it in whereas
29a60 20 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73   Lookup().** jus
29a70 74 20 72 65 74 75 72 6e 73 20 30 2e 20 20 54 68  t returns 0.  Th
29a80 69 73 20 72 6f 75 74 69 6e 65 20 61 63 71 75 69  is routine acqui
29a90 72 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  res a read-lock 
29aa0 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 69  the first time i
29ab0 74 0a 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20 74  t.** has to go t
29ac0 6f 20 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c  o disk, and coul
29ad0 64 20 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20  d also playback 
29ae0 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69  an old journal i
29af0 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20  f necessary..** 
29b00 53 69 6e 63 65 20 4c 6f 6f 6b 75 70 28 29 20 6e  Since Lookup() n
29b10 65 76 65 72 20 67 6f 65 73 20 74 6f 20 64 69 73  ever goes to dis
29b20 6b 2c 20 69 74 20 6e 65 76 65 72 20 68 61 73 20  k, it never has 
29b30 74 6f 20 64 65 61 6c 20 77 69 74 68 20 6c 6f 63  to deal with loc
29b40 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c  ks.** or journal
29b50 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73   files..*/.int s
29b60 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75 69  qlite3PagerAcqui
29b70 72 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  re(.  Pager *pPa
29b80 67 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  ger,      /* The
29b90 20 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74   pager open on t
29ba0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
29bb0 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c   */.  Pgno pgno,
29bc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
29bd0 65 20 6e 75 6d 62 65 72 20 74 6f 20 66 65 74 63  e number to fetc
29be0 68 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a  h */.  DbPage **
29bf0 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 57 72  ppPage,    /* Wr
29c00 69 74 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ite a pointer to
29c10 20 74 68 65 20 70 61 67 65 20 68 65 72 65 20 2a   the page here *
29c20 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e  /.  int noConten
29c30 74 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f  t       /* Do no
29c40 74 20 62 6f 74 68 65 72 20 72 65 61 64 69 6e 67  t bother reading
29c50 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69   content from di
29c60 73 6b 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b  sk if true */.){
29c70 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48  .  int rc;.  PgH
29c80 64 72 20 2a 70 50 67 3b 0a 0a 20 20 61 73 73 65  dr *pPg;..  asse
29c90 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
29ca0 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
29cb0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
29cc0 65 72 2d 3e 73 74 61 74 65 3e 50 41 47 45 52 5f  er->state>PAGER_
29cd0 55 4e 4c 4f 43 4b 20 29 3b 0a 0a 20 20 69 66 28  UNLOCK );..  if(
29ce0 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20   pgno==0 ){.    
29cf0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
29d00 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
29d10 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67  .  /* If the pag
29d20 65 72 20 69 73 20 69 6e 20 74 68 65 20 65 72 72  er is in the err
29d30 6f 72 20 73 74 61 74 65 2c 20 72 65 74 75 72 6e  or state, return
29d40 20 61 6e 20 65 72 72 6f 72 20 69 6d 6d 65 64 69   an error immedi
29d50 61 74 65 6c 79 2e 20 0a 20 20 2a 2a 20 4f 74 68  ately. .  ** Oth
29d60 65 72 77 69 73 65 2c 20 72 65 71 75 65 73 74 20  erwise, request 
29d70 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68  the page from th
29d80 65 20 50 43 61 63 68 65 20 6c 61 79 65 72 2e 20  e PCache layer. 
29d90 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
29da0 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45  >errCode!=SQLITE
29db0 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 65  _OK && pPager->e
29dc0 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46  rrCode!=SQLITE_F
29dd0 55 4c 4c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ULL ){.    rc = 
29de0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
29df0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
29e00 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
29e10 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50  Fetch(pPager->pP
29e20 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 31 2c 20  Cache, pgno, 1, 
29e30 70 70 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20  ppPage);.  }..  
29e40 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
29e50 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 45 69 74 68  K ){.    /* Eith
29e60 65 72 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73  er the call to s
29e70 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63  qlite3PcacheFetc
29e80 68 28 29 20 72 65 74 75 72 6e 65 64 20 61 6e 20  h() returned an 
29e90 65 72 72 6f 72 20 6f 72 20 74 68 65 0a 20 20 20  error or the.   
29ea0 20 2a 2a 20 70 61 67 65 72 20 77 61 73 20 61 6c   ** pager was al
29eb0 72 65 61 64 79 20 69 6e 20 74 68 65 20 65 72 72  ready in the err
29ec0 6f 72 2d 73 74 61 74 65 20 77 68 65 6e 20 74 68  or-state when th
29ed0 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20  is function was 
29ee0 63 61 6c 6c 65 64 2e 0a 20 20 20 20 2a 2a 20 53  called..    ** S
29ef0 65 74 20 70 50 67 20 74 6f 20 30 20 61 6e 64 20  et pPg to 0 and 
29f00 6a 75 6d 70 20 74 6f 20 74 68 65 20 65 78 63 65  jump to the exce
29f10 70 74 69 6f 6e 20 68 61 6e 64 6c 65 72 2e 20 20  ption handler.  
29f20 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20 30 3b 0a  */.    pPg = 0;.
29f30 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61      goto pager_a
29f40 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 7d 0a  cquire_err;.  }.
29f50 20 20 61 73 73 65 72 74 28 20 28 2a 70 70 50 61    assert( (*ppPa
29f60 67 65 29 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20  ge)->pgno==pgno 
29f70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 2a 70  );.  assert( (*p
29f80 70 50 61 67 65 29 2d 3e 70 50 61 67 65 72 3d 3d  pPage)->pPager==
29f90 70 50 61 67 65 72 20 7c 7c 20 28 2a 70 70 50 61  pPager || (*ppPa
29fa0 67 65 29 2d 3e 70 50 61 67 65 72 3d 3d 30 20 29  ge)->pPager==0 )
29fb0 3b 0a 0a 20 20 69 66 28 20 28 2a 70 70 50 61 67  ;..  if( (*ppPag
29fc0 65 29 2d 3e 70 50 61 67 65 72 20 26 26 20 21 6e  e)->pPager && !n
29fd0 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20  oContent ){.    
29fe0 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  /* In this case 
29ff0 74 68 65 20 70 63 61 63 68 65 20 61 6c 72 65 61  the pcache alrea
2a000 64 79 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 69  dy contains an i
2a010 6e 69 74 69 61 6c 69 7a 65 64 20 63 6f 70 79 20  nitialized copy 
2a020 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61  of.    ** the pa
2a030 67 65 2e 20 52 65 74 75 72 6e 20 77 69 74 68 6f  ge. Return witho
2a040 75 74 20 66 75 72 74 68 65 72 20 61 64 6f 2e 20  ut further ado. 
2a050 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
2a060 70 67 6e 6f 3c 3d 50 41 47 45 52 5f 4d 41 58 5f  pgno<=PAGER_MAX_
2a070 50 47 4e 4f 20 26 26 20 70 67 6e 6f 21 3d 50 41  PGNO && pgno!=PA
2a080 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
2a090 65 72 29 20 29 3b 0a 20 20 20 20 50 41 47 45 52  er) );.    PAGER
2a0a0 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 48  _INCR(pPager->nH
2a0b0 69 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  it);.    return 
2a0c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 7d 65  SQLITE_OK;..  }e
2a0d0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  lse{.    /* The 
2a0e0 70 61 67 65 72 20 63 61 63 68 65 20 68 61 73 20  pager cache has 
2a0f0 63 72 65 61 74 65 64 20 61 20 6e 65 77 20 70 61  created a new pa
2a100 67 65 2e 20 49 74 73 20 63 6f 6e 74 65 6e 74 20  ge. Its content 
2a110 6e 65 65 64 73 20 74 6f 20 0a 20 20 20 20 2a 2a  needs to .    **
2a120 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e   be initialized.
2a130 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4d 61    */.    int nMa
2a140 78 3b 0a 0a 20 20 20 20 50 41 47 45 52 5f 49 4e  x;..    PAGER_IN
2a150 43 52 28 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73  CR(pPager->nMiss
2a160 29 3b 0a 20 20 20 20 70 50 67 20 3d 20 2a 70 70  );.    pPg = *pp
2a170 50 61 67 65 3b 0a 20 20 20 20 70 50 67 2d 3e 70  Page;.    pPg->p
2a180 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a  Pager = pPager;.
2a190 0a 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 78 69  .    /* The maxi
2a1a0 6d 75 6d 20 70 61 67 65 20 6e 75 6d 62 65 72 20  mum page number 
2a1b0 69 73 20 32 5e 33 31 2e 20 52 65 74 75 72 6e 20  is 2^31. Return 
2a1c0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69  SQLITE_CORRUPT i
2a1d0 66 20 61 20 70 61 67 65 0a 20 20 20 20 2a 2a 20  f a page.    ** 
2a1e0 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72 20 74  number greater t
2a1f0 68 61 6e 20 74 68 69 73 2c 20 6f 72 20 74 68 65  han this, or the
2a200 20 75 6e 75 73 65 64 20 6c 6f 63 6b 69 6e 67 2d   unused locking-
2a210 70 61 67 65 2c 20 69 73 20 72 65 71 75 65 73 74  page, is request
2a220 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ed. */.    if( p
2a230 67 6e 6f 3e 50 41 47 45 52 5f 4d 41 58 5f 50 47  gno>PAGER_MAX_PG
2a240 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45  NO || pgno==PAGE
2a250 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
2a260 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
2a270 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
2a280 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  KPT;.      goto 
2a290 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72  pager_acquire_er
2a2a0 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63  r;.    }..    rc
2a2b0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50   = sqlite3PagerP
2a2c0 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c  agecount(pPager,
2a2d0 20 26 6e 4d 61 78 29 3b 0a 20 20 20 20 69 66 28   &nMax);.    if(
2a2e0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2a2f0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
2a300 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a  er_acquire_err;.
2a310 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 4d      }..    if( M
2a320 45 4d 44 42 20 7c 7c 20 6e 4d 61 78 3c 28 69 6e  EMDB || nMax<(in
2a330 74 29 70 67 6e 6f 20 7c 7c 20 6e 6f 43 6f 6e 74  t)pgno || noCont
2a340 65 6e 74 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70  ent || !isOpen(p
2a350 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20  Pager->fd) ){.  
2a360 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61      if( pgno>pPa
2a370 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20  ger->mxPgno ){. 
2a380 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
2a390 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20 20  TE_FULL;.       
2a3a0 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75   goto pager_acqu
2a3b0 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d  ire_err;.      }
2a3c0 0a 20 20 20 20 20 20 69 66 28 20 6e 6f 43 6f 6e  .      if( noCon
2a3d0 74 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20  tent ){.        
2a3e0 2f 2a 20 46 61 69 6c 75 72 65 20 74 6f 20 73 65  /* Failure to se
2a3f0 74 20 74 68 65 20 62 69 74 73 20 69 6e 20 74 68  t the bits in th
2a400 65 20 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 2d  e InJournal bit-
2a410 76 65 63 74 6f 72 73 20 69 73 20 62 65 6e 69 67  vectors is benig
2a420 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 74  n..        ** It
2a430 20 6d 65 72 65 6c 79 20 6d 65 61 6e 73 20 74 68   merely means th
2a440 61 74 20 77 65 20 6d 69 67 68 74 20 64 6f 20 73  at we might do s
2a450 6f 6d 65 20 65 78 74 72 61 20 77 6f 72 6b 20 74  ome extra work t
2a460 6f 20 6a 6f 75 72 6e 61 6c 20 61 20 0a 20 20 20  o journal a .   
2a470 20 20 20 20 20 2a 2a 20 70 61 67 65 20 74 68 61       ** page tha
2a480 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  t does not need 
2a490 74 6f 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64 2e  to be journaled.
2a4a0 20 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20    Nevertheless, 
2a4b0 62 65 20 73 75 72 65 20 0a 20 20 20 20 20 20 20  be sure .       
2a4c0 20 2a 2a 20 74 6f 20 74 65 73 74 20 74 68 65 20   ** to test the 
2a4d0 63 61 73 65 20 77 68 65 72 65 20 61 20 6d 61 6c  case where a mal
2a4e0 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63 75 72 73  loc error occurs
2a4f0 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f   while trying to
2a500 20 73 65 74 20 0a 20 20 20 20 20 20 20 20 2a 2a   set .        **
2a510 20 61 20 62 69 74 20 69 6e 20 61 20 62 69 74 20   a bit in a bit 
2a520 76 65 63 74 6f 72 2e 0a 20 20 20 20 20 20 20 20  vector..        
2a530 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  */.        sqlit
2a540 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
2a550 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20 69  loc();.        i
2a560 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d  f( pgno<=pPager-
2a570 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 7b 0a 20  >dbOrigSize ){. 
2a580 20 20 20 20 20 20 20 20 20 54 45 53 54 4f 4e 4c           TESTONL
2a590 59 28 20 72 63 20 3d 20 29 20 73 71 6c 69 74 65  Y( rc = ) sqlite
2a5a0 33 42 69 74 76 65 63 53 65 74 28 70 50 61 67 65  3BitvecSet(pPage
2a5b0 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70  r->pInJournal, p
2a5c0 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  gno);.          
2a5d0 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51  testcase( rc==SQ
2a5e0 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20  LITE_NOMEM );.  
2a5f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2a600 54 45 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29  TESTONLY( rc = )
2a610 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42   addToSavepointB
2a620 69 74 76 65 63 73 28 70 50 61 67 65 72 2c 20 70  itvecs(pPager, p
2a630 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 74 65  gno);.        te
2a640 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49  stcase( rc==SQLI
2a650 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20  TE_NOMEM );.    
2a660 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65      sqlite3EndBe
2a670 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
2a680 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73      }.      mems
2a690 65 74 28 70 50 67 2d 3e 70 44 61 74 61 2c 20 30  et(pPg->pData, 0
2a6a0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
2a6b0 7a 65 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41  ze);.      IOTRA
2a6c0 43 45 28 28 22 5a 45 52 4f 20 25 70 20 25 64 5c  CE(("ZERO %p %d\
2a6d0 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f  n", pPager, pgno
2a6e0 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ));.    }else{. 
2a6f0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67       assert( pPg
2a700 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72  ->pPager==pPager
2a710 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 72   );.      rc = r
2a720 65 61 64 44 62 50 61 67 65 28 70 50 67 29 3b 0a  eadDbPage(pPg);.
2a730 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2a740 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2a750 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63     goto pager_ac
2a760 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20  quire_err;.     
2a770 20 7d 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20   }.    }.#ifdef 
2a780 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
2a790 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65  ES.    pPg->page
2a7a0 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67  Hash = pager_pag
2a7b0 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64  ehash(pPg);.#end
2a7c0 69 66 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  if.  }..  return
2a7d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67   SQLITE_OK;..pag
2a7e0 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3a 0a  er_acquire_err:.
2a7f0 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
2a800 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28  LITE_OK );.  if(
2a810 20 70 50 67 20 29 7b 0a 20 20 20 20 73 71 6c 69   pPg ){.    sqli
2a820 74 65 33 50 63 61 63 68 65 44 72 6f 70 28 70 50  te3PcacheDrop(pP
2a830 67 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 55  g);.  }.  pagerU
2a840 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 70 50  nlockIfUnused(pP
2a850 61 67 65 72 29 3b 0a 0a 20 20 2a 70 70 50 61 67  ager);..  *ppPag
2a860 65 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  e = 0;.  return 
2a870 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71  rc;.}../*.** Acq
2a880 75 69 72 65 20 61 20 70 61 67 65 20 69 66 20 69  uire a page if i
2a890 74 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  t is already in 
2a8a0 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61  the in-memory ca
2a8b0 63 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20  che.  Do.** not 
2a8c0 72 65 61 64 20 74 68 65 20 70 61 67 65 20 66 72  read the page fr
2a8d0 6f 6d 20 64 69 73 6b 2e 20 20 52 65 74 75 72 6e  om disk.  Return
2a8e0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
2a8f0 65 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20  e page,.** or 0 
2a900 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  if the page is n
2a910 6f 74 20 69 6e 20 63 61 63 68 65 2e 20 41 6c 73  ot in cache. Als
2a920 6f 2c 20 72 65 74 75 72 6e 20 30 20 69 66 20 74  o, return 0 if t
2a930 68 65 20 0a 2a 2a 20 70 61 67 65 72 20 69 73 20  he .** pager is 
2a940 69 6e 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  in PAGER_UNLOCK 
2a950 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 20  state when this 
2a960 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
2a970 65 64 2c 0a 2a 2a 20 6f 72 20 69 66 20 74 68 65  ed,.** or if the
2a980 20 70 61 67 65 72 20 69 73 20 69 6e 20 61 6e 20   pager is in an 
2a990 65 72 72 6f 72 20 73 74 61 74 65 20 6f 74 68 65  error state othe
2a9a0 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 46 55  r than SQLITE_FU
2a9b0 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c  LL..**.** See al
2a9c0 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  so sqlite3PagerG
2a9d0 65 74 28 29 2e 20 20 54 68 65 20 64 69 66 66 65  et().  The diffe
2a9e0 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68  rence between th
2a9f0 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e  is routine.** an
2aa00 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  d sqlite3PagerGe
2aa10 74 28 29 20 69 73 20 74 68 61 74 20 5f 67 65 74  t() is that _get
2aa20 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68  () will go to th
2aa30 65 20 64 69 73 6b 20 61 6e 64 20 72 65 61 64 0a  e disk and read.
2aa40 2a 2a 20 69 6e 20 74 68 65 20 70 61 67 65 20 69  ** in the page i
2aa50 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
2aa60 74 20 61 6c 72 65 61 64 79 20 69 6e 20 63 61 63  t already in cac
2aa70 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  he.  This routin
2aa80 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c  e.** returns NUL
2aa90 4c 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  L if the page is
2aaa0 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72   not in cache or
2aab0 20 69 66 20 61 20 64 69 73 6b 20 49 2f 4f 20 65   if a disk I/O e
2aac0 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65 76 65  rror .** has eve
2aad0 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44  r happened..*/.D
2aae0 62 50 61 67 65 20 2a 73 71 6c 69 74 65 33 50 61  bPage *sqlite3Pa
2aaf0 67 65 72 4c 6f 6f 6b 75 70 28 50 61 67 65 72 20  gerLookup(Pager 
2ab00 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67  *pPager, Pgno pg
2ab10 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  no){.  PgHdr *pP
2ab20 67 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28  g = 0;.  assert(
2ab30 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20   pPager!=0 );.  
2ab40 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20  assert( pgno!=0 
2ab50 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
2ab60 67 65 72 2d 3e 70 50 43 61 63 68 65 21 3d 30 20  ger->pPCache!=0 
2ab70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
2ab80 67 65 72 2d 3e 73 74 61 74 65 20 3e 20 50 41 47  ger->state > PAG
2ab90 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 73  ER_UNLOCK );.  s
2aba0 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63  qlite3PcacheFetc
2abb0 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  h(pPager->pPCach
2abc0 65 2c 20 70 67 6e 6f 2c 20 30 2c 20 26 70 50 67  e, pgno, 0, &pPg
2abd0 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 67 3b  );.  return pPg;
2abe0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73  .}../*.** Releas
2abf0 65 20 61 20 70 61 67 65 20 72 65 66 65 72 65 6e  e a page referen
2ac00 63 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ce..**.** If the
2ac10 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72   number of refer
2ac20 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67  ences to the pag
2ac30 65 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2c 20  e drop to zero, 
2ac40 74 68 65 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65  then the.** page
2ac50 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65   is added to the
2ac60 20 4c 52 55 20 6c 69 73 74 2e 20 20 57 68 65 6e   LRU list.  When
2ac70 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 73 20   all references 
2ac80 74 6f 20 61 6c 6c 20 70 61 67 65 73 0a 2a 2a 20  to all pages.** 
2ac90 61 72 65 20 72 65 6c 65 61 73 65 64 2c 20 61 20  are released, a 
2aca0 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20  rollback occurs 
2acb0 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20  and the lock on 
2acc0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 0a  the database is.
2acd0 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 76  ** removed..*/.v
2ace0 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
2acf0 55 6e 72 65 66 28 44 62 50 61 67 65 20 2a 70 50  Unref(DbPage *pP
2ad00 67 29 7b 0a 20 20 69 66 28 20 70 50 67 20 29 7b  g){.  if( pPg ){
2ad10 0a 20 20 20 20 50 61 67 65 72 20 2a 70 50 61 67  .    Pager *pPag
2ad20 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
2ad30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  ;.    sqlite3Pca
2ad40 63 68 65 52 65 6c 65 61 73 65 28 70 50 67 29 3b  cheRelease(pPg);
2ad50 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b  .    pagerUnlock
2ad60 49 66 55 6e 75 73 65 64 28 70 50 61 67 65 72 29  IfUnused(pPager)
2ad70 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
2ad80 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
2ad90 63 61 6c 6c 65 64 20 61 74 20 74 68 65 20 73 74  called at the st
2ada0 61 72 74 20 6f 66 20 65 76 65 72 79 20 77 72 69  art of every wri
2adb0 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  te transaction..
2adc0 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20 61 6c  ** There must al
2add0 72 65 61 64 79 20 62 65 20 61 20 52 45 53 45 52  ready be a RESER
2ade0 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45  VED or EXCLUSIVE
2adf0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
2ae00 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20 77  abase .** file w
2ae10 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
2ae20 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a   is called..**.*
2ae30 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e  * Open the journ
2ae40 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65  al file for page
2ae50 72 20 70 50 61 67 65 72 20 61 6e 64 20 77 72 69  r pPager and wri
2ae60 74 65 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61  te a journal hea
2ae70 64 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74  der.** to the st
2ae80 61 72 74 20 6f 66 20 69 74 2e 20 49 66 20 74 68  art of it. If th
2ae90 65 72 65 20 61 72 65 20 61 63 74 69 76 65 20 73  ere are active s
2aea0 61 76 65 70 6f 69 6e 74 73 2c 20 6f 70 65 6e 20  avepoints, open 
2aeb0 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a  the sub-journal.
2aec0 2a 2a 20 61 73 20 77 65 6c 6c 2e 20 54 68 69 73  ** as well. This
2aed0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c   function is onl
2aee0 79 20 75 73 65 64 20 77 68 65 6e 20 74 68 65 20  y used when the 
2aef0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
2af00 62 65 69 6e 67 20 0a 2a 2a 20 6f 70 65 6e 65 64  being .** opened
2af10 20 74 6f 20 77 72 69 74 65 20 61 20 72 6f 6c 6c   to write a roll
2af20 62 61 63 6b 20 6c 6f 67 20 66 6f 72 20 61 20 74  back log for a t
2af30 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 74 20 69  ransaction. It i
2af40 73 20 6e 6f 74 20 75 73 65 64 20 0a 2a 2a 20 77  s not used .** w
2af50 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20 68 6f  hen opening a ho
2af60 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  t journal file t
2af70 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 0a  o roll it back..
2af80 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75  **.** If the jou
2af90 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 61 6c 72  rnal file is alr
2afa0 65 61 64 79 20 6f 70 65 6e 20 28 61 73 20 69 74  eady open (as it
2afb0 20 6d 61 79 20 62 65 20 69 6e 20 65 78 63 6c 75   may be in exclu
2afc0 73 69 76 65 20 6d 6f 64 65 29 2c 0a 2a 2a 20 74  sive mode),.** t
2afd0 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
2afe0 6e 20 6a 75 73 74 20 77 72 69 74 65 73 20 61 20  n just writes a 
2aff0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74  journal header t
2b000 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  o the start of t
2b010 68 65 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 70  he.** already op
2b020 65 6e 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20  en file. .**.** 
2b030 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  Whether or not t
2b040 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2b050 69 73 20 6f 70 65 6e 65 64 20 62 79 20 74 68 69  is opened by thi
2b060 73 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 0a  s function, the.
2b070 2a 2a 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72  ** Pager.pInJour
2b080 6e 61 6c 20 62 69 74 76 65 63 20 73 74 72 75 63  nal bitvec struc
2b090 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65  ture is allocate
2b0a0 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  d..**.** Return 
2b0b0 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65  SQLITE_OK if eve
2b0c0 72 79 74 68 69 6e 67 20 69 73 20 73 75 63 63 65  rything is succe
2b0d0 73 73 66 75 6c 2e 20 4f 74 68 65 72 77 69 73 65  ssful. Otherwise
2b0e0 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c  , return .** SQL
2b0f0 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 74 68 65  ITE_NOMEM if the
2b100 20 61 74 74 65 6d 70 74 20 74 6f 20 61 6c 6c 6f   attempt to allo
2b110 63 61 74 65 20 50 61 67 65 72 2e 70 49 6e 4a 6f  cate Pager.pInJo
2b120 75 72 6e 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20  urnal fails, or 
2b130 0a 2a 2a 20 61 6e 20 49 4f 20 65 72 72 6f 72 20  .** an IO error 
2b140 63 6f 64 65 20 69 66 20 6f 70 65 6e 69 6e 67 20  code if opening 
2b150 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65 20 6a  or writing the j
2b160 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c  ournal file fail
2b170 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
2b180 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72   pager_open_jour
2b190 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  nal(Pager *pPage
2b1a0 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
2b1b0 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
2b1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b1d0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
2b1e0 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 20  */.  int nPage; 
2b1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b210 2f 2a 20 53 69 7a 65 20 6f 66 20 64 61 74 61 62  /* Size of datab
2b220 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 73 71  ase file */.  sq
2b230 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73  lite3_vfs * cons
2b240 74 20 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d  t pVfs = pPager-
2b250 3e 70 56 66 73 3b 20 20 20 2f 2a 20 4c 6f 63 61  >pVfs;   /* Loca
2b260 6c 20 63 61 63 68 65 20 6f 66 20 76 66 73 20 70  l cache of vfs p
2b270 6f 69 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73  ointer */..  ass
2b280 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
2b290 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56  te>=PAGER_RESERV
2b2a0 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ED );.  assert( 
2b2b0 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
2b2c0 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  al );.  assert( 
2b2d0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
2b2e0 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode!=PAGER_JOURN
2b2f0 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 3b 0a 20 20  ALMODE_OFF );.  
2b300 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2b310 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b  pInJournal==0 );
2b320 0a 20 20 0a 20 20 2f 2a 20 49 66 20 61 6c 72 65  .  .  /* If alre
2b330 61 64 79 20 69 6e 20 74 68 65 20 65 72 72 6f 72  ady in the error
2b340 20 73 74 61 74 65 2c 20 74 68 69 73 20 66 75 6e   state, this fun
2b350 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
2b360 2e 20 20 42 75 74 20 6f 6e 0a 20 20 2a 2a 20 74  .  But on.  ** t
2b370 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 74  he other hand, t
2b380 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e  his routine is n
2b390 65 76 65 72 20 63 61 6c 6c 65 64 20 69 66 20 77  ever called if w
2b3a0 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e  e are already in
2b3b0 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 73  .  ** an error s
2b3c0 74 61 74 65 2e 20 2a 2f 0a 20 20 69 66 28 20 4e  tate. */.  if( N
2b3d0 45 56 45 52 28 70 50 61 67 65 72 2d 3e 65 72 72  EVER(pPager->err
2b3e0 43 6f 64 65 29 20 29 20 72 65 74 75 72 6e 20 70  Code) ) return p
2b3f0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
2b400 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61  .  testcase( pPa
2b410 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64  ger->dbSizeValid
2b420 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  ==0 );.  rc = sq
2b430 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
2b440 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61  unt(pPager, &nPa
2b450 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ge);.  if( rc ) 
2b460 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70 50 61  return rc;.  pPa
2b470 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ger->pInJournal 
2b480 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43  = sqlite3BitvecC
2b490 72 65 61 74 65 28 6e 50 61 67 65 29 3b 0a 20 20  reate(nPage);.  
2b4a0 69 66 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  if( pPager->pInJ
2b4b0 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20  ournal==0 ){.   
2b4c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
2b4d0 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  OMEM;.  }..  /* 
2b4e0 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Open the journal
2b4f0 20 66 69 6c 65 20 69 66 20 69 74 20 69 73 20 6e   file if it is n
2b500 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2e  ot already open.
2b510 20 2a 2f 0a 20 20 69 66 28 20 21 69 73 4f 70 65   */.  if( !isOpe
2b520 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
2b530 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  {.    if( pPager
2b540 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
2b550 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
2b560 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20  _MEMORY ){.     
2b570 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e   sqlite3MemJourn
2b580 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  alOpen(pPager->j
2b590 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  fd);.    }else{.
2b5a0 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20        const int 
2b5b0 66 6c 61 67 73 20 3d 20 20 20 20 20 20 20 20 20  flags =         
2b5c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 46 53            /* VFS
2b5d0 20 66 6c 61 67 73 20 74 6f 20 6f 70 65 6e 20 6a   flags to open j
2b5e0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
2b5f0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
2b600 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c  EN_READWRITE|SQL
2b610 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c  ITE_OPEN_CREATE|
2b620 0a 20 20 20 20 20 20 20 20 28 70 50 61 67 65 72  .        (pPager
2b630 2d 3e 74 65 6d 70 46 69 6c 65 20 3f 20 0a 20 20  ->tempFile ? .  
2b640 20 20 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f          (SQLITE_
2b650 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
2b660 53 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54  SE|SQLITE_OPEN_T
2b670 45 4d 50 5f 4a 4f 55 52 4e 41 4c 29 3a 0a 20 20  EMP_JOURNAL):.  
2b680 20 20 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f          (SQLITE_
2b690 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
2b6a0 4c 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 23 69  L).        );.#i
2b6b0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
2b6c0 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a  LE_ATOMIC_WRITE.
2b6d0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2b6e0 65 33 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 0a 20  e3JournalOpen(. 
2b6f0 20 20 20 20 20 20 20 20 20 70 56 66 73 2c 20 70           pVfs, p
2b700 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
2b710 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c   pPager->jfd, fl
2b720 61 67 73 2c 20 6a 72 6e 6c 42 75 66 66 65 72 53  ags, jrnlBufferS
2b730 69 7a 65 28 70 50 61 67 65 72 29 0a 20 20 20 20  ize(pPager).    
2b740 20 20 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20    );.#else.     
2b750 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
2b760 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72  pen(pVfs, pPager
2b770 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67  ->zJournal, pPag
2b780 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20  er->jfd, flags, 
2b790 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  0);.#endif.    }
2b7a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
2b7b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73  =SQLITE_OK || is
2b7c0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
2b7d0 29 20 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20  ) );.  }...  /* 
2b7e0 57 72 69 74 65 20 74 68 65 20 66 69 72 73 74 20  Write the first 
2b7f0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74  journal header t
2b800 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
2b810 6c 65 20 61 6e 64 20 6f 70 65 6e 20 0a 20 20 2a  le and open .  *
2b820 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  * the sub-journa
2b830 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a  l if necessary..
2b840 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53    */.  if( rc==S
2b850 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2b860 2f 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b 20 69  /* TODO: Check i
2b870 66 20 61 6c 6c 20 6f 66 20 74 68 65 73 65 20 61  f all of these a
2b880 72 65 20 72 65 61 6c 6c 79 20 72 65 71 75 69 72  re really requir
2b890 65 64 2e 20 2a 2f 0a 20 20 20 20 70 50 61 67 65  ed. */.    pPage
2b8a0 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 3d 20  r->dbOrigSize = 
2b8b0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
2b8c0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
2b8d0 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a  nalStarted = 0;.
2b8e0 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64      pPager->need
2b8f0 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 70 50  Sync = 0;.    pP
2b900 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a  ager->nRec = 0;.
2b910 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
2b920 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20  nalOff = 0;.    
2b930 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
2b940 72 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  r = 0;.    pPage
2b950 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20  r->journalHdr = 
2b960 30 3b 0a 20 20 20 20 72 63 20 3d 20 77 72 69 74  0;.    rc = writ
2b970 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  eJournalHdr(pPag
2b980 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  er);.  }..  if( 
2b990 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2b9a0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76  .    sqlite3Bitv
2b9b0 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72  ecDestroy(pPager
2b9c0 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20  ->pInJournal);. 
2b9d0 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f     pPager->pInJo
2b9e0 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20  urnal = 0;.  }. 
2b9f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2ba00 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20 77 72 69  *.** Begin a wri
2ba10 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  te-transaction o
2ba20 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  n the specified 
2ba30 70 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 49 66  pager object. If
2ba40 20 61 20 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61   a .** write-tra
2ba50 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72  nsaction has alr
2ba60 65 61 64 79 20 62 65 65 6e 20 6f 70 65 6e 65 64  eady been opened
2ba70 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
2ba80 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
2ba90 2a 20 49 66 20 74 68 65 20 65 78 46 6c 61 67 20  * If the exFlag 
2baa0 61 72 67 75 6d 65 6e 74 20 69 73 20 66 61 6c 73  argument is fals
2bab0 65 2c 20 74 68 65 6e 20 61 63 71 75 69 72 65 20  e, then acquire 
2bac0 61 74 20 6c 65 61 73 74 20 61 20 52 45 53 45 52  at least a RESER
2bad0 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74  VED.** lock on t
2bae0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2baf0 2e 20 49 66 20 65 78 46 6c 61 67 20 69 73 20 74  . If exFlag is t
2bb00 72 75 65 2c 20 74 68 65 6e 20 61 63 71 75 69 72  rue, then acquir
2bb10 65 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20 61 6e  e at least.** an
2bb20 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
2bb30 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20   If such a lock 
2bb40 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c  is already held,
2bb50 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20 0a 2a 2a 20   no locking .** 
2bb60 66 75 6e 63 74 69 6f 6e 73 20 6e 65 65 64 20 62  functions need b
2bb70 65 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20  e called..**.** 
2bb80 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61  If this is not a
2bb90 20 74 65 6d 70 6f 72 61 72 79 20 6f 72 20 69 6e   temporary or in
2bba0 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 61 6e 64  -memory file and
2bbb0 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  , the journal fi
2bbc0 6c 65 20 69 73 20 0a 2a 2a 20 6f 70 65 6e 65 64  le is .** opened
2bbd0 20 69 66 20 69 74 20 68 61 73 20 6e 6f 74 20 62   if it has not b
2bbe0 65 65 6e 20 61 6c 72 65 61 64 79 2e 20 46 6f 72  een already. For
2bbf0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
2bc00 65 2c 20 74 68 65 20 6f 70 65 6e 69 6e 67 20 0a  e, the opening .
2bc10 2a 2a 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** of the journa
2bc20 6c 20 66 69 6c 65 20 69 73 20 64 65 66 65 72 72  l file is deferr
2bc30 65 64 20 75 6e 74 69 6c 20 74 68 65 72 65 20 69  ed until there i
2bc40 73 20 61 6e 20 61 63 74 75 61 6c 20 6e 65 65 64  s an actual need
2bc50 20 74 6f 20 0a 2a 2a 20 77 72 69 74 65 20 74 6f   to .** write to
2bc60 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 54 4f   the journal. TO
2bc70 44 4f 3a 20 57 68 79 20 68 61 6e 64 6c 65 20 74  DO: Why handle t
2bc80 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20 64  emporary files d
2bc90 69 66 66 65 72 65 6e 74 6c 79 3f 0a 2a 2a 0a 2a  ifferently?.**.*
2bca0 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
2bcb0 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20   file is opened 
2bcc0 28 6f 72 20 69 66 20 69 74 20 69 73 20 61 6c 72  (or if it is alr
2bcd0 65 61 64 79 20 6f 70 65 6e 29 2c 20 74 68 65 6e  eady open), then
2bce0 20 61 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 2d 68 65   a.** journal-he
2bcf0 61 64 65 72 20 69 73 20 77 72 69 74 74 65 6e 20  ader is written 
2bd00 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
2bd10 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  it..**.** If the
2bd20 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 61 72   subjInMemory ar
2bd30 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d 7a 65  gument is non-ze
2bd40 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20 73 75 62  ro, then any sub
2bd50 2d 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e 65 64 0a  -journal opened.
2bd60 2a 2a 20 77 69 74 68 69 6e 20 74 68 69 73 20 74  ** within this t
2bd70 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20  ransaction will 
2bd80 62 65 20 6f 70 65 6e 65 64 20 61 73 20 61 6e 20  be opened as an 
2bd90 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2e 20  in-memory file. 
2bda0 54 68 69 73 0a 2a 2a 20 68 61 73 20 6e 6f 20 65  This.** has no e
2bdb0 66 66 65 63 74 20 69 66 20 74 68 65 20 73 75 62  ffect if the sub
2bdc0 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6c 72 65  -journal is alre
2bdd0 61 64 79 20 6f 70 65 6e 65 64 20 28 61 73 20 69  ady opened (as i
2bde0 74 20 6d 61 79 20 62 65 20 77 68 65 6e 0a 2a 2a  t may be when.**
2bdf0 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c   running in excl
2be00 75 73 69 76 65 20 6d 6f 64 65 29 20 6f 72 20 69  usive mode) or i
2be10 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
2be20 6e 20 64 6f 65 73 20 6e 6f 74 20 72 65 71 75 69  n does not requi
2be30 72 65 20 61 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72  re a.** sub-jour
2be40 6e 61 6c 2e 20 49 66 20 74 68 65 20 73 75 62 6a  nal. If the subj
2be50 49 6e 4d 65 6d 6f 72 79 20 61 72 67 75 6d 65 6e  InMemory argumen
2be60 74 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20  t is zero, then 
2be70 61 6e 79 20 72 65 71 75 69 72 65 64 0a 2a 2a 20  any required.** 
2be80 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 69  sub-journal is i
2be90 6d 70 6c 65 6d 65 6e 74 65 64 20 69 6e 2d 6d 65  mplemented in-me
2bea0 6d 6f 72 79 20 69 66 20 70 50 61 67 65 72 20 69  mory if pPager i
2beb0 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  s an in-memory d
2bec0 61 74 61 62 61 73 65 2c 20 0a 2a 2a 20 6f 72 20  atabase, .** or 
2bed0 75 73 69 6e 67 20 61 20 74 65 6d 70 6f 72 61 72  using a temporar
2bee0 79 20 66 69 6c 65 20 6f 74 68 65 72 77 69 73 65  y file otherwise
2bef0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2bf00 50 61 67 65 72 42 65 67 69 6e 28 50 61 67 65 72  PagerBegin(Pager
2bf10 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65 78   *pPager, int ex
2bf20 46 6c 61 67 2c 20 69 6e 74 20 73 75 62 6a 49 6e  Flag, int subjIn
2bf30 4d 65 6d 6f 72 79 29 7b 0a 20 20 69 6e 74 20 72  Memory){.  int r
2bf40 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2bf50 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2bf60 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e  >state!=PAGER_UN
2bf70 4c 4f 43 4b 20 29 3b 0a 20 20 70 50 61 67 65 72  LOCK );.  pPager
2bf80 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 3d  ->subjInMemory =
2bf90 20 28 75 38 29 73 75 62 6a 49 6e 4d 65 6d 6f 72   (u8)subjInMemor
2bfa0 79 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72  y;..  if( pPager
2bfb0 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53  ->state==PAGER_S
2bfc0 48 41 52 45 44 20 29 7b 0a 20 20 20 20 61 73 73  HARED ){.    ass
2bfd0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e  ert( pPager->pIn
2bfe0 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20  Journal==0 );.  
2bff0 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
2c000 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d   && !pPager->tem
2c010 70 46 69 6c 65 20 29 3b 0a 0a 20 20 20 20 69 66  pFile );..    if
2c020 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
2c030 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 2f  ager) ){.      /
2c040 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
2c050 73 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20  s configured to 
2c060 75 73 65 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65  use locking_mode
2c070 3d 65 78 63 6c 75 73 69 76 65 2c 20 61 6e 64 20  =exclusive, and 
2c080 61 6e 0a 20 20 20 20 20 20 2a 2a 20 65 78 63 6c  an.      ** excl
2c090 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  usive lock on th
2c0a0 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f  e database is no
2c0b0 74 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20  t already held, 
2c0c0 6f 62 74 61 69 6e 20 69 74 20 6e 6f 77 2e 0a 20  obtain it now.. 
2c0d0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
2c0e0 28 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73  ( pPager->exclus
2c0f0 69 76 65 4d 6f 64 65 20 26 26 20 73 71 6c 69 74  iveMode && sqlit
2c100 65 33 57 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f  e3WalExclusiveMo
2c110 64 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  de(pPager->pWal,
2c120 20 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20   -1) ){.        
2c130 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f  rc = sqlite3OsLo
2c140 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 45  ck(pPager->fd, E
2c150 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a  XCLUSIVE_LOCK);.
2c160 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
2c170 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48  state = PAGER_SH
2c180 41 52 45 44 3b 0a 20 20 20 20 20 20 20 20 69 66  ARED;.        if
2c190 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2c1a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
2c1b0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
2c1c0 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
2c1d0 33 57 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64  3WalExclusiveMod
2c1e0 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  e(pPager->pWal, 
2c1f0 31 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  1);.      }..   
2c200 20 20 20 2f 2a 20 47 72 61 62 20 74 68 65 20 77     /* Grab the w
2c210 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite lock on the
2c220 20 6c 6f 67 20 66 69 6c 65 2e 20 49 66 20 73 75   log file. If su
2c230 63 63 65 73 73 66 75 6c 2c 20 75 70 67 72 61 64  ccessful, upgrad
2c240 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 50 41  e to.      ** PA
2c250 47 45 52 5f 52 45 53 45 52 56 45 44 20 73 74 61  GER_RESERVED sta
2c260 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72  te. Otherwise, r
2c270 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
2c280 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ode to the calle
2c290 72 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20  r..      ** The 
2c2a0 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 69 73 20  busy-handler is 
2c2b0 6e 6f 74 20 69 6e 76 6f 6b 65 64 20 69 66 20 61  not invoked if a
2c2c0 6e 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f  nother connectio
2c2d0 6e 20 61 6c 72 65 61 64 79 0a 20 20 20 20 20 20  n already.      
2c2e0 2a 2a 20 68 6f 6c 64 73 20 74 68 65 20 77 72 69  ** holds the wri
2c2f0 74 65 2d 6c 6f 63 6b 2e 20 49 66 20 70 6f 73 73  te-lock. If poss
2c300 69 62 6c 65 2c 20 74 68 65 20 75 70 70 65 72 20  ible, the upper 
2c310 6c 61 79 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20  layer will call 
2c320 69 74 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  it..      **.   
2c330 20 20 20 2a 2a 20 57 41 4c 20 6d 6f 64 65 20 73     ** WAL mode s
2c340 65 74 73 20 50 61 67 65 72 2e 73 74 61 74 65 20  ets Pager.state 
2c350 74 6f 20 50 41 47 45 52 5f 52 45 53 45 52 56 45  to PAGER_RESERVE
2c360 44 20 77 68 65 6e 20 69 74 20 68 61 73 20 61 6e  D when it has an
2c370 20 6f 70 65 6e 0a 20 20 20 20 20 20 2a 2a 20 74   open.      ** t
2c380 72 61 6e 73 61 63 74 69 6f 6e 2c 20 62 75 74 20  ransaction, but 
2c390 6e 65 76 65 72 20 74 6f 20 50 41 47 45 52 5f 45  never to PAGER_E
2c3a0 58 43 4c 55 53 49 56 45 2e 20 54 68 69 73 20 69  XCLUSIVE. This i
2c3b0 73 20 62 65 63 61 75 73 65 20 69 6e 20 0a 20 20  s because in .  
2c3c0 20 20 20 20 2a 2a 20 50 41 47 45 52 5f 45 58 43      ** PAGER_EXC
2c3d0 4c 55 53 49 56 45 20 73 74 61 74 65 20 74 68 65  LUSIVE state the
2c3e0 20 63 6f 64 65 20 74 6f 20 72 6f 6c 6c 20 62 61   code to roll ba
2c3f0 63 6b 20 73 61 76 65 70 6f 69 6e 74 20 74 72 61  ck savepoint tra
2c400 6e 73 61 63 74 69 6f 6e 73 0a 20 20 20 20 20 20  nsactions.      
2c410 2a 2a 20 6d 61 79 20 63 6f 70 79 20 64 61 74 61  ** may copy data
2c420 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f   from the sub-jo
2c430 75 72 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20 64  urnal into the d
2c440 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 73 20  atabase file as 
2c450 77 65 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 61 73  well.      ** as
2c460 20 69 6e 74 6f 20 74 68 65 20 70 61 67 65 20 63   into the page c
2c470 61 63 68 65 2e 20 57 68 69 63 68 20 77 6f 75 6c  ache. Which woul
2c480 64 20 62 65 20 69 6e 63 6f 72 72 65 63 74 20 69  d be incorrect i
2c490 6e 20 57 41 4c 20 6d 6f 64 65 2e 0a 20 20 20 20  n WAL mode..    
2c4a0 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20    */.      rc = 
2c4b0 73 71 6c 69 74 65 33 57 61 6c 42 65 67 69 6e 57  sqlite3WalBeginW
2c4c0 72 69 74 65 54 72 61 6e 73 61 63 74 69 6f 6e 28  riteTransaction(
2c4d0 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 20  pPager->pWal);. 
2c4e0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
2c4f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2c500 20 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67    pPager->dbOrig
2c510 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
2c520 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 70  bSize;.        p
2c530 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
2c540 41 47 45 52 5f 52 45 53 45 52 56 45 44 3b 0a 20  AGER_RESERVED;. 
2c550 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
2c560 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
2c570 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73       }..      as
2c580 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
2c590 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73  _OK || pPager->s
2c5a0 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45  tate==PAGER_RESE
2c5b0 52 56 45 44 20 29 3b 0a 20 20 20 20 20 20 61 73  RVED );.      as
2c5c0 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
2c5d0 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73  _OK || pPager->s
2c5e0 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41 52  tate==PAGER_SHAR
2c5f0 45 44 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ED );.    }else{
2c600 0a 20 20 20 20 20 20 2f 2a 20 4f 62 74 61 69 6e  .      /* Obtain
2c610 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
2c620 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2c630 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 65 78   file. If the ex
2c640 46 6c 61 67 20 70 61 72 61 6d 65 74 65 72 0a 20  Flag parameter. 
2c650 20 20 20 20 20 2a 2a 20 69 73 20 74 72 75 65 2c       ** is true,
2c660 20 74 68 65 6e 20 69 6d 6d 65 64 69 61 74 65 6c   then immediatel
2c670 79 20 75 70 67 72 61 64 65 20 74 68 69 73 20 74  y upgrade this t
2c680 6f 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  o an EXCLUSIVE l
2c690 6f 63 6b 2e 20 54 68 65 0a 20 20 20 20 20 20 2a  ock. The.      *
2c6a0 2a 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63  * busy-handler c
2c6b0 61 6c 6c 62 61 63 6b 20 63 61 6e 20 62 65 20 75  allback can be u
2c6c0 73 65 64 20 77 68 65 6e 20 75 70 67 72 61 64 69  sed when upgradi
2c6d0 6e 67 20 74 6f 20 74 68 65 20 45 58 43 4c 55 53  ng to the EXCLUS
2c6e0 49 56 45 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63  IVE.      ** loc
2c6f0 6b 2c 20 62 75 74 20 6e 6f 74 20 77 68 65 6e 20  k, but not when 
2c700 6f 62 74 61 69 6e 69 6e 67 20 74 68 65 20 52 45  obtaining the RE
2c710 53 45 52 56 45 44 20 6c 6f 63 6b 2e 0a 20 20 20  SERVED lock..   
2c720 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
2c730 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70   sqlite3OsLock(p
2c740 50 61 67 65 72 2d 3e 66 64 2c 20 52 45 53 45 52  Pager->fd, RESER
2c750 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  VED_LOCK);.     
2c760 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2c770 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  OK ){.        pP
2c780 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
2c790 47 45 52 5f 52 45 53 45 52 56 45 44 3b 0a 20 20  GER_RESERVED;.  
2c7a0 20 20 20 20 20 20 69 66 28 20 65 78 46 6c 61 67        if( exFlag
2c7b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
2c7c0 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e   = pager_wait_on
2c7d0 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58  _lock(pPager, EX
2c7e0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20  CLUSIVE_LOCK);. 
2c7f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2c800 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4e  .    }..    /* N
2c810 6f 20 6e 65 65 64 20 74 6f 20 6f 70 65 6e 20 74  o need to open t
2c820 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2c830 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20 20 49  at this time.  I
2c840 74 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 2a 2a  t will be.    **
2c850 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20 69   opened before i
2c860 74 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 2e  t is written to.
2c870 20 20 49 66 20 77 65 20 64 65 66 65 72 20 6f 70    If we defer op
2c880 65 6e 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  ening the journa
2c890 6c 2c 0a 20 20 20 20 2a 2a 20 77 65 20 6d 69 67  l,.    ** we mig
2c8a0 68 74 20 73 61 76 65 20 74 68 65 20 77 6f 72 6b  ht save the work
2c8b0 20 6f 66 20 63 72 65 61 74 69 6e 67 20 61 20 66   of creating a f
2c8c0 69 6c 65 20 69 66 20 74 68 65 20 74 72 61 6e 73  ile if the trans
2c8d0 61 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 65 6e  action.    ** en
2c8e0 64 73 20 75 70 20 62 65 69 6e 67 20 61 20 6e 6f  ds up being a no
2c8f0 2d 6f 70 2e 0a 20 20 20 20 2a 2f 0a 0a 20 20 20  -op..    */..   
2c900 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2c910 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  OK ){.      asse
2c920 72 74 28 20 21 70 50 61 67 65 72 2d 3e 64 62 4d  rt( !pPager->dbM
2c930 6f 64 69 66 69 65 64 20 29 3b 0a 20 20 20 20 20  odified );.     
2c940 20 2f 2a 20 49 67 6e 6f 72 65 20 61 6e 79 20 49   /* Ignore any I
2c950 4f 20 65 72 72 6f 72 20 74 68 61 74 20 6f 63 63  O error that occ
2c960 75 72 73 20 77 69 74 68 69 6e 20 70 61 67 65 72  urs within pager
2c970 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
2c980 28 29 2e 20 54 68 65 0a 20 20 20 20 20 20 2a 2a  (). The.      **
2c990 20 70 75 72 70 6f 73 65 20 6f 66 20 74 68 69 73   purpose of this
2c9a0 20 63 61 6c 6c 20 69 73 20 74 6f 20 72 65 73 65   call is to rese
2c9b0 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73  t the internal s
2c9c0 74 61 74 65 20 6f 66 20 74 68 65 20 70 61 67 65  tate of the page
2c9d0 72 0a 20 20 20 20 20 20 2a 2a 20 73 75 62 2d 73  r.      ** sub-s
2c9e0 79 73 74 65 6d 2e 20 49 74 20 64 6f 65 73 6e 27  ystem. It doesn'
2c9f0 74 20 6d 61 74 74 65 72 20 69 66 20 74 68 65 20  t matter if the 
2ca00 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 69 73 20  journal-file is 
2ca10 6e 6f 74 20 70 72 6f 70 65 72 6c 79 0a 20 20 20  not properly.   
2ca20 20 20 20 2a 2a 20 66 69 6e 61 6c 69 7a 65 64 20     ** finalized 
2ca30 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 28 73  at this point (s
2ca40 69 6e 63 65 20 69 74 20 69 73 20 6e 6f 74 20 61  ince it is not a
2ca50 20 76 61 6c 69 64 20 6a 6f 75 72 6e 61 6c 20 66   valid journal f
2ca60 69 6c 65 20 61 6e 79 77 61 79 29 2e 0a 20 20 20  ile anyway)..   
2ca70 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 61 67 65     */.      page
2ca80 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  r_end_transactio
2ca90 6e 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20  n(pPager, 0);.  
2caa0 20 20 7d 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52    }.  }..  PAGER
2cab0 54 52 41 43 45 28 28 22 54 52 41 4e 53 41 43 54  TRACE(("TRANSACT
2cac0 49 4f 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  ION %d\n", PAGER
2cad0 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20  ID(pPager)));.  
2cae0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2caf0 0a 2a 2a 20 4d 61 72 6b 20 61 20 73 69 6e 67 6c  .** Mark a singl
2cb00 65 20 64 61 74 61 20 70 61 67 65 20 61 73 20 77  e data page as w
2cb10 72 69 74 65 61 62 6c 65 2e 20 54 68 65 20 70 61  riteable. The pa
2cb20 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  ge is written in
2cb30 74 6f 20 74 68 65 20 0a 2a 2a 20 6d 61 69 6e 20  to the .** main 
2cb40 6a 6f 75 72 6e 61 6c 20 6f 72 20 73 75 62 2d 6a  journal or sub-j
2cb50 6f 75 72 6e 61 6c 20 61 73 20 72 65 71 75 69 72  ournal as requir
2cb60 65 64 2e 20 49 66 20 74 68 65 20 70 61 67 65 20  ed. If the page 
2cb70 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a  is written into.
2cb80 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20 6a 6f  ** one of the jo
2cb90 75 72 6e 61 6c 73 2c 20 74 68 65 20 63 6f 72 72  urnals, the corr
2cba0 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73  esponding bit is
2cbb0 20 73 65 74 20 69 6e 20 74 68 65 20 0a 2a 2a 20   set in the .** 
2cbc0 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c  Pager.pInJournal
2cbd0 20 62 69 74 76 65 63 20 61 6e 64 20 74 68 65 20   bitvec and the 
2cbe0 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70  PagerSavepoint.p
2cbf0 49 6e 53 61 76 65 70 6f 69 6e 74 20 62 69 74 76  InSavepoint bitv
2cc00 65 63 73 0a 2a 2a 20 6f 66 20 61 6e 79 20 6f 70  ecs.** of any op
2cc10 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 61 73  en savepoints as
2cc20 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a 2a 2f   appropriate..*/
2cc30 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
2cc40 72 5f 77 72 69 74 65 28 50 67 48 64 72 20 2a 70  r_write(PgHdr *p
2cc50 50 67 29 7b 0a 20 20 76 6f 69 64 20 2a 70 44 61  Pg){.  void *pDa
2cc60 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b  ta = pPg->pData;
2cc70 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
2cc80 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
2cc90 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2cca0 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  E_OK;..  /* This
2ccb0 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f 74 20   routine is not 
2ccc0 63 61 6c 6c 65 64 20 75 6e 6c 65 73 73 20 61 20  called unless a 
2ccd0 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20  transaction has 
2cce0 61 6c 72 65 61 64 79 20 62 65 65 6e 0a 20 20 2a  already been.  *
2ccf0 2a 20 73 74 61 72 74 65 64 2e 0a 20 20 2a 2f 0a  * started..  */.
2cd00 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2cd10 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  ->state>=PAGER_R
2cd20 45 53 45 52 56 45 44 20 29 3b 0a 0a 20 20 2f 2a  ESERVED );..  /*
2cd30 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73   If an error has
2cd40 20 62 65 65 6e 20 70 72 65 76 69 6f 75 73 6c 79   been previously
2cd50 20 64 65 74 65 63 74 65 64 2c 20 72 65 70 6f 72   detected, repor
2cd60 74 20 74 68 65 20 73 61 6d 65 20 65 72 72 6f 72  t the same error
2cd70 0a 20 20 2a 2a 20 61 67 61 69 6e 2e 0a 20 20 2a  .  ** again..  *
2cd80 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 50  /.  if( NEVER(pP
2cd90 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29  ager->errCode) )
2cda0 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
2cdb0 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20 2f 2a 20  >errCode;..  /* 
2cdc0 48 69 67 68 65 72 2d 6c 65 76 65 6c 20 72 6f 75  Higher-level rou
2cdd0 74 69 6e 65 73 20 6e 65 76 65 72 20 63 61 6c 6c  tines never call
2cde0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
2cdf0 66 20 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f  f database is no
2ce00 74 0a 20 20 2a 2a 20 77 72 69 74 61 62 6c 65 2e  t.  ** writable.
2ce10 20 20 42 75 74 20 63 68 65 63 6b 20 61 6e 79 77    But check anyw
2ce20 61 79 2c 20 6a 75 73 74 20 66 6f 72 20 72 6f 62  ay, just for rob
2ce30 75 73 74 6e 65 73 73 2e 20 2a 2f 0a 20 20 69 66  ustness. */.  if
2ce40 28 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e  ( NEVER(pPager->
2ce50 72 65 61 64 4f 6e 6c 79 29 20 29 20 72 65 74 75  readOnly) ) retu
2ce60 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a  rn SQLITE_PERM;.
2ce70 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67  .  assert( !pPag
2ce80 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 29 3b  er->setMaster );
2ce90 0a 0a 20 20 43 48 45 43 4b 5f 50 41 47 45 28 70  ..  CHECK_PAGE(p
2cea0 50 67 29 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20  Pg);..  /* Mark 
2ceb0 74 68 65 20 70 61 67 65 20 61 73 20 64 69 72 74  the page as dirt
2cec0 79 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20  y.  If the page 
2ced0 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
2cee0 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74 6f   written.  ** to
2cef0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 65   the journal the
2cf00 6e 20 77 65 20 63 61 6e 20 72 65 74 75 72 6e 20  n we can return 
2cf10 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20 2a 2f  right away..  */
2cf20 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
2cf30 4d 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a  MakeDirty(pPg);.
2cf40 20 20 69 66 28 20 70 61 67 65 49 6e 4a 6f 75 72    if( pageInJour
2cf50 6e 61 6c 28 70 50 67 29 20 26 26 20 21 73 75 62  nal(pPg) && !sub
2cf60 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50  jRequiresPage(pP
2cf70 67 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  g) ){.    assert
2cf80 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
2cf90 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 70 50  Pager) );.    pP
2cfa0 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64  ager->dbModified
2cfb0 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 0a   = 1;.  }else{..
2cfc0 20 20 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74      /* If we get
2cfd0 20 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d 65   this far, it me
2cfe0 61 6e 73 20 74 68 61 74 20 74 68 65 20 70 61 67  ans that the pag
2cff0 65 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20  e needs to be.  
2d000 20 20 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20    ** written to 
2d010 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
2d020 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 68 65 20 63  journal or the c
2d030 6b 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61  keckpoint journa
2d040 6c 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f 74 68  l.    ** or both
2d050 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
2d060 48 69 67 68 65 72 20 6c 65 76 65 6c 20 72 6f 75  Higher level rou
2d070 74 69 6e 65 73 20 73 68 6f 75 6c 64 20 68 61 76  tines should hav
2d080 65 20 61 6c 72 65 61 64 79 20 73 74 61 72 74 65  e already starte
2d090 64 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  d a transaction,
2d0a0 0a 20 20 20 20 2a 2a 20 77 68 69 63 68 20 6d 65  .    ** which me
2d0b0 61 6e 73 20 74 68 65 79 20 68 61 76 65 20 61 63  ans they have ac
2d0c0 71 75 69 72 65 64 20 74 68 65 20 6e 65 63 65 73  quired the neces
2d0d0 73 61 72 79 20 6c 6f 63 6b 73 20 62 75 74 20 74  sary locks but t
2d0e0 68 65 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 20 20  he rollback.    
2d0f0 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74  ** journal might
2d100 20 6e 6f 74 20 79 65 74 20 62 65 20 6f 70 65 6e   not yet be open
2d110 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
2d120 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
2d130 74 65 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  te>=RESERVED_LOC
2d140 4b 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  K );.    if( pPa
2d150 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->pInJournal=
2d160 3d 30 0a 20 20 20 20 20 26 26 20 70 50 61 67 65  =0.     && pPage
2d170 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d  r->journalMode!=
2d180 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
2d190 45 5f 4f 46 46 20 0a 20 20 20 20 20 26 26 20 21  E_OFF .     && !
2d1a0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
2d1b0 65 72 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  er).    ){.     
2d1c0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2d1d0 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20  >useJournal );. 
2d1e0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
2d1f0 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61  open_journal(pPa
2d200 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ger);.      if( 
2d210 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
2d220 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
2d230 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 4d  .    pPager->dbM
2d240 6f 64 69 66 69 65 64 20 3d 20 31 3b 0a 20 20 0a  odified = 1;.  .
2d250 20 20 20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73      /* The trans
2d260 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e  action journal n
2d270 6f 77 20 65 78 69 73 74 73 20 61 6e 64 20 77 65  ow exists and we
2d280 20 68 61 76 65 20 61 20 52 45 53 45 52 56 45 44   have a RESERVED
2d290 20 6f 72 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58   or an.    ** EX
2d2a0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
2d2b0 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
2d2c0 65 20 66 69 6c 65 2e 20 20 57 72 69 74 65 20 74  e file.  Write t
2d2d0 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
2d2e0 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 72  to.    ** the tr
2d2f0 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
2d300 6c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74  l if it is not t
2d310 68 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20  here already..  
2d320 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 61    */.    if( !pa
2d330 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29  geInJournal(pPg)
2d340 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65   && isOpen(pPage
2d350 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20  r->jfd) ){.     
2d360 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
2d370 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
2d380 0a 20 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e  .      if( pPg->
2d390 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62  pgno<=pPager->db
2d3a0 4f 72 69 67 53 69 7a 65 20 29 7b 0a 20 20 20 20  OrigSize ){.    
2d3b0 20 20 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a 20      u32 cksum;. 
2d3c0 20 20 20 20 20 20 20 63 68 61 72 20 2a 70 44 61         char *pDa
2d3d0 74 61 32 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  ta2;..        /*
2d3e0 20 57 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72   We should never
2d3f0 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f   write to the jo
2d400 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 20 70  urnal file the p
2d410 61 67 65 20 74 68 61 74 0a 20 20 20 20 20 20 20  age that.       
2d420 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65   ** contains the
2d430 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 73 2e   database locks.
2d440 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
2d450 61 73 73 65 72 74 20 76 65 72 69 66 69 65 73 0a  assert verifies.
2d460 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20          ** that 
2d470 77 65 20 64 6f 20 6e 6f 74 2e 20 2a 2f 0a 20 20  we do not. */.  
2d480 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
2d490 67 2d 3e 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d  g->pgno!=PAGER_M
2d4a0 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29  J_PGNO(pPager) )
2d4b0 3b 0a 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ;..        asser
2d4c0 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
2d4d0 61 6c 48 64 72 20 3c 3d 20 70 50 61 67 65 72 2d  alHdr <= pPager-
2d4e0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 20  >journalOff );. 
2d4f0 20 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50         CODEC2(pP
2d500 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67  ager, pData, pPg
2d510 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72 65 74 75 72  ->pgno, 7, retur
2d520 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20  n SQLITE_NOMEM, 
2d530 70 44 61 74 61 32 29 3b 0a 20 20 20 20 20 20 20  pData2);.       
2d540 20 63 6b 73 75 6d 20 3d 20 70 61 67 65 72 5f 63   cksum = pager_c
2d550 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 28 75 38  ksum(pPager, (u8
2d560 2a 29 70 44 61 74 61 32 29 3b 0a 20 20 20 20 20  *)pData2);.     
2d570 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62     rc = write32b
2d580 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
2d590 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
2d5a0 4f 66 66 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  Off, pPg->pgno);
2d5b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
2d5c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2d5d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
2d5e0 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
2d5f0 65 72 2d 3e 6a 66 64 2c 20 70 44 61 74 61 32 2c  er->jfd, pData2,
2d600 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
2d610 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
2d620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d630 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
2d640 4f 66 66 20 2b 20 34 29 3b 0a 20 20 20 20 20 20  Off + 4);.      
2d650 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
2d660 6e 61 6c 4f 66 66 20 2b 3d 20 70 50 61 67 65 72  nalOff += pPager
2d670 2d 3e 70 61 67 65 53 69 7a 65 2b 34 3b 0a 20 20  ->pageSize+4;.  
2d680 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2d690 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2d6a0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
2d6b0 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
2d6c0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
2d6d0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ger->journalOff,
2d6e0 20 63 6b 73 75 6d 29 3b 0a 20 20 20 20 20 20 20   cksum);.       
2d6f0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
2d700 61 6c 4f 66 66 20 2b 3d 20 34 3b 0a 20 20 20 20  alOff += 4;.    
2d710 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 49 4f      }.        IO
2d720 54 52 41 43 45 28 28 22 4a 4f 55 54 20 25 70 20  TRACE(("JOUT %p 
2d730 25 64 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70  %d %lld %d\n", p
2d740 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f  Pager, pPg->pgno
2d750 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
2d760 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
2d770 6e 61 6c 4f 66 66 2c 20 70 50 61 67 65 72 2d 3e  nalOff, pPager->
2d780 70 61 67 65 53 69 7a 65 29 29 3b 0a 20 20 20 20  pageSize));.    
2d790 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73      PAGER_INCR(s
2d7a0 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69  qlite3_pager_wri
2d7b0 74 65 6a 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20  tej_count);.    
2d7c0 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28      PAGERTRACE((
2d7d0 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65  "JOURNAL %d page
2d7e0 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 20   %d needSync=%d 
2d7f0 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20  hash(%08x)\n",. 
2d800 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45              PAGE
2d810 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
2d820 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 20 20 20  ->pgno, .       
2d830 20 20 20 20 20 20 28 28 70 50 67 2d 3e 66 6c 61        ((pPg->fla
2d840 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
2d850 4e 43 29 3f 31 3a 30 29 2c 20 70 61 67 65 72 5f  NC)?1:0), pager_
2d860 70 61 67 65 68 61 73 68 28 70 50 67 29 29 29 3b  pagehash(pPg)));
2d870 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 76 65  ..        /* Eve
2d880 6e 20 69 66 20 61 6e 20 49 4f 20 6f 72 20 64 69  n if an IO or di
2d890 73 6b 66 75 6c 6c 20 65 72 72 6f 72 20 6f 63 63  skfull error occ
2d8a0 75 72 72 65 64 20 77 68 69 6c 65 20 6a 6f 75 72  urred while jour
2d8b0 6e 61 6c 6c 69 6e 67 20 74 68 65 0a 20 20 20 20  nalling the.    
2d8c0 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74      ** page in t
2d8d0 68 65 20 62 6c 6f 63 6b 20 61 62 6f 76 65 2c 20  he block above, 
2d8e0 73 65 74 20 74 68 65 20 6e 65 65 64 2d 73 79 6e  set the need-syn
2d8f0 63 20 66 6c 61 67 20 66 6f 72 20 74 68 65 20 70  c flag for the p
2d900 61 67 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20  age..        ** 
2d910 4f 74 68 65 72 77 69 73 65 2c 20 77 68 65 6e 20  Otherwise, when 
2d920 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
2d930 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20  is rolled back, 
2d940 74 68 65 20 6c 6f 67 69 63 20 69 6e 0a 20 20 20  the logic in.   
2d950 20 20 20 20 20 2a 2a 20 70 6c 61 79 62 61 63 6b       ** playback
2d960 5f 6f 6e 65 5f 70 61 67 65 28 29 20 77 69 6c 6c  _one_page() will
2d970 20 74 68 69 6e 6b 20 74 68 61 74 20 74 68 65 20   think that the 
2d980 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65  page needs to be
2d990 20 72 65 73 74 6f 72 65 64 0a 20 20 20 20 20 20   restored.      
2d9a0 20 20 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61    ** in the data
2d9b0 62 61 73 65 20 66 69 6c 65 2e 20 41 6e 64 20 69  base file. And i
2d9c0 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
2d9d0 63 75 72 73 20 77 68 69 6c 65 20 64 6f 69 6e 67  curs while doing
2d9e0 20 73 6f 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20   so,.        ** 
2d9f0 74 68 65 6e 20 63 6f 72 72 75 70 74 69 6f 6e 20  then corruption 
2da00 6d 61 79 20 66 6f 6c 6c 6f 77 2e 0a 20 20 20 20  may follow..    
2da10 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
2da20 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79  f( !pPager->noSy
2da30 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nc ){.          
2da40 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47  pPg->flags |= PG
2da50 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20  HDR_NEED_SYNC;. 
2da60 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
2da70 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20  >needSync = 1;. 
2da80 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
2da90 20 20 2f 2a 20 41 6e 20 65 72 72 6f 72 20 68 61    /* An error ha
2daa0 73 20 6f 63 63 75 72 72 65 64 20 77 72 69 74 69  s occurred writi
2dab0 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ng to the journa
2dac0 6c 20 66 69 6c 65 2e 20 54 68 65 20 0a 20 20 20  l file. The .   
2dad0 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74       ** transact
2dae0 69 6f 6e 20 77 69 6c 6c 20 62 65 20 72 6f 6c 6c  ion will be roll
2daf0 65 64 20 62 61 63 6b 20 62 79 20 74 68 65 20 6c  ed back by the l
2db00 61 79 65 72 20 61 62 6f 76 65 2e 0a 20 20 20 20  ayer above..    
2db10 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
2db20 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2db30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
2db40 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
2db50 20 7d 0a 0a 20 20 20 20 20 20 20 20 70 50 61 67   }..        pPag
2db60 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20 20 20  er->nRec++;.    
2db70 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2db80 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d  er->pInJournal!=
2db90 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  0 );.        rc 
2dba0 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53  = sqlite3BitvecS
2dbb0 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  et(pPager->pInJo
2dbc0 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f  urnal, pPg->pgno
2dbd0 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
2dbe0 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ase( rc==SQLITE_
2dbf0 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20  NOMEM );.       
2dc00 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
2dc10 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51  ITE_OK || rc==SQ
2dc20 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20  LITE_NOMEM );.  
2dc30 20 20 20 20 20 20 72 63 20 7c 3d 20 61 64 64 54        rc |= addT
2dc40 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63  oSavepointBitvec
2dc50 73 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70  s(pPager, pPg->p
2dc60 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66  gno);.        if
2dc70 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2dc80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ){.          ass
2dc90 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
2dca0 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20  NOMEM );.       
2dcb0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2dcc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
2dcd0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28  lse{.        if(
2dce0 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   !pPager->journa
2dcf0 6c 53 74 61 72 74 65 64 20 26 26 20 21 70 50 61  lStarted && !pPa
2dd00 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20  ger->noSync ){. 
2dd10 20 20 20 20 20 20 20 20 20 70 50 67 2d 3e 66 6c           pPg->fl
2dd20 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45  ags |= PGHDR_NEE
2dd30 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20 20 20  D_SYNC;.        
2dd40 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
2dd50 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  nc = 1;.        
2dd60 7d 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 54  }.        PAGERT
2dd70 52 41 43 45 28 28 22 41 50 50 45 4e 44 20 25 64  RACE(("APPEND %d
2dd80 20 70 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e   page %d needSyn
2dd90 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  c=%d\n",.       
2dda0 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44           PAGERID
2ddb0 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
2ddc0 67 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  gno,.           
2ddd0 20 20 20 20 28 28 70 50 67 2d 3e 66 6c 61 67 73      ((pPg->flags
2dde0 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
2ddf0 29 3f 31 3a 30 29 29 29 3b 0a 20 20 20 20 20 20  )?1:0)));.      
2de00 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  }.    }.  .    /
2de10 2a 20 49 66 20 74 68 65 20 73 74 61 74 65 6d 65  * If the stateme
2de20 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70  nt journal is op
2de30 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65 20  en and the page 
2de40 69 73 20 6e 6f 74 20 69 6e 20 69 74 2c 0a 20 20  is not in it,.  
2de50 20 20 2a 2a 20 74 68 65 6e 20 77 72 69 74 65 20    ** then write 
2de60 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
2de70 20 74 6f 20 74 68 65 20 73 74 61 74 65 6d 65 6e   to the statemen
2de80 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4e 6f 74 65  t journal.  Note
2de90 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65   that.    ** the
2dea0 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
2deb0 61 6c 20 66 6f 72 6d 61 74 20 64 69 66 66 65 72  al format differ
2dec0 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61 6e 64  s from the stand
2ded0 61 72 64 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  ard journal form
2dee0 61 74 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 61  at.    ** in tha
2def0 74 20 69 74 20 6f 6d 69 74 73 20 74 68 65 20 63  t it omits the c
2df00 68 65 63 6b 73 75 6d 73 20 61 6e 64 20 74 68 65  hecksums and the
2df10 20 68 65 61 64 65 72 2e 0a 20 20 20 20 2a 2f 0a   header..    */.
2df20 20 20 20 20 69 66 28 20 73 75 62 6a 52 65 71 75      if( subjRequ
2df30 69 72 65 73 50 61 67 65 28 70 50 67 29 20 29 7b  iresPage(pPg) ){
2df40 0a 20 20 20 20 20 20 72 63 20 3d 20 73 75 62 6a  .      rc = subj
2df50 6f 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29 3b  ournalPage(pPg);
2df60 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
2df70 20 55 70 64 61 74 65 20 74 68 65 20 64 61 74 61   Update the data
2df80 62 61 73 65 20 73 69 7a 65 20 61 6e 64 20 72 65  base size and re
2df90 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  turn..  */.  ass
2dfa0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
2dfb0 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44  te>=PAGER_SHARED
2dfc0 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
2dfd0 2d 3e 64 62 53 69 7a 65 3c 70 50 67 2d 3e 70 67  ->dbSize<pPg->pg
2dfe0 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  no ){.    pPager
2dff0 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 67 2d 3e  ->dbSize = pPg->
2e000 70 67 6e 6f 3b 0a 20 20 7d 0a 20 20 72 65 74 75  pgno;.  }.  retu
2e010 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2e020 4d 61 72 6b 20 61 20 64 61 74 61 20 70 61 67 65  Mark a data page
2e030 20 61 73 20 77 72 69 74 65 61 62 6c 65 2e 20 54   as writeable. T
2e040 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74  his routine must
2e050 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72   be called befor
2e060 65 20 0a 2a 2a 20 6d 61 6b 69 6e 67 20 63 68 61  e .** making cha
2e070 6e 67 65 73 20 74 6f 20 61 20 70 61 67 65 2e 20  nges to a page. 
2e080 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20  The caller must 
2e090 63 68 65 63 6b 20 74 68 65 20 72 65 74 75 72 6e  check the return
2e0a0 20 76 61 6c 75 65 20 0a 2a 2a 20 6f 66 20 74 68   value .** of th
2e0b0 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20  is function and 
2e0c0 62 65 20 63 61 72 65 66 75 6c 20 6e 6f 74 20 74  be careful not t
2e0d0 6f 20 63 68 61 6e 67 65 20 61 6e 79 20 70 61 67  o change any pag
2e0e0 65 20 64 61 74 61 20 75 6e 6c 65 73 73 20 0a 2a  e data unless .*
2e0f0 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * this routine r
2e100 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b  eturns SQLITE_OK
2e110 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66  ..**.** The diff
2e120 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74  erence between t
2e130 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64  his function and
2e140 20 70 61 67 65 72 5f 77 72 69 74 65 28 29 20 69   pager_write() i
2e150 73 20 74 68 61 74 20 74 68 69 73 0a 2a 2a 20 66  s that this.** f
2e160 75 6e 63 74 69 6f 6e 20 61 6c 73 6f 20 64 65 61  unction also dea
2e170 6c 73 20 77 69 74 68 20 74 68 65 20 73 70 65 63  ls with the spec
2e180 69 61 6c 20 63 61 73 65 20 77 68 65 72 65 20 32  ial case where 2
2e190 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 0a 2a   or more pages.*
2e1a0 2a 20 66 69 74 20 6f 6e 20 61 20 73 69 6e 67 6c  * fit on a singl
2e1b0 65 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 20 49  e disk sector. I
2e1c0 6e 20 74 68 69 73 20 63 61 73 65 20 61 6c 6c 20  n this case all 
2e1d0 63 6f 2d 72 65 73 69 64 65 6e 74 20 70 61 67 65  co-resident page
2e1e0 73 0a 2a 2a 20 6d 75 73 74 20 68 61 76 65 20 62  s.** must have b
2e1f0 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74  een written to t
2e200 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2e210 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
2e220 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
2e230 72 6f 72 20 6f 63 63 75 72 73 2c 20 53 51 4c 49  ror occurs, SQLI
2e240 54 45 5f 4e 4f 4d 45 4d 20 6f 72 20 61 6e 20 49  TE_NOMEM or an I
2e250 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  O error code is 
2e260 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 73 20 61  returned.** as a
2e270 70 70 72 6f 70 72 69 61 74 65 2e 20 4f 74 68 65  ppropriate. Othe
2e280 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b  rwise, SQLITE_OK
2e290 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2e2a0 50 61 67 65 72 57 72 69 74 65 28 44 62 50 61 67  PagerWrite(DbPag
2e2b0 65 20 2a 70 44 62 50 61 67 65 29 7b 0a 20 20 69  e *pDbPage){.  i
2e2c0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2e2d0 4b 3b 0a 0a 20 20 50 67 48 64 72 20 2a 70 50 67  K;..  PgHdr *pPg
2e2e0 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20 50 61   = pDbPage;.  Pa
2e2f0 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
2e300 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 50 67 6e  g->pPager;.  Pgn
2e310 6f 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72  o nPagePerSector
2e320 20 3d 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74   = (pPager->sect
2e330 6f 72 53 69 7a 65 2f 70 50 61 67 65 72 2d 3e 70  orSize/pPager->p
2e340 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 69 66 28  ageSize);..  if(
2e350 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 3e   nPagePerSector>
2e360 31 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 50  1 ){.    Pgno nP
2e370 61 67 65 43 6f 75 6e 74 3b 20 20 20 20 20 20 20  ageCount;       
2e380 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62     /* Total numb
2e390 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 64  er of pages in d
2e3a0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
2e3b0 20 20 20 20 50 67 6e 6f 20 70 67 31 3b 20 20 20      Pgno pg1;   
2e3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2e3d0 20 46 69 72 73 74 20 70 61 67 65 20 6f 66 20 74   First page of t
2e3e0 68 65 20 73 65 63 74 6f 72 20 70 50 67 20 69 73  he sector pPg is
2e3f0 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 20 2a 2f 0a   located on. */.
2e400 20 20 20 20 69 6e 74 20 6e 50 61 67 65 20 3d 20      int nPage = 
2e410 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  0;            /*
2e420 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
2e430 20 73 74 61 72 74 69 6e 67 20 61 74 20 70 67 31   starting at pg1
2e440 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20   to journal */. 
2e450 20 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20     int ii;      
2e460 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e470 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
2e480 20 20 20 20 69 6e 74 20 6e 65 65 64 53 79 6e 63      int needSync
2e490 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
2e4a0 20 54 72 75 65 20 69 66 20 61 6e 79 20 70 61 67   True if any pag
2e4b0 65 20 68 61 73 20 50 47 48 44 52 5f 4e 45 45 44  e has PGHDR_NEED
2e4c0 5f 53 59 4e 43 20 2a 2f 0a 0a 20 20 20 20 2f 2a  _SYNC */..    /*
2e4d0 20 53 65 74 20 74 68 65 20 64 6f 4e 6f 74 53 79   Set the doNotSy
2e4e0 6e 63 53 70 69 6c 6c 20 66 6c 61 67 20 74 6f 20  ncSpill flag to 
2e4f0 31 2e 20 54 68 69 73 20 69 73 20 62 65 63 61 75  1. This is becau
2e500 73 65 20 77 65 20 63 61 6e 6e 6f 74 20 61 6c 6c  se we cannot all
2e510 6f 77 0a 20 20 20 20 2a 2a 20 61 20 6a 6f 75 72  ow.    ** a jour
2e520 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20 62 65  nal header to be
2e530 20 77 72 69 74 74 65 6e 20 62 65 74 77 65 65 6e   written between
2e540 20 74 68 65 20 70 61 67 65 73 20 6a 6f 75 72 6e   the pages journ
2e550 61 6c 65 64 20 62 79 0a 20 20 20 20 2a 2a 20 74  aled by.    ** t
2e560 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20  his function..  
2e570 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
2e580 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 61   !MEMDB );.    a
2e590 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
2e5a0 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 3d 3d 30  oNotSyncSpill==0
2e5b0 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
2e5c0 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 2b 2b  doNotSyncSpill++
2e5d0 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 74  ;..    /* This t
2e5e0 72 69 63 6b 20 61 73 73 75 6d 65 73 20 74 68 61  rick assumes tha
2e5f0 74 20 62 6f 74 68 20 74 68 65 20 70 61 67 65 2d  t both the page-
2e600 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d  size and sector-
2e610 73 69 7a 65 20 61 72 65 0a 20 20 20 20 2a 2a 20  size are.    ** 
2e620 61 6e 20 69 6e 74 65 67 65 72 20 70 6f 77 65 72  an integer power
2e630 20 6f 66 20 32 2e 20 49 74 20 73 65 74 73 20 76   of 2. It sets v
2e640 61 72 69 61 62 6c 65 20 70 67 31 20 74 6f 20 74  ariable pg1 to t
2e650 68 65 20 69 64 65 6e 74 69 66 69 65 72 0a 20 20  he identifier.  
2e660 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73    ** of the firs
2e670 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 73 65  t page of the se
2e680 63 74 6f 72 20 70 50 67 20 69 73 20 6c 6f 63 61  ctor pPg is loca
2e690 74 65 64 20 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  ted on..    */. 
2e6a0 20 20 20 70 67 31 20 3d 20 28 28 70 50 67 2d 3e     pg1 = ((pPg->
2e6b0 70 67 6e 6f 2d 31 29 20 26 20 7e 28 6e 50 61 67  pgno-1) & ~(nPag
2e6c0 65 50 65 72 53 65 63 74 6f 72 2d 31 29 29 20 2b  ePerSector-1)) +
2e6d0 20 31 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71   1;..    rc = sq
2e6e0 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
2e6f0 75 6e 74 28 70 50 61 67 65 72 2c 20 28 69 6e 74  unt(pPager, (int
2e700 20 2a 29 26 6e 50 61 67 65 43 6f 75 6e 74 29 3b   *)&nPageCount);
2e710 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2e720 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2e730 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3e 6e 50  if( pPg->pgno>nP
2e740 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20  ageCount ){.    
2e750 20 20 20 20 6e 50 61 67 65 20 3d 20 28 70 50 67      nPage = (pPg
2e760 2d 3e 70 67 6e 6f 20 2d 20 70 67 31 29 2b 31 3b  ->pgno - pg1)+1;
2e770 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
2e780 20 28 70 67 31 2b 6e 50 61 67 65 50 65 72 53 65   (pg1+nPagePerSe
2e790 63 74 6f 72 2d 31 29 3e 6e 50 61 67 65 43 6f 75  ctor-1)>nPageCou
2e7a0 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 50  nt ){.        nP
2e7b0 61 67 65 20 3d 20 6e 50 61 67 65 43 6f 75 6e 74  age = nPageCount
2e7c0 2b 31 2d 70 67 31 3b 0a 20 20 20 20 20 20 7d 65  +1-pg1;.      }e
2e7d0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6e 50 61  lse{.        nPa
2e7e0 67 65 20 3d 20 6e 50 61 67 65 50 65 72 53 65 63  ge = nPagePerSec
2e7f0 74 6f 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  tor;.      }.   
2e800 20 20 20 61 73 73 65 72 74 28 6e 50 61 67 65 3e     assert(nPage>
2e810 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  0);.      assert
2e820 28 70 67 31 3c 3d 70 50 67 2d 3e 70 67 6e 6f 29  (pg1<=pPg->pgno)
2e830 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 28  ;.      assert((
2e840 70 67 31 2b 6e 50 61 67 65 29 3e 70 50 67 2d 3e  pg1+nPage)>pPg->
2e850 70 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  pgno);.    }..  
2e860 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e    for(ii=0; ii<n
2e870 50 61 67 65 20 26 26 20 72 63 3d 3d 53 51 4c 49  Page && rc==SQLI
2e880 54 45 5f 4f 4b 3b 20 69 69 2b 2b 29 7b 0a 20 20  TE_OK; ii++){.  
2e890 20 20 20 20 50 67 6e 6f 20 70 67 20 3d 20 70 67      Pgno pg = pg
2e8a0 31 2b 69 69 3b 0a 20 20 20 20 20 20 50 67 48 64  1+ii;.      PgHd
2e8b0 72 20 2a 70 50 61 67 65 3b 0a 20 20 20 20 20 20  r *pPage;.      
2e8c0 69 66 28 20 70 67 3d 3d 70 50 67 2d 3e 70 67 6e  if( pg==pPg->pgn
2e8d0 6f 20 7c 7c 20 21 73 71 6c 69 74 65 33 42 69 74  o || !sqlite3Bit
2e8e0 76 65 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e  vecTest(pPager->
2e8f0 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 29 20  pInJournal, pg) 
2e900 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
2e910 67 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  g!=PAGER_MJ_PGNO
2e920 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
2e930 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2e940 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65  e3PagerGet(pPage
2e950 72 2c 20 70 67 2c 20 26 70 50 61 67 65 29 3b 0a  r, pg, &pPage);.
2e960 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
2e970 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2e980 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
2e990 70 61 67 65 72 5f 77 72 69 74 65 28 70 50 61 67  pager_write(pPag
2e9a0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
2e9b0 69 66 28 20 70 50 61 67 65 2d 3e 66 6c 61 67 73  if( pPage->flags
2e9c0 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
2e9d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2e9e0 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a    needSync = 1;.
2e9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73                as
2ea00 73 65 72 74 28 70 50 61 67 65 72 2d 3e 6e 65 65  sert(pPager->nee
2ea10 64 53 79 6e 63 29 3b 0a 20 20 20 20 20 20 20 20  dSync);.        
2ea20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2ea30 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
2ea40 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20  ref(pPage);.    
2ea50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2ea60 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
2ea70 28 20 28 70 50 61 67 65 20 3d 20 70 61 67 65 72  ( (pPage = pager
2ea80 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  _lookup(pPager, 
2ea90 70 67 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  pg))!=0 ){.     
2eaa0 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 66 6c     if( pPage->fl
2eab0 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
2eac0 59 4e 43 20 29 7b 0a 20 20 20 20 20 20 20 20 20  YNC ){.         
2ead0 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20   needSync = 1;. 
2eae0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2eaf0 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
2eb00 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  ef(pPage);.     
2eb10 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
2eb20 20 49 66 20 74 68 65 20 50 47 48 44 52 5f 4e 45   If the PGHDR_NE
2eb30 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 69 73 20  ED_SYNC flag is 
2eb40 73 65 74 20 66 6f 72 20 61 6e 79 20 6f 66 20 74  set for any of t
2eb50 68 65 20 6e 50 61 67 65 20 70 61 67 65 73 20 0a  he nPage pages .
2eb60 20 20 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20      ** starting 
2eb70 61 74 20 70 67 31 2c 20 74 68 65 6e 20 69 74 20  at pg1, then it 
2eb80 6e 65 65 64 73 20 74 6f 20 62 65 20 73 65 74 20  needs to be set 
2eb90 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65 6d 2e  for all of them.
2eba0 20 42 65 63 61 75 73 65 0a 20 20 20 20 2a 2a 20   Because.    ** 
2ebb0 77 72 69 74 69 6e 67 20 74 6f 20 61 6e 79 20 6f  writing to any o
2ebc0 66 20 74 68 65 73 65 20 6e 50 61 67 65 20 70 61  f these nPage pa
2ebd0 67 65 73 20 6d 61 79 20 64 61 6d 61 67 65 20 74  ges may damage t
2ebe0 68 65 20 6f 74 68 65 72 73 2c 20 74 68 65 0a 20  he others, the. 
2ebf0 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69     ** journal fi
2ec00 6c 65 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e 20  le must contain 
2ec10 73 79 6e 63 28 29 65 64 20 63 6f 70 69 65 73 20  sync()ed copies 
2ec20 6f 66 20 61 6c 6c 20 6f 66 20 74 68 65 6d 0a 20  of all of them. 
2ec30 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 61 6e 79     ** before any
2ec40 20 6f 66 20 74 68 65 6d 20 63 61 6e 20 62 65 20   of them can be 
2ec50 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 74  written out to t
2ec60 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2ec70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
2ec80 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2ec90 26 20 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20  & needSync ){.  
2eca0 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d      assert( !MEM
2ecb0 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 6f  DB && pPager->no
2ecc0 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Sync==0 );.     
2ecd0 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50   for(ii=0; ii<nP
2ece0 61 67 65 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  age; ii++){.    
2ecf0 20 20 20 20 50 67 48 64 72 20 2a 70 50 61 67 65      PgHdr *pPage
2ed00 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28   = pager_lookup(
2ed10 70 50 61 67 65 72 2c 20 70 67 31 2b 69 69 29 3b  pPager, pg1+ii);
2ed20 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
2ed30 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ge ){.          
2ed40 70 50 61 67 65 2d 3e 66 6c 61 67 73 20 7c 3d 20  pPage->flags |= 
2ed50 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b  PGHDR_NEED_SYNC;
2ed60 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
2ed70 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 61  e3PagerUnref(pPa
2ed80 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ge);.        }. 
2ed90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
2eda0 65 72 74 28 70 50 61 67 65 72 2d 3e 6e 65 65 64  ert(pPager->need
2edb0 53 79 6e 63 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  Sync);.    }..  
2edc0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2edd0 2d 3e 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c  ->doNotSyncSpill
2ede0 3d 3d 31 20 29 3b 0a 20 20 20 20 70 50 61 67 65  ==1 );.    pPage
2edf0 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c  r->doNotSyncSpil
2ee00 6c 2d 2d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  l--;.  }else{.  
2ee10 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69    rc = pager_wri
2ee20 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20 7d  te(pDbPage);.  }
2ee30 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2ee40 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
2ee50 55 45 20 69 66 20 74 68 65 20 70 61 67 65 20 67  UE if the page g
2ee60 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75  iven in the argu
2ee70 6d 65 6e 74 20 77 61 73 20 70 72 65 76 69 6f 75  ment was previou
2ee80 73 6c 79 20 70 61 73 73 65 64 0a 2a 2a 20 74 6f  sly passed.** to
2ee90 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2eea0 74 65 28 29 2e 20 20 49 6e 20 6f 74 68 65 72 20  te().  In other 
2eeb0 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52  words, return TR
2eec0 55 45 20 69 66 20 69 74 20 69 73 20 6f 6b 0a 2a  UE if it is ok.*
2eed0 2a 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20  * to change the 
2eee0 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70  content of the p
2eef0 61 67 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  age..*/.#ifndef 
2ef00 4e 44 45 42 55 47 0a 69 6e 74 20 73 71 6c 69 74  NDEBUG.int sqlit
2ef10 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
2ef20 6c 65 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  le(DbPage *pPg){
2ef30 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 66  .  return pPg->f
2ef40 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59  lags&PGHDR_DIRTY
2ef50 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
2ef60 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69 73  * A call to this
2ef70 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20 74   routine tells t
2ef80 68 65 20 70 61 67 65 72 20 74 68 61 74 20 69 74  he pager that it
2ef90 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
2efa0 79 20 74 6f 0a 2a 2a 20 77 72 69 74 65 20 74 68  y to.** write th
2efb0 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e  e information on
2efc0 20 70 61 67 65 20 70 50 67 20 62 61 63 6b 20 74   page pPg back t
2efd0 6f 20 74 68 65 20 64 69 73 6b 2c 20 65 76 65 6e  o the disk, even
2efe0 20 74 68 6f 75 67 68 0a 2a 2a 20 74 68 61 74 20   though.** that 
2eff0 70 61 67 65 20 6d 69 67 68 74 20 62 65 20 6d 61  page might be ma
2f000 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e 20 20  rked as dirty.  
2f010 54 68 69 73 20 68 61 70 70 65 6e 73 2c 20 66 6f  This happens, fo
2f020 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 0a  r example, when.
2f030 2a 2a 20 74 68 65 20 70 61 67 65 20 68 61 73 20  ** the page has 
2f040 62 65 65 6e 20 61 64 64 65 64 20 61 73 20 61 20  been added as a 
2f050 6c 65 61 66 20 6f 66 20 74 68 65 20 66 72 65 65  leaf of the free
2f060 6c 69 73 74 20 61 6e 64 20 73 6f 20 69 74 73 0a  list and so its.
2f070 2a 2a 20 63 6f 6e 74 65 6e 74 20 6e 6f 20 6c 6f  ** content no lo
2f080 6e 67 65 72 20 6d 61 74 74 65 72 73 2e 0a 2a 2a  nger matters..**
2f090 0a 2a 2a 20 54 68 65 20 6f 76 65 72 6c 79 69 6e  .** The overlyin
2f0a0 67 20 73 6f 66 74 77 61 72 65 20 6c 61 79 65 72  g software layer
2f0b0 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74   calls this rout
2f0c0 69 6e 65 20 77 68 65 6e 20 61 6c 6c 20 6f 66 20  ine when all of 
2f0d0 74 68 65 20 64 61 74 61 0a 2a 2a 20 6f 6e 20 74  the data.** on t
2f0e0 68 65 20 67 69 76 65 6e 20 70 61 67 65 20 69 73  he given page is
2f0f0 20 75 6e 75 73 65 64 2e 20 54 68 65 20 70 61 67   unused. The pag
2f100 65 72 20 6d 61 72 6b 73 20 74 68 65 20 70 61 67  er marks the pag
2f110 65 20 61 73 20 63 6c 65 61 6e 20 73 6f 0a 2a 2a  e as clean so.**
2f120 20 74 68 61 74 20 69 74 20 64 6f 65 73 20 6e 6f   that it does no
2f130 74 20 67 65 74 20 77 72 69 74 74 65 6e 20 74 6f  t get written to
2f140 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65 73   disk..**.** Tes
2f150 74 73 20 73 68 6f 77 20 74 68 61 74 20 74 68 69  ts show that thi
2f160 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63  s optimization c
2f170 61 6e 20 71 75 61 64 72 75 70 6c 65 20 74 68 65  an quadruple the
2f180 20 73 70 65 65 64 20 6f 66 20 6c 61 72 67 65 20   speed of large 
2f190 0a 2a 2a 20 44 45 4c 45 54 45 20 6f 70 65 72 61  .** DELETE opera
2f1a0 74 69 6f 6e 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  tions..*/.void s
2f1b0 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57  qlite3PagerDontW
2f1c0 72 69 74 65 28 50 67 48 64 72 20 2a 70 50 67 29  rite(PgHdr *pPg)
2f1d0 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
2f1e0 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
2f1f0 0a 20 20 69 66 28 20 28 70 50 67 2d 3e 66 6c 61  .  if( (pPg->fla
2f200 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 29 20  gs&PGHDR_DIRTY) 
2f210 26 26 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65  && pPager->nSave
2f220 70 6f 69 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20  point==0 ){.    
2f230 50 41 47 45 52 54 52 41 43 45 28 28 22 44 4f 4e  PAGERTRACE(("DON
2f240 54 5f 57 52 49 54 45 20 70 61 67 65 20 25 64 20  T_WRITE page %d 
2f250 6f 66 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70  of %d\n", pPg->p
2f260 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61  gno, PAGERID(pPa
2f270 67 65 72 29 29 29 3b 0a 20 20 20 20 49 4f 54 52  ger)));.    IOTR
2f280 41 43 45 28 28 22 43 4c 45 41 4e 20 25 70 20 25  ACE(("CLEAN %p %
2f290 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
2f2a0 67 2d 3e 70 67 6e 6f 29 29 0a 20 20 20 20 70 50  g->pgno)).    pP
2f2b0 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44  g->flags |= PGHD
2f2c0 52 5f 44 4f 4e 54 5f 57 52 49 54 45 3b 0a 23 69  R_DONT_WRITE;.#i
2f2d0 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
2f2e0 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 50 67 2d  K_PAGES.    pPg-
2f2f0 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65  >pageHash = page
2f300 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b  r_pagehash(pPg);
2f310 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f  .#endif.  }.}../
2f320 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2f330 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 69  e is called to i
2f340 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61 6c  ncrement the val
2f350 75 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ue of the databa
2f360 73 65 20 66 69 6c 65 20 0a 2a 2a 20 63 68 61 6e  se file .** chan
2f370 67 65 2d 63 6f 75 6e 74 65 72 2c 20 73 74 6f 72  ge-counter, stor
2f380 65 64 20 61 73 20 61 20 34 2d 62 79 74 65 20 62  ed as a 4-byte b
2f390 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
2f3a0 72 20 73 74 61 72 74 69 6e 67 20 61 74 20 0a 2a  r starting at .*
2f3b0 2a 20 62 79 74 65 20 6f 66 66 73 65 74 20 32 34  * byte offset 24
2f3c0 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 66 69   of the pager fi
2f3d0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  le..**.** If the
2f3e0 20 69 73 44 69 72 65 63 74 4d 6f 64 65 20 66 6c   isDirectMode fl
2f3f0 61 67 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e  ag is zero, then
2f400 20 74 68 69 73 20 69 73 20 64 6f 6e 65 20 62 79   this is done by
2f410 20 63 61 6c 6c 69 6e 67 20 0a 2a 2a 20 73 71 6c   calling .** sql
2f420 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
2f430 20 6f 6e 20 70 61 67 65 20 31 2c 20 74 68 65 6e   on page 1, then
2f440 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 63   modifying the c
2f450 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a  ontents of the.*
2f460 2a 20 70 61 67 65 20 64 61 74 61 2e 20 49 6e 20  * page data. In 
2f470 74 68 69 73 20 63 61 73 65 20 74 68 65 20 66 69  this case the fi
2f480 6c 65 20 77 69 6c 6c 20 62 65 20 75 70 64 61 74  le will be updat
2f490 65 64 20 77 68 65 6e 20 74 68 65 20 63 75 72 72  ed when the curr
2f4a0 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  ent.** transacti
2f4b0 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e  on is committed.
2f4c0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 44 69 72  .**.** The isDir
2f4d0 65 63 74 4d 6f 64 65 20 66 6c 61 67 20 6d 61 79  ectMode flag may
2f4e0 20 6f 6e 6c 79 20 62 65 20 6e 6f 6e 2d 7a 65 72   only be non-zer
2f4f0 6f 20 69 66 20 74 68 65 20 6c 69 62 72 61 72 79  o if the library
2f500 20 77 61 73 20 63 6f 6d 70 69 6c 65 64 0a 2a 2a   was compiled.**
2f510 20 77 69 74 68 20 74 68 65 20 53 51 4c 49 54 45   with the SQLITE
2f520 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57  _ENABLE_ATOMIC_W
2f530 52 49 54 45 20 6d 61 63 72 6f 20 64 65 66 69 6e  RITE macro defin
2f540 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
2f550 2c 0a 2a 2a 20 69 66 20 69 73 44 69 72 65 63 74  ,.** if isDirect
2f560 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
2f570 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  en the database 
2f580 66 69 6c 65 20 69 73 20 75 70 64 61 74 65 64 20  file is updated 
2f590 64 69 72 65 63 74 6c 79 0a 2a 2a 20 62 79 20 77  directly.** by w
2f5a0 72 69 74 69 6e 67 20 61 6e 20 75 70 64 61 74 65  riting an update
2f5b0 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 70 61 67  d version of pag
2f5c0 65 20 31 20 75 73 69 6e 67 20 61 20 63 61 6c 6c  e 1 using a call
2f5d0 20 74 6f 20 74 68 65 20 0a 2a 2a 20 73 71 6c 69   to the .** sqli
2f5e0 74 65 33 4f 73 57 72 69 74 65 28 29 20 66 75 6e  te3OsWrite() fun
2f5f0 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
2f600 20 69 6e 74 20 70 61 67 65 72 5f 69 6e 63 72 5f   int pager_incr_
2f610 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 50 61  changecounter(Pa
2f620 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
2f630 20 69 73 44 69 72 65 63 74 4d 6f 64 65 29 7b 0a   isDirectMode){.
2f640 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2f650 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 44 65 63 6c  E_OK;..  /* Decl
2f660 61 72 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  are and initiali
2f670 7a 65 20 63 6f 6e 73 74 61 6e 74 20 69 6e 74 65  ze constant inte
2f680 67 65 72 20 27 69 73 44 69 72 65 63 74 27 2e 20  ger 'isDirect'. 
2f690 49 66 20 74 68 65 0a 20 20 2a 2a 20 61 74 6f 6d  If the.  ** atom
2f6a0 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a  ic-write optimiz
2f6b0 61 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64  ation is enabled
2f6c0 20 69 6e 20 74 68 69 73 20 62 75 69 6c 64 2c 20   in this build, 
2f6d0 74 68 65 6e 20 69 73 44 69 72 65 63 74 0a 20 20  then isDirect.  
2f6e0 2a 2a 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  ** is initialize
2f6f0 64 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 70  d to the value p
2f700 61 73 73 65 64 20 61 73 20 74 68 65 20 69 73 44  assed as the isD
2f710 69 72 65 63 74 4d 6f 64 65 20 70 61 72 61 6d 65  irectMode parame
2f720 74 65 72 0a 20 20 2a 2a 20 74 6f 20 74 68 69 73  ter.  ** to this
2f730 20 66 75 6e 63 74 69 6f 6e 2e 20 4f 74 68 65 72   function. Other
2f740 77 69 73 65 2c 20 69 74 20 69 73 20 61 6c 77 61  wise, it is alwa
2f750 79 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 0a  ys set to zero..
2f760 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 69 64    **.  ** The id
2f770 65 61 20 69 73 20 74 68 61 74 20 69 66 20 74 68  ea is that if th
2f780 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f  e atomic-write o
2f790 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 6e  ptimization is n
2f7a0 6f 74 0a 20 20 2a 2a 20 65 6e 61 62 6c 65 64 20  ot.  ** enabled 
2f7b0 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c  at compile time,
2f7c0 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 63 61   the compiler ca
2f7d0 6e 20 6f 6d 69 74 20 74 68 65 20 74 65 73 74 73  n omit the tests
2f7e0 20 6f 66 0a 20 20 2a 2a 20 27 69 73 44 69 72 65   of.  ** 'isDire
2f7f0 63 74 27 20 62 65 6c 6f 77 2c 20 61 73 20 77 65  ct' below, as we
2f800 6c 6c 20 61 73 20 74 68 65 20 62 6c 6f 63 6b 20  ll as the block 
2f810 65 6e 63 6c 6f 73 65 64 20 69 6e 20 74 68 65 0a  enclosed in the.
2f820 20 20 2a 2a 20 22 69 66 28 20 69 73 44 69 72 65    ** "if( isDire
2f830 63 74 20 29 22 20 63 6f 6e 64 69 74 69 6f 6e 2e  ct )" condition.
2f840 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  .  */.#ifndef SQ
2f850 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d  LITE_ENABLE_ATOM
2f860 49 43 5f 57 52 49 54 45 0a 23 20 64 65 66 69 6e  IC_WRITE.# defin
2f870 65 20 44 49 52 45 43 54 5f 4d 4f 44 45 20 30 0a  e DIRECT_MODE 0.
2f880 20 20 61 73 73 65 72 74 28 20 69 73 44 69 72 65    assert( isDire
2f890 63 74 4d 6f 64 65 3d 3d 30 20 29 3b 0a 20 20 55  ctMode==0 );.  U
2f8a0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
2f8b0 69 73 44 69 72 65 63 74 4d 6f 64 65 29 3b 0a 23  isDirectMode);.#
2f8c0 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 44 49  else.# define DI
2f8d0 52 45 43 54 5f 4d 4f 44 45 20 69 73 44 69 72 65  RECT_MODE isDire
2f8e0 63 74 4d 6f 64 65 0a 23 65 6e 64 69 66 0a 0a 20  ctMode.#endif.. 
2f8f0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2f900 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  >state>=PAGER_RE
2f910 53 45 52 56 45 44 20 29 3b 0a 20 20 69 66 28 20  SERVED );.  if( 
2f920 21 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43  !pPager->changeC
2f930 6f 75 6e 74 44 6f 6e 65 20 26 26 20 70 50 61 67  ountDone && pPag
2f940 65 72 2d 3e 64 62 53 69 7a 65 3e 30 20 29 7b 0a  er->dbSize>0 ){.
2f950 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 48 64      PgHdr *pPgHd
2f960 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
2f970 20 20 2f 2a 20 52 65 66 65 72 65 6e 63 65 20 74    /* Reference t
2f980 6f 20 70 61 67 65 20 31 20 2a 2f 0a 20 20 20 20  o page 1 */.    
2f990 75 33 32 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74  u32 change_count
2f9a0 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  er;           /*
2f9b0 20 49 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 6f   Initial value o
2f9c0 66 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  f change-counter
2f9d0 20 66 69 65 6c 64 20 2a 2f 0a 0a 20 20 20 20 61   field */..    a
2f9e0 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
2f9f0 74 65 6d 70 46 69 6c 65 20 26 26 20 69 73 4f 70  tempFile && isOp
2fa00 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
2fa10 3b 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70  ;..    /* Open p
2fa20 61 67 65 20 31 20 6f 66 20 74 68 65 20 66 69 6c  age 1 of the fil
2fa30 65 20 66 6f 72 20 77 72 69 74 69 6e 67 2e 20 2a  e for writing. *
2fa40 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
2fa50 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65  e3PagerGet(pPage
2fa60 72 2c 20 31 2c 20 26 70 50 67 48 64 72 29 3b 0a  r, 1, &pPgHdr);.
2fa70 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 48      assert( pPgH
2fa80 64 72 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c  dr==0 || rc==SQL
2fa90 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20 2f  ITE_OK );..    /
2faa0 2a 20 49 66 20 70 61 67 65 20 6f 6e 65 20 77 61  * If page one wa
2fab0 73 20 66 65 74 63 68 65 64 20 73 75 63 63 65 73  s fetched succes
2fac0 73 66 75 6c 6c 79 2c 20 61 6e 64 20 74 68 69 73  sfully, and this
2fad0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 74   function is not
2fae0 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e  .    ** operatin
2faf0 67 20 69 6e 20 64 69 72 65 63 74 2d 6d 6f 64 65  g in direct-mode
2fb00 2c 20 6d 61 6b 65 20 70 61 67 65 20 31 20 77 72  , make page 1 wr
2fb10 69 74 61 62 6c 65 2e 20 20 57 68 65 6e 20 6e 6f  itable.  When no
2fb20 74 20 69 6e 20 0a 20 20 20 20 2a 2a 20 64 69 72  t in .    ** dir
2fb30 65 63 74 20 6d 6f 64 65 2c 20 70 61 67 65 20 31  ect mode, page 1
2fb40 20 69 73 20 61 6c 77 61 79 73 20 68 65 6c 64 20   is always held 
2fb50 69 6e 20 63 61 63 68 65 20 61 6e 64 20 68 65 6e  in cache and hen
2fb60 63 65 20 74 68 65 20 50 61 67 65 72 47 65 74 28  ce the PagerGet(
2fb70 29 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 20 69  ).    ** above i
2fb80 73 20 61 6c 77 61 79 73 20 73 75 63 63 65 73 73  s always success
2fb90 66 75 6c 20 2d 20 68 65 6e 63 65 20 74 68 65 20  ful - hence the 
2fba0 41 4c 57 41 59 53 20 6f 6e 20 72 63 3d 3d 53 51  ALWAYS on rc==SQ
2fbb0 4c 49 54 45 5f 4f 4b 2e 0a 20 20 20 20 2a 2f 0a  LITE_OK..    */.
2fbc0 20 20 20 20 69 66 28 20 21 44 49 52 45 43 54 5f      if( !DIRECT_
2fbd0 4d 4f 44 45 20 26 26 20 41 4c 57 41 59 53 28 72  MODE && ALWAYS(r
2fbe0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 29 7b  c==SQLITE_OK) ){
2fbf0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
2fc00 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
2fc10 67 48 64 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  gHdr);.    }..  
2fc20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2fc30 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  _OK ){.      /* 
2fc40 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61  Increment the va
2fc50 6c 75 65 20 6a 75 73 74 20 72 65 61 64 20 61 6e  lue just read an
2fc60 64 20 77 72 69 74 65 20 69 74 20 62 61 63 6b 20  d write it back 
2fc70 74 6f 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20  to byte 24. */. 
2fc80 20 20 20 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e       change_coun
2fc90 74 65 72 20 3d 20 73 71 6c 69 74 65 33 47 65 74  ter = sqlite3Get
2fca0 34 62 79 74 65 28 28 75 38 2a 29 70 50 61 67 65  4byte((u8*)pPage
2fcb0 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 3b 0a  r->dbFileVers);.
2fcc0 20 20 20 20 20 20 63 68 61 6e 67 65 5f 63 6f 75        change_cou
2fcd0 6e 74 65 72 2b 2b 3b 0a 20 20 20 20 20 20 70 75  nter++;.      pu
2fce0 74 33 32 62 69 74 73 28 28 28 63 68 61 72 2a 29  t32bits(((char*)
2fcf0 70 50 67 48 64 72 2d 3e 70 44 61 74 61 29 2b 32  pPgHdr->pData)+2
2fd00 34 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65  4, change_counte
2fd10 72 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 41 6c  r);..      /* Al
2fd20 73 6f 20 73 74 6f 72 65 20 74 68 65 20 53 51 4c  so store the SQL
2fd30 69 74 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62  ite version numb
2fd40 65 72 20 69 6e 20 62 79 74 65 73 20 39 36 2e 2e  er in bytes 96..
2fd50 39 39 20 61 6e 64 20 69 6e 0a 20 20 20 20 20 20  99 and in.      
2fd60 2a 2a 20 62 79 74 65 73 20 39 32 2e 2e 39 35 20  ** bytes 92..95 
2fd70 73 74 6f 72 65 20 74 68 65 20 63 68 61 6e 67 65  store the change
2fd80 20 63 6f 75 6e 74 65 72 20 66 6f 72 20 77 68 69   counter for whi
2fd90 63 68 20 74 68 65 20 76 65 72 73 69 6f 6e 20 6e  ch the version n
2fda0 75 6d 62 65 72 0a 20 20 20 20 20 20 2a 2a 20 69  umber.      ** i
2fdb0 73 20 76 61 6c 69 64 2e 20 2a 2f 0a 20 20 20 20  s valid. */.    
2fdc0 20 20 70 75 74 33 32 62 69 74 73 28 28 28 63 68    put32bits(((ch
2fdd0 61 72 2a 29 70 50 67 48 64 72 2d 3e 70 44 61 74  ar*)pPgHdr->pDat
2fde0 61 29 2b 39 32 2c 20 63 68 61 6e 67 65 5f 63 6f  a)+92, change_co
2fdf0 75 6e 74 65 72 29 3b 0a 20 20 20 20 20 20 70 75  unter);.      pu
2fe00 74 33 32 62 69 74 73 28 28 28 63 68 61 72 2a 29  t32bits(((char*)
2fe10 70 50 67 48 64 72 2d 3e 70 44 61 74 61 29 2b 39  pPgHdr->pData)+9
2fe20 36 2c 20 53 51 4c 49 54 45 5f 56 45 52 53 49 4f  6, SQLITE_VERSIO
2fe30 4e 5f 4e 55 4d 42 45 52 29 3b 0a 0a 20 20 20 20  N_NUMBER);..    
2fe40 20 20 2f 2a 20 49 66 20 72 75 6e 6e 69 6e 67 20    /* If running 
2fe50 69 6e 20 64 69 72 65 63 74 20 6d 6f 64 65 2c 20  in direct mode, 
2fe60 77 72 69 74 65 20 74 68 65 20 63 6f 6e 74 65 6e  write the conten
2fe70 74 73 20 6f 66 20 70 61 67 65 20 31 20 74 6f 20  ts of page 1 to 
2fe80 74 68 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  the file. */.   
2fe90 20 20 20 69 66 28 20 44 49 52 45 43 54 5f 4d 4f     if( DIRECT_MO
2fea0 44 45 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  DE ){.        co
2feb0 6e 73 74 20 76 6f 69 64 20 2a 7a 42 75 66 3b 0a  nst void *zBuf;.
2fec0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2fed0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
2fee0 7a 65 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20  ze>0 );.        
2fef0 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 70  CODEC2(pPager, p
2ff00 50 67 48 64 72 2d 3e 70 44 61 74 61 2c 20 31 2c  PgHdr->pData, 1,
2ff10 20 36 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f   6, rc=SQLITE_NO
2ff20 4d 45 4d 2c 20 7a 42 75 66 29 3b 0a 20 20 20 20  MEM, zBuf);.    
2ff30 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2ff40 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2ff50 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
2ff60 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66  sWrite(pPager->f
2ff70 64 2c 20 7a 42 75 66 2c 20 70 50 61 67 65 72 2d  d, zBuf, pPager-
2ff80 3e 70 61 67 65 53 69 7a 65 2c 20 30 29 3b 0a 20  >pageSize, 0);. 
2ff90 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2ffa0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2ffb0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
2ffc0 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
2ffd0 75 6e 74 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 20  untDone = 1;.   
2ffe0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
2fff0 73 65 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67  se{.        pPag
30000 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
30010 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  one = 1;.      }
30020 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
30030 65 6c 65 61 73 65 20 74 68 65 20 70 61 67 65 20  elease the page 
30040 72 65 66 65 72 65 6e 63 65 2e 20 2a 2f 0a 20 20  reference. */.  
30050 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
30060 72 65 66 28 70 50 67 48 64 72 29 3b 0a 20 20 7d  ref(pPgHdr);.  }
30070 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
30080 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20  ./*.** Sync the 
30090 70 61 67 65 72 20 66 69 6c 65 20 74 6f 20 64 69  pager file to di
300a0 73 6b 2e 20 54 68 69 73 20 69 73 20 61 20 6e 6f  sk. This is a no
300b0 2d 6f 70 20 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72  -op for in-memor
300c0 79 20 66 69 6c 65 73 0a 2a 2a 20 6f 72 20 70 61  y files.** or pa
300d0 67 65 73 20 77 69 74 68 20 74 68 65 20 50 61 67  ges with the Pag
300e0 65 72 2e 6e 6f 53 79 6e 63 20 66 6c 61 67 20 73  er.noSync flag s
300f0 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  et..**.** If suc
30100 63 65 73 73 66 75 6c 2c 20 6f 72 20 63 61 6c 6c  cessful, or call
30110 65 64 20 6f 6e 20 61 20 70 61 67 65 72 20 66 6f  ed on a pager fo
30120 72 20 77 68 69 63 68 20 69 74 20 69 73 20 61 20  r which it is a 
30130 6e 6f 2d 6f 70 2c 20 74 68 69 73 0a 2a 2a 20 66  no-op, this.** f
30140 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
30150 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74 68 65 72  SQLITE_OK. Other
30160 77 69 73 65 2c 20 61 6e 20 49 4f 20 65 72 72 6f  wise, an IO erro
30170 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
30180 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
30190 65 33 50 61 67 65 72 53 79 6e 63 28 50 61 67 65  e3PagerSync(Page
301a0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
301b0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
301c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
301d0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
301e0 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21  e */.  assert( !
301f0 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66 28 20 70  MEMDB );.  if( p
30200 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b  Pager->noSync ){
30210 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
30220 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
30230 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
30240 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 66 64 2c  Sync(pPager->fd,
30250 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c   pPager->sync_fl
30260 61 67 73 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ags);.  }.  retu
30270 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
30280 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
30290 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64  y only be called
302a0 20 77 68 69 6c 65 20 61 20 77 72 69 74 65 2d 74   while a write-t
302b0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
302c0 74 69 76 65 20 69 6e 0a 2a 2a 20 72 6f 6c 6c 62  tive in.** rollb
302d0 61 63 6b 2e 20 49 66 20 74 68 65 20 63 6f 6e 6e  ack. If the conn
302e0 65 63 74 69 6f 6e 20 69 73 20 69 6e 20 57 41 4c  ection is in WAL
302f0 20 6d 6f 64 65 2c 20 74 68 69 73 20 63 61 6c 6c   mode, this call
30300 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 0a 2a 2a   is a no-op. .**
30310 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74   Otherwise, if t
30320 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 6f  he connection do
30330 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 68  es not already h
30340 61 76 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ave an EXCLUSIVE
30350 20 6c 6f 63 6b 20 6f 6e 20 0a 2a 2a 20 74 68 65   lock on .** the
30360 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
30370 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61  an attempt is ma
30380 64 65 20 74 6f 20 6f 62 74 61 69 6e 20 6f 6e 65  de to obtain one
30390 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 45  ..**.** If the E
303a0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73  XCLUSIVE lock is
303b0 20 61 6c 72 65 61 64 79 20 68 65 6c 64 20 6f 72   already held or
303c0 20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20   the attempt to 
303d0 6f 62 74 61 69 6e 20 69 74 20 69 73 0a 2a 2a 20  obtain it is.** 
303e0 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 74  successful, or t
303f0 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  he connection is
30400 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2c 20 53 51   in WAL mode, SQ
30410 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
30420 6e 65 64 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ned..** Otherwis
30430 65 2c 20 65 69 74 68 65 72 20 53 51 4c 49 54 45  e, either SQLITE
30440 5f 42 55 53 59 20 6f 72 20 61 6e 20 53 51 4c 49  _BUSY or an SQLI
30450 54 45 5f 49 4f 45 52 52 5f 58 58 58 20 65 72 72  TE_IOERR_XXX err
30460 6f 72 20 63 6f 64 65 20 69 73 20 0a 2a 2a 20 72  or code is .** r
30470 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20  eturned..*/.int 
30480 73 71 6c 69 74 65 33 50 61 67 65 72 45 78 63 6c  sqlite3PagerExcl
30490 75 73 69 76 65 4c 6f 63 6b 28 50 61 67 65 72 20  usiveLock(Pager 
304a0 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
304b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
304c0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
304d0 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  ->state>=PAGER_R
304e0 45 53 45 52 56 45 44 20 29 3b 0a 20 20 69 66 28  ESERVED );.  if(
304f0 20 30 3d 3d 70 61 67 65 72 55 73 65 57 61 6c 28   0==pagerUseWal(
30500 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72  pPager) ){.    r
30510 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  c = pager_wait_o
30520 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 50  n_lock(pPager, P
30530 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 29 3b  AGER_EXCLUSIVE);
30540 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
30550 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20  ;.}../*.** Sync 
30560 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
30570 65 20 66 6f 72 20 74 68 65 20 70 61 67 65 72 20  e for the pager 
30580 70 50 61 67 65 72 2e 20 7a 4d 61 73 74 65 72 20  pPager. zMaster 
30590 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6e 61  points to the na
305a0 6d 65 0a 2a 2a 20 6f 66 20 61 20 6d 61 73 74 65  me.** of a maste
305b0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  r journal file t
305c0 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72  hat should be wr
305d0 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 69  itten into the i
305e0 6e 64 69 76 69 64 75 61 6c 0a 2a 2a 20 6a 6f 75  ndividual.** jou
305f0 72 6e 61 6c 20 66 69 6c 65 2e 20 7a 4d 61 73 74  rnal file. zMast
30600 65 72 20 6d 61 79 20 62 65 20 4e 55 4c 4c 2c 20  er may be NULL, 
30610 77 68 69 63 68 20 69 73 20 69 6e 74 65 72 70 72  which is interpr
30620 65 74 65 64 20 61 73 20 6e 6f 20 6d 61 73 74 65  eted as no maste
30630 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 20  r.** journal (a 
30640 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20  single database 
30650 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a  transaction)..**
30660 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
30670 20 65 6e 73 75 72 65 73 20 74 68 61 74 3a 0a 2a   ensures that:.*
30680 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 64 61 74  *.**   * The dat
30690 61 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e 67  abase file chang
306a0 65 2d 63 6f 75 6e 74 65 72 20 69 73 20 75 70 64  e-counter is upd
306b0 61 74 65 64 2c 0a 2a 2a 20 20 20 2a 20 74 68 65  ated,.**   * the
306c0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63   journal is sync
306d0 65 64 20 28 75 6e 6c 65 73 73 20 74 68 65 20 61  ed (unless the a
306e0 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69  tomic-write opti
306f0 6d 69 7a 61 74 69 6f 6e 20 69 73 20 75 73 65 64  mization is used
30700 29 2c 0a 2a 2a 20 20 20 2a 20 61 6c 6c 20 64 69  ),.**   * all di
30710 72 74 79 20 70 61 67 65 73 20 61 72 65 20 77 72  rty pages are wr
30720 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74  itten to the dat
30730 61 62 61 73 65 20 66 69 6c 65 2c 20 0a 2a 2a 20  abase file, .** 
30740 20 20 2a 20 74 68 65 20 64 61 74 61 62 61 73 65    * the database
30750 20 66 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74   file is truncat
30760 65 64 20 28 69 66 20 72 65 71 75 69 72 65 64 29  ed (if required)
30770 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 74 68 65  , and.**   * the
30780 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 73   database file s
30790 79 6e 63 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68  ynced. .**.** Th
307a0 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 74 68 61  e only thing tha
307b0 74 20 72 65 6d 61 69 6e 73 20 74 6f 20 63 6f 6d  t remains to com
307c0 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  mit the transact
307d0 69 6f 6e 20 69 73 20 74 6f 20 66 69 6e 61 6c 69  ion is to finali
307e0 7a 65 20 0a 2a 2a 20 28 64 65 6c 65 74 65 2c 20  ze .** (delete, 
307f0 74 72 75 6e 63 61 74 65 20 6f 72 20 7a 65 72 6f  truncate or zero
30800 20 74 68 65 20 66 69 72 73 74 20 70 61 72 74 20   the first part 
30810 6f 66 29 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  of) the journal 
30820 66 69 6c 65 20 28 6f 72 20 0a 2a 2a 20 64 65 6c  file (or .** del
30830 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
30840 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 73  ournal file if s
30850 70 65 63 69 66 69 65 64 29 2e 0a 2a 2a 0a 2a 2a  pecified)..**.**
30860 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20 7a 4d   Note that if zM
30870 61 73 74 65 72 3d 3d 4e 55 4c 4c 2c 20 74 68 69  aster==NULL, thi
30880 73 20 64 6f 65 73 20 6e 6f 74 20 6f 76 65 72 77  s does not overw
30890 72 69 74 65 20 61 20 70 72 65 76 69 6f 75 73 20  rite a previous 
308a0 76 61 6c 75 65 0a 2a 2a 20 70 61 73 73 65 64 20  value.** passed 
308b0 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 50 61 67  to an sqlite3Pag
308c0 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  erCommitPhaseOne
308d0 28 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49  () call..**.** I
308e0 66 20 74 68 65 20 66 69 6e 61 6c 20 70 61 72 61  f the final para
308f0 6d 65 74 65 72 20 2d 20 6e 6f 53 79 6e 63 20 2d  meter - noSync -
30900 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74   is true, then t
30910 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
30920 20 69 74 73 65 6c 66 0a 2a 2a 20 69 73 20 6e 6f   itself.** is no
30930 74 20 73 79 6e 63 65 64 2e 20 54 68 65 20 63 61  t synced. The ca
30940 6c 6c 65 72 20 6d 75 73 74 20 63 61 6c 6c 20 73  ller must call s
30950 71 6c 69 74 65 33 50 61 67 65 72 53 79 6e 63 28  qlite3PagerSync(
30960 29 20 64 69 72 65 63 74 6c 79 20 74 6f 0a 2a 2a  ) directly to.**
30970 20 73 79 6e 63 20 74 68 65 20 64 61 74 61 62 61   sync the databa
30980 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65 20 63  se file before c
30990 61 6c 6c 69 6e 67 20 43 6f 6d 6d 69 74 50 68 61  alling CommitPha
309a0 73 65 54 77 6f 28 29 20 74 6f 20 64 65 6c 65 74  seTwo() to delet
309b0 65 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  e the.** journal
309c0 20 66 69 6c 65 20 69 6e 20 74 68 69 73 20 63 61   file in this ca
309d0 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  se..*/.int sqlit
309e0 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  e3PagerCommitPha
309f0 73 65 4f 6e 65 28 0a 20 20 50 61 67 65 72 20 2a  seOne(.  Pager *
30a00 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20  pPager,         
30a10 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
30a20 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f  r object */.  co
30a30 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  nst char *zMaste
30a40 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r,            /*
30a50 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   If not NULL, th
30a60 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
30a70 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   name */.  int n
30a80 6f 53 79 6e 63 20 20 20 20 20 20 20 20 20 20 20  oSync           
30a90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
30aa0 75 65 20 74 6f 20 6f 6d 69 74 20 74 68 65 20 78  ue to omit the x
30ab0 53 79 6e 63 20 6f 6e 20 74 68 65 20 64 62 20 66  Sync on the db f
30ac0 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ile */.){.  int 
30ad0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
30ae0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
30af0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20  eturn code */.. 
30b00 20 2f 2a 20 54 68 65 20 64 62 4f 72 69 67 53 69   /* The dbOrigSi
30b10 7a 65 20 69 73 20 6e 65 76 65 72 20 73 65 74 20  ze is never set 
30b20 69 66 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  if journal_mode=
30b30 4f 46 46 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  OFF */.  assert(
30b40 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
30b50 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode!=PAGER_JOUR
30b60 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 7c 7c 20 70  NALMODE_OFF || p
30b70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
30b80 65 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  e==0 );..  /* If
30b90 20 61 20 70 72 69 6f 72 20 65 72 72 6f 72 20 6f   a prior error o
30ba0 63 63 75 72 72 65 64 2c 20 72 65 70 6f 72 74 20  ccurred, report 
30bb0 74 68 61 74 20 65 72 72 6f 72 20 61 67 61 69 6e  that error again
30bc0 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65  . */.  if( pPage
30bd0 72 2d 3e 65 72 72 43 6f 64 65 20 29 20 72 65 74  r->errCode ) ret
30be0 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43  urn pPager->errC
30bf0 6f 64 65 3b 0a 0a 20 20 50 41 47 45 52 54 52 41  ode;..  PAGERTRA
30c00 43 45 28 28 22 44 41 54 41 42 41 53 45 20 53 59  CE(("DATABASE SY
30c10 4e 43 3a 20 46 69 6c 65 3d 25 73 20 7a 4d 61 73  NC: File=%s zMas
30c20 74 65 72 3d 25 73 20 6e 53 69 7a 65 3d 25 64 5c  ter=%s nSize=%d\
30c30 6e 22 2c 20 0a 20 20 20 20 20 20 70 50 61 67 65  n", .      pPage
30c40 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 4d  r->zFilename, zM
30c50 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 64  aster, pPager->d
30c60 62 53 69 7a 65 29 29 3b 0a 0a 20 20 69 66 28 20  bSize));..  if( 
30c70 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d  MEMDB && pPager-
30c80 3e 64 62 4d 6f 64 69 66 69 65 64 20 29 7b 0a 20  >dbModified ){. 
30c90 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
30ca0 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 62   an in-memory db
30cb0 2c 20 6f 72 20 6e 6f 20 70 61 67 65 73 20 68 61  , or no pages ha
30cc0 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  ve been written 
30cd0 74 6f 2c 20 6f 72 20 74 68 69 73 0a 20 20 20 20  to, or this.    
30ce0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  ** function has 
30cf0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c  already been cal
30d00 6c 65 64 2c 20 69 74 20 69 73 20 6d 6f 73 74 6c  led, it is mostl
30d10 79 20 61 20 6e 6f 2d 6f 70 2e 20 20 48 6f 77 65  y a no-op.  Howe
30d20 76 65 72 2c 20 61 6e 79 0a 20 20 20 20 2a 2a 20  ver, any.    ** 
30d30 62 61 63 6b 75 70 20 69 6e 20 70 72 6f 67 72 65  backup in progre
30d40 73 73 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72  ss needs to be r
30d50 65 73 74 61 72 74 65 64 2e 0a 20 20 20 20 2a 2f  estarted..    */
30d60 0a 20 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b  .    sqlite3Back
30d70 75 70 52 65 73 74 61 72 74 28 70 50 61 67 65 72  upRestart(pPager
30d80 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 20 20 7d 65  ->pBackup);.  }e
30d90 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e  lse if( pPager->
30da0 64 62 4d 6f 64 69 66 69 65 64 20 29 7b 0a 20 20  dbModified ){.  
30db0 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61    if( pagerUseWa
30dc0 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
30dd0 20 20 20 50 67 48 64 72 20 2a 70 4c 69 73 74 20     PgHdr *pList 
30de0 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44  = sqlite3PcacheD
30df0 69 72 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d  irtyList(pPager-
30e00 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 20 20 20  >pPCache);.     
30e10 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20   if( pList ){.  
30e20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
30e30 57 61 6c 46 72 61 6d 65 73 28 70 50 61 67 65 72  WalFrames(pPager
30e40 2c 20 70 4c 69 73 74 2c 20 70 50 61 67 65 72 2d  , pList, pPager-
30e50 3e 64 62 53 69 7a 65 2c 20 31 2c 20 0a 20 20 20  >dbSize, 1, .   
30e60 20 20 20 20 20 20 20 20 20 28 70 50 61 67 65 72           (pPager
30e70 2d 3e 66 75 6c 6c 53 79 6e 63 20 3f 20 70 50 61  ->fullSync ? pPa
30e80 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 20  ger->sync_flags 
30e90 3a 20 30 29 0a 20 20 20 20 20 20 20 20 29 3b 0a  : 0).        );.
30ea0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
30eb0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
30ec0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
30ed0 65 33 50 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c  e3PcacheCleanAll
30ee0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
30ef0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
30f00 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 54  else{.      /* T
30f10 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
30f20 63 6b 20 75 70 64 61 74 65 73 20 74 68 65 20 63  ck updates the c
30f30 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2e 20 45  hange-counter. E
30f40 78 61 63 74 6c 79 20 68 6f 77 20 69 74 0a 20 20  xactly how it.  
30f50 20 20 20 20 2a 2a 20 64 6f 65 73 20 74 68 69 73      ** does this
30f60 20 64 65 70 65 6e 64 73 20 6f 6e 20 77 68 65 74   depends on whet
30f70 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 61  her or not the a
30f80 74 6f 6d 69 63 2d 75 70 64 61 74 65 20 6f 70 74  tomic-update opt
30f90 69 6d 69 7a 61 74 69 6f 6e 0a 20 20 20 20 20 20  imization.      
30fa0 2a 2a 20 77 61 73 20 65 6e 61 62 6c 65 64 20 61  ** was enabled a
30fb0 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20  t compile time, 
30fc0 61 6e 64 20 69 66 20 74 68 69 73 20 74 72 61 6e  and if this tran
30fd0 73 61 63 74 69 6f 6e 20 6d 65 65 74 73 20 74 68  saction meets th
30fe0 65 20 0a 20 20 20 20 20 20 2a 2a 20 72 75 6e 74  e .      ** runt
30ff0 69 6d 65 20 63 72 69 74 65 72 69 61 20 74 6f 20  ime criteria to 
31000 75 73 65 20 74 68 65 20 6f 70 65 72 61 74 69 6f  use the operatio
31010 6e 3a 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  n: .      **.   
31020 20 20 20 2a 2a 20 20 20 20 2a 20 54 68 65 20 66     **    * The f
31030 69 6c 65 2d 73 79 73 74 65 6d 20 73 75 70 70 6f  ile-system suppo
31040 72 74 73 20 74 68 65 20 61 74 6f 6d 69 63 2d 77  rts the atomic-w
31050 72 69 74 65 20 70 72 6f 70 65 72 74 79 20 66 6f  rite property fo
31060 72 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20  r.      **      
31070 62 6c 6f 63 6b 73 20 6f 66 20 73 69 7a 65 20 70  blocks of size p
31080 61 67 65 2d 73 69 7a 65 2c 20 61 6e 64 20 0a 20  age-size, and . 
31090 20 20 20 20 20 2a 2a 20 20 20 20 2a 20 54 68 69       **    * Thi
310a0 73 20 63 6f 6d 6d 69 74 20 69 73 20 6e 6f 74 20  s commit is not 
310b0 70 61 72 74 20 6f 66 20 61 20 6d 75 6c 74 69 2d  part of a multi-
310c0 66 69 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  file transaction
310d0 2c 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 20  , and.      **  
310e0 20 20 2a 20 45 78 61 63 74 6c 79 20 6f 6e 65 20    * Exactly one 
310f0 70 61 67 65 20 68 61 73 20 62 65 65 6e 20 6d 6f  page has been mo
31100 64 69 66 69 65 64 20 61 6e 64 20 73 74 6f 72 65  dified and store
31110 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
31120 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  file..      **. 
31130 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 6f       ** If the o
31140 70 74 69 6d 69 7a 61 74 69 6f 6e 20 77 61 73 20  ptimization was 
31150 6e 6f 74 20 65 6e 61 62 6c 65 64 20 61 74 20 63  not enabled at c
31160 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20 74 68 65  ompile time, the
31170 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 70  n the.      ** p
31180 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65  ager_incr_change
31190 63 6f 75 6e 74 65 72 28 29 20 66 75 6e 63 74 69  counter() functi
311a0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  on is called to 
311b0 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67  update the chang
311c0 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 75 6e 74  e.      ** count
311d0 65 72 20 69 6e 20 27 69 6e 64 69 72 65 63 74 2d  er in 'indirect-
311e0 6d 6f 64 65 27 2e 20 49 66 20 74 68 65 20 6f 70  mode'. If the op
311f0 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 63 6f  timization is co
31200 6d 70 69 6c 65 64 20 69 6e 20 62 75 74 0a 20 20  mpiled in but.  
31210 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 70      ** is not ap
31220 70 6c 69 63 61 62 6c 65 20 74 6f 20 74 68 69 73  plicable to this
31230 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 63 61   transaction, ca
31240 6c 6c 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61  ll sqlite3Journa
31250 6c 43 72 65 61 74 65 28 29 0a 20 20 20 20 20 20  lCreate().      
31260 2a 2a 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ** to make sure 
31270 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
31280 20 68 61 73 20 61 63 74 75 61 6c 6c 79 20 62 65   has actually be
31290 65 6e 20 63 72 65 61 74 65 64 2c 20 74 68 65 6e  en created, then
312a0 20 63 61 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 70   call.      ** p
312b0 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65  ager_incr_change
312c0 63 6f 75 6e 74 65 72 28 29 20 74 6f 20 75 70 64  counter() to upd
312d0 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 2d 63  ate the change-c
312e0 6f 75 6e 74 65 72 20 69 6e 20 69 6e 64 69 72 65  ounter in indire
312f0 63 74 0a 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65  ct.      ** mode
31300 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  . .      **.    
31310 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20    ** Otherwise, 
31320 69 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74  if the optimizat
31330 69 6f 6e 20 69 73 20 62 6f 74 68 20 65 6e 61 62  ion is both enab
31340 6c 65 64 20 61 6e 64 20 61 70 70 6c 69 63 61 62  led and applicab
31350 6c 65 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  le,.      ** the
31360 6e 20 63 61 6c 6c 20 70 61 67 65 72 5f 69 6e 63  n call pager_inc
31370 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  r_changecounter(
31380 29 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20  ) to update the 
31390 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 0a 20  change-counter. 
313a0 20 20 20 20 20 2a 2a 20 69 6e 20 27 64 69 72 65       ** in 'dire
313b0 63 74 27 20 6d 6f 64 65 2e 20 49 6e 20 74 68 69  ct' mode. In thi
313c0 73 20 63 61 73 65 20 74 68 65 20 6a 6f 75 72 6e  s case the journ
313d0 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20 6e 65 76  al file will nev
313e0 65 72 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 63  er be.      ** c
313f0 72 65 61 74 65 64 20 66 6f 72 20 74 68 69 73 20  reated for this 
31400 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20  transaction..   
31410 20 20 20 2a 2f 0a 20 20 23 69 66 64 65 66 20 53     */.  #ifdef S
31420 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f  QLITE_ENABLE_ATO
31430 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20 20 20  MIC_WRITE.      
31440 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 20 20  PgHdr *pPg;.    
31450 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
31460 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 0a 20  (pPager->jfd) . 
31470 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61            || pPa
31480 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
31490 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
314a0 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20 20  ODE_OFF .       
314b0 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a      || pPager->j
314c0 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
314d0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
314e0 4c 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  L .      );.    
314f0 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20 26    if( !zMaster &
31500 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  & isOpen(pPager-
31510 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20 26 26  >jfd) .       &&
31520 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
31530 4f 66 66 3d 3d 6a 72 6e 6c 42 75 66 66 65 72 53  Off==jrnlBufferS
31540 69 7a 65 28 70 50 61 67 65 72 29 20 0a 20 20 20  ize(pPager) .   
31550 20 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 64      && pPager->d
31560 62 53 69 7a 65 3e 3d 70 50 61 67 65 72 2d 3e 64  bSize>=pPager->d
31570 62 46 69 6c 65 53 69 7a 65 0a 20 20 20 20 20 20  bFileSize.      
31580 20 26 26 20 28 30 3d 3d 28 70 50 67 20 3d 20 73   && (0==(pPg = s
31590 71 6c 69 74 65 33 50 63 61 63 68 65 44 69 72 74  qlite3PcacheDirt
315a0 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50  yList(pPager->pP
315b0 43 61 63 68 65 29 29 20 7c 7c 20 30 3d 3d 70 50  Cache)) || 0==pP
315c0 67 2d 3e 70 44 69 72 74 79 29 0a 20 20 20 20 20  g->pDirty).     
315d0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 55   ){.        /* U
315e0 70 64 61 74 65 20 74 68 65 20 64 62 20 66 69 6c  pdate the db fil
315f0 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72  e change counter
31600 20 76 69 61 20 74 68 65 20 64 69 72 65 63 74 2d   via the direct-
31610 77 72 69 74 65 20 6d 65 74 68 6f 64 2e 20 54 68  write method. Th
31620 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 6f  e .        ** fo
31630 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c 20 77 69 6c  llowing call wil
31640 6c 20 6d 6f 64 69 66 79 20 74 68 65 20 69 6e 2d  l modify the in-
31650 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74  memory represent
31660 61 74 69 6f 6e 20 6f 66 20 70 61 67 65 20 31 20  ation of page 1 
31670 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 69  .        ** to i
31680 6e 63 6c 75 64 65 20 74 68 65 20 75 70 64 61 74  nclude the updat
31690 65 64 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65  ed change counte
316a0 72 20 61 6e 64 20 74 68 65 6e 20 77 72 69 74 65  r and then write
316b0 20 70 61 67 65 20 31 20 0a 20 20 20 20 20 20 20   page 1 .       
316c0 20 2a 2a 20 64 69 72 65 63 74 6c 79 20 74 6f 20   ** directly to 
316d0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
316e0 65 2e 20 42 65 63 61 75 73 65 20 6f 66 20 74 68  e. Because of th
316f0 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 0a  e atomic-write .
31700 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 70 65          ** prope
31710 72 74 79 20 6f 66 20 74 68 65 20 68 6f 73 74 20  rty of the host 
31720 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 74 68 69  file-system, thi
31730 73 20 69 73 20 73 61 66 65 2e 0a 20 20 20 20 20  s is safe..     
31740 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63     */.        rc
31750 20 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68   = pager_incr_ch
31760 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 50 61 67  angecounter(pPag
31770 65 72 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 65  er, 1);.      }e
31780 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
31790 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c  = sqlite3Journal
317a0 43 72 65 61 74 65 28 70 50 61 67 65 72 2d 3e 6a  Create(pPager->j
317b0 66 64 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  fd);.        if(
317c0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
317d0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
317e0 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e   pager_incr_chan
317f0 67 65 63 6f 75 6e 74 65 72 28 70 50 61 67 65 72  gecounter(pPager
31800 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , 0);.        }.
31810 20 20 20 20 20 20 7d 0a 20 20 23 65 6c 73 65 0a        }.  #else.
31820 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
31830 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e  _incr_changecoun
31840 74 65 72 28 70 50 61 67 65 72 2c 20 30 29 3b 0a  ter(pPager, 0);.
31850 20 20 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69    #endif.      i
31860 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
31870 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70   ) goto commit_p
31880 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20  hase_one_exit;. 
31890 20 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68   .      /* If th
318a0 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68  is transaction h
318b0 61 73 20 6d 61 64 65 20 74 68 65 20 64 61 74 61  as made the data
318c0 62 61 73 65 20 73 6d 61 6c 6c 65 72 2c 20 74 68  base smaller, th
318d0 65 6e 20 61 6c 6c 20 70 61 67 65 73 0a 20 20 20  en all pages.   
318e0 20 20 20 2a 2a 20 62 65 69 6e 67 20 64 69 73 63     ** being disc
318f0 61 72 64 65 64 20 62 79 20 74 68 65 20 74 72 75  arded by the tru
31900 6e 63 61 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  ncation must be 
31910 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a  written to the j
31920 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20  ournal.      ** 
31930 66 69 6c 65 2e 20 54 68 69 73 20 63 61 6e 20 6f  file. This can o
31940 6e 6c 79 20 68 61 70 70 65 6e 20 69 6e 20 61 75  nly happen in au
31950 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 2e 0a  to-vacuum mode..
31960 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
31970 2a 20 42 65 66 6f 72 65 20 72 65 61 64 69 6e 67  * Before reading
31980 20 74 68 65 20 70 61 67 65 73 20 77 69 74 68 20   the pages with 
31990 70 61 67 65 20 6e 75 6d 62 65 72 73 20 6c 61 72  page numbers lar
319a0 67 65 72 20 74 68 61 6e 20 74 68 65 20 0a 20 20  ger than the .  
319b0 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 76      ** current v
319c0 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62  alue of Pager.db
319d0 53 69 7a 65 2c 20 73 65 74 20 64 62 53 69 7a 65  Size, set dbSize
319e0 20 62 61 63 6b 20 74 6f 20 74 68 65 20 76 61 6c   back to the val
319f0 75 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74  ue.      ** that
31a00 20 69 74 20 74 6f 6f 6b 20 61 74 20 74 68 65 20   it took at the 
31a10 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61  start of the tra
31a20 6e 73 61 63 74 69 6f 6e 2e 20 4f 74 68 65 72 77  nsaction. Otherw
31a30 69 73 65 2c 20 74 68 65 0a 20 20 20 20 20 20 2a  ise, the.      *
31a40 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  * calls to sqlit
31a50 65 33 50 61 67 65 72 47 65 74 28 29 20 72 65 74  e3PagerGet() ret
31a60 75 72 6e 20 7a 65 72 6f 65 64 20 70 61 67 65 73  urn zeroed pages
31a70 20 69 6e 73 74 65 61 64 20 6f 66 20 0a 20 20 20   instead of .   
31a80 20 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 64 61     ** reading da
31a90 74 61 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ta from the data
31aa0 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 20  base file..     
31ab0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 57 68 65   **.      ** Whe
31ac0 6e 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 3d  n journal_mode==
31ad0 4f 46 46 20 74 68 65 20 64 62 4f 72 69 67 53 69  OFF the dbOrigSi
31ae0 7a 65 20 69 73 20 61 6c 77 61 79 73 20 7a 65 72  ze is always zer
31af0 6f 2c 20 73 6f 20 74 68 69 73 0a 20 20 20 20 20  o, so this.     
31b00 20 2a 2a 20 62 6c 6f 63 6b 20 6e 65 76 65 72 20   ** block never 
31b10 72 75 6e 73 20 69 66 20 6a 6f 75 72 6e 61 6c 5f  runs if journal_
31b20 6d 6f 64 65 3d 4f 46 46 2e 0a 20 20 20 20 20 20  mode=OFF..      
31b30 2a 2f 0a 20 20 23 69 66 6e 64 65 66 20 53 51 4c  */.  #ifndef SQL
31b40 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
31b50 55 55 4d 0a 20 20 20 20 20 20 69 66 28 20 70 50  UUM.      if( pP
31b60 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 70 50 61  ager->dbSize<pPa
31b70 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20  ger->dbOrigSize 
31b80 0a 20 20 20 20 20 20 20 26 26 20 41 4c 57 41 59  .       && ALWAY
31b90 53 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  S(pPager->journa
31ba0 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55  lMode!=PAGER_JOU
31bb0 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 29 0a 20 20  RNALMODE_OFF).  
31bc0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 50      ){.        P
31bd0 67 6e 6f 20 69 3b 20 20 20 20 20 20 20 20 20 20  gno i;          
31be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31bf0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
31c00 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f  ator variable */
31c10 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 50  .        const P
31c20 67 6e 6f 20 69 53 6b 69 70 20 3d 20 50 41 47 45  gno iSkip = PAGE
31c30 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
31c40 29 3b 20 2f 2a 20 50 65 6e 64 69 6e 67 20 6c 6f  ); /* Pending lo
31c50 63 6b 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20  ck page */.     
31c60 20 20 20 63 6f 6e 73 74 20 50 67 6e 6f 20 64 62     const Pgno db
31c70 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
31c80 62 53 69 7a 65 3b 20 20 20 20 20 20 20 2f 2a 20  bSize;       /* 
31c90 44 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 73  Database image s
31ca0 69 7a 65 20 2a 2f 20 0a 20 20 20 20 20 20 20 20  ize */ .        
31cb0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
31cc0 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
31cd0 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  ize;.        for
31ce0 28 20 69 3d 64 62 53 69 7a 65 2b 31 3b 20 69 3c  ( i=dbSize+1; i<
31cf0 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53  =pPager->dbOrigS
31d00 69 7a 65 3b 20 69 2b 2b 20 29 7b 0a 20 20 20 20  ize; i++ ){.    
31d10 20 20 20 20 20 20 69 66 28 20 21 73 71 6c 69 74        if( !sqlit
31d20 65 33 42 69 74 76 65 63 54 65 73 74 28 70 50 61  e3BitvecTest(pPa
31d30 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c  ger->pInJournal,
31d40 20 69 29 20 26 26 20 69 21 3d 69 53 6b 69 70 20   i) && i!=iSkip 
31d50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 50  ){.            P
31d60 67 48 64 72 20 2a 70 50 61 67 65 3b 20 20 20 20  gHdr *pPage;    
31d70 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
31d80 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20   to journal */. 
31d90 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
31da0 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
31db0 70 50 61 67 65 72 2c 20 69 2c 20 26 70 50 61 67  pPager, i, &pPag
31dc0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
31dd0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
31de0 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f  K ) goto commit_
31df0 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a  phase_one_exit;.
31e00 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
31e10 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
31e20 74 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  te(pPage);.     
31e30 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
31e40 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b  gerUnref(pPage);
31e50 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
31e60 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
31e70 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61   goto commit_pha
31e80 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 20  se_one_exit;.   
31e90 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
31ea0 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67 65   }.        pPage
31eb0 72 2d 3e 64 62 53 69 7a 65 20 3d 20 64 62 53 69  r->dbSize = dbSi
31ec0 7a 65 3b 0a 20 20 20 20 20 20 7d 20 0a 20 20 23  ze;.      } .  #
31ed0 65 6e 64 69 66 0a 20 20 0a 20 20 20 20 20 20 2f  endif.  .      /
31ee0 2a 20 57 72 69 74 65 20 74 68 65 20 6d 61 73 74  * Write the mast
31ef0 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
31f00 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
31f10 20 66 69 6c 65 2e 20 49 66 20 61 20 6d 61 73 74   file. If a mast
31f20 65 72 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75  er .      ** jou
31f30 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 68  rnal file name h
31f40 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
31f50 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a  written to the j
31f60 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 0a 20 20  ournal file, .  
31f70 20 20 20 20 2a 2a 20 6f 72 20 69 66 20 7a 4d 61      ** or if zMa
31f80 73 74 65 72 20 69 73 20 4e 55 4c 4c 20 28 6e 6f  ster is NULL (no
31f90 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 29   master journal)
31fa0 2c 20 74 68 65 6e 20 74 68 69 73 20 63 61 6c 6c  , then this call
31fb0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 20   is a no-op..   
31fc0 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
31fd0 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72   writeMasterJour
31fe0 6e 61 6c 28 70 50 61 67 65 72 2c 20 7a 4d 61 73  nal(pPager, zMas
31ff0 74 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ter);.      if( 
32000 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
32010 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73  goto commit_phas
32020 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 0a 20  e_one_exit;.  . 
32030 20 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65       /* Sync the
32040 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
32050 66 20 74 68 65 20 61 74 6f 6d 69 63 2d 75 70 64  f the atomic-upd
32060 61 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ate optimization
32070 20 69 73 20 62 65 69 6e 67 0a 20 20 20 20 20 20   is being.      
32080 2a 2a 20 75 73 65 64 2c 20 74 68 69 73 20 63 61  ** used, this ca
32090 6c 6c 20 77 69 6c 6c 20 6e 6f 74 20 63 72 65 61  ll will not crea
320a0 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  te the journal f
320b0 69 6c 65 20 6f 72 20 70 65 72 66 6f 72 6d 20 61  ile or perform a
320c0 6e 79 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 6c  ny.      ** real
320d0 20 49 4f 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20   IO..      */.  
320e0 20 20 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75      rc = syncJou
320f0 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
32100 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
32110 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d  TE_OK ) goto com
32120 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78  mit_phase_one_ex
32130 69 74 3b 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20  it;.  .      /* 
32140 57 72 69 74 65 20 61 6c 6c 20 64 69 72 74 79 20  Write all dirty 
32150 70 61 67 65 73 20 74 6f 20 74 68 65 20 64 61 74  pages to the dat
32160 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20  abase file. */. 
32170 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
32180 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 70  write_pagelist(p
32190 50 61 67 65 72 2c 73 71 6c 69 74 65 33 50 63 61  Pager,sqlite3Pca
321a0 63 68 65 44 69 72 74 79 4c 69 73 74 28 70 50 61  cheDirtyList(pPa
321b0 67 65 72 2d 3e 70 50 43 61 63 68 65 29 29 3b 0a  ger->pPCache));.
321c0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
321d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
321e0 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
321f0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43  QLITE_IOERR_BLOC
32200 4b 45 44 20 29 3b 0a 20 20 20 20 20 20 20 20 67  KED );.        g
32210 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65  oto commit_phase
32220 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 20 20 20  _one_exit;.     
32230 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
32240 50 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70  PcacheCleanAll(p
32250 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
32260 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  .  .      /* If 
32270 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  the file on disk
32280 20 69 73 20 6e 6f 74 20 74 68 65 20 73 61 6d 65   is not the same
32290 20 73 69 7a 65 20 61 73 20 74 68 65 20 64 61 74   size as the dat
322a0 61 62 61 73 65 20 69 6d 61 67 65 2c 0a 20 20 20  abase image,.   
322b0 20 20 20 2a 2a 20 74 68 65 6e 20 75 73 65 20 70     ** then use p
322c0 61 67 65 72 5f 74 72 75 6e 63 61 74 65 20 74 6f  ager_truncate to
322d0 20 67 72 6f 77 20 6f 72 20 73 68 72 69 6e 6b 20   grow or shrink 
322e0 74 68 65 20 66 69 6c 65 20 68 65 72 65 2e 0a 20  the file here.. 
322f0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
32300 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
32310 21 3d 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  !=pPager->dbFile
32320 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
32330 50 67 6e 6f 20 6e 4e 65 77 20 3d 20 70 50 61 67  Pgno nNew = pPag
32340 65 72 2d 3e 64 62 53 69 7a 65 20 2d 20 28 70 50  er->dbSize - (pP
32350 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 50 41  ager->dbSize==PA
32360 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
32370 65 72 29 29 3b 0a 20 20 20 20 20 20 20 20 61 73  er));.        as
32380 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
32390 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55  ate>=PAGER_EXCLU
323a0 53 49 56 45 20 29 3b 0a 20 20 20 20 20 20 20 20  SIVE );.        
323b0 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63  rc = pager_trunc
323c0 61 74 65 28 70 50 61 67 65 72 2c 20 6e 4e 65 77  ate(pPager, nNew
323d0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
323e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
323f0 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65  oto commit_phase
32400 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 20 20 20  _one_exit;.     
32410 20 7d 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 46   }.  .      /* F
32420 69 6e 61 6c 6c 79 2c 20 73 79 6e 63 20 74 68 65  inally, sync the
32430 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
32440 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21 70 50  */.      if( !pP
32450 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 26 26 20  ager->noSync && 
32460 21 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20  !noSync ){.     
32470 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
32480 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 66 64  sSync(pPager->fd
32490 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66  , pPager->sync_f
324a0 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20  lags);.      }. 
324b0 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 44       IOTRACE(("D
324c0 42 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61  BSYNC %p\n", pPa
324d0 67 65 72 29 29 0a 20 20 20 20 7d 0a 0a 20 20 20  ger)).    }..   
324e0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
324f0 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 53 59  >state!=PAGER_SY
32500 4e 43 45 44 20 29 3b 0a 20 20 20 20 70 50 61 67  NCED );.    pPag
32510 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
32520 52 5f 53 59 4e 43 45 44 3b 0a 20 20 7d 0a 0a 63  R_SYNCED;.  }..c
32530 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f  ommit_phase_one_
32540 65 78 69 74 3a 0a 20 20 72 65 74 75 72 6e 20 72  exit:.  return r
32550 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 68 65  c;.}.../*.** Whe
32560 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
32570 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 64  is called, the d
32580 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73  atabase file has
32590 20 62 65 65 6e 20 63 6f 6d 70 6c 65 74 65 6c 79   been completely
325a0 0a 2a 2a 20 75 70 64 61 74 65 64 20 74 6f 20 72  .** updated to r
325b0 65 66 6c 65 63 74 20 74 68 65 20 63 68 61 6e 67  eflect the chang
325c0 65 73 20 6d 61 64 65 20 62 79 20 74 68 65 20 63  es made by the c
325d0 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
325e0 6f 6e 20 61 6e 64 0a 2a 2a 20 73 79 6e 63 65 64  on and.** synced
325f0 20 74 6f 20 64 69 73 6b 2e 20 54 68 65 20 6a 6f   to disk. The jo
32600 75 72 6e 61 6c 20 66 69 6c 65 20 73 74 69 6c 6c  urnal file still
32610 20 65 78 69 73 74 73 20 69 6e 20 74 68 65 20 66   exists in the f
32620 69 6c 65 2d 73 79 73 74 65 6d 20 0a 2a 2a 20 74  ile-system .** t
32630 68 6f 75 67 68 2c 20 61 6e 64 20 69 66 20 61 20  hough, and if a 
32640 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 61  failure occurs a
32650 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20  t this point it 
32660 77 69 6c 6c 20 65 76 65 6e 74 75 61 6c 6c 79 0a  will eventually.
32670 2a 2a 20 62 65 20 75 73 65 64 20 61 73 20 61 20  ** be used as a 
32680 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  hot-journal and 
32690 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e  the current tran
326a0 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 65 64 20 62  saction rolled b
326b0 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ack..**.** This 
326c0 66 75 6e 63 74 69 6f 6e 20 66 69 6e 61 6c 69 7a  function finaliz
326d0 65 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  es the journal f
326e0 69 6c 65 2c 20 65 69 74 68 65 72 20 62 79 20 64  ile, either by d
326f0 65 6c 65 74 69 6e 67 2c 20 0a 2a 2a 20 74 72 75  eleting, .** tru
32700 6e 63 61 74 69 6e 67 20 6f 72 20 70 61 72 74 69  ncating or parti
32710 61 6c 6c 79 20 7a 65 72 6f 69 6e 67 20 69 74 2c  ally zeroing it,
32720 20 73 6f 20 74 68 61 74 20 69 74 20 63 61 6e 6e   so that it cann
32730 6f 74 20 62 65 20 75 73 65 64 20 0a 2a 2a 20 66  ot be used .** f
32740 6f 72 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72  or hot-journal r
32750 6f 6c 6c 62 61 63 6b 2e 20 4f 6e 63 65 20 74 68  ollback. Once th
32760 69 73 20 69 73 20 64 6f 6e 65 20 74 68 65 20 74  is is done the t
32770 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 2a 2a  ransaction is.**
32780 20 69 72 72 65 76 6f 63 61 62 6c 79 20 63 6f 6d   irrevocably com
32790 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  mitted..**.** If
327a0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
327b0 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f  , an IO error co
327c0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  de is returned a
327d0 6e 64 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20  nd the pager.** 
327e0 6d 6f 76 65 73 20 69 6e 74 6f 20 74 68 65 20 65  moves into the e
327f0 72 72 6f 72 20 73 74 61 74 65 2e 20 4f 74 68 65  rror state. Othe
32800 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b  rwise, SQLITE_OK
32810 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
32820 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
32830 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  rCommitPhaseTwo(
32840 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
32850 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
32860 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
32870 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
32880 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54   code */..  /* T
32890 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75  his routine shou
328a0 6c 64 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64  ld not be called
328b0 20 69 66 20 61 20 70 72 69 6f 72 20 65 72 72 6f   if a prior erro
328c0 72 20 68 61 73 20 6f 63 63 75 72 72 65 64 2e 0a  r has occurred..
328d0 20 20 2a 2a 20 42 75 74 20 69 66 20 28 64 75 65    ** But if (due
328e0 20 74 6f 20 61 20 63 6f 64 69 6e 67 20 65 72 72   to a coding err
328f0 6f 72 20 65 6c 73 65 77 68 65 72 65 20 69 6e 20  or elsewhere in 
32900 74 68 65 20 73 79 73 74 65 6d 29 20 69 74 20 64  the system) it d
32910 6f 65 73 20 67 65 74 0a 20 20 2a 2a 20 63 61 6c  oes get.  ** cal
32920 6c 65 64 2c 20 6a 75 73 74 20 72 65 74 75 72 6e  led, just return
32930 20 74 68 65 20 73 61 6d 65 20 65 72 72 6f 72 20   the same error 
32940 63 6f 64 65 20 77 69 74 68 6f 75 74 20 64 6f 69  code without doi
32950 6e 67 20 61 6e 79 74 68 69 6e 67 2e 20 2a 2f 0a  ng anything. */.
32960 20 20 69 66 28 20 4e 45 56 45 52 28 70 50 61 67    if( NEVER(pPag
32970 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 72  er->errCode) ) r
32980 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72  eturn pPager->er
32990 72 43 6f 64 65 3b 0a 0a 20 20 2f 2a 20 54 68 69  rCode;..  /* Thi
329a0 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c  s function shoul
329b0 64 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64 20  d not be called 
329c0 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  if the pager is 
329d0 6e 6f 74 20 69 6e 20 61 74 20 6c 65 61 73 74 0a  not in at least.
329e0 20 20 2a 2a 20 50 41 47 45 52 5f 52 45 53 45 52    ** PAGER_RESER
329f0 56 45 44 20 73 74 61 74 65 2e 20 2a 2a 46 49 58  VED state. **FIX
32a00 4d 45 2a 2a 3a 20 4d 61 6b 65 20 69 74 20 73 6f  ME**: Make it so
32a10 20 74 68 61 74 20 74 68 69 73 20 74 65 73 74 20   that this test 
32a20 61 6c 77 61 79 73 0a 20 20 2a 2a 20 66 61 69 6c  always.  ** fail
32a30 73 20 2d 20 6d 61 6b 65 20 69 74 20 73 6f 20 74  s - make it so t
32a40 68 61 74 20 77 65 20 6e 65 76 65 72 20 72 65 61  hat we never rea
32a50 63 68 20 74 68 69 73 20 70 6f 69 6e 74 20 69 66  ch this point if
32a60 20 77 65 20 64 6f 20 6e 6f 74 20 68 6f 6c 64 0a   we do not hold.
32a70 20 20 2a 2a 20 61 6c 6c 20 6e 65 63 65 73 73 61    ** all necessa
32a80 72 79 20 6c 6f 63 6b 73 2e 0a 20 20 2a 2f 0a 20  ry locks..  */. 
32a90 20 69 66 28 20 4e 45 56 45 52 28 70 50 61 67 65   if( NEVER(pPage
32aa0 72 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f 52  r->state<PAGER_R
32ab0 45 53 45 52 56 45 44 29 20 29 20 72 65 74 75 72  ESERVED) ) retur
32ac0 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
32ad0 0a 20 20 2f 2a 20 41 6e 20 6f 70 74 69 6d 69 7a  .  /* An optimiz
32ae0 61 74 69 6f 6e 2e 20 49 66 20 74 68 65 20 64 61  ation. If the da
32af0 74 61 62 61 73 65 20 77 61 73 20 6e 6f 74 20 61  tabase was not a
32b00 63 74 75 61 6c 6c 79 20 6d 6f 64 69 66 69 65 64  ctually modified
32b10 20 64 75 72 69 6e 67 0a 20 20 2a 2a 20 74 68 69   during.  ** thi
32b20 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74  s transaction, t
32b30 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e  he pager is runn
32b40 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65  ing in exclusive
32b50 2d 6d 6f 64 65 20 61 6e 64 20 69 73 0a 20 20 2a  -mode and is.  *
32b60 2a 20 75 73 69 6e 67 20 70 65 72 73 69 73 74 65  * using persiste
32b70 6e 74 20 6a 6f 75 72 6e 61 6c 73 2c 20 74 68 65  nt journals, the
32b80 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
32b90 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2a  is a no-op..  **
32ba0 0a 20 20 2a 2a 20 54 68 65 20 73 74 61 72 74 20  .  ** The start 
32bb0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
32bc0 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 63 6f  ile currently co
32bd0 6e 74 61 69 6e 73 20 61 20 73 69 6e 67 6c 65 20  ntains a single 
32be0 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 68 65  journal .  ** he
32bf0 61 64 65 72 20 77 69 74 68 20 74 68 65 20 6e 52  ader with the nR
32c00 65 63 20 66 69 65 6c 64 20 73 65 74 20 74 6f 20  ec field set to 
32c10 30 2e 20 49 66 20 73 75 63 68 20 61 20 6a 6f 75  0. If such a jou
32c20 72 6e 61 6c 20 69 73 20 75 73 65 64 20 61 73 0a  rnal is used as.
32c30 20 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e    ** a hot-journ
32c40 61 6c 20 64 75 72 69 6e 67 20 68 6f 74 2d 6a 6f  al during hot-jo
32c50 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20  urnal rollback, 
32c60 30 20 63 68 61 6e 67 65 73 20 77 69 6c 6c 20 62  0 changes will b
32c70 65 20 6d 61 64 65 0a 20 20 2a 2a 20 74 6f 20 74  e made.  ** to t
32c80 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
32c90 2e 20 53 6f 20 74 68 65 72 65 20 69 73 20 6e 6f  . So there is no
32ca0 20 6e 65 65 64 20 74 6f 20 7a 65 72 6f 20 74 68   need to zero th
32cb0 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20  e journal .  ** 
32cc0 68 65 61 64 65 72 2e 20 53 69 6e 63 65 20 74 68  header. Since th
32cd0 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65 78  e pager is in ex
32ce0 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68  clusive mode, th
32cf0 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20  ere is no need. 
32d00 20 2a 2a 20 74 6f 20 64 72 6f 70 20 61 6e 79 20   ** to drop any 
32d10 6c 6f 63 6b 73 20 65 69 74 68 65 72 2e 0a 20 20  locks either..  
32d20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
32d30 3e 64 62 4d 6f 64 69 66 69 65 64 3d 3d 30 20 26  >dbModified==0 &
32d40 26 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73  & pPager->exclus
32d50 69 76 65 4d 6f 64 65 20 0a 20 20 20 26 26 20 70  iveMode .   && p
32d60 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
32d70 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
32d80 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a 20 20  LMODE_PERSIST.  
32d90 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
32da0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
32db0 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  f==JOURNAL_HDR_S
32dc0 5a 28 70 50 61 67 65 72 29 20 7c 7c 20 21 70 50  Z(pPager) || !pP
32dd0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
32de0 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   );.    return S
32df0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
32e00 20 50 41 47 45 52 54 52 41 43 45 28 28 22 43 4f   PAGERTRACE(("CO
32e10 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 50 41 47 45  MMIT %d\n", PAGE
32e20 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20  RID(pPager)));. 
32e30 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
32e40 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 59  >state==PAGER_SY
32e50 4e 43 45 44 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c  NCED || MEMDB ||
32e60 20 21 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69   !pPager->dbModi
32e70 66 69 65 64 20 29 3b 0a 20 20 72 63 20 3d 20 70  fied );.  rc = p
32e80 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
32e90 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 70 50 61  tion(pPager, pPa
32ea0 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 3b  ger->setMaster);
32eb0 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f  .  return pager_
32ec0 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
32ed0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c  );.}../*.** Roll
32ee0 62 61 63 6b 20 61 6c 6c 20 63 68 61 6e 67 65 73  back all changes
32ef0 2e 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  . The database f
32f00 61 6c 6c 73 20 62 61 63 6b 20 74 6f 20 50 41 47  alls back to PAG
32f10 45 52 5f 53 48 41 52 45 44 20 6d 6f 64 65 2e 0a  ER_SHARED mode..
32f20 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
32f30 69 6f 6e 20 70 65 72 66 6f 72 6d 73 20 74 77 6f  ion performs two
32f40 20 74 61 73 6b 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   tasks:.**.**   
32f50 31 29 20 49 74 20 72 6f 6c 6c 73 20 62 61 63 6b  1) It rolls back
32f60 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
32f70 65 2c 20 72 65 73 74 6f 72 69 6e 67 20 61 6c 6c  e, restoring all
32f80 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
32f90 6e 64 20 0a 2a 2a 20 20 20 20 20 20 69 6e 2d 6d  nd .**      in-m
32fa0 65 6d 6f 72 79 20 63 61 63 68 65 20 70 61 67 65  emory cache page
32fb0 73 20 74 6f 20 74 68 65 20 73 74 61 74 65 20 74  s to the state t
32fc0 68 65 79 20 77 65 72 65 20 69 6e 20 77 68 65 6e  hey were in when
32fd0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
32fe0 0a 2a 2a 20 20 20 20 20 20 77 61 73 20 6f 70 65  .**      was ope
32ff0 6e 65 64 2c 20 61 6e 64 0a 2a 2a 20 20 20 32 29  ned, and.**   2)
33000 20 49 74 20 66 69 6e 61 6c 69 7a 65 73 20 74 68   It finalizes th
33010 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  e journal file, 
33020 73 6f 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f  so that it is no
33030 74 20 75 73 65 64 20 66 6f 72 20 68 6f 74 0a 2a  t used for hot.*
33040 2a 20 20 20 20 20 20 72 6f 6c 6c 62 61 63 6b 20  *      rollback 
33050 61 74 20 61 6e 79 20 70 6f 69 6e 74 20 69 6e 20  at any point in 
33060 74 68 65 20 66 75 74 75 72 65 2e 0a 2a 2a 0a 2a  the future..**.*
33070 2a 20 73 75 62 6a 65 63 74 20 74 6f 20 74 68 65  * subject to the
33080 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 61 6c 69   following quali
33090 66 69 63 61 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a  fications:.**.**
330a0 20 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61   * If the journa
330b0 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 79 65  l file is not ye
330c0 74 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73  t open when this
330d0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
330e0 6c 65 64 2c 0a 2a 2a 20 20 20 74 68 65 6e 20 6f  led,.**   then o
330f0 6e 6c 79 20 28 32 29 20 69 73 20 70 65 72 66 6f  nly (2) is perfo
33100 72 6d 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61  rmed. In this ca
33110 73 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6a  se there is no j
33120 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20  ournal file.**  
33130 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 2e 0a 2a   to roll back..*
33140 2a 0a 2a 2a 20 2a 20 49 66 20 69 6e 20 61 6e 20  *.** * If in an 
33150 65 72 72 6f 72 20 73 74 61 74 65 20 6f 74 68 65  error state othe
33160 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 46 55  r than SQLITE_FU
33170 4c 4c 2c 20 74 68 65 6e 20 74 61 73 6b 20 28 31  LL, then task (1
33180 29 20 69 73 20 0a 2a 2a 20 20 20 70 65 72 66 6f  ) is .**   perfo
33190 72 6d 65 64 2e 20 49 66 20 73 75 63 63 65 73 73  rmed. If success
331a0 66 75 6c 2c 20 74 61 73 6b 20 28 32 29 2e 20 52  ful, task (2). R
331b0 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65  egardless of the
331c0 20 6f 75 74 63 6f 6d 65 0a 2a 2a 20 20 20 6f 66   outcome.**   of
331d0 20 65 69 74 68 65 72 2c 20 74 68 65 20 65 72 72   either, the err
331e0 6f 72 20 73 74 61 74 65 20 65 72 72 6f 72 20 63  or state error c
331f0 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
33200 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 0a 2a 2a  to the caller.**
33210 20 20 20 28 69 2e 65 2e 20 65 69 74 68 65 72 20     (i.e. either 
33220 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72 20  SQLITE_IOERR or 
33230 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 29 2e  SQLITE_CORRUPT).
33240 0a 2a 2a 0a 2a 2a 20 2a 20 49 66 20 74 68 65 20  .**.** * If the 
33250 70 61 67 65 72 20 69 73 20 69 6e 20 50 41 47 45  pager is in PAGE
33260 52 5f 52 45 53 45 52 56 45 44 20 73 74 61 74 65  R_RESERVED state
33270 2c 20 74 68 65 6e 20 61 74 74 65 6d 70 74 20 28  , then attempt (
33280 31 29 2e 20 57 68 65 74 68 65 72 0a 2a 2a 20 20  1). Whether.**  
33290 20 6f 72 20 6e 6f 74 20 28 31 29 20 69 73 20 73   or not (1) is s
332a0 75 63 63 65 73 73 66 75 6c 2c 20 61 6c 73 6f 20  uccessful, also 
332b0 61 74 74 65 6d 70 74 20 28 32 29 2e 20 49 66 20  attempt (2). If 
332c0 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75  successful, retu
332d0 72 6e 0a 2a 2a 20 20 20 53 51 4c 49 54 45 5f 4f  rn.**   SQLITE_O
332e0 4b 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 65 6e  K. Otherwise, en
332f0 74 65 72 20 74 68 65 20 65 72 72 6f 72 20 73 74  ter the error st
33300 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 74  ate and return t
33310 68 65 20 66 69 72 73 74 20 0a 2a 2a 20 20 20 65  he first .**   e
33320 72 72 6f 72 20 63 6f 64 65 20 65 6e 63 6f 75 6e  rror code encoun
33330 74 65 72 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 20 20  tered. .**.**   
33340 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
33350 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20  re is no chance 
33360 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73  that the databas
33370 65 20 77 61 73 20 77 72 69 74 74 65 6e 20 74 6f  e was written to
33380 2e 20 0a 2a 2a 20 20 20 53 6f 20 69 73 20 73 61  . .**   So is sa
33390 66 65 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74  fe to finalize t
333a0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
333b0 65 76 65 6e 20 69 66 20 74 68 65 20 70 6c 61 79  even if the play
333c0 62 61 63 6b 20 0a 2a 2a 20 20 20 28 6f 70 65 72  back .**   (oper
333d0 61 74 69 6f 6e 20 31 29 20 66 61 69 6c 65 64 2e  ation 1) failed.
333e0 20 48 6f 77 65 76 65 72 20 74 68 65 20 70 61 67   However the pag
333f0 65 72 20 6d 75 73 74 20 65 6e 74 65 72 20 74 68  er must enter th
33400 65 20 65 72 72 6f 72 20 73 74 61 74 65 0a 2a 2a  e error state.**
33410 20 20 20 61 73 20 74 68 65 20 63 6f 6e 74 65 6e     as the conten
33420 74 73 20 6f 66 20 74 68 65 20 69 6e 2d 6d 65 6d  ts of the in-mem
33430 6f 72 79 20 63 61 63 68 65 20 61 72 65 20 6e 6f  ory cache are no
33440 77 20 73 75 73 70 65 63 74 2e 0a 2a 2a 0a 2a 2a  w suspect..**.**
33450 20 2a 20 46 69 6e 61 6c 6c 79 2c 20 69 66 20 69   * Finally, if i
33460 6e 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  n PAGER_EXCLUSIV
33470 45 20 73 74 61 74 65 2c 20 74 68 65 6e 20 61 74  E state, then at
33480 74 65 6d 70 74 20 28 31 29 2e 20 4f 6e 6c 79 0a  tempt (1). Only.
33490 2a 2a 20 20 20 61 74 74 65 6d 70 74 20 28 32 29  **   attempt (2)
334a0 20 69 66 20 28 31 29 20 69 73 20 73 75 63 63 65   if (1) is succe
334b0 73 73 66 75 6c 2e 20 52 65 74 75 72 6e 20 53 51  ssful. Return SQ
334c0 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65  LITE_OK if succe
334d0 73 73 66 75 6c 2c 0a 2a 2a 20 20 20 6f 74 68 65  ssful,.**   othe
334e0 72 77 69 73 65 20 65 6e 74 65 72 20 74 68 65 20  rwise enter the 
334f0 65 72 72 6f 72 20 73 74 61 74 65 20 61 6e 64 20  error state and 
33500 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72  return the error
33510 20 63 6f 64 65 20 66 72 6f 6d 20 74 68 65 20 0a   code from the .
33520 2a 2a 20 20 20 66 61 69 6c 69 6e 67 20 6f 70 65  **   failing ope
33530 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  ration..**.**   
33540 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
33550 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6d   database file m
33560 61 79 20 68 61 76 65 20 62 65 65 6e 20 77 72 69  ay have been wri
33570 74 74 65 6e 20 74 6f 2e 20 53 6f 20 69 66 20 74  tten to. So if t
33580 68 65 0a 2a 2a 20 20 20 70 6c 61 79 62 61 63 6b  he.**   playback
33590 20 6f 70 65 72 61 74 69 6f 6e 20 64 69 64 20 6e   operation did n
335a0 6f 74 20 73 75 63 63 65 65 64 20 69 74 20 77 6f  ot succeed it wo
335b0 75 6c 64 20 6e 6f 74 20 62 65 20 73 61 66 65 20  uld not be safe 
335c0 74 6f 20 66 69 6e 61 6c 69 7a 65 0a 2a 2a 20 20  to finalize.**  
335d0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
335e0 65 2e 20 49 74 20 6e 65 65 64 73 20 74 6f 20 62  e. It needs to b
335f0 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69  e left in the fi
33600 6c 65 2d 73 79 73 74 65 6d 20 73 6f 20 74 68 61  le-system so tha
33610 74 0a 2a 2a 20 20 20 73 6f 6d 65 20 6f 74 68 65  t.**   some othe
33620 72 20 70 72 6f 63 65 73 73 20 63 61 6e 20 75 73  r process can us
33630 65 20 69 74 20 74 6f 20 72 65 73 74 6f 72 65 20  e it to restore 
33640 74 68 65 20 64 61 74 61 62 61 73 65 20 73 74 61  the database sta
33650 74 65 20 28 62 79 0a 2a 2a 20 20 20 68 6f 74 2d  te (by.**   hot-
33660 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
33670 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
33680 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 50  3PagerRollback(P
33690 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
336a0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
336b0 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
336c0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
336d0 63 6f 64 65 20 2a 2f 0a 20 20 50 41 47 45 52 54  code */.  PAGERT
336e0 52 41 43 45 28 28 22 52 4f 4c 4c 42 41 43 4b 20  RACE(("ROLLBACK 
336f0 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
33700 50 61 67 65 72 29 29 29 3b 0a 20 20 69 66 28 20  Pager)));.  if( 
33710 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
33720 65 72 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  er) ){.    int r
33730 63 32 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71  c2;..    rc = sq
33740 6c 69 74 65 33 50 61 67 65 72 53 61 76 65 70 6f  lite3PagerSavepo
33750 69 6e 74 28 70 50 61 67 65 72 2c 20 53 41 56 45  int(pPager, SAVE
33760 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20  POINT_ROLLBACK, 
33770 2d 31 29 3b 0a 20 20 20 20 72 63 32 20 3d 20 70  -1);.    rc2 = p
33780 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
33790 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 70 50 61  tion(pPager, pPa
337a0 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 3b  ger->setMaster);
337b0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
337c0 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 72 63  ITE_OK ) rc = rc
337d0 32 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  2;.    rc = page
337e0 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
337f0 72 63 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  rc);.  }else if(
33800 20 21 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69   !pPager->dbModi
33810 66 69 65 64 20 7c 7c 20 21 69 73 4f 70 65 6e 28  fied || !isOpen(
33820 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a  pPager->jfd) ){.
33830 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65      rc = pager_e
33840 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70  nd_transaction(p
33850 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73  Pager, pPager->s
33860 65 74 4d 61 73 74 65 72 29 3b 0a 20 20 7d 65 6c  etMaster);.  }el
33870 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  se if( pPager->e
33880 72 72 43 6f 64 65 20 26 26 20 70 50 61 67 65 72  rrCode && pPager
33890 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54  ->errCode!=SQLIT
338a0 45 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66  E_FULL ){.    if
338b0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
338c0 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45  =PAGER_EXCLUSIVE
338d0 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f   ){.      pager_
338e0 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c  playback(pPager,
338f0 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72   0);.    }.    r
33900 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43  c = pPager->errC
33910 6f 64 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ode;.  }else{.  
33920 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
33930 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52  ate==PAGER_RESER
33940 56 45 44 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  VED ){.      int
33950 20 72 63 32 3b 0a 20 20 20 20 20 20 72 63 20 3d   rc2;.      rc =
33960 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
33970 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20  pPager, 0);.    
33980 20 20 72 63 32 20 3d 20 70 61 67 65 72 5f 65 6e    rc2 = pager_en
33990 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  d_transaction(pP
339a0 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 65  ager, pPager->se
339b0 74 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  tMaster);.      
339c0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
339d0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
339e0 3d 20 72 63 32 3b 0a 20 20 20 20 20 20 7d 0a 20  = rc2;.      }. 
339f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
33a00 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
33a10 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b 0a  ack(pPager, 0);.
33a20 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21      }..    if( !
33a30 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 70  MEMDB ){.      p
33a40 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c  Pager->dbSizeVal
33a50 69 64 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20  id = 0;.    }.. 
33a60 20 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f     /* If an erro
33a70 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  r occurs during 
33a80 61 20 52 4f 4c 4c 42 41 43 4b 2c 20 77 65 20 63  a ROLLBACK, we c
33a90 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 74 72 75  an no longer tru
33aa0 73 74 20 74 68 65 20 70 61 67 65 72 0a 20 20 20  st the pager.   
33ab0 20 2a 2a 20 63 61 63 68 65 2e 20 53 6f 20 63 61   ** cache. So ca
33ac0 6c 6c 20 70 61 67 65 72 5f 65 72 72 6f 72 28 29  ll pager_error()
33ad0 20 6f 6e 20 74 68 65 20 77 61 79 20 6f 75 74 20   on the way out 
33ae0 74 6f 20 6d 61 6b 65 20 61 6e 79 20 65 72 72 6f  to make any erro
33af0 72 20 0a 20 20 20 20 2a 2a 20 70 65 72 73 69 73  r .    ** persis
33b00 74 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tent..    */.   
33b10 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72 6f   rc = pager_erro
33b20 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20  r(pPager, rc);. 
33b30 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
33b40 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
33b50 54 52 55 45 20 69 66 20 74 68 65 20 64 61 74 61  TRUE if the data
33b60 62 61 73 65 20 66 69 6c 65 20 69 73 20 6f 70 65  base file is ope
33b70 6e 65 64 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20  ned read-only.  
33b80 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20  Return FALSE.** 
33b90 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
33ba0 69 73 20 28 69 6e 20 74 68 65 6f 72 79 29 20 77  is (in theory) w
33bb0 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a 75 38 20 73  ritable..*/.u8 s
33bc0 71 6c 69 74 65 33 50 61 67 65 72 49 73 72 65 61  qlite3PagerIsrea
33bd0 64 6f 6e 6c 79 28 50 61 67 65 72 20 2a 70 50 61  donly(Pager *pPa
33be0 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
33bf0 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b  Pager->readOnly;
33c00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
33c10 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
33c20 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
33c30 20 70 61 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73   pager..*/.int s
33c40 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f  qlite3PagerRefco
33c50 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  unt(Pager *pPage
33c60 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  r){.  return sql
33c70 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75  ite3PcacheRefCou
33c80 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
33c90 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  he);.}../*.** Re
33ca0 74 75 72 6e 20 74 68 65 20 61 70 70 72 6f 78 69  turn the approxi
33cb0 6d 61 74 65 20 6e 75 6d 62 65 72 20 6f 66 20 62  mate number of b
33cc0 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 63  ytes of memory c
33cd0 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 75 73 65 64  urrently.** used
33ce0 20 62 79 20 74 68 65 20 70 61 67 65 72 20 61 6e   by the pager an
33cf0 64 20 69 74 73 20 61 73 73 6f 63 69 61 74 65 64  d its associated
33d00 20 63 61 63 68 65 2e 0a 2a 2f 0a 69 6e 74 20 73   cache..*/.int s
33d10 71 6c 69 74 65 33 50 61 67 65 72 4d 65 6d 55 73  qlite3PagerMemUs
33d20 65 64 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ed(Pager *pPager
33d30 29 7b 0a 20 20 69 6e 74 20 70 65 72 50 61 67 65  ){.  int perPage
33d40 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70  Size = pPager->p
33d50 61 67 65 53 69 7a 65 20 2b 20 70 50 61 67 65 72  ageSize + pPager
33d60 2d 3e 6e 45 78 74 72 61 20 2b 20 73 69 7a 65 6f  ->nExtra + sizeo
33d70 66 28 50 67 48 64 72 29 0a 20 20 20 20 20 20 20  f(PgHdr).       
33d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20                + 
33da0 35 2a 73 69 7a 65 6f 66 28 76 6f 69 64 2a 29 3b  5*sizeof(void*);
33db0 0a 20 20 72 65 74 75 72 6e 20 70 65 72 50 61 67  .  return perPag
33dc0 65 53 69 7a 65 2a 73 71 6c 69 74 65 33 50 63 61  eSize*sqlite3Pca
33dd0 63 68 65 50 61 67 65 63 6f 75 6e 74 28 70 50 61  chePagecount(pPa
33de0 67 65 72 2d 3e 70 50 43 61 63 68 65 29 0a 20 20  ger->pPCache).  
33df0 20 20 20 20 20 20 20 20 20 2b 20 73 71 6c 69 74           + sqlit
33e00 65 33 4d 61 6c 6c 6f 63 53 69 7a 65 28 70 50 61  e3MallocSize(pPa
33e10 67 65 72 29 0a 20 20 20 20 20 20 20 20 20 20 20  ger).           
33e20 2b 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  + pPager->pageSi
33e30 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ze;.}../*.** Ret
33e40 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
33e50 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  f references to 
33e60 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70 61  the specified pa
33e70 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ge..*/.int sqlit
33e80 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
33e90 75 6e 74 28 44 62 50 61 67 65 20 2a 70 50 61 67  unt(DbPage *pPag
33ea0 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  e){.  return sql
33eb0 69 74 65 33 50 63 61 63 68 65 50 61 67 65 52 65  ite3PcachePageRe
33ec0 66 63 6f 75 6e 74 28 70 50 61 67 65 29 3b 0a 7d  fcount(pPage);.}
33ed0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
33ee0 54 45 53 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  TEST./*.** This 
33ef0 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
33f00 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20  for testing and 
33f10 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a  analysis only..*
33f20 2f 0a 69 6e 74 20 2a 73 71 6c 69 74 65 33 50 61  /.int *sqlite3Pa
33f30 67 65 72 53 74 61 74 73 28 50 61 67 65 72 20 2a  gerStats(Pager *
33f40 70 50 61 67 65 72 29 7b 0a 20 20 73 74 61 74 69  pPager){.  stati
33f50 63 20 69 6e 74 20 61 5b 31 31 5d 3b 0a 20 20 61  c int a[11];.  a
33f60 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 50 63 61  [0] = sqlite3Pca
33f70 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
33f80 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20  er->pPCache);.  
33f90 61 5b 31 5d 20 3d 20 73 71 6c 69 74 65 33 50 63  a[1] = sqlite3Pc
33fa0 61 63 68 65 50 61 67 65 63 6f 75 6e 74 28 70 50  achePagecount(pP
33fb0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
33fc0 20 20 61 5b 32 5d 20 3d 20 73 71 6c 69 74 65 33    a[2] = sqlite3
33fd0 50 63 61 63 68 65 47 65 74 43 61 63 68 65 73 69  PcacheGetCachesi
33fe0 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ze(pPager->pPCac
33ff0 68 65 29 3b 0a 20 20 61 5b 33 5d 20 3d 20 70 50  he);.  a[3] = pP
34000 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69  ager->dbSizeVali
34010 64 20 3f 20 28 69 6e 74 29 20 70 50 61 67 65 72  d ? (int) pPager
34020 2d 3e 64 62 53 69 7a 65 20 3a 20 2d 31 3b 0a 20  ->dbSize : -1;. 
34030 20 61 5b 34 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[4] = pPager->
34040 73 74 61 74 65 3b 0a 20 20 61 5b 35 5d 20 3d 20  state;.  a[5] = 
34050 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
34060 0a 20 20 61 5b 36 5d 20 3d 20 70 50 61 67 65 72  .  a[6] = pPager
34070 2d 3e 6e 48 69 74 3b 0a 20 20 61 5b 37 5d 20 3d  ->nHit;.  a[7] =
34080 20 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 3b 0a   pPager->nMiss;.
34090 20 20 61 5b 38 5d 20 3d 20 30 3b 20 20 2f 2a 20    a[8] = 0;  /* 
340a0 55 73 65 64 20 74 6f 20 62 65 20 70 50 61 67 65  Used to be pPage
340b0 72 2d 3e 6e 4f 76 66 6c 20 2a 2f 0a 20 20 61 5b  r->nOvfl */.  a[
340c0 39 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65  9] = pPager->nRe
340d0 61 64 3b 0a 20 20 61 5b 31 30 5d 20 3d 20 70 50  ad;.  a[10] = pP
340e0 61 67 65 72 2d 3e 6e 57 72 69 74 65 3b 0a 20 20  ager->nWrite;.  
340f0 72 65 74 75 72 6e 20 61 3b 0a 7d 0a 23 65 6e 64  return a;.}.#end
34100 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  if../*.** Return
34110 20 74 72 75 65 20 69 66 20 74 68 69 73 20 69 73   true if this is
34120 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61   an in-memory pa
34130 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ger..*/.int sqli
34140 74 65 33 50 61 67 65 72 49 73 4d 65 6d 64 62 28  te3PagerIsMemdb(
34150 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
34160 20 20 72 65 74 75 72 6e 20 4d 45 4d 44 42 3b 0a    return MEMDB;.
34170 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  }../*.** Check t
34180 68 61 74 20 74 68 65 72 65 20 61 72 65 20 61 74  hat there are at
34190 20 6c 65 61 73 74 20 6e 53 61 76 65 70 6f 69 6e   least nSavepoin
341a0 74 20 73 61 76 65 70 6f 69 6e 74 73 20 6f 70 65  t savepoints ope
341b0 6e 2e 20 49 66 20 74 68 65 72 65 20 61 72 65 0a  n. If there are.
341c0 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 6c 65 73  ** currently les
341d0 73 20 74 68 61 6e 20 6e 53 61 76 65 70 6f 69 6e  s than nSavepoin
341e0 74 73 20 6f 70 65 6e 2c 20 74 68 65 6e 20 6f 70  ts open, then op
341f0 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73  en one or more s
34200 61 76 65 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20  avepoints.** to 
34210 6d 61 6b 65 20 75 70 20 74 68 65 20 64 69 66 66  make up the diff
34220 65 72 65 6e 63 65 2e 20 49 66 20 74 68 65 20 6e  erence. If the n
34230 75 6d 62 65 72 20 6f 66 20 73 61 76 65 70 6f 69  umber of savepoi
34240 6e 74 73 20 69 73 20 61 6c 72 65 61 64 79 0a 2a  nts is already.*
34250 2a 20 65 71 75 61 6c 20 74 6f 20 6e 53 61 76 65  * equal to nSave
34260 70 6f 69 6e 74 2c 20 74 68 65 6e 20 74 68 69 73  point, then this
34270 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
34280 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  o-op..**.** If a
34290 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
342a0 6f 6e 20 66 61 69 6c 73 2c 20 53 51 4c 49 54 45  on fails, SQLITE
342b0 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e  _NOMEM is return
342c0 65 64 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  ed. If an error 
342d0 0a 2a 2a 20 6f 63 63 75 72 73 20 77 68 69 6c 65  .** occurs while
342e0 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 73 75 62   opening the sub
342f0 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74  -journal file, t
34300 68 65 6e 20 61 6e 20 49 4f 20 65 72 72 6f 72 20  hen an IO error 
34310 63 6f 64 65 20 69 73 0a 2a 2a 20 72 65 74 75 72  code is.** retur
34320 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
34330 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e  SQLITE_OK..*/.in
34340 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  t sqlite3PagerOp
34350 65 6e 53 61 76 65 70 6f 69 6e 74 28 50 61 67 65  enSavepoint(Page
34360 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6e  r *pPager, int n
34370 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e  Savepoint){.  in
34380 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
34390 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
343a0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
343b0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
343c0 6e 43 75 72 72 65 6e 74 20 3d 20 70 50 61 67 65  nCurrent = pPage
343d0 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20  r->nSavepoint;  
343e0 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
343f0 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 76 65 70   number of savep
34400 6f 69 6e 74 73 20 2a 2f 0a 0a 20 20 69 66 28 20  oints */..  if( 
34410 6e 53 61 76 65 70 6f 69 6e 74 3e 6e 43 75 72 72  nSavepoint>nCurr
34420 65 6e 74 20 26 26 20 70 50 61 67 65 72 2d 3e 75  ent && pPager->u
34430 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  seJournal ){.   
34440 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20   int ii;        
34450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34460 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
34470 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f  ator variable */
34480 0a 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f  .    PagerSavepo
34490 69 6e 74 20 2a 61 4e 65 77 3b 20 20 20 20 20 20  int *aNew;      
344a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
344b0 4e 65 77 20 50 61 67 65 72 2e 61 53 61 76 65 70  New Pager.aSavep
344c0 6f 69 6e 74 20 61 72 72 61 79 20 2a 2f 0a 20 20  oint array */.  
344d0 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20    int nPage;    
344e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
344f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
34500 65 20 6f 66 20 64 61 74 61 62 61 73 65 20 66 69  e of database fi
34510 6c 65 20 2a 2f 0a 0a 20 20 20 20 72 63 20 3d 20  le */..    rc = 
34520 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
34530 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e  count(pPager, &n
34540 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
34550 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  c ) return rc;..
34560 20 20 20 20 2f 2a 20 47 72 6f 77 20 74 68 65 20      /* Grow the 
34570 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74  Pager.aSavepoint
34580 20 61 72 72 61 79 20 75 73 69 6e 67 20 72 65 61   array using rea
34590 6c 6c 6f 63 28 29 2e 20 52 65 74 75 72 6e 20 53  lloc(). Return S
345a0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20 20 20 20  QLITE_NOMEM.    
345b0 2a 2a 20 69 66 20 74 68 65 20 61 6c 6c 6f 63 61  ** if the alloca
345c0 74 69 6f 6e 20 66 61 69 6c 73 2e 20 4f 74 68 65  tion fails. Othe
345d0 72 77 69 73 65 2c 20 7a 65 72 6f 20 74 68 65 20  rwise, zero the 
345e0 6e 65 77 20 70 6f 72 74 69 6f 6e 20 69 6e 20 63  new portion in c
345f0 61 73 65 20 61 20 0a 20 20 20 20 2a 2a 20 6d 61  ase a .    ** ma
34600 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f 63 63  lloc failure occ
34610 75 72 73 20 77 68 69 6c 65 20 70 6f 70 75 6c 61  urs while popula
34620 74 69 6e 67 20 69 74 20 69 6e 20 74 68 65 20 66  ting it in the f
34630 6f 72 28 2e 2e 2e 29 20 6c 6f 6f 70 20 62 65 6c  or(...) loop bel
34640 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  ow..    */.    a
34650 4e 65 77 20 3d 20 28 50 61 67 65 72 53 61 76 65  New = (PagerSave
34660 70 6f 69 6e 74 20 2a 29 73 71 6c 69 74 65 33 52  point *)sqlite3R
34670 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20  ealloc(.        
34680 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
34690 6e 74 2c 20 73 69 7a 65 6f 66 28 50 61 67 65 72  nt, sizeof(Pager
346a0 53 61 76 65 70 6f 69 6e 74 29 2a 6e 53 61 76 65  Savepoint)*nSave
346b0 70 6f 69 6e 74 0a 20 20 20 20 29 3b 0a 20 20 20  point.    );.   
346c0 20 69 66 28 20 21 61 4e 65 77 20 29 7b 0a 20 20   if( !aNew ){.  
346d0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
346e0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
346f0 20 20 20 6d 65 6d 73 65 74 28 26 61 4e 65 77 5b     memset(&aNew[
34700 6e 43 75 72 72 65 6e 74 5d 2c 20 30 2c 20 28 6e  nCurrent], 0, (n
34710 53 61 76 65 70 6f 69 6e 74 2d 6e 43 75 72 72 65  Savepoint-nCurre
34720 6e 74 29 20 2a 20 73 69 7a 65 6f 66 28 50 61 67  nt) * sizeof(Pag
34730 65 72 53 61 76 65 70 6f 69 6e 74 29 29 3b 0a 20  erSavepoint));. 
34740 20 20 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65     pPager->aSave
34750 70 6f 69 6e 74 20 3d 20 61 4e 65 77 3b 0a 0a 20  point = aNew;.. 
34760 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74     /* Populate t
34770 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  he PagerSavepoin
34780 74 20 73 74 72 75 63 74 75 72 65 73 20 6a 75 73  t structures jus
34790 74 20 61 6c 6c 6f 63 61 74 65 64 2e 20 2a 2f 0a  t allocated. */.
347a0 20 20 20 20 66 6f 72 28 69 69 3d 6e 43 75 72 72      for(ii=nCurr
347b0 65 6e 74 3b 20 69 69 3c 6e 53 61 76 65 70 6f 69  ent; ii<nSavepoi
347c0 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  nt; ii++){.     
347d0 20 61 4e 65 77 5b 69 69 5d 2e 6e 4f 72 69 67 20   aNew[ii].nOrig 
347e0 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 69  = nPage;.      i
347f0 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
34800 2d 3e 6a 66 64 29 20 26 26 20 70 50 61 67 65 72  ->jfd) && pPager
34810 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 20 29  ->journalOff>0 )
34820 7b 0a 20 20 20 20 20 20 20 20 61 4e 65 77 5b 69  {.        aNew[i
34830 69 5d 2e 69 4f 66 66 73 65 74 20 3d 20 70 50 61  i].iOffset = pPa
34840 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
34850 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
34860 20 20 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e 69        aNew[ii].i
34870 4f 66 66 73 65 74 20 3d 20 4a 4f 55 52 4e 41 4c  Offset = JOURNAL
34880 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b  _HDR_SZ(pPager);
34890 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
348a0 4e 65 77 5b 69 69 5d 2e 69 53 75 62 52 65 63 20  New[ii].iSubRec 
348b0 3d 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65  = pPager->nSubRe
348c0 63 3b 0a 20 20 20 20 20 20 61 4e 65 77 5b 69 69  c;.      aNew[ii
348d0 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 3d  ].pInSavepoint =
348e0 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72   sqlite3BitvecCr
348f0 65 61 74 65 28 6e 50 61 67 65 29 3b 0a 20 20 20  eate(nPage);.   
34900 20 20 20 69 66 28 20 21 61 4e 65 77 5b 69 69 5d     if( !aNew[ii]
34910 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 29 7b  .pInSavepoint ){
34920 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
34930 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
34940 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
34950 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
34960 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  er) ){.        s
34970 71 6c 69 74 65 33 57 61 6c 53 61 76 65 70 6f 69  qlite3WalSavepoi
34980 6e 74 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  nt(pPager->pWal,
34990 20 61 4e 65 77 5b 69 69 5d 2e 61 57 61 6c 44 61   aNew[ii].aWalDa
349a0 74 61 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ta);.      }.   
349b0 20 20 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65     pPager->nSave
349c0 70 6f 69 6e 74 20 3d 20 69 69 2b 31 3b 0a 20 20  point = ii+1;.  
349d0 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
349e0 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
349f0 6e 74 3d 3d 6e 53 61 76 65 70 6f 69 6e 74 20 29  nt==nSavepoint )
34a00 3b 0a 20 20 20 20 61 73 73 65 72 74 54 72 75 6e  ;.    assertTrun
34a10 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 70  cateConstraint(p
34a20 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 72  Pager);.  }..  r
34a30 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
34a40 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
34a50 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 6f   is called to ro
34a60 6c 6c 62 61 63 6b 20 6f 72 20 72 65 6c 65 61 73  llback or releas
34a70 65 20 28 63 6f 6d 6d 69 74 29 20 61 20 73 61 76  e (commit) a sav
34a80 65 70 6f 69 6e 74 2e 0a 2a 2a 20 54 68 65 20 73  epoint..** The s
34a90 61 76 65 70 6f 69 6e 74 20 74 6f 20 72 65 6c 65  avepoint to rele
34aa0 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20  ase or rollback 
34ab0 6e 65 65 64 20 6e 6f 74 20 62 65 20 74 68 65 20  need not be the 
34ac0 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 0a 2a  most recently .*
34ad0 2a 20 63 72 65 61 74 65 64 20 73 61 76 65 70 6f  * created savepo
34ae0 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d  int..**.** Param
34af0 65 74 65 72 20 6f 70 20 69 73 20 61 6c 77 61 79  eter op is alway
34b00 73 20 65 69 74 68 65 72 20 53 41 56 45 50 4f 49  s either SAVEPOI
34b10 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 6f 72 20 53  NT_ROLLBACK or S
34b20 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
34b30 2e 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 53 41  ..** If it is SA
34b40 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c  VEPOINT_RELEASE,
34b50 20 74 68 65 6e 20 72 65 6c 65 61 73 65 20 61 6e   then release an
34b60 64 20 64 65 73 74 72 6f 79 20 74 68 65 20 73 61  d destroy the sa
34b70 76 65 70 6f 69 6e 74 20 77 69 74 68 0a 2a 2a 20  vepoint with.** 
34b80 69 6e 64 65 78 20 69 53 61 76 65 70 6f 69 6e 74  index iSavepoint
34b90 2e 20 49 66 20 69 74 20 69 73 20 53 41 56 45 50  . If it is SAVEP
34ba0 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74  OINT_ROLLBACK, t
34bb0 68 65 6e 20 72 6f 6c 6c 62 61 63 6b 20 61 6c 6c  hen rollback all
34bc0 20 63 68 61 6e 67 65 73 0a 2a 2a 20 74 68 61 74   changes.** that
34bd0 20 68 61 76 65 20 6f 63 63 75 72 72 65 64 20 73   have occurred s
34be0 69 6e 63 65 20 74 68 65 20 73 70 65 63 69 66 69  ince the specifi
34bf0 65 64 20 73 61 76 65 70 6f 69 6e 74 20 77 61 73  ed savepoint was
34c00 20 63 72 65 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   created..**.** 
34c10 54 68 65 20 73 61 76 65 70 6f 69 6e 74 20 74 6f  The savepoint to
34c20 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 72 65 6c   rollback or rel
34c30 65 61 73 65 20 69 73 20 69 64 65 6e 74 69 66 69  ease is identifi
34c40 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20  ed by parameter 
34c50 0a 2a 2a 20 69 53 61 76 65 70 6f 69 6e 74 2e 20  .** iSavepoint. 
34c60 41 20 76 61 6c 75 65 20 6f 66 20 30 20 6d 65 61  A value of 0 mea
34c70 6e 73 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e  ns to operate on
34c80 20 74 68 65 20 6f 75 74 65 72 6d 6f 73 74 20 73   the outermost s
34c90 61 76 65 70 6f 69 6e 74 0a 2a 2a 20 28 74 68 65  avepoint.** (the
34ca0 20 66 69 72 73 74 20 63 72 65 61 74 65 64 29 2e   first created).
34cb0 20 41 20 76 61 6c 75 65 20 6f 66 20 28 50 61 67   A value of (Pag
34cc0 65 72 2e 6e 53 61 76 65 70 6f 69 6e 74 2d 31 29  er.nSavepoint-1)
34cd0 20 6d 65 61 6e 73 20 6f 70 65 72 61 74 65 0a 2a   means operate.*
34ce0 2a 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65  * on the most re
34cf0 63 65 6e 74 6c 79 20 63 72 65 61 74 65 64 20 73  cently created s
34d00 61 76 65 70 6f 69 6e 74 2e 20 49 66 20 69 53 61  avepoint. If iSa
34d10 76 65 70 6f 69 6e 74 20 69 73 20 67 72 65 61 74  vepoint is great
34d20 65 72 20 74 68 61 6e 0a 2a 2a 20 28 50 61 67 65  er than.** (Page
34d30 72 2e 6e 53 61 76 65 70 6f 69 6e 74 2d 31 29 2c  r.nSavepoint-1),
34d40 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   then this funct
34d50 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
34d60 2a 2a 0a 2a 2a 20 49 66 20 61 20 6e 65 67 61 74  **.** If a negat
34d70 69 76 65 20 76 61 6c 75 65 20 69 73 20 70 61 73  ive value is pas
34d80 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63  sed to this func
34d90 74 69 6f 6e 2c 20 74 68 65 6e 20 74 68 65 20 63  tion, then the c
34da0 75 72 72 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61  urrent.** transa
34db0 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20  ction is rolled 
34dc0 62 61 63 6b 2e 20 54 68 69 73 20 69 73 20 64 69  back. This is di
34dd0 66 66 65 72 65 6e 74 20 74 6f 20 63 61 6c 6c 69  fferent to calli
34de0 6e 67 20 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61  ng .** sqlite3Pa
34df0 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 20 62 65  gerRollback() be
34e00 63 61 75 73 65 20 74 68 69 73 20 66 75 6e 63 74  cause this funct
34e10 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 74 65 72  ion does not ter
34e20 6d 69 6e 61 74 65 0a 2a 2a 20 74 68 65 20 74 72  minate.** the tr
34e30 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20 75 6e 6c  ansaction or unl
34e40 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65  ock the database
34e50 2c 20 69 74 20 6a 75 73 74 20 72 65 73 74 6f 72  , it just restor
34e60 65 73 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65  es the .** conte
34e70 6e 74 73 20 6f 66 20 74 68 65 20 64 61 74 61 62  nts of the datab
34e80 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69  ase to its origi
34e90 6e 61 6c 20 73 74 61 74 65 2e 20 0a 2a 2a 0a 2a  nal state. .**.*
34ea0 2a 20 49 6e 20 61 6e 79 20 63 61 73 65 2c 20 61  * In any case, a
34eb0 6c 6c 20 73 61 76 65 70 6f 69 6e 74 73 20 77 69  ll savepoints wi
34ec0 74 68 20 61 6e 20 69 6e 64 65 78 20 67 72 65 61  th an index grea
34ed0 74 65 72 20 74 68 61 6e 20 69 53 61 76 65 70 6f  ter than iSavepo
34ee0 69 6e 74 20 0a 2a 2a 20 61 72 65 20 64 65 73 74  int .** are dest
34ef0 72 6f 79 65 64 2e 20 49 66 20 74 68 69 73 20 69  royed. If this i
34f00 73 20 61 20 72 65 6c 65 61 73 65 20 6f 70 65 72  s a release oper
34f10 61 74 69 6f 6e 20 28 6f 70 3d 3d 53 41 56 45 50  ation (op==SAVEP
34f20 4f 49 4e 54 5f 52 45 4c 45 41 53 45 29 2c 0a 2a  OINT_RELEASE),.*
34f30 2a 20 74 68 65 6e 20 73 61 76 65 70 6f 69 6e 74  * then savepoint
34f40 20 69 53 61 76 65 70 6f 69 6e 74 20 69 73 20 61   iSavepoint is a
34f50 6c 73 6f 20 64 65 73 74 72 6f 79 65 64 2e 0a 2a  lso destroyed..*
34f60 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
34f70 6f 6e 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51  on may return SQ
34f80 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20  LITE_NOMEM if a 
34f90 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
34fa0 6e 20 66 61 69 6c 73 2c 0a 2a 2a 20 6f 72 20 61  n fails,.** or a
34fb0 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  n IO error code 
34fc0 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  if an IO error o
34fd0 63 63 75 72 73 20 77 68 69 6c 65 20 72 6f 6c 6c  ccurs while roll
34fe0 69 6e 67 20 62 61 63 6b 20 61 20 0a 2a 2a 20 73  ing back a .** s
34ff0 61 76 65 70 6f 69 6e 74 2e 20 49 66 20 6e 6f 20  avepoint. If no 
35000 65 72 72 6f 72 73 20 6f 63 63 75 72 2c 20 53 51  errors occur, SQ
35010 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
35020 6e 65 64 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71 6c  ned..*/ .int sql
35030 69 74 65 33 50 61 67 65 72 53 61 76 65 70 6f 69  ite3PagerSavepoi
35040 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nt(Pager *pPager
35050 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 69 53  , int op, int iS
35060 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74  avepoint){.  int
35070 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
35080 0a 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d  ..  assert( op==
35090 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
350a0 45 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49  E || op==SAVEPOI
350b0 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20  NT_ROLLBACK );. 
350c0 20 61 73 73 65 72 74 28 20 69 53 61 76 65 70 6f   assert( iSavepo
350d0 69 6e 74 3e 3d 30 20 7c 7c 20 6f 70 3d 3d 53 41  int>=0 || op==SA
350e0 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
350f0 20 29 3b 0a 0a 20 20 69 66 28 20 69 53 61 76 65   );..  if( iSave
35100 70 6f 69 6e 74 3c 70 50 61 67 65 72 2d 3e 6e 53  point<pPager->nS
35110 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20  avepoint ){.    
35120 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20  int ii;         
35130 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76     /* Iterator v
35140 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69  ariable */.    i
35150 6e 74 20 6e 4e 65 77 3b 20 20 20 20 20 20 20 20  nt nNew;        
35160 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
35170 65 6d 61 69 6e 69 6e 67 20 73 61 76 65 70 6f 69  emaining savepoi
35180 6e 74 73 20 61 66 74 65 72 20 74 68 69 73 20 6f  nts after this o
35190 70 2e 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46 69  p. */..    /* Fi
351a0 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e  gure out how man
351b0 79 20 73 61 76 65 70 6f 69 6e 74 73 20 77 69 6c  y savepoints wil
351c0 6c 20 73 74 69 6c 6c 20 62 65 20 61 63 74 69 76  l still be activ
351d0 65 20 61 66 74 65 72 20 74 68 69 73 0a 20 20 20  e after this.   
351e0 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2e 20 53   ** operation. S
351f0 74 6f 72 65 20 74 68 69 73 20 76 61 6c 75 65 20  tore this value 
35200 69 6e 20 6e 4e 65 77 2e 20 54 68 65 6e 20 66 72  in nNew. Then fr
35210 65 65 20 72 65 73 6f 75 72 63 65 73 20 61 73 73  ee resources ass
35220 6f 63 69 61 74 65 64 20 0a 20 20 20 20 2a 2a 20  ociated .    ** 
35230 77 69 74 68 20 61 6e 79 20 73 61 76 65 70 6f 69  with any savepoi
35240 6e 74 73 20 74 68 61 74 20 61 72 65 20 64 65 73  nts that are des
35250 74 72 6f 79 65 64 20 62 79 20 74 68 69 73 20 6f  troyed by this o
35260 70 65 72 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  peration..    */
35270 0a 20 20 20 20 6e 4e 65 77 20 3d 20 69 53 61 76  .    nNew = iSav
35280 65 70 6f 69 6e 74 20 2b 20 28 28 20 6f 70 3d 3d  epoint + (( op==
35290 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
352a0 45 20 29 20 3f 20 30 20 3a 20 31 29 3b 0a 20 20  E ) ? 0 : 1);.  
352b0 20 20 66 6f 72 28 69 69 3d 6e 4e 65 77 3b 20 69    for(ii=nNew; i
352c0 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70  i<pPager->nSavep
352d0 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  oint; ii++){.   
352e0 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63     sqlite3Bitvec
352f0 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e  Destroy(pPager->
35300 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 70  aSavepoint[ii].p
35310 49 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20  InSavepoint);.  
35320 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e    }.    pPager->
35330 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 6e 4e 65  nSavepoint = nNe
35340 77 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  w;..    /* If th
35350 69 73 20 69 73 20 61 20 72 65 6c 65 61 73 65 20  is is a release 
35360 6f 66 20 74 68 65 20 6f 75 74 65 72 6d 6f 73 74  of the outermost
35370 20 73 61 76 65 70 6f 69 6e 74 2c 20 74 72 75 6e   savepoint, trun
35380 63 61 74 65 20 0a 20 20 20 20 2a 2a 20 74 68 65  cate .    ** the
35390 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 74 6f 20   sub-journal to 
353a0 7a 65 72 6f 20 62 79 74 65 73 20 69 6e 20 73 69  zero bytes in si
353b0 7a 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f  ze. */.    if( o
353c0 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  p==SAVEPOINT_REL
353d0 45 41 53 45 20 29 7b 0a 20 20 20 20 20 20 69 66  EASE ){.      if
353e0 28 20 6e 4e 65 77 3d 3d 30 20 26 26 20 69 73 4f  ( nNew==0 && isO
353f0 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  pen(pPager->sjfd
35400 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
35410 4f 6e 6c 79 20 74 72 75 6e 63 61 74 65 20 69 66  Only truncate if
35420 20 69 74 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d   it is an in-mem
35430 6f 72 79 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e  ory sub-journal.
35440 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
35450 73 71 6c 69 74 65 33 49 73 4d 65 6d 4a 6f 75 72  sqlite3IsMemJour
35460 6e 61 6c 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  nal(pPager->sjfd
35470 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  ) ){.          r
35480 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75  c = sqlite3OsTru
35490 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 73 6a  ncate(pPager->sj
354a0 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  fd, 0);.        
354b0 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
354c0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
354d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61     }.        pPa
354e0 67 65 72 2d 3e 6e 53 75 62 52 65 63 20 3d 20 30  ger->nSubRec = 0
354f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
35500 20 20 20 20 2f 2a 20 45 6c 73 65 20 74 68 69 73      /* Else this
35510 20 69 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f   is a rollback o
35520 70 65 72 61 74 69 6f 6e 2c 20 70 6c 61 79 62 61  peration, playba
35530 63 6b 20 74 68 65 20 73 70 65 63 69 66 69 65 64  ck the specified
35540 20 73 61 76 65 70 6f 69 6e 74 2e 0a 20 20 20 20   savepoint..    
35550 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  ** If this is a 
35560 74 65 6d 70 2d 66 69 6c 65 2c 20 69 74 20 69 73  temp-file, it is
35570 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74 20 74   possible that t
35580 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
35590 68 61 73 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 79  has.    ** not y
355a0 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e 20  et been opened. 
355b0 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
355c0 72 65 20 68 61 76 65 20 62 65 65 6e 20 6e 6f 20  re have been no 
355d0 63 68 61 6e 67 65 73 20 74 6f 0a 20 20 20 20 2a  changes to.    *
355e0 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
355f0 69 6c 65 2c 20 73 6f 20 74 68 65 20 70 6c 61 79  ile, so the play
35600 62 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20 63  back operation c
35610 61 6e 20 62 65 20 73 6b 69 70 70 65 64 2e 0a 20  an be skipped.. 
35620 20 20 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69     */.    else i
35630 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  f( pagerUseWal(p
35640 50 61 67 65 72 29 20 7c 7c 20 69 73 4f 70 65 6e  Pager) || isOpen
35650 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b  (pPager->jfd) ){
35660 0a 20 20 20 20 20 20 50 61 67 65 72 53 61 76 65  .      PagerSave
35670 70 6f 69 6e 74 20 2a 70 53 61 76 65 70 6f 69 6e  point *pSavepoin
35680 74 20 3d 20 28 6e 4e 65 77 3d 3d 30 29 3f 30 3a  t = (nNew==0)?0:
35690 26 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f  &pPager->aSavepo
356a0 69 6e 74 5b 6e 4e 65 77 2d 31 5d 3b 0a 20 20 20  int[nNew-1];.   
356b0 20 20 20 72 63 20 3d 20 70 61 67 65 72 50 6c 61     rc = pagerPla
356c0 79 62 61 63 6b 53 61 76 65 70 6f 69 6e 74 28 70  ybackSavepoint(p
356d0 50 61 67 65 72 2c 20 70 53 61 76 65 70 6f 69 6e  Pager, pSavepoin
356e0 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t);.      assert
356f0 28 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45  (rc!=SQLITE_DONE
35700 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 7d 0a  );.    }.  .  }.
35710 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
35720 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
35730 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f   full pathname o
35740 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
35750 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ile..*/.const ch
35760 61 72 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  ar *sqlite3Pager
35770 46 69 6c 65 6e 61 6d 65 28 50 61 67 65 72 20 2a  Filename(Pager *
35780 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
35790 6e 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  n pPager->zFilen
357a0 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ame;.}../*.** Re
357b0 74 75 72 6e 20 74 68 65 20 56 46 53 20 73 74 72  turn the VFS str
357c0 75 63 74 75 72 65 20 66 6f 72 20 74 68 65 20 70  ucture for the p
357d0 61 67 65 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 73  ager..*/.const s
357e0 71 6c 69 74 65 33 5f 76 66 73 20 2a 73 71 6c 69  qlite3_vfs *sqli
357f0 74 65 33 50 61 67 65 72 56 66 73 28 50 61 67 65  te3PagerVfs(Page
35800 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
35810 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 56 66  turn pPager->pVf
35820 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  s;.}../*.** Retu
35830 72 6e 20 74 68 65 20 66 69 6c 65 20 68 61 6e 64  rn the file hand
35840 6c 65 20 66 6f 72 20 74 68 65 20 64 61 74 61 62  le for the datab
35850 61 73 65 20 66 69 6c 65 20 61 73 73 6f 63 69 61  ase file associa
35860 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20  ted.** with the 
35870 70 61 67 65 72 2e 20 20 54 68 69 73 20 6d 69 67  pager.  This mig
35880 68 74 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 69  ht return NULL i
35890 66 20 74 68 65 20 66 69 6c 65 20 68 61 73 0a 2a  f the file has.*
358a0 2a 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6f  * not yet been o
358b0 70 65 6e 65 64 2e 0a 2a 2f 0a 73 71 6c 69 74 65  pened..*/.sqlite
358c0 33 5f 66 69 6c 65 20 2a 73 71 6c 69 74 65 33 50  3_file *sqlite3P
358d0 61 67 65 72 46 69 6c 65 28 50 61 67 65 72 20 2a  agerFile(Pager *
358e0 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
358f0 6e 20 70 50 61 67 65 72 2d 3e 66 64 3b 0a 7d 0a  n pPager->fd;.}.
35900 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
35910 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20  e full pathname 
35920 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
35930 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ile..*/.const ch
35940 61 72 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  ar *sqlite3Pager
35950 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 50 61 67 65  Journalname(Page
35960 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
35970 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  turn pPager->zJo
35980 75 72 6e 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urnal;.}../*.** 
35990 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 66  Return true if f
359a0 73 79 6e 63 28 29 20 63 61 6c 6c 73 20 61 72 65  sync() calls are
359b0 20 64 69 73 61 62 6c 65 64 20 66 6f 72 20 74 68   disabled for th
359c0 69 73 20 70 61 67 65 72 2e 20 20 52 65 74 75 72  is pager.  Retur
359d0 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20 66 73  n FALSE.** if fs
359e0 79 6e 63 28 29 73 20 61 72 65 20 65 78 65 63 75  ync()s are execu
359f0 74 65 64 20 6e 6f 72 6d 61 6c 6c 79 2e 0a 2a 2f  ted normally..*/
35a00 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
35a10 72 4e 6f 73 79 6e 63 28 50 61 67 65 72 20 2a 70  rNosync(Pager *p
35a20 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
35a30 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b   pPager->noSync;
35a40 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
35a50 45 5f 48 41 53 5f 43 4f 44 45 43 0a 2f 2a 0a 2a  E_HAS_CODEC./*.*
35a60 2a 20 53 65 74 20 6f 72 20 72 65 74 72 69 65 76  * Set or retriev
35a70 65 20 74 68 65 20 63 6f 64 65 63 20 66 6f 72 20  e the codec for 
35a80 74 68 69 73 20 70 61 67 65 72 0a 2a 2f 0a 76 6f  this pager.*/.vo
35a90 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  id sqlite3PagerS
35aa0 65 74 43 6f 64 65 63 28 0a 20 20 50 61 67 65 72  etCodec(.  Pager
35ab0 20 2a 70 50 61 67 65 72 2c 0a 20 20 76 6f 69 64   *pPager,.  void
35ac0 20 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64   *(*xCodec)(void
35ad0 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74  *,void*,Pgno,int
35ae0 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64  ),.  void (*xCod
35af0 65 63 53 69 7a 65 43 68 6e 67 29 28 76 6f 69 64  ecSizeChng)(void
35b00 2a 2c 69 6e 74 2c 69 6e 74 29 2c 0a 20 20 76 6f  *,int,int),.  vo
35b10 69 64 20 28 2a 78 43 6f 64 65 63 46 72 65 65 29  id (*xCodecFree)
35b20 28 76 6f 69 64 2a 29 2c 0a 20 20 76 6f 69 64 20  (void*),.  void 
35b30 2a 70 43 6f 64 65 63 0a 29 7b 0a 20 20 69 66 28  *pCodec.){.  if(
35b40 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 46   pPager->xCodecF
35b50 72 65 65 20 29 20 70 50 61 67 65 72 2d 3e 78 43  ree ) pPager->xC
35b60 6f 64 65 63 46 72 65 65 28 70 50 61 67 65 72 2d  odecFree(pPager-
35b70 3e 70 43 6f 64 65 63 29 3b 0a 20 20 70 50 61 67  >pCodec);.  pPag
35b80 65 72 2d 3e 78 43 6f 64 65 63 20 3d 20 70 50 61  er->xCodec = pPa
35b90 67 65 72 2d 3e 6d 65 6d 44 62 20 3f 20 30 20 3a  ger->memDb ? 0 :
35ba0 20 78 43 6f 64 65 63 3b 0a 20 20 70 50 61 67 65   xCodec;.  pPage
35bb0 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65 43 68 6e  r->xCodecSizeChn
35bc0 67 20 3d 20 78 43 6f 64 65 63 53 69 7a 65 43 68  g = xCodecSizeCh
35bd0 6e 67 3b 0a 20 20 70 50 61 67 65 72 2d 3e 78 43  ng;.  pPager->xC
35be0 6f 64 65 63 46 72 65 65 20 3d 20 78 43 6f 64 65  odecFree = xCode
35bf0 63 46 72 65 65 3b 0a 20 20 70 50 61 67 65 72 2d  cFree;.  pPager-
35c00 3e 70 43 6f 64 65 63 20 3d 20 70 43 6f 64 65 63  >pCodec = pCodec
35c10 3b 0a 20 20 70 61 67 65 72 52 65 70 6f 72 74 53  ;.  pagerReportS
35c20 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 7d 0a 76  ize(pPager);.}.v
35c30 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65  oid *sqlite3Page
35c40 72 47 65 74 43 6f 64 65 63 28 50 61 67 65 72 20  rGetCodec(Pager 
35c50 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
35c60 72 6e 20 70 50 61 67 65 72 2d 3e 70 43 6f 64 65  rn pPager->pCode
35c70 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  c;.}.#endif..#if
35c80 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
35c90 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a  _AUTOVACUUM./*.*
35ca0 2a 20 4d 6f 76 65 20 74 68 65 20 70 61 67 65 20  * Move the page 
35cb0 70 50 67 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20  pPg to location 
35cc0 70 67 6e 6f 20 69 6e 20 74 68 65 20 66 69 6c 65  pgno in the file
35cd0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75  ..**.** There mu
35ce0 73 74 20 62 65 20 6e 6f 20 72 65 66 65 72 65 6e  st be no referen
35cf0 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20  ces to the page 
35d00 70 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63 61 74  previously locat
35d10 65 64 20 61 74 0a 2a 2a 20 70 67 6e 6f 20 28 77  ed at.** pgno (w
35d20 68 69 63 68 20 77 65 20 63 61 6c 6c 20 70 50 67  hich we call pPg
35d30 4f 6c 64 29 20 74 68 6f 75 67 68 20 74 68 61 74  Old) though that
35d40 20 70 61 67 65 20 69 73 20 61 6c 6c 6f 77 65 64   page is allowed
35d50 20 74 6f 20 62 65 0a 2a 2a 20 69 6e 20 63 61 63   to be.** in cac
35d60 68 65 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  he.  If the page
35d70 20 70 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63 61   previously loca
35d80 74 65 64 20 61 74 20 70 67 6e 6f 20 69 73 20 6e  ted at pgno is n
35d90 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e  ot already.** in
35da0 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
35db0 75 72 6e 61 6c 2c 20 69 74 20 69 73 20 6e 6f 74  urnal, it is not
35dc0 20 70 75 74 20 74 68 65 72 65 20 62 79 20 62 79   put there by by
35dd0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a   this routine..*
35de0 2a 0a 2a 2a 20 52 65 66 65 72 65 6e 63 65 73 20  *.** References 
35df0 74 6f 20 74 68 65 20 70 61 67 65 20 70 50 67 20  to the page pPg 
35e00 72 65 6d 61 69 6e 20 76 61 6c 69 64 2e 20 55 70  remain valid. Up
35e10 64 61 74 69 6e 67 20 61 6e 79 0a 2a 2a 20 6d 65  dating any.** me
35e20 74 61 2d 64 61 74 61 20 61 73 73 6f 63 69 61 74  ta-data associat
35e30 65 64 20 77 69 74 68 20 70 50 67 20 28 69 2e 65  ed with pPg (i.e
35e40 2e 20 64 61 74 61 20 73 74 6f 72 65 64 20 69 6e  . data stored in
35e50 20 74 68 65 20 6e 45 78 74 72 61 20 62 79 74 65   the nExtra byte
35e60 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61  s.** allocated a
35e70 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 70 61  long with the pa
35e80 67 65 29 20 69 73 20 74 68 65 20 72 65 73 70 6f  ge) is the respo
35e90 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
35ea0 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41   caller..**.** A
35eb0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73   transaction mus
35ec0 74 20 62 65 20 61 63 74 69 76 65 20 77 68 65 6e  t be active when
35ed0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
35ee0 20 63 61 6c 6c 65 64 2e 20 49 74 20 75 73 65 64   called. It used
35ef0 20 74 6f 20 62 65 0a 2a 2a 20 72 65 71 75 69 72   to be.** requir
35f00 65 64 20 74 68 61 74 20 61 20 73 74 61 74 65 6d  ed that a statem
35f10 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
35f20 77 61 73 20 6e 6f 74 20 61 63 74 69 76 65 2c 20  was not active, 
35f30 62 75 74 20 74 68 69 73 20 72 65 73 74 72 69 63  but this restric
35f40 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e  tion.** has been
35f50 20 72 65 6d 6f 76 65 64 20 28 43 52 45 41 54 45   removed (CREATE
35f60 20 49 4e 44 45 58 20 6e 65 65 64 73 20 74 6f 20   INDEX needs to 
35f70 6d 6f 76 65 20 61 20 70 61 67 65 20 77 68 65 6e  move a page when
35f80 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20   a statement.** 
35f90 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
35fa0 63 74 69 76 65 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  ctive)..**.** If
35fb0 20 74 68 65 20 66 6f 75 72 74 68 20 61 72 67 75   the fourth argu
35fc0 6d 65 6e 74 2c 20 69 73 43 6f 6d 6d 69 74 2c 20  ment, isCommit, 
35fd0 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
35fe0 6e 20 74 68 69 73 20 70 61 67 65 20 69 73 20 62  n this page is b
35ff0 65 69 6e 67 0a 2a 2a 20 6d 6f 76 65 64 20 61 73  eing.** moved as
36000 20 70 61 72 74 20 6f 66 20 61 20 64 61 74 61 62   part of a datab
36010 61 73 65 20 72 65 6f 72 67 61 6e 69 7a 61 74 69  ase reorganizati
36020 6f 6e 20 6a 75 73 74 20 62 65 66 6f 72 65 20 74  on just before t
36030 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a  he transaction .
36040 2a 2a 20 69 73 20 62 65 69 6e 67 20 63 6f 6d 6d  ** is being comm
36050 69 74 74 65 64 2e 20 49 6e 20 74 68 69 73 20 63  itted. In this c
36060 61 73 65 2c 20 69 74 20 69 73 20 67 75 61 72 61  ase, it is guara
36070 6e 74 65 65 64 20 74 68 61 74 20 74 68 65 20 64  nteed that the d
36080 61 74 61 62 61 73 65 20 70 61 67 65 20 0a 2a 2a  atabase page .**
36090 20 70 50 67 20 72 65 66 65 72 73 20 74 6f 20 77   pPg refers to w
360a0 69 6c 6c 20 6e 6f 74 20 62 65 20 77 72 69 74 74  ill not be writt
360b0 65 6e 20 74 6f 20 61 67 61 69 6e 20 77 69 74 68  en to again with
360c0 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  in this transact
360d0 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ion..**.** This 
360e0 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 72 65 74  function may ret
360f0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
36100 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   or an IO error 
36110 63 6f 64 65 20 69 66 20 61 6e 20 65 72 72 6f 72  code if an error
36120 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 4f 74 68 65  .** occurs. Othe
36130 72 77 69 73 65 2c 20 69 74 20 72 65 74 75 72 6e  rwise, it return
36140 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  s SQLITE_OK..*/.
36150 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
36160 4d 6f 76 65 70 61 67 65 28 50 61 67 65 72 20 2a  Movepage(Pager *
36170 70 50 61 67 65 72 2c 20 44 62 50 61 67 65 20 2a  pPager, DbPage *
36180 70 50 67 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  pPg, Pgno pgno, 
36190 69 6e 74 20 69 73 43 6f 6d 6d 69 74 29 7b 0a 20  int isCommit){. 
361a0 20 50 67 48 64 72 20 2a 70 50 67 4f 6c 64 3b 20   PgHdr *pPgOld; 
361b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
361c0 20 54 68 65 20 70 61 67 65 20 62 65 69 6e 67 20   The page being 
361d0 6f 76 65 72 77 72 69 74 74 65 6e 2e 20 2a 2f 0a  overwritten. */.
361e0 20 20 50 67 6e 6f 20 6e 65 65 64 53 79 6e 63 50    Pgno needSyncP
361f0 67 6e 6f 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  gno = 0;       /
36200 2a 20 4f 6c 64 20 76 61 6c 75 65 20 6f 66 20 70  * Old value of p
36210 50 67 2d 3e 70 67 6e 6f 2c 20 69 66 20 73 79 6e  Pg->pgno, if syn
36220 63 20 69 73 20 72 65 71 75 69 72 65 64 20 2a 2f  c is required */
36230 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
36240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36250 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
36260 2f 0a 20 20 50 67 6e 6f 20 6f 72 69 67 50 67 6e  /.  Pgno origPgn
36270 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
36280 20 2f 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c   /* The original
36290 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   page number */.
362a0 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
362b0 6e 52 65 66 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20  nRef>0 );..  /* 
362c0 49 6e 20 6f 72 64 65 72 20 74 6f 20 62 65 20 61  In order to be a
362d0 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c  ble to rollback,
362e0 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
362f0 74 61 62 61 73 65 20 6d 75 73 74 20 6a 6f 75 72  tabase must jour
36300 6e 61 6c 0a 20 20 2a 2a 20 74 68 65 20 70 61 67  nal.  ** the pag
36310 65 20 77 65 20 61 72 65 20 6d 6f 76 69 6e 67 20  e we are moving 
36320 66 72 6f 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  from..  */.  if(
36330 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 72 63   MEMDB ){.    rc
36340 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
36350 72 69 74 65 28 70 50 67 29 3b 0a 20 20 20 20 69  rite(pPg);.    i
36360 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
36370 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  c;.  }..  /* If 
36380 74 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 6d  the page being m
36390 6f 76 65 64 20 69 73 20 64 69 72 74 79 20 61 6e  oved is dirty an
363a0 64 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 73  d has not been s
363b0 61 76 65 64 20 62 79 20 74 68 65 20 6c 61 74 65  aved by the late
363c0 73 74 0a 20 20 2a 2a 20 73 61 76 65 70 6f 69 6e  st.  ** savepoin
363d0 74 2c 20 74 68 65 6e 20 73 61 76 65 20 74 68 65  t, then save the
363e0 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74   current content
363f0 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 69 6e  s of the page in
36400 74 6f 20 74 68 65 20 0a 20 20 2a 2a 20 73 75 62  to the .  ** sub
36410 2d 6a 6f 75 72 6e 61 6c 20 6e 6f 77 2e 20 54 68  -journal now. Th
36420 69 73 20 69 73 20 72 65 71 75 69 72 65 64 20 74  is is required t
36430 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 66 6f 6c  o handle the fol
36440 6c 6f 77 69 6e 67 20 73 63 65 6e 61 72 69 6f 3a  lowing scenario:
36450 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 42 45 47  .  **.  **   BEG
36460 49 4e 3b 0a 20 20 2a 2a 20 20 20 20 20 3c 6a 6f  IN;.  **     <jo
36470 75 72 6e 61 6c 20 70 61 67 65 20 58 2c 20 74 68  urnal page X, th
36480 65 6e 20 6d 6f 64 69 66 79 20 69 74 20 69 6e 20  en modify it in 
36490 6d 65 6d 6f 72 79 3e 0a 20 20 2a 2a 20 20 20 20  memory>.  **    
364a0 20 53 41 56 45 50 4f 49 4e 54 20 6f 6e 65 3b 0a   SAVEPOINT one;.
364b0 20 20 2a 2a 20 20 20 20 20 20 20 3c 4d 6f 76 65    **       <Move
364c0 20 70 61 67 65 20 58 20 74 6f 20 6c 6f 63 61 74   page X to locat
364d0 69 6f 6e 20 59 3e 0a 20 20 2a 2a 20 20 20 20 20  ion Y>.  **     
364e0 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 6f 6e 65 3b  ROLLBACK TO one;
364f0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 61  .  **.  ** If pa
36500 67 65 20 58 20 77 65 72 65 20 6e 6f 74 20 77 72  ge X were not wr
36510 69 74 74 65 6e 20 74 6f 20 74 68 65 20 73 75 62  itten to the sub
36520 2d 6a 6f 75 72 6e 61 6c 20 68 65 72 65 2c 20 69  -journal here, i
36530 74 20 77 6f 75 6c 64 20 6e 6f 74 0a 20 20 2a 2a  t would not.  **
36540 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   be possible to 
36550 72 65 73 74 6f 72 65 20 69 74 73 20 63 6f 6e 74  restore its cont
36560 65 6e 74 73 20 77 68 65 6e 20 74 68 65 20 22 52  ents when the "R
36570 4f 4c 4c 42 41 43 4b 20 54 4f 20 6f 6e 65 22 0a  OLLBACK TO one".
36580 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77    ** statement w
36590 65 72 65 20 69 73 20 70 72 6f 63 65 73 73 65 64  ere is processed
365a0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 73 75 62 6a  ..  **.  ** subj
365b0 6f 75 72 6e 61 6c 50 61 67 65 28 29 20 6d 61 79  ournalPage() may
365c0 20 6e 65 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74   need to allocat
365d0 65 20 73 70 61 63 65 20 74 6f 20 73 74 6f 72 65  e space to store
365e0 20 70 50 67 2d 3e 70 67 6e 6f 20 69 6e 74 6f 0a   pPg->pgno into.
365f0 20 20 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f 72 65    ** one or more
36600 20 73 61 76 65 70 6f 69 6e 74 20 62 69 74 76 65   savepoint bitve
36610 63 73 2e 20 54 68 69 73 20 69 73 20 74 68 65 20  cs. This is the 
36620 72 65 61 73 6f 6e 20 74 68 69 73 20 66 75 6e 63  reason this func
36630 74 69 6f 6e 0a 20 20 2a 2a 20 6d 61 79 20 72 65  tion.  ** may re
36640 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
36650 4d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  M..  */.  if( pP
36660 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44  g->flags&PGHDR_D
36670 49 52 54 59 0a 20 20 20 26 26 20 73 75 62 6a 52  IRTY.   && subjR
36680 65 71 75 69 72 65 73 50 61 67 65 28 70 50 67 29  equiresPage(pPg)
36690 0a 20 20 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b  .   && SQLITE_OK
366a0 21 3d 28 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e  !=(rc = subjourn
366b0 61 6c 50 61 67 65 28 70 50 67 29 29 0a 20 20 29  alPage(pPg)).  )
366c0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
366d0 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52 54 52 41  .  }..  PAGERTRA
366e0 43 45 28 28 22 4d 4f 56 45 20 25 64 20 70 61 67  CE(("MOVE %d pag
366f0 65 20 25 64 20 28 6e 65 65 64 53 79 6e 63 3d 25  e %d (needSync=%
36700 64 29 20 6d 6f 76 65 73 20 74 6f 20 25 64 5c 6e  d) moves to %d\n
36710 22 2c 20 0a 20 20 20 20 20 20 50 41 47 45 52 49  ", .      PAGERI
36720 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
36730 70 67 6e 6f 2c 20 28 70 50 67 2d 3e 66 6c 61 67  pgno, (pPg->flag
36740 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
36750 43 29 3f 31 3a 30 2c 20 70 67 6e 6f 29 29 3b 0a  C)?1:0, pgno));.
36760 20 20 49 4f 54 52 41 43 45 28 28 22 4d 4f 56 45    IOTRACE(("MOVE
36770 20 25 70 20 25 64 20 25 64 5c 6e 22 2c 20 70 50   %p %d %d\n", pP
36780 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  ager, pPg->pgno,
36790 20 70 67 6e 6f 29 29 0a 0a 20 20 2f 2a 20 49 66   pgno))..  /* If
367a0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6e 65 65   the journal nee
367b0 64 73 20 74 6f 20 62 65 20 73 79 6e 63 28 29 65  ds to be sync()e
367c0 64 20 62 65 66 6f 72 65 20 70 61 67 65 20 70 50  d before page pP
367d0 67 2d 3e 70 67 6e 6f 20 63 61 6e 0a 20 20 2a 2a  g->pgno can.  **
367e0 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 2c 20   be written to, 
367f0 73 74 6f 72 65 20 70 50 67 2d 3e 70 67 6e 6f 20  store pPg->pgno 
36800 69 6e 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c  in local variabl
36810 65 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2e 0a  e needSyncPgno..
36820 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65    **.  ** If the
36830 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20 69   isCommit flag i
36840 73 20 73 65 74 2c 20 74 68 65 72 65 20 69 73 20  s set, there is 
36850 6e 6f 20 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d  no need to remem
36860 62 65 72 20 74 68 61 74 0a 20 20 2a 2a 20 74 68  ber that.  ** th
36870 65 20 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20  e journal needs 
36880 74 6f 20 62 65 20 73 79 6e 63 28 29 65 64 20 62  to be sync()ed b
36890 65 66 6f 72 65 20 64 61 74 61 62 61 73 65 20 70  efore database p
368a0 61 67 65 20 70 50 67 2d 3e 70 67 6e 6f 20 0a 20  age pPg->pgno . 
368b0 20 2a 2a 20 63 61 6e 20 62 65 20 77 72 69 74 74   ** can be writt
368c0 65 6e 20 74 6f 2e 20 54 68 65 20 63 61 6c 6c 65  en to. The calle
368d0 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 70 72  r has already pr
368e0 6f 6d 69 73 65 64 20 6e 6f 74 20 74 6f 20 77 72  omised not to wr
368f0 69 74 65 20 74 6f 20 69 74 2e 0a 20 20 2a 2f 0a  ite to it..  */.
36900 20 20 69 66 28 20 28 70 50 67 2d 3e 66 6c 61 67    if( (pPg->flag
36910 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
36920 43 29 20 26 26 20 21 69 73 43 6f 6d 6d 69 74 20  C) && !isCommit 
36930 29 7b 0a 20 20 20 20 6e 65 65 64 53 79 6e 63 50  ){.    needSyncP
36940 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b  gno = pPg->pgno;
36950 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 61 67  .    assert( pag
36960 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20  eInJournal(pPg) 
36970 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61  || pPg->pgno>pPa
36980 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20  ger->dbOrigSize 
36990 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
369a0 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
369b0 44 49 52 54 59 20 29 3b 0a 20 20 20 20 61 73 73  DIRTY );.    ass
369c0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65  ert( pPager->nee
369d0 64 53 79 6e 63 20 29 3b 0a 20 20 7d 0a 0a 20 20  dSync );.  }..  
369e0 2f 2a 20 49 66 20 74 68 65 20 63 61 63 68 65 20  /* If the cache 
369f0 63 6f 6e 74 61 69 6e 73 20 61 20 70 61 67 65 20  contains a page 
36a00 77 69 74 68 20 70 61 67 65 2d 6e 75 6d 62 65 72  with page-number
36a10 20 70 67 6e 6f 2c 20 72 65 6d 6f 76 65 20 69 74   pgno, remove it
36a20 0a 20 20 2a 2a 20 66 72 6f 6d 20 69 74 73 20 68  .  ** from its h
36a30 61 73 68 20 63 68 61 69 6e 2e 20 41 6c 73 6f 2c  ash chain. Also,
36a40 20 69 66 20 74 68 65 20 50 67 48 64 72 2e 6e 65   if the PgHdr.ne
36a50 65 64 53 79 6e 63 20 77 61 73 20 73 65 74 20 66  edSync was set f
36a60 6f 72 20 0a 20 20 2a 2a 20 70 61 67 65 20 70 67  or .  ** page pg
36a70 6e 6f 20 62 65 66 6f 72 65 20 74 68 65 20 27 6d  no before the 'm
36a80 6f 76 65 27 20 6f 70 65 72 61 74 69 6f 6e 2c 20  ove' operation, 
36a90 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72  it needs to be r
36aa0 65 74 61 69 6e 65 64 20 0a 20 20 2a 2a 20 66 6f  etained .  ** fo
36ab0 72 20 74 68 65 20 70 61 67 65 20 6d 6f 76 65 64  r the page moved
36ac0 20 74 68 65 72 65 2e 0a 20 20 2a 2f 0a 20 20 70   there..  */.  p
36ad0 50 67 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 50 47  Pg->flags &= ~PG
36ae0 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20  HDR_NEED_SYNC;. 
36af0 20 70 50 67 4f 6c 64 20 3d 20 70 61 67 65 72 5f   pPgOld = pager_
36b00 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70  lookup(pPager, p
36b10 67 6e 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20  gno);.  assert( 
36b20 21 70 50 67 4f 6c 64 20 7c 7c 20 70 50 67 4f 6c  !pPgOld || pPgOl
36b30 64 2d 3e 6e 52 65 66 3d 3d 31 20 29 3b 0a 20 20  d->nRef==1 );.  
36b40 69 66 28 20 70 50 67 4f 6c 64 20 29 7b 0a 20 20  if( pPgOld ){.  
36b50 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20    pPg->flags |= 
36b60 28 70 50 67 4f 6c 64 2d 3e 66 6c 61 67 73 26 50  (pPgOld->flags&P
36b70 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3b  GHDR_NEED_SYNC);
36b80 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29  .    if( MEMDB )
36b90 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f  {.      /* Do no
36ba0 74 20 64 69 73 63 61 72 64 20 70 61 67 65 73 20  t discard pages 
36bb0 66 72 6f 6d 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  from an in-memor
36bc0 79 20 64 61 74 61 62 61 73 65 20 73 69 6e 63 65  y database since
36bd0 20 77 65 20 6d 69 67 68 74 0a 20 20 20 20 20 20   we might.      
36be0 2a 2a 20 6e 65 65 64 20 74 6f 20 72 6f 6c 6c 62  ** need to rollb
36bf0 61 63 6b 20 6c 61 74 65 72 2e 20 20 4a 75 73 74  ack later.  Just
36c00 20 6d 6f 76 65 20 74 68 65 20 70 61 67 65 20 6f   move the page o
36c10 75 74 20 6f 66 20 74 68 65 20 77 61 79 2e 20 2a  ut of the way. *
36c20 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
36c30 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61  pPager->dbSizeVa
36c40 6c 69 64 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  lid );.      sql
36c50 69 74 65 33 50 63 61 63 68 65 4d 6f 76 65 28 70  ite3PcacheMove(p
36c60 50 67 4f 6c 64 2c 20 70 50 61 67 65 72 2d 3e 64  PgOld, pPager->d
36c70 62 53 69 7a 65 2b 31 29 3b 0a 20 20 20 20 7d 65  bSize+1);.    }e
36c80 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
36c90 65 33 50 63 61 63 68 65 44 72 6f 70 28 70 50 67  e3PcacheDrop(pPg
36ca0 4f 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Old);.    }.  }.
36cb0 0a 20 20 6f 72 69 67 50 67 6e 6f 20 3d 20 70 50  .  origPgno = pP
36cc0 67 2d 3e 70 67 6e 6f 3b 0a 20 20 73 71 6c 69 74  g->pgno;.  sqlit
36cd0 65 33 50 63 61 63 68 65 4d 6f 76 65 28 70 50 67  e3PcacheMove(pPg
36ce0 2c 20 70 67 6e 6f 29 3b 0a 20 20 73 71 6c 69 74  , pgno);.  sqlit
36cf0 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74  e3PcacheMakeDirt
36d00 79 28 70 50 67 29 3b 0a 20 20 70 50 61 67 65 72  y(pPg);.  pPager
36d10 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d 20 31  ->dbModified = 1
36d20 3b 0a 0a 20 20 69 66 28 20 6e 65 65 64 53 79 6e  ;..  if( needSyn
36d30 63 50 67 6e 6f 20 29 7b 0a 20 20 20 20 2f 2a 20  cPgno ){.    /* 
36d40 49 66 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20  If needSyncPgno 
36d50 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
36d60 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
36d70 6c 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 0a  le needs to be .
36d80 20 20 20 20 2a 2a 20 73 79 6e 63 28 29 65 64 20      ** sync()ed 
36d90 62 65 66 6f 72 65 20 61 6e 79 20 64 61 74 61 20  before any data 
36da0 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 64 61  is written to da
36db0 74 61 62 61 73 65 20 66 69 6c 65 20 70 61 67 65  tabase file page
36dc0 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2e 0a 20   needSyncPgno.. 
36dd0 20 20 20 2a 2a 20 43 75 72 72 65 6e 74 6c 79 2c     ** Currently,
36de0 20 6e 6f 20 73 75 63 68 20 70 61 67 65 20 65 78   no such page ex
36df0 69 73 74 73 20 69 6e 20 74 68 65 20 70 61 67 65  ists in the page
36e00 2d 63 61 63 68 65 20 61 6e 64 20 74 68 65 20 0a  -cache and the .
36e10 20 20 20 20 2a 2a 20 22 69 73 20 6a 6f 75 72 6e      ** "is journ
36e20 61 6c 65 64 22 20 62 69 74 76 65 63 20 66 6c 61  aled" bitvec fla
36e30 67 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20  g has been set. 
36e40 54 68 69 73 20 6e 65 65 64 73 20 74 6f 20 62 65  This needs to be
36e50 20 72 65 6d 65 64 69 65 64 20 62 79 0a 20 20 20   remedied by.   
36e60 20 2a 2a 20 6c 6f 61 64 69 6e 67 20 74 68 65 20   ** loading the 
36e70 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61  page into the pa
36e80 67 65 72 2d 63 61 63 68 65 20 61 6e 64 20 73 65  ger-cache and se
36e90 74 74 69 6e 67 20 74 68 65 20 50 67 48 64 72 2e  tting the PgHdr.
36ea0 6e 65 65 64 53 79 6e 63 20 0a 20 20 20 20 2a 2a  needSync .    **
36eb0 20 66 6c 61 67 2e 0a 20 20 20 20 2a 2a 0a 20 20   flag..    **.  
36ec0 20 20 2a 2a 20 49 66 20 74 68 65 20 61 74 74 65    ** If the atte
36ed0 6d 70 74 20 74 6f 20 6c 6f 61 64 20 74 68 65 20  mpt to load the 
36ee0 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61  page into the pa
36ef0 67 65 2d 63 61 63 68 65 20 66 61 69 6c 73 2c 20  ge-cache fails, 
36f00 28 64 75 65 0a 20 20 20 20 2a 2a 20 74 6f 20 61  (due.    ** to a
36f10 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20   malloc() or IO 
36f20 66 61 69 6c 75 72 65 29 2c 20 63 6c 65 61 72 20  failure), clear 
36f30 74 68 65 20 62 69 74 20 69 6e 20 74 68 65 20 70  the bit in the p
36f40 49 6e 4a 6f 75 72 6e 61 6c 5b 5d 0a 20 20 20 20  InJournal[].    
36f50 2a 2a 20 61 72 72 61 79 2e 20 4f 74 68 65 72 77  ** array. Otherw
36f60 69 73 65 2c 20 69 66 20 74 68 65 20 70 61 67 65  ise, if the page
36f70 20 69 73 20 6c 6f 61 64 65 64 20 61 6e 64 20 77   is loaded and w
36f80 72 69 74 74 65 6e 20 61 67 61 69 6e 20 69 6e 0a  ritten again in.
36f90 20 20 20 20 2a 2a 20 74 68 69 73 20 74 72 61 6e      ** this tran
36fa0 73 61 63 74 69 6f 6e 2c 20 69 74 20 6d 61 79 20  saction, it may 
36fb0 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  be written to th
36fc0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
36fd0 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 69 74  before.    ** it
36fe0 20 69 73 20 73 79 6e 63 65 64 20 69 6e 74 6f 20   is synced into 
36ff0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
37000 2e 20 54 68 69 73 20 77 61 79 2c 20 69 74 20 6d  . This way, it m
37010 61 79 20 65 6e 64 20 75 70 20 69 6e 0a 20 20 20  ay end up in.   
37020 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   ** the journal 
37030 66 69 6c 65 20 74 77 69 63 65 2c 20 62 75 74 20  file twice, but 
37040 74 68 61 74 20 69 73 20 6e 6f 74 20 61 20 70 72  that is not a pr
37050 6f 62 6c 65 6d 2e 0a 20 20 20 20 2a 2a 0a 20 20  oblem..    **.  
37060 20 20 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33    ** The sqlite3
37070 50 61 67 65 72 47 65 74 28 29 20 63 61 6c 6c 20  PagerGet() call 
37080 6d 61 79 20 63 61 75 73 65 20 74 68 65 20 6a 6f  may cause the jo
37090 75 72 6e 61 6c 20 74 6f 20 73 79 6e 63 2e 20 53  urnal to sync. S
370a0 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75  o make.    ** su
370b0 72 65 20 74 68 65 20 50 61 67 65 72 2e 6e 65 65  re the Pager.nee
370c0 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20 73 65  dSync flag is se
370d0 74 20 74 6f 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20  t too..    */.  
370e0 20 20 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b    PgHdr *pPgHdr;
370f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
37100 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b  ger->needSync );
37110 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
37120 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72  3PagerGet(pPager
37130 2c 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2c 20  , needSyncPgno, 
37140 26 70 50 67 48 64 72 29 3b 0a 20 20 20 20 69 66  &pPgHdr);.    if
37150 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
37160 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 65  ){.      if( nee
37170 64 53 79 6e 63 50 67 6e 6f 3c 3d 70 50 61 67 65  dSyncPgno<=pPage
37180 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 7b  r->dbOrigSize ){
37190 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
371a0 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
371b0 63 65 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ce!=0 );.       
371c0 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 6c   sqlite3BitvecCl
371d0 65 61 72 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  ear(pPager->pInJ
371e0 6f 75 72 6e 61 6c 2c 20 6e 65 65 64 53 79 6e 63  ournal, needSync
371f0 50 67 6e 6f 2c 20 70 50 61 67 65 72 2d 3e 70 54  Pgno, pPager->pT
37200 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20 20 20  mpSpace);.      
37210 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  }.      return r
37220 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  c;.    }.    pPa
37230 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
37240 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  1;.    assert( p
37250 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3d 3d 30  Pager->noSync==0
37260 20 26 26 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20   && !MEMDB );.  
37270 20 20 70 50 67 48 64 72 2d 3e 66 6c 61 67 73 20    pPgHdr->flags 
37280 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  |= PGHDR_NEED_SY
37290 4e 43 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  NC;.    sqlite3P
372a0 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70  cacheMakeDirty(p
372b0 50 67 48 64 72 29 3b 0a 20 20 20 20 73 71 6c 69  PgHdr);.    sqli
372c0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
372d0 67 48 64 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  gHdr);.  }..  /*
372e0 0a 20 20 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 2d  .  ** For an in-
372f0 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c  memory database,
37300 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6f   make sure the o
37310 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e  riginal page con
37320 74 69 6e 75 65 73 0a 20 20 2a 2a 20 74 6f 20 65  tinues.  ** to e
37330 78 69 73 74 2c 20 69 6e 20 63 61 73 65 20 74 68  xist, in case th
37340 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6e 65  e transaction ne
37350 65 64 73 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b  eds to roll back
37360 2e 20 20 55 73 65 20 70 50 67 4f 6c 64 0a 20 20  .  Use pPgOld.  
37370 2a 2a 20 61 73 20 74 68 65 20 6f 72 69 67 69 6e  ** as the origin
37380 61 6c 20 70 61 67 65 20 73 69 6e 63 65 20 69 74  al page since it
37390 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
373a0 6e 20 61 6c 6c 6f 63 61 74 65 64 2e 0a 20 20 2a  n allocated..  *
373b0 2f 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b  /.  if( MEMDB ){
373c0 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
373d0 68 65 4d 6f 76 65 28 70 50 67 4f 6c 64 2c 20 6f  heMove(pPgOld, o
373e0 72 69 67 50 67 6e 6f 29 3b 0a 20 20 20 20 73 71  rigPgno);.    sq
373f0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
37400 70 50 67 4f 6c 64 29 3b 0a 20 20 7d 0a 0a 20 20  pPgOld);.  }..  
37410 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
37420 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
37430 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
37440 65 72 20 74 6f 20 74 68 65 20 64 61 74 61 20 66  er to the data f
37450 6f 72 20 74 68 65 20 73 70 65 63 69 66 69 65 64  or the specified
37460 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a   page..*/.void *
37470 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
37480 61 74 61 28 44 62 50 61 67 65 20 2a 70 50 67 29  ata(DbPage *pPg)
37490 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  {.  assert( pPg-
374a0 3e 6e 52 65 66 3e 30 20 7c 7c 20 70 50 67 2d 3e  >nRef>0 || pPg->
374b0 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 3b  pPager->memDb );
374c0 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 70  .  return pPg->p
374d0 44 61 74 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Data;.}../*.** R
374e0 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
374f0 74 6f 20 74 68 65 20 50 61 67 65 72 2e 6e 45 78  to the Pager.nEx
37500 74 72 61 20 62 79 74 65 73 20 6f 66 20 22 65 78  tra bytes of "ex
37510 74 72 61 22 20 73 70 61 63 65 20 0a 2a 2a 20 61  tra" space .** a
37520 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20 77  llocated along w
37530 69 74 68 20 74 68 65 20 73 70 65 63 69 66 69 65  ith the specifie
37540 64 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20  d page..*/.void 
37550 2a 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  *sqlite3PagerGet
37560 45 78 74 72 61 28 44 62 50 61 67 65 20 2a 70 50  Extra(DbPage *pP
37570 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 67  g){.  return pPg
37580 2d 3e 70 45 78 74 72 61 3b 0a 7d 0a 0a 2f 2a 0a  ->pExtra;.}../*.
37590 2a 2a 20 47 65 74 2f 73 65 74 20 74 68 65 20 6c  ** Get/set the l
375a0 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 66 6f 72 20  ocking-mode for 
375b0 74 68 69 73 20 70 61 67 65 72 2e 20 50 61 72 61  this pager. Para
375c0 6d 65 74 65 72 20 65 4d 6f 64 65 20 6d 75 73 74  meter eMode must
375d0 20 62 65 20 6f 6e 65 0a 2a 2a 20 6f 66 20 50 41   be one.** of PA
375e0 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
375f0 51 55 45 52 59 2c 20 50 41 47 45 52 5f 4c 4f 43  QUERY, PAGER_LOC
37600 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20  KINGMODE_NORMAL 
37610 6f 72 20 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f 43  or .** PAGER_LOC
37620 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49  KINGMODE_EXCLUSI
37630 56 45 2e 20 49 66 20 74 68 65 20 70 61 72 61 6d  VE. If the param
37640 65 74 65 72 20 69 73 20 6e 6f 74 20 5f 51 55 45  eter is not _QUE
37650 52 59 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  RY, then.** the 
37660 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 69 73 20  locking-mode is 
37670 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65  set to the value
37680 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a   specified..**.*
37690 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 76  * The returned v
376a0 61 6c 75 65 20 69 73 20 65 69 74 68 65 72 20 50  alue is either P
376b0 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
376c0 5f 4e 4f 52 4d 41 4c 20 6f 72 0a 2a 2a 20 50 41  _NORMAL or.** PA
376d0 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
376e0 45 58 43 4c 55 53 49 56 45 2c 20 69 6e 64 69 63  EXCLUSIVE, indic
376f0 61 74 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e  ating the curren
37700 74 20 28 70 6f 73 73 69 62 6c 79 20 75 70 64 61  t (possibly upda
37710 74 65 64 29 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 2d  ted).** locking-
37720 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  mode..*/.int sql
37730 69 74 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67  ite3PagerLocking
37740 4d 6f 64 65 28 50 61 67 65 72 20 2a 70 50 61 67  Mode(Pager *pPag
37750 65 72 2c 20 69 6e 74 20 65 4d 6f 64 65 29 7b 0a  er, int eMode){.
37760 20 20 61 73 73 65 72 74 28 20 65 4d 6f 64 65 3d    assert( eMode=
37770 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f  =PAGER_LOCKINGMO
37780 44 45 5f 51 55 45 52 59 0a 20 20 20 20 20 20 20  DE_QUERY.       
37790 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50       || eMode==P
377a0 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
377b0 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20 20 20  _NORMAL.        
377c0 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41      || eMode==PA
377d0 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
377e0 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20 61  EXCLUSIVE );.  a
377f0 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43  ssert( PAGER_LOC
37800 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59 3c 30  KINGMODE_QUERY<0
37810 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41   );.  assert( PA
37820 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
37830 4e 4f 52 4d 41 4c 3e 3d 30 20 26 26 20 50 41 47  NORMAL>=0 && PAG
37840 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45  ER_LOCKINGMODE_E
37850 58 43 4c 55 53 49 56 45 3e 3d 30 20 29 3b 0a 20  XCLUSIVE>=0 );. 
37860 20 69 66 28 20 65 4d 6f 64 65 3e 3d 30 20 26 26   if( eMode>=0 &&
37870 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
37880 6c 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  le ){.    pPager
37890 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
378a0 3d 20 28 75 38 29 65 4d 6f 64 65 3b 0a 20 20 7d  = (u8)eMode;.  }
378b0 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 70  .  return (int)p
378c0 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
378d0 4d 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  Mode;.}../*.** S
378e0 65 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d  et the journal-m
378f0 6f 64 65 20 66 6f 72 20 74 68 69 73 20 70 61 67  ode for this pag
37900 65 72 2e 20 50 61 72 61 6d 65 74 65 72 20 65 4d  er. Parameter eM
37910 6f 64 65 20 6d 75 73 74 20 62 65 20 6f 6e 65 20  ode must be one 
37920 6f 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 50 41 47  of:.**.**    PAG
37930 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44  ER_JOURNALMODE_D
37940 45 4c 45 54 45 0a 2a 2a 20 20 20 20 50 41 47 45  ELETE.**    PAGE
37950 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52  R_JOURNALMODE_TR
37960 55 4e 43 41 54 45 0a 2a 2a 20 20 20 20 50 41 47  UNCATE.**    PAG
37970 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50  ER_JOURNALMODE_P
37980 45 52 53 49 53 54 0a 2a 2a 20 20 20 20 50 41 47  ERSIST.**    PAG
37990 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
379a0 46 46 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a  FF.**    PAGER_J
379b0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
379c0 59 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f  Y.**    PAGER_JO
379d0 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 0a 2a 2a  URNALMODE_WAL.**
379e0 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 6d  .** The journalm
379f0 6f 64 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  ode is set to th
37a00 65 20 76 61 6c 75 65 20 73 70 65 63 69 66 69 65  e value specifie
37a10 64 20 69 66 20 74 68 65 20 63 68 61 6e 67 65 20  d if the change 
37a20 69 73 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2a 20 54  is allowed..** T
37a30 68 65 20 63 68 61 6e 67 65 20 6d 61 79 20 62 65  he change may be
37a40 20 64 69 73 61 6c 6c 6f 77 65 64 20 66 6f 72 20   disallowed for 
37a50 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 65  the following re
37a60 61 73 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  asons:.**.**   *
37a70 20 20 41 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64    An in-memory d
37a80 61 74 61 62 61 73 65 20 63 61 6e 20 6f 6e 6c 79  atabase can only
37a90 20 68 61 76 65 20 69 74 73 20 6a 6f 75 72 6e 61   have its journa
37aa0 6c 5f 6d 6f 64 65 20 73 65 74 20 74 6f 20 5f 4f  l_mode set to _O
37ab0 46 46 0a 2a 2a 20 20 20 20 20 20 6f 72 20 5f 4d  FF.**      or _M
37ac0 45 4d 4f 52 59 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  EMORY..**.**   *
37ad0 20 20 54 65 6d 70 6f 72 61 72 79 20 64 61 74 61    Temporary data
37ae0 62 61 73 65 73 20 63 61 6e 6e 6f 74 20 68 61 76  bases cannot hav
37af0 65 20 5f 57 41 4c 20 6a 6f 75 72 6e 61 6c 6d 6f  e _WAL journalmo
37b00 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  de..**.** The re
37b10 74 75 72 6e 65 64 20 69 6e 64 69 63 61 74 65 20  turned indicate 
37b20 74 68 65 20 63 75 72 72 65 6e 74 20 28 70 6f 73  the current (pos
37b30 73 69 62 6c 79 20 75 70 64 61 74 65 64 29 20 6a  sibly updated) j
37b40 6f 75 72 6e 61 6c 2d 6d 6f 64 65 2e 0a 2a 2f 0a  ournal-mode..*/.
37b50 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
37b60 53 65 74 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28 50  SetJournalMode(P
37b70 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
37b80 74 20 65 4d 6f 64 65 29 7b 0a 20 20 75 38 20 65  t eMode){.  u8 e
37b90 4f 6c 64 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  Old = pPager->jo
37ba0 75 72 6e 61 6c 4d 6f 64 65 3b 20 20 20 20 2f 2a  urnalMode;    /*
37bb0 20 50 72 69 6f 72 20 6a 6f 75 72 6e 61 6c 6d 6f   Prior journalmo
37bc0 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20  de */..  /* The 
37bd0 65 4d 6f 64 65 20 70 61 72 61 6d 65 74 65 72 20  eMode parameter 
37be0 69 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64 20  is always valid 
37bf0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 20 20 20  */.  assert(    
37c00 20 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a    eMode==PAGER_J
37c10 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54  OURNALMODE_DELET
37c20 45 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  E.            ||
37c30 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f   eMode==PAGER_JO
37c40 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41  URNALMODE_TRUNCA
37c50 54 45 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  TE.            |
37c60 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  | eMode==PAGER_J
37c70 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49  OURNALMODE_PERSI
37c80 53 54 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  ST.            |
37c90 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  | eMode==PAGER_J
37ca0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a  OURNALMODE_OFF .
37cb0 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65              || e
37cc0 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
37cd0 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20  NALMODE_WAL .   
37ce0 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64           || eMod
37cf0 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
37d00 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 3b 0a 0a  MODE_MEMORY );..
37d10 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e    /* This routin
37d20 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64  e is only called
37d30 20 66 72 6f 6d 20 74 68 65 20 4f 50 5f 4a 6f 75   from the OP_Jou
37d40 72 6e 61 6c 4d 6f 64 65 20 6f 70 63 6f 64 65 2c  rnalMode opcode,
37d50 20 61 6e 64 0a 20 20 2a 2a 20 74 68 65 20 6c 6f   and.  ** the lo
37d60 67 69 63 20 74 68 65 72 65 20 77 69 6c 6c 20 6e  gic there will n
37d70 65 76 65 72 20 61 6c 6c 6f 77 20 61 20 74 65 6d  ever allow a tem
37d80 70 6f 72 61 72 79 20 66 69 6c 65 20 74 6f 20 62  porary file to b
37d90 65 20 63 68 61 6e 67 65 64 0a 20 20 2a 2a 20 74  e changed.  ** t
37da0 6f 20 57 41 4c 20 6d 6f 64 65 2e 0a 20 20 2a 2f  o WAL mode..  */
37db0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
37dc0 72 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c  r->tempFile==0 |
37dd0 7c 20 65 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a  | eMode!=PAGER_J
37de0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 29  OURNALMODE_WAL )
37df0 3b 0a 0a 20 20 2f 2a 20 44 6f 20 61 6c 6c 6f 77  ;..  /* Do allow
37e00 20 74 68 65 20 6a 6f 75 72 6e 61 6c 6d 6f 64 65   the journalmode
37e10 20 6f 66 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   of an in-memory
37e20 20 64 61 74 61 62 61 73 65 20 74 6f 20 62 65 20   database to be 
37e30 73 65 74 20 74 6f 0a 20 20 2a 2a 20 61 6e 79 74  set to.  ** anyt
37e40 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20  hing other than 
37e50 4d 45 4d 4f 52 59 20 6f 72 20 4f 46 46 0a 20 20  MEMORY or OFF.  
37e60 2a 2f 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29  */.  if( MEMDB )
37e70 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 65 4f  {.    assert( eO
37e80 6c 64 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  ld==PAGER_JOURNA
37e90 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 7c 7c 20  LMODE_MEMORY || 
37ea0 65 4f 6c 64 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  eOld==PAGER_JOUR
37eb0 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 3b 0a 20  NALMODE_OFF );. 
37ec0 20 20 20 69 66 28 20 65 4d 6f 64 65 21 3d 50 41     if( eMode!=PA
37ed0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
37ee0 4d 45 4d 4f 52 59 20 26 26 20 65 4d 6f 64 65 21  MEMORY && eMode!
37ef0 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
37f00 44 45 5f 4f 46 46 20 29 7b 0a 20 20 20 20 20 20  DE_OFF ){.      
37f10 65 4d 6f 64 65 20 3d 20 65 4f 6c 64 3b 0a 20 20  eMode = eOld;.  
37f20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 65    }.  }..  if( e
37f30 4d 6f 64 65 21 3d 65 4f 6c 64 20 29 7b 0a 20 20  Mode!=eOld ){.  
37f40 20 20 2f 2a 20 57 68 65 6e 20 63 68 61 6e 67 69    /* When changi
37f50 6e 67 20 62 65 74 77 65 65 6e 20 72 6f 6c 6c 62  ng between rollb
37f60 61 63 6b 20 6d 6f 64 65 73 2c 20 63 6c 6f 73 65  ack modes, close
37f70 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
37f80 65 20 70 72 69 6f 72 0a 20 20 20 20 2a 2a 20 74  e prior.    ** t
37f90 6f 20 74 68 65 20 63 68 61 6e 67 65 2e 20 20 42  o the change.  B
37fa0 75 74 20 77 68 65 6e 20 63 68 61 6e 67 69 6e 67  ut when changing
37fb0 20 66 72 6f 6d 20 61 20 72 6f 6c 6c 62 61 63 6b   from a rollback
37fc0 20 6d 6f 64 65 20 74 6f 20 57 41 4c 2c 20 6b 65   mode to WAL, ke
37fd0 65 70 0a 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f  ep.    ** the jo
37fe0 75 72 6e 61 6c 20 6f 70 65 6e 20 73 69 6e 63 65  urnal open since
37ff0 20 74 68 65 72 65 20 69 73 20 61 20 72 6f 6c 6c   there is a roll
38000 62 61 63 6b 2d 73 74 79 6c 65 20 74 72 61 6e 73  back-style trans
38010 61 63 74 69 6f 6e 20 69 6e 20 70 6c 61 79 0a 20  action in play. 
38020 20 20 20 2a 2a 20 75 73 65 64 20 74 6f 20 63 6f     ** used to co
38030 6e 76 65 72 74 20 74 68 65 20 76 65 72 73 69 6f  nvert the versio
38040 6e 20 6e 75 6d 62 65 72 73 20 69 6e 20 74 68 65  n numbers in the
38050 20 62 74 72 65 65 20 68 65 61 64 65 72 2e 0a 20   btree header.. 
38060 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 73     */.    if( is
38070 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
38080 29 20 26 26 20 65 4d 6f 64 65 21 3d 50 41 47 45  ) && eMode!=PAGE
38090 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
380a0 4c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  L ){.      sqlit
380b0 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
380c0 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 0a 0a 20  ->jfd);.    }.. 
380d0 20 20 20 2f 2a 20 43 68 61 6e 67 65 20 74 68 65     /* Change the
380e0 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2e 20 2a   journal mode. *
380f0 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  /.    pPager->jo
38100 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 28 75 38 29  urnalMode = (u8)
38110 65 4d 6f 64 65 3b 0a 0a 20 20 20 20 2f 2a 20 57  eMode;..    /* W
38120 68 65 6e 20 74 72 61 6e 73 69 73 74 69 6f 6e 69  hen transistioni
38130 6e 67 20 66 72 6f 6d 20 54 52 55 4e 43 41 54 45  ng from TRUNCATE
38140 20 6f 72 20 50 45 52 53 49 53 54 20 74 6f 20 61   or PERSIST to a
38150 6e 79 20 6f 74 68 65 72 20 6a 6f 75 72 6e 61 6c  ny other journal
38160 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 20 65 78 63  .    ** mode exc
38170 65 70 74 20 57 41 4c 20 28 61 6e 64 20 77 65 20  ept WAL (and we 
38180 61 72 65 20 6e 6f 74 20 69 6e 20 6c 6f 63 6b 69  are not in locki
38190 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56  ng_mode=EXCLUSIV
381a0 45 29 20 74 68 65 6e 20 0a 20 20 20 20 2a 2a 20  E) then .    ** 
381b0 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e  delete the journ
381c0 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a  al file..    */.
381d0 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47      assert( (PAG
381e0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54  ER_JOURNALMODE_T
381f0 52 55 4e 43 41 54 45 20 26 20 35 29 3d 3d 31 20  RUNCATE & 5)==1 
38200 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
38210 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
38220 45 5f 50 45 52 53 49 53 54 20 26 20 35 29 3d 3d  E_PERSIST & 5)==
38230 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
38240 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d   (PAGER_JOURNALM
38250 4f 44 45 5f 44 45 4c 45 54 45 20 26 20 35 29 3d  ODE_DELETE & 5)=
38260 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
38270 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  ( (PAGER_JOURNAL
38280 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 26 20 35 29  MODE_MEMORY & 5)
38290 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==4 );.    asser
382a0 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41  t( (PAGER_JOURNA
382b0 4c 4d 4f 44 45 5f 4f 46 46 20 26 20 35 29 3d 3d  LMODE_OFF & 5)==
382c0 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
382d0 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d   (PAGER_JOURNALM
382e0 4f 44 45 5f 57 41 4c 20 26 20 35 29 3d 3d 35 20  ODE_WAL & 5)==5 
382f0 29 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  );..    assert( 
38300 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
38310 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 78  d) || pPager->ex
38320 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 3b 0a 20  clusiveMode );. 
38330 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
38340 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26  exclusiveMode &&
38350 20 28 65 4f 6c 64 20 26 20 35 29 3d 3d 31 20 26   (eOld & 5)==1 &
38360 26 20 28 65 4d 6f 64 65 20 26 20 31 29 3d 3d 30  & (eMode & 1)==0
38370 20 29 7b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 6e   ){..      /* In
38380 20 74 68 69 73 20 63 61 73 65 20 77 65 20 77 6f   this case we wo
38390 75 6c 64 20 6c 69 6b 65 20 74 6f 20 64 65 6c 65  uld like to dele
383a0 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  te the journal f
383b0 69 6c 65 2e 20 49 66 20 69 74 20 69 73 0a 20 20  ile. If it is.  
383c0 20 20 20 20 2a 2a 20 6e 6f 74 20 70 6f 73 73 69      ** not possi
383d0 62 6c 65 2c 20 74 68 65 6e 20 74 68 61 74 20 69  ble, then that i
383e0 73 20 6e 6f 74 20 61 20 70 72 6f 62 6c 65 6d 2e  s not a problem.
383f0 20 44 65 6c 65 74 69 6e 67 20 74 68 65 20 6a 6f   Deleting the jo
38400 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20 20 20 20  urnal file.     
38410 20 2a 2a 20 68 65 72 65 20 69 73 20 61 6e 20 6f   ** here is an o
38420 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6f 6e 6c 79  ptimization only
38430 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
38440 20 2a 2a 20 42 65 66 6f 72 65 20 64 65 6c 65 74   ** Before delet
38450 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ing the journal 
38460 66 69 6c 65 2c 20 6f 62 74 61 69 6e 20 61 20 52  file, obtain a R
38470 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20  ESERVED lock on 
38480 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74  the.      ** dat
38490 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 69 73  abase file. This
384a0 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 74 68   ensures that th
384b0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
384c0 73 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a 20 20  s not deleted.  
384d0 20 20 20 20 2a 2a 20 77 68 69 6c 65 20 69 74 20      ** while it 
384e0 69 73 20 69 6e 20 75 73 65 20 62 79 20 73 6f 6d  is in use by som
384f0 65 20 6f 74 68 65 72 20 63 6c 69 65 6e 74 2e 0a  e other client..
38500 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
38510 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
38520 4b 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 74 61  K;.      int sta
38530 74 65 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 61  te = pPager->sta
38540 74 65 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74  te;.      if( st
38550 61 74 65 3c 50 41 47 45 52 5f 53 48 41 52 45 44  ate<PAGER_SHARED
38560 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
38570 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 68 61   sqlite3PagerSha
38580 72 65 64 4c 6f 63 6b 28 70 50 61 67 65 72 29 3b  redLock(pPager);
38590 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
385a0 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
385b0 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29  ==PAGER_SHARED )
385c0 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
385d0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
385e0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
385f0 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50  sqlite3OsLock(pP
38600 61 67 65 72 2d 3e 66 64 2c 20 52 45 53 45 52 56  ager->fd, RESERV
38610 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  ED_LOCK);.      
38620 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
38630 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
38640 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65       sqlite3OsDe
38650 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 70 56 66  lete(pPager->pVf
38660 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
38670 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  nal, 0);.      }
38680 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
38690 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 74 61 74  QLITE_OK && stat
386a0 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e==PAGER_SHARED 
386b0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
386c0 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65  e3OsUnlock(pPage
386d0 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f  r->fd, SHARED_LO
386e0 43 4b 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  CK);.      }else
386f0 20 69 66 28 20 73 74 61 74 65 3d 3d 50 41 47 45   if( state==PAGE
38700 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  R_UNLOCK ){.    
38710 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b      pager_unlock
38720 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
38730 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
38740 73 74 61 74 65 3d 3d 70 50 61 67 65 72 2d 3e 73